Shape tells you the answer is well-formed. Content tells you whether it is right. Content assertions come in three flavors, and most suites need all three.
Key facts. Extract named entities, IDs, dates and totals from the response and assert they match values you know are correct for that input. If a support bot is asked about an order, the order number and ship date it cites must match the fixture, not whatever number looks plausible.
Exact strings. Where the contract is rigid (error codes, enum labels, template headers), assert equality. Do not use substring checks here. "REFUND" in text passes on "REFUND_DENIED", which is the exact regression you were worried about.
Refusal behavior. When an input is out of policy scope, the correct output is a refusal, not a guess. Assert that refusals happen when they should and, just as important, that they do not happen when the question is legitimate. A model that refuses everything passes a naive "no disallowed content" test while being useless.
Calibrating these thresholds is where a golden set earns its keep. The pattern is well described in the LLM-as-judge literature: golden datasets are starting points, not finish lines, and the operational question shifts from "is my judge accurate" to "is it still accurate, and how would I know if it were not" (Galileo). For deterministic content assertions, the same discipline applies in cheaper form.
A worked example. Take 30 inputs with known correct outputs, chosen to cover the top user journeys plus a few edge cases you have actually seen break. Record, for each, the exact facts that must appear. Run the suite and count.
| Input type | Count | Before prompt change | After prompt change | Interpretation |
|---|
| Standard order lookup | 18 | 18 pass | 18 pass | No regression |
| Refund eligibility | 6 | 6 pass | 5 pass | One boundary flipped |
| Refusal cases | 4 | 4 pass | 4 pass | Policy intact |
| Malformed input handling | 2 | 2 pass | 2 pass | Errors still graceful |
| Total | 30 | 30 | 29 | Block the change |
A single failure out of 30 is a signal, not noise, when the expected output is deterministic and the schema is valid. Your gate should fail on any content failure in a golden case and review the diff. When rather than whether: if you were asserting on an LLM judge's score rather than exact facts, you would need statistical thresholds. One study reports that 44.7 percent of score variance across 29 questions and two judges was pure within-question noise from stochastic generation, with a margin of error around 1.2 points, larger than typical score gaps of 0.19 to 0.36 points between competing responses (Galileo). That is the argument for deterministic fact assertions wherever you can get them.
Two more calibration notes. First, differences between competing outputs are often tiny, so a fuzzy score threshold has to be set well above the noise floor or it will flap. Second, calibration is continuous: provider-side model updates can shift scoring distributions without warning, and one reported example showed an older model version update that caused a 9.6 percent accuracy drop for one prompt but a 5.1 percent increase for another on the same task (Galileo). If your host can change the backing model under you, pin what you can and re-run the golden set on a schedule.
Summarization and open-ended answers often lack a single correct string. That is when you escalate to an LLM judge, and the judge itself needs alignment to human corrections rather than prompt guessing: collect human corrections, build few-shot examples from them, and track agreement between judge and humans over time (LangChain). Strong judges reach roughly 80 percent agreement with human evaluators, about the level humans reach with each other (LangChain). Useful for triage, not for a binary gate on high-stakes output. For those, keep a human-reviewed golden set.
If you need to run the same golden set against several model families while comparing results, routing them through one API simplifies the harness. Quanta Inference exposes text, image, video, audio and embedding models behind one OpenAI-compatible key, which lets the same assertion code attack every candidate model (Quanta Inference).