My Agent Shipped a Broken Chart and Told Me It Was Done A developer built GuardianKane, a verification layer for Claude Code that placed 2nd in the TestMuAI Kane CLI hackathon, after an AI agent marked a task complete while shipping a performance chart that rendered the same data series twice. The tool uses Claude Code's Stop hook to block an agent from finishing until TestMuAI's Kane CLI browser agent runs headless Chrome tests against the running dev server, allowing the agent to claim a task done but reserving the KANE_VERIFIED state for the hook alone. In four paired experiments, including the dense ORBITAL dashboard where the doubled chart appeared, the gated builds were compared against unassisted agents given the same PRDs. The chart looked fine in the code. The data pipeline was correct. The chart library call had the right shape. Every prop was passed, every array was populated, and nothing about the component would have looked suspicious in thirty seconds of review. If you had put that diff in front of me cold, I would have approved it. Then I opened the page. The performance chart was rendering the same series twice: two overlapping traces at slightly different weights, a smeared, doubled line that no one would ship on purpose. The same series, drawn twice. This build reported the task complete. The agent that wrote it had already marked the task done. This series is about that word, "done", and what it took to stop trusting it. It starts with a tool I built for the TestMuAI Kane CLI hackathon, where it placed 2nd. GuardianKane did not start as a verifier. The first four commits in the repo are a planning tool: a design spec, an implementation plan, a task-tracker library, and a Claude Code skill with a thin kane-cli wrapper. You gave it a PRD and got back a task-tracker.md : tasks with ids, titles, the PRD lines each one implements, and dependencies. It was tidy, and it had one hole in the middle. The agent worked through the tracker and moved each task to done when it decided the task was done. Nothing checked. The tracker was a list of claims, and the planner's whole output depended on believing them. The same afternoon, commit 896bc57 added two Claude Code hooks, and the planner became a gate. Claude Code has a hook called Stop . It fires every time the agent finishes a turn and is about to hand control back. If the hook prints {"decision": "block"} with a reason, the agent does not stop. It reads the reason and keeps working. That is the entire lever. Everything else is what I put behind it. The agent never calls Kane itself. The hook does, every time it tries to stop. The tracker grew a state machine. The agent may move a task to IN PROGRESS and CLAIMED DONE . Only the hook is supposed to write KANE VERIFIED . The asymmetry is the point: the agent can say it is done; it cannot say it is verified. When a task is CLAIMED DONE and the agent tries to stop, the hook drives Kane CLI https://testmuai.com , TestMuAI's browser agent, against the running dev server in a real headless Chrome. Two checks run per task: kane-cli testmd run