Mark Gerrard
Agents

Verification before autonomy

9 January 2026 · 8 min

Autonomy is not a slider you turn up. It is something you earn, one verified decision type at a time.

The temptation with a capable model is to hand it the keys: let it read, decide, and write in one motion. That works until the first decision you can’t explain, and then you spend a fortnight reconstructing what happened from logs that weren’t designed to answer the question.

Invert the default

We made refusal the default. An agent does nothing irreversible unless a check it cannot author itself has passed. The model writes a proposal; a separate, deterministic verifier decides whether the proposal is allowed to act. The two are never the same code path.

gate.ts
typescript
function gate(proposal: Proposal): Action | Review {
  if (!schema.valid(proposal)) return review(proposal, "schema");
  if (proposal.confidence < FLOOR) return review(proposal, "low-conf");
  if (proposal.touches("billing")) return review(proposal, "high-risk");
  return commit(proposal);
}

The review queue is the product

The queue where refused proposals land is not a failure state — it is the safest, most informative surface in the system. It is where the model tells you it is out of its depth, and it is the dataset you use to decide what to automate next.

More writing

All writing →
Reliability is a budget, not a feature Reliability · 2026·02·14 The CRM is the hard part Integration · 2025·11·22 Multi-model orchestration without the orchestra Orchestration · 2025·10·03 What the planning domain taught me about retrieval Retrieval · 2025·08·17 Logging the prompt that actually shipped Observability · 2025·06·30