What you'll learn: how to run a baseline and two strategies through one harness on one golden set, read the capstone's results table, and tell a real difference from noise.
At a glance
Figure 1. The evaluation pipeline
How to read this: the only thing that changes between the three runs is the strategy switches, so any difference in a row comes from them.
- Measure the simplest thing that could work first, or you cannot say what a change bought.
- Change one idea per strategy and name the switches.
- The scoring rule is code, fixed before the run.
- Compare per question, not only in averages.
- On 36 questions a one-question gap is noise; count safety failures separately.
Scenario
Composite scenario, not a real company. Lumen Industrial Supply wants its product-discovery assistant live for public customers and has three candidate setups: keyword search over every document, the same with partner-only content filtered out in the query, and a third that also drops superseded datasheets and flags contradictions. The head of sales engineering asks which to ship and why. All figures come from the previous lesson's golden set and a mock provider.
What you will be able to do
- Read each column of the results table.
- Explain which questions a strategy moved.
- Judge a gap on 36 questions with a Wilson interval.
- Show a result is reproducible, and name the column that is not.
Prerequisites
Build a golden set, Evaluating retrieval and answers; failure modes and AI Architect: Evaluation, which explains the intervals used here.
Core ideas
One scoring rule, three switches
Figure 2. The three strategies
| Strategy | Metadata filter in the query | Context budget | Superseded excluded, conflicts flagged |
|---|---|---|---|
| baseline | no | no | no |
| A | yes | yes | no |
| B | yes | yes | yes |
How to read this: each row adds to the one above, so a difference belongs to the switch that changed.
Production runs B.
Verified: capstone/fde-product-discovery-copilot/app/discovery.py
BASELINE = Strategy("baseline", metadata_filter=False, context_budget=False, conflict_handling=False)
STRATEGY_A = Strategy("A", metadata_filter=True, context_budget=True, conflict_handling=False)
STRATEGY_B = Strategy("B", metadata_filter=True, context_budget=True, conflict_handling=True)
STRATEGIES = {s.name: s for s in (BASELINE, STRATEGY_A, STRATEGY_B)}
Predict first. Which of these columns would you expect to differ between strategies: document recall, access leaks, stale citations, groundedness?
Answer
Access leaks and stale citations differ, because the switches remove partner-only and superseded documents. Document recall does not, because they never re-rank the rest. Groundedness does not either, for a reason below.
The real results
Figure 3. Results on 36 golden questions, mock provider (from eval/results/latest.md)
| Strategy | Doc recall@3 | SKU recall@3 | Groundedness | Refusal accuracy | Clarify accuracy | Access leaks | Stale citations | Conflicts flagged |
|---|---|---|---|---|---|---|---|---|
| baseline | 94.2% | 95.7% | 100.0% | 94.4% | 100.0% | 5 | 2 | 0.0% |
| A | 94.2% | 97.8% | 100.0% | 97.2% | 100.0% | 0 | 2 | 0.0% |
| B | 94.2% | 97.8% | 100.0% | 97.2% | 100.0% | 0 | 0 | 100.0% |
How to read this: read down a column to see what a switch bought.
Latency and tokens are in the next lesson. The per-question rows show what each strategy moved:
- Baseline to A: q08, q10, q12, q33 and q34 stop exposing partner-only content (5 leaks to 0). q33, a partner price question, becomes a refusal. q34's SKU recall rises from 50% to 100%.
- A to B: q13 and q22 stop citing the superseded datasheet. q20 and q21, the conflict questions, now carry a "documents disagree" question.
Doc recall@3 is the share of expected documents among the first three distinct documents in the model's context (eval/metrics.py).