--- id: CB-RES-0008 capability: analysis.witness-and-difficulty status: draft — awaiting adversarial review (CB-WP-0025 T02) tier: L chaos: d8 = 6 → no override --- # CB-RES-0008 — a path out of a lost game, and how hard the game is CB-WP-0025 T01. Surveyed 2026-08-05. Two maintainer questions that are the same machine asked twice: *"could we have won, and how?"* is a search from a recorded state; *"how hard is this?"* is that search — or a proxy for it — run over many deals and counted. **The runnable baseline is ours and it is the row that matters.** External candidates are algorithms and practices, not software we can run on our workload, so per InnerLoop §Step 1 their rows are **directional and cap at `parity`**. --- ## 1. The baseline, measured `cargo run --release -p games-ground --example difficulty-baseline` (200 seeds per seat count, `GreedyPolicy` and `RandomPolicy`): ``` bot win rate over 200 seeds (GR-E01 group success): 2p greedy 132/200 won = 66.0% mean total 5.3 of 5.0 median margin +1 3p greedy 165/200 won = 82.5% mean total 8.4 of 7.0 median margin +2 4p greedy 190/200 won = 95.0% mean total 8.8 of 7.0 median margin +2 5p greedy 200/200 won = 100.0% mean total 11.8 of 9.0 median margin +3 6p greedy 200/200 won = 100.0% mean total 12.0 of 9.0 median margin +3 2p random 10/200 won = 5.0% mean total 2.4 of 5.0 median margin -3 3p random 19/200 won = 9.5% mean total 3.1 of 7.0 median margin -4 4p random 16/200 won = 8.0% mean total 3.2 of 7.0 median margin -4 search cost — legal_commands at every real decision point: 2p 462 decisions branching mean 4.7 median 5 max 7 161 us/node 3p 649 decisions branching mean 7.4 median 8 max 10 139 us/node 4p 870 decisions branching mean 9.1 median 10 max 12 112 us/node ``` ### 1.1 The finding this produced before any solver exists **A greedy bot wins 200 of 200 games at five and six seats.** Not 95%, not 99% — every game, with a median margin of **+3** and mean available points of **11.8–12.0 against a threshold of 9**. The arithmetic behind it, row by row (the shape GROUND-WP-0004 T02 requires): | seats | Surface | hidden dealt | points available | threshold | ratio | |---|---|---|---:|---:|---:| | 2 | priority 1 | 2 | **6** | 5 | 1.20 | | 3–4 | priority 1 | 3 | **9** | 7 | 1.29 | | 5–6 | priority 1 | 4 | **12** | 9 | 1.33 | **The ratio moves the wrong way.** More seats means more points on the table *and* a proportionally lower bar *and* more actions per round to clear it with. Three multipliers all pointing the same direction, which is why the curve is not gentle — it is 66% → 100% across four seat counts. **This is admissible under GameDesign §1**: the reproduction exists (`examples/difficulty-baseline.rs`), it has the ruled shape (row-level, no sums), and it can fail — change a threshold and the numbers move. It also **explains the maintainer's report** — *"I felt it was too easy but then we lost, so who knows"* — without needing a solver. He plays at low seat counts, where 66% is a real game, and had been feeling the 5–6 seat experience from elsewhere in the same session. Both halves of the sentence are true of different seat counts. **T06 must report this to GROUND-WP-0005, which is blocked on exactly this number.** ### 1.2 What the search-cost numbers rule out Branching is small — mean 4.7 to 9.1 — but **`legal_commands` costs 112–161 µs per call**, because it constructs candidates and filters them through full `validate`. That is the price of keeping the rules in one place (ADR: `legal_commands` builds then validates), and it is the number that decides this pass. A game is 5 rounds × N seats of decisions. An exhaustive search from round 1 at 3 seats is roughly `7.4^15` — not a number worth writing down. **Exhaustive search is out at any seat count**, and this was measured rather than assumed. What is affordable, at ~140 µs/node: a bounded search of ~10⁴–10⁵ nodes costs **1.4–14 seconds**. That is the budget the ADR has to design inside, and it is the difference between a feature that answers while the player is still looking at the page and one that does not. ## 2. Prior art: determinized search, and the failure it is famous for The natural first idea — *deal out the hidden cards, solve the resulting perfect-information game, repeat* — is **Perfect Information Monte Carlo (PIMC)**, and its failure modes were named by Frank, Basin and Matsubara in 1998: - **Strategy fusion** — the search picks *different* actions from two states in the same information set, which no real player could do, because a player cannot tell those states apart. The plan it returns is not executable by someone who does not know which world they are in. - **Non-locality** — subgame values are not well-defined when information is hidden, so recursive search over subgames is unsound. **Strategy fusion is precisely the trap in this pass.** A witness produced by determinized search may be a line that requires knowing which Solution is on top of the deck. Showing the maintainer *"you could have won by playing Repair on turn 3"* — when nothing he could see said a Repair was coming — teaches a false lesson about his own play, which is worse than not shipping the feature. **Long and Sturtevant** later characterized *when* PIMC nonetheless works well, which matters here: its success depends on properties of the game tree (leaf correlation, bias, disambiguation rate). GROUND disambiguates fast — Problems flip face-up, selections reveal every round — which is the regime where PIMC is least bad. **That is an argument the ADR may use, and it is a directional one, not a measurement.** **ISMCTS** (information-set MCTS) searches over information sets directly rather than determinizations, and is the standard answer to strategy fusion. **Benchmark to beat:** a witness that **replays through our existing scenario runner and ends in `group_success`**. That is a stronger and cheaper bar than any of the above, because it is mechanically checkable — and note it does *not* by itself exclude a strategy-fused line. A fused line replays fine. **Checkability and honesty are different properties, and the ADR must not let the first stand in for the second.** *Directional, cited-only.* ## 3. The retrospective question is not the playing question Worth separating, because the prior art is all about *playing*: | question | information | honest? | |---|---|---| | *was this deal winnable at all* | omniscient | **yes** — it is a question about the deal, not about the player | | *was it winnable from what we could see* | the seat's view | yes, and expensive | | *could a reasonable player have found it* | the seat's view, bounded | the only affordable honest one | The first is legitimate and cheap, and answers *"the deal was unwinnable, stop blaming yourself"* — which is a real thing a player wants to hear. It is **not** an answer to *"how could we have won"*, and labelling it as one is the failure mode. **Naming matters more than the algorithm here.** The ADR's first decision is which question is being answered and what it is called on screen. ## 4. Difficulty as a measured quantity Co-operative board games set difficulty with a dial and publish the win rate — Pandemic's number of Epidemic cards is the canonical example. The practice is: **a named dial, a stated player skill, and a target band.** We have the dial candidates already — the threshold (`GR-E01`), and `ground-game`'s proposed Pressure dial (GROUND-WP-0005) — and §1 supplies the first measured band. **The problem the practice does not solve for us:** a published win rate is measured against *humans*. Ours is measured against `GreedyPolicy`. The 5–6 seat 100% is a claim about our bot, and the honest reading is narrower than "the game is too easy at six players" — it is *"a bot that takes the obvious action never fails to clear the threshold at six players."* Whether that is the same statement is **the reviewer's strongest line of attack** and is not settled here. **Benchmark to beat:** a difficulty figure whose resolution is stated — the smallest threshold change it can distinguish, with its N. A rate without that cannot tune anything. *Directional, cited-only.* ## 5. Benchmarks to beat | dimension | today | benchmark | |---|---|---| | witness checkability | no witness exists | **100%** of emitted paths replay to `group_success` through the existing runner | | witness honesty | — | no line that requires unseen information; **the ADR must say how this is enforced, not asserted** | | search cost | 112–161 µs/node measured | a bound in nodes or wall clock, and *"none found within B"* wording that does not claim unwinnability | | difficulty resolution | one band, one policy | the smallest threshold delta distinguishable, with N and policy named | | difficulty honesty | — | the policy and seed range are **in the number's name**, not a footnote | ## 6. What the survey did not settle - **Whether a bot win rate is a difficulty at all.** §4. The strongest counter is that it measures the bot, and improving the bot would "increase the difficulty" without touching the game. - **How witness honesty is enforced rather than asserted.** Running the search on a `GroundView` makes the information boundary structural; running it on `GroundState` makes it a promise. The survey believes the first is right and has **not** measured whether it is affordable — a view-only search cannot fold events, so it needs a state it may not see. **This is the gap most likely to sink the pass, and it is stated here rather than discovered in T05.** - **Whether 100% at 5–6 seats is a rules finding or a bot finding.** §1.1 reports it as measured; which repo owns it is T03's call. - **Whether the cheap honest answer is enough.** *"This deal was unwinnable"* (omniscient, cheap) may satisfy the maintainer's actual need without any information-respecting search at all. Nobody has asked him. That is a one-question experiment this survey did not run.