A retrieval eval looks like one activity but bills like three. Separating them is what makes the budget tractable, because one bucket costs people, one costs hardware, and only one costs a paid model.
The three buckets are:
- Golden query creation: human time, or model time if you draft queries with a generator and then edit them.
- Offline deterministic checks: free at the marginal level. They run on your own CPU or GPU as part of your test suite and produce a number per query.
- Judge calls: every call sends a prompt and a chunk of retrieved context to a paid model and bills for input and output tokens.
The work of pulling these apart is itself a reliability practice, not just an accounting one. Contract testing treats the interface as a machine-checked artifact that every commit must prove still conforms, which is exactly the discipline an eval suite needs to catch drift between the retrieval contract and what the system actually does contract testing reference. The same logic applies to a retrieval eval: fix the expected shape of the answer, then prove it on every change.
A useful decision rule: if a check can be expressed as "did document X appear in the top k" or "is the answer string equal to Y", it belongs in bucket two and should never cost a token. Reserve bucket three for the judgments a string comparison genuinely cannot make, such as whether a generated answer stays faithful to the retrieved context.
The documentation for the standard consumer tests in Pact makes a related point that transfers directly here: write each test to catch a specific misunderstanding, and if you cannot name the bug a scenario would catch, do not write it Pact consumer tests. A golden query that cannot fail has no business in the suite.



