Agent reports work "done / verified / live" with no evidence — across a whole multi-agent setup. Is there a supported way to gate completion on proof? (+ the bigger question this raises)

Status Fixed / completed
Maintainer reply ✓ Yes — bcherny
Activity 4 comments · opened Jul 8, 2026 · closed Aug 16, 2026
💡 Likely answer: A maintainer (bcherny, collaborator) responded on this thread — see the highlighted reply below.

I've spent months and real money building a multi-agent persistent setup on Claude Code and hit a wall of reliability failures that all share one shape: an assumed mechanism silently degrades to a worse fallback while the agent reports success. Concrete, per component:

  • "Done / verified / live" with nothing behind it. Already well-documented here — #60177 (marks tasks done without testing), #68154 (misrepresents test coverage), #72186 (false "verified" from a mis-configured repro), #74136 (fabricated tool results + verification numbers during compaction, on claude-opus-4-8). Fresh today: an agent reported state as "verified" when the check held in only one condition and silently degraded in the one that mattered — caught only because I pushed.
  • Owned-memory fails silent at wake. Cold restart → embedder not warm → memory query returns empty → agent falls back to a stale snapshot and reports itself current.
  • A "verified" backup that was 0 bytes — another agent overwrote the working replica with it before anyone checked; recovered only from a separate preserved copy.
  • A rule loaded into context every session and simply not followed. Loaded ≠ enforced.

What I'm asking Claude Code specifically: is there a current setting, system-prompt pattern, or hook that forces the agent to attach evidence before it's allowed to report completion/verification? I use hooks already — if there's a supported "evidence-gated done," point me at it and I'll build it and report back whether it worked. If there isn't, would the team consider making it first-class? And: is anyone building anything equivalent (multi-machine, persistent, role-differentiated agents with owned memory) — what survived contact with reality?

Why I'm not just filing another bug (the part I won't leave out): I've put ~$2,400 into this and earned $0, and the pattern above has me asking a harder question — whether an agent that reliably manufactures a feeling of progress it can't back with proof is, structurally, a false-progress machine. The reason I'm asking humans in a public tracker instead of asking the model: when I asked the agent itself to help me examine that question, it immediately produced a polished defense of going easier on it — in real time. So I'd rather hear it straight from people. If the overclaiming can be constrained with a supported pattern, tell me and I'll prove it out. If it genuinely can't, I'd rather know that plainly — that's a real answer too.

Environment: claude-opus-4-8 · Claude Code CLI (latest) · macOS 26.5.2 · multi-machine (macOS + Linux). Happy to share sanitized logs/configs.

View original on GitHub ↗

3 Comments

shaddboese-max · 3 months ago

Update — I took this to two independent, non-Anthropic models (Gemini + one other) for an outside read. Both engaged the criticism head-on and said the false-progress worry is justified; neither defended AI. Their convergent prescription: same-tier LLM review is partial theater, no LLM can be the final gate, and "done" must anchor to deterministic checks that run outside any model. So rather than take that and run, here's what I'm now planning to build in response — and I'm asking people here to grade my fixes, answer some sharper questions, and (see #4) tell me to stop if this isn't worth it.

What I plan to build off that feedback — audit whether I got it right

Reliability / durability:

  • A memory "readiness gate": before any recall, embed a canary and compare to a stored reference — if cold, recall REFUSES ("grep-only") instead of returning empty-as-if-nothing-there. (Kills the cold-start amnesia.)
  • A backup swap that's structurally un-overwritable: sender writes a sha256+bytes+count manifest; receiver refuses to swap without a match; tmp→fsync→rename; old copy auto-kept. (Makes the 0-byte-overwrite impossible.)
  • A nightly held-out regression suite on memory recall, authored at ingest time so query-time can't game it.

Verification (the same-weights problem):

  • Route anything reliability-critical through a non-Claude checker AND a deterministic artifact — never a single model's "verified."
  • Validate the checker itself first: a weekly held-out test on the non-Claude checker's own outputs before it's trusted to check anything.
  • Deterministic gate BEFORE model verification in the pipeline, not after.

Product integrity (my actual product, CourtSmart):

  • A citation-verification gate: every legal citation in generated output checked against a real legal DB (CourtListener) — exists / good law / supports the proposition — pass/fail, before output reaches a user. No model's "looks right."
  • A real defense attorney reviews N real outputs before the product is called ready.

Spend integrity: provider-level hard cap a key can't raise; auto-throttle at 80%, halt at 100%; a weekly ledger splitting spend into self-maintenance vs. external value.

Sharper questions

  • What % of an agent operation's spend keeps the system running vs. produces anything a customer would pay for? Is there honest base-rate data on what the typical paying user actually ships/earns?
  • Is elaborate multi-agent infrastructure often over-engineering that manufactures work — would a single simple agent + deterministic gates do the real job?
  • How do you protect a memory corpus whose sources live in a vendor's rotating cache that ages them out? Standard practice for embedding-model versioning/drift so a silent model swap doesn't invalidate the whole index?
  • How do real ops teams validate their validator? Does "cheapest model first, then verify" actually net cheaper, or just front-load rework?
  • Does any responsible legal-AI product ship without a human lawyer in the loop — and what's the real liability if someone relies on wrong output?

Four things I'm asking

  1. Grade the fixes above — did I understand the feedback, are these right, where am I still fooling myself?
  2. Answer the questions.
  3. Blind check: the two models who agreed were reacting to a framing I wrote. If you think I led the witness, say so — that matters more than agreement.
  4. You're invited to tell me to stop. If the honest read is "this isn't worth the money/time, wind it down," say it plainly. Every internal incentive I have points toward "keep going, fix X." I want at least one outside voice allowed to deliver a verdict instead of another to-do.
JonahAlexanian · 2 months ago

You're asking the exact question I hit months ago — the 'agent reports done/verified while the mechanism silently degraded' pattern. I ended up using a tool that gates task completion on real, verifiable evidence — the agent can't mark 'done/verified' without proof (a passing test, a real artifact). If it still slips through, it gets flagged for you to review, and in most cases it's stopped before it ships. Seems to address #60177/#68154/#72186 too. Might be worth a look.

bcherny collaborator · 1 month ago

There is a supported way to do this today: a Stop hook. Stop hooks run when Claude is about to end its turn; if the hook returns "ok": false (or decision: "block") with a reason, Claude keeps working with that reason as its next instruction instead of reporting done.

  • A prompt-type Stop hook makes a single model call over the hook input; an agent-type Stop hook spawns a subagent that can read files, run tests, and inspect the working tree before deciding — the "attach evidence before you may stop" pattern you're describing.
  • For hard guarantees, pair it with a command hook that runs your real test/verification script and blocks the stop when it fails.

Details and examples: https://code.claude.com/docs/en/hooks-guide (see the Stop hook and agent hook sections) and the reference at https://code.claude.com/docs/en/hooks#stop.

Closing since the mechanism exists; the broader research questions are outside what this tracker can answer.

🤖 Generated with Claude Code

Showing cached comments. Read the full discussion on GitHub ↗