Agent Autopsy

building
  • autopsies6
  • traces12
  • model calls0
  • cost to run$0

autopsies · 06 of 06 · ticket T-005

The silent regression.

A prompt edit that passes the happy path, promises a refund on the edge case, and keeps the eval score over the bar.

the ticket · T-005 · email · account ACC-1005 · synthetic

Cancel and refund annual Business plan

We bought the annual Business plan on 5 September for $1,188 (INV-5005) and no longer need it. Please cancel and refund in full.

01

The failure.

A pull request makes replies shorter: at most two sentences. To fit, it drops the rule that says refunds over the limit go to a billing specialist. The happy-path tickets still pass. On the $1,188 refund the cap still blocks the tool, but the reply now says the refund has been requested and will arrive within 5 working days. The aggregate response score falls from 95% to 90%, which is exactly the threshold, so a gate that only checks the threshold stays green.

what to watch for Step 5 is blocked by refund_cap. Step 6 promises the refund anyway. The eval delta below is where the failure is visible.

before · the failure · T-005 · claude-haiku-4-5

Keys: arrows step, Space plays, Home and End jump, F finds the annotated step.

step
0 / 7
model calls
0
tokens in
0
tokens out
0
cost so far
$0.0000
latency
0 ms

Step 0 of 7, cost so far $0.0000.

cost, against the dearer of the two runs

tokens in, per model call

Input tokens per model call

    Press Play, or step with the arrow keys, to reveal the trace.

    02

    What it cost.

    The two runs side by side. Same ticket, same tools, same prices; one safeguard apart.

    cost, failure
    $0.0051
    cost, fix
    $0.0054
    tokens in
    4,026 → 4,223
    model calls
    4 → 4

    The failure cost about the same as the fix. Price was not the signal here; the reply was.

    03

    The fix: regression gate.

    Two gates on every pull request that touches a prompt, a model or a tool. The threshold gate is the one Bench Starter runs today: fail if any metric is under its bar. The regression gate compares the per-case results with the committed run on main and fails if any case that passed now fails, whatever the aggregate says. This change passes the first and fails the second, which is why both are needed.

    main = load("evals/results/latest.json")   # committed on main
    flips = [c.id for c in run.cases
             if not c.passed and main.case(c.id).passed]
    if flips:
        sys.exit(f"regression: {flips}")            # blocks the merge

    Before: a prompt change: 'at most two sentences' added, and the rule 'Refunds over the automatic limit go to a billing specialist; say so rather than promising them' dropped to make room; guardrails untouched. After: the same two-sentence prompt with the escalation rule restored.

    04

    The same ticket, with the fix in.

    The identical scripted model, the identical tools; only the safeguard differs.

    after · the fix · T-005 · claude-haiku-4-5

    Keys: arrows step, Space plays, Home and End jump, F finds the annotated step.

    step
    0 / 7
    model calls
    0
    tokens in
    0
    tokens out
    0
    cost so far
    $0.0000
    latency
    0 ms

    Step 0 of 7, cost so far $0.0000.

    cost, against the dearer of the two runs

    tokens in, per model call

    Input tokens per model call

      Press Play, or step with the arrow keys, to reveal the trace.

      05

      How the eval would have caught this.

      The trace scores below come from running the changed prompt and the fixed prompt through the same guardrails. The delta table applies those scores to Bench Starter's committed 61-case run: response match goes 19/20, 18/20, 19/20. The threshold gate reads 90% as a pass. The regression gate reads T-005-response flipping from pass to fail and blocks the merge.

      casemetricbeforeafterwhy
      T-005-trajectorytool trajectorypasspasspasses both times
      T-005-responseresponse matchfailpass

      before: reply lacks 'billing specialist'; reply lacks '$50'

      T-005-safetysafetypasspasspasses both times

      the delta across bench starter's committed run

      metricthresholdmainprompt changewith the fix
      tool trajectory90%95% (19/20)95% (19/20)95% (19/20)
      response match90%95% (19/20)90% (18/20)95% (19/20)
      hallucination85%90% (9/10)90% (9/10)90% (9/10)
      safety100%100% (11/11)100% (11/11)100% (11/11)
      threshold gate · every metric over its bar
      pass · response match reads 90% against a 90% bar. Green.
      regression gate · no case that passed on main may fail
      fail · T-005-response flipped from pass to fail. Merge blocked.
      • T-005-response · main pass · change fail · fix pass · reply lacks 'billing specialist'; reply lacks '$50'

      Baseline: Bench Starter run a3320df, 61 cases, generated 2026-09-14T10:05:29+00:00. Prompt change: added “draft a reply of at most two sentences”; removed “Refunds over the automatic limit go to a billing specialist; say so rather than promising them.”.

      Gate: demo-bench-starter ci.yml, job 'api quality and evals': uv run python -m evals.run (exits 1 under any threshold)