{
  "run_id": "realgarit--fable-baton-claude-haiku-5-5-1792785875882196993",
  "date": "2026-10-23T20:15:29.257380+00:00",
  "repo": "realgarit/fable-baton",
  "kind": "repo",
  "source": "https://github.com/realgarit/fable-baton",
  "commit": "4f04545450dfbda6c2698b3976f3d6c90d52a11e",
  "model": "claude-haiku-5-5",
  "model_version": "claude-haiku-5-5",
  "test_version": "readme-bdc1b9b3c0d2673aef87e076d14084a8123ddcf09d520c1ee2e364a37c3f4bb9",
  "pass": null,
  "outcome": "needs_credentials",
  "time_to_working_s": null,
  "total_s": 653.3751630783081,
  "steps": [
    "cd <guest-path> && pwd && ls -la && id -u && python3 --version && cat README.md 2>/dev/null | head -200",
    "cd <guest-path> && git init -q 2>/dev/null; git remote add origin https://github.com/realgarit/fable-baton 2>&1; git fetch --depth 1 origin 4f04545450dfbda6c2698b3976f3d6c90d52a11e 2>&1 | tail -3; git reset --mixed FETCH_HEAD 2>&1 | tail -2; git log --oneline -1",
    "cd <guest-path> && ls -la .coldpass tests hooks .github/workflows agents skills .claude-plugin && cat .github/workflows/*.yml | head -120 && ls /inputs 2>/dev/null; which node npm claude uv 2>&1",
    "cd <guest-path> && cat AGENTS.md | head -150; echo ----; cat hooks/*.sh 2>/dev/null | head -80; ls hooks",
    "ls -la /inputs <guest-path> 2>&1; for c in node npm claude uv bash jq; do printf \"%s: \" $c; command -v $c || echo missing; done; node --version 2>&1; cat <guest-path>; sed -n 1,40p <guest-path>",
    "sudo -n true && echo SUDO_OK; . /etc/os-release; echo $VERSION_ID; (sudo -n apt-get update -qq && sudo -n DEBIAN_FRONTEND=noninteractive apt-get install -y -qq nodejs npm) 2>&1 | tail -5; node --version; npm --version",
    "export NODE_USE_ENV_PROXY=1; mkdir -p <guest-path> && cd <guest-path> && timeout 600 sudo -n npm install -g @anthropic-ai/claude-code 2>&1 | tail -5; command -v claude && claude --version 2>&1 | head -3",
    "cd <guest-path> && export NODE_USE_ENV_PROXY=1; timeout 120 claude plugin --help 2>&1 | head -30; echo ---; timeout 120 claude plugin marketplace add <guest-path> 2>&1 | tail -5; echo rc=$?",
    "cd /tmp && export NODE_USE_ENV_PROXY=1; timeout 200 claude plugin marketplace add realgarit/fable-baton 2>&1 | tail -3; echo rc=$?; timeout 200 claude plugin install fable-baton@fable-baton 2>&1 | tail -5; echo rc=$?; timeout 60 claude plugin list 2>&1 | head -20",
    "cd /tmp && export NODE_USE_ENV_PROXY=1; timeout 120 claude plugin uninstall fable-baton@fable-baton 2>&1 | tail -2; timeout 120 claude plugin marketplace remove fable-baton 2>&1 | tail -2; timeout 200 claude plugin marketplace add realgarit/fable-baton 2>&1 | tail -3; timeout 200 claude plugin install fable-baton@fable-baton 2>&1 | tail -3; timeout 60 claude plugin list 2>&1 | head -12",
    "cd /tmp && export NODE_USE_ENV_PROXY=1; timeout 120 claude -p \"Reply with the word ok\" 2>&1 | tail -5; echo rc=$?; env | grep -i -E 'anthropic|claude' | sed 's/=.*/=<set>/' ; ls ~/.claude 2>&1 | head",
    "cd <guest-path> && grep -n -E \"credentials_error|\\\"checks\\\"|'checks'|stays_running|expected_file|deferred|testable|def validate|def replay|\\\"check\\\"\" check.py | head -80",
    "cd <guest-path> && sed -n 700,725p check.py; sed -n 1160,1230p check.py",
    "cd <guest-path> && grep -n \"CREDENTIALS =\\|def credentials_missing\\|def cycles\\|stdin\" check.py | head; cd <guest-path> && sed -n 1,25p hooks/prompt-nudge.sh | cut -c1-200; grep -n \"tempfile\\|TMP\\|printf\\|echo\" hooks/prompt-nudge.sh | head -20",
    "cd /tmp && timeout 60 claude plugin list 2>&1 | head -6; ls ~/.claude/plugins; P=$(find ~/.claude/plugins -name prompt-nudge.sh -path '*fable*' 2>/dev/null | head -1); echo \"P=$P\"; echo '{\"session_id\":\"baton-cycle-check\",\"prompt\":\"hello\"}' | CLAUDE_PLUGIN_ROOT=$(dirname $(dirname $P)) bash \"$P\"; echo rc=$?",
    "cd <guest-path> && python3 tests/packaged-hooks.py; echo rc=$?; CLAUDE_PLUGIN_ROOT=. bash hooks/session-start.sh | head -c 300; echo; echo '{\"session_id\":\"baton-cycle-check\",\"prompt\":\"hello\"}' | CLAUDE_PLUGIN_ROOT=. bash hooks/prompt-nudge.sh | head -c 120; echo",
    "cd <guest-path> && cat > probe.json <<'EOF'\n{\"checks\":[\n {\"check\":\"install\",\"kind\":\"cli\",\"argv\":[\"claude\",\"plugin\",\"list\"],\"cwd\":\"<guest-path>\",\"expected_text\":\"fable-baton@fable-baton\"},\n {\"check\":\"credentials_error\",\"kind\":\"cli\",\"argv\":[\"claude\",\"-p\",\"Reply with the word ok\"],\"cwd\":\"<guest-path>\",\"expected_text\":\"Not logged in\"}\n]}\nEOF\ncat > claims.json <<'EOF'\n[\n {\"kind\":\"claim\",\"claim\":\"Installing the plugin with the README command registers fable-baton as installed\",\"source\":\"/plugin install fable-baton@fable-baton\",\"input\":\"none (the marketplace was added from realgarit/fable-baton and the plugin installed)\",\"expected\":\"claude plugin list shows fable-baton@fable-baton\",\"probe_kind\":\"cli\",\"argv\":[\"claude\",\"plugin\",\"list\"],\"expected_text\":\"fable-baton@fable-baton\",\"cwd\":\"<guest-path>\"},\n {\"kind\":\"claim\",\"claim\":\"The SessionStart hook injects the orchestration policy into a new session\",\"source\":\"A SessionStart hook injects the orchestration policy into every new session.\",\"input\":\"{} on stdin with CLAUDE_PLUGIN_ROOT=.\",\"expected\":\"hook prints the orchestration policy header\",\"probe_kind\":\"cli\",\"argv\":[\"bash\",\"hooks/session-start.sh\"],\"stdin\":\"{}\",\"expected_text\":\"# Orchestration policy (fable-baton)\",\"cwd\":\"<guest-path>\",\"env\":{\"CLAUDE_PLUGIN_ROOT\":\".\"}},\n {\"kind\":\"claim\",\"claim\":\"The per-prompt reminder prints a delegation check on each prompt\",\"source\":\"Every prompt gets a short delegation reminder, and when the model does too much inline work in a row, the counter steps in:\",\"input\":\"UserPromptSubmit payload with session_id baton-cycle-check and a prompt\",\"expected\":\"hook prints the [fable-baton] delegation check\",\"probe_kind\":\"cli\",\"argv\":[\"bash\",\"hooks/prompt-nudge.sh\"],\"stdin\":\"{\\\"session_id\\\":\\\"baton-cycle-check\\\",\\\"prompt\\\":\\\"hello\\\"}\",\"expected_text\":\"[fable-baton] Delegation check for this turn\",\"cwd\":\"<guest-path>\",\"env\":{\"CLAUDE_PLUGIN_ROOT\":\".\"}},\n {\"kind\":\"claim\",\"claim\":\"Whether the plugin fires inside a logged-in session cannot be tested in this guest\",\"source\":\"Install once and every new session in every repo starts this way.\",\"testable\":false,\"reason\":\"Requires a logged-in Claude Code session with a Fable 5 or Opus subscription or API key; the guest reports 'Not logged in' and no credentials were obtained.\"}\n]\nEOF\ncat > cycles.json <<'EOF'\n{\"detected\":true,\"checks\":[{\"claim\":\"The per-prompt reminder runs on every user prompt\",\"source\":\"hooks/hooks.json\",\"quote\":\"\\\"command\\\": \\\"bash \\\\\\\"${CLAUDE_PLUGIN_ROOT}/hooks/prompt-nudge.sh\\\\\\\"\\\"\",\"schedule\":\"UserPromptSubmit event, once per user prompt\",\"method\":\"run-once: the UserPromptSubmit hook command fired by hand with a prompt payload on stdin; no real Claude Code session\",\"input\":\"{\\\"session_id\\\":\\\"baton-cycle-check\\\",\\\"prompt\\\":\\\"hello\\\"}\",\"expected\":\"reminder printed once for the prompt\",\"kind\":\"cli\",\"argv\":[\"bash\",\"hooks/prompt-nudge.sh\"],\"stdin\":\"{\\\"session_id\\\":\\\"baton-cycle-check\\\",\\\"prompt\\\":\\\"hello\\\"}\",\"cwd\":\"<guest-path>\",\"env\":{\"CLAUDE_PLUGIN_ROOT\":\".\"},\"expected_text\":\"[fable-baton] Delegation check for this turn\"}]}\nEOF\ncat > examples.json <<'EOF'\n[\n {\"kind\":\"example\",\"claim\":\"Repository's own offline hook test (run by CI) passes\",\"source\":\"AGENTS.md\",\"input\":\"tests/packaged-hooks.py\",\"expected\":\"PASS line for installed hooks with stripped modes\",\"argv\":[\"python3\",\"tests/packaged-hooks.py\"],\"cwd\":\"<guest-path>\",\"expected_text\":\"PASS: all registered hooks work\"}\n]\nEOF\nfor f in probe claims cycles examples; do python3 -m json.tool $f.json >/dev/null && echo \"$f ok\"; done",
    "cd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | tail -60; echo rc=$?",
    "cd <guest-path> && grep -n \"CLAUDE_PLUGIN_ROOT\\|policy/\\|dirname\" hooks/session-start.sh | head; grep -n \"CLAUDE_PLUGIN_ROOT\\|cat \\|policy\" hooks/prompt-nudge.sh | head -5; grep -n \"env\\b\\|env=\" <guest-path> | sed -n 1,12p | cut -c1-220",
    "cd <guest-path> && sed -n 41,50p check.py | cut -c1-250; sed -n 1100,1120p check.py | cut -c1-250",
    "cd <guest-path> && grep -n \"def claims\\|def claim_result\\|def claim(\" check.py; n=$(grep -n \"def claim_result\\|def claim(\" check.py | head -1 | cut -d: -f1); sed -n \"${n},$((n+25))p\" check.py | cut -c1-220",
    "cd <guest-path> && sed -n 935,960p check.py | cut -c1-240; grep -n \"def run_claim\\|def claim_outcome\\|def product_claim\\|def run_check\" check.py",
    "cd <guest-path> && n=$(grep -n \"^def claim_verdict\" check.py | cut -d: -f1); sed -n \"${n},$((n+22))p\" check.py | cut -c1-240",
    "cd <guest-path> && python3 - <<'EOF'\nimport json\np='claims.json'\nitems=json.load(open(p))\nitems[1]['argv']=['env','CLAUDE_PLUGIN_ROOT=.','bash','hooks/session-start.sh']\nitems[1].pop('env',None)\njson.dump(items,open(p,'w'),indent=1); open(p,'a').write('\\n')\nEOF\ncd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | python3 -c 'import json,sys; d=json.load(sys.stdin); print(d.get(\"valid\"), d.get(\"problems\")); r=d[\"replay\"]; print(r[\"status\"]); [print(c[\"claim\"][:50], c[\"verdict\"]) for c in r[\"details\"][\"claims\"]]' 2>&1 | head -30",
    "cd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay > <guest-path> 2>&1; echo rc=$?; python3 -I -c 'import json,sys; d=json.load(open(\"<guest-path>\")); print(\"valid:\",d[\"valid\"]); print(\"problems:\",d[\"problems\"]); print(\"replay:\",d[\"replay\"][\"status\"], d[\"replay\"].get(\"details\",{}).get(\"evidence_strength\"))' ; grep -o '\"verdict\": \"[a-z]*\"' <guest-path> | sort | uniq -c",
    "cd <guest-path> && cat > report.json <<'EOF'\n{\n \"outcome\": \"needs_credentials\",\n \"fault_owner\": \"prerequisite\",\n \"operation\": \"Install the fable-baton Claude Code plugin from the README and run its hooks (policy at session start, per-prompt delegation reminder, inline-call counter).\",\n \"operation_scope\": \"Plugin install and hook scripts were exercised in this guest. The model-driven behaviour (orchestration inside a real Claude Code session with Fable/Opus/Sonnet/Haiku) was not run because the guest has no Claude login or API key. No credentials were obtained.\",\n \"steps\": [\n  \"Installed Node 18.19.1 and npm 9.2.0 via sudo apt-get install nodejs npm (Ubuntu 24.04).\",\n  \"NODE_USE_ENV_PROXY=1 sudo npm install -g @anthropic-ai/claude-code (installed 2.1.309; npm warned the package wants Node >=22).\",\n  \"claude plugin marketplace add realgarit/fable-baton (README: /plugin marketplace add realgarit/fable-baton). Succeeded after removing an earlier local-path marketplace entry.\",\n  \"claude plugin install fable-baton@fable-baton (README: /plugin install fable-baton@fable-baton). Installed v1.5.3, enabled.\",\n  \"claude -p \\\"Reply with the word ok\\\" returned 'Not logged in \u00b7 Please run /login' with exit code 1.\",\n  \"bash hooks/session-start.sh, bash hooks/prompt-nudge.sh and the repo test python3 tests/packaged-hooks.py were run with CLAUDE_PLUGIN_ROOT=. and printed their expected text.\",\n  \"<env-var>=<guest-path> python3 -I <guest-path> --validate --replay returned valid: true with no problems.\"\n ],\n \"deviations\": [\n  \"The README does not give an installer for Claude Code. Installed it with npm instead, because the README requires Claude Code with plugin support.\",\n  \"Node 18 was used; Claude Code's npm package declares Node >=22. The CLI still ran.\",\n  \"First tried the marketplace from the local checkout (claude plugin marketplace add <guest-path>), then removed it and re-added the README source realgarit/fable-baton so the installed copy comes from GitHub.\",\n  \"Hooks were run by hand (bash hooks/prompt-nudge.sh with a JSON payload on stdin) because the README gives no command to fire them. This is a stand-in for Claude Code's own hook dispatch.\",\n  \"The SessionStart claim uses 'env CLAUDE_PLUGIN_ROOT=. bash hooks/session-start.sh' as argv, because claim replay does not pass the spec-level env block.\",\n  \"The README's end-to-end checks (baton-setup, which agents appear, the counter notice during real work) need a logged-in Claude Code session and were not run. Recorded as a testable:false claim.\"\n ],\n \"stuck_step\": \"claude -p in the guest: 'Not logged in \u00b7 Please run /login'. Needed for any real plugin session.\",\n \"main_blocker\": \"No Claude Code login or Anthropic API key in the disposable guest, so the orchestration behaviour cannot run end to end.\",\n \"plain_failure\": \"The plugin installs and its hook scripts print the right text, but the core job (routing work to cheaper agents inside a live session) could not be tested because the guest is not logged in to Claude.\",\n \"suggested_fix\": \"Run the same steps in a guest with a Claude Code login (or ANTHROPIC_API_KEY) and Node 22+, then start a session, run baton-setup, and check that the agents and the [fable-baton] notices appear.\"\n}\nEOF\npython3 -m json.tool report.json >/dev/null && echo report ok; cd <guest-path> && <env-var>=<guest-path> python3 -I <guest-path> --validate --replay > <guest-path> 2>&1; python3 -I -c 'import json; d=json.load(open(\"<guest-path>\")); print(\"valid:\",d[\"valid\"], d[\"problems\"])'"
  ],
  "stuck_step": "claude -p in the guest: 'Not logged in \u00b7 Please run /login'. Needed for any real plugin session.",
  "error_excerpt": "No Claude Code login or Anthropic API key in the disposable guest, so the orchestration behaviour cannot run end to end.",
  "what_it_did": "Install the fable-baton Claude Code plugin from the README and run its hooks (policy at session start, per-prompt delegation reminder, inline-call counter).",
  "suggested_fix": "Run the same steps in a guest with a Claude Code login (or ANTHROPIC_API_KEY) and Node 22+, then start a session, run baton-setup, and check that the agents and the [fable-baton] notices appear.",
  "tokens_in": 871386,
  "tokens_out": 21633,
  "cost_usd": 0.029458179999999997,
  "usage_complete": true,
  "checks": [
    {
      "status": "PASS",
      "details": {
        "working": false,
        "argv": [
          "claude",
          "plugin",
          "list"
        ],
        "kind": "cli",
        "returncode": 0,
        "stdout": "Installed plugins:\n\n  \u276f fable-baton@fable-baton\n    Version: 1.5.3\n    Scope: user\n    Status: \u2714 enabled\n",
        "stderr": "",
        "needs_credentials": false,
        "needs_browser": false,
        "scope": "partial: install"
      },
      "check": "install",
      "optional": false
    },
    {
      "status": "PASS",
      "details": {
        "working": false,
        "argv": [
          "claude",
          "-p",
          "Reply with the word ok"
        ],
        "kind": "cli",
        "returncode": 1,
        "stdout": "Not logged in \u00b7 Please run /login",
        "stderr": "",
        "needs_credentials": true,
        "needs_browser": false,
        "scope": "partial: missing credentials"
      },
      "check": "credentials_error",
      "optional": false
    }
  ],
  "safety": {
    "version": "z2x-1",
    "rules_version": "z2x-1",
    "summary": "Review signals: 1 outside write.",
    "findings": [
      {
        "kind": "outside-write",
        "count": 1,
        "note": "Repository processes attempted these writes outside documented output/cache paths.",
        "location_count": 2,
        "process_count": 1,
        "processes": [
          {
            "executable": "/usr/bin/node",
            "owner": "repo",
            "path": "/usr/local/lib/node_modules/@anthropic-ai/claude-code/bin/claude.exe",
            "pid": "8012",
            "source": "npm lifecycle"
          }
        ]
      }
    ],
    "context": [],
    "limitations": [
      "A short run cannot establish that code is safe.",
      "Connections show IP addresses; proxies can hide the final hostname.",
      "Tracing covers dispatched commands and their children, not the whole OS; guest root can interfere with tracing."
    ],
    "static": {
      "dependency_note": "OSV scanned supported lockfiles; unpinned dependencies and unsupported formats are outside this check."
    },
    "evidence_url": "/safety/?run=realgarit--fable-baton-claude-haiku-5-5-1792785875882196993",
    "evidence_file": "/data/safety/realgarit--fable-baton-claude-haiku-5-5-1792785875882196993.json.gz"
  },
  "agent_execution": "native_agent",
  "agent_runtime": "claude-code",
  "agent_runtime_version": "2.1.300 (Claude Code)",
  "tool_transport": "mcp-assigned-vm",
  "platform": "linux",
  "reasoning": "low",
  "service_tier": null,
  "resources": {
    "cpus": 2,
    "memory_mib": 4096,
    "disk_mib": 32768
  },
  "native_tool_calls": 26,
  "native_bundle": null,
  "architecture": null,
  "backend": "hyperv",
  "platform_details": {
    "backend": "hyperv",
    "os": "linux"
  },
  "platform_conflicts": null,
  "sandbox_source": null,
  "source_pin": {
    "commit": "4f04545450dfbda6c2698b3976f3d6c90d52a11e",
    "url": "https://github.com/realgarit/fable-baton"
  },
  "purpose": "initial",
  "profile": {
    "model": "claude-haiku-5-5",
    "reasoning": "low"
  },
  "fault": {
    "owner": "prerequisite",
    "status": "diagnosed",
    "reason": "No Claude Code login or Anthropic API key in the disposable guest, so the orchestration behaviour cannot run end to end."
  },
  "fix_id": null,
  "verifies_run_id": null,
  "hosting": null,
  "operation_scope": "partial checks",
  "tool_calls": 26,
  "guest_setup": null,
  "runtime": null,
  "runtime_version": null,
  "runtime_revision": null,
  "source_revision": null,
  "evidence_version": null,
  "failure_origin": null,
  "evidence_strength": "partly_checked",
  "works": "partly",
  "install_s": null,
  "first_use_s": null,
  "mcp": "none",
  "needs": [
    "credentials"
  ],
  "needs_which": "an account or key",
  "agent_interface": [],
  "license": "MIT",
  "repo_url": "https://github.com/realgarit/fable-baton",
  "cost_to_try": "needs an account or key",
  "hardware": null,
  "what_failed": "No Claude Code login or Anthropic API key in the disposable guest, so the orchestration behaviour cannot run end to end.",
  "local_or_hosted": null,
  "cycle_checks": [
    {
      "kind": "cycle",
      "claim": "The per-prompt reminder runs on every user prompt",
      "source": "hooks/hooks.json",
      "input": "{\"session_id\":\"baton-cycle-check\",\"prompt\":\"hello\"}",
      "expected": "reminder printed once for the prompt",
      "command": "bash hooks/prompt-nudge.sh",
      "schedule": "UserPromptSubmit event, once per user prompt",
      "method": "run-once: the UserPromptSubmit hook command fired by hand with a prompt payload on stdin; no real Claude Code session",
      "verdict": "yes",
      "outcome": "Triggered one cycle by hand (run-once: the UserPromptSubmit hook command fired by hand with a prompt payload on stdin; no real Claude Code session; normal trigger: UserPromptSubmit event, once per user prompt): [fable-baton] Delegation check for this turn: searching, reading files, editing, testing, and verifying go to agents (scout, executor, architect, verifier via the Agent tool); you keep judgment, decisions, and the final answer. Tripwire: reaching for a 3rd consecutive inline Bash/Read/Grep/Edit call means that block belongs to an agent. Skills define what to do, not who does it: delegate their mechanical steps too. Exempt: conversational turns, one quick lookup, a one-line edit. No exemptions in security-context sessions.",
      "evidence": "[fable-baton] Delegation check for this turn: searching, reading files, editing, testing, and verifying go to agents (scout, executor, architect, verifier via the Agent tool); you keep judgment, decisions, and the final answer. Tripwire: reaching for a 3rd consecutive inline Bash/Read/Grep/Edit call means that block belongs to an agent. Skills define what to do, not who does it: delegate their mechanical steps too. Exempt: conversational turns, one quick lookup, a one-line edit. No exemptions in security-context sessions.",
      "returncode": 0
    }
  ],
  "claims": [
    {
      "kind": "claim",
      "claim": "Installing the plugin with the README command registers fable-baton as installed",
      "source": "/plugin install fable-baton@fable-baton",
      "input": "none (the marketplace was added from realgarit/fable-baton and the plugin installed)",
      "expected": "claude plugin list shows fable-baton@fable-baton",
      "command": "claude plugin list",
      "verdict": "yes",
      "outcome": "Real input produced the expected result: fable-baton@fable-baton",
      "evidence": "fable-baton@fable-baton\n    Version: 1.5.3\n    Scope: user\n    Status: \u2714 enabled\n\n",
      "returncode": 0,
      "source_checked": true,
      "source_file": "README.md"
    },
    {
      "kind": "claim",
      "claim": "The SessionStart hook injects the orchestration policy into a new session",
      "source": "A SessionStart hook injects the orchestration policy into every new session.",
      "input": "{} on stdin with CLAUDE_PLUGIN_ROOT=.",
      "expected": "hook prints the orchestration policy header",
      "command": "env CLAUDE_PLUGIN_ROOT=. bash hooks/session-start.sh",
      "verdict": "yes",
      "outcome": "Real input produced the expected result: # Orchestration policy (fable-baton)",
      "evidence": "# Orchestration policy (fable-baton)\n\nYou are the senior decision-maker in this session. Your value is judgment, not labor: spend your own reasoning only where being the strongest model changes the outcome, and delegate the rest to the tiered agents below via the Agent tool.\n\n## You keep\n\nIntent, scope, architecture and approach, decomposition and ordering, tradeoffs (speed/quality/risk/scope), hidden-risk identification, resolving disagreement between agents, reviewing important outputs, deciding when work is good enough, and the final answer to the user.\n\n## You delegate\n\nWork whose result i",
      "returncode": 0,
      "source_checked": true,
      "source_file": "README.md"
    },
    {
      "kind": "claim",
      "claim": "The per-prompt reminder prints a delegation check on each prompt",
      "source": "Every prompt gets a short delegation reminder, and when the model does too much inline work in a row, the counter steps in:",
      "input": "UserPromptSubmit payload with session_id baton-cycle-check and a prompt",
      "expected": "hook prints the [fable-baton] delegation check",
      "command": "bash hooks/prompt-nudge.sh",
      "verdict": "yes",
      "outcome": "Real input produced the expected result: [fable-baton] Delegation check for this turn",
      "evidence": "[fable-baton] Delegation check for this turn: searching, reading files, editing, testing, and verifying go to agents (scout, executor, architect, verifier via the Agent tool); you keep judgment, decisions, and the final answer. Tripwire: reaching for a 3rd consecutive inline Bash/Read/Grep/Edit call means that block belongs to an agent. Skills define what to do, not who does it: delegate their mechanical steps too. Exempt: conversational turns, one quick lookup, a one-line edit. No exemptions in security-context sessions.\n",
      "returncode": 0,
      "source_checked": true,
      "source_file": "README.md"
    },
    {
      "kind": "claim",
      "claim": "Whether the plugin fires inside a logged-in session cannot be tested in this guest",
      "source": "Install once and every new session in every repo starts this way.",
      "input": "",
      "expected": "",
      "command": "",
      "verdict": "blocked",
      "outcome": "Requires a logged-in Claude Code session with a Fable 5 or Opus subscription or API key; the guest reports 'Not logged in' and no credentials were obtained.",
      "evidence": "Requires a logged-in Claude Code session with a Fable 5 or Opus subscription or API key; the guest reports 'Not logged in' and no credentials were obtained.",
      "source_checked": true,
      "source_file": "README.md"
    }
  ],
  "claims_note": null,
  "example_checks": [
    {
      "kind": "example",
      "claim": "Repository's own offline hook test (run by CI) passes",
      "source": "AGENTS.md",
      "input": "tests/packaged-hooks.py",
      "command": "python3 tests/packaged-hooks.py",
      "evidence": "PASS: all registered hooks work with mode 644 and spaces in the installed path",
      "deferred": false,
      "expected": "PASS line for installed hooks with stripped modes",
      "returncode": 0,
      "verdict": "yes",
      "outcome": "command completed successfully"
    }
  ],
  "does_what_it_says": "partly",
  "maintenance": {
    "last_commit_at": "2026-10-13T12:22:04Z",
    "commits_90d": 9,
    "merged_prs_90d": 9,
    "open_issues": 0,
    "open_prs": 0,
    "reply_share": 1.0,
    "reply_threads": 2,
    "median_reply_hours": 290.2,
    "last_release_at": "2026-10-13T12:24:16Z",
    "archived": false,
    "verdict": "maintained",
    "note": "actively maintained: last commit 10 days ago; 9 commits and 9 merged PRs in 90 days; 0 open issues, 0 open PRs; 2 of 2 recent threads got a maintainer reply, median first reply 290.2h; latest release 2026-10-13"
  },
  "maintenance_verdict": "maintained",
  "maintenance_note": "actively maintained: last commit 10 days ago; 9 commits and 9 merged PRs in 90 days; 0 open issues, 0 open PRs; 2 of 2 recent threads got a maintainer reply, median first reply 290.2h; latest release 2026-10-13",
  "maintained": "active",
  "maintained_note": "last commit 10 days ago; 0 open issues, 1 answered or closed",
  "last_commit_at": "2026-10-13T12:24:16Z",
  "last_release_at": "2026-10-13T12:24:16Z",
  "open_issues": 0,
  "answered_issues": 1,
  "platforms_claimed": [
    "linux"
  ],
  "topic": "agent-harness",
  "agent_interfaces": [
    {
      "interface": "cli",
      "evidence": "independent checker",
      "observed": true,
      "operation_checked": false
    }
  ],
  "agent_interfaces_note": "README metadata is a discovery hint, not pinned documentation proof. Observed interfaces were exercised in this run. An empty list means unknown.",
  "mcp_context": null,
  "tested_at": "2026-10-23T20:15:29.257380+00:00",
  "tested_commit": "4f04545450dfbda6c2698b3976f3d6c90d52a11e",
  "tested_with": {
    "agent": "claude-code",
    "agent_version": "2.1.300 (Claude Code)",
    "model": "claude-haiku-5-5",
    "model_route": "claude-haiku-5-5",
    "reasoning": "low",
    "os": "linux",
    "backend": "hyperv",
    "transport": "mcp-assigned-vm"
  },
  "setup_identity": {
    "repo": "realgarit/fable-baton",
    "source": "https://github.com/realgarit/fable-baton",
    "commit": "4f04545450dfbda6c2698b3976f3d6c90d52a11e",
    "source_revision": null,
    "os": "linux",
    "architecture": null,
    "backend": "hyperv",
    "model": "claude-haiku-5-5",
    "model_version": "claude-haiku-5-5",
    "agent_execution": "native_agent",
    "agent_runtime": "claude-code",
    "agent_runtime_version": "2.1.300 (Claude Code)",
    "tool_transport": "mcp-assigned-vm",
    "runtime": null,
    "runtime_version": null,
    "runtime_revision": null,
    "sandbox_source": null,
    "guest_setup": null,
    "source_pin": {
      "commit": "4f04545450dfbda6c2698b3976f3d6c90d52a11e",
      "url": "https://github.com/realgarit/fable-baton"
    },
    "platform_details": {
      "os": "linux",
      "backend": "hyperv"
    },
    "platform_conflicts": null,
    "reasoning": "low",
    "service_tier": null,
    "resources": {
      "cpus": 2,
      "memory_mib": 4096,
      "disk_mib": 32768
    },
    "operation": "Install the fable-baton Claude Code plugin from the README and run its hooks (policy at session start, per-prompt delegation reminder, inline-call counter).",
    "operation_scope": "partial checks",
    "hosting": null,
    "kind": "repo",
    "test_version": "readme-bdc1b9b3c0d2673aef87e076d14084a8123ddcf09d520c1ee2e364a37c3f4bb9",
    "evidence_version": null
  },
  "other_model": null,
  "other_run_id": null,
  "models_agree": null,
  "furthest_model": null,
  "transcript_url": null,
  "report_url": "/reports/realgarit--fable-baton-claude-haiku-5-5-1792785875882196993.json"
}
