12 commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
| 4b40a537a6 |
CB-WP-0041 T01: perfect recall fails on the projection, holds on the history
Some checks failed
ci / check (push) Failing after 4s
The answer is "it depends what you call an information set", and the distinction is the result. 44,938 decision points, random play, 2/3/4/6 seats. Reading A — information set = the seat's current projection, which is what project(Viewer::Player(seat)) returns and what the page renders: 22 violations. Reading B — information set = the seat's observation history, every view seen and action taken in order: 0. The Reading A witness is concrete. Two histories reach a byte-identical view — round 3, Select step, same hand, same claimed Problem — where the seat had played SOLVE then GROUND-OU(protect) in one and SUPPORT then SOLVE in the other. The view does not tell the seat what it did, because our state is a snapshot rather than a history: selections clear each round and effects coincide, so a player cannot reconstruct their own past from the present. In a real game the player's memory supplies it; in the state, nothing does. That is precisely OpenSpiel's ObservationString vs InformationStateString split, arrived at here by measurement rather than read off. project() is an observation, not an information state. So Track B is not closed, it is constrained, and usefully: an extensive-form game built from this engine must key information sets on observation histories, never on project(). Both directions are asserted — Reading B empty AND Reading A non-empty — because if the sample stops finding Reading A violations the conclusion is unsupported and must be re-derived rather than quietly kept. And the check samples, so it can falsify perfect recall and cannot establish it: Reading B's zero means no counterexample was drawn, which is printed as such. Wired into make panels, so it is re-derived by the gate rather than by hand. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
|||
| c4a8a227c0 |
CB-REV-0003: round 3, and three of four FATAL came from round 2's fixes
Some checks failed
ci / check (push) Failing after 3s
The pattern is now measured over three rounds: 5 fatal, then 3 (2 from the previous round's corrections), then 4 (3 from them). The corrections are not getting safer. FATAL 1: round 2's short-cell assertion went into regulation.rs only. attack-value.rs — which produced every number in CB-EV-0030's DARVO table — still just warned, and the gate registered to close the finding claimed the property for both. FATAL 2, the sharpest of the three rounds: counting games proves they STARTED. Stopping the engine after one round gives 200 games, all-zero columns and exit 0 — byte for byte the signature CB-EV-0030 says the instrumentation distinguishes from a real result. Both harnesses now require every counted game to have reached an outcome over five rounds. FATAL 3: round 2's `.csv` filter was applied to all three loops, so catalog.yaml and rules_delta.yaml — whose missing digests were round 1's finding — were recorded and then never compared, and never checked against upstream at all. Only the parser loop filters now. FATAL 4: five of six tiebreak comparators had no coverage. GR-E04's tiebreak never executes in any scenario. All four are now covered and mutation-verified; the Blame key needed compensating claims to be reachable at all, since Blame also lowers the coalition score. SERIOUS: "peak held" computed the same number as "peak assigned" for every possible input — the real gap was that START_STRESS was an unchecked constant, now read off the dealt state; cadence="none" was a pure loophole, removed; sibling discovery swapped a hand-written list for hand-written globs and missed metadata.json and VARIANT.md, both named in the package's own changed_files — now walked, and it found them immediately; and "~72,000 games" was unsourced, make panels runs 17,600. Also separated two kinds of number that were presented alike: seats×games is invariant, 363 and 29 vary 7.1%-11.5% across samples. Round 4 owed. The conclusion is not that the work is nearly right — it is that author-made corrections to measurement work should be assumed defective until a fresh reader has attacked them. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
|||
| da58e78e4a |
CB-REV-0002: round 2, and the corrections were not approvable either
Some checks failed
ci / check (push) Failing after 4s
Three FATAL, five SERIOUS. The substance of round 1's corrections held — Reactive is genuinely one arm different, the five replacement controls are non-inert, the inert metric is right, the numbers reproduce. What failed were the CLAIMS about them, and two defects the corrections introduced. FATAL 1: the fix for round 1's #11 did not fix it. The assertion was `games + setup_fails == 200`, and a refused setup increments setup_fails while skipping games — so the sum is invariant under exactly the failure it claimed to catch. Injecting setup failures gave exit 0 over 196-game columns. Now asserts games == GAMES, verified to exit 101. FATAL 2: the correction to the selective-column FATAL was itself selective. "81-1000 per cell, baseline AND H1" and "31-1000" twelve lines apart, both taken from the baseline row; under H1 rank-75 arms are 59/0/0/0. Every cell is now printed rather than summarised, 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. FATAL 3: "DARVO arms 2 per seat per game" is 1 per seat per game, exactly, at every band. SERIOUS: the tiebreak oracle asserted only that the winner set CHANGED, so reversing the tiebreak left it green; the #13 defect's impact was claimed and never measured (72,000 games: zero divergences — real in principle, witnessed only by a constructed board); a 29-of-363 citation pointed at a file that did not contain it (round 1's reviewer did report it, and it was never transcribed — the record was wrong, not the number); the harnesses were run by NO GATE, so every published figure came from a manual run of an ungated binary, including the assertion added for #1; and edition-check's sibling handling — added by the last correction — was self-certifying, crashed instead of failing, and counted Markdown lines as coverage. Now discovered on disk, and it found a real gap on its first run: Rules_Text.csv vendored with no digest. Also: "peak Stress held" was dead code kept quiet by `let _ = held;` — the numbers were right by coincidence. make panels is now a registered gate. Round 3 is owed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
|||
| 84aa09264c |
Close the three items CB-REV-0001 left open
Some checks failed
ci / check (push) Failing after 4s
H1-B on the DARVO extra Attack: the delta says the extra Attack shares the Attack resolution "so it can self-soothe too if Stress >= 4". CB-WP-0038 asserted it because the code shares resolve_attack; nothing tested it, and CB-EV-0031's withdrawn mechanism story ran through that exact path. Now tested and mutation-verified. Round-5 pressure did not reach the score, and this was a real defect rather than a reporting one. end_round_events scored from `self` while H1-A's pressure went into `work`, and score() reads Stress for the GR-E03 and GR-E04 tiebreaks — so the final round's pressure was invisible to the two modes CB-EV-0030 reports on. Fixed. The test uses the case that bites: uniform pressure preserves an ordering, so it takes the clamp at 5 to collapse a gap and change who wins. Inert arms reported separately: a DARVO arm at the End of Round 5 can never advance a stage, and criterion 1 is about DARVO mattering. 29 of 363 at 2p, none above — matching the reviewer's independent figure, so criterion 1 stands as met. That fix produced one more wrong-subject error, caught before reporting: the first inert-arm metric tested `g.rounds >= 5`, a property of the GAME rather than the EVENT, so it marked every arm in every completed game inert and briefly read as "criterion 1 fails after all". An arm is inert when no RoundEnded follows it. regulation.rs no longer skips setup failures silently: they are counted, and a short cell fails an assertion rather than printing a number a reader has to notice — which is the credit CB-EV-0030 §3 took and half earned. All thirteen challenges closed. Re-review is owed before any of this travels: the corrections were made by the author of the errors. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
|||
| 041c0e7c3e |
CB-REV-0001: the adversarial review, and it was not approvable
Some checks failed
ci / check (push) Failing after 4s
Thirteen challenges, five FATAL, all five conceded. Nothing had reached ground-game, which is the only reason this is a correction and not a retraction. The worst: `Reactive` was not "greedy with one preference changed". It differed in five, including SpendFreedom — ranked 95 unconditionally against greedy's `95 if gated else 0` — so the seat burned its Freedom token in round one of every game. A second change to the exact mechanism under study, and every number in CB-EV-0031 was measuring it. The pass claimed ADR-0018's one-varying-parameter discipline in its own workplan while violating it. GreedyPolicy::rank is now public and the policy delegates, overriding one match arm, so the control is structurally true. Withdrawn entirely: "H1-B suppresses DARVO in the attacker". Disabling H1-B under the corrected policy changes the arm count by exactly zero. The pass hedged the wrong variable — it disclaimed "the number 2" and defended "the direction", and the direction is what failed. The supporting inference was invalid anyway: final Stress cannot show who armed, because DarvoEnded resets the stage and REVERSE gives its owner -2. Corrected: criterion 1 was failed on the greedy column while the pass's own printed table showed 31-1000 arms in the other columns — the selective-column move, in the file that names it. "Peak Stress was 1" was a maximum over StressSet payloads, not held state (true: 2); the baseline game count was 1,600 not 3,200; and "a reckless policy plays identically to a careful one" is refuted by this repo's own rank-95 policy. Inert controls replaced, each verified red against the reviewer's own mutation: the baseline hash test compared two identically-constructed states (serde(skip) on variant left 57/57 green); the `unchanged:` test checked 3 of 7 entries and passed with SOLVE made illegal; H1-A's ordering and H1-B's OU-cancel path had no test at all. edition-check now covers catalog.yaml and rules_delta.yaml, whose digests CB-WP-0038 claimed and never recorded — the review found it and reported it unverified rather than absent, which was the right call. Still open: H1-B on the DARVO extra-Attack path is untested, regulation.rs still skips setup failures silently, and round-5 arms are counted though they can never act. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
|||
| 0f64961d06 |
CB-WP-0039: a seat that does not regulate — and it changes H1's verdict
Some checks failed
ci / check (push) Failing after 3s
CB-EV-0030 concluded H1's DARVO arm rate was still 0. That was true of the panel, and the panel was greedy-family throughout. GreedyPolicy ranks `Ground if gated => 100`, so it grounds the instant the stress gate bites, Stress plateaus at 3, and the arm at 5 is unreachable by construction. "H1 does nothing" was really "H1 does nothing to a seat that already manages its Stress" — and H1 was written for the seat that does not. `reactive` is greedy with exactly one preference changed: GROUND demoted below ATTACK. Under it, H1's criteria 1 and 2 are MET — DARVO arms 400 times per cell, ATTACK is chosen 3 times per seat per game. Criterion 3 fails harder: reactive wins nothing at any seat count. The larger finding is about the baseline. Greedy and reactive play IDENTICALLY under baseline, and peak Stress across 3,200 baseline games was 1 — against a starting value of 2. The gate at 4, the DARVO arm at 5 and the Freedom token are all unreachable, and a policy built to be reckless with Stress is indistinguishable from one built to husband it. That is a deeper account of F17 than F17 has. Not raised as a finding yet: it wants the plural panel first. A constant was investigated rather than reported: darvo was exactly 400 in every cell while atk scaled with seats. Six-player final Stress is [5,5,4,4,4,4] every seed — H1-B holds the attacker at 4, below the arm, and pushes its targets to 5. The self-soothe suppresses DARVO in the aggressor and concentrates it in the attacked. The direction follows from H1-B's arithmetic; the number 2 is partly an artifact of reactive's first-legal targeting, and is labelled as such. Still unreviewed: tier L review outstanding on CB-WP-0038, and nothing here reaches ground-game until it runs. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
|||
| a928b5925c |
CB-WP-0038: variant selection, H1 implemented, and H1 measured
Some checks failed
ci / check (push) Failing after 3s
ground-game packages hypotheses as selectable rules variants — a catalog, a rules_delta.yaml, and prose — and their note is explicit that CSV text alone is not executable here. So the kernel gains a Variant in game state: in the state, therefore in the hash, therefore in the recording, because a scenario replayed under a different variant would diverge silently. Baseline is bit-for-bit what it was, asserted across seat counts and seeds. A variant system that perturbs the baseline invalidates every measurement this repo has. H1-A and H1-B implemented from rules_delta.yaml and mutation-proven on their own defects: "unclaimed" misread as face-up-and-unsolved, and the attacker's Stress read after the attack's effects. Their `unchanged:` list is asserted rather than trusted — that list is their claim about their own experiment. Measured, and three of their four criteria fail. DARVO arm rate is still 0 under greedy; ATTACK selection does not rise and falls for the rank-75 policy; group success collapses from 165/190/200 to 0 at 3/4/6 seats. The mechanism is not the assumed one: greedy answers the pressure by regulating, Stress plateaus at 3, so it never reaches the gate at 4 or the arm at 5 — H1-A acts as a solve-rate tax and H1-B is unreachable under competent play. A harness defect was caught before the claim: sweep discarded refused games silently and never reported its count, so "nobody won" and "nothing played" printed identically. Reporting H1 as unwinnable on that basis would have been the ADR-0018 family aimed at another repo's design. All 200 games ran in every cell; the zeros are real. Chaos d8 = 8 — the window's first override, redrew L against a structural L, so it changed nothing. Window 3 recorded in ChaosRollHistory. NOT REVIEWED: tier L owes a separate-agent adversarial review, and no H1 result may reach ground-game until it has run. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
|||
| 302fc95c97 |
GR-E03 and GR-E04 played to the end — F14 closed, and the reason they were
Some checks failed
ci / check (push) Failing after 4s
unplayed was ours Tier S (a fix and a measurement inside a boundary; chaos d8=4 from CB-WP-0029's roll, no override). cb-play built EVERY game with ScoringMode::SharedGround and passed an empty patch. The mode was settable in scenarios and not from the driver, so two of the three shipped modes were unreachable from the only way anyone actually plays. F14 sat open for a week because nobody could reach the thing it was about. --mode added. All three now play out and give DIFFERENT WINNERS FROM IDENTICAL PLAY: shared -> all four seats (mastery 4), common -> P3 alone (top personal scorer), coalitions -> P1+P2 (best Bond network, 4>3>2). Same 37 commands, three answers. AND THEY ANSWER F17'S OPEN QUESTION. I had flagged that ATTACK might earn its place where Blame costs personal score. It does not, in any mode: SHARED GROUND 132/165/190/200 -> identical free but pointless COMMON PROBLEM 59/52/48/44 -> 59/52/48/34 a cost at six seats BONDED COALITIONS 131/134/132/116 -> 59/52/48/34 roughly halved The coalitions row has a mechanism and the data confirms it unprompted. GR-A07 flips a Bond to a Rivalry on Attack, and GR-E04 scores Bond NETWORKS -- so attacking destroys the thing that scores. And the attacking numbers in E04 are IDENTICAL to E03's, which is exactly what that predicts: break every Bond and each seat is a coalition of one, so GR-E04 degenerates into GR-E03. That check was not designed; it fell out. F14 -> applied. F17 strengthened and no longer bounded to co-op: ATTACK has no mode in which it helps, and one where it actively destroys your score. Still framed as a question rather than a verdict. DARVO is the pattern the game is about not falling into, so a self-destructive ATTACK may be the design. What ground-game has to decide is whether the namesake mechanic being unreachable in competent play -- in all three modes -- is intended. make all: exit 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
|||
| f4eeddd726 |
25 test games, no faults — and F17 gets the artifact that changes what it
Some checks failed
ci / check (push) Failing after 4s
says Five games per seat count, 2-6 players. NO ANOMALIES: every game reaches 5 rounds with an outcome, no stalls, no stress above the cap, no over-claimed Problems. But the series showed something a crash never would. DARVO NEVER FIRED IN 25 GAMES and stress never exceeded 2. Measured wider: GreedyPolicy plays ATTACK exactly ZERO times in 10,000 selections across 500 games. THAT NUMBER IS ABOUT OUR BOT, NOT THE GAME. bot.rs ranks `Action::Attack => 10`, below everything. Reporting "the game gives no incentive to attack" from a policy we programmed to rank attack last would have been CB-WP-0025's C4 error committed again -- a single policy's behaviour presented as the game's. So the artifact varies exactly one number: ATTACK's rank in an otherwise identical policy, 200 games per cell. rank 10 (below all): 132/165/190/200/200 wins, 0 attacks, 0 DARVO rank 75 (above SUPPORT): 132/165/190/200/200 wins, 315-923, 13-218 rank 95 (above SOLVE): 0/0/0/0/0 wins, 1400-5170, 400-1000 THE MIDDLE ROW IS THE FINDING. Identical win counts at every seat count, while attacking hundreds of times and arming DARVO repeatedly. Attacking is not punished -- it is INERT with respect to the goal. Group success is a function of SOLVE alone, and ATTACK costs anything only when it ranks above SOLVE and displaces it. The maintainer was right and the reason is sharper than his phrasing: there is no incentive because there is no PATH. ATTACK's effects (Stress, Rivalry, DARVO) feed nothing that decides group_success. Bounded honestly to SHARED GROUND. Blame costs PERSONAL score, so ATTACK may earn its place in GR-E03 and GR-E04 -- which have never been played to the end (F14), and that is where to ask next. And this is NOT a claim the game is broken: DARVO is the pattern the game is about not falling into, so a self-destructive ATTACK may be the design. The question for ground-game is whether the namesake mechanic being unreachable in competent co-op play is intended. F17 promoted from note to raised, with games/ground/examples/attack-value.rs as its reproduction. Register: 18 findings, 8 with a resolving reproduction. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
|||
| 7ed9fc730a |
CB-WP-0025 T06/T07: a difficulty baseline that reports its own confound
Some checks failed
ci / check (push) Has been cancelled
T06. games/ground/examples/difficulty.rs, make difficulty, wired into make self-tests, and a report file in ground-game under GROUND-WP-0005 with a hub message pointing at it. THE REPORT OPENS WITH THE RETRACTION, because what this task was written to send was withdrawn by T02 and GROUND-WP-0005 is blocked on exactly that number. They are told, in the first section, that we nearly sent them "the game is too easy at 5-6 seats" and why it was wrong. seats winnable greedy random first-legal spread 2p 60% 60.0% 5.0% 76.7% 71.7 3p 93% 88.3% 6.7% 25.0% 81.7 4p 100% 93.3% 6.7% 30.0% 86.7 5p 100% 100.0% 3.3% 0.0% 100.0 6p 100% 100.0% 3.3% 0.0% 100.0 SPREAD justifies the whole redesign: 71.7 to 100.0 points between three trivial policies. The table now shows why no single rate is a difficulty rather than asserting it. And the 5-6 rows point the OPPOSITE way from the withdrawn claim -- first-legal 0% against greedy 100% is the widest spread in the table, which suggests play matters MORE there, not less. Neither reading is established and the report says so. The confound is stated in the tool's own output, not only in prose: `winnable` is conditioned on greedy's play up to the final round, because searching from round 1 is unaffordable. Presenting it as a property of the deal would repeat this pass's error in a subtler form -- which is exactly how a corrected project reintroduces a defect. NO THRESHOLD CHANGES ARE PROPOSED. The instrument can fail (spec §5): a witness must replay to a win, an unwinnable position must report searched-out rather than a budget cut, a one-node budget must not claim exhaustion, and the policy panel must actually disagree. difficulty-baseline.rs marked superseded, kept as the survey's dated snapshot. Registered as F16, inconsistent / withdrawn. T07. evidence/CB-EV-0024. Five of nine defects came only from the review; four from execution, and all four of those were in work written after it. The wrong-denominator family now has five instances and still no control -- facts-check catches copies that disagree, nothing catches a number computed correctly against the wrong base. Tier L was an over-declaration (no port, structurally M) and paid for itself anyway, because the review is L-only. Chaos window 2 will close with zero overrides, making its retirement condition untestable. Named as open rather than implied done: the witness is NOT wired to the ending page. The search works; the browser cannot ask it yet. make all: exit 0. loop-lint clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
|||
| 1f0f652920 |
CB-WP-0025 T02: the review withdrew the finding, and the fifth wrong
Some checks are pending
ci / check (push) Waiting to run
premise never left the repo Separate agent, second tier-L review in this project. Six of seven challenges conceded. The survey's headline finding is WITHDRAWN, not softened. C4 kills it, and the reviewer ranked it fourth. A FirstLegal policy -- take legal[0], no heuristic at all -- scores 0% at five and six seats where GreedyPolicy scores 100%, and 77.5% at two seats where greedy scores 66%. Two unsophisticated agents span the entire range at the same seat count. "The game is too easy at 5-6 seats" is therefore a statement about GreedyPolicy, not about GROUND. The rescue the reviewer offered -- greedy hits the 12-point ceiling in 200/200 deals, so the 6p row is a rules claim -- dies on the same data: FirstLegal reaches that ceiling never. C1: the per-node cost was wrong by 30-50x. The timer started before the seed loop, so "us/node" included two setups, an entire greedy game and a full validate+fold replay, divided by player-decision count. The tell was in my own published output and I did not look at it: the figure FELL (161/139/112) as branching ROSE (4.7/7.4/9.1), which no per-enumeration cost can do. Re-measured with the clock around legal_commands alone: 3.0/3.5/4.1 us, now rising with branching. The reviewer measured 15.6-20.4 by a different isolation; we disagree by ~5x and neither has established which is right, so T04 must benchmark it with criterion rather than adopt either number. C6: "exhaustive search is out at any seat count" is false -- ~3 seconds over the last two rounds at 3p. With C1's correction the budget is ~10^5-10^6 nodes and bounded endgame search fits, so ADR-0013 cannot open with "exhaustive is impossible, therefore determinized sampling" -- especially as sampling carries strategy fusion that exhaustive search does not. C3: the finding failed the admissibility rule this project wrote nine hours earlier. 6/9/12 are sums where GROUND-WP-0004 T02 requires per-priority rows, and the harness has no assertions, no --self-test and no make target, so nothing can turn it red -- a `default` artifact wearing a `counterexample` label, by CB-WP-0022 T05's own distinction. C2: the ratio story explains nothing; 3p and 4p share deal, threshold and ratio and differ by 12.5 points of win rate. C5: "explains the maintainer's report" is contradicted by lib.rs:2487, which records his losses as 3-player games on the pre-ruling deal, arithmetically unwinnable at 6 against 7. T06 exists to report to GROUND-WP-0005, which is BLOCKED waiting on a difficulty baseline. Had this proceeded they would have been invited to move thresholds on the strength of one bot's behaviour. That is the fifth wrong premise this project would have sent them, and the second stopped by an adversarial review rather than by a control. Both tier-L reviews here have now caught a false headline that every gate passed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
|||
| 469d00d679 |
CB-WP-0025 T01: survey -- the baseline found the game before the solver did
CB-RES-0008 with a runnable baseline (games/ground/examples/difficulty-baseline.rs), and the measurement produced a finding before any solver exists. A GREEDY BOT WINS 200 OF 200 GAMES AT FIVE AND SIX SEATS. Median margin +3, 11.8-12.0 points available against a threshold of 9. The curve is 66% / 82.5% / 95% / 100% / 100% across 2/3/4/5/6 seats. Row-level, as GROUND-WP-0004 T02 requires: available points 6 / 9 / 12 against thresholds 5 / 7 / 9, so the ratio RISES with seat count (1.20, 1.29, 1.33) while the table also gains actions per round to clear it with. Three multipliers pointing the same direction. It also explains the maintainer's report without needing a solver at all: "I felt it was too easy but then we lost" is two true statements about different seat counts. Cost measured and it rules out the obvious approach. Branching is small (mean 4.7-9.1) but legal_commands costs 112-161 us per call because it filters candidates through full validate. Exhaustive search is out at every seat count; 10^4-10^5 nodes is 1.4-14 seconds, which is the budget the ADR must design inside. Prior art names the trap: determinized search (PIMC) suffers strategy fusion (Frank, Basin & Matsubara 1998) -- the search picks different actions in states a real player cannot distinguish, so the witness may require knowing what was on top of the deck. Such a line still replays green, so the checkability benchmark does not catch it. Honesty and checkability are different properties; stated explicitly so T03 cannot conflate them. The survey states its own most likely killer up front (§6): a view-only search cannot fold events, so making the information boundary structural rather than a promise may not be affordable. Better found here than in T05. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |