← all analysis · · docs/analysis/2026-07-09-judge-hardening-v03.md

Judge hardening v0.3: the product-identity check — design, validation, re-baseline

On this page

Author: Daniel Huber (executed via Claude Code) Date: 2026-07-09 Spec: docs/superpowers/specs/2026-07-07-judge-hardening-v03-design.md · Plan: docs/superpowers/plans/2026-07-07-judge-hardening-v03.md Companion artefacts: 2026-07-09-judge-v02-noise-floor.md · 2026-07-09-planted-v02-before.md · 2026-07-09-planted-v03-after.md · 2026-07-09-planted-v031-after.md · 2026-07-09-judge-v03-test-retest.md

TL;DR

The SP-Benchmark judge’s one confirmed blind spot — correct mechanics attributed to a cousin product one defining feature away — is closed at the instrument level. A mandatory Step 0 in the judge prompt now requires both judges to (1) name the product the reference concerns and the product the answer names/describes, (2) set an auditable product_identity_match boolean, which (3) deterministically caps factual_accuracy at 1 when false. On the by-construction planted set, cousin-cell detection rose from 5/10 (Opus) and 8/10 (GPT-5.4) to 9/10 and 10/10. The full 750-result corpus was re-judged twice under the hardened prompt (comparability break accepted by design, taken while the site is unpublished). Two honest costs are documented below: two stable single-case Opus regressions on non-cousin planted defects, and — on real transcripts — an identity-flag false positive against the SME’s judgement, which lowers the small-sample SME agreement stats rather than raising them.

1. The problem (confirmed 2026-06-13)

The planted-error study (2026-06-13-judge-validation-planted.md) found both panel judges detect sign flips, self-contradictions, fabrications, and dropped edge cases near-perfectly, but systematically miss cousin-product mis-attribution: an answer that keeps the reference’s mechanics verbatim while asserting a product identity one defining feature off (BRC vs plain reverse convertible, autocallable vs BRC, …). All shortfall in that study was this cell. The failed hypothesis of a “causal-reasoning ceiling” fix was retired then; the product-identity check was deferred (§7 of that writeup) and is delivered here.

2. The instrument (v0.3 → v0.3.1)

Schema (JudgeScore): product_identity_match: bool | None (None = pre-v0.3 result, never coerced to true), judge_prompt_version: str, and — added in the v0.3.1 iteration — reference_product / answer_product strings. When the judge sets product_identity_match: false, __post_init__ caps factual_accuracy at 1 in code, independent of whether the judge self-applied the rule; the raw judge JSON is preserved unmodified. Export CSV carries the new columns; legacy rows render blank.

Two prompt variants were tested:

3. Validation chain

StepArtefactResult
Noise floor (v0.2, 12 SME transcripts × 2 runs × 2 judges)2026-07-09-judge-v02-noise-floor.mdOpus 72/72 dims exact; GPT-5.4 2/72 one-point moves. ±1 case is the resolution limit.
Cousin cell expanded 3 → 10 planted cases (fixture 21 → 28)framework/judge_validation_planted_errors.md PE-22…28Each case moves exactly one defining feature (BRC↔RC, BRC↔autocall, bonus↔tracker, CPN↔participation, worst-of↔single, discount↔RC, twin-win↔bonus).
Before-run (v0.2 prompt, 28 cases)2026-07-09-planted-v02-before.mdCousin: Opus 5/10, GPT-5.4 8/10. All 18 non-cousin cases 1.00 both judges.
After-run v0.32026-07-09-planted-v03-after.mdGPT-5.4 gate PASS (10/10); Opus gate FAIL (6/10) → prompt iterated once (approved).
After-run v0.3.1 + Opus stability probe2026-07-09-planted-v031-after.mdOpus 9/10, GPT-5.4 10/10 detected AND identity-flagged. Probe reproduces Opus 25/28 exactly — stable.
Re-baseline 750 results × 2 judges × 2 runs (~3,000 calls)2026-07-09-judge-v03-test-retest.mdCorpus on v0.3.1 throughout; test-retest below.

Detection ⟺ identity-flag coincide exactly on the cousin cell for both judges: the score drop is produced by the deterministic cap on an explicit, per-transcript, auditable flag — not by diffuse judge mood. That is the instrument working as designed.

Accepted trade-offs (Opus, stable across runs — all caught by GPT-5.4, panel 28/28)

4. Effect on the real corpus

5. SME-calibration recompute — honest negative

Recomputing the 12-transcript SME comparison against the v0.3.1 primary-judge scores lowers the headline agreement: core-total Spearman ρ 0.770 → 0.421, quadratic-weighted κ 0.390 → 0.177. With n = 12 this is driven entirely by the only two scores that moved:

Reading: the v0.3 instrument closes a by-construction blind spot the SME set never probed (none of the 12 real answers contained a cousin error), and pays for it with occasional over-flagging of legitimate illustration. For an MRM audience this is the right direction of error (conservative), but the claim “v0.3 improves SME agreement” is not supported — the causal-reasoning ceiling (judge mean 3.0, κ = 0) also persists unchanged. The external-SME ≥30-question re-score remains the calibration bar, and the 67 Opus-flagged transcripts are the natural rare-class set for the next human review pass.

6. Status and next steps