Eval-Driven Release Gates That Actually Gate
Ask a team when their eval suite last blocked a release, and you usually get a long pause, then an example from eight months ago. That gap is the whole problem: a gate that never closes isn't a gate, it's a report.
Most teams we work with already have an "eval suite" gating their model and agent releases. Ask to see the last time it actually blocked a release, though, and the answer is usually a long pause, followed by an example from eight or nine months back, followed by a quieter admission that the suite has run green on every release since — not because the system stopped regressing, but because the suite stopped being hard enough to catch it when it does. That gap between "we have a gate" and "the gate has closed recently" is the whole problem, and it's worth being blunt about it: a gate that never closes isn't a gate. It's a report that runs before deploy instead of after.
This isn't fraud. Nobody sits down and builds an eval suite intending it to become theater. It degrades into theater through a sequence of individually reasonable decisions, each one made under time pressure by someone who isn't wrong about their immediate tradeoff.
How a real gate turns into theater
The decay follows a pattern we've now seen closely enough to name each step. The engineer who owns the code also owns the eval that tests it, so when a release fails an eval, the fastest path forward is often to adjust the eval's expected output rather than fix the regression — especially two hours before a deadline, and especially when the eval's own correctness is arguable. The easy cases get solved first and stay in the suite, because models improve fastest on exactly the inputs that were easy enough to write clean assertions for; the suite keeps passing while quietly measuring less and less of what actually varies in production. Thresholds get lowered during an incident — "just for this release, we'll ship at 91% instead of 95%, we're under a deadline" — and the lowered threshold becomes the new normal because nobody owns the job of raising it back. And the suite tests the model in isolation, not the full agent harness — prompt template, tool schema, retry logic, context assembly — so a behavior change introduced anywhere in that surrounding system ships untested even while the model-level evals stay green. Put those four together and you get a suite that runs, reports, and never says no, which is functionally identical to not having one, except it costs CI minutes and gives everyone false confidence.
What a gate that actually blocks looks like
The fix isn't more evals. It's changing who can override a failing one, and what counts as a failing case in the first place.
Separate the power to waive a failure from the authority to write the code being tested. If the same person who shipped the regression can also mark the eval that caught it as "known issue, shipping anyway," the gate has no teeth, regardless of how sophisticated the eval itself is. This is an org-design fix, not a tooling fix, and it's the one teams resist hardest because it adds a real approval step to the release process.
Every production incident becomes a permanent regression case, added to the suite before the postmortem closes, never removed. A gate that can forget an incident will eventually reproduce it. This single practice does more to keep a suite adversarial over time than any amount of upfront eval design, because it means the suite's difficulty tracks the system's actual failure history rather than someone's guess at what might go wrong.
Track how often the gate actually blocks a release, as a first-class metric — and treat zero as a warning, not a compliment. A team that hasn't had a release blocked in a full quarter either has a genuinely excellent system or, far more likely, a gate that's stopped being able to say no. We ask for this number explicitly in every eval review, because it's the fastest signal for whether a suite has quietly become decorative.
Gate the deploy pipeline programmatically, not the dashboard. If a human has to notice a red number and manually stop a release, the gate is advisory. A real gate fails the build.
The tradeoff teams actually have to accept
A suite with real teeth will occasionally block a release for the wrong reason — a flaky adversarial case, a genuinely ambiguous eval, a false positive that costs someone an afternoon. That cost is not a design flaw to be engineered away; it's the price of a gate that's also capable of catching the true positive next to it. Teams that try to eliminate false positives entirely almost always end up eliminating the gate's sensitivity along with them. The org has to decide, explicitly, that occasional friction is cheaper than a regression reaching production — and then resource someone to own eval curation as an ongoing job, not a one-time build that ships with v1 and never gets touched again.

