Benchmark ratings: no zero-width interval from one duel
(a) Observed: a configuration rated from one benchmark duel shows a zero-width 95% interval on Command center › Performance › Configuration, for example `869 [869–869]` and `1131 [1131–1131]`. Task 12288 saw this on dev and filed it as draft 12439, which has no parent and will never dispatch. This follow-up takes its place. The page claims perfect certainty exactly where the rating is least certain, so the epic's ask for honest intervals beside the observational metrics is not met.
(b) Cause: `apps/api/app/outcome_ledger/benchmark.py:759-775` `compute` bootstraps by resampling the duel list (`resample = [duels[rng.randrange(len(duels))] for _ in duels]`). With one duel, every resample is that same duel, so every draw is identical.
(c) Fix: either keep the virtual-tie prior in every resample, or return `lo`/`hi` = null below a minimum number of duels so the console shows the rating with no interval. Keep the wire shape `{rating, lo, hi, n_duels}`. The console already renders "—" for a null value. Check that the Duel rating cell renders a null `lo`/`hi` without the brackets.
(d) Acceptance:
- AC1: a unit test in `apps/api/tests/test_benchmark_mode.py` shows that a configuration rated from one duel has `lo < rating < hi`, or null `lo`/`hi` under the chosen rule. Oracle: pytest on that file.
- AC2: the existing hand-computed Bradley-Terry tests still pass.
- AC3: if the null-interval rule is chosen, a vitest case shows the Duel rating cell renders the rating with no `[x–x]` bracket.
(e) Out of scope: the sampler, duel filing, merge guards, the console column layout. Leave draft 12439 alone; this task supersedes it.
Done means:
- `./dc check quick` green; changed-area tests green; merge lane full gate green.
Outcome
BT ratings return null lo/hi under 2 duels or a degenerate bootstrap; Duel rating cell shows the bare rating. Quick gate + pytest (52) + vitest (15) green; visual check clean at 1280/390px. PR #7666 queued in merge lane. Memory: none applied.
Artifacts
Activity
- Ready
- Runner started
- Runner ended (done)