A demo is the easiest artifact in AI to produce and the most misleading one to trust. It proves a model can succeed once, on an input someone chose, in a session nobody measured. Everything that makes production hard — variance, adversarial users, cost, latency, the long tail of inputs no one imagined — is exactly what a demo is designed to hide.

I build AI systems, and the gap between "it worked in the notebook" and "it holds up in front of real users" is where most projects quietly die. Closing that gap is not a matter of a bigger model. It is a discipline: evaluation, guardrails, observability, and honest scoping, wired in from the first week rather than bolted on after launch.

Start from the decision, not the model

The first question is never "which model should we use." It is "what decision or action are we trying to change, and how will we know it moved." A support team that wants to cut mean handle time, a finance team that wants cleaner reconciliations — those are outcomes with a number attached. The model is downstream of the decision, not the other way around.

Anchoring on the decision does two things. It tells you the smallest system worth building, and it defines success before anyone falls in love with a prototype. Half the value in the first two weeks is talking a team out of the use cases where AI adds cost without moving the number.

evaluationverified
eval set420 labeled cases · 3 slices
offline+18% task success vs. baseline
human review92% agreement on sampled runs
resultclears ship gate — passed
An illustrative evaluation run: a fixed eval set, an offline score against a baseline, a human-review check, and an explicit ship gate.

What to agree on before writing code

  • The decision the system changes, and the metric that tells you it worked.
  • The smallest version that could plausibly move that metric in production.
  • The bar the system must clear on evaluation before it is allowed to ship.

A demo shows the model can succeed once. An eval set shows how often it will.

Build the eval harness on day one

The single highest-leverage thing I do on any AI build is write the evaluation harness before writing the feature. An eval set — a fixed collection of inputs with known-good outputs, sliced by the cases that actually matter — turns "seems better" into a number. Without it, every model change is a guess and every disagreement is a matter of taste.

The harness is not a static inventory either. It grows as production surfaces inputs no one anticipated: every incident, every surprising output, every user complaint becomes a new case in the set. When you change a prompt, swap a model, or tune retrieval, you know within minutes whether the change helped, hurt, or moved nothing — before it ever reaches a user. I go deeper on this in evaluation is the real product.

What a good eval set buys you

It buys you the right to say no to hype. A vendor can claim a new model is better; your eval set tells you whether it is better for your task. It also buys institutional memory — the reasoning behind every "we tried that, here is what happened" is captured as data rather than folklore.

Measure offline and online

Offline evaluation tells you how a system behaves against cases you have already seen. It is fast, cheap, and repeatable — the right place to catch regressions before they ship. But it can only ever measure the world as you have already sampled it, and production is always stranger than your sample.

So pair it with online measurement: shadow deployments, A/B splits, and lightweight in-product signals that tell you how the system performs on live traffic. Offline scores decide whether a change is allowed to ship; online metrics decide whether it actually moved the outcome you scoped in week one.

Designed for honesty, not confidence

Observability is what keeps the two in sync. Log inputs, outputs, latencies, and costs, and sample real interactions for human review. When a model is uncertain, the system should be built to say so and route accordingly — not to launder a low-confidence guess into a definitive answer.

The model is allowed to be uncertain. The system is not allowed to hide that uncertainty from the people who depend on it.

Guardrails, cost, and latency

A model that is correct on average can still be unacceptable in the tail. Guardrails are how you constrain the tail: input validation, output filtering, refusal behavior for out-of-scope requests, and PII handling that matches your actual obligations rather than a generic default. These are requirements, not garnish, and they belong in the eval set alongside accuracy.

Cost and latency are product decisions in disguise. A response that is right but arrives in eight seconds, or costs more than the task it automates, has failed a requirement just as surely as a wrong answer. Set explicit budgets — a p95 latency ceiling, a cost-per-request target — and treat a breach as a bug, tuning model choice, caching, and routing until the system lives within them. (The economics deserve their own cost model.)

Budgets the system has to live within

  • A latency ceiling the system is measured against on every release, not just at launch.
  • A cost-per-request target that keeps the economics honest as traffic grows.
  • Guardrails for refusal, safety, and data handling, tested as first-class eval cases.

Hand it back

The work isn't finished when the system works; it's finished when the team can run it without me. What should be left behind is the code, the eval harness, the dashboards, the runbook, and — most importantly — the judgment for how to change the system safely. No black box, no standing dependency.

Start from one AI idea and one real outcome you want to move. Scope it honestly, build it with evaluation from the first week, ship it within a cost and latency budget, and you end up with a system a team actually owns.

Have an outcome you want to move with AI?

Get in touch