18 Sept 2025 · 8 min read

Your AI agent needs a boring deterministic spine

The seductive version of an agent is one loop: give a model some tools, describe the goal, let it decide what to do next. It demos beautifully. It also fails in a way that is uniquely expensive, because when it goes wrong there is no step to point at - the whole trajectory is the bug.

Where to put the intelligence

The architecture I keep coming back to is boring on purpose. The routing is deterministic: a fixed graph of steps, written by a human, with explicit branches. The model lives inside individual nodes, doing the thing models are actually good at - turning messy language into structure, drafting text, classifying intent. It never decides what happens next.

trigger  →  transcribe  →  extract(model)  →  verify(registry)
                                        ├─ matched  → upsert CRM
                                        └─ ambiguous → ask human in thread

Every arrow in that diagram was decided at design time. The model contributes at exactly one node - extract - and its output is validated against a schema before anything downstream touches it. If extraction returns something that isn't a valid company name and intent, the flow stops there with a legible error, instead of confidently writing garbage into a system of record.

Fail loudly, not quietly

The single biggest reliability gain isn't a better model or a better prompt. It's a verification step that can say no. In the meeting-to-CRM flow, that's matching an extracted company name against an official registry. The model can hallucinate a plausible company. The registry cannot. When they disagree, the flow escalates rather than resolves.

This is the difference between an agent that saves your team time and one that generates a slow, invisible data-quality problem. Quiet failure in a CRM is the worst kind: nobody notices for six weeks, and then nobody trusts the pipeline report again.

The three rules

  • Deterministic routing. A human wrote the graph. The model never picks the next node.
  • Schema at every model boundary. Structured output, validated, rejected on failure. No parsing prose downstream.
  • A ground-truth check before any write to a system of record. If there's no ground truth available, there's a human in the loop instead.

The objection

'You've just built a workflow with an LLM in it.' Correct. That's the point. The word 'agent' is doing marketing work, not architectural work. What the business wanted was a reliable process that handles unstructured input - and unstructured input is precisely the narrow thing to hand the model.

Fully autonomous loops have a place: exploratory research, one-off analysis, anywhere a human reviews every output before it matters. The moment the output writes to a system other people depend on, put a spine under it.

Share this

← All writing