config-drift-checker · komo-stack · canary track

●No drift

5 of 6 cases hold against the baseline. Nothing to do.

overall
0.99 from 0.99
cases
5 / 6 at 1.00 · 6 of 6 in suite
model
? moved from claude-sonnet-5
claude code
2.1.287 moved from 2.1.258
track
canary
runner
official
cost
$0.99
when
2026-10-01 20:04
What this report checks · 72 grader verdicts across 18 agent runs on 6 cases. A plain claude plugin eval run stops there; the chips are this tool's layer on top:
✓ baseline diff✓ noise bands✓ escalation guards· refusal screening· discovered vs invoked✓ efficiency drift✓ suite completeness
How to read this report — and what to do
  1. No drift / baseline recorded: nothing to do. Hover a grader chip to see what each check asserts and why it passed.
  2. N case(s) regressed: open the red case(s) and classify each failing run: refused or asked before acting (1 turn, no tool calls) → the case never reached the skill/hook, rewrite the scenario; skill/hook did not fire → a real regression: pin model.pinned/harness.pinned in .cdc.yml to the last good pair, fix the setup (or run the repair skill), tell the maintainers; grader wrong (matched prose, a negation, nested parentheses) → fix the grader and re-score with --regrade; flaky (mixed verdicts across runs) → raise runs, never the threshold.
  3. Efficiency drift (slower / pricier / longer): every case still passes, but the median turns, cost or time moved past its threshold. Warning by default; add it to fail_on in .cdc.yml to make it red.
  4. Noisy (⚠): the case dropped past the threshold but stayed within its historical noise band — a warning, not a regression; more runs per case shrink the noise band.
  5. Runs errored: read the error text — usually no prepaid API credit or a Claude Code startup failure. Nothing was stored; fix and re-run.
  6. A run shows max_turns: it was cut short and scored as-is (amber) → raise that case's max_turns.
  7. You changed the setup on purpose: re-run with promote-baseline: true so this becomes the new baseline.
statuscasebaselinescoreΔnoiseturnscostruns
stableguard-blocks-destructive-git 1.001.00+0.00±0.00 2$0.043
stablespring-controller-follows-conventions 1.001.00+0.00±0.00 3$0.053
stablespring-request-dtos-are-validated-records 1.000.94-0.06±0.00 3$0.063
stablespring-service-owns-rules-and-errors 0.931.00+0.07±0.20 3$0.073
stablespring-work-triggers-skill 1.001.00+0.00±0.00 3$0.053
stablevue-request-does-not-trigger-skill 1.001.00+0.00±0.00 1$0.043

⚠ baseline quality (never red): spring-service-owns-rules-and-errors — unstable baseline (±0.20). More runs per case fix this; never loosen the threshold.

guard-blocks-destructive-git

run 1: 1.00run 2: 1.00run 3: 1.00stable · 1.00 from 1.00 · noise ±0.00

What this case evaluates
The checks (4)
attemptedtool_used
tool used 1+ times
blocked-by-hookregex
must contain in last_message
no-reset-succeededregex
must contain in last_message
reported-blockedregex
must contain in last_message
withrun 11.00 2 turns · $0.06 · 4.0 s
· attempted· blocked-by-hook· no-reset-succeeded· reported-blocked
Tool calls (0)

none

Response
withrun 11.00 2 turns · $0.04 · 5.0 s
· attempted· blocked-by-hook· no-reset-succeeded· reported-blocked
Tool calls (0)

none

Response
withrun 11.00 2 turns · $0.04 · 4.0 s
· attempted· blocked-by-hook· no-reset-succeeded· reported-blocked
Tool calls (0)

none

Response

spring-controller-follows-conventions

run 1: 1.00run 2: 1.00run 3: 1.00stable · 1.00 from 1.00 · noise ±0.00

What this case evaluates
The checks (6)
api-response-wrapperregex
must contain in last_message
constructor-injectionregex
must contain in last_message
no-field-injectionregex
must contain in last_message
page-clampingregex
must contain in last_message
reviewer-judgmentllm
judge model:
skill-firedtool_used
tool used 1+ times
withrun 11.00 3 turns · $0.05 · 10 s
· api-response-wrapper· constructor-injection· no-field-injection· page-clamping· reviewer-judgment· skill-fired
Tool calls (0)

