CB-WP-0041 done: ADR-0020 refuses the port, and T02 is why
Some checks failed
ci / check (push) Failing after 3s
Some checks failed
ci / check (push) Failing after 3s
T02 — all chance derives from one root seed. Three chance points, all reading it: the setup deck shuffle, the setup Lead draw, and the reshuffle permutation. The Problems deal is not chance at all. So in extensive-form terms the tree has a single chance node at the root. That test was wrong first, and the mutation caught it. It compared state hashes — and GroundState carries `seed` as a field, so "different seeds differ" was true by construction. Mutating the shuffle away left it green. It now compares the dealt configuration, and the same mutation fails it: a wrong-subject error inside the control written for T02. The reshuffle is a pure function of (seed, round) because K5 requires deterministic replay, where a real table reshuffles independently. That is a modelling restriction, not a defect, and it is now pinned. T03 — commit/reveal checked in both directions: before Reveal each seat sees its own selection and no other; after Reveal the information sets merge, because an encoding that hides forever is not commit/reveal either. T04 — ADR-0020 refuses the EFG port, and the blocker is T02 rather than T01, which inverts what the workplan expected. Perfect recall looked like the risk and is a constraint with a known answer: key on observation histories. Making chance explicit is the expensive one — the reshuffle would become a real chance node and break the K5 purity that every recording, replay bundle and trial-note hash depends on. A port would trade the property this project is built on for one it has never needed. Track B's first move is therefore a question, not a build: take "is exploitability meaningful for a co-operative game with a shared threshold" to OpenSpiel on a toy model, where answering it costs nothing. D4 states what being wrong looks like — OpenSpiel settling on a toy what three rounds of policy sweeps could not — and makes watching for it the next action. Taxonomy §4.1 records the EFG correspondence with the test that checks each row, so a later pass starts from a specification rather than a memory. Chaos window 4 at three declarations. Window 3's verdict is now two windows behind and should be evaluated rather than restated. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
81f9339b2d
commit
2806b3acb7
5 changed files with 372 additions and 4 deletions
|
|
@ -2,7 +2,7 @@
|
|||
id: CB-WP-0041
|
||||
kind: product
|
||||
title: "The extensive-form foundation"
|
||||
status: active
|
||||
status: done
|
||||
state_hub_workstream_id: "dacfa1fe-81c3-4c97-b81e-ec66d95a611c"
|
||||
---
|
||||
|
||||
|
|
@ -112,7 +112,7 @@ drawn*, which is weaker than "the property holds" and is printed as such.
|
|||
|
||||
```task
|
||||
id: CB-WP-0041-T02
|
||||
status: todo
|
||||
status: done
|
||||
priority: high
|
||||
state_hub_task_id: "e223bf7d-6e4e-4377-8eac-a63e83a60d35"
|
||||
```
|
||||
|
|
@ -130,11 +130,52 @@ approximate the distribution by sampling seeds.
|
|||
- **say what an explicit chance player would cost** — that is the input to
|
||||
T04's decision, and guessing it is how a port gets built on a hope.
|
||||
|
||||
**Done 2026-08-08.** Three chance points, all reading the same root seed:
|
||||
|
||||
| where | what |
|
||||
|---|---|
|
||||
| `setup` | shuffles the Solution deck (`ChaChaRng::from_seed(seed)`), hands dealt off the top |
|
||||
| `setup` | draws the **Lead** (`rng.draw(seats)`) from the same stream |
|
||||
| `draw_solution` | reshuffles the discard when the deck empties, with `ChaChaRng::from_seed(seed ^ round)` |
|
||||
|
||||
**The Problems deal is not chance at all** — `edition::deal` is a pure
|
||||
function of the vendored CSV, so every game gets the same board.
|
||||
|
||||
**So in extensive-form terms the tree has a single chance node at the
|
||||
root.** `a_game_is_determined_by_its_seed` pins it.
|
||||
|
||||
**And that test was wrong first.** It compared *state hashes*, and
|
||||
`GroundState` carries `seed` as a field — so "different seeds differ" was
|
||||
true by construction. Mutating the shuffle away left it green. It now
|
||||
compares the **dealt configuration** (hands, Lead, deck order), and the
|
||||
same mutation fails it. **A wrong-subject error inside T02's own control**,
|
||||
caught by the mutation rather than by reading.
|
||||
|
||||
**The reshuffle is correlated with the root seed, and a real table's is
|
||||
not.** The permutation is a pure function of `(seed, round)` — deliberate,
|
||||
so replay never re-derives it (GameKernel K5), and the code says so.
|
||||
`the_reshuffle_permutation_is_a_function_of_seed_and_round` pins that it
|
||||
moves with **both** inputs.
|
||||
|
||||
**The consequence is a modelling one, not a defect**: at a table the
|
||||
reshuffle is an independent random event. An EFG built from this engine
|
||||
inherits the correlation and models a *restriction* of the game as played.
|
||||
|
||||
**The cost of an explicit chance player, stated for T04:**
|
||||
- the root node is **not enumerable** — 24 Solution cards give 24!
|
||||
orderings — so any EFG over this must **sample** chance, which is what
|
||||
external-sampling MCCFR does and what our seed sweeps already do by
|
||||
hand;
|
||||
- making the reshuffle a genuine chance node **breaks the K5 purity that
|
||||
makes replay deterministic**. That is the real cost and it is a
|
||||
tension, not a line of code: our recordings replay *because* chance is
|
||||
a function of state.
|
||||
|
||||
## Task: state the simultaneity encoding, and check it
|
||||
|
||||
```task
|
||||
id: CB-WP-0041-T03
|
||||
status: todo
|
||||
status: done
|
||||
priority: medium
|
||||
state_hub_task_id: "c95b32a1-5006-4acd-abc9-537543119344"
|
||||
```
|
||||
|
|
@ -148,11 +189,18 @@ stops doing that. That property is load-bearing for every claim in §1 of
|
|||
the research note and is currently only implied by
|
||||
`SelectionView::Hidden`.
|
||||
|
||||
**Done 2026-08-08.** `a_pending_selection_is_hidden_until_reveal` checks
|
||||
**both halves** at four seats: before Reveal each seat sees its own
|
||||
selection and no other, and after Reveal the information sets **merge** —
|
||||
because an encoding that hides forever is not commit/reveal either.
|
||||
|
||||
Mutation-proven: make selections public and it fails naming the seats.
|
||||
|
||||
## Task: decide whether to build the port at all
|
||||
|
||||
```task
|
||||
id: CB-WP-0041-T04
|
||||
status: todo
|
||||
status: done
|
||||
priority: medium
|
||||
state_hub_task_id: "3010fb0d-84cc-4fa8-8c23-726ee946cd79"
|
||||
```
|
||||
|
|
@ -171,6 +219,28 @@ are too expensive and Track B borrows vocabulary rather than machinery.
|
|||
port is a tier-L trigger and this workplan is M — it may not smuggle one
|
||||
in.
|
||||
|
||||
**Done 2026-08-08.**
|
||||
[ADR-0020](../decisions/ADR-0020-we-do-not-build-the-port.md) — **and the
|
||||
answer is no.**
|
||||
|
||||
**The blocker is T02, not T01**, which inverts what the workplan expected.
|
||||
Perfect recall looked like the risk and turned out to be a *constraint
|
||||
with a known answer*: key on observation histories. **Making chance
|
||||
explicit is the expensive one** — the reshuffle would become a real chance
|
||||
node, and that breaks the K5 purity every recording, replay bundle and
|
||||
trial-note hash in this repo depends on.
|
||||
|
||||
> A port would trade the property this project is built on for one it has
|
||||
> never needed.
|
||||
|
||||
**Track B's first move is a question, not a build**: take
|
||||
"is exploitability meaningful for a co-operative game with a shared
|
||||
threshold" to OpenSpiel on a toy model, where answering it costs nothing.
|
||||
|
||||
**D4 states what being wrong looks like** — OpenSpiel settling, on a toy,
|
||||
a question three rounds of policy sweeps could not — and makes watching
|
||||
for it the next action rather than a hope.
|
||||
|
||||
## Not in this workplan
|
||||
|
||||
- **No EFG export, no OpenSpiel integration, no equilibrium computation.**
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue