tootsies

a discord bot for the tootsies server. ask, recap, discuss, ship features by typing.


Project maintained by mejasonmejason Hosted on GitHub Pages — Theme by mattgraham

Evals: the per-eval catalog

CLAUDE.md’s Evals section carries the binding rules (two tiers, the GOLDEN mandate, gating-vs-trend); this file is the full catalog – what each eval grades, its judges, its golden, and the history that shaped it. Add an eval -> add its entry here (and its golden) in the same PR.

Two tiers, deliberately separate (see COVERAGE.md for the rule-by-rule matrix and gaps):

ANTHROPIC_API_KEY=... python scripts/run_evals.py            # whole suite
python scripts/run_evals.py --filter constitution --out r.md # one eval + report file
python scripts/eval_ask_premise.py                           # a single eval standalone

A judge-model upgrade can leak a golden, and two different defects cause it (#3131). The scheduled suite went red for eight days after #3029 moved the judges from claude-sonnet-4-6 to claude-sonnet-5. Two goldens stopped failing. The judges did not get weaker. Each leak had its own cause, and the two causes need opposite fixes.

Fix the fixture before you touch the rubric. A sharpened rubric was measured first and rejected. It did catch the golden, but it also flipped two healthy shipped posts from pass to fail. That moves the bar the surface is graded on, which a golden repair must never do. The live pass rate held at 3/4 across the fix, which is the check that proves the bar did not move. So: measure a candidate fix against the goldens AND the real posts before shipping it. A golden must also fail RELIABLY. One candidate leaked once in five runs and was dropped for one that failed five times out of five.

Every eval carries a GOLDEN fixture — a known-bad input that MUST come back failing. A judge is itself a model and drifts; a golden that stops failing is declared toothless and counts as a regression (harness.exit_code). When you add an eval, add a golden. The harness’s deterministic core (parse_judge_json, exit-code/regression logic) is unit-tested in tests/test_evals_harness.py; the eval wiring is guarded no-API by tests/test_eval_wiring.py.

Gating vs trend (EvalResult.trend_only). The job (run_evals exit code) goes red only on a gating regression: a leaked golden, a deterministic classifier-accuracy gate breaching its floor (classify_*, preflight_order, chimein_score, discourse_score), or a crash. The model-judge-on-generated-text behavioral evals (constitution, memory_fence, ask_premise, ask_tools, music_post, discourse_post, chimein_post, icebreaker, recap) are marked trend_only=True: their GOLDENS still hard-gate (the judge must keep its teeth), but a single nondeterministic live-case FAIL is reported (tagged [trend-fail], surfaced in the overall line as a “trend finding”) for evals.yml’s judge to file on by trend — it does not red the job. This matches the suite’s “NOT a CI gate, judged by trend, a single live-case FAIL can be noise” contract: the job’s red/green tracks the trustworthy signals, while behavioral fabrication/voice drift still reaches the judge. parse_judge_json also recovers a clean verdict when the judge wraps its explanation in stray unescaped quotes, so a valid pass isn’t scored as a spurious FAIL.