Sigma Logic AI Lead with AI. Thrive with Innovation.
Evaluation

Your provider changed the model - what broke

A post-mortem pattern: the AI system that degraded without a deploy. Why model updates break working systems, how to detect it, and what to pin.

On this page 11 sections
  1. Key takeaways
  2. Who this applies to
  3. What actually changes
  4. The pattern, as it usually presents
  5. Why standard monitoring misses it
  6. What to actually do
  7. What this looks like from the buying side
  8. What we changed after seeing this pattern
  9. When to not worry about this
  10. Frequently asked questions
  11. Next step

When a provider updates a model, working systems change behaviour without any deploy on your side. The failures are usually not dramatic: output formatting drifts, refusal behaviour shifts, tone changes, and structured output that always parsed starts failing occasionally. Without a scheduled evaluation set, you find out from customers.

This is the most common cause of “it used to work” in production AI, and it is the one that ordinary software monitoring is worst at catching.

Key takeaways

  • Your dependency changed and your version control shows nothing. That is the whole problem.
  • Structured output and refusal behaviour are the two most fragile things across versions.
  • Pinning a model version buys you time, not safety - pinned versions get deprecated.
  • The detection mechanism is a scheduled evaluation run, not an alert on errors.
  • Budget for at least one forced migration a year.

Who this applies to

Anyone running a production system against a hosted model API. Applies whether you built it or bought it, though if you bought it you have fewer levers and should read the vendor questions at the end.

What actually changes

Providers ship improvements. The improvements are usually real. They are also changes to a component you depend on, and they arrive without a pull request.

Formatting drift. The most common and most disruptive. A model that reliably returned bare JSON starts wrapping it in a code fence, or adds a sentence of preamble. If your parser was tolerant, nothing happens. If it was strict, a percentage of requests start failing, and because it is a percentage rather than all of them, it looks like an intermittent bug rather than a change.

Refusal behaviour shifts. Safety tuning moves between versions. A model that answered a category of question starts declining it, or the reverse. For a support agent handling anything medical, financial or account-security related, this shows up as a sudden change in escalation rate with no code change.

Verbosity and tone. Newer versions often produce longer, more hedged answers. Harmless in a chat UI, and a real problem when the output feeds a fixed-width field, a downstream parser, or a channel with a character limit. It also raises your token bill.

Instruction-following changes. A prompt tuned against one version encodes workarounds for that version’s quirks. When the quirks are fixed, the workaround becomes the bug. Elaborate prompts are more fragile here than simple ones.

Tokenisation and context handling. Occasionally the same input yields different truncation behaviour, which changes what the model actually saw.

Five ways a provider version update reaches your system Formatting drift, where a code fence appears and a strict parser fails. Refusal behaviour, where a category starts being declined, or stops. Verbosity and tone, where longer answers overflow a fixed-width field. Instruction following, where the quirk your prompt worked around is fixed and the workaround becomes the bug. Tokenisation, where different truncation means a different input was seen. The improvements are usually real and they arrive without a pull request. Formatting drift is the most common and it fails a percentage of requests rather than all of them, which looks like an intermittent bug rather than a change. Five ways a version update reaches you Formatting drift a code fence appears, a strict parser fails Refusal behaviour a category starts being declined, or stops Verbosity and tone longer answers overflow a fixed-width field Instruction following the quirk is fixed, the workaround breaks Tokenisation truncation moves, so the input differs The improvements are real. They arrive without a pull request. Formatting drift is the most common, and it fails some requests. A percentage failing looks like an intermittent bug rather than a change.
Elaborate prompts are more fragile here than simple ones. Every one of these passes an uptime check, which is why the detection gap exists.

The pattern, as it usually presents

It rarely arrives as an outage. The sequence is almost always:

  1. Nothing is deployed. Everything is green. Error rates are normal.
  2. A support lead mentions the agent “feels off” this week. No one can point at a case.
  3. Escalation rate is up four points. Attributed to seasonality.
  4. Two weeks later, someone finds a batch of malformed outputs in a downstream system.
  5. Investigation finds the provider shipped a version update on the Tuesday of week one.

The two-week gap is the cost, and it is almost entirely a detection problem. Every conventional signal - uptime, error rate, latency - looked fine, because the system was working correctly. It was just doing something slightly different.

The two-week gap between a version change and its discovery On the Tuesday of week one the provider ships a version update. Nothing is deployed, and uptime, error rate and latency all look normal. A support lead says the agent feels off but has no case to point at. By week two escalations are up four points and it is attributed to seasonality. In week three malformed outputs are found in a downstream system. The gap is the cost and it is entirely a detection problem, because the system was working correctly; it was just doing something slightly different. Two weeks, and every conventional signal green Week 1, Tue The provider ships a version update Week 1 Nothing deployed. Uptime, errors, latency all normal Week 1 A support lead says it feels off. No case to show Week 2 Escalations up four points. Blamed on seasonality Week 3 Malformed outputs found in a downstream system The gap is the cost, and it is entirely a detection problem. The system worked correctly. It did something slightly different.
Uptime, error rate and latency are all measuring whether it responded. None of them measure what it said.

Why standard monitoring misses it

Application monitoring is built to detect failure. This is not failure. Requests return 200. Latency is normal. Nothing throws.

What changed is the content of successful responses, and the only way to monitor content is to compare it against known-correct outcomes. That is an evaluation set, run on a schedule, treated as monitoring rather than as a testing activity.

You push a commit CI runs Provider shipsa new version no event fires on your side Scheduled runmonthly, on a timer Evaluation suite scores the held-out set
Two of the three things that change your system's behaviour fire an event you can hook. The provider's release is the one that does not, which is why a schedule rather than a trigger is the only thing that catches it. Uptime, error rate and latency all stay green throughout: the requests succeed, they just return something different.

This is the argument for evaluation that lands with engineering teams when the quality argument does not: it is the only observability you have on the behaviour of a dependency you do not control.

What to actually do

Pin the version where you can

Most providers offer dated or pinned model identifiers alongside a floating alias. Use the pinned one in production. A floating alias means you have agreed to accept behaviour changes silently, which is a strange thing to agree to for a production dependency.

Pinning is not permanent safety. Pinned versions get deprecated on a published schedule, typically with months of notice, and then you must move. What pinning buys is the ability to choose when you migrate rather than discovering that you have.

Run evaluation on a schedule, not just on deploy

Running the test set in CI catches your changes. It does not catch theirs, because nothing triggers it. A monthly scheduled run - and weekly for anything high-stakes - is what closes that gap. Alert on the score moving beyond the known run-to-run variance band.

If you do not have a test set yet, building one from real tickets takes a few days and this is one of several reasons to do it.

Make parsing tolerant, then validate strictly

Two layers. Parse permissively - strip code fences, tolerate preamble, find the JSON object within a larger string. Then validate the parsed result strictly against a schema and fail loudly if it does not conform.

Permissive parsing absorbs cosmetic drift. Strict validation ensures that a genuine semantic change is caught rather than silently accepted.

Log the model version with every request

Cheap, and it turns a forensic investigation into a database query. When quality moves, you want to answer “what version served these responses” in a minute rather than a day. Include it in your evaluation reports too, so every score is attributable to a specific version.

Keep a migration runbook

When you must move versions, the sequence should be written down rather than improvised:

  1. Run the full evaluation set against the new version, offline
  2. Compare per-segment, not just overall - migrations often improve the average and degrade one category
  3. Fix the prompt regressions against the development set
  4. Shadow-run in production if you can: serve the old version, log the new one
  5. Roll out behind a flag, monitor, keep the ability to revert

Budget a week for a significant migration on a mid-sized system, and expect at least one forced migration a year.

Five controls against provider version change Pin the version, which buys you the choice of when to migrate. Evaluate on a schedule, because continuous integration catches your changes and not theirs. Parse loosely and validate strictly, which absorbs cosmetic drift and catches semantic change. Log the model version with every request, which turns a forensic investigation into a database query. Keep a migration runbook, so a week of work is written down rather than improvised. Pinning is not permanent safety, because pinned versions get deprecated; what it buys is choosing when you move rather than discovering that you did. Expect at least one forced migration a year. Five controls, and what each one buys Pin the version you choose when you migrate Evaluate on a schedule CI catches yours, not theirs Parse loosely, validate strictly absorb cosmetic, catch semantic Log the version per request a query instead of a forensic Keep a migration runbook a week, written down, not improvised Pinning is not permanent safety. Pinned versions get deprecated. It buys you the choice of when to move, rather than discovering it. Expect one forced migration a year, and budget a week for a real one.
Only the second control closes the detection gap. The others limit the damage once it is found.

What this looks like from the buying side

If you bought a platform product rather than building, you have less control and it matters more that you ask.

Four questions worth putting to a vendor:

  1. Do you pin model versions, and how do you decide when to move?
  2. How do you detect quality regressions after a provider update? “We monitor closely” is not an answer. “We run a regression suite weekly” is.
  3. Will you notify us before a model migration affecting our workflows?
  4. Can we run our own evaluation against your system? If the answer is no, you have no independent check on quality, and you should factor that in.

A vendor with good answers here has been through it. A vendor who has not considered it will discover the problem on your traffic.

What we changed after seeing this pattern

We now treat scheduled evaluation as part of the maintenance retainer rather than as an optional add-on, and version logging is in the default build rather than something added when it is needed.

The reasoning is that the failure mode is structurally invisible. Every other class of production problem announces itself - something errors, something slows, something stops. This one produces a system that is working, responding, and quietly worse, and the only mechanism that surfaces it is a comparison against known-correct answers on a timer.

It also changed how we write prompts. Prompts that lean on a specific model’s quirks perform better today and break harder later. Simpler prompts with the complexity moved into retrieval and validation survive migrations with less rework, and we take that trade even when it costs a point or two of benchmark performance.

When to not worry about this

Low-stakes internal tools where a human reads every output and would notice. The evaluation apparatus costs more than the failure.

Fully deterministic pipelines that use a model only for a step you already validate programmatically. Your existing validation catches it.

Very short-lived systems. A campaign tool running for six weeks will probably not see a migration. Note the “probably”.

Frequently asked questions

How often do providers actually change models?

Frequently enough to plan for. Major providers ship new versions several times a year and deprecate older ones on published schedules. Treat at least one forced migration a year as a planning assumption.

Does pinning cost more?

Not usually in price. It costs a little in capability, because you are not getting improvements automatically, and it costs a scheduled migration when the pin expires. Both are worth it for production.

Can we self-host to avoid this entirely?

You remove the involuntary changes and take on the infrastructure, the engineering time, and the responsibility for security updates. It is a real option at high steady volume and an expensive one below that. You also still have to manage your own upgrades.

How big a score drop should trigger action?

Anything beyond your measured run-to-run variance. If repeated runs vary by three points, treat a five-point drop as real. Establish that band before you need it.

Should we test on the new version before it is default?

Yes, when providers make preview versions available. Running your evaluation set against a preview is cheap and turns a forced migration into a planned one.

Next step

If your system has no scheduled evaluation, that is the gap this article is about. The AI evaluation and QA engagement builds the set, the harness and the schedule, so a provider change fails a test instead of reaching a customer.

Related: How to measure whether an AI system works · Building an eval set from real tickets · Hallucination rate: what number is acceptable · Maintenance and support

Let's talk

Got a workflow this applies to?

Describe it in a couple of sentences. We will tell you whether it is worth automating, what we would build, and roughly what it takes.