For a month, every pull request showed the same line:
promptfoo: 312/312 checks passed, passRate=100.0%
That looked strong until the support queue was sampled. Out of 200 recent production queries, 79 failed the same task-success rubric. Customers wrote “refund last invoice but keep seats active”, “pause renewal for EMEA only”, or “why did ACH retry twice”; the golden suite mostly contained the tidy development prompts engineers had been using in demos. Same intents, different language, very different result.
The duplicate path was concrete. prompts/dev_bank/billing.yaml had been copied into evals/golden/billing.jsonl during the first evaluation push. Then the routing prompt was tuned in small commits until all 312 examples passed. Nobody meant to train on the test. The harness just gave the team a comfortable number because the release gate was pointed at examples that had already shaped the system.
The replacement kept that set, but renamed it honestly: regression coverage. A second split came from anonymized production traffic sampled after the prompt work, with fixture metadata recording source=prod_sample, sampled_at, and the owning intent. That split was the one GitHub Actions used for release blocking. The next green build meant the model survived new wording, not just yesterday’s rehearsal.