{
  "checker": {
    "claims": [
      {
        "claim": "fermata job <id> shows one job with its objective and recent events",
        "command": "fermata job hello-job",
        "evidence": "Objective  Add a hello function\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n10-24 03:25  created            Created.\n10-24 03:25  started            Started Claude session 8d48c1d6.\n",
        "expected": "the job's objective is printed",
        "input": "hello-job (Claude job started through the fake Claude CLI)",
        "kind": "claim",
        "outcome": "Real input produced the expected result: Objective  Add a hello function",
        "returncode": 0,
        "source": "fermata job <id> [--json]",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      },
      {
        "claim": "fermata jobs lists supervised jobs",
        "command": "fermata jobs",
        "evidence": "hello-job                    claude   running                             Add a hello function\n",
        "expected": "the job appears in the list",
        "input": "hello-job created with fermata run",
        "kind": "claim",
        "outcome": "Real input produced the expected result: hello-job",
        "returncode": 0,
        "source": "fermata jobs [--json] [--all]",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      }
    ],
    "cycle_checks": [
      {
        "claim": "The scheduler runs a tick on start and then every 30 s while the daemon is up",
        "command": "timeout --preserve-status 15 fermata daemon",
        "evidence": "fermata daemon: mode confirm, poll 30s, notifications none (notify-send not installed)\n2026-10-24 03:29:03 CODEX_UNAVAILABLE: codex executable not found on PATH.\nfermata daemon: stopped",
        "expected": "daemon starts, runs one tick (logs CODEX_UNAVAILABLE since no Codex on PATH) and stops cleanly",
        "input": "config in FERMATA_HOME; Claude job hello-job with the fake Claude CLI",
        "kind": "cycle",
        "method": "run-once wrapper: timeout --preserve-status 15 fermata daemon (stops after the first tick; no source edits, no fake clock)",
        "outcome": "Triggered one cycle by hand (run-once wrapper: timeout --preserve-status 15 fermata daemon (stops after the first tick; no source edits, no fake clock); normal trigger: fermata daemon loop, TickInterval 30 s): fermata daemon: mode confirm, poll 30s, notifications none (notify-send not installed)\n2026-10-24 03:29:03 CODEX_UNAVAILABLE: codex executable not found on PATH.\nfermata daemon: stopped",
        "returncode": 0,
        "schedule": "fermata daemon loop, TickInterval 30 s",
        "source": "src/Fermata.Platform/Jobs/JobScheduler.cs",
        "verdict": "yes"
      }
    ],
    "details": {
      "argv": [
        "fermata",
        "job",
        "hello-job"
      ],
      "kind": "cli",
      "needs_browser": false,
      "needs_credentials": false,
      "returncode": 0,
      "scope": "product operation",
      "stderr": "",
      "stdout": "Job        hello-job\nProvider   claude\nStatus     running\nFolder     <guest-path>\nSession    8d48c1d6-aed6-433a-8b79-3f4f9097a309 (background 8d48c1d6)\nAttach     claude attach 8d48c1d6\nObjective  Add a hello function\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n10-24 03:25  created            Created.\n10-24 03:25  started            Started Claude session 8d48c1d6.",
      "working": true
    },
    "evidence_strength": "readme_checked",
    "example_checks": [
      {
        "claim": "Repository test suite runs offline and passes",
        "command": "dotnet test Fermata.slnx",
        "deferred": false,
        "evidence": "ailed:     0, Passed:    49, Skipped:     0, Total:    49, Duration: 4 s - Fermata.Desktop.Tests.dll (net10.0)\n  Fermata.Core.Tests -> <guest-path>\nTest run for <guest-path> (.NETCoreApp,Version=v10.0)\nVSTest version 18.0.2 (x64)\n\nStarting test execution, please wait...\nA total of 1 test files matched the specified pattern.\n\nPassed!  - Failed:     0, Passed:   244, Skipped:     0, Total:   244, Duration: 4 s - Fermata.Core.Tests.dll (net10.0)",
        "expected": "all test projects pass",
        "input": "dotnet test Fermata.slnx",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": "README.md / Building and testing (dotnet test)",
        "verdict": "yes"
      }
    ],
    "status": "PASS"
  },
  "deviations": [
    "Codex CLI and Claude Code were not installed and cannot be logged in on this guest, so Claude jobs ran against scripts/fake-claude (documented by the README for this purpose), not a real Claude session. Codex jobs were not run.",
    "Release download from GitHub Releases (README Quick start) was replaced by the README's own build script scripts/package.sh linux-x64, to avoid downloading and trusting a release binary.",
    "No README curl|sh installer exists for fermata; none was run.",
    "Node.js was installed from apt (v18.19.1) only to run the fake claude script; npm was not installed (not needed).",
    "A first daemon/job run was made without FAKE_CLAUDE_STATE set, so the job recorded a 'No conversation found' retry event. That job (demo-job) was cancelled with `fermata cancel demo-job` and the working job is hello-job.",
    "The artifacts/ build output and the .git metadata were created inside the workspace by the build and the pinned fetch (both gitignored or required). A symlink /usr/local/bin/fermata was created for the probe's argv.",
    "`fermata doctor` reports warnings/failures for missing Codex and Claude Code and for data directory permissions; these are expected in this guest and are not product faults."
  ],
  "fault_owner": null,
  "main_blocker": null,
  "operation": "Build fermata from source with the README's packaging script, then create and read back a supervised job with `fermata run` / `fermata job` / `fermata jobs`, and run the documented test suite.",
  "operation_scope": "Linux x64 (Ubuntu 24.04, non-root with passwordless sudo). Codex CLI and Claude Code are NOT installed or logged in, so Claude jobs were exercised through the README-documented fake Claude CLI (scripts/fake-claude). Reset credits, Codex monitor and real agent sessions were not exercised.",
  "outcome": "working",
  "plain_failure": null,
  "steps": [
    "git init; git remote add origin https://github.com/fatih-developer/fermata; git fetch --depth 1 origin a801a1892a07c75fa6e6516e9a8bdfc5aaa0d76d; git reset --mixed FETCH_HEAD",
    "sudo apt-get install -y dotnet-sdk-10.0 (provides dotnet 10.0.113, required by Directory.Build.props net10.0)",
    "DOTNET_CLI_TELEMETRY_OPTOUT=1 dotnet test Fermata.slnx  (README: Building and testing) -> 244 Core + 49 Codex + 49 Desktop tests passed",
    "scripts/package.sh linux-x64  (README: Building and testing) -> artifacts/package/fermata-linux-x64.tar.gz, unpacked to <guest-path>",
    "FERMATA_HOME=<guest-path> fermata config --init ; fermata config (README: Configuration)",
    "fermata doctor (setup check only: Codex not found, Claude Code not found, as expected)",
    "edited the scratch config (FERMATA_HOME/config.toml) so [jobs.claude] executable points at scripts/fake-claude/claude = scripts/fake-claude/claude (README: End-to-end runs, fake claude)",
    "fermata run --provider claude --objective \"Add a hello function\" --cwd <guest-path> --name hello-job",
    "fermata job hello-job ; fermata jobs (read back the job)",
    "timeout --preserve-status 15 fermata daemon (one scheduler tick, then clean stop)"
  ],
  "stuck_step": null,
  "suggested_fix": "None needed for this operation. To exercise the real agents, install Codex CLI and Claude Code, log in, and rerun the Codex and Claude job steps; the fake-Claude path only covers the Claude job plumbing."
}
