0041 answers what is true of the engine as a game-theoretic object before anything is built on it. CB-RES-0009 found the EFG is the interchange format between describing a game and analysing it, and that we already have most of one — the journal is the history, Outcome the payoff, and project(Viewer::Player(seat)) the information partition. Three gaps remain, and perfect recall is first because CFR and exploitability both assume it and nobody has checked ours. The workplan deliberately builds no port: creating a capability port is a tier-L trigger and this is M, so T04 decides whether to build one and declares it separately. T01's control includes that the answer may be NO, which would make Track B's adoption unsound as it stands. 0042 implements H2, which is ground-game's direct answer to our H1 reading. Unclaimed Problems now tick only the seats in scope — global, personal (the owner), or bond (the owner's Bond network over Bond edges only, degree 0 falling back to personal) — assigned by hidden priority, so 2p never has the bond card in play. It explicitly does not stack with H1. H2 is bigger than H1 was: it needs variant-scoped edition data (H2 overrides Problems.csv with a stress_scope column, and ours is an include_str! constant), per-Problem ownership which is new state reaching the hash and every recording, and Bond-network reachability. The controls name the likely defects in advance: traversing Rivalry edges, applying stacking once, forgetting the degree-0 fallback, and ownership silently becoming a permission to SOLVE. Chaos window 4 opens: d8 = 5 and d8 = 4, no overrides. Window 3's verdict is still owed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
4.8 KiB
| id | kind | title | status |
|---|---|---|---|
| CB-WP-0041 | product | The extensive-form foundation | 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).
Why
CB-RES-0009 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?
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
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
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
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.