{
  "checker": {
    "claims": [
      {
        "claim": "validate checks the canonical files",
        "command": "<guest-path> --root <guest-path> validate",
        "evidence": "valid\n",
        "expected": "valid",
        "input": "demo repo",
        "kind": "claim",
        "outcome": "Real input produced the expected result: valid",
        "returncode": 0,
        "source": "| `validate` | Check the canonical files |",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      },
      {
        "claim": "show prints one task",
        "command": "<guest-path> --root <guest-path> show T001",
        "evidence": "\u2026Write the README #docs\n  - Acceptance: README covers install and usage\n  - Outcome: completed\n  - Closed: 2026-10-28\n",
        "expected": "task T001 title",
        "input": "T001",
        "kind": "claim",
        "outcome": "Real input produced the expected result: Write the README",
        "returncode": 0,
        "source": "| `show TASK_ID` | Print one task |",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      },
      {
        "claim": "--json is the stable automation interface",
        "command": "<guest-path> --json --root <guest-path> show T001",
        "evidence": "\u2026Write the README\", \"state\": \"completed\", \"priority\": null, \"type\": \"docs\", \"tags\": [], \"simple\": false, \"acceptance\": \"README covers install and usage\", \"context\": null, \"related\": null, \"blocked_by\": [], \"claim\": null, \"actionable\": false, \"closed_on\": \"2026-10-28\", \"reviewed_on\": null, \"reason\": null}}}\n",
        "expected": "JSON task with title",
        "input": "show T001 with --json",
        "kind": "claim",
        "outcome": "Real input produced the expected result: Write the README",
        "returncode": 0,
        "source": "`--json` is the stable automation interface.",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      },
      {
        "claim": "add creates an open task when --acceptance is given",
        "command": "<guest-path> --root <guest-path> add 'Claim check task' --type ops --acceptance 'claim check passes'",
        "evidence": "\u2026Claim check task\n",
        "expected": "added task with title",
        "input": "title Claim check task with acceptance",
        "kind": "claim",
        "outcome": "Real input produced the expected result: Claim check task",
        "returncode": 0,
        "source": "`add` requires either `--acceptance` or `--simple`.",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      }
    ],
    "cycle_checks": [
      {
        "claim": "Kanban board polls /board-version every 2 seconds and reloads when the TODO.md version changes",
        "command": "<guest-path> --root <guest-path> add 'Cycle check task' --type ops --acceptance 'cycle check passes'",
        "evidence": "added T006 Cycle check task",
        "expected": "TODO.md changes and the CLI reports the added task; the board-version token changes within the poll interval",
        "input": "add \"Cycle check task\" to the demo repo",
        "kind": "cycle",
        "method": "run-once: one external CLI edit of TODO.md (the trigger the poll reacts to); the board-version observation was done by hand against the running server",
        "outcome": "Triggered one cycle by hand (run-once: one external CLI edit of TODO.md (the trigger the poll reacts to); the board-version observation was done by hand against the running server; normal trigger: browser-side poll every 2000 ms while the board page is open and visible): added T006 Cycle check task",
        "returncode": 0,
        "schedule": "browser-side poll every 2000 ms while the board page is open and visible",
        "source": "src/bot_todo/web.py",
        "verdict": "yes"
      }
    ],
    "details": {
      "argv": [
        "<guest-path>",
        "--root",
        "<guest-path>",
        "web",
        "--port",
        "8765",
        "--no-open"
      ],
      "bytes": 20800,
      "kind": "http",
      "response_checked": true,
      "response_excerpt": "\u2026Write the README</h2><button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button></div><div class=\"modal-body\"><dl class=\"row mb-0\"><dt class=\"col-sm-3 text-secondary\">ID</dt><dd class=\"col-sm-9\">T001</dd><dt class=\"col-sm-3 text-secondary\">Title</dt><dd class=\"col-sm-9\">Write the README</dd><dt class=\"col-sm-3 text-secondary\">State</dt><dd class=\"col-sm-9\">completed</dd><dt class=\"col-sm-3 text-secondary\">Priority</dt><dd class=\"col-sm-9\">\u2014</dd><dt class=\"col-sm-3 text-secondary\">Type</dt><dd class=\"col-sm-9\">docs</dd><dt class=\"col-sm-3 text-secondary\">Tags</d",
      "scope": "product operation",
      "status": 200,
      "url": "http://127.0.0.1:8765/?repo=current",
      "working": true
    },
    "evidence_strength": "readme_checked",
    "example_checks": [
      {
        "claim": "Development section: run the repository test suite with make pytest",
        "command": "make pytest",
        "deferred": false,
        "evidence": "                                [ 57%]\ntests/test_repository.py ..........................                      [ 66%]\ntests/test_skill_guidance.py ........                                    [ 68%]\ntests/test_skill_installation.py ............................            [ 77%]\ntests/test_task_management_snippet.py ....                               [ 79%]\ntests/test_web.py ...................................................... [ 96%]\n..........                                                               [100%]\n\n======================= 308 passed in 112.11s (0:01:52) ========================",
        "expected": "all tests pass",
        "input": "make pytest",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": "README.md Development",
        "verdict": "yes"
      },
      {
        "claim": "Quick start: list open tasks in a repository",
        "command": "<guest-path> --root <guest-path> list",
        "deferred": false,
        "evidence": "T002 P2 Live check task #ops\nT003 P2 Claim check task #ops\nT004 P2 Cycle check task #ops\nT005 P2 Claim check task #ops\nT006 P2 Cycle check task #ops",
        "expected": "open task T002 listed",
        "input": "list --root demo repo",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": "README.md Quick start",
        "verdict": "yes"
      }
    ],
    "status": "PASS"
  },
  "deviations": [
    "README shows bot-todo on PATH after uv tool install; uv installed it to <guest-path> which was not on PATH, so every command used the absolute path <guest-path>",
    "README Quick start uses bot-todo init in the project directory; this guest used the documented --root global option (placed before the subcommand, since --root after init is rejected with exit 2).",
    "init created TODO.md and .bot-todo.lock but not TODO.archive.md, although the README Commands table says init creates both files. Not fixed; archive file may be created lazily.",
    "A mistaken pkill -f in my own shell killed that shell (returncode 255); the manual web server was then stopped by PID. Not a product fault.",
    "The checker path /inputs/coldpass-preflight.py from the instructions does not exist in this guest; the supplied <guest-path> was used with the same --validate --replay flags.",
    "No git metadata was needed: the workspace was used as supplied and the README needs no git commands, so the git init/fetch pin steps were not run.",
    "The cycle check is a run-once trigger (one CLI add to TODO.md) because the browser-side 2-second poll cannot be driven without a browser; the board-version change was observed by hand against the live server and is not part of the replayed check.",
    "The demo repo at <guest-path> is mutated by replays (add/claim/complete/list); add-based checks create new task IDs each run, and their expected_text is the fixed title."
  ],
  "fault_owner": null,
  "main_blocker": null,
  "operation": "Install bot-todo from the README and run its task-backlog CLI (init, add, list, show, claim, complete, validate) plus the local Kanban web board, with a live CLI-to-board refresh cycle",
  "operation_scope": "Linux guest, Python 3.12.3, uv 0.13.5, bot-todo 0.6.0 from PyPI via the README's uv tool install; repo pinned at caltechads/bot-todo 96ff277279fdd221f561b5a57eb15e28ddcd5f0d (workspace snapshot, bot-todo VERSION 0.6.0); no browser, no credentials, no external notifications; CDP endpoint not needed because the board was checked over HTTP only",
  "outcome": "working",
  "plain_failure": null,
  "steps": [
    "uv tool install bot-todo",
    "bot-todo --version",
    "bot-todo --root <guest-path> init --name demo-repo",
    "bot-todo --root <guest-path> add \"Write the README\" --type docs --priority P1 --acceptance \"README covers install and usage\"",
    "bot-todo --root <guest-path> list",
    "bot-todo --root <guest-path> show T001",
    "bot-todo --root <guest-path> claim T001 --actor taylor",
    "bot-todo --json --root <guest-path> show T001",
    "bot-todo --root <guest-path> complete T001",
    "bot-todo --json --root <guest-path> show T999 (expected unknown_task error, exit 1)",
    "bot-todo --root <guest-path> validate",
    "bot-todo --root <guest-path> web --port 8765 --no-open (HTTP board checked at /?repo=current and /board-version)",
    "uv sync",
    "make pytest (308 passed)"
  ],
  "stuck_step": null,
  "suggested_fix": "No fix required for the working path. Optionally: create TODO.archive.md in init to match the README table, and document that --root goes before the subcommand in the Quick start."
}
