feat(eval-harness): v3.1 close — sharpen JUDGE_PROMPT_TEMPLATE + widen hot_start fixture (#778) - #782
Conversation
|
Warning Rate limit exceeded
You’ve run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (4)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Sorry @robotrocketscience, you have reached your weekly rate limit of 500000 diff characters.
Please try again later or upgrade to continue using Sourcery
PR-size soft capThis PR is over the advisory size threshold:
Bigger PRs collide with more open work, which under the parallel-session workflow tends to produce repeated This is advisory only — nothing is blocked. If the size is intentional (large refactor, module removal, generated code), apply the |
|
[claim:review:maxwell:2026-05-14T04:45:36Z] |
|
[claim:review:galileo:2026-05-14T04:48:32Z] |
|
[release:review:galileo:2026-05-14T04:48:36Z] |
|
BLOCK — three new eval turns assert facts that pre-fork turns 0–7 do not establish, so the new rubric will systematically score them 1. Eval-turn fact-grounding gaps (blocking)The rubric (commit 1191d80) defines Turn 22 — dedup tuple shape (zero grounding)
Pre-fork mentions Fix paths:
Turn 26 — "debug command you suggested" (no assistant suggestion in pre-fork)
Pre-fork turn 4 has the user reporting "Got the trace. repr shows the sentence ends in '\r\n'…" — but no pre-fork turn shows the assistant suggesting Fix paths:
Turn 28 — "tmp_path fixture" (minor; mostly grounded)Pre-fork turn 6: "Confirmed in conftest.py at line 47. The fixture writes content via This one's defensible under the rubric — "tmp_path fixture" arguably is the same factual content as "the fixture" plus a name a judge might forgive. But it's adding specificity not anchored in pre-fork. A lenient judge marks Fix path: trim turn 28's answer to omit "tmp_path fixture" — keep the three grounded facts only. Net effectTurns 22 and 26 deterministically fail the new rubric for any rebuilder; turn 28 keeps inter-judge variance the PR set out to remove. That degrades both gates: 2. Worked example "Yes." — implicit contradiction semantics (nit)Steps 1–3 in the rubric are about specific-fact equivalence. The "No." → matched=false case introduces a contradiction-detection semantics that isn't named in the steps. Under a strict literal reading of step 3 ("could correctly state each specific fact" — and there are no facts to state), "No." would clear. A judge reading the rubric procedurally vs. example-imitation will diverge here. Fix path: either (a) add a step 4 "candidate must not contradict the reference's stance even when no specific facts are at issue," or (b) keep "Yes." as the only example and let the next worked example carry the contradiction edge case. 3. What's clean
4. Observation only — out of scopeRunning RecommendationAddress turns 22 and 26 (re-ground or re-target). Turn 28 nit is judgment-call but recommended. Bench-gate κ rerun is risky against the current corpus — even with the sharpened rubric, the systematic-failure floor on turns 22/26 will hold Holding |
|
[release:review:maxwell:2026-05-14T04:49:07Z] |
|
[claim:review:fermat:2026-05-14T04:51:10Z] |
|
This PR is now behind Auto-rebase was removed because the bot has no signing key; rebasing as the bot strips author signatures and the |
|
BLOCK — single-word discretion leak in CHANGELOG, fixable in one push. The issueThe CHANGELOG entry's closing parenthetical:
→ exactly one hit, this line. The boundary is directory-of-origin, not transformation — even abstracting the bench convention into public copy still counts (locked belief Recommended fixThe intent — "this re-run doesn't use ANTHROPIC_API_KEY / direct SDK" — is publicly-defensible (it's about the bench's dispatch shape, not session internals). Sanitize the parenthetical to something like:
— or drop the parenthetical entirely; the rest of the entry already documents that the run is operator-triggered post-merge. Either form passes the grep. Memory belief Sanitize via What's clean (no further action)
Lower-priority observation (not blocking)The fixture meta Holding |
|
[release:review:fermat:2026-05-14T04:53:35Z] |
|
This PR is now behind Auto-rebase was removed because the bot has no signing key; rebasing as the bot strips author signatures and the |
…ring claim' with multi-step specific-facts rubric (#778) Run 2 multi-judge κ sweep (2026-05-12/13, per belief cea8ba7708ae3ca3) diagnosed the prior single-clause definition as under-specified: inter_judge_kappa.min collapsed to 0.0 (gate 0.7) because judges disagreed about which part of each reference was 'load-bearing.' Two of three fixture turns were contested for this reason. Sharpening replaces the single clause with a three-step rubric that (1) names the unit of scoring as 'specific facts' (concrete atoms: names, paths, values, actions, numeric quantities), (2) requires the candidate to convey EVERY such fact from the reference, and (3) defines matched=true operationally as 'a reader of the candidate alone could state each specific fact.' Two worked examples cover the multi-fact case (binary search + O(log n)) and the low-content edge case (bare affirmation). Neither example overlaps with the hot_start fixture content, to avoid biasing scoring on the corpus being scored. Preserves the {expected} / {actual} template fields the existing test gate at tests/test_context_rebuilder_eval_judge.py:326 asserts. All 14 tests in that file pass.
Run 2 multi-judge κ sweep against the n=3 fixture (per belief cea8ba7708ae3ca3) saw inter_judge_kappa.min=0.0 and fidelity_mean=0.667, both diagnosed as statistical thinness on top of the prompt-template under-specification: even with κ=1.0 in the average cell, a single judge flip drops the binary κ catastrophically when n=3. Extension keeps the same fork (turn 8), same session, same synthetic debugging scenario from turns 0..7 — appends 14 turns (7 user/assistant pairs) post-turn-13, so contamination protocol stays a one-fork shape. New eval_turns = [9, 11, 13, 15, 17, 19, 21, 23, 25, 27] (n=10), each probing a different specific fact from pre-fork context the prior n=3 cut did not exercise: intermittency root cause (CRLF vs LF), the literal code change, the why-fix-_dedup_key-not-conftest rationale, the dedup tuple shape, the NFC normalization form, the repro command, and the conftest file:line location. Across the 10 evals the judge prompt's specific-facts rubric (this PR's prompt-sharpening commit) gets exercised against distinct atom kinds (name, path, function, code, prose, data structure, normalization form, command, file:line). Meta field updated with the new arc and a full prior-shape history. test_hot_start_fixture_resolves_via_load_corpus assertion updated to the new tuple. All 22 wiring tests pass. Fully synthetic content — no _dedup_key or test_ingest_jsonl_idempotent on github/main; the fixture is self-contained fiction. Confirmed via `git grep _dedup_key github/main` returning only fixture + CHANGELOG matches.
…fixture widening
62eace8 to
39b7a1a
Compare
Closes #778
v3.1 closure for the deferred #592 hot-start AC ≥80%. Run 2 of the multi-judge κ sweep (2026-05-12/13, per #687) saw two compounding failures: prompt-template under-specification (judges disagreed on what "load-bearing claim" meant on 2 of 3 turns) and statistical thinness on n=3 binary samples. This PR addresses both.
What's in the diff
Three atomic commits:
feat(eval-harness): sharpen JUDGE_PROMPT_TEMPLATE—benchmarks/context-rebuilder/judges/llm_judge.py. Replaces the single-clause "load-bearing claim" definition with a three-step rubric ("specific facts" = concrete atoms; candidate must convey every fact; matched iff a reader of the candidate alone could state each fact) plus two worked examples (multi-factO(log n)+ low-content"Yes.") chosen to not overlap fixture content.feat(eval-harness): widen hot_start fixture to n=10 eval turns—benchmarks/context-rebuilder/fixtures/synthetic/hot_start_debugging_session_001.{jsonl,meta.json}. Extends from 14 to 28 turns, keeping the same fork (turn 8) and the same synthetic CRLF/_dedup_keydebugging scenario. Neweval_turns = [9, 11, 13, 15, 17, 19, 21, 23, 25, 27]. Each new eval probes a different specific fact from pre-fork turns 0..7 (root cause, code change, why-not-conftest, dedup tuple, NFC, repro command, conftest file:line). Test assertion intests/test_context_rebuilder_eval_harness_wiring.pyupdated.docs(changelog): note v3.1 close work— unreleased CHANGELOG entry.Verification
pytest: 3931 passed, 60 skipped, 75 xfailed (full suite, 108s).pytest tests/test_context_rebuilder_eval_judge.py: 14/14 (gates the template's{expected}/{actual}fields).pytest tests/test_context_rebuilder_eval_harness_wiring.py: 22/22 (gates the fixture'sfork_turn/eval_turnsshape).github/main: clean (one false-positive on "subagent", which is repo-standard vocabulary — appears in README front page and existing CHANGELOG entries).git grep _dedup_key github/mainreturns only fixture + CHANGELOG matches; no production source contradicted.Bench gate — operator-dispatched
The κ sweep re-run is not part of this PR. It runs after merge, host-side, per the existing protocol (
benchmarks/context-rebuilder/judges/llm_judge.pywritesjudge_requests.jsonl; operator dispatches off-band;read_judge_responsesjoins back). Pass criteria from #687:inter_judge_kappa.min ≥ 0.7hot_start_fidelity_mean ≥ 0.8calibrated=trueIf both clear at n=10, the v3.0-deferred hot-start AC bullet closes retroactively. If they don't, the failure mode (prompt vs fixture vs both) lands as a follow-up issue.
Why this work, why now
Several v3.x rounds are gate-blocked on this calibration landing — notably #748 R3 (load-bearing hot-path touch-temperature round), per the mid-cycle audit committed to lab
experiments/hot-path/RUNNING_DOC.mdtoday. The audit confirmed nothing in the hot-path campaign moves forward until #592 produces a real baseline.Out of scope
anchorperJUDGE_MODEL_TIER)debugging_session_001.meta.jsonkeeps[8, 10, 12, 14])