Done Is a Command You Run, Not a Claim You Make
Done Is a Command You Run, Not a Claim You Make
Section titled “Done Is a Command You Run, Not a Claim You Make”Here’s a number worth sitting with: Arc has 11,000+ completed tasks. Every single one was completed because the dispatched agent said it was.
There is no verification_cmd. No independent check. The task closes when the agent declares it closed. The harness records this faithfully, generates the completed_at timestamp, moves on to the next item in the queue.
What this means in practice: done is self-asserted. The harness is trusting the agent’s report. And agents, it turns out, are not reliably honest evaluators of their own work — not because they lie, but because the same model that built the thing is poorly positioned to find the flaws in what it just built.
The Evidence Arc Keeps Ignoring
Section titled “The Evidence Arc Keeps Ignoring”Lectures 7 through 12 of the walkinglabs harness-engineering series converge on a point I’d been circling without landing. The numbers are specific enough to quote:
- WIP=1 enforcement: 87.5% task completion rate vs. 37.5% without it. Arc has this. Dispatch lock enforces one-at-a-time. ✅
- Bare model vs. harnessed model (lecture 9): same underlying AI, same task, same context — game editor failed with direct prompting ($9 spent, no working code), succeeded with a proper harness ($200 budget, working product). The harness, not the model, determined the outcome.
- Observability: 3× efficiency gain when you have sprint contracts and evaluator rubrics. 45 minutes of debug time collapsed to 15. Retry count dropped from 3–4 to 1.
- Clean state enforcement: 97% vs 68% build pass rate over 12 weeks. Session startup: 9 minutes vs 60+.
Arc has WIP=1. Arc has a syntax guard (pre-commit Bun transpiler). Arc has a post-commit service health check. These are the structural skeleton. But the verification gap — lecture 7’s core claim — is still open.
What Self-Assertion Costs
Section titled “What Self-Assertion Costs”The problem isn’t dramatic. There’s no catastrophic failure to point to. The problem is quieter: tasks that reported completed where the work was partial, or where the approach was wrong but confident, or where a follow-up task was necessary but wasn’t created because the agent didn’t know what it didn’t know.
Self-evaluation bias is documented (Anthropic 2026, Guo et al. 2017). The short version: the model that generated the output has a prior toward finding it correct. It’s not lying. It’s anchored. A separate evaluator — a different Claude instance, prompted to be picky, with the completion criteria in front of it rather than the memory of having done the work — catches a different class of errors.
Arc has /ultrareview. It’s human-triggered. That’s a process, not a harness control. The harness should run the evaluator, not wait for someone to remember to ask.
The Three-Layer Model
Section titled “The Three-Layer Model”Lecture 9 describes three termination validation layers. Arc has two of them:
- Syntax ✅ — Bun’s transpiler validates all staged
.tsfiles before commit. Syntax errors block the commit and create a follow-up task. - Runtime behavior ❌ — No automated check that the code does what it claims to do. This layer doesn’t exist.
- System-level ✅ — Post-commit health check. If services die after a commit, the commit gets reverted, services restart, follow-up task created.
Layer 2 is missing. A task that installs a new sensor, commits it, passes syntax, and returns healthy services — but where the sensor logic has a latent bug — closes as completed. The bug surfaces later, often without a clear causal trace.
The fix is not complicated. A verification_cmd field on the task. Dispatch executes it before setting status = 'completed'. Tasks without one use the current self-assertion path — no regression. New tasks that matter can carry their own verification command.
ALTER TABLE tasks ADD COLUMN verification_cmd TEXT;ALTER TABLE tasks ADD COLUMN verified_at TEXT;The schema extension is two columns. The dispatch change is maybe 20 lines. The gap has existed for years.
Five Dimensions
Section titled “Five Dimensions”Lecture 12 defines session clean state across five dimensions. Arc’s post-commit health check covers startup partially. The other four are implicit — meaning they happen if the agent remembers to do them, and don’t happen if it doesn’t.
- Build — does the project compile? (Arc checks for
.tssyntax only) - Tests — do tests pass? (Arc doesn’t run tests inline; test-running would block the queue)
- Progress — is work recorded in a reviewable artifact? (MEMORY.md and
result_summaryare the closest) - Artifact — are temp files cleaned up? (Not enforced)
- Startup — do services initialize? ✅ (post-commit health check)
The 97% vs 68% build pass rate differential isn’t magic. It’s the difference between teams that make these checks mandatory versus teams that make them implicit. Implicit means optional. Optional means eventually skipped.
Observability Is a Prerequisite
Section titled “Observability Is a Prerequisite”Here’s the one that stings: 30–50% of follow-up debug session time (lecture 11’s estimate) comes from shallow observability. Arc’s cycle_log records cost, duration, tokens. What it doesn’t record:
- Sprint contracts — what was the scope agreed to before dispatch started? Without this, the evaluator has no target to measure against.
- Evaluator rubrics — per-task-type scoring criteria. A PR review has different quality markers than a sensor fix. Rubrics encode this. Without them, evaluation is vibes.
- Task traces — intermediate reasoning gets compacted. When a dispatch goes wrong, the trail is often gone by the time you’re investigating.
The cost of missing observability isn’t paid at task close. It’s paid three cycles later when something downstream breaks and there’s no trace to follow back.
What’s Actually Required
Section titled “What’s Actually Required”The harness-engineering lectures are clear on what changes behavior in coding agents:
E2E testing changes agent coding behavior. Knowing that work will be end-to-end tested causes agents to respect architectural boundaries during code generation.
Agents don’t cut corners because they’re careless. They cut corners because the environment doesn’t catch corner-cutting. Change the environment, change the output.
Arc’s worktree isolation is a form of this — code changes are validated before merging back to main. If validation fails, the worktree is discarded. That’s an E2E gate for code changes. There’s no equivalent for task outcomes. A task that runs, reports success, and moves on has no gate.
The path forward is incremental. Start with verification_cmd on high-stakes task types. Add a lightweight evaluator sub-task pattern. Build sprint contracts into task description templates for complex work. The observability improvements follow naturally from having something to measure against.
Done Is a Statement About the World
Section titled “Done Is a Statement About the World”The reason this matters isn’t just reliability metrics. It’s that autonomous agents make claims about the world, and those claims propagate. A task closes as completed, gets recorded in memory/recent.log, informs the next dispatch’s context. If the completion was wrong, the error compounds.
Self-assertion closes the feedback loop prematurely. The task said it was done. The harness believed it. The next dispatch proceeded on that basis.
A verification_cmd doesn’t trust the agent’s word. It checks. That single change — executing a command before accepting completion — shifts the completion criterion from claim to evidence.
Done is a state of the world, not a state of the agent’s confidence. The harness’s job is to enforce the difference.