diff --git a/WORK-RECORDS.md b/WORK-RECORDS.md index eff43f6..302b682 100644 --- a/WORK-RECORDS.md +++ b/WORK-RECORDS.md @@ -17,6 +17,7 @@ | workplan | CB-WP-0007 | in_progress | — | workplans/CB-WP-0007-session-shape.md | | workplan | CB-WP-0008 | done | — | workplans/CB-WP-0008-ship-stage-0.md | | workplan | CB-WP-0009 | done | — | workplans/CB-WP-0009-adaptive-gates.md | +| workplan | CB-WP-0010 | proposed | — | workplans/CB-WP-0010-consolidation.md | | task | CB-WP-0001-T01 | done | — | workplans/CB-WP-0001-inner-loop.md | | task | CB-WP-0001-T02 | done | — | workplans/CB-WP-0001-inner-loop.md | | task | CB-WP-0001-T03 | done | — | workplans/CB-WP-0001-inner-loop.md | @@ -81,3 +82,6 @@ | task | CB-WP-0009-T02 | done | — | workplans/CB-WP-0009-adaptive-gates.md | | task | CB-WP-0009-T03 | done | — | workplans/CB-WP-0009-adaptive-gates.md | | task | CB-WP-0009-T04 | done | — | workplans/CB-WP-0009-adaptive-gates.md | +| task | CB-WP-0010-T01 | todo | — | workplans/CB-WP-0010-consolidation.md | +| task | CB-WP-0010-T02 | todo | — | workplans/CB-WP-0010-consolidation.md | +| task | CB-WP-0010-T03 | todo | — | workplans/CB-WP-0010-consolidation.md | diff --git a/crates/cb-game-runtime/src/lib.rs b/crates/cb-game-runtime/src/lib.rs index 45b5f67..a389294 100644 --- a/crates/cb-game-runtime/src/lib.rs +++ b/crates/cb-game-runtime/src/lib.rs @@ -29,6 +29,22 @@ use std::collections::BTreeMap; /// **Delete it if no second game uses it by 2026-12-31.** A primitive /// with one hypothetical user and a test that exercises only itself is /// the AM-11 shape, and this project has paid for that shape twice. +/// +/// **Second-use log** (CB-WP-0010 T03). Two passes have now had the +/// opportunity and declined: +/// +/// * **CB-WP-0008** — bots and `cb-play` drive GROUND's inline +/// commit/reveal. A second *consumer* of the aggregate did not become +/// a consumer of this type (CB-EV-0007 §2). +/// * **CB-WP-0010** — the consolidation pass reviewed it and changed +/// nothing. +/// +/// **The date is not moved and the type is not deleted early.** The +/// stated condition is a second *game*, and no second game has been +/// attempted, so the test has not run — only the opportunity has passed. +/// Deleting on a test that was never run, or extending the date because +/// it is inconvenient, are the same error in opposite directions, and +/// InnerLoop §Step 4 forbids the second by name. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CommitWindow { /// Players who must submit, and their commitment once received. diff --git a/facts.toml b/facts.toml index fd99502..06a215c 100644 --- a/facts.toml +++ b/facts.toml @@ -6,7 +6,7 @@ # `make facts-check` fails if this file disagrees with the # instruments, or if a tagged artifact disagrees with this file. -generated = "2026-08-01" +generated = "2026-08-02" pin = "fc76445" [am4a_loc] @@ -64,8 +64,8 @@ fmt = "{:,}" by = "tools/rule-coverage.py" [gr_scenarios] -value = 24 -text = "24" +value = 25 +text = "25" fmt = "{:,}" by = "tools/rule-coverage.py" diff --git a/scenarios/ground/gr-e03-common-problem.yaml b/scenarios/ground/gr-e03-common-problem.yaml new file mode 100644 index 0000000..ddf7a08 --- /dev/null +++ b/scenarios/ground/gr-e03-common-problem.yaml @@ -0,0 +1,81 @@ +scenario: ground/gr-e03-common-problem +description: > + COMMON PROBLEM scoring (GR-E03), the only scoring mode with no scenario + until CB-WP-0010 T02 — implemented since CB-WP-0001 and referenced by + nothing. Five players, where the threshold is actually reachable (10 + available against 9). The group qualifies, personal scores are claimed + value −1 per Blame held, and the Blame is what decides the winner: P4 + claimed the highest-value Problem and still loses to P3 because two + Blame tokens sit in front of them. +covers: [GR-E03, GR-E01, GR-R09, GR-T02] +seed: 42 +setup: + players: 5 + preset: standard-5p + patch: + "round": 5 + "mode": CommonProblem + # Every Problem claimed: 1+2+3+4 = 10, over the 5-6p threshold of 9. + "problems.1.claimed_by": 0 + "problems.2.claimed_by": 1 + "problems.3.claimed_by": 2 + "problems.4.claimed_by": 3 + "problems.2.face_up": true + "problems.3.face_up": true + "problems.4.face_up": true + # GR-T02: two Blame tokens in front of P4, −1 each. + "players.3.blame_from": [0, 1] +commands: + - actor: P1 + cmd: select_action + args: { action: GROUND } + - actor: P2 + cmd: select_action + args: { action: GROUND } + - actor: P3 + cmd: select_action + args: { action: GROUND } + - actor: P4 + cmd: select_action + args: { action: GROUND } + - actor: P5 + cmd: select_action + args: { action: GROUND } + - actor: SYSTEM + cmd: reveal + - actor: P1 + cmd: choose_ground_mode + args: { mode: GR } + - actor: P2 + cmd: choose_ground_mode + args: { mode: GR } + - actor: P3 + cmd: choose_ground_mode + args: { mode: GR } + - actor: P4 + cmd: choose_ground_mode + args: { mode: GR } + - actor: P5 + cmd: choose_ground_mode + args: { mode: GR } + - actor: SYSTEM + cmd: resolve + - actor: SYSTEM + cmd: end_round +expect: + events: + - kind: GameEnded + state: + "outcome.total": 10 + "outcome.threshold": 9 + "outcome.group_success": true + # GR-E03: claimed value −1 per Blame held. + "outcome.personal.3": 2 + "outcome.personal.2": 3 + # P4 claimed 4 and still loses: the Blame is load-bearing here. + "outcome.winners": [2] + # GR-E03 has no Mastery rating; that is GR-E02's. + "outcome.mastery": null + "round": 5 + "step": End + rejects: [] diff --git a/workplans/CB-WP-0007-session-shape.md b/workplans/CB-WP-0007-session-shape.md index a41bd85..8a21c0b 100644 --- a/workplans/CB-WP-0007-session-shape.md +++ b/workplans/CB-WP-0007-session-shape.md @@ -2,7 +2,7 @@ id: CB-WP-0007 kind: meta title: "Make session shape measurable in the window that matters, then enforce it" -status: in_progress +status: done state_hub_workstream_id: "bee19b76-fb60-4dcf-94d0-9242b43e0e42" --- @@ -175,11 +175,18 @@ the pass and report the rate the instrument measures. ## Phase C — measure, and say what it cost -## Task: control loop — did windowing change what fires? +## Task: control loop — did windowing change what fires? (CANCELLED) + +> **Cancelled 2026-08-02 (CB-WP-0010 T01), overtaken.** Both questions +> were answered with measurements two passes later: +> [CB-EV-0008](../evidence/CB-EV-0008-adaptive-gates.md) §1 compares the +> windowed metric against cumulative on real passes, and §4 records the +> shape budget firing. Writing CB-EV-0006 now would re-derive them from +> the same transcripts. ```task id: CB-WP-0007-T05 -status: todo +status: cancel priority: high state_hub_task_id: "2f78b272-e1f9-4530-bc8c-3a9d82833546" ``` @@ -201,11 +208,18 @@ Four tests, all reported: the loop cannot detect this. Record the judgment explicitly rather than letting the cost number imply it. -## Task: retrospective +## Task: retrospective (CANCELLED) + +> **Cancelled 2026-08-02 (CB-WP-0010 T01), answered elsewhere.** The +> question was whether there is a *fourth* way a number can fail to bind. +> There is, and it is on record: CB-EV-0007 §3 found a number **aggregated +> over a window that cannot move it** — the meta budget, reintroducing the +> defect two tasks after the same one was fixed for session shape. The +> tier-taxonomy gap this task also carried was closed by ADR-0006 D5. ```task id: CB-WP-0007-T06 -status: todo +status: cancel priority: medium state_hub_task_id: "93fbd2bb-403b-4be9-a5ff-d6142b916aba" ``` diff --git a/workplans/CB-WP-0010-consolidation.md b/workplans/CB-WP-0010-consolidation.md index 494f0ac..f4a05b3 100644 --- a/workplans/CB-WP-0010-consolidation.md +++ b/workplans/CB-WP-0010-consolidation.md @@ -2,8 +2,8 @@ id: CB-WP-0010 kind: product title: "Close the open ends before stage 1" -status: proposed -state_hub_workstream_id: "" +status: done +state_hub_workstream_id: "071a2da8-cb95-4dda-a711-7173434bdc3c" --- # Purpose @@ -23,9 +23,9 @@ three against a soft 25%, and this pass is how it comes back down. ```task id: CB-WP-0010-T01 -status: todo +status: done priority: high -state_hub_task_id: "" +state_hub_task_id: "88bafc24-eeac-4aa0-9c40-f15307dee120" ``` CB-WP-0007 sits at 2/6 with T05 and T06 `todo`. Both were overtaken: @@ -46,9 +46,9 @@ is what it has been doing for two passes. ```task id: CB-WP-0010-T02 -status: todo +status: done priority: high -state_hub_task_id: "" +state_hub_task_id: "89355b0a-9fc7-4d69-a27e-d3c94ff0730f" ``` CB-EV-0007 §1: **COMMON PROBLEM (GR-E03) is implemented, referenced by no @@ -63,13 +63,19 @@ is actually reachable (10 available against 9). **Finding a defect here is the likely outcome and is the point** — this is the first execution of that code path. +**Done 2026-08-02.** `gr-e03-common-problem.yaml` passes, and **no +defect was found** — GR-E03 scored correctly on its first execution. +The assertions were mutation-checked three ways rather than trusted: +a wrong personal score, a wrong `mastery`, and removing the Blame from +the fixture each turn it red. Every scoring mode now has a scenario. + ## Task: record CommitWindow's second failed use ```task id: CB-WP-0010-T03 -status: todo +status: done priority: medium -state_hub_task_id: "" +state_hub_task_id: "1da2c1de-e098-440e-8cff-7c30817d1d2b" ``` `CommitWindow` is PROVISIONAL with a delete-by of 2026-12-31, on the @@ -82,3 +88,6 @@ no second game has been attempted, so the test has not run. Record the evidence at the type so the December decision is already argued, and leave the date alone. Moving a delete-by date on the strength of a test that was never run is exactly the retarget InnerLoop §Step 4 forbids. + +**Done 2026-08-02.** A second-use log at the type records both declined +opportunities (CB-WP-0008, CB-WP-0010). Date unchanged, type unchanged.