4.2 KiB
4.2 KiB
T5.7 — Order alternation and sampled consistency
| Field | Value |
|---|---|
| Phase | P5 — Grading |
| Size | S — under 1 day |
| Status | Not started |
| Flags | — |
| Spec | inlined below |
| Blocks | — |
Goal
Cancel judge position bias across the sequence instead of within each pair, and measure order-consistency on a sample rather than by doubling every call.
Facts (inlined — no spec read needed)
- Pairwise judges have position bias. The tournament path cancels it by judging both orderings, paying 2× on every comparison.
- The default path does not pay that: the challenger takes position A on even-numbered comparisons and position B on odd ones. Bias cancels across the sequence, at no extra cost.
- Order-consistency is still measured — on a sampled fraction of comparisons — and reported as the grader's own error bar.
- That disagreement rate is a first-class grader-health metric. An inconsistent judge should widen the sample gate rather than silently promote.
- Total calls must stay near 1× the comparison count. A doubling implementation produces the right consistency number and the wrong cost, which is why the call count is asserted rather than the metric.
Steps
- Alternate position by comparison index: even → challenger is A, odd → challenger is B. Record the position used on each comparison.
- Normalize the verdict back to challenger-relative terms before folding into
the
WinRecord(T5.6) — otherwise alternation inverts half the record. - Sample a configurable fraction of comparisons for a second, order-swapped call. Default the fraction low; it is an error bar, not the measurement.
- Compute the disagreement rate over sampled pairs and emit it as a metric tagged by judge and rubric.
- Count total
comparecalls and assert the ratio to comparison count in the test. - Build a deliberately position-biased mock judge — always picks A — as the detection case.
Acceptance
- A deliberately position-biased mock judge is detected and its disagreement rate reported.
- Total
comparecalls stay within 1.0–1.2× the comparison count. A doubling implementation fails this, which is the point.
Verify
Harness: a mock judge that always picks position A regardless of content — maximal position bias, so detection is unambiguous.
Integration test — tests/it_order_alternation.rs:
- Run 100 comparisons against the always-A judge.
- Assert the disagreement rate is detected and reported near 100% on the sampled subset.
- Assert total
comparecalls fall in 1.0–1.2× the comparison count. A doubling implementation lands at 2.0× and fails here, which is the point. - Assert position alternation: challenger in A on even indices, B on odd. Read the recorded position per comparison, do not infer it.
- Normalization: with the always-A judge, assert the resulting
WinRecordis near 50/50 rather than 100% challenger wins. A missing verdict normalization after the swap inverts half the record and produces exactly 100%, which looks like a strong result. - Unbiased judge control: a content-driven mock judge yields a low disagreement rate — otherwise the detector fires on everything.
- Assert the disagreement rate is emitted as a metric tagged by judge and rubric.
Command: cargo test -p grading order_alternation
False pass:
- Step 3 omitted. Judging both orderings on every comparison produces a perfect consistency measurement at double the cost — correct-looking and exactly the design this task rejects.
- Step 5 omitted: forgetting to normalize verdicts after alternating is the most likely implementation error, and it makes a biased judge look like a decisive one.
- Step 6 omitted, so a detector that always reports high bias passes.
Traps
- Forgetting to normalize the verdict after swapping positions. The record then averages toward 50% regardless of the truth.
- Sampling "every comparison, it is cheap" — that is the doubling implementation with extra steps.
Background (not required to do this task): rust-agentic-sys.md §11.3, §11.4, §15 · rust-agentic-task.md