{
  "checker": {
    "claims": [
      {
        "claim": "ferry validate checks an export before migrating, reporting counts and a time estimate",
        "command": "<guest-path> validate tests/fixtures/dce_2_47_3",
        "evidence": "2 <email>/msg = ~0m\nExport looks good.\n",
        "expected": "prints counts and an estimate of 2 <email>/msg",
        "input": "tests/fixtures/dce_2_47_3",
        "kind": "claim",
        "outcome": "Real input produced the expected result: 2 <email>/msg",
        "returncode": 0,
        "source": "**`ferry validate`**, check an export before migrating: counts, warnings, and a time estimate. No network calls.",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      }
    ],
    "cycle_checks": [
      {
        "claim": "Scheduled or looping main behavior",
        "command": "",
        "evidence": "Entry points inspected (src/discord_ferry/cli.py commands, README, docs/guides/cli-reference.md). Ferry is a one-shot CLI: each ferry migrate/validate run performs a single pass and exits; no cron, --once/--now, loop, or webhook trigger drives repeated runs. Only the GUI stays open and runs on demand. The 'scheduled task' in cli-reference.md refers to launching the app, not a product cycle.",
        "expected": "identify the product trigger",
        "input": "source inspection",
        "kind": "cycle",
        "outcome": "Entry points inspected (src/discord_ferry/cli.py commands, README, docs/guides/cli-reference.md). Ferry is a one-shot CLI: each ferry migrate/validate run performs a single pass and exits; no cron, --once/--now, loop, or webhook trigger drives repeated runs. Only the GUI stays open and runs on demand. The 'scheduled task' in cli-reference.md refers to launching the app, not a product cycle.",
        "source": "repository entry points",
        "verdict": "yes"
      }
    ],
    "details": {
      "argv": [
        "<guest-path>",
        "validate",
        "tests/fixtures/dce_2_47_3"
      ],
      "kind": "cli",
      "needs_browser": false,
      "needs_credentials": false,
      "returncode": 0,
      "scope": "product operation",
      "stderr": "",
      "stdout": "Discord Ferry \u2014 validating export for Discord Ferry Test\n\n      Export Summary      \n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 Item           \u2503 Count \u2503\n\u2521\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2529\n\u2502 Channels       \u2502     1 \u2502\n\u2502 Categories     \u2502     1 \u2502\n\u2502 Roles          \u2502     1 \u2502\n\u2502 Messages       \u2502     2 \u2502\n\u2502 Attachments    \u2502     0 \u2502\n\u2502 Custom Emoji   \u2502     0 \u2502\n[excerpt truncated]",
      "working": true
    },
    "evidence_strength": "readme_checked",
    "example_checks": [
      {
        "claim": "validate an export folder before migrating",
        "command": "<guest-path> validate tests/fixtures/dce_2_47_3",
        "deferred": false,
        "evidence": "Discord Ferry \u2014 validating export for Discord Ferry Test\n\n      Export Summary      \n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 Item           \u2503 Count \u2503\n\u2521\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2547\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2529\n\u2502 Channels       \u2502     1 \u2502\n\u2502 Categories     \u2502     1 \u2502\n\u2502 Roles          \u2502     1 \u2502\n\u2502 Messages       \u2502     2 \u2502\n\u2502 Attachments    \u2502     0 \u2502\n\u2502 Custom Emoji   \u2502     0 \u2502\n\u2502 Threads/Forums \u2502     1 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n2 <email>/msg = ~0m\nExport looks good.",
        "expected": "summary table and Export looks good.",
        "input": "tests/fixtures/dce_2_47_3 (DCE 2.47.3 fixture; docs example uses ~/exports/my-discord-server/)",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": "docs/guides/cli-reference.md",
        "verdict": "yes"
      }
    ],
    "status": "PASS"
  },
  "deviations": [
    "Installed the published PyPI package via pipx (the README's Linux command) rather than building from the pinned checkout; the version matches pyproject.toml (3.1.6). The pinned git metadata was not initialised because the workspace snapshot was used directly.",
    "ferry is installed at <guest-path> and is not on the shell PATH, so probes use the absolute path.",
    "Did not run `ferry migrate` (needs a live Stoat server and Discord token; not available in this guest and would create data on a live service).",
    "`ferry validate` on tests/fixtures/dce_2_48/captured failed: 'Could not parse provenance.json as a DCE export: Missing required key guild in provenance.json'. Observed as a product error with exit 1; the fixture folder contains a provenance.json alongside the channel exports. Not used as a probe; flagged for follow-up.",
    "CDP endpoint http://<internal-ip>:9226/json/version returned HTTP 200 with Chrome/155.0.8059.84; no browser operation was needed."
  ],
  "fault_owner": null,
  "main_blocker": null,
  "operation": "Install Discord Ferry from the README's Linux path and run the offline export check `ferry validate EXPORT_DIR` on a DCE export folder",
  "operation_scope": "Offline only: parse and validate a DCE 2.47.3 export fixture (tests/fixtures/dce_2_47_3). No Stoat server, Discord token, or live migration was exercised. Guest: Ubuntu 24.04, Python 3.12.3, pipx 1.4.3. Shared CDP endpoint answered but was not needed (CLI product, no browser).",
  "outcome": "working",
  "plain_failure": null,
  "steps": [
    "sudo apt-get -o DPkg::Lock::Timeout=300 install -y pipx",
    "pipx install discord-ferry (installed 3.1.6, same version as pyproject.toml at pinned commit)",
    "ferry validate tests/fixtures/dce_2_47_3 (exit 0: 1 channel, 2 messages, 'Export looks good.')",
    "<env-var>=<guest-path> python3 -I <guest-path> --validate --replay (valid: true, no problems)"
  ],
  "stuck_step": null,
  "suggested_fix": "Optional: investigate why validate rejects the DCE 2.48 captured folder that contains provenance.json (fixture or parser issue)."
}
