--- id: CB-WP-0041 kind: product title: "The extensive-form foundation" status: active --- # Purpose ``` structural tier M (states what the kernel claims about itself as a game-theoretic object, and prepares — but does not build — a capability port) chaos d8 = 5 → no override declared tier M ``` **Declaration 1 of chaos window 4.** Window 3 closed at 12 declarations with one override that changed nothing, and **its verdict is still owed** ([`ChaosRollHistory.md`](../specs/ChaosRollHistory.md)). ## Why [CB-RES-0009](../research/CB-RES-0009-extensive-form-is-the-lingua-franca.md) found that the **extensive-form game is the interchange format** between describing a game and analysing it — Ludii's universality result grounds its language in EFGs, and OpenSpiel's CFR, best-response and exploitability consume them. **And that we already have most of one**, under other names: | EFG component | ours | |---|---| | histories | the journal — `Applied { actor, command, events }` in order | | actions | `bot::legal_commands(state, seat)` | | **information sets** | **`state.project(Viewer::Player(seat))`** | | payoffs | `Outcome` / `score()` | | terminal | `outcome.is_some()` | **This workplan does not build the port.** It answers what is true of the engine today, because a port built on an unchecked assumption is worse than no port — and one of the three gaps invalidates every equilibrium concept if it turns out badly. ## Task: does the engine satisfy perfect recall? ```task id: CB-WP-0041-T01 status: todo priority: high ``` **Perfect recall** — every player remembers their own past actions and observations — is the assumption **CFR and exploitability both rest on**. Nobody has checked whether ours holds. Formally, for a seat `i` and any two histories `h`, `h'` in the same information set of `i`: the *sequence of `i`'s own actions and information sets* along `h` and `h'` must be identical. **Controls:** - **derived from the journal and the projection**, not asserted — the check must be able to say NO; - **a positive control**: a deliberately forgetful projection must fail it, or the check proves nothing; - **stated per seat count**, since the partition depends on how many seats there are to hide from; - **the answer may be that we do NOT have perfect recall**, and that is reported as plainly as the other outcome. It would be a real finding and would make Track B's adoption unsound as it stands. ## Task: say precisely what our chance is ```task id: CB-WP-0041-T02 status: todo priority: high ``` `setup` shuffles, deals and draws Lead from a seeded RNG, and the mid-game reshuffle derives from seed and round. **So a clay-borg game is one chance realisation, not a game with chance nodes**, and the panels approximate the distribution by sampling seeds. **Controls:** - **state it, do not fix it.** Monte Carlo over seeds is legitimate and is what we do; the defect would be calling it an EFG; - **name every point where chance enters**, from the code, not from memory; - **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. ## Task: state the simultaneity encoding, and check it ```task id: CB-WP-0041-T03 status: todo priority: medium ``` Commit/reveal **is** the textbook EFG encoding of simultaneous moves: sequence them, and hide the earlier move in an information set. **Control:** it is not enough to say so. **The projection must actually hide another seat's selection before Reveal**, and a test must fail if it 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`. ## Task: decide whether to build the port at all ```task id: CB-WP-0041-T04 status: todo priority: medium ``` `decisions/ADR-*.md`, written **after** T01–T03 and not before. **It must be able to conclude "no".** Options include exporting an EFG, adopting OpenSpiel's API directly for analysis only, or deciding the gaps are too expensive and Track B borrows vocabulary rather than machinery. **Controls:** - **the decision cites T01's answer**, because if perfect recall fails, most of the option space closes; - **it states what it would cost to be wrong**; - **a port is declared separately, at its own tier.** Creating a capability port is a tier-L trigger and this workplan is M — it may not smuggle one in. ## Not in this workplan - **No EFG export, no OpenSpiel integration, no equilibrium computation.** - **No answer to "is exploitability meaningful for a co-operative game with a shared threshold"** — that is the other open question from CB-RES-0009 §6, it is a question about game theory rather than about our engine, and it wants its own pass.