None of these are exotic. Each is the thing that, when absent, produces one specific and entirely predictable failure — so the honest way to read this list is as five incidents you can choose to have or not have.
01
Data contracts
Input and output schemas, validation at the boundary, explicit nullability, versioned interfaces between caller and service
A written and enforced statement of what goes in and what comes out. Every field named, every type fixed, every optional field marked optional on purpose rather than by accident, and a rule for what happens to a record that fails validation — rejected with a reason, or quarantined for a person, but never silently accepted. The output side matters as much as the input side, because whatever consumes the answer has to be able to parse it without guessing, and a model asked for structured output will occasionally produce something adjacent to the structure you asked for. The cost is real: contracts slow down the first two weeks, they make small changes require a version bump, and they will reject records that a human would have understood. That is the trade. You are buying a system that fails loudly at the door instead of quietly in the middle.
A supplier changes an upstream export and starts sending the date as a string rather than an ISO timestamp. Nothing errors. The model reads it, forms a plausible view, and for eleven days every record from that supplier is processed against the wrong month. The discovery is a person noticing an odd total, and the remediation is a reprocessing job over eleven days of records that nobody kept the originals of.
02
Idempotency and retries
Idempotency keys, at-least-once delivery, timeouts on every outbound call, exponential backoff with jitter, dead-letter queues
Idempotent means an operation can be performed twice and the second time changes nothing. This matters because in any real deployment messages arrive twice: a queue redelivers, a network call times out after the work was actually done, an operator replays a batch. The mechanism is a key derived from the request itself, checked before the side effect, so the second arrival finds the first result and returns it rather than doing the work again. Retries are the other half — every outbound call gets a timeout, failures are retried with an increasing and slightly randomised delay so that a recovering service is not immediately flattened by every client retrying in unison, and anything that fails repeatedly lands in a dead-letter queue where a person can look at it rather than disappearing. The cost is that idempotency requires storing keys and results, which is state you now have to size, expire and back up.
A queue consumer times out after the model call completes but before the acknowledgement lands. The message is redelivered. The system, having no memory of the first attempt, does the work again — and the work in this case was raising a credit note. The customer receives two. The reconciliation takes a fortnight, and the queue redelivered forty-one messages that night, not one.
03
Observability
Structured logs with a trace id across every hop, token and currency cost per call, latency percentiles, sampled prompt and response capture, redaction and retention policy
The ability to answer, after the fact, why the system produced that answer. In practice that means a trace identifier that follows a single request through every hop, structured logs rather than free text, and for each call: the prompt version, the model identifier, the retrieved passage identifiers, the token counts, the cost in currency, and the latency. Percentiles rather than averages, because the average is fine while the ninety-ninth percentile is what your users are complaining about. Then a sampled capture of full prompts and responses, because aggregate numbers tell you that quality moved and only the text tells you why. The costs here are specific and worth stating plainly: log volume from a chatty system is a real line on a bill and often exceeds the inference spend; prompts contain whatever the user typed, which means logging them is a data protection decision and not an engineering one, requiring redaction of personal data at the point of capture and a retention period someone has signed off; and every field logged is a field that must be maintained. Log what you would need to answer a complaint or reproduce a bad answer. Logging everything is not thoroughness, it is a liability you pay monthly to store.
A user reports that the assistant gave a wrong figure last Thursday. There is no trace, no record of which passages were retrieved and no record of which prompt version was live that day, because the prompt was edited twice since. Nobody can reproduce it, so nobody can say whether it is fixed. The system is now unfalsifiable, and the honest answer to the complaint is that you do not know.
04
Rollback and versioning
Version pinning for prompt, model identifier and index snapshot; one-action revert; a rehearsed rollback drill
Three things in an AI system change independently and any of the three can break the answers: the prompt, the model behind it, and the index the answers are drawn from. Application code is usually already versioned; these three usually are not. Prompts get edited in place, model identifiers get pinned to a floating alias that quietly moves to a new version underneath you, and indexes get rebuilt over the top of themselves. So all three get a version, every deployment records which combination was live, and reverting is one action rather than an archaeology exercise. The index is the one most often forgotten and the most awkward to undo, because a rebuild that dropped half the corpus cannot be reversed by editing a file — it needs a retained previous snapshot, which is storage you have to pay for and prune. Rehearse the rollback before you need it; a rollback path that has never been executed is a hypothesis.
An overnight re-index runs against a source export that was itself incomplete. The index rebuilds cleanly over the old one, so there is no error and no previous snapshot. By morning the assistant is answering confidently from a corpus missing a third of its documents, saying nothing about the gap, and the only route back is a full re-ingestion that takes nine hours and cannot begin until someone works out which export was wrong.
05
On-call and ownership
A named owner, a rota, a runbook, alert thresholds tied to user-visible symptoms, an escalation path, an agreed service level
A system that nothing and nobody owns decays on a schedule. Ownership means a named person, not a team inbox; a runbook that says what the common failures look like and what to do about each, written so that the person on call at two in the morning who did not build this can act; alert thresholds set on symptoms a user would notice — answers refused, latency past the agreed number, cost per day past the agreed number, retrieval returning nothing — rather than on the metrics that were easy to emit; and an escalation path with a second name on it. The cost is not the tooling, which is minor. The cost is the standing claim on someone's attention, and the fact that an on-call rota needs enough people in it to be humane. This is the single item most often left as an implementation detail at handover, and it is the one that determines whether the system is still trusted in a year.
Retrieval quality drifts as the corpus grows and nobody owns the number, so nothing is watched and nothing fires. The desk that used the assistant quietly goes back to searching the shared drive, because it was wrong twice and no one had anywhere to report that. Six months later a review finds a system nobody has logged into since spring, still running, still costing money, and no longer trusted by anyone who once used it.