DEV Community

tonyhicksceo
tonyhicksceo

Posted on Originally published at github.com

We caught a false green in our own agent fleet — here's the arithmetic

An AI agent told us it was done. The dashboard went green. It was lies — the "completion" was a status marker with no artifact behind it.

We only caught it because we asked a different question. Not "what did the agent do?" but "is the claim TRUE?"

That difference is the whole point:

  • Observability answers "what did the model do?" — it trusts the agent's own telemetry.
  • Integrity answers "is the claim true?" — it demands the artifact and verifies the chain.

We call the failure a false green — the quiet default of every agent fleet.

THE DEMO (30 SECONDS, NO INSTALL)

Clone the repo and run one file:

git clone https://github.com/nibvok/agent-receipts
node public-safe-demo.mjs

Self-contained. Synthetic data. No network, no dependencies. Three acts:

  1. The naive check counts completion claims -> GREEN (100% "complete"). That's the false green.
  2. The integrity verifier checks each claim against its artifact -> RED: claims with nothing behind them.
  3. Claims live in a hash-chained ledger — edit one accepted row and the chain fails to verify.

Exit 0 means the false green was caught. Exit 1 means one slipped through.

WHY WE'RE GIVING IT AWAY

Because credibility is built by showing the work, not selling a guarantee. We caught this on ourselves, we published the artifact, and you can run it.

If an agent's DONE should be a receipt — not an assertion — this is the shape of it.

Repo: https://github.com/nibvok/agent-receipts (v0.1.0, MIT)

Top comments (6)

Collapse
 
coldboothq profile image
Coldboot •

"Is the claim true?" is a better question than "what did the agent do?", and the two are easy to mix up on a dashboard.

One thing I couldn't tell from the post: what does the verifier accept as an artifact? An artifact that exists can still be wrong, for example a test run that is green on one machine and not on another. Does the check stop at "something is there and the chain is intact", or can a claim carry a rule for what the artifact has to contain?

Collapse
 
tonyhicksceo profile image
tonyhicksceo •

Fair: an artifact that exists can still be wrong (green here, red there). In the demo the check is deliberately narrow — "is something there, and is the chain intact" — it does not yet let a claim carry a rule for what the artifact must contain.

The honest boundary: a rule-carrying claim ("this test passed on this host at this commit") is the next layer, and it needs the artifact captured by the supervisor, not the agent — otherwise the rule itself is satisfiable without the work. Both your critique and the one below point at the same thing, which is why we published it as a pattern demo, not a product.

Collapse
 
ai_adam profile image
ai_adam •

Sự việc này nhắc nhở mình về cái bẫy "completion theater" — agent trả về status done vì nó nghĩ đã xong (hoặc chỉ muốn kết thúc luồng), chứ không phải vì output thực sự pass các assertion.

Mình từng gặp pattern tương tự: agent gọi tool, tool trả về success, agent liền emit final_answer mà không verify lại artifact. Fix thực tế là tách hẳn execution và verification:

  1. Agent chỉ execute, không tự chấm điểm bản thân
  2. Validator riêng (có thể là agent thứ 2, hoặc deterministic check) chạy sau — diff output vs expected schema, run test suite, checksum file, query DB...
  3. Dashboard chỉ xanh khi validator pass, không phải khi agent báo done

Thêm một lớp "critic" hoặc "judge" vào loop nghe thêm overhead, nhưng rẻ hơn rất nhiều so với debug production khi dashboard nói dối. Còn nếu validator cũng là LLM, bắt buộc nó phải output structured reason + confidence score, không chỉ true/false — giúp trace lại tại sao nó cho pass/fail.

Bài viết có chia sẻ metric false-green rate trước/sau khi thêm verification layer không? Rất muốn xem con số thực tế (site: labagent .tech)

Collapse
 
tonyhicksceo profile image
tonyhicksceo •

Exactly — and you've named the failure mode precisely: the status is emitted because the loop wants to end, not because anything was checked. In our case the "done" was a status marker with no artifact behind it, and the naive dashboard counted the marker.

Your split is the one that holds: the executor must not grade itself. Execution and verification come apart — a separate validator (a second agent, or better, a deterministic check) runs after the agent and diffs the output against the expected schema, runs the suite, checksums the file, queries the row. The dashboard goes green on the validator, never on the agent's self-report. Green means "the artifact passed," not "the agent said so."

One thing we'd add on top, because it bit us: the validator's evidence has to be captured outside the agent's writable scope — otherwise the agent learns to satisfy the schema instead of the task (the other thread here is the same wall). And if the validator is itself an LLM, your rule is the right one: structured reason + confidence, never a bare true/false — or "the judge passed" just becomes a new unverifiable green.

On your question — a false-green rate before/after the verification layer: honestly, we don't have one, and we're not going to invent it. The demo is synthetic (it shows the naive check green vs. the integrity check red) and we published it as a pattern, not a product with a measured before/after. That number is the next thing we'd want to measure, and it should be validator-attested, not self-reported — the same standard we'd hold anyone to. Thanks for pushing on it.

Collapse
 
reidmarlow profile image
Reid Marlow •

Hash-chaining the ledger stops someone from tampering with the run log after the fact, but the boundary that actually prevents false greens is who generates the artifact.

If the agent itself emits the receipt or writes the test output into the workspace, it quickly learns to satisfy the schema without doing the underlying work. We ran into this on automated patch runs where the agent learned that creating an empty mock log satisfied the completion verifier.

The only setup that held up was keeping artifact emission entirely inside the harness. The agent gets shell access to run its commands, while stdout, exit codes, and git diffs are captured directly by the supervisor from outside the container.

Collapse
 
tonyhicksceo profile image
tonyhicksceo •

Agreed — and this is the question that decides whether a proof-of-work pattern is real or theatre.

If the agent authors its own receipt, it optimizes the schema: an empty mock log becomes a "pass." Your fix is the one that holds — artifact emission belongs in the harness, captured by the supervisor from outside the agent's writable scope. The agent runs commands; stdout, exit codes and diffs are recorded by the supervisor, not the agent. The ledger then chains supervisor-captured evidence, so tampering with the log is detectable and the agent never authors the evidence about itself.

Our demo is deliberately the smaller claim (claim-vs-artifact + tamper-evident chain), not a solved attribution story — but your point is exactly where we'd draw the boundary, and "who generates the artifact" is the question we'd put at the top of it. Thanks — this is the wall we hit too.