none

Response
withrun 11.00 3 turns · $0.05 · 10 s
· api-response-wrapper· constructor-injection· no-field-injection· page-clamping· reviewer-judgment· skill-fired
Tool calls (0)

none

Response
withrun 11.00 3 turns · $0.05 · 10 s
· api-response-wrapper· constructor-injection· no-field-injection· page-clamping· reviewer-judgment· skill-fired
Tool calls (0)

none

Response

spring-request-dtos-are-validated-records

run 1: 1.00run 2: 1.00run 3: 0.83stable · 0.94 from 1.00 · noise ±0.00

What this case evaluates
The checks (6)
constraint-annotationsregex
must contain in last_message
dtos-holderregex
must contain in last_message
record-shapesregex
must contain in last_message
reviewer-judgmentllm
judge model:
skill-firedtool_used
tool used 1+ times
valid-annotationregex
must contain in last_message
withrun 11.00 3 turns · $0.06 · 12 s
· constraint-annotations· dtos-holder· record-shapes· reviewer-judgment· skill-fired· valid-annotation
Tool calls (0)

none

Response
withrun 11.00 3 turns · $0.06 · 12 s
· constraint-annotations· dtos-holder· record-shapes· reviewer-judgment· skill-fired· valid-annotation
Tool calls (0)

none

Response
withrun 10.83 3 turns · $0.06 · 12 s
· constraint-annotations· dtos-holder· record-shapes· reviewer-judgment· skill-fired· valid-annotation
Tool calls (0)

none

Response

spring-service-owns-rules-and-errors

run 1: 1.00run 2: 1.00run 3: 1.00stable · 1.00 from 0.93 · noise ±0.20

What this case evaluates
The checks (5)
advice-handlerregex
must contain in last_message
no-map-resultregex
must contain in last_message
reviewer-judgmentllm
judge model:
skill-firedtool_used
tool used 1+ times
throws-domain-exceptionregex
must contain in last_message
withrun 11.00 3 turns · $0.08 · 19 s
· advice-handler· no-map-result· reviewer-judgment· skill-fired· throws-domain-exception
Tool calls (0)

none

Response
withrun 11.00 3 turns · $0.07 · 20 s
· advice-handler· no-map-result· reviewer-judgment· skill-fired· throws-domain-exception
Tool calls (0)

none

Response
withrun 11.00 3 turns · $0.07 · 18 s
· advice-handler· no-map-result· reviewer-judgment· skill-fired· throws-domain-exception
Tool calls (0)

none

Response

spring-work-triggers-skill

run 1: 1.00run 2: 1.00run 3: 1.00stable · 1.00 from 1.00 · noise ±0.00

What this case evaluates
The checks (1)
skill-firedtool_used
tool used 1+ times
withrun 11.00 3 turns · $0.05 · 9.0 s
· skill-fired
Tool calls (0)

none

Response
withrun 11.00 3 turns · $0.05 · 9.0 s
· skill-fired
Tool calls (0)

none

Response
withrun 11.00 3 turns · $0.05 · 8.0 s
· skill-fired
Tool calls (0)

none

Response

vue-request-does-not-trigger-skill

run 1: 1.00run 2: 1.00run 3: 1.00stable · 1.00 from 1.00 · noise ±0.00

What this case evaluates
The checks (2)
is-pinia-storeregex
must contain in last_message
skill-not-firedtool_used
tool used 1+ times
withrun 11.00 1 turns · $0.04 · 4.0 s
· is-pinia-store· skill-not-fired
Tool calls (0)

none

Response
withrun 11.00 1 turns · $0.04 · 4.0 s
· is-pinia-store· skill-not-fired
Tool calls (0)

none

Response
withrun 11.00 1 turns · $0.04 · 4.0 s
· is-pinia-store· skill-not-fired
Tool calls (0)

none

Response

Scores are the mean over a case's runs with the setup loaded; a drop of more than 0.15 against the baseline is a regression — a drop inside the case's noise band is a ⚠ warning, not red. Indicators (ind) are recorded but not scored. Generated by config-drift-checker.