advanced 4 min answer

Anthropic's postmortem of 17 September 2025 describes a change deployed on 25 August to improve token selection which triggered a latent bug in the XLA:TPU compiler - an approximate top-k operation that sometimes dropped the highest-probability token, but only for certain batch sizes and model configurations, with a December 2024 workaround having masked it. It was confirmed on one model, judged likely on two others, could not be reproduced on one of those, and was rolled back between 4 and 12 September before exact top-k was rolled out. What class of failure is this, and what would have detected it?

anthropicapproximate operatorssilent regressionevaluationserving stack
Show the full answer Hide the answer

The trigger

A performance optimisation in the serving stack - not the model, not the prompt, not the data. The change itself was reasonable; it activated a compiler defect in an approximate operator whose error behaviour depends on shapes the application does not control.

Why it propagated the way it did

Three properties make this class of failure distinctive:

  • The defect was configuration-dependent. It appeared only at certain batch sizes and model configurations. Batch size is set by concurrent traffic, so from the application's point of view the defect was non-deterministic and load-correlated - present under some traffic patterns and absent under others, on identical inputs.
  • An earlier workaround had been masking it. A mitigation from December 2024 kept the latent bug invisible, so the system had no history of the symptom and no reason to suspect the operator.
  • It affected models unevenly and was not reproducible on one of them. That is the worst possible evidentiary position: reports exist, reproduction fails, and the natural conclusion is that the reports are noise.

Why detection lagged

The output was wrong without being invalid. Dropping the highest-probability token yields a fluent response that is slightly worse, and a model recovers from isolated bad tokens, so the damage shows up as a small quality decrement spread across many responses rather than as an error. There is no exception to count, no status code to alert on and no schema to violate.

Anthropic's own account of the detection failure is the generalisable part: existing evaluations did not capture the degradation, the team relied too heavily on noisy evaluations, and separating early user reports from normal feedback variation was hard.

The structural fix versus the tempting local fix

The tempting fix is to roll back and add a regression test for this bug. That closes one instance.

The structural fixes:

  1. Treat every approximate operator as a correctness risk with a configuration space. Approximate top-k, approximate nearest neighbour, quantised kernels and fused attention implementations all trade exactness for speed. For each, assert equivalence against the exact implementation across the shapes actually used in production - batch sizes, sequence lengths, model variants - not just the default shape in a unit test. The bug here was invisible at some batch sizes and present at others.
  2. Run continuous quality evaluation against production traffic, not only in pre-deployment testing. Anthropic's stated remediation was exactly this - more sensitive evaluations plus continuous quality checks on live systems - because the failure signature is a distribution shift in quality, which only a comparison against a fixed reference set reveals.
  3. Keep an exactness canary. A small, fixed set of prompts with deterministic sampling, run continuously on every serving configuration, with token-level comparison against a recorded reference. This is cheap and it catches the entire class.
  4. Instrument the serving stack as part of model quality. Compiler version, kernel selection, batch size distribution and operator flags belong in the same change log as model and prompt versions, because any of them can change output.

The general lesson

The inference stack is part of the model. Organisations separate "model quality" from "infrastructure" and then discover that a compiler flag changed the product. The practical consequence is that a serving-stack change needs the same evaluation gate as a prompt change, and that any operator whose name contains "approximate", "fast" or "fused" is a place where correctness is a configuration rather than a property.

Common weak answers

  • "Add a regression test for this bug." Closes one instance of a class that will recur at a different shape, because the next approximate operator has its own configuration space.
  • "The users were imagining it." The most expensive wrong answer here: reports existed, reproduction failed at the developer's batch size, and dismissing them cost weeks.
  • "Monitor error rates more closely." There were no errors. Prefer a fixed reference set scored continuously over any failure-counting signal, because the failure mode is a distribution shift in quality rather than a failure.
  • "Roll back the compiler and stop optimising." Approximate operators are the difference between 1 accelerator and 4; the discipline is the exactness check, not abstinence - and that trade is worth stating explicitly rather than retreating from.

When this is the wrong problem to own

If you consume a hosted model API, the operators are not yours to fix. The detection problem still is, because a provider-side regression reaches your users first, and a fixed reference set of 30 to 60 prompts scored continuously is the control that works from the outside too. It is also the wrong frame where the output is cheaply verifiable by construction - a parse, a checksum, a constraint solver's answer - because there wrongness is detectable downstream and needs no canary.