My agent’s error rate went from zero to thirty-four percent. That was the moment three months of running an agentic harness turned into four lessons.

A pen passing from an open hand to a mechanical clamp, depicting the maker to verifier handoff

First, an inbox beats a task list. A list beats a stream for one reason : you can see everything at once. So I moved my work queue from Asana into Gmail & built an agent to work through it. While it works, threads sit archived under a processing label. When it finishes, or needs me, the thread returns to the inbox. The agent never permanently archives mail. Only I do. The inbox became the “waiting on you” surface. Twenty-four threads used to rot silently under an error label. Now they surface with a one-line reason.

Second, routing is essential. One model became a router : a fast local worker, a local reasoner, & cloud fallback tiers. Local runs four to six minutes per task. Cloud runs about thirty-nine seconds. Local is cheap. Cloud is reliable. The router’s job is to know which the task can afford, & to record the real reason a task went to cloud instead of faking a local failure to justify the promotion.

Third, self-healing works, but it is brittle & it surfaces more errors before it surfaces fewer. For six weeks my agent’s error rate was zero. Then it rose to 15 percent, then 34 percent. It did not rise because the system got worse. It rose because the system stopped hiding failures. Before the fix, twenty-one threads sat stranded in error, the oldest for eighteen days, & a hundred & twelve recoveries happened by hand-written SQL. After the fix, failures surface immediately, redrive four times with jittered backoff, then dead-letter. Today zero threads sit in error. But surfacing an error is not the same as fixing it. The system now reverts its own bad deploys, 65 so far, 42 of them because unit tests failed, & since late July it catches broken code before deploy instead of after. Broken main never ships. Still, auth failures need a human to refresh a token. Memory limits need a human. A model that narrates instead of working needs a human to notice.

Fourth, you need a quarterback even in a no-huddle offense. The work stopped being one monolithic prompt & became a graph of contracted nodes : the model produces a narrow JSON intent, an action, a domain, a reason, a confidence score. Deterministic code performs the write. An independent node re-reads to confirm. Maker & verifier are different nodes ; never ask the agent to grade its own homework. That separation lets plays run without a huddle. It does not remove the quarterback. Someone still has to call the plays that matter : which task goes to cloud, which failure gets a human, which deploy gets reverted. Three months in, that quarterback is still me, sitting one layer above the code that used to be the whole team.