121 lines
6.5 KiB
Markdown
121 lines
6.5 KiB
Markdown
|
|
# CB-REV-0002 — re-review of the H1 corrections
|
|||
|
|
|
|||
|
|
Round 2 of the tier-L review. A **fresh** agent, not the round-1 reviewer,
|
|||
|
|
because a re-review by the same reviewer inherits its own sampling. Run
|
|||
|
|
2026-08-08 against the corrections made after
|
|||
|
|
[`CB-REV-0001`](CB-REV-0001-h1.md).
|
|||
|
|
|
|||
|
|
> **Verdict: not approvable.** Three FATAL, five SERIOUS.
|
|||
|
|
>
|
|||
|
|
> **The substance of round 1's corrections held. The claims about them did
|
|||
|
|
> not**, and two of the defects were introduced *by* the corrections.
|
|||
|
|
|
|||
|
|
The reviewer was briefed on the specific risk — **the author of the
|
|||
|
|
corrections is the author of the errors** — and re-derived on five
|
|||
|
|
independent seed windows.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## What it could not break, after trying
|
|||
|
|
|
|||
|
|
Stated first, because it is what round 1's corrections were for.
|
|||
|
|
|
|||
|
|
- **`Reactive` is genuinely one arm different.** The reviewer built a
|
|||
|
|
`PureDelegate` with the same loop shape and *no* override, hashed every
|
|||
|
|
command of every game, and got **identical output to `GreedyPolicy` in
|
|||
|
|
8/8 cells over 500 seeds**, both variants. Round 1's worst finding is
|
|||
|
|
properly closed. *Residual: nothing asserts it; it is true by
|
|||
|
|
construction, not by test.*
|
|||
|
|
- **All five replacement controls are non-inert**, re-verified by
|
|||
|
|
mutation, and the SOLVE control is red on nine alternate seeds.
|
|||
|
|
- **`h1b_soothes_the_darvo_stage_attack_too` really covers that path** —
|
|||
|
|
disabling H1-B *only* for the DARVO extra Attack reddens that test alone.
|
|||
|
|
- **The inert-arm metric is right**, agreeing exactly with an independent
|
|||
|
|
definition in every cell of every window.
|
|||
|
|
- **Every number in CB-EV-0031 §1 reproduces** and is stable across five
|
|||
|
|
windows.
|
|||
|
|
- **`score()` from `work` is correct per the delta and changes no baseline
|
|||
|
|
path.**
|
|||
|
|
|
|||
|
|
## The three fatal ones
|
|||
|
|
|
|||
|
|
### 1. The fix for round 1's #11 did not fix it
|
|||
|
|
|
|||
|
|
The assertion was `games + setup_fails == 200`. **A refused setup
|
|||
|
|
increments `setup_fails` and skips `games`, so the sum is invariant under
|
|||
|
|
exactly the failure it claimed to catch.** Injecting setup failures gave
|
|||
|
|
exit 0 and a full table over 196-game columns, under a banner reading
|
|||
|
|
"200 games per cell".
|
|||
|
|
|
|||
|
|
**Conceded.** Now `assert_eq!(c.games, GAMES)`, verified to exit 101 under
|
|||
|
|
injected failures, with `GAMES` named once so the banner and the assertion
|
|||
|
|
cannot disagree.
|
|||
|
|
|
|||
|
|
### 2. The correction to the selective-column FATAL was itself selective
|
|||
|
|
|
|||
|
|
CB-EV-0030's correction quoted *"81–1000 per cell … baseline **and** H1"*
|
|||
|
|
and, twelve lines away, *"31–1000"*. **Both came from the baseline
|
|||
|
|
rank-75 row.** Under H1, rank-75 arms are `2p 59, 3p 0, 4p 0, 6p 0`.
|
|||
|
|
|
|||
|
|
**Conceded, and it is the same error twice.** The remedy for choosing a
|
|||
|
|
favourable column chose a favourable column. **Every cell is now printed**
|
|||
|
|
rather than summarised, because two attempts at a range produced three
|
|||
|
|
wrong numbers — and the corrected verdict is the opposite of the one it
|
|||
|
|
replaced: under rank-75, **H1 reduces DARVO arms to zero** at 3p and above.
|
|||
|
|
|
|||
|
|
### 3. "DARVO arms 2 per seat per game" is off by a factor of two
|
|||
|
|
|
|||
|
|
It is **1 per seat per game**, exactly, at every band: 600/(200×3),
|
|||
|
|
800/(200×4), 1200/(200×6). Deterministic across five windows.
|
|||
|
|
|
|||
|
|
**Conceded.** A headline number, wrong, in a corrected section.
|
|||
|
|
|
|||
|
|
## The serious ones
|
|||
|
|
|
|||
|
|
| # | challenge | outcome |
|
|||
|
|
|---|---|---|
|
|||
|
|
| 4 | the tiebreak test's oracle was `assert_ne!` — "the set changed", not "changed correctly". Reversing GR-E03's tiebreak left it green | **conceded, fixed.** The oracle now names the expected winners before and after; the reviewer's M7 goes red |
|
|||
|
|
| 5 | the #13 "real defect" was claimed to affect the reported modes and never measured | **conceded.** ~72,000 games across three modes: **zero divergences**, `attack-value` byte-identical. Real in principle, and its only witness is a constructed board. Now stated |
|
|||
|
|
| 6 | "matches the reviewer's independent 29-of-363" cites a file that does not contain it | **conceded, with a correction to the correction.** Round 1's reviewer *did* report 29 of 363 — in its message, never transcribed into the review file. So the figure is real and the **record** was not. Recorded in CB-REV-0001 now |
|
|||
|
|
| 7 | `regulation.rs` and `attack-value.rs` are run by **no gate** | **conceded, and it is the sharpest finding.** Every number in both evidence files came from a manual run of an ungated binary — including the assertion added for #1, unreachable from `make`. Now `make panels`, registered in `gates.toml` |
|
|||
|
|
| 8 | `edition-check`'s sibling handling was self-certifying: it read the file list *out of PROVENANCE*, crashed instead of failing on an absent file, and "coverage" counted Markdown lines | **conceded — a defect introduced by the correction.** Siblings are now discovered on disk; an absent recorded file FAILs; undocumented siblings FAIL. **It found a real gap on its first run**: `Rules_Text.csv` was vendored with no digest |
|
|||
|
|
|
|||
|
|
## The minor ones
|
|||
|
|
|
|||
|
|
- **9 — the CSV falsifier ran over YAML.** Fixed; it now filters to `.csv`.
|
|||
|
|
- **10 — "peak Stress held" was dead code.** `held` was built, never read,
|
|||
|
|
and `let _ = held;` kept clippy quiet; the metric was still max over
|
|||
|
|
payloads plus a floor. **The published numbers were right by
|
|||
|
|
coincidence.** Now actually read from `held`, and the figures are
|
|||
|
|
unchanged — which is how it stayed hidden.
|
|||
|
|
- **11 — `Reactive`'s doc comment still argued for the copy** that round 1
|
|||
|
|
ruled fatal, giving cover to restore it. Rewritten.
|
|||
|
|
- **12 — §3's withdrawal ground was wrong.** *"There is no constant to
|
|||
|
|
explain"* — there is: `darvo == seats × games`, exactly. The constant
|
|||
|
|
moved from 400 to `n·games` rather than dissolving, and **what forces
|
|||
|
|
exactly one arm per seat per game is still unexplained.**
|
|||
|
|
- **13 — assorted**, including that the delta's DARVO clause is
|
|||
|
|
conditional (*"if they share the same path"*) where the test's comment
|
|||
|
|
says "outright".
|
|||
|
|
|
|||
|
|
## What the reviewer could not check
|
|||
|
|
|
|||
|
|
Digest freshness against upstream (`edition-check` reports
|
|||
|
|
`upstream not checked out` when the sibling repo is absent — it did not
|
|||
|
|
have it); several untouched modules; ground-game's design note; felt-play.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## The pattern, now visible across two rounds
|
|||
|
|
|
|||
|
|
Round 1 found five fatal errors of the form *correct computation, wrong
|
|||
|
|
subject*. **Round 2 found three more, in the corrections to them** — an
|
|||
|
|
assertion invariant under its own target, a selective fix for a selective
|
|||
|
|
report, and a rate wrong by a factor of two.
|
|||
|
|
|
|||
|
|
> **A correction is new work and deserves the scrutiny of new work.** It
|
|||
|
|
> arrives feeling like a conclusion, and that is exactly when it is least
|
|||
|
|
> examined.
|
|||
|
|
|
|||
|
|
**Round 3 is owed.** Same reason as round 2.
|