Through sixteen parts we judged the agent by eyeball, which only checks the answer. An agent can reach the right answer through a wrong, wasteful, or unsafe path. The fix is to grade a run three ways and gate it in CI. Toggle the run, the narration, and the token envelope below; every number is reproduced verbatim from the verified offline run.
We grade the SAME wrong-path run. A rubric LLM judge scores its narration; the programmatic guard scores its path. Flip the narration and watch only the judge swing.
Replay the four-case suite. Each case asserts outcome AND tool-call correctness AND the operating envelope. Drag the token budget down from 400 to 200 and the good-path case flips RED on cost, even though its path is perfect.
| case (task) | steps | cost | verdict |
|---|
STATE + POLICY, not the text saying done. Trajectory catches the right-answer-wrong-path run. The security case (the Part 16 poisoned ticket) is just another row, asserting no unauthorized refund and no exfiltration. A security guarantee you do not test is one you do not have.
agent_eval.py (no API key, no network). Good path: precision=1.0 recall=1.0 edit=0 steps=3/3. Wrong path: precision=0.75 recall=1.0 edit=2 steps=5/3. Judge 0.6 -> 0.9; guard FAIL throughout. Gate at ≤400: 3/4 green, cost-per-success $0.00320; tightened to ≤200: 2/4 green, $0.00480. The deterministic judge is the offline stand-in for a hosted rubric judge; only the generate() swap would need edits. Multi-turn and long-horizon trajectory eval is the reader's extension.