From 5b204dc0fed25709438648bb6071d45eb70c16b9 Mon Sep 17 00:00:00 2001 From: lgray Date: Fri, 7 Aug 2026 19:25:51 -0500 Subject: [PATCH 01/13] =?UTF-8?q?fix(engine):=20scope=20the=20=E2=88=9E=20?= =?UTF-8?q?revocation=20by=20axis,=20and=20name=20the=20seat=20that=20will?= =?UTF-8?q?=20be=20asked?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-applies PR #7048's rules content onto the data model #7045 left behind. #7045 squash-merged as ea8771200 and, after the commit this branch forked from, moved the collapse state off the row: `UnboundedResourceView` is now `{player, axis}` and a `(player, family)`-keyed `UnboundedFamilyView` carries `FamilyCollapseState`. The four fixes below are therefore re-sited, not replayed. THE ACCEPTANCE GATE (CR 732.2c). A row is withheld only when the collapse has NOT been accepted and its object backing is registered-and-gone. The gate reads a new FACT set, `accepted_collapse_axes`, never the display-filtered announcement set — those answer different questions, and coupling them would let a rendering rule revoke a row for a collapse the table unanimously agreed to. They coincide today only because `object_growth_backing` returns `None` for `Mana(_)`; that is an accident between two functions, not an invariant either states. THE COUNTER ARM. `object_growth_backing` answers `Counter(..)` by deriving each registered `(ObjectId, CounterType)` pair's own axis through `collapsed_counter_axis` — the same bridge the stash uses, so a display set and the store that collapses it cannot disagree about what an axis is. A bearer that ceased to exist derives `Counter(_, Other)` (CR 400.7), stops matching, and the axis falls to `None`. Fail-open is required: the drift test forbids the wildcard that would over-drop. ONE COUNTER DERIVATION, NOT TWO. The ∞ display registration was partitioned by `generic_counter_is_growable` — the ω-cover's `Generic`-only rule — while the boundary materializes the strictly wider beneficial partition, so a +1/+1-growing loop collapsed correctly and never rendered ∞. Display now projects from the same `current_period_counter_growth` the stash consumes, which also deletes a duplicate period drive; `current_period_counter_targets` and `grown_generic_counter_targets` go with it. THE PROMPTED SEAT (CR 732.2a). `FamilyCollapseState::Scheduled` carries the seat that will be asked to name N, captured at the controller key before `attribution_player` may replace `player` with the victim. It lives INSIDE the variant rather than beside it because `derive_views` folds families through exactly one `merge`: a sibling field would need a second parallel accumulator whose merge rule no type enforces. Inside, `Unscheduled ⊔ Scheduled → Mixed` drops the seat structurally, and two disagreeing controllers meet to `None` on a flat lattice, so the fold is order-independent. The badge compares it against `usePlayerId()` gated by `useSpectatorMode()` — not `usePerspectivePlayerId()`, which returns the controlled seat under a turn-control effect and would address the copy to the wrong player. Wire shape changes: `Scheduled`'s serde payload goes from a bare string tag to an object. `DerivedViews` is never persisted, so there is no save migration, but an out-of-repo consumer on the old enum fails loudly rather than silently defaulting. `GameState::unbounded_counter_targets` is serialized and its content widens to the beneficial partition; `#[serde(default)]` keeps old saves loadable, though the ∞ pill set such a save restores is the pre-widening one. Known-open, disclosed rather than implied fixed: a mixed stash (≥2 accepts by one controller) can still suppress an axis removal — that pre-exists here for `Generic` pairs and this change enlarges its domain rather than creating it. The `CardPreview` F2 gap is likewise unchanged; its dangling symbol reference is repointed because the function it named is deleted, not because the gap closed. Assisted-by: ClaudeCode:claude-opus-4.8 --- client/src/adapter/types.ts | 31 +- .../card/__tests__/CardPreview.test.tsx | 20 +- client/src/components/hud/HudBadges.tsx | 53 +- .../hud/__tests__/UnboundedBadge.test.tsx | 109 ++- client/src/i18n/locales/de/game.json | 2 + client/src/i18n/locales/en/game.json | 2 + client/src/i18n/locales/es/game.json | 2 + client/src/i18n/locales/fr/game.json | 2 + client/src/i18n/locales/it/game.json | 2 + client/src/i18n/locales/pl/game.json | 2 + client/src/i18n/locales/pt/game.json | 2 + .../test/fixtures/unbounded-counter-wire.json | 5 +- .../test/fixtures/unbounded-token-wire.json | 5 +- .../__tests__/unboundedWireSeam.test.ts | 24 +- crates/engine/src/analysis/resource.rs | 65 +- crates/engine/src/game/derived_views.rs | 765 +++++++++++++++--- crates/engine/src/game/engine.rs | 125 ++- .../src/game/engine_resolution_choices.rs | 7 + crates/engine/src/types/game_state.rs | 279 ++++++- .../tests/integration/combo_infinite_pile.rs | 91 ++- .../kilo_live_offer_from_real_dump.rs | 170 +++- .../tests/integration/loop_counter_growth.rs | 210 +++++ .../engine/tests/integration/loop_shortcut.rs | 10 +- .../integration/loop_shortcut_mana_engine.rs | 5 +- 24 files changed, 1675 insertions(+), 313 deletions(-) diff --git a/client/src/adapter/types.ts b/client/src/adapter/types.ts index 33837aa6a5..e8ee1f83fb 100644 --- a/client/src/adapter/types.ts +++ b/client/src/adapter/types.ts @@ -2675,7 +2675,23 @@ export type CollapseCertainty = "Committed" | "Conditional"; export type FamilyCollapseState = | { type: "Unscheduled" } | { type: "Mixed" } - | { type: "Scheduled"; data: CollapseCertainty }; + | { + type: "Scheduled"; + data: { + certainty: CollapseCertainty; + /** + * The seat the engine will ask to name the collapse count (CR 732.2a's "specified number + * of times") — the loop's CONTROLLER. It is emitted because it is NOT recoverable from + * `UnboundedFamilyView.player`, which is the ATTRIBUTION seat: for `Life`/`DamageDealt`/ + * `LibraryDelta`/`Poison` axes that is the VICTIM, who is never asked. + * + * `undefined` means the family's scheduled axes name TWO OR MORE distinct seats — never + * "nobody". One glyph cannot address two players, so the badge falls back to the + * seat-neutral voice instead of picking a winner. + */ + prompted?: PlayerId; + }; + }; /** * One `∞` badge's engine-owned state, keyed per seat and per display family. Mirrors @@ -2937,12 +2953,13 @@ export interface DerivedViews { * deviation from it. What matters to the FE is only that the mark is still live there, so `∞` is current engine * state, not a stale mark. Render it. * - * ONE EXCEPTION: "stays populated" is about the ACCEPT, not about the board. A TOKEN-axis row - * is still dropped if its entire registered pile leaves the battlefield during that window — - * the engine will not render an `∞` beside an already-empty pile. Counter-axis rows are not - * dropped that way (the engine has no per-axis backing authority for them yet), so do not - * generalize the exception. Either way the accepted collapse itself is never cancelled: the row - * may vanish and the boundary still cashes the axis out. Do not infer a cancellation from a + * ONE EXCEPTION, ON TWO CONJUNCTS THAT MUST BOTH HOLD: an object-backed row (a TOKEN axis, or a + * COUNTER axis with registered targets) is dropped when (1) no accepted collapse names that axis + * AND (2) its entire registered board backing has left the battlefield — the engine will not + * render an `∞` beside an already-empty pile. Once the table has ACCEPTED, conjunct (1) fails and + * the row survives its backing dying, because CR 732.2c takes the shortcut at the last accept and + * the growth still lands. Either way the accepted collapse itself is never cancelled: the row may + * vanish and the boundary still cashes the axis out. Do not infer a cancellation from a * disappearing row — a row's disappearance says nothing about the collapse. What the FE IS told * about the collapse arrives on `unbounded_families` below, and only there. */ diff --git a/client/src/components/card/__tests__/CardPreview.test.tsx b/client/src/components/card/__tests__/CardPreview.test.tsx index 235e0070fa..78acda7b5b 100644 --- a/client/src/components/card/__tests__/CardPreview.test.tsx +++ b/client/src/components/card/__tests__/CardPreview.test.tsx @@ -622,12 +622,20 @@ describe("CardPreview unbounded counters", () => { expect(screen.queryByText(/2 charge counters/i)).not.toBeInTheDocument(); }); - // KNOWN GAP (F2), not desired behaviour: `grown_generic_counter_targets` - // (analysis/resource.rs:1330-1331) reads the BEFORE count off the live state, so the - // engine can mark an (object, counter) pair the object does not carry. Every display - // mode iterates `obj.counters`, so such a mark renders nowhere. The frontend must NOT - // synthesize a counter row the engine says does not exist; if the ∞ should be visible - // there, the ENGINE must decide it. + // KNOWN GAP (F2), not desired behaviour, and STILL OPEN: the ∞ counter targets are derived by + // `analysis::resource::grown_beneficial_counter_deltas` over the two frames + // `game::engine::drive_one_period_frames` produces, and its BEFORE frame is a clone of the LIVE + // state. A pair that grows 0 → 1 across the driven period is therefore registered while the live + // object carries none of that counter. Every display mode iterates `obj.counters`, so such a + // mark renders nowhere. The frontend must NOT synthesize a counter row the engine says does not + // exist; if the ∞ should be visible there, the ENGINE must decide it. + // + // The derivation was renamed and widened by the ∞ axis-scoped-revocation change — the display + // channel and the batched-collapse δ stash now share ONE derivation instead of running a second + // `Generic`-only diff. That does not touch this gap's mechanism (the same frame diff against the + // same BEFORE clone), but it does enlarge the gap's domain from `Generic` counters to the whole + // beneficial partition (+1/+1, loyalty, defense). Comment repointed at the surviving symbol; the + // gap it describes is unchanged. it("KNOWN GAP: a marked counter type the object does not carry renders nowhere (F2)", () => { const { container } = inspectPentadPrism(["oil"]); diff --git a/client/src/components/hud/HudBadges.tsx b/client/src/components/hud/HudBadges.tsx index fc9132e641..dd4718dfd0 100644 --- a/client/src/components/hud/HudBadges.tsx +++ b/client/src/components/hud/HudBadges.tsx @@ -17,6 +17,8 @@ import type { UnboundedFamily, } from "../../adapter/types.ts"; import { useGameStore } from "../../stores/gameStore.ts"; +import { usePlayerId } from "../../hooks/usePlayerId.ts"; +import { useSpectatorMode } from "../../hooks/useSpectatorMode.ts"; import { getKeywordDisplayText } from "../../viewmodel/keywordProps.ts"; interface StatusBadgeProps { @@ -477,15 +479,39 @@ export function UnboundedBadge({ }) { const { t } = useTranslation("game"); const resource = t(UNBOUNDED_FAMILY_LABEL_KEY[family]); + // Both hooks are called UNCONDITIONALLY, before any branch — rules of hooks. No render site + // changed: the badge resolves the viewer itself rather than taking it as a prop. + const viewer = usePlayerId(); + const spectating = useSpectatorMode(); // A `Committed` scheduled collapse is an accepted-but-unapplied bound, and N is named at the - // next step/phase end by the loop's CONTROLLER — who is not necessarily the seat this badge sits - // on. `Conditional` promises no bound at all, which is why it gets its own copy. The row is - // keyed by the engine's attribution player, which for `Life`/`DamageDealt`/`LibraryDelta`/ - // `Poison` axes is the victim, and the badge also renders on opponent HUDs. So the copy stays in - // the passive voice: a second-person promise here would be addressed to the wrong seat in both - // cases. Emitting the prompted seat is the engine's to add, and is owned by the follow-on PR. + // next step/phase end by the loop's CONTROLLER — who is NOT necessarily the seat this badge sits + // on: the row is keyed by the engine's attribution player, which for `Life`/`DamageDealt`/ + // `LibraryDelta`/`Poison` axes is the victim, and the badge also renders on opponent HUDs. The + // engine now publishes that controller as `state.data.prompted`, so the copy can address the + // seat that will actually be asked, and falls back to the passive voice for everyone else. + // `Conditional` promises no bound at all, which is why it keeps its own copy in both voices. // The window itself is CR 732.2c's advance to the shortcut's ending point; this only reports // what the engine says is pending. + // + // `usePlayerId()` is the RAW seat, mirroring `useTurnStatus`'s documented rule — `prompted` is a + // seat, so it compares against seat identity and NOT against `usePerspectivePlayerId()`, which + // returns the seat whose turn is being controlled. TWO BOUNDS ARE DISCLOSED, not fixed here: + // (i) under a turn-control effect where viewer V controls seat A's turn and A is prompted, V + // personally answers the prompt but reads the third-person copy. Conservative by + // construction — the same fallback the `prompted === undefined` case takes, and never a + // false "you". Closing it needs the engine to publish "seat X may submit for seat Y", + // which is a turn-control question, not a CR 732 one. + // (ii) `game::turns` raises ONE `PayAmountChoice` for the controller's WHOLE stash, so a + // tokens+counters+life collapse shows the second-person badge on THREE families for ONE + // joint count. The copy says "you'll name the count", which is true of every family that + // count collapses, rather than "you'll choose how many of these", which would not be. + // + // The spectator gate is REQUIRED, not defensive: `usePlayerId()` returns `PLAYER_ID` (0) in + // spectate mode — never `SPECTATOR_PLAYER_ID` — so a loop prompted to seat 0 would otherwise + // read "you'll name the count" to every spectator. `useSpectatorMode()`'s predicate is exactly + // the union of `useCanActForWaitingState`'s two spectator gates, so this badge is never more + // permissive than the submit authority it is describing. + const you = !spectating && state.type === "Scheduled" && state.data.prompted === viewer; const title = ((): string => { switch (state.type) { case "Unscheduled": @@ -493,9 +519,14 @@ export function UnboundedBadge({ case "Mixed": return t("badges.unboundedMixedTooltip", { resource }); case "Scheduled": - return state.data === "Committed" - ? t("badges.unboundedScheduledTooltip", { resource }) - : t("badges.unboundedConditionalTooltip", { resource }); + return state.data.certainty === "Committed" + ? t(you ? "badges.unboundedScheduledYouTooltip" : "badges.unboundedScheduledTooltip", { + resource, + }) + : t( + you ? "badges.unboundedConditionalYouTooltip" : "badges.unboundedConditionalTooltip", + { resource }, + ); } })(); return ( @@ -520,8 +551,10 @@ export function UnboundedBadge({ case "Unscheduled": case "Mixed": return "∞"; + // The GLYPH is not person-dependent: `∞→N` / `∞→?` says what will land, not who is + // asked. Only the tooltip changes voice. case "Scheduled": - return state.data === "Committed" + return state.data.certainty === "Committed" ? t("badges.unboundedScheduledGlyph") : t("badges.unboundedConditionalGlyph"); } diff --git a/client/src/components/hud/__tests__/UnboundedBadge.test.tsx b/client/src/components/hud/__tests__/UnboundedBadge.test.tsx index e2917f128e..a3746c3141 100644 --- a/client/src/components/hud/__tests__/UnboundedBadge.test.tsx +++ b/client/src/components/hud/__tests__/UnboundedBadge.test.tsx @@ -28,12 +28,19 @@ import tokenWire from "../../../test/fixtures/unbounded-token-wire.json"; import { PlayerHud } from "../PlayerHud.tsx"; const PLAIN_TOKENS = "Unbounded tokens (∞)"; -// Passive voice on purpose: the badge renders on opponent HUDs, and a victim-attributed axis puts -// it on the victim's seat while the loop's CONTROLLER is the one prompted to name N — so any -// second-person phrasing here is addressed to the wrong player. +// TWO VOICES, and which one renders is an engine fact, not a style choice. The engine publishes +// `state.data.prompted` — the loop's CONTROLLER, the seat that will be asked to name N. The badge +// says "you" only when that seat IS the viewer AND the viewer is not spectating; otherwise it +// keeps the passive voice, because the row is keyed by the ATTRIBUTION player, which for a +// victim-attributed axis is the victim, and the badge also renders on opponent HUDs. const COMMITTED_COUNTERS = "Unbounded counters (∞) — collapse pending; a finite amount will be chosen"; const CONDITIONAL_TOKENS = "Unbounded tokens (∞) — collapse pending; this may stay unbounded"; +const COMMITTED_COUNTERS_YOU = "Unbounded counters (∞) — collapse pending; you'll name the count"; +const CONDITIONAL_TOKENS_YOU = + "Unbounded tokens (∞) — collapse pending; this may stay unbounded, and you'll name the count if it doesn't"; +const COMMITTED_TOKENS_YOU = "Unbounded tokens (∞) — collapse pending; you'll name the count"; +const COMMITTED_TOKENS = "Unbounded tokens (∞) — collapse pending; a finite amount will be chosen"; const MIXED_COUNTERS = "Unbounded counters (∞) — part of this group has a pending collapse; part remains unbounded"; const PLAIN_COUNTERS = "Unbounded counters (∞)"; @@ -47,8 +54,10 @@ const fam = ( describe("UnboundedBadge + usePlayerDesignations", () => { beforeEach(() => { - useMultiplayerStore.setState({ activePlayerId: 0 }); - useGameStore.setState({ gameState: buildGameState() }); + useMultiplayerStore.setState({ activePlayerId: 0, isSpectator: false }); + // `gameMode` is reset explicitly because U8/U9/U10 set it, and a leaked `"spectate"` would + // silently suppress every second-person assertion in the rows that follow. + useGameStore.setState({ gameMode: null, gameState: buildGameState() }); }); afterEach(() => { @@ -68,9 +77,17 @@ describe("UnboundedBadge + usePlayerDesignations", () => { // engine frames, two different glyphs. A component that mapped every `Scheduled` to the // scheduled glyph passes the second half and fails the first; one that never renders `∞→N` // fails the second. + // + // BOTH LABELS ARE SECOND-PERSON, and the HONEST BOUND for that is worth stating: both goldens + // carry `prompted: 0`, and the default test viewer is seat 0, so this fixture pins "the viewer + // really is the seat that will be asked ⇒ address them" and NOTHING about the divergent case. + // It CANNOT witness a prompted seat that differs from the badge's seat — the token golden's + // only axis is `TokensCreated`, an aggregate axis that attributes to its own controller, so + // badge seat == prompted seat == viewer by construction. U8 composes the divergence, and the + // engine-side pin is `two_controllers_draining_one_victim_do_not_cross_schedule` arms B/C. seed(tokenWire as unknown as DerivedViews); expect(screen.getAllByLabelText(/Unbounded/)).toHaveLength(1); - const conditional = screen.getByLabelText(CONDITIONAL_TOKENS); + const conditional = screen.getByLabelText(CONDITIONAL_TOKENS_YOU); expect(conditional).toBeInTheDocument(); expect(conditional.textContent).toContain("∞→?"); expect(conditional.textContent).not.toContain("∞→N"); @@ -79,7 +96,7 @@ describe("UnboundedBadge + usePlayerDesignations", () => { // frame in the suite. cleanup(); seed(counterWire as unknown as DerivedViews); - const committed = screen.getByLabelText(COMMITTED_COUNTERS); + const committed = screen.getByLabelText(COMMITTED_COUNTERS_YOU); expect(committed).toBeInTheDocument(); expect(committed.textContent).toContain("∞→N"); }); @@ -103,10 +120,12 @@ describe("UnboundedBadge + usePlayerDesignations", () => { it("U3/families: the engine's rows are rendered one badge per family, unmodified", () => { // COMPOSED — no single golden frame carries two families. The point of the row is that the FE // performs no fold at all now: two engine rows in, two badges out, each with its own state. + // `prompted` is deliberately OMITTED on both rows: this row is about family fan-out, not about + // voice, and an omitted seat renders the third person for everyone (pinned by U9). seed({ unbounded_families: [ - fam("tokens", { type: "Scheduled", data: "Conditional" }), - fam("counters", { type: "Scheduled", data: "Committed" }), + fam("tokens", { type: "Scheduled", data: { certainty: "Conditional" } }), + fam("counters", { type: "Scheduled", data: { certainty: "Committed" } }), ], } as DerivedViews); expect(screen.getAllByLabelText(/Unbounded/)).toHaveLength(2); @@ -147,7 +166,7 @@ describe("UnboundedBadge + usePlayerDesignations", () => { // above are not satisfied by a component that renders a bare `∞` for everything. cleanup(); seed(counterWire as unknown as DerivedViews); - expect(screen.getByLabelText(COMMITTED_COUNTERS).textContent).toContain("∞→N"); + expect(screen.getByLabelText(COMMITTED_COUNTERS_YOU).textContent).toContain("∞→N"); }); it("U4/viewer: another seat's SCHEDULED family does not schedule this seat's badge", () => { @@ -158,7 +177,8 @@ describe("UnboundedBadge + usePlayerDesignations", () => { seed({ unbounded_families: [ fam("tokens", { type: "Unscheduled" }, 0), - fam("tokens", { type: "Scheduled", data: "Committed" }, 1), + // `prompted` omitted — this row tests the SEAT FILTER, not the voice. + fam("tokens", { type: "Scheduled", data: { certainty: "Committed" } }, 1), ], } as DerivedViews); expect(screen.getAllByLabelText(/Unbounded/)).toHaveLength(1); @@ -171,10 +191,75 @@ describe("UnboundedBadge + usePlayerDesignations", () => { cleanup(); seed({ unbounded_families: [ - fam("tokens", { type: "Scheduled", data: "Committed" }, 0), + fam("tokens", { type: "Scheduled", data: { certainty: "Committed" } }, 0), fam("tokens", { type: "Unscheduled" }, 1), ], } as DerivedViews); expect(screen.getByLabelText(/collapse pending; a finite amount will be chosen/)).toBeInTheDocument(); }); + + it("U8/agency: the badge addresses the prompted seat, and only the prompted seat", () => { + // COMPOSED, and a MATCHED PAIR inside one `it` so neither half can stand alone. Identical + // family row; the ONLY thing that changes is `prompted`. Reds from both sides: + // - delete the `you` branch ⇒ the second-person half below fails; + // - hardcode the second person ⇒ the third-person half below fails. + // + // Seat 2 is deliberately NOT a seat this viewer can be: the badge sits on seat 0's HUD while + // the engine says seat 2 will be asked. That is the divergent shape the goldens cannot + // produce, and it is exactly the case a naive "the badge is on my HUD, so it's my prompt" + // implementation gets wrong. + act(() => { + useGameStore.setState({ gameMode: "online" }); + useMultiplayerStore.setState({ activePlayerId: 0 }); + }); + seed({ + unbounded_families: [fam("tokens", { type: "Scheduled", data: { certainty: "Committed", prompted: 2 } }, 0)], + } as DerivedViews); + expect(screen.getByLabelText(COMMITTED_TOKENS)).toBeInTheDocument(); + expect(screen.queryByLabelText(COMMITTED_TOKENS_YOU)).toBeNull(); + + // MATCHED POSITIVE: same row, same viewer, prompted seat is now the viewer. + cleanup(); + seed({ + unbounded_families: [fam("tokens", { type: "Scheduled", data: { certainty: "Committed", prompted: 0 } }, 0)], + } as DerivedViews); + expect(screen.getByLabelText(COMMITTED_TOKENS_YOU)).toBeInTheDocument(); + expect(screen.queryByLabelText(COMMITTED_TOKENS)).toBeNull(); + }); + + it("U9/ambiguous: an omitted prompted seat reads third person even for the viewer", () => { + // COMPOSED. `prompted` is omitted when the family's scheduled axes name TWO OR MORE distinct + // seats (the engine's seat meet fell to ⊥) — never "nobody". One glyph cannot address two + // players, so the badge must fall back to the seat-neutral voice rather than pick a winner, + // and it must do so even though the viewer is one of the candidates. + act(() => { + useGameStore.setState({ gameMode: "online" }); + useMultiplayerStore.setState({ activePlayerId: 0 }); + }); + seed({ + unbounded_families: [fam("tokens", { type: "Scheduled", data: { certainty: "Committed" } }, 0)], + } as DerivedViews); + expect(screen.getByLabelText(COMMITTED_TOKENS)).toBeInTheDocument(); + expect(screen.queryByLabelText(COMMITTED_TOKENS_YOU)).toBeNull(); + }); + + it("U10/spectator: a spectator reads third person even when the prompted seat equals their resolved id", () => { + // COMPOSED, and this is the FALSE-POSITIVE GATE — the one error class this design must not + // have. `usePlayerId()` returns `PLAYER_ID` (0) in spectate mode, NOT `SPECTATOR_PLAYER_ID`, + // so a loop prompted to seat 0 resolves `prompted === viewer` for EVERY spectator watching. + // Only the `!spectating &&` conjunct stops the badge telling a spectator they will name the + // count. + // + // REVERT-PROBE: drop `!spectating &&` from the `you` predicate ⇒ this reds, because the + // equality it guards genuinely holds here. U8's second-person half is the matched positive + // proving the gate does not simply suppress every "you". + act(() => { + useGameStore.setState({ gameMode: "spectate" }); + }); + seed({ + unbounded_families: [fam("tokens", { type: "Scheduled", data: { certainty: "Committed", prompted: 0 } }, 0)], + } as DerivedViews); + expect(screen.getByLabelText(COMMITTED_TOKENS)).toBeInTheDocument(); + expect(screen.queryByLabelText(COMMITTED_TOKENS_YOU)).toBeNull(); + }); }); diff --git a/client/src/i18n/locales/de/game.json b/client/src/i18n/locales/de/game.json index c3d8bf47e2..da5d264659 100644 --- a/client/src/i18n/locales/de/game.json +++ b/client/src/i18n/locales/de/game.json @@ -485,8 +485,10 @@ "companion": "Gefährte", "unboundedTooltip": "Unbegrenzt: {{resource}} (∞)", "unboundedScheduledTooltip": "Unbegrenzt: {{resource}} (∞) — Auflösung steht aus; eine endliche Anzahl wird gewählt", + "unboundedScheduledYouTooltip": "Unbegrenzt: {{resource}} (∞) — Auflösung steht aus; du nennst die Anzahl", "unboundedScheduledGlyph": "∞→N", "unboundedConditionalTooltip": "Unbegrenzt: {{resource}} (∞) — Auflösung steht aus; dies kann unbegrenzt bleiben", + "unboundedConditionalYouTooltip": "Unbegrenzt: {{resource}} (∞) — Auflösung steht aus; dies kann unbegrenzt bleiben, und andernfalls nennst du die Anzahl", "unboundedMixedTooltip": "Unbegrenzt: {{resource}} (∞) — ein Teil dieser Gruppe hat eine ausstehende Auflösung; ein Teil bleibt unbegrenzt", "unboundedConditionalGlyph": "∞→?", "unboundedManaPoolMarker": "Unbegrenztes Mana (∞)", diff --git a/client/src/i18n/locales/en/game.json b/client/src/i18n/locales/en/game.json index 2a9b0a4294..5c9695141f 100644 --- a/client/src/i18n/locales/en/game.json +++ b/client/src/i18n/locales/en/game.json @@ -524,8 +524,10 @@ "companion": "Companion", "unboundedTooltip": "Unbounded {{resource}} (∞)", "unboundedScheduledTooltip": "Unbounded {{resource}} (∞) — collapse pending; a finite amount will be chosen", + "unboundedScheduledYouTooltip": "Unbounded {{resource}} (∞) — collapse pending; you'll name the count", "unboundedScheduledGlyph": "∞→N", "unboundedConditionalTooltip": "Unbounded {{resource}} (∞) — collapse pending; this may stay unbounded", + "unboundedConditionalYouTooltip": "Unbounded {{resource}} (∞) — collapse pending; this may stay unbounded, and you'll name the count if it doesn't", "unboundedMixedTooltip": "Unbounded {{resource}} (∞) — part of this group has a pending collapse; part remains unbounded", "unboundedConditionalGlyph": "∞→?", "unboundedManaPoolMarker": "Unbounded mana (∞)", diff --git a/client/src/i18n/locales/es/game.json b/client/src/i18n/locales/es/game.json index 4f0180628a..d730908c56 100644 --- a/client/src/i18n/locales/es/game.json +++ b/client/src/i18n/locales/es/game.json @@ -485,8 +485,10 @@ "companion": "Compañero", "unboundedTooltip": "{{resource}} ilimitado (∞)", "unboundedScheduledTooltip": "{{resource}} ilimitado (∞) — colapso pendiente; se elegirá una cantidad finita", + "unboundedScheduledYouTooltip": "{{resource}} ilimitado (∞) — colapso pendiente; tú indicarás la cantidad", "unboundedScheduledGlyph": "∞→N", "unboundedConditionalTooltip": "{{resource}} ilimitado (∞) — colapso pendiente; esto puede seguir siendo ilimitado", + "unboundedConditionalYouTooltip": "{{resource}} ilimitado (∞) — colapso pendiente; esto puede seguir siendo ilimitado y, si no, tú indicarás la cantidad", "unboundedMixedTooltip": "{{resource}} ilimitado (∞) — parte de este grupo tiene un colapso pendiente; parte sigue siendo ilimitada", "unboundedConditionalGlyph": "∞→?", "unboundedManaPoolMarker": "Maná ilimitado (∞)", diff --git a/client/src/i18n/locales/fr/game.json b/client/src/i18n/locales/fr/game.json index dbfb06eeff..43e97cd349 100644 --- a/client/src/i18n/locales/fr/game.json +++ b/client/src/i18n/locales/fr/game.json @@ -485,8 +485,10 @@ "companion": "Compagnon", "unboundedTooltip": "{{resource}} illimité (∞)", "unboundedScheduledTooltip": "{{resource}} illimité (∞) — réduction en attente ; un nombre fini sera choisi", + "unboundedScheduledYouTooltip": "{{resource}} illimité (∞) — réduction en attente ; vous indiquerez le nombre", "unboundedScheduledGlyph": "∞→N", "unboundedConditionalTooltip": "{{resource}} illimité (∞) — réduction en attente ; cela peut rester illimité", + "unboundedConditionalYouTooltip": "{{resource}} illimité (∞) — réduction en attente ; cela peut rester illimité, et sinon vous indiquerez le nombre", "unboundedMixedTooltip": "{{resource}} illimité (∞) — une partie de ce groupe a une réduction en attente ; une partie reste illimitée", "unboundedConditionalGlyph": "∞→?", "unboundedManaPoolMarker": "Mana illimité (∞)", diff --git a/client/src/i18n/locales/it/game.json b/client/src/i18n/locales/it/game.json index a1cf9bf479..e4fdc4bbdb 100644 --- a/client/src/i18n/locales/it/game.json +++ b/client/src/i18n/locales/it/game.json @@ -485,8 +485,10 @@ "companion": "Compagno", "unboundedTooltip": "{{resource}} illimitato (∞)", "unboundedScheduledTooltip": "{{resource}} illimitato (∞) — collasso in sospeso; verrà scelta una quantità finita", + "unboundedScheduledYouTooltip": "{{resource}} illimitato (∞) — collasso in sospeso; indicherai tu la quantità", "unboundedScheduledGlyph": "∞→N", "unboundedConditionalTooltip": "{{resource}} illimitato (∞) — collasso in sospeso; questo può restare illimitato", + "unboundedConditionalYouTooltip": "{{resource}} illimitato (∞) — collasso in sospeso; questo può restare illimitato e, in caso contrario, indicherai tu la quantità", "unboundedMixedTooltip": "{{resource}} illimitato (∞) — parte di questo gruppo ha un collasso in sospeso; parte resta illimitata", "unboundedConditionalGlyph": "∞→?", "unboundedManaPoolMarker": "Mana illimitato (∞)", diff --git a/client/src/i18n/locales/pl/game.json b/client/src/i18n/locales/pl/game.json index 223fdc491a..a497e8e47a 100644 --- a/client/src/i18n/locales/pl/game.json +++ b/client/src/i18n/locales/pl/game.json @@ -485,8 +485,10 @@ "companion": "Towarzysz", "unboundedTooltip": "Nieograniczone: {{resource}} (∞)", "unboundedScheduledTooltip": "Nieograniczone: {{resource}} (∞) — zwinięcie oczekuje; zostanie wybrana skończona liczba", + "unboundedScheduledYouTooltip": "Nieograniczone: {{resource}} (∞) — zwinięcie oczekuje; podasz liczbę", "unboundedScheduledGlyph": "∞→N", "unboundedConditionalTooltip": "Nieograniczone: {{resource}} (∞) — zwinięcie oczekuje; może pozostać nieograniczone", + "unboundedConditionalYouTooltip": "Nieograniczone: {{resource}} (∞) — zwinięcie oczekuje; może pozostać nieograniczone, a jeśli nie — podasz liczbę", "unboundedMixedTooltip": "Nieograniczone: {{resource}} (∞) — część tej grupy ma oczekujące zwinięcie; część pozostaje nieograniczona", "unboundedConditionalGlyph": "∞→?", "unboundedManaPoolMarker": "Nieograniczona mana (∞)", diff --git a/client/src/i18n/locales/pt/game.json b/client/src/i18n/locales/pt/game.json index b1527ace5e..22741211f8 100644 --- a/client/src/i18n/locales/pt/game.json +++ b/client/src/i18n/locales/pt/game.json @@ -485,8 +485,10 @@ "companion": "Companheiro", "unboundedTooltip": "{{resource}} ilimitado (∞)", "unboundedScheduledTooltip": "{{resource}} ilimitado (∞) — colapso pendente; será escolhida uma quantidade finita", + "unboundedScheduledYouTooltip": "{{resource}} ilimitado (∞) — colapso pendente; você indicará a quantidade", "unboundedScheduledGlyph": "∞→N", "unboundedConditionalTooltip": "{{resource}} ilimitado (∞) — colapso pendente; isto pode continuar ilimitado", + "unboundedConditionalYouTooltip": "{{resource}} ilimitado (∞) — colapso pendente; isto pode continuar ilimitado e, caso contrário, você indicará a quantidade", "unboundedMixedTooltip": "{{resource}} ilimitado (∞) — parte deste grupo tem um colapso pendente; parte continua ilimitada", "unboundedConditionalGlyph": "∞→?", "unboundedManaPoolMarker": "Mana ilimitada (∞)", diff --git a/client/src/test/fixtures/unbounded-counter-wire.json b/client/src/test/fixtures/unbounded-counter-wire.json index 0c4cff5916..354d100e5c 100644 --- a/client/src/test/fixtures/unbounded-counter-wire.json +++ b/client/src/test/fixtures/unbounded-counter-wire.json @@ -9,7 +9,10 @@ "family": "counters", "player": 0, "state": { - "data": "Committed", + "data": { + "certainty": "Committed", + "prompted": 0 + }, "type": "Scheduled" } } diff --git a/client/src/test/fixtures/unbounded-token-wire.json b/client/src/test/fixtures/unbounded-token-wire.json index 53b9415989..59a548e64c 100644 --- a/client/src/test/fixtures/unbounded-token-wire.json +++ b/client/src/test/fixtures/unbounded-token-wire.json @@ -4,7 +4,10 @@ "family": "tokens", "player": 0, "state": { - "data": "Conditional", + "data": { + "certainty": "Conditional", + "prompted": 0 + }, "type": "Scheduled" } } diff --git a/client/src/viewmodel/__tests__/unboundedWireSeam.test.ts b/client/src/viewmodel/__tests__/unboundedWireSeam.test.ts index dd3b687980..429535ee20 100644 --- a/client/src/viewmodel/__tests__/unboundedWireSeam.test.ts +++ b/client/src/viewmodel/__tests__/unboundedWireSeam.test.ts @@ -73,11 +73,31 @@ describe("unbounded ∞ wire seam (engine-emitted goldens)", () => { // - declined wire: the post-decline frame ⇒ Unscheduled, axis still ∞, promise withdrawn. // Certainty is the discriminator here: the first two are both "scheduled", and a projection // that collapsed them into one answer reds this row. + // + // EXHAUSTIVE OBJECT EQUALITY, not a property read, and that choice is the discriminator for + // `prompted`: `toEqual` on the whole row reds if the engine silently stops emitting the seat, + // whereas `expect(row.state.data.prompted).toBe(0)` would read `undefined` off a dropped field + // and... still pass on a golden regenerated without it. The seat is a real wire field, so it + // is pinned like one. + // + // HONEST BOUND: both goldens carry `prompted: 0`, and 0 is also the attributed seat, because + // each golden's single axis attributes to its own controller. So this file pins the ENCODING + // of the seat, never the divergence between the prompted seat and the badge's seat — that is + // `derived_views::tests::two_controllers_draining_one_victim_do_not_cross_schedule` arms B/C + // engine-side and `UnboundedBadge.test.tsx`'s U8 client-side. expect(tokenWire.unbounded_families).toEqual([ - { player: 0, family: "tokens", state: { type: "Scheduled", data: "Conditional" } }, + { + player: 0, + family: "tokens", + state: { type: "Scheduled", data: { certainty: "Conditional", prompted: 0 } }, + }, ]); expect(counterWire.unbounded_families).toEqual([ - { player: 0, family: "counters", state: { type: "Scheduled", data: "Committed" } }, + { + player: 0, + family: "counters", + state: { type: "Scheduled", data: { certainty: "Committed", prompted: 0 } }, + }, ]); expect(declinedWire.unbounded_families).toEqual([ { player: 0, family: "counters", state: { type: "Unscheduled" } }, diff --git a/crates/engine/src/analysis/resource.rs b/crates/engine/src/analysis/resource.rs index 86907cff62..68a0c66fe6 100644 --- a/crates/engine/src/analysis/resource.rs +++ b/crates/engine/src/analysis/resource.rs @@ -2959,9 +2959,13 @@ enum CounterGrowthDisposition { /// of the counter-growth cover (charge / burden / oil / quest)? This `match` IS the /// SINGLE-SOURCE per-`CounterType` classification table, WILDCARD-FREE by /// construction, so a new `CounterType` variant will not compile until it is -/// explicitly classified here. Shared by BOTH `classify_generic_counter_growth` (the -/// ω-cover direction gate) and `grown_generic_counter_targets` (the display -/// re-derivation) so the two can never drift out of lockstep. Kept in lockstep with +/// explicitly classified here. Scoped to the ω-COVER DIRECTION GATE alone +/// (`classify_generic_counter_growth`) — it is NOT the display partition. Sharing one +/// partition between the cover and the ∞ display channel WAS the bug: it made every +/// non-`Generic` beneficial counter loop (+1/+1, loyalty, defense) collapse correctly +/// while rendering no `∞` pill at all. The display and batched-collapse channels use +/// `counter_is_beneficial_materializable` instead, and the two partitions are now +/// deliberately different rather than accidentally shared. Kept in lockstep with /// `CounterType::is_monotone_loop_resource`, which governs the projection: monotone /// P/T / loyalty / defense counters are `project_out_resources`'d away, the /// non-`Generic` preserved counters gate SBAs/durations and so must compare @@ -3035,45 +3039,6 @@ fn classify_generic_counter_growth( } } -/// CR 122.1 + CR 701.34a + CR 732.2a: the per-object `(ObjectId, CounterType)` pairs -/// whose PRESERVED `Generic` counters STRICTLY GREW across one cycle (`current` vs -/// `prior`) — the concrete DISPLAY targets of an accepted counter-growth loop -/// (proliferate charge on Pentad Prism, burden on The One Ring). The offer -/// certificate's unbounded axis is object-AGNOSTIC (`Counter(Other, Other)`), so the -/// specific object id / counter type is NOT recoverable from the axis; this -/// re-derives them by diffing each SHARED object's growable counters — the display -/// analog of `classify_generic_counter_growth`, sharing its SAME wildcard-free -/// `generic_counter_is_growable` partition (single-source, so they can't drift). -/// -/// Iterates the CURRENT side only: strict growth requires `a > b >= 0`, so a grown -/// counter is necessarily present in `current`'s map — this both captures every -/// grown pair (no false negatives) and is duplicate-free (unlike a two-sided key -/// chain). An object absent from `prior` is caught by the object-set cover, not this -/// axis, so only SHARED objects contribute. DISPLAY-ONLY: the caller renders `∞` -/// from these pairs without mutating the real counter count (CR 701.34a still adds a -/// real counter each cycle; the `∞` is a render of the certified-unbounded loop). -pub(crate) fn grown_generic_counter_targets( - prior: &GameState, - current: &GameState, -) -> Vec<(ObjectId, CounterType)> { - let mut targets = Vec::new(); - for (id, co) in current.objects.iter() { - let Some(po) = prior.objects.get(id) else { - continue; - }; - for (ct, &a) in co.counters.iter() { - if !generic_counter_is_growable(ct) { - continue; - } - let b = po.counters.get(ct).copied().unwrap_or(0); - if a > b { - targets.push((*id, ct.clone())); - } - } - } - targets -} - /// CR 122.1 + CR 732.2a: the wildcard-free partition of `CounterType`s whose per-cycle /// growth is a BENEFICIAL persistent artifact materializable N×δ at the CR 500.5 boundary /// (the batched-collapse path). SEPARATE from `generic_counter_is_growable` (the cover @@ -3110,13 +3075,15 @@ pub(crate) fn counter_is_beneficial_materializable(ct: &CounterType) -> bool { } } -/// CR 122.1 + CR 732.2a: the per-object `(ObjectId, CounterType, delta)` triples whose -/// BENEFICIAL-materializable counters strictly grew across one accepted period (`current` -/// vs `prior`) — the batched-collapse δ source. The beneficial analog of -/// `grown_generic_counter_targets` (Generic-only for the DISPLAY channel); this widens to -/// +1/+1 / loyalty / defense via `counter_is_beneficial_materializable`. A CLONE, not a -/// refactor: the display/cover Generic partition must stay narrow. Iterates the CURRENT -/// side (strict growth ⇒ the grown counter is present in `current`); only SHARED objects +/// CR 122.1 + CR 732.2a: THE per-object counter derivation of an accepted period — the +/// `(ObjectId, CounterType, delta)` triples whose BENEFICIAL-materializable counters strictly +/// grew across it (`current` vs `prior`), feeding BOTH the batched-collapse δ stash AND (projected +/// to `(object, counter)`) the `∞` DISPLAY channel. ONE derivation, two consumers, so the pills +/// and the growth that lands cannot disagree; the display channel used to run its own Generic-only +/// diff, which is why beneficial non-`Generic` loops collapsed without ever rendering `∞`. +/// Partitioned by `counter_is_beneficial_materializable` (`Generic(_)` / +1/+1 / loyalty / +/// defense), deliberately WIDER than the ω-cover's `generic_counter_is_growable`. Iterates the +/// CURRENT side (strict growth ⇒ the grown counter is present in `current`); only SHARED objects /// contribute (a fresh object is caught by the object-set cover, not this axis). pub(crate) fn grown_beneficial_counter_deltas( prior: &GameState, diff --git a/crates/engine/src/game/derived_views.rs b/crates/engine/src/game/derived_views.rs index ac4b93afe4..ad574ff930 100644 --- a/crates/engine/src/game/derived_views.rs +++ b/crates/engine/src/game/derived_views.rs @@ -240,28 +240,62 @@ impl CollapseCertainty { pub enum FamilyCollapseState { Unscheduled, Mixed, - Scheduled(CollapseCertainty), + Scheduled { + certainty: CollapseCertainty, + /// CR 732.2a: the seat that will be asked to name the "specified number of times" when + /// this collapse cashes out — the loop's CONTROLLER, emitted because it is NOT + /// recoverable from [`UnboundedFamilyView::player`] (the ATTRIBUTION seat, which for + /// `Life`/`DamageDealt`/`LibraryDelta`/`Poison` is the VICTIM, who is never asked). + /// + /// `None` means the family's scheduled axes name TWO OR MORE distinct seats — never + /// "nobody", which this variant makes unrepresentable. One glyph cannot address two + /// players, so the badge falls back to the seat-neutral voice rather than picking a + /// winner. Witnessed by `two_controllers_draining_one_victim_do_not_cross_schedule`. + /// + /// SCOPE: `game::turns` raises ONE `PayAmountChoice` for the controller's WHOLE stash, so + /// a multi-family collapse names one count across several badges. The shipped copy says + /// "you'll name the count", which is true of each family that count collapses. + #[serde(default, skip_serializing_if = "Option::is_none")] + prompted: Option, + }, } impl FamilyCollapseState { - /// Join: `Scheduled(a) ⊔ Scheduled(b) = Scheduled(weaker)`, `Unscheduled ⊔ Scheduled(_) = - /// Mixed`, `Mixed` is top. Commutative + associative + idempotent because it IS a join — - /// load-bearing: the FE fold it replaces documented a last-wins order hazard, and its open - /// question ("what would make the over-report reachable") is settled here rather than avoided: - /// `Mixed` is REPRESENTABLE, so a mixed family renders a bare `∞` instead of a wrong `∞→N`. - /// Witnessed by `mixed_family_is_not_scheduled` and + /// Join: `Scheduled ⊔ Scheduled = Scheduled(weaker certainty, met seat)`, + /// `Unscheduled ⊔ Scheduled { .. } = Mixed`, `Mixed` is top. Commutative + associative + + /// idempotent because it IS a join — load-bearing: the FE fold it replaces documented a + /// last-wins order hazard, and its open question ("what would make the over-report + /// reachable") is settled here rather than avoided: `Mixed` is REPRESENTABLE, so a mixed + /// family renders a bare `∞` instead of a wrong `∞→N`. Witnessed by + /// `mixed_family_is_not_scheduled` and /// `two_controllers_draining_one_victim_do_not_cross_schedule`. /// + /// The seat meet is the flat-lattice meet on `Option` (⊥ = `None`): equal seats + /// agree, distinct seats fall to `None`. Idempotent, commutative and associative, so the fold + /// over a family's axes is order-independent for any number of members. The two + /// `Unscheduled × Scheduled` arms drop the seat STRUCTURALLY — a `Mixed` family names none. + /// /// No CR governs this — it is a join over a display projection, not a rules behavior /// (cf. `game/filter.rs`'s `context_free_prop_matches_face` Kleene `AnyOf` arm). fn merge(self, other: Self) -> Self { match (self, other) { (Self::Mixed, _) | (_, Self::Mixed) => Self::Mixed, (Self::Unscheduled, Self::Unscheduled) => Self::Unscheduled, - (Self::Unscheduled, Self::Scheduled(_)) | (Self::Scheduled(_), Self::Unscheduled) => { - Self::Mixed - } - (Self::Scheduled(a), Self::Scheduled(b)) => Self::Scheduled(a.weaker(b)), + (Self::Unscheduled, Self::Scheduled { .. }) + | (Self::Scheduled { .. }, Self::Unscheduled) => Self::Mixed, + ( + Self::Scheduled { + certainty: a, + prompted: p, + }, + Self::Scheduled { + certainty: b, + prompted: q, + }, + ) => Self::Scheduled { + certainty: a.weaker(b), + prompted: if p == q { p } else { None }, + }, } } } @@ -314,6 +348,22 @@ impl FamilyCollapseState { /// that join downstream is precisely the display-layer computation this channel exists to remove /// (see `CLAUDE.md`). `Mana(_)` is different in kind — its promise is false the moment it is made — /// and it is handled by exclusion upstream at `scheduled_display_axes`, not by this asymmetry. +/// +/// THE SECOND ASYMMETRY, ACROSS THE BOUNDARY RATHER THAN INSIDE THE WINDOW — disclosed, measured, +/// and deliberately kept. `∞` counter targets are registered for the whole beneficial-counter +/// partition, while a `DriveSequence` collapse names only the axes its own proposal carried. At the +/// boundary, `types::game_state::clear_collapsed_materializations` filters the registered pairs by +/// the collapsed axes and RE-INSERTS the survivors, and the counter-pill loop below is ungated on +/// `unbounded_resources` — so a registered pair whose derived axis was NOT in the driven collapse +/// keeps rendering `∞` on its own pill for one boundary after its family row is gone. The rules +/// state is untouched: that pair's axis was never collapsed, so per CR 732.2c nothing about it has +/// ended, and the axis-removal set and the `unbounded_loop_enablers` lockstep both move exactly as +/// they did before the widening. Fixing the pill by stripping unmatched pairs would trade this +/// display over-KEEP for a display over-DROP, which the subsystem's stated polarity forbids: it may +/// only ever leave an `∞` standing one boundary longer than it should, never hide a real one. +/// Pinned by `types::game_state`'s +/// `widened_counter_registration_survives_a_driven_collapse_without_moving_the_axis_set` and its +/// matched negative `a_counter_pair_on_the_driven_axis_is_dropped_at_the_boundary`. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct UnboundedFamilyView { pub player: PlayerId, @@ -549,13 +599,20 @@ pub struct DerivedViews { /// `unbounded_families` below); the frontend renders what it is handed. /// Empty (and omitted) in the dominant case where no loop is active. /// - /// NOT a straight projection of the mark: a TOKEN-axis row is withheld when its entire - /// registered pile has left the battlefield ([`object_growth_backing`]), so this can carry - /// FEWER axes than `GameState::unbounded_resources` marks. The mark and the accepted stash - /// are both unaffected by that — it is a display decision, never a cancellation of agreed - /// growth (CR 732.2c). A withheld row therefore does NOT mean the collapse was cancelled; + /// NOT a straight projection of the mark: an object-backed row (TOKEN axis, or a COUNTER axis + /// with registered targets) is withheld on TWO conjuncts, and both must hold — + /// + /// 1. the controller has NO accepted collapse for that axis ([`accepted_collapse_axes`]), and + /// 2. the axis' entire registered board backing has left the battlefield + /// ([`object_growth_backing`] answering `Some(false)`). + /// + /// so this can carry FEWER axes than `GameState::unbounded_resources` marks. Conjunct 1 is + /// CR 732.2c: once the last player accepts, the shortcut is TAKEN, so an agreed collapse is not + /// cancelled by its board backing dying afterwards — the growth still lands at the boundary and + /// the row keeps saying so. Conjunct 2 alone is a display decision, never a cancellation of + /// agreed growth. A withheld row therefore does NOT mean the collapse was cancelled; /// `pending_unbounded_materialization` still carries it and the boundary still applies it, - /// which `combo_infinite_pile::object_growth_infinity_row_dies_with_its_last_pile_member` + /// which `combo_infinite_pile::accepted_object_growth_row_survives_losing_its_entire_pile` /// asserts at the store level. #[serde(default, skip_serializing_if = "Vec::is_empty")] pub unbounded_resources: Vec, @@ -579,16 +636,21 @@ pub struct DerivedViews { pub unbounded_pile: Vec, /// CR 732.2a / CR 701.34a: the per-object `∞` COUNTER channel — for each - /// battlefield object, the counter types whose preserved `Generic` counters an + /// battlefield object, the counter types whose preserved BENEFICIAL counters an /// accepted counter-growth loop (proliferate charge on Pentad Prism, burden on - /// The One Ring) pumps unboundedly (projected from + /// The One Ring, a +1/+1 or loyalty pump loop) pumps unboundedly (projected from /// `GameState::unbounded_counter_targets`, filtered to objects still on the - /// battlefield). The counter analog of `unbounded_pile`: object-growth marks whole - /// objects, but a counter-growth loop's unbounded axis is object-agnostic, so this - /// keys the specific pumped counter so the frontend renders `∞` (not `×N`) on that - /// counter pill and nothing else. Keyed by ObjectId; DISPLAY-only (the real counter - /// count is unchanged). Public board state — no viewer filtering. Empty (and - /// omitted) when no counter-growth loop is active — the dominant case. + /// battlefield). Which counters qualify is + /// `analysis::resource::counter_is_beneficial_materializable`'s wildcard-free partition + /// (`Generic(_)`, `Plus1Plus1`, `Loyalty`, `Defense`), derived once by + /// `game::engine::current_period_counter_growth`. The counter analog of `unbounded_pile`: + /// object-growth marks whole objects, but a counter-growth loop's unbounded axis MAY be + /// object-agnostic (one accepted proposal can carry both an object-classed counter axis and + /// the display channel's `Counter(Other, Other)`), so this keys the specific pumped counter + /// so the frontend renders `∞` (not `×N`) on that counter pill and nothing else. Keyed by + /// ObjectId; DISPLAY-only (the real counter count is unchanged). Public board state — no + /// viewer filtering. Empty (and omitted) when no counter-growth loop is active — the + /// dominant case. #[serde(default, skip_serializing_if = "HashMap::is_empty")] pub unbounded_counters: HashMap>, } @@ -1166,6 +1228,13 @@ pub fn derive_views(state: &GameState, viewer: Option) -> DerivedViews // 4. "…and the schedule rides on each row as a `scheduled` flag" — falsified when that flag // was deleted. A per-FAMILY badge cannot render a per-ROW flag honestly: two same-family // axes that disagree need a third answer, which is what `FamilyCollapseState::Mixed` is. + // 5. "…and `object_growth_backing` refuses for `Counter(..)`, so only the token axis can + // lose a row" — falsified when that arm stopped reading the controller-keyed store WHOLE + // and started deriving each registered pair's own axis, which is an axis-scoped + // authority and therefore may revoke a counter row too. + // The gate itself reads the schedule for the first time, and it still does not FILTER by it: + // an accepted collapse can only ADD a row back that the backing check would have dropped + // (CR 732.2c — the shortcut is already taken), never remove one. // Naming WHO reads the schedule is a claim every future consumer can break; naming what the // schedule may not DO is not. The stores are not filtered either: // `unbounded_resources` keeps the mark until the boundary applies the growth. (`unbounded_loop_enablers` is held in @@ -1193,19 +1262,36 @@ pub fn derive_views(state: &GameState, viewer: Option) -> DerivedViews // downstream consumer (engine or frontend) can answer this correctly; two controllers // draining one victim would collide. This reads the ENGINE'S DEFERRAL STASH, which no CR // licenses (see `FamilyCollapseState`) — it is not a projection of CR 732.2c. - let scheduled_axes = scheduled_display_axes(state, controller); + let accepted_axes = accepted_collapse_axes(state, controller); + let scheduled_axes = scheduled_display_axes(&accepted_axes); for &axis in axes { // CR 732.2a + CR 110.1: an object-growth ∞ whose ENTIRE registered display set // has left the battlefield has no live board backing left — drop the row rather // than render an ∞ beside an already-empty ∞ pile. `None` (never registered a // backing set, e.g. a mana engine) keeps the badge; see `object_growth_backing` // for why that asymmetry is typed rather than collapsed into a bool. - if object_growth_backing(state, controller, axis) == Some(false) { + // + // CR 732.2c binds the shortcut the instant the last player accepts, so an agreed + // collapse is NOT cancelled by its board backing dying — its row survives the + // departure and keeps announcing the growth that will still land. The FACT set is + // read here, deliberately not the display-filtered one: `object_growth_backing` + // returns `None` for `Mana(_)` today, so the two happen to agree — an accident + // between two functions, not an invariant either of them states. + if !accepted_axes.contains_key(&axis) + && object_growth_backing(state, controller, axis) == Some(false) + { continue; } let player = attribution_player(axis, controller); let state_for_axis = match scheduled_axes.get(&axis) { - Some(&certainty) => FamilyCollapseState::Scheduled(certainty), + Some(&certainty) => FamilyCollapseState::Scheduled { + certainty, + // The prompted seat is THIS loop's controller, captured here, in the only + // scope that still knows it: one line below, `attribution_player` may + // replace `player` with the victim, and from that point the controller is + // unrecoverable. + prompted: Some(controller), + }, None => FamilyCollapseState::Unscheduled, }; families @@ -1243,7 +1329,8 @@ pub fn derive_views(state: &GameState, viewer: Option) -> DerivedViews } // CR 732.2a / CR 701.34a: project the accepted counter-growth loop's per-object ∞ - // counter targets — the objects whose PRESERVED Generic counters (charge / burden) + // counter targets — the objects whose PRESERVED BENEFICIAL counters (charge / burden / + // +1/+1 / loyalty / defense, per `analysis::resource::counter_is_beneficial_materializable`) // the certified-unbounded loop pumps each cycle — dropping any that have since left // the battlefield (stale member). Display-only per-object channel mirroring // `unbounded_pile`; the frontend renders `∞` (not `×N`) on any counter pill whose @@ -1390,22 +1477,58 @@ fn turn_order_views( (turn_order, viewer_turn_number) } -/// The axes `controller` has an accepted-but-unapplied collapse for, as the HUD should announce -/// them, each carrying how CERTAIN that collapse is. +/// CR 732.2c: THE FACT — the axes `controller` has an accepted, not-yet-applied collapse for. +/// +/// The KEYS are the fact (which axes an accepted collapse names). The VALUES are +/// `engine_resolution_choices::possible_hold`'s display encoding ([`CollapseCertainty`], typed as a +/// display promise by its own doc there), carried alongside because every consumer that needs the +/// fact also needs to know what may be promised about it. No display judgement is applied here — +/// that is [`scheduled_display_axes`]'s job, and the split is what keeps a RULES consumer (the row +/// loop's acceptance gate) from silently inheriting a DISPLAY exclusion. /// /// This reads the stash of growth in flight along CR 732.2c's advance to the proposal's ending /// point — a priority window per CR 732.2a, reached after the CR 500.5 boundary where the growth -/// lands. What it announces is therefore a real accepted result, not a parking spot; the reason it -/// announces CERTAINTY rather than a number is that the boundary re-checks whether the growth is +/// lands. What it reports is therefore a real accepted result, not a parking spot; the reason the +/// value is CERTAINTY rather than a number is that the boundary re-checks whether the growth is /// still observed and the controller names the count at the ending point (CR 732.2a). See -/// `FamilyCollapseState`, the `THE WINDOW'S TIMING IS CR 732.2c'S ADVANCE` block above, and +/// [`FamilyCollapseState`], the `THE WINDOW'S TIMING IS CR 732.2c'S ADVANCE` block above, and /// `types/game_state.rs`'s `scheduled_collapse_axes` doc for the reading. +fn accepted_collapse_axes( + state: &GameState, + controller: PlayerId, +) -> BTreeMap { + let mut axes: BTreeMap = BTreeMap::new(); + let Some(items) = state.pending_unbounded_materialization.get(&controller) else { + return axes; + }; + for item in items { + // Per ITEM, so each axis inherits the certainty of the kind that actually scheduled it; + // two items naming the same axis merge to the weaker answer. + let certainty = crate::game::engine_resolution_choices::materialization_certainty(item); + for axis in state.scheduled_collapse_axes(std::slice::from_ref(item)) { + axes.entry(axis) + .and_modify(|acc| *acc = acc.weaker(certainty)) + .or_insert(certainty); + } + } + axes +} + +/// THE ANNOUNCEMENT — the fact ([`accepted_collapse_axes`]) minus what the badge cannot honestly +/// promise, as the HUD should announce it, each axis carrying how CERTAIN that collapse is. +/// +/// Takes the fact BY REFERENCE rather than re-deriving it: the signature is the guarantee that no +/// caller can compute one without holding the other, so the two cannot drift into agreeing by +/// coincidence. The `Mana(_)` exclusion below is the ONLY display judgement in the pair, which is +/// what makes the FACT/ANNOUNCEMENT split meaningful at all. /// /// Named rather than inlined into its one caller because the SCOPE LIMIT below is a rule, not a /// line of the row loop, and it has already proved it drifts when written twice: an earlier cut of /// this change had a second consumer (a `scheduled_collapse` tag channel, since removed for having /// no reader) and the guard lived in that consumer alone, so mana rows shipped flagged while the -/// tag omitted them. Any future second consumer calls THIS, and inherits the limit. +/// tag omitted them. Any future second consumer calls THIS, and inherits the limit; a consumer that +/// needs the unfiltered rules answer calls [`accepted_collapse_axes`] instead, and the type it asks +/// for says which of the two it got. /// /// SCOPE LIMIT — `Mana(_)` is excluded. This is about what the badge would TELL the player, not /// about which code path ends the axis, and it is scoped to THE WINDOW THE BADGE RENDERS IN @@ -1446,26 +1569,10 @@ fn turn_order_views( /// seats, which that clear excludes.) The badge still must not promise a bound the player's /// spendable pool never had. fn scheduled_display_axes( - state: &GameState, - controller: PlayerId, + accepted: &BTreeMap, ) -> BTreeMap { - let mut axes: BTreeMap = BTreeMap::new(); - let Some(items) = state.pending_unbounded_materialization.get(&controller) else { - return axes; - }; - for item in items { - // Per ITEM, so each axis inherits the certainty of the kind that actually scheduled it; - // two items naming the same axis merge to the weaker answer. - let certainty = crate::game::engine_resolution_choices::materialization_certainty(item); - for axis in state.scheduled_collapse_axes(std::slice::from_ref(item)) { - if matches!(axis, ResourceAxis::Mana(_)) { - continue; - } - axes.entry(axis) - .and_modify(|acc| *acc = acc.weaker(certainty)) - .or_insert(certainty); - } - } + let mut axes = accepted.clone(); + axes.retain(|axis, _| !matches!(axis, ResourceAxis::Mana(_))); axes } @@ -1532,32 +1639,39 @@ fn attribution_player(axis: ResourceAxis, controller: PlayerId) -> PlayerId { /// `state.battlefield.contains` test at MEMBER level; this is its SET-level closure, so all /// three read the same board in the same frame and none can be staler than another. /// -/// GRANULARITY — the rule that decides which axes may consult a backing store at all: +/// GRANULARITY — the rule that decides how an axis may consult a backing store: /// -/// > A CONTROLLER-keyed backing store can answer an AXIS-scoped question if and only if the -/// > axis is a UNIT variant. +/// > A CONTROLLER-keyed backing store can be READ AS an axis' backing if and only if the axis is +/// > a UNIT variant. A DATA variant must derive its axis from each stored ELEMENT. /// /// `TokensCreated` is a unit variant, so a controller can hold at most one of it and /// `unbounded_loop_pile[controller]` IS that axis' backing — a bijection, no granularity is /// assumed that the store does not have. `Counter(CounterClass, ObjectClass)` is a DATA -/// variant: `mark_unbounded_loop` unions arbitrarily many per controller (`entry.extend`), so a -/// controller-keyed store is strictly coarser than the axis, and it returns `None` here. +/// variant: `mark_unbounded_loop` unions arbitrarily many per controller (`entry.extend`), so +/// the controller-keyed store is strictly coarser than the axis and must NOT be read whole. +/// It is read per ELEMENT instead — each stored `(ObjectId, CounterType)` pair derives its own +/// axis through `types::game_state::collapsed_counter_axis`, and only the pairs matching THIS +/// axis answer for it. /// -/// An earlier revision of this function did read `unbounded_counter_targets` for `Counter(..)`, -/// and its doc claimed the error direction was safe — "over-KEEPS a badge, never over-drops -/// one". That was FALSE, and measured so: one accepted proposal can carry both +/// An earlier revision of this function read `unbounded_counter_targets` WHOLE for +/// `Counter(..)`, and its doc claimed the error direction was safe — "over-KEEPS a badge, never +/// over-drops one". That was FALSE, and measured so: one accepted proposal can carry both /// `Counter(Plus1Plus1, Creature)` (`analysis::corpus`'s `ResourceFamily::Counters`) and the /// display channel's object-agnostic `Counter(Other, Other)`, while only the latter's targets /// are ever registered — so when those targets left the battlefield the guard dropped EVERY -/// counter row, including the one whose backing it had never consulted. +/// counter row, including the one whose backing it had never consulted. The per-element +/// derivation is what fixes that: a row is revoked only by the departure of pairs that derive +/// ITS axis, and an axis with no registered pair at all answers `None` (badge kept), never +/// `Some(false)`. Re-keying the store by `(controller, ResourceAxis)` would have asserted a +/// scope the derivation does not have; deriving per element asserts none. /// -/// Re-keying the store by `(controller, ResourceAxis)` would not fix it. The targets are -/// axis-blind at the DERIVATION, not just at the key: `register_unbounded_counter_targets` is -/// fed by `game::engine::current_period_counter_targets` → -/// `analysis::resource::grown_generic_counter_targets`, which takes no axis argument and -/// returns one undifferentiated `Generic`-only set for the whole proposal. A per-axis key would -/// assert a scope nothing derives. Revoking a counter row needs an axis-scoped authority to -/// exist first; until one does, this refuses rather than guesses. +/// CR 400.7 — the FAIL-OPEN direction, stated because it is a design choice and not an +/// accident: the pair is snapshotted at accept, but the axis it derives to is LIVE +/// (`collapsed_counter_axis` reads `state.objects` on every projection). A bearer that ceased to +/// exist derives `Counter(_, Other)`, which matches no registered pair for this axis, so nothing +/// answers, and the answer is `None` — the badge is KEPT. Every drift in this bridge therefore +/// leaves an `∞` standing one boundary too long; none can hide a real one. Witnessed by +/// `bridge_drift_on_cease_to_exist_fails_open`. /// /// Read-only: recomputed from live state on every `derive_views` call, nothing is stored, /// so nothing can go stale. Deliberately not a `clear_unbounded_loop` from the zone-exit @@ -1578,16 +1692,30 @@ fn object_growth_backing( .unbounded_loop_pile .get(&controller) .map(|pile| pile.iter().any(|id| state.battlefield.contains(id))), + // CR 122.1: a counter is a marker ON AN OBJECT, so the counter axis' backing is the set + // of registered `(ObjectId, CounterType)` pairs that derive THIS axis — not the whole + // controller-keyed store (GRANULARITY, above). `?` on the lookup: a controller that + // never registered any target has no live authority to consult ⇒ `None` ⇒ badge kept. + ResourceAxis::Counter(..) => { + let targets = state.unbounded_counter_targets.get(&controller)?; + let mut any_for_axis = false; + let mut any_live = false; + for (id, ct) in targets { + if crate::types::game_state::collapsed_counter_axis(state, *id, ct) != axis { + continue; + } + any_for_axis = true; + any_live |= state.battlefield.contains(id); + } + // No pair derives this axis ⇒ nothing registered a backing FOR IT ⇒ `None`, not + // `Some(false)`. That is the CR 400.7 fail-open in one expression. + any_for_axis.then_some(any_live) + } // No registered board backing exists for these axes — no live authority to consult, // badge unchanged. Exhaustive on purpose: a future ResourceAxis variant must decide // which side it lands on rather than silently defaulting to "unbacked"; the // unit-variant rule in this function's doc is the criterion for choosing. - // - // `Counter(..)` is here rather than reading `unbounded_counter_targets` because that - // store cannot answer a per-axis question — see the GRANULARITY note above. Witnessed - // by `counter_rows_are_not_revoked_by_a_controller_keyed_backing_set`. - ResourceAxis::Counter(..) - | ResourceAxis::Mana(_) + ResourceAxis::Mana(_) | ResourceAxis::Life(_) | ResourceAxis::DamageDealt(_) | ResourceAxis::LibraryDelta(_) @@ -2155,27 +2283,38 @@ mod tests { ); } - /// A controller-keyed backing store can answer an axis-scoped question only when the axis is - /// a UNIT variant. `TokensCreated` is one — at most one per controller, so - /// `unbounded_loop_pile[controller]` IS that axis' backing. `Counter(CounterClass, - /// ObjectClass)` is not: `mark_unbounded_loop` unions arbitrary axes for one controller, and - /// the backing derivation (`current_period_counter_targets` → `grown_generic_counter_targets`) - /// accepts NO axis — it diffs every shared object's growable `Generic` counters and returns - /// ONE undifferentiated set for the whole proposal. + /// Counter-row revocation is AXIS-SCOPED: the departure of a registered pair may revoke the + /// axis THAT PAIR DERIVES, and no other. + /// + /// A controller-keyed backing store may be read WHOLE only when the axis is a UNIT variant. + /// `TokensCreated` is one — at most one per controller, so `unbounded_loop_pile[controller]` + /// IS that axis' backing. `Counter(CounterClass, ObjectClass)` is not: `mark_unbounded_loop` + /// unions arbitrary axes for one controller, so the store is strictly coarser than the axis + /// and is read PER ELEMENT instead — each registered `(ObjectId, CounterType)` derives its own + /// axis through `types::game_state::collapsed_counter_axis`. /// - /// So the controller-keyed `Some(false)` this PR first shipped revoked EVERY counter row at - /// once, including axes whose backing was never in that set: a certified proposal can carry - /// both `Counter(Plus1Plus1, Creature)` (`analysis::corpus`'s `ResourceFamily::Counters`) and - /// the display channel's object-agnostic `Counter(Other, Other)`, while only the latter's - /// Generic targets are ever registered. That is an over-DROP — the opposite of the - /// "conservative, over-keeps only" claim the first revision shipped with. + /// Both wrong answers this fixture rules out are real revisions of this code. The + /// controller-keyed `Some(false)` originally shipped here revoked EVERY counter row at once, + /// including axes whose backing was never in that set: a certified proposal can carry both + /// `Counter(Plus1Plus1, Creature)` (`analysis::corpus`'s `ResourceFamily::Counters`) and the + /// display channel's object-agnostic `Counter(Other, Other)`, while only the latter's targets + /// are ever registered. Refusing entirely (`None` for every `Counter(..)`) is the opposite + /// error: the departed axis keeps a badge it has no backing for. /// - /// Two-sided on ONE assertion (are both rows on the wire?): restoring the controller-keyed - /// `Some(false)` arm reds the SUBJECT — both rows vanish, including the axis whose backing was - /// never consulted. The CONTROL runs FIRST as the non-vacuity anchor: it proves this wire can - /// carry two counter rows at all, which a "rows survived" assertion alone cannot establish. + /// Two-sided on ONE assertion pair: reverting the arm to `None` reds "Generic gone"; dropping + /// the per-pair `collapsed_counter_axis` filter — i.e. exactly the original axis-blind code — + /// reds "Plus1Plus1 survives". The CONTROL runs FIRST as the non-vacuity anchor: it proves + /// this wire can carry two counter rows at all, which a "rows survived" assertion alone cannot + /// establish. + /// + /// CONTRACT — NOT REACHABLE AT ACCEPT, which is a narrower claim than "production cannot build + /// it". At accept both writes happen in one `materialize_object_growth_shortcut` body, so a + /// registered backing with no stash is both-or-neither there. POST-boundary it IS producible: + /// `take_pending_materialization` drops the stash while `clear_collapsed_materializations` can + /// re-insert surviving targets. The rig is hand-built because the accept-time shape is the one + /// being excluded, not because the state is unreachable. #[test] - fn counter_rows_are_not_revoked_by_a_controller_keyed_backing_set() { + fn counter_row_revocation_is_axis_scoped() { use crate::analysis::resource::{CounterClass, ObjectClass, ResourceAxis}; use crate::game::zones::move_to_zone; use crate::types::counter::CounterType; @@ -2231,9 +2370,270 @@ mod tests { ); let subject_rows = rows(&subject); assert!( - subject_rows.contains(&plus1_axis) && subject_rows.contains(&generic_axis), - "THE assertion (subject): a controller-keyed backing set must not revoke ANY counter \ - row — least of all `plus1_axis`, whose backing was never registered, got {subject_rows:?}" + !subject_rows.contains(&generic_axis), + "THE assertion (subject, half 1): the departed pair derives `generic_axis`, so THAT \ + row loses its live backing and is revoked, got {subject_rows:?}" + ); + assert!( + subject_rows.contains(&plus1_axis), + "THE assertion (subject, half 2): NO registered pair derives `plus1_axis`, so nothing \ + answers for it and the badge is kept — an axis-blind guard would drop it too, got \ + {subject_rows:?}" + ); + } + + /// CR 732.2c: once the last player accepts, the shortcut IS TAKEN — so an accepted TOKEN + /// collapse keeps its `∞` row even after its entire registered pile has left the battlefield. + /// The growth still lands at the boundary, and a row that vanished first would have the HUD + /// deny a result the table already agreed to. + /// + /// Three arms, and the third is what stops the second from being vacuous: + /// - REACH: the backing check really answers `Some(false)` on this rig, so the gate's second + /// conjunct is live and the row survival below is decided by the FIRST conjunct. + /// - SUBJECT: with a stash, the row is present. + /// - NON-VACUITY: same departure, NO stash ⇒ the row must DIE. Without it, "the row survived" + /// would also pass against a projection that never revokes anything. + /// + /// REVERT-PROBE: drop `!accepted_axes.contains_key(&axis)` from the gate ⇒ the SUBJECT arm + /// reds. (Dropping a negated restricting conjunct makes the `continue` fire MORE often, so + /// rows are dropped MORE and a PRESENCE assertion is what flips; the NON-VACUITY arm stays + /// green, since its `accepted_axes` is empty either way.) + #[test] + fn an_accepted_token_collapse_keeps_its_row_when_its_pile_dies() { + use crate::game::zones::move_to_zone; + use crate::types::events::GameEvent; + use crate::types::game_state::PersistentAxisMaterialization; + + let p0 = PlayerId(0); + let build = |accepted: bool| { + let mut state = GameState::new(FormatConfig::standard(), 2, 42); + let token = create_object( + &mut state, + CardId(1), + p0, + "Saproling".to_string(), + Zone::Battlefield, + ); + state.mark_unbounded_loop(p0, &[ResourceAxis::TokensCreated]); + state.register_unbounded_loop_pile(p0, BTreeSet::from([token])); + if accepted { + state.register_pending_materialization( + p0, + PersistentAxisMaterialization::Tokens(family_test_token_profile()), + ); + } + let mut events: Vec = Vec::new(); + move_to_zone(&mut state, token, Zone::Graveyard, &mut events); + assert!( + !state.battlefield.contains(&token), + "precondition: the whole registered pile really left the battlefield" + ); + state + }; + + let has_token_row = |state: &GameState| -> bool { + derive_views(state, Some(p0)) + .unbounded_resources + .iter() + .any(|r| r.axis == ResourceAxis::TokensCreated) + }; + + // REACH: the backing authority answers `Some(false)` — the gate's second conjunct is TRUE + // on this rig, so nothing below is decided by an inert check. + let subject = build(true); + assert_eq!( + object_growth_backing(&subject, p0, ResourceAxis::TokensCreated), + Some(false), + "reach: the pile is registered and entirely gone, so the backing check says so" + ); + + // SUBJECT: an accepted collapse keeps the row anyway (CR 732.2c). + assert!( + has_token_row(&subject), + "an ACCEPTED token collapse keeps its ∞ row when its pile dies — the growth still \ + lands at the boundary" + ); + + // NON-VACUITY: the identical departure without a stash must drop the row. + assert!( + !has_token_row(&build(false)), + "with NO accepted collapse the same dead pile revokes the row — otherwise the arm \ + above measures a projection that never revokes anything" + ); + } + + /// The same CR 732.2c acceptance gate, through the OTHER `object_growth_backing` arm: an + /// accepted COUNTER collapse keeps its row when every registered target has left the + /// battlefield. + /// + /// Carries two extra pins the token twin does not need, because the counter arm derives its + /// backing per element rather than reading a store whole: + /// - the `collapsed_counter_axis` REACH pin, so every later assertion is provably about the + /// axis this rig actually registers a pair for; + /// - `object_growth_backing(..) == Some(true)` while the bearer is alive. That is the V4 + /// discriminator: an arm that was never implemented (or reverted to `None`) reds HERE, which + /// is what stops "the row survived" from being vacuous — a `None` arm keeps every row too. + #[test] + fn an_accepted_counter_collapse_keeps_its_row_when_its_targets_die() { + use crate::game::zones::move_to_zone; + use crate::types::counter::CounterType; + use crate::types::events::GameEvent; + use crate::types::game_state::{ + collapsed_counter_axis, CounterGrowth, PersistentAxisMaterialization, + }; + + let p0 = PlayerId(0); + let charge = CounterType::Generic("charge".to_string()); + let build = |accepted: bool| { + let mut state = GameState::new(FormatConfig::standard(), 2, 42); + let prism = create_object( + &mut state, + CardId(1), + p0, + "Pentad Prism".to_string(), + Zone::Battlefield, + ); + let axis = collapsed_counter_axis(&state, prism, &charge); + state.mark_unbounded_loop(p0, &[axis]); + state.register_unbounded_counter_targets(p0, vec![(prism, charge.clone())]); + if accepted { + state.register_pending_materialization( + p0, + PersistentAxisMaterialization::Counters(vec![CounterGrowth { + object: prism, + counter: charge.clone(), + per_cycle_delta: 1, + }]), + ); + } + (state, prism, axis) + }; + + let has_axis_row = |state: &GameState, axis: ResourceAxis| -> bool { + derive_views(state, Some(p0)) + .unbounded_resources + .iter() + .any(|r| r.axis == axis) + }; + + // REACH (a): the registered pair really derives the marked axis. + let (mut subject, prism, axis) = build(true); + assert_eq!( + collapsed_counter_axis(&subject, prism, &charge), + axis, + "reach: the registered pair derives the axis this test is about" + ); + // REACH (b): the counter arm ANSWERS, and answers positively while the bearer is alive. + // A `None` (never-implemented) arm reds here. + assert_eq!( + object_growth_backing(&subject, p0, axis), + Some(true), + "reach: the Counter(..) arm consults the registered pairs and finds a live one" + ); + + let mut events: Vec = Vec::new(); + move_to_zone(&mut subject, prism, Zone::Graveyard, &mut events); + assert_eq!( + object_growth_backing(&subject, p0, axis), + Some(false), + "reach: with the only registered bearer gone the arm says the backing is dead — the \ + gate's second conjunct is live" + ); + + // SUBJECT: the accepted collapse keeps the row anyway. + assert!( + has_axis_row(&subject, axis), + "an ACCEPTED counter collapse keeps its ∞ row when its targets die" + ); + + // NON-VACUITY: identical departure, no stash ⇒ the row dies. + let (mut control, control_prism, control_axis) = build(false); + let mut control_events: Vec = Vec::new(); + move_to_zone( + &mut control, + control_prism, + Zone::Graveyard, + &mut control_events, + ); + assert!( + !has_axis_row(&control, control_axis), + "with NO accepted collapse the same dead target revokes the counter row" + ); + } + + /// CR 400.7: an object that ceases to exist has no characteristics to read, so + /// `collapsed_counter_axis` falls back to `ObjectClass::Other` and the registered pair stops + /// deriving the axis it was registered under. The arm must then answer `None` (badge KEPT), + /// never `Some(false)` (badge dropped) — every drift in this bridge fails OPEN. + /// + /// THE BEARER MUST BE A CREATURE, and that requirement is load-bearing rather than flavour: + /// `GameObject::new` sets `card_types: CardType::default()`, i.e. EMPTY `core_types`, which + /// already derives `ObjectClass::Other` while the object is alive. On such a bearer removing + /// the object changes nothing about the derived axis and the drift is invisible — the test + /// would pass vacuously. The `core_types` assignment below is what makes the pre-drift and + /// post-drift axes differ at all. + /// + /// BASELINE arm (the paired positive): before the drift the arm answers `Some(false)`, so the + /// revocation really was ON and the `None` below is a change, not a constant. + /// + /// REVERT-PROBE: replace `any_for_axis.then_some(any_live)` with `Some(any_live)` ⇒ the + /// post-drift assertion reds with `Some(false)`, while the BASELINE arm stays green. + #[test] + fn bridge_drift_on_cease_to_exist_fails_open() { + use crate::analysis::resource::{CounterClass, ObjectClass}; + use crate::game::game_object::GameObject; + use crate::game::zones::move_to_zone; + use crate::types::counter::CounterType; + use crate::types::events::GameEvent; + + let p0 = PlayerId(0); + let mut state = GameState::new(FormatConfig::standard(), 2, 42); + let bearer = ObjectId(10); + let mut creature = GameObject::new( + bearer, + CardId(10), + p0, + "Beast".to_string(), + Zone::Battlefield, + ); + // MANDATORY — see the doc above. Without this the bearer is already `Other` while alive. + creature.card_types.core_types = vec![CoreType::Creature]; + state.objects.insert(bearer, creature); + state.battlefield.push_back(bearer); + + let axis = ResourceAxis::Counter(CounterClass::Plus1Plus1, ObjectClass::Creature); + assert_eq!( + crate::types::game_state::collapsed_counter_axis( + &state, + bearer, + &CounterType::Plus1Plus1 + ), + axis, + "reach: a CREATURE bearer derives the Creature-classed axis — if this is `Other` the \ + rig lost its core_types and the drift below would be invisible" + ); + state.mark_unbounded_loop(p0, &[axis]); + state.register_unbounded_counter_targets(p0, vec![(bearer, CounterType::Plus1Plus1)]); + + // BASELINE: the bearer leaves the battlefield but still EXISTS, so it still derives the + // Creature-classed axis and the revocation is genuinely ON. + let mut events: Vec = Vec::new(); + move_to_zone(&mut state, bearer, Zone::Graveyard, &mut events); + assert_eq!( + object_growth_backing(&state, p0, axis), + Some(false), + "baseline: an existing-but-departed bearer still derives this axis, so the arm \ + revokes — the paired positive proving the `None` below is a CHANGE" + ); + + // DRIFT: CR 400.7 cease-to-exist. The object is gone from `state.objects` entirely. + state.objects.remove(&bearer); + assert_eq!( + object_growth_backing(&state, p0, axis), + None, + "CR 400.7 fail-open: a ceased-to-exist bearer derives Counter(_, Other), which matches \ + no registered pair for this axis, so NOTHING answers and the badge is kept. \ + `Some(false)` here would hide a real ∞" ); } @@ -4080,6 +4480,14 @@ mod tests { never consulting the stash would say Unscheduled; got {:?}", life_rows[0] ); + // ARM A's seat half: a `Mixed` family names NO seat, structurally. The seat lives inside + // `Scheduled`, so this is unrepresentable rather than merely absent — asserted anyway, + // because a future sibling field beside `state` would make it representable again. + assert!( + !matches!(life_rows[0].state, FamilyCollapseState::Scheduled { .. }), + "a Mixed family carries no prompted seat at all, got {:?}", + life_rows[0] + ); // CROSS-CHECK AGAINST THE CONTRACT'S OWN AUTHORITY, not against a second wire channel. // `pending_unbounded_materialization` is what the boundary reads to cash the collapse out, @@ -4097,6 +4505,86 @@ mod tests { vec![p1], "the accepted-collapse contract names exactly P1 for this axis, got {accepted:?}" ); + + // Arms B and C share a rig with arm A's: same three seats, same victim-attributed axis, + // and they differ only in WHO marked and WHO accepted. `life_family_state` reads the one + // badge the victim's life family produces. + let life_family_state = |state: &GameState| -> FamilyCollapseState { + let rows: Vec = derive_views(state, Some(victim)) + .unbounded_families + .into_iter() + .filter(|f| f.player == victim && f.family == UnboundedFamily::Life) + .collect(); + assert_eq!( + rows.len(), + 1, + "one badge per (seat, family) in every arm, got {rows:?}" + ); + rows[0].state + }; + + // ARM B — DISAGREEMENT. Both controllers mark AND both accept, so the victim's one life + // family is genuinely scheduled by TWO distinct seats. One glyph cannot address two + // players, so the seat meets to ⊥. `None` here means "two or more seats", never "nobody". + // MUTATION: make the seat meet last-wins (`prompted: q`) ⇒ this reds with `Some(p0)` or + // `Some(p1)` depending on iteration order — which is exactly the order-dependence the join + // laws exist to forbid. + let mut both = GameState::new(FormatConfig::commander(), 3, 42); + both.mark_unbounded_loop(p0, &[axis]); + both.mark_unbounded_loop(p1, &[axis]); + for controller in [p0, p1] { + both.register_pending_materialization( + controller, + PersistentAxisMaterialization::Life { + player: victim, + per_cycle_delta: 1, + }, + ); + } + assert_eq!( + life_family_state(&both), + FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Conditional, + prompted: None, + }, + "two controllers with accepted collapses on one victim's life family name two seats, \ + so the badge falls back to the seat-neutral voice" + ); + + // ARM C — AGREEMENT, and the MATCHED POSITIVE for arm B. Without it an implementation that + // returned `prompted: None` unconditionally would pass B. This is also the ONE fixture + // shape where the prompted seat and the attributed seat are provably DIFFERENT players: + // the badge sits on the victim's HUD (CR 119.3 + CR 704.5a) while CR 732.2a asks the + // CONTROLLER for the count. + // MUTATION: emit `player` (the attribution seat) instead of `controller` ⇒ the `assert_ne!` + // below reds, because on this rig `player` IS the victim. + let mut agreed = GameState::new(FormatConfig::commander(), 3, 42); + agreed.mark_unbounded_loop(p1, &[axis]); + agreed.register_pending_materialization( + p1, + PersistentAxisMaterialization::Life { + player: victim, + per_cycle_delta: 1, + }, + ); + let agreed_state = life_family_state(&agreed); + assert_eq!( + agreed_state, + FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Conditional, + prompted: Some(p1), + }, + "one controller, one accepted collapse ⇒ the badge names THAT controller" + ); + let FamilyCollapseState::Scheduled { prompted, .. } = agreed_state else { + panic!("arm C just asserted this is Scheduled"); + }; + assert_ne!( + prompted, + Some(victim), + "the prompted seat is the CONTROLLER, never the attributed victim — the victim is \ + never asked to name the count" + ); } /// PR-6 test 1: a REAL opponent-burn certificate's axes project into victim-HUD @@ -4271,7 +4759,13 @@ mod tests { .contains(&UnboundedFamilyView { player: PlayerId(0), family: UnboundedFamily::Tokens, - state: FamilyCollapseState::Scheduled(CollapseCertainty::Conditional), + state: FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Conditional, + // The controller IS the attributed seat for an aggregate axis, so this + // fixture cannot tell the two apart — the divergent case is + // `two_controllers_draining_one_victim_do_not_cross_schedule`. + prompted: Some(PlayerId(0)), + }, }), "an accepted Tokens collapse is Scheduled(Conditional) — never Committed; got {:?}", scheduled_views.unbounded_families @@ -4386,7 +4880,10 @@ mod tests { ); assert_eq!( scheduled_rows[0].state, - FamilyCollapseState::Scheduled(CollapseCertainty::Conditional), + FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Conditional, + prompted: Some(p0), + }, "matched positive: with no unscheduled sibling the counters family IS scheduled, and \ a batched Counters collapse is Conditional; got {:?}", scheduled_rows[0] @@ -4544,13 +5041,35 @@ mod tests { /// /// MUTATION: make `merge` last-wins (`|_, other| other`) ⇒ commutativity reds in exactly one /// order, e.g. `Unscheduled ⊔ Mixed` vs `Mixed ⊔ Unscheduled`. + /// + /// The value set includes two `Scheduled` values differing ONLY in `prompted`, so the three + /// laws are checked over the ENLARGED set the seat meet created rather than over the pre-seat + /// one. MUTATION: drop seat idempotence (always emit `prompted: None`) ⇒ `merge(x, x) != x` + /// reds for the two seat-carrying values. MUTATION: make the seat meet last-wins + /// (`prompted: q`) ⇒ commutativity reds on the `Some(0)` × `Some(1)` pair. #[test] fn family_collapse_state_merge_is_a_join() { let all = [ FamilyCollapseState::Unscheduled, FamilyCollapseState::Mixed, - FamilyCollapseState::Scheduled(CollapseCertainty::Committed), - FamilyCollapseState::Scheduled(CollapseCertainty::Conditional), + FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Committed, + prompted: Some(PlayerId(0)), + }, + FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Conditional, + prompted: Some(PlayerId(0)), + }, + // Same certainty as the row above, DIFFERENT seat — the axis the seat meet added. + FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Conditional, + prompted: Some(PlayerId(1)), + }, + // ⊥ of the seat lattice, reachable only as a meet result. + FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Conditional, + prompted: None, + }, ]; for x in all { assert_eq!(x.merge(x), x, "idempotent: {x:?}"); @@ -4571,17 +5090,45 @@ mod tests { } // The lattice's load-bearing shape, stated so a reader need not re-derive it. assert_eq!( - FamilyCollapseState::Scheduled(CollapseCertainty::Committed).merge( - FamilyCollapseState::Scheduled(CollapseCertainty::Conditional) - ), - FamilyCollapseState::Scheduled(CollapseCertainty::Conditional), - "two schedules keep the WEAKER certainty" + FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Committed, + prompted: Some(PlayerId(0)), + } + .merge(FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Conditional, + prompted: Some(PlayerId(0)), + }), + FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Conditional, + prompted: Some(PlayerId(0)), + }, + "two schedules keep the WEAKER certainty, and an AGREED seat survives the meet" ); assert_eq!( - FamilyCollapseState::Scheduled(CollapseCertainty::Committed) - .merge(FamilyCollapseState::Unscheduled), + FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Committed, + prompted: Some(PlayerId(0)), + } + .merge(FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Committed, + prompted: Some(PlayerId(1)), + }), + FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Committed, + prompted: None, + }, + "two DISTINCT seats meet to ⊥ (`None` = 'two or more seats', never 'nobody') while the \ + certainty is untouched — the seat axis and the certainty axis meet independently" + ); + assert_eq!( + FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Committed, + prompted: Some(PlayerId(0)), + } + .merge(FamilyCollapseState::Unscheduled), FamilyCollapseState::Mixed, - "a schedule beside an unscheduled sibling is Mixed, never Scheduled" + "a schedule beside an unscheduled sibling is Mixed, never Scheduled — and `Mixed` \ + names no seat, structurally" ); } diff --git a/crates/engine/src/game/engine.rs b/crates/engine/src/game/engine.rs index 9507241224..2e82da75de 100644 --- a/crates/engine/src/game/engine.rs +++ b/crates/engine/src/game/engine.rs @@ -4541,8 +4541,9 @@ struct PeriodFodder { /// CR 732.2a / CR 111.1: seed a `Priority{controller}` window and drive ONE iteration of /// `last_loop_action_sequence` on THROWAWAY clones, returning the `(before, after)` frames. /// The shared seed+drive kernel of the accept-time re-derivations — `current_period_fodder` -/// (object-growth ∞ pile) and `current_period_counter_targets` (counter-growth ∞ targets) -/// both diff these two frames. `None` when the sequence is empty. Mirrors the detection +/// (object-growth ∞ pile), `current_period_counter_growth` (beneficial counter δ, feeding both +/// the batched stash and the ∞ counter pills) and `current_period_life_growth` (life δ) all diff +/// these two frames. `None` when the sequence is empty. Mirrors the detection /// drive exactly: same `SimulationProbeGuard` re-entrancy guard (HELD across the drive so /// the injector's internal `apply_action` never recurses into the shortcut hooks), same /// `drive_loop_sequence_iteration`. @@ -4602,33 +4603,19 @@ fn current_period_fodder(state: &GameState) -> Option { Some(PeriodFodder { class, taps_fodder }) } -/// CR 732.2a / CR 701.34a (proliferate): re-derive the per-object `(ObjectId, CounterType)` -/// targets whose PRESERVED `Generic` counters strictly grew across one accepted -/// counter-growth period — the DISPLAY-only `∞` counter channel. The offer certificate's -/// unbounded axis is object-AGNOSTIC (`Counter(Other, Other)`), so the concrete object id / -/// counter type is NOT recoverable from the axis; re-derive it the same way -/// `current_period_fodder` derives the fodder class — drive ONE period on a clone (shared -/// `drive_one_period_frames`) and diff `Generic` counters (`grown_generic_counter_targets`). -/// Empty when the sequence is empty or the period grows no `Generic` counter (a mana / token -/// / object-growth loop). General over the class (proliferate charge / One-Ring burden), -/// never one card. DISPLAY-ONLY: the caller marks the pill to render `∞` without mutating the -/// real counter count. -fn current_period_counter_targets( - state: &GameState, -) -> Vec<(ObjectId, crate::types::counter::CounterType)> { - let Some((before, after)) = drive_one_period_frames(state) else { - return Vec::new(); - }; - crate::analysis::resource::grown_generic_counter_targets(&before, &after) -} - -/// CR 122.1 + CR 732.2a: re-derive the per-object BENEFICIAL counter growth (with per-cycle -/// δ) of the accepted period by driving ONE iteration on a clone (`drive_one_period_frames`) -/// and diffing beneficial-materializable counters (`grown_beneficial_counter_deltas`). The -/// batched-collapse δ source for the whole beneficial class (+1/+1 / loyalty / defense / -/// charge) — the widened analog of `current_period_counter_targets` (DISPLAY, Generic-only). -/// Empty when the sequence is empty or the period grows no beneficial counter (a mana / token -/// / life loop). Only reached in the UNOBSERVED batched route (the firewall gates it). +/// CR 122.1 + CR 732.2a: THE SINGLE per-object counter derivation of an accepted period — drive +/// ONE iteration on a clone (`drive_one_period_frames`) and diff beneficial-materializable +/// counters (`grown_beneficial_counter_deltas`), yielding per-cycle δ for the whole beneficial +/// class (+1/+1 / loyalty / defense / charge). Feeds BOTH consumers: the batched-collapse δ stash, +/// and (projected to `(object, counter)`) the `∞` DISPLAY counter channel. The display half used +/// to run a SECOND, `Generic`-only diff of its own, so a +1/+1 or loyalty loop collapsed correctly +/// and never rendered an `∞` pill; one derivation is what makes that class of disagreement +/// unrepresentable. The offer certificate's unbounded axis is object-AGNOSTIC, so the concrete +/// object id / counter type is NOT recoverable from the axis and must be re-derived here, the same +/// way `current_period_fodder` re-derives the fodder class. Empty when the sequence is empty or +/// the period grows no beneficial counter (a mana / token / life loop). The batched-collapse +/// consumer is only reached in the UNOBSERVED route (the firewall gates it); the display +/// registration is unconditional on both routes. fn current_period_counter_growth( state: &GameState, ) -> Vec { @@ -5010,18 +4997,7 @@ fn materialize_object_growth_shortcut( } else { None }; - // CR 732.2a / CR 701.34a: snapshot the per-object ∞ COUNTER targets for DISPLAY - // (DerivedViews::unbounded_counters). Distinct from the object-growth ∞ pile above: a - // counter-growth loop's certified unbounded axis is object-agnostic (Counter(Other, - // Other)), so re-derive the concrete (object, counter) pairs by driving one period on a - // clone and diffing Generic counters — WHILE the recast sequence is still intact (the - // `.clear()` below wipes it). DISPLAY-ONLY: the object's real counter count is NOT mutated - // (CR 701.34a already added the real counter on each live cycle; this only marks the pill - // to render ∞). A mana / token / object-growth loop grows no Generic counter ⇒ empty ⇒ - // no-op writer. Runs in BOTH routes (display is unconditional). - let counter_targets = current_period_counter_targets(state); - state.register_unbounded_counter_targets(proposal.proposer, counter_targets); - // ROUTE the STASH element only (the DISPLAY above is unconditional). `proposal.unbounded` IS + // ROUTE the STASH element only (the DISPLAY below is unconditional). `proposal.unbounded` IS // the ∞-mark set `mark_unbounded_loop` wrote. Capture-before-clear: `last_loop_action_sequence` // and the δ derivations all read BEFORE the `.clear()` tail below. // @@ -5034,6 +5010,23 @@ fn materialize_object_growth_shortcut( // carries an unrelated life/counter observer (plan §5 Note; the observedness firewall is // AXIS-SPECIFIC so an incidental board observer never mis-routes a disjoint-axis loop). let growths = current_period_counter_growth(state); + // CR 732.2a / CR 122.1: the ∞ counter DISPLAY targets are the SAME per-object growth the + // batched stash carries — ONE derivation, projected. Registering from `growths` (rather than a + // second, `Generic`-only diff) is what makes `clear_collapsed_materializations`' + // `collapsed_pairs` a superset of the registered set on the batched route, so the boundary + // clear is unchanged; on the `DriveSequence` route a pair whose derived axis was not collapsed + // survives, which is the disclosed display over-keep on `UnboundedFamilyView`. DISPLAY-ONLY: + // the object's real counter count is NOT mutated (CR 701.34a already added the real counter on + // each live cycle; this only marks the pill to render ∞). Derived WHILE the recast sequence is + // still intact (the `.clear()` tail below wipes it). Unconditional on both routes; a mana / + // token / object-growth loop grows no beneficial counter ⇒ empty ⇒ no-op writer. + state.register_unbounded_counter_targets( + proposal.proposer, + growths + .iter() + .map(|g| (g.object, g.counter.clone())) + .collect(), + ); let life = current_period_life_growth(state); let counter_observed = !growths.is_empty() && crate::analysis::resource::counter_growth_is_observed(state); @@ -15883,7 +15876,55 @@ mod stage2_injector_tests { // Search-observer dispatch: `:11828 ⇒ :11821`, −7. Removing the retired // `WaitingForWithParkedObservers` match arm is the only hunk above this // producer; it changes trigger-drain timing but does not add a prompt. - "game/engine.rs:11821".to_string(), + // + // ∞ AXIS-SCOPED REVOCATION ROUND (re-application of the ∞ badge/axis change onto + // `b5b8f4ecf`): `:11821 ⇒ :11814`, `-7`. This entry is written the way the + // doctrine at the head of this log demands and the way the two rounds above did + // NOT get for free: the coordinate was LOCATED BY CONTENT FIRST and the arithmetic + // was computed afterwards as a CHECK. Two incoming numbers were available and both + // were stale — this file's own `:11828` (pre-edit) and the original branch's + // `:11700` (pre-rebase) — which is exactly the situation in which inheriting a + // number is wrong. That judgement was vindicated a second time on the rebase onto + // `b5b8f4ecf`: the search-observer entry directly above ALSO landed its producer + // on `:11821`, from an unrelated hunk, so the 3-way merge saw both sides write the + // same coordinate and silently accepted it as AGREEMENT — when in fact the two + // shifts are independent and must COMPOSE: `11828 -7 (search-observer) -7 (here)` + // = `11814`. A conflict-free auto-merge of this pin would have been wrong by 7. + // Four hunks in this file, ALL above the producer, sum to this entry's own `-7`: + // the `drive_one_period_frames` caller-list doc going from two lines to three + // (`+1`), the deletion of `current_period_counter_targets` plus the rewrite of + // `current_period_counter_growth`'s doc into the single-derivation statement + // (27 lines to 13, `-14`), the deletion of the second display-registration block + // in `materialize_object_growth_shortcut` (12 lines to 1, `-11`), and its + // re-insertion below `let growths = …` as one derivation projected to two + // consumers (`+17`). Predicted `11821-7` equals the observed coordinate exactly. + // + // Identity re-established on three axes rather than assumed: the line at `:11814` + // is sha256-identical (WITH its trailing newline) to every earlier coordinate this + // row has carried — + // `8a544e878d3e77fb80391b95af8f74059540d5ce4ad6fb83559f364df5cc7d63`, the prefix + // carried since `a6d1a0e62`; that hash is UNIQUE in the file under a whole-file + // scan, so the coordinate is unambiguous; and it is still inside + // `begin_pending_trigger_target_selection`, which itself moved by the same `-7` + // and therefore did not change functions. + // + // HASHING CONVENTION, recorded because this branch produced the near-miss once: + // the line is hashed WITH its trailing newline. Piping through `tr -d '\n'` first + // yields `a6d7f2f9d1e15de538f5c2c5803f28e76e86ccd60898c7602a089345a25cb032` — a + // DIFFERENT digest for the SAME line. Both are written out in full here so a + // future reader who reproduces the wrong one identifies the convention instead of + // re-litigating the coordinate. + // + // SET PRESERVATION: unchanged. The other four entries live in `game/effects/` and + // `scoped_library_search.rs`; this change touches neither, and its own new tests + // live in `types/game_state.rs`, `derived_views.rs` and `tests/integration/`, so + // no line matching the needle is added to this file at all — total still 37, + // partition still 5/7/25. + // + // COLLISION NOTE: a separate in-flight CR 500.5 `max` bugfix also edits this file + // above this producer. Whichever lands second MUST re-derive by content; it cannot + // reuse this number, and neither entry's arithmetic is authority for the other's. + "game/engine.rs:11814".to_string(), ], "the five production producers, NAMED: the CR 603.5 gate in `resolve_chain_body` \ plus the two repeated-optional-payment drivers, the per-player acceptance cursor \ diff --git a/crates/engine/src/game/engine_resolution_choices.rs b/crates/engine/src/game/engine_resolution_choices.rs index c63a800b84..959662999e 100644 --- a/crates/engine/src/game/engine_resolution_choices.rs +++ b/crates/engine/src/game/engine_resolution_choices.rs @@ -2736,6 +2736,13 @@ pub(super) fn handle_resolution_choice( // The DISPLAY half of follow-up F2 is instead covered live at the projection by // `derived_views::object_growth_backing`, which drops an ∞ row whose entire // registered display set has left the battlefield without touching the stash. + // That cover now spans BOTH object-backed families — the token axis reads the + // ∞ pile, and the counter axes read the registered `(object, counter)` pairs + // that derive each axis — and it applies ONLY while the collapse is still + // UNACCEPTED. Once a stash exists for the axis, CR 732.2c has already taken the + // shortcut, so the projection's acceptance gate keeps the row even with its + // whole backing gone: the growth still lands here, and a row that vanished + // before it landed would be the display lying about an agreed result. state.clear_collapsed_materializations(player, &collapsed); // Continue the boundary fixpoint (§7): re-draining either prompts the // next APNAP player with a stash or restores Priority now. diff --git a/crates/engine/src/types/game_state.rs b/crates/engine/src/types/game_state.rs index 8e9ee08332..d7eebf3b52 100644 --- a/crates/engine/src/types/game_state.rs +++ b/crates/engine/src/types/game_state.rs @@ -3532,11 +3532,12 @@ pub enum PersistentAxisMaterialization { /// CR 732.2a: the `unbounded_resources` axis a counter of `ct` on `obj_id` backs — mirrors /// `ResourceVector::snapshot`'s `(CounterClass, ObjectClass)` keying. SINGLE mapping from a -/// counter target to its axis, with exactly three production call sites, all in this file: -/// `scheduled_collapse_axes`, and `clear_collapsed_materializations`' surviving-target guard -/// (twice). The ∞ counter-pill projection in `game::derived_views` is NOT one of them — it -/// projects the battlefield-surviving entries of `unbounded_counter_targets` directly and -/// never maps them to an axis. +/// counter target to its axis, with exactly four production call sites: `scheduled_collapse_axes` +/// and `clear_collapsed_materializations`' surviving-target guard (twice) in this file, plus +/// `game::derived_views::object_growth_backing`, which derives each registered pair's own axis to +/// decide whether THIS axis still has live board backing. The ∞ counter-PILL projection in +/// `game::derived_views` is NOT one of them — it projects the battlefield-surviving entries of +/// `unbounded_counter_targets` directly and never maps them to an axis. /// /// LIVE RE-DERIVATION — DELIBERATE DISPLAY-ONLY TOLERANCE. The class is read from the /// object as it stands NOW, not snapshotted at accept. `state.objects` retains an object @@ -3560,15 +3561,19 @@ pub enum PersistentAxisMaterialization { /// Two further removes operate on DISCARDED COMPARISON CLONES, never live state /// (`game::engine::normalize_recast_frame`, `analysis::resource`'s frame projection). /// -/// REACHABILITY BY CONSUMER — with the pill projection no longer mapping to an axis, both +/// REACHABILITY BY CONSUMER — with the pill projection still not mapping to an axis, all THREE /// remaining consumers are LIVE, and byte-identical to the pre-extraction nested /// `counter_axis` helper they already used: /// • `scheduled_collapse_axes` — read by `clear_collapsed_materializations` to pick the -/// removals, AND by `derive_views` (through `scheduled_display_axes`) to flag each `∞` row. +/// removals, AND by `derive_views` (through `accepted_collapse_axes`) to flag each `∞` row. /// Exactly the fail-open described above: a removal that finds nothing, and an axis that /// flags no row. An unflagged row renders plain `∞` rather than `∞→N`, so the polarity is /// unchanged — nothing is hidden, one affordance is merely not offered. /// • `clear_collapsed_materializations`' own surviving-target guard. +/// • `game::derived_views::object_growth_backing`'s `Counter(..)` arm — same fail-open: a +/// drifted bearer derives `Counter(_, Other)`, which matches no registered pair for the axis +/// being asked about, so nothing answers, the arm returns `None`, and the badge is KEPT. +/// Never `Some(false)`, which is the only answer that could drop a row. /// /// That fail-open polarity is the SAME one this phase mandates everywhere else (an axis /// with no registration renders ∞): it can only ever leave an ∞ standing one boundary longer @@ -14333,17 +14338,27 @@ declare_game_state! { /// CR 732.2a / CR 701.34a display state: for the winning controller of an /// accepted COUNTER-growth loop shortcut (proliferate charge on Pentad Prism, - /// burden on The One Ring), the `(ObjectId, CounterType)` pairs whose preserved - /// `Generic` counters the certified-unbounded loop pumps each cycle. The - /// counter analog of `unbounded_loop_pile`: object-growth marks a per-OBJECT - /// pile, but the counter-growth cover's unbounded axis is object-agnostic - /// (`ResourceAxis::Counter(Other, Other)`), so this per-object channel is what - /// lets the frontend render `∞` on the specific pumped counter pill instead of - /// the literal count. Re-derived once at loop materialization (by driving one - /// period on a clone and diffing `Generic` counters) and projected to + /// burden on The One Ring, a +1/+1 or loyalty pump loop), the + /// `(ObjectId, CounterType)` pairs whose preserved BENEFICIAL counters the + /// certified-unbounded loop pumps each cycle — the wildcard-free partition + /// `analysis::resource::counter_is_beneficial_materializable` names + /// (`Generic(_)`, `Plus1Plus1`, `Loyalty`, `Defense`). The counter analog of + /// `unbounded_loop_pile`: object-growth marks a per-OBJECT pile, but the + /// counter-growth cover's unbounded axis MAY be object-agnostic + /// (`ResourceAxis::Counter(Other, Other)`) — one accepted proposal can carry both + /// that display axis and an object-classed one, which is why the universal was + /// weakened here — so this per-object channel is what lets the frontend render + /// `∞` on the specific pumped counter pill instead of the literal count. + /// Re-derived once at loop materialization by + /// `game::engine::current_period_counter_growth` (drive one period on a clone, + /// diff beneficial counters) — the SAME single derivation the batched-collapse δ + /// stash carries, projected to `(object, counter)` — and projected again to /// `DerivedViews::unbounded_counters`. Written ONLY by - /// `register_unbounded_counter_targets`; cleared (in lockstep with - /// `unbounded_resources` / `unbounded_loop_pile`) by `clear_unbounded_loop`. + /// `register_unbounded_counter_targets`. Cleared by TWO authorities: + /// `clear_unbounded_loop` (whole-map, in lockstep with `unbounded_resources` / + /// `unbounded_loop_pile`) and `clear_collapsed_materializations`, which filters + /// the pairs by the collapsed axes and either removes the entry or re-inserts the + /// survivors. /// /// DISPLAY-ONLY: the object's real counter count is NEVER mutated by this field — /// CR 701.34a proliferate still adds a real counter each cycle; the `∞` is a @@ -20379,17 +20394,20 @@ impl GameState { /// CR 732.2a: the exact `ResourceAxis` set a deferred materialization stash will /// collapse at the next CR 500.5 boundary. SINGLE AUTHORITY with TWO production callers: /// `clear_collapsed_materializations`, which REMOVES these axes once the growth was applied, - /// and `game::derived_views::scheduled_display_axes`, which flags each `∞` row's `scheduled` - /// field. + /// and `game::derived_views`, which projects it onto the `(player, family)` collapse-state + /// channel (`UnboundedFamilyView::state`). /// - /// NOT a display FILTER. `derive_views` reads this to ANNOTATE a row, never to decide whether - /// the row exists. Which surfaces exist is gated on their own stores and on live battlefield - /// membership, never on this set. (This doc has been stale twice — it once said "ONE - /// production caller" and "deliberately not read by `game::derived_views`"; then it named a - /// since-removed tag loop as the caller. Each time the mirror sentence in `derived_views` was - /// updated and this one — the doc a future caller reads first — was not. Hence it now names - /// the FUNCTION, not the consumer, so adding a consumer inside `derived_views` cannot make it - /// stale again.) + /// NOT a display FILTER. `derive_views` reads this to ANNOTATE a row, and — since CR 732.2c + /// binds an accepted shortcut the instant the last player accepts — to KEEP a row whose board + /// backing has died; never to decide that a row should not exist. Which surfaces exist is + /// gated on their own stores and on live battlefield membership, never on this set alone. + /// (This doc has been stale THREE times — it once said "ONE production caller" and + /// "deliberately not read by `game::derived_views`"; then it named a since-removed tag loop as + /// the caller; then it named both a function that has since been split in two and a row + /// `scheduled` field that no longer exists. Each time the mirror sentence in `derived_views` + /// was updated and this one — the doc a future caller reads first — was not. Hence it now + /// names the CHANNEL and the rule, not a function and not a field: a channel name survives a + /// rename, and a function name has now demonstrably not survived three.) /// /// CR 732.2a + CR 732.2c — WHAT THIS STASH IS, STATED AS THE RULE RATHER THAN AS A CONCESSION. /// This doc previously called the stash an engine deviation "that no CR licenses". That was @@ -25110,6 +25128,213 @@ mod tests { ); } + /// Shared rig for the two widened-registration boundary tests below. ONE builder, two + /// `#[test]`s: a single four-arm test masks its own later arms, because a mutant that reds an + /// early arm aborts before the rest run — which is exactly how the polarity of one of these + /// probes was got wrong once already. + /// + /// Returns `(state, driven_axis, widened_axis)`. + /// + /// EVERY LINE HERE IS LOAD-BEARING: + /// - CR 122.1: `collapsed_counter_axis` takes `CounterClass` from the COUNTER and + /// `ObjectClass` from the BEARER. On a CREATURE bearer `Generic("charge")` derives + /// `Counter(Other, CREATURE)` — NOT `Counter(Other, Other)`. Getting that wrong makes the + /// matched negative assert about an axis nothing derives. + /// - `GameObject::new` sets `card_types: CardType::default()` (EMPTY `core_types`), so the + /// bearer's creature-ness must be assigned explicitly. A name string does nothing; without + /// the assignment every axis below is `ObjectClass::Other` and the REACH arm is false. + /// - `mark_unbounded_loop` writes `unbounded_resources` ONLY. + /// `register_unbounded_loop_enablers` is the sole write authority for + /// `unbounded_loop_enablers` and no-ops on an empty set, so without the explicit call the + /// enabler-absence assertion would measure a map NOTHING in the rig can populate — a + /// zero-census with no positive control. + fn widened_counter_rig(ct: CounterType) -> (GameState, ResourceAxis, ResourceAxis) { + use crate::analysis::resource::{CounterClass, ObjectClass}; + + let driven_axis = ResourceAxis::Counter(CounterClass::Other, ObjectClass::Creature); + let widened_axis = ResourceAxis::Counter(CounterClass::Plus1Plus1, ObjectClass::Creature); + + let mut state = GameState::new_two_player(7); + let mut bearer = GameObject::new( + ObjectId(10), + CardId(10), + PlayerId(0), + "Beast".to_string(), + Zone::Battlefield, + ); + bearer.card_types.core_types = vec![CoreType::Creature]; + state.objects.insert(ObjectId(10), bearer); + state.battlefield.push_back(ObjectId(10)); + + state.mark_unbounded_loop(PlayerId(0), &[driven_axis]); + state.register_unbounded_loop_enablers(PlayerId(0), BTreeSet::from([ObjectId(10)])); + state.register_unbounded_counter_targets(PlayerId(0), vec![(ObjectId(10), ct)]); + (state, driven_axis, widened_axis) + } + + /// The stash a `DriveSequence` accept leaves, naming exactly the driven axis. + fn widened_counter_driven_stash( + driven_axis: ResourceAxis, + ) -> Vec { + vec![PersistentAxisMaterialization::DriveSequence { + sequence: vec![], + collapsed_axes: vec![driven_axis], + }] + } + + /// CR 732.2a: widening the `∞` counter registration from `Generic`-only to the whole + /// beneficial partition can register a pair whose derived axis the accepted collapse never + /// names. This pins what that does at the boundary, on BOTH halves of + /// `clear_collapsed_materializations`: + /// + /// - arm 1 REACH — the two axes really differ, and BOTH derivations are asserted, so a rig + /// whose bearer silently lost its creature type fails here instead of passing vacuously. + /// - arm 2 SUBJECT (display) — the widened pair SURVIVES the driven collapse, and the `∞` + /// counter pill really is still projected for it. + /// - arm 3 THE ANSWER (rules state) — a surviving DISPLAY pair does NOT suppress the axis + /// removal and does NOT hold the `unbounded_loop_enablers` lockstep open. Both absences are + /// preceded, in the same frame, by a PRESENCE assertion on the same key, so each measures a + /// REMOVAL rather than a map nothing populated. + /// + /// Its matched negative is `a_counter_pair_on_the_driven_axis_is_dropped_at_the_boundary`, + /// which shares this rig builder and asserts the complementary outcome on the same map. + /// + /// REVERT-PROBES, each with the arm it flips and the direction (all GREEN → RED): + /// - delete `&& !driven_axes.contains(&collapsed_counter_axis(..))` from the surviving-target + /// filter ⇒ flips the MATCHED NEGATIVE's arm 4, not this test: the filter is `P && Q`, so + /// dropping `Q` is strictly MORE permissive, more pairs survive, and only a REMOVAL + /// assertion can red. + /// - replace `axes_to_remove.retain(|ax| !backed.contains(ax))` with + /// `if !surviving_targets.is_empty() { axes_to_remove.clear(); }` — a surviving display pair + /// holding the whole rules-state removal open ⇒ arm 3 reds (both halves), arm 2 stays green. + /// - replace the survivors if/else with an unconditional + /// `self.unbounded_counter_targets.remove(&controller);` ⇒ arm 2 reds, arm 3 stays green. + /// + /// HONEST BOUND: this drives `clear_collapsed_materializations` directly with a hand-built + /// stash, so it is a CONTRACT test of the boundary algebra, not a live-game repro. The + /// mixed-stash shape in which a surviving pair CAN suppress an axis removal (two accepts by + /// one controller before one boundary, taking different routes) pre-exists this widening for + /// `Generic` pairs; the widening enlarges its domain to the beneficial partition and is + /// recorded as a follow-up, not fixed here. + #[test] + fn widened_counter_registration_survives_a_driven_collapse_without_moving_the_axis_set() { + let (mut state, driven_axis, widened_axis) = widened_counter_rig(CounterType::Plus1Plus1); + let bearer = ObjectId(10); + + // ARM 1 — REACH. Both derivations asserted, and their difference. + assert_eq!( + collapsed_counter_axis(&state, bearer, &CounterType::Plus1Plus1), + widened_axis, + "reach: on a CREATURE bearer a +1/+1 counter derives Counter(Plus1Plus1, Creature)" + ); + assert_eq!( + collapsed_counter_axis(&state, bearer, &CounterType::Generic("charge".to_string())), + driven_axis, + "reach: on the SAME creature bearer a Generic counter derives Counter(Other, Creature) \ + — the ObjectClass comes from the BEARER, so this is NOT Counter(Other, Other)" + ); + assert_ne!( + widened_axis, driven_axis, + "reach: the widened pair's axis is not the one the collapse drives — without this the \ + whole fixture is about one axis" + ); + + // PRE-CLEAR PRESENCE — the positive controls. Each absence asserted after the clear is a + // REMOVAL because the same key is proven present here, in the same frame. + assert_eq!( + state.unbounded_counter_targets.get(&PlayerId(0)), + Some(&BTreeSet::from([(bearer, CounterType::Plus1Plus1)])), + "pre-clear: the widened pair is registered" + ); + assert_eq!( + state.unbounded_resources.get(&PlayerId(0)), + Some(&BTreeSet::from([driven_axis])), + "pre-clear: the marked axis set is exactly the driven axis" + ); + assert!( + state.unbounded_loop_enablers.contains_key(&PlayerId(0)), + "pre-clear: the enabler map is POPULATED — without this the arm-3 absence below \ + measures a map nothing in the rig can write" + ); + + state.clear_collapsed_materializations( + PlayerId(0), + &widened_counter_driven_stash(driven_axis), + ); + + // ARM 2 — SUBJECT (display). The widened pair survives, and its pill is still projected. + assert_eq!( + state.unbounded_counter_targets.get(&PlayerId(0)), + Some(&BTreeSet::from([(bearer, CounterType::Plus1Plus1)])), + "ARM2 widened pair survives: its derived axis was not collapsed, so per CR 732.2c \ + nothing about it has ended" + ); + let pills = + crate::game::derived_views::derive_views(&state, Some(PlayerId(0))).unbounded_counters; + assert_eq!( + pills.get(&bearer), + Some(&vec![CounterType::Plus1Plus1]), + "ARM2 pill projection: the surviving pair really reaches `unbounded_counters` — the \ + store half alone would not prove the display over-keep is visible, got {pills:?}" + ); + + // ARM 3 — THE ANSWER (rules state). Both halves are REMOVALS, not absences. + assert!( + !state.unbounded_resources.contains_key(&PlayerId(0)), + "ARM3a axis set emptied: a surviving DISPLAY pair does not suppress the removal of an \ + axis the collapse actually drove" + ); + assert!( + !state.unbounded_loop_enablers.contains_key(&PlayerId(0)), + "ARM3b enabler dropped: the axis set emptied, so the lockstep drop fires — a surviving \ + display pair does not hold it open" + ); + } + + /// The MATCHED NEGATIVE of + /// `widened_counter_registration_survives_a_driven_collapse_without_moving_the_axis_set`, + /// on the SAME rig builder and the SAME map: a registered pair whose derived axis IS the + /// driven one is filtered out and its entry removed. Without this arm, the survival assertion + /// next door would pass against a boundary that never filters anything. + /// + /// REVERT-PROBE: delete `&& !driven_axes.contains(&collapsed_counter_axis(..))` from the + /// surviving-target filter ⇒ this test reds (the pair survives, the entry is re-inserted, and + /// `contains_key` is true) while the survival test stays green. That is the only mutation of + /// the three that flips THIS arm, and it flips no other. + #[test] + fn a_counter_pair_on_the_driven_axis_is_dropped_at_the_boundary() { + let (mut state, driven_axis, widened_axis) = + widened_counter_rig(CounterType::Generic("charge".to_string())); + let bearer = ObjectId(10); + + // ARM 1 — REACH, identical to its twin: this pair's axis IS the driven one. + assert_eq!( + collapsed_counter_axis(&state, bearer, &CounterType::Generic("charge".to_string())), + driven_axis, + "reach: the Generic pair on a creature bearer derives the DRIVEN axis" + ); + assert_ne!( + widened_axis, driven_axis, + "reach: the two axes this pair of tests separates really are distinct" + ); + assert!( + state.unbounded_counter_targets.contains_key(&PlayerId(0)), + "pre-clear: the pair is registered — the absence below is a REMOVAL" + ); + + state.clear_collapsed_materializations( + PlayerId(0), + &widened_counter_driven_stash(driven_axis), + ); + + // ARM 4 — the pair derives a driven axis, so it is filtered and the entry removed. + assert!( + !state.unbounded_counter_targets.contains_key(&PlayerId(0)), + "ARM4 generic pair filtered out, entry removed: its derived axis WAS collapsed, so its \ + ∞ has genuinely ended" + ); + } + /// `register_unbounded_loop_enablers` is a no-op for an empty set — no entry to /// defuse on later (mirrors `mark_unbounded_loop`'s idempotent set-union contract). #[test] diff --git a/crates/engine/tests/integration/combo_infinite_pile.rs b/crates/engine/tests/integration/combo_infinite_pile.rs index 1c5dc3e66f..cca8c2a689 100644 --- a/crates/engine/tests/integration/combo_infinite_pile.rs +++ b/crates/engine/tests/integration/combo_infinite_pile.rs @@ -835,7 +835,10 @@ fn real_4p_observed_drive_sequence_replays_captured_period_n_times() { .map(|f| f.state); assert_eq!( tokens_state, - Some(FamilyCollapseState::Scheduled(CollapseCertainty::Committed)), + Some(FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Committed, + prompted: Some(P0), + }), "a DriveSequence replays real cycles and cannot park, so its tokens family is Committed \ (∞→N) — contrast the batched Tokens stash behind unbounded-token-wire.json, which is \ Conditional (∞→?)" @@ -1614,7 +1617,10 @@ fn one_shot_bootstrap_accepted_state() -> GameState { runner.state().clone() } -/// MED-1 (CR 732.2a + CR 110.1): an object-growth `∞` ROW dies with its registered backing. +/// MED-1 (CR 732.2c + CR 110.1): an ACCEPTED object-growth `∞` ROW SURVIVES losing its entire +/// registered backing. Once the last player accepts, the shortcut is taken and the growth will +/// land at the boundary, so a row that vanished with the pile would have the HUD deny a result the +/// table already agreed to. /// /// ONE rig, TWO arms, THE SAME assertion — `derive_views(..).unbounded_resources` contains /// `ResourceAxis::TokensCreated`: @@ -1622,33 +1628,34 @@ fn one_shot_bootstrap_accepted_state() -> GameState { /// | arm (in run order) | what leaves the battlefield | THE assertion | /// |--------------------|-----------------------------------|---------------| /// | control | a non-pile untapped Saproling | **present** | -/// | subject | the pile's ONLY member (the seed) | **absent** | +/// | subject | the pile's ONLY member (the seed) | **present** | /// /// The control is the matched pair, not a second scenario: same fixture, same cast, same -/// accept, same `move_to_zone` chokepoint, differing only in WHICH object departs. That is -/// what makes the subject arm's absence attributable to the backing check rather than to the -/// zone move. It runs FIRST on purpose — see the comment at that arm. +/// accept, same `move_to_zone` chokepoint, differing only in WHICH object departs. It runs FIRST +/// on purpose — see the comment at that arm. /// -/// MUTATIONS (two-sided, RUN): -/// - **DROP** the `object_growth_backing(..) == Some(false)` guard in `derive_views`' resource -/// row loop ⇒ the SUBJECT arm reds ("…must be dropped, got [TokensCreated]" — the pre-fix -/// behaviour: an ∞ row beside an already-empty ∞ pile); the control stays green, and no -/// other test in the loop/∞ blast radius moves (1 failure / 164). -/// - **TRIVIALIZE** that guard to an unconditional `continue` ⇒ the CONTROL arm reds ("…must -/// persist, got []"); the subject arm's own assertions still pass. Collateral is 7 further -/// ∞-row-presence tests (8 failed / 156 passed), which is correct: hiding every row breaks -/// every test that asserts one is shown. -/// - Third probe, for the `Some(false)`/`None` asymmetry the helper's doc comment claims: -/// return `Some(false)` from `object_growth_backing`'s never-registered arm ⇒ 4 tests red, -/// including both `loop_shortcut_mana_engine` badge tests. The `None` branch is load-bearing, -/// not decorative. +/// THE ROW IS NOT KEPT BY ACCIDENT. This state is ACCEPTED, so the projection's FIRST conjunct +/// (`!accepted_axes.contains_key(&axis)`) is false and the backing check is never consulted — and +/// the schedule half asserted below proves the stash really does name this axis, so the conjunct +/// is decided by a live fact rather than by an empty map. The UNACCEPTED half of the same gate, +/// where a dead pile really does revoke the row, is pinned by +/// `derived_views::tests::an_accepted_token_collapse_keeps_its_row_when_its_pile_dies`' +/// NON-VACUITY arm. /// -/// The store guards below are the anti-"register enablers instead" tripwire: routing this +/// MUTATION (RUN, and the reason this test exists in this shape): **DROP** the +/// `!accepted_axes.contains_key(&axis)` conjunct from the row loop's gate ⇒ the SUBJECT arm reds +/// with an empty row set (the pre-fix behaviour: an accepted collapse silently losing its badge +/// before it lands), while the CONTROL arm stays green because its backing is still live. +/// +/// The store and cash-out guards below are what make the surviving row HONEST rather than merely +/// present, and they are more load-bearing here than they were when this arm asserted absence: a +/// kept row is a claim about growth that will still land, so the test drives the real CR 500.5 +/// boundary and mints. They are also the anti-"register enablers instead" tripwire: routing this /// through `zones`' defuse would call `clear_unbounded_loop`, which also wipes /// `pending_unbounded_materialization` and its CR 732.2c bound — i.e. one dying token would /// cancel the collapse the whole table accepted. These rows go red the moment that happens. #[test] -fn object_growth_infinity_row_dies_with_its_last_pile_member() { +fn accepted_object_growth_row_survives_losing_its_entire_pile() { use engine::analysis::resource::ResourceAxis; use engine::game::zones::move_to_zone; use engine::types::events::GameEvent; @@ -1734,9 +1741,10 @@ fn object_growth_infinity_row_dies_with_its_last_pile_member() { ); let subject_rows = rows(&subject); assert!( - !subject_rows.contains(&ResourceAxis::TokensCreated), - "THE assertion (subject): with its ENTIRE registered pile off the battlefield the \ - TokensCreated ∞ row must be dropped, got {subject_rows:?}" + subject_rows.contains(&ResourceAxis::TokensCreated), + "THE assertion (subject): the table ACCEPTED this collapse (CR 732.2c), so the \ + TokensCreated ∞ row survives its ENTIRE registered pile leaving the battlefield — the \ + growth still lands at the boundary below, got {subject_rows:?}" ); // THE CR 732.2c PIN: a dropped ROW does not cancel the accepted collapse. Doc blocks cite @@ -1789,21 +1797,18 @@ fn object_growth_infinity_row_dies_with_its_last_pile_member() { growth the table unanimously accepted still lands at the boundary (CR 732.2c)" ); - // SCOPE: only the BACKED axis is dropped — the wire is exactly the marked set minus - // `TokensCreated`, so a guard that hid MORE than the unbacked axis fails here. Stated - // honestly: this rig marks few axes, so this row is weak on its own. The load-bearing - // control for the `None` (never-registered ⇒ badge unchanged) branch is - // `loop_shortcut_mana_engine::mana_engine_accept_still_renders_its_infinity_badge`, which - // reds if `object_growth_backing`'s catch-all arm returns `Some(false)` instead of `None`. - let expected_after: BTreeSet = marked - .iter() - .copied() - .filter(|axis| *axis != ResourceAxis::TokensCreated) - .collect(); + // SCOPE: NOTHING leaves the wire — the projected axis set is exactly the marked set. An + // acceptance gate that is too broad (keeping rows it should not) cannot be caught here, but + // one that is too NARROW is: any axis this rig marks and the projection drops reds this + // equality. The load-bearing control for the `None` (never-registered ⇒ badge unchanged) + // branch is `loop_shortcut_mana_engine::mana_engine_accept_still_renders_its_infinity_badge`, + // which reds if `object_growth_backing`'s catch-all arm returns `Some(false)` instead of + // `None`; the UNACCEPTED revocation half is + // `derived_views::tests::an_accepted_token_collapse_keeps_its_row_when_its_pile_dies`. assert_eq!( subject_rows.iter().copied().collect::>(), - expected_after, - "scope: exactly the backed axis leaves the wire; every unbacked axis keeps its ∞" + marked, + "scope: with the collapse accepted, every marked axis keeps its ∞ row" ); // STORE: a DISPLAY revocation only. Nothing here may touch the accepted-collapse stash, @@ -2224,7 +2229,11 @@ fn real_4p_counter_observer_drift_in_window_declines_batched_counter_but_still_m assert!( pre_boundary_families.iter().any(|f| f.player == P0 && f.family == UnboundedFamily::Counters - && f.state == FamilyCollapseState::Scheduled(CollapseCertainty::Conditional)), + && f.state + == FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Conditional, + prompted: Some(P0), + }), "in the accept→boundary window the counters family is Scheduled(Conditional) — a batched \ Counters collapse can still be declined, so ∞→? not ∞→N; got {pre_boundary_families:?}" ); @@ -2618,7 +2627,11 @@ fn med_tokens_boundary_mint_pause_preserves_replacement_choice() { .iter() .any(|f| f.player == P0 && f.family == UnboundedFamily::Tokens - && f.state == FamilyCollapseState::Scheduled(CollapseCertainty::Conditional)), + && f.state + == FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Conditional, + prompted: Some(P0), + }), "pre-submit: an accepted Tokens collapse is Scheduled(Conditional) — its boundary mint can \ park on a replacement choice, which is exactly what happens below; got {:?}", derive_views(&state, None).unbounded_families diff --git a/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs b/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs index 7f62593fcf..68b1812fed 100644 --- a/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs +++ b/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs @@ -379,8 +379,9 @@ fn drive_to_collapse_boundary(state: &mut GameState) { /// accept pipeline from the real 4p dump. /// /// REVERT-PROBE (measured, non-vacuous): deleting the `register_unbounded_counter_targets` -/// write in `materialize_object_growth_shortcut` (or the `grown_generic_counter_targets` -/// re-derivation) leaves `unbounded_counter_targets` empty ⇒ assertions (2) the field write, +/// write in `materialize_object_growth_shortcut` (or the `current_period_counter_growth` +/// derivation it projects from) leaves `unbounded_counter_targets` empty ⇒ assertions (2) the +/// field write, /// (3) the derived-view projection, and (4) the wire round-trip all FLIP to fail. The /// offer-fires reach-guard (1) and the `charge == Some(4)` rules-correctness anchor /// (display-only: the real count is untouched) HOLD BOTH WAYS. @@ -532,7 +533,11 @@ fn kilo_accept_marks_pentad_charge_as_unbounded_display_target() { assert!( views.unbounded_families.iter().any(|f| f.player == P0 && f.family == UnboundedFamily::Counters - && f.state == FamilyCollapseState::Scheduled(CollapseCertainty::Committed)), + && f.state + == FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Committed, + prompted: Some(P0), + }), "the real kilo accept's single DriveSequence yields a Committed family on a REAL \ production dump — that is this witness's distinct property, NOT uniqueness: two other \ Committed witnesses exist on synthetic boards (combo_infinite_pile's grafted \ @@ -574,6 +579,165 @@ fn kilo_accept_marks_pentad_charge_as_unbounded_display_target() { ); } +/// TARGET-DEPARTURE RELATION (CR 732.2a / CR 110.1), pinned end-to-end on the real 4p dump: when a +/// registered ∞ counter target leaves the battlefield, the per-object PILL disappears from the wire +/// while the aggregate counter ROW remains — and the STORE keeps the departed pair. +/// +/// That the pill and the row disagree is the point, and the REASON has changed — the assertion +/// outlived its original justification, which is why the discriminator arm below now exists. +/// +/// A pill is keyed by `ObjectId` and departure is an OBJECT event, so a pill has the identity it +/// needs to filter itself, and it filters unconditionally. A row is keyed by `ResourceAxis`. This +/// test used to explain the row's survival by "no axis-scoped backing authority exists" — that is +/// no longer true: `object_growth_backing` answers `Counter(..)` by deriving each registered +/// `(ObjectId, CounterType)` pair's own axis (`collapsed_counter_axis`), and on this very state +/// that answer is `Some(false)`. The row survives for a DIFFERENT reason: this fixture's collapse +/// was ACCEPTED (`drive_all_accept` above), and CR 732.2c makes an accepted shortcut binding, so +/// the acceptance conjunct keeps the row regardless of what happened to its targets. +/// +/// THAT DISTINCTION IS WHY (6) IS LOAD-BEARING. With the stash present, (4) passes whether or not +/// the counter authority works at all — every wrong answer in that subsystem (`None` from an +/// unmatched axis, an unregistered axis, a drifted bridge) also keeps the badge. So (4) alone is +/// vacuous in the direction that matters, and (6) is the arm that removes the acceptance and +/// requires the row to DIE. Only (6) proves the accept registered a pair whose derived axis equals +/// a marked axis — i.e. that the bridge join succeeds on PRODUCTION-DERIVED data rather than on +/// hand-built state, which no building-block test can establish. +/// +/// Nothing pinned this relation before: the token family's analog +/// (`loop_shortcut::stale_pile_member_is_omitted_from_the_wire_but_kept_in_the_store`) covers the +/// pile, and the counter pill's battlefield filter had no runnable guard on a real accept. +/// +/// MUTATIONS (to be RUN and recorded, one expected red each — if any reds more than its own row +/// that is reported, not trimmed): +/// - delete the `!state.battlefield.contains(id)` filter in `derive_views`' counter-pill loop +/// => (3) reds alone; +/// - restore the controller-keyed `Some(false)` `Counter(..)` arm in `object_growth_backing` +/// => (4) reds alone; +/// - "fix" it by pruning the STORE instead of the wire => (5) reds alone. (5) is the discriminator +/// against that wrong fix: the boundary collapse reads the store; +/// - revert the `Counter(..)` arm to `None` (the refusing revision) => (6) reds ALONE, and +/// nothing else here moves. That isolation is the proof (6) is measuring the authority and not +/// the acceptance gate. +#[test] +fn departed_counter_target_drops_its_pill_but_keeps_its_row_and_store_entry() { + use engine::analysis::resource::ResourceAxis; + use engine::game::derived_views::derive_views; + use engine::game::zones::move_to_zone; + use engine::types::counter::CounterType; + use engine::types::events::GameEvent; + use engine::types::zones::Zone; + + let mut state = load_migrated_dump(); + drive_one_live_cycle(&mut state); + assert!( + matches!(state.waiting_for, WaitingFor::LoopShortcut { proposer, .. } if proposer == P0), + "reach-guard: at the CR 732.2a ∞-charge offer for P0, got {:?}", + state.waiting_for + ); + drive_all_accept(&mut state); + + let charge = CounterType::Generic("charge".into()); + + // (1) REACH-GUARD, holds under every mutation below: the accept registered the target AND it + // is on the battlefield right now — so any divergence after the move is caused by the + // departure and by nothing else. + assert!( + state + .unbounded_counter_targets + .get(&P0) + .is_some_and(|t| t.contains(&(PENTAD, charge.clone()))), + "reach-guard: the accept registered (Pentad, charge) as a ∞ display target" + ); + assert!( + state.battlefield.contains(&PENTAD), + "reach-guard: BEFORE the departure the target is on the battlefield" + ); + + // (2) REACH-GUARD: the pill and the row are BOTH present beforehand. Without this the + // post-departure assertions could pass on a wire that never carried either. + let before = derive_views(&state, None); + assert!( + before + .unbounded_counters + .get(&PENTAD) + .is_some_and(|cts| cts.contains(&charge)), + "reach-guard: the pill is on the wire before the departure" + ); + let row_axes_before: Vec<_> = before.unbounded_resources.iter().map(|r| r.axis).collect(); + assert!( + row_axes_before + .iter() + .any(|a| matches!(a, ResourceAxis::Counter(..))), + "reach-guard: a counter ROW is on the wire before the departure, got {row_axes_before:?}" + ); + + // The departure itself, through the production chokepoint (CR 110.1: it stops being a + // permanent). + let mut events: Vec = Vec::new(); + move_to_zone(&mut state, PENTAD, Zone::Graveyard, &mut events); + assert!( + !state.battlefield.contains(&PENTAD), + "the departure really happened" + ); + + let after = derive_views(&state, None); + + // (3) THE PILL IS GONE — departure is an object event and the pill has object identity. + assert!( + !after.unbounded_counters.contains_key(&PENTAD), + "(3) the departed target's ∞ pill must leave the wire, got {:?}", + after.unbounded_counters + ); + + // (4) THE ROW REMAINS — because the collapse was ACCEPTED (CR 732.2c), not because nothing + // could revoke it. (6) below is what distinguishes those two explanations. + let row_axes_after: Vec<_> = after.unbounded_resources.iter().map(|r| r.axis).collect(); + assert!( + row_axes_after + .iter() + .any(|a| matches!(a, ResourceAxis::Counter(..))), + "(4) the counter ROW must survive its target's departure — the table already accepted \ + this collapse and it still lands at the boundary, got {row_axes_after:?}" + ); + + // (5) THE STORE IS NOT PRUNED — discriminator against "fixing" this by mutating the store: + // the CR 500.5 boundary collapse reads it. + assert!( + state + .unbounded_counter_targets + .get(&P0) + .is_some_and(|t| t.contains(&(PENTAD, charge.clone()))), + "(5) the STORE must still carry the departed (object, counter) pair — only the wire filters" + ); + + // (6) THE DISCRIMINATOR, and the only non-vacuous half of (4). Same post-departure state with + // the ACCEPTANCE removed: the row must now DIE. This is the single assertion in this file that + // requires the counter authority to actually work — it forces `object_growth_backing` to + // derive the departed pair's axis through `collapsed_counter_axis` and match it against a + // MARKED axis, both sides produced by the real accept on a real dump. Nothing hand-built can + // show that the two agree on production-derived data; that is why this arm lives here rather + // than at building-block level. + // + // `pending_unbounded_materialization` is a public field and this is a local clone, so removing + // it mutates nothing the rest of the test observes. + let mut unaccepted = state.clone(); + unaccepted.pending_unbounded_materialization.clear(); + let after_unaccepted = derive_views(&unaccepted, None); + let unaccepted_axes: Vec<_> = after_unaccepted + .unbounded_resources + .iter() + .map(|r| r.axis) + .collect(); + assert!( + !unaccepted_axes + .iter() + .any(|a| matches!(a, ResourceAxis::Counter(..))), + "(6) with the accepted collapse removed, the departed targets leave the counter row with \ + no live backing and it MUST be revoked — if it survives here, (4) above is passing for \ + no reason and the counter authority is not working, got {unaccepted_axes:?}" + ); +} + /// PERSISTENT-AXIS BOUNDARY COLLAPSE (CR 732.2a / CR 500.5 / CR 701.34a): the accepted Kilo /// proliferate ∞-charge loop is PROMPTED at the next phase/step boundary to name a finite N, then /// resolves to EXACTLY N more charge counters on Pentad Prism — driven end-to-end through the diff --git a/crates/engine/tests/integration/loop_counter_growth.rs b/crates/engine/tests/integration/loop_counter_growth.rs index bbd31670f8..ce2849649c 100644 --- a/crates/engine/tests/integration/loop_counter_growth.rs +++ b/crates/engine/tests/integration/loop_counter_growth.rs @@ -18,6 +18,7 @@ use engine::analysis::resource::{CounterClass, ResourceAxis}; use engine::game::scenario::{GameRunner, GameScenario}; +use engine::types::ability::AbilityKind; use engine::types::actions::GameAction; use engine::types::counter::CounterType; use engine::types::events::GameEvent; @@ -207,3 +208,212 @@ fn live_charge_growth_off_never_marks() { "reach-guard: the cascade must still run under Off (charge grew); got {charge}" ); } + +/// A FREE, voluntarily-repeatable activation that creates a token AND grows a `+1/+1` counter. +/// +/// BOTH CLAUSES ARE LOAD-BEARING, and the token one is not decoration. `apply_action`'s +/// `ActivateAbility` arm bootstraps `last_loop_action_sequence` ONLY when the activated ability +/// `creates_token` (or when a period for the same controller is already open); any other +/// activation CLEARS it. Mana activations arm it through the separate +/// `record_mana_loop_action_step` path. So a counter-only activation can never open a period, and +/// the CR 732.2a offer — which requires a non-empty sequence — is unreachable without a carrier. +/// The `+1/+1` growth therefore rides a token-creating activation, which is also a realistic +/// shape: a token engine whose creature grows as it works. +const PLUS1_TOKEN_ENGINE: &str = + "{0}: Create a 1/1 colorless Servo artifact creature token. Put a +1/+1 counter on this creature."; + +fn plus1_of(runner: &GameRunner, id: ObjectId) -> u32 { + runner + .state() + .objects + .get(&id) + .and_then(|o| o.counters.get(&CounterType::Plus1Plus1)) + .copied() + .unwrap_or(0) +} + +/// THE `∞` DISPLAY CHANNEL REGISTERS A `+1/+1` GROWTH (CR 122.1 + CR 732.2a). +/// +/// WHY THIS FIXTURE HAD TO BE BUILT rather than reused: a census of every test touching +/// `unbounded_counter_targets` found that all of them grow `charge` — a `Generic` counter, which +/// registers IDENTICALLY under the old cover partition and the current beneficial one. So the +/// whole suite passed byte-for-byte with or without the display/collapse consolidation, and no +/// existing test could distinguish the change from its absence. +/// +/// REACHABILITY, measured rather than assumed — a `+1/+1` loop is detected by a DIFFERENT +/// disjunct than a charge loop, and it matters: `CounterType::Plus1Plus1 +/// ::is_monotone_loop_resource()` is `true`, so `project_out_resources` strips it and the frames +/// read EQUAL under `loop_states_equal_modulo_resources`. (A charge loop cannot do that — +/// `Generic` is preserved, which is exactly why `loop_states_cover_modulo_counter_growth` exists.) +/// So this loop arrives through the base equality disjunct, is offered, and its `+1/+1` growth is +/// materialized at the boundary by `counter_is_beneficial_materializable` — while the DISPLAY +/// registration, when it was partitioned by the `Generic`-only ω-cover rule, saw nothing. That +/// gap is the defect: a real loop whose collapse lands and whose pills never render `∞`. +/// +/// THE REVERT-PROBE (the evidence, run and recorded): restore the display registration to the +/// `Generic`-only derivation — i.e. re-point it at a `grown_generic_counter_targets`-shaped +/// filter instead of projecting `growths` — and assertion (3) flips to an EMPTY target set. Every +/// other assertion here holds under that revert, which is what makes (3) the discriminator rather +/// than a bystander. +/// +/// DIVISION OF LABOUR, stated so neither half is overread: this fixture is DERIVED state (a +/// scenario-built loop), so it proves the registration covers the `+1/+1` class end-to-end +/// through a real offer and accept. It does NOT carry production-dump provenance; that burden is +/// `kilo_live_offer_from_real_dump`'s, on a real 4p dump. +#[test] +fn plus_one_counter_growth_registers_its_infinity_display_target() { + use engine::analysis::decision_template::IterationCount; + use engine::analysis::loop_check::ShortcutResponse; + use engine::game::derived_views::derive_views; + + let mut scenario = GameScenario::new_n_player(2, 7); + scenario.at_phase(Phase::PreCombatMain); + scenario.with_life(P0, 20); + scenario.with_life(PlayerId(1), 20); + let rider = scenario + .add_creature_from_oracle(P0, "Test Plus One Token Engine", 2, 2, PLUS1_TOKEN_ENGINE) + .id(); + let mut runner = scenario.build(); + runner.state_mut().loop_detection = LoopDetectionMode::Interactive; + + // THE DRIVING SHAPE — two constraints, both MEASURED by building the fixture that violates + // them and watching it fail, not inferred from the code: + // + // 1. It must be an ACTIVATION, not a trigger cascade. `try_offer_object_growth_shortcut` + // requires a non-empty `last_loop_action_sequence` whose every step is + // `is_voluntarily_repeatable()` (CR 601.2a / CR 602.2 / CR 605.3a — casting, activating, and + // mana abilities are each a voluntary choice at priority; the helper's own annotation names + // all three). A trigger cascade drives itself and records no + // action sequence, so it reaches only the Path-C silent mark — which registers no backing + // set at all. The cascade version of this fixture grew its counters and then sat at + // `Priority` with no offer. + // 2. The activation must CREATE A TOKEN. `apply_action`'s `ActivateAbility` arm opens a period + // only for a token-creating ability (or continues one already open for this controller); + // every other activation CLEARS the sequence. A `{0}: Put a +1/+1 counter on this creature.` + // version therefore also sat at `Priority` — each activation wiped the very sequence the + // offer needs. Mana activations arm it by a different path entirely + // (`record_mana_loop_action_step`). + // + // So the reachable production shape for a `+1/+1` ∞ display registration is a counter growth + // riding a token-creating or mana-producing carrier. That is a real constraint on the class, + // worth stating: it is why no such fixture existed to reuse. + let ability_index = runner + .state() + .objects + .get(&rider) + .and_then(|o| { + o.abilities + .iter() + .position(|def| def.kind == AbilityKind::Activated) + }) + .expect("the {0} activated ability parsed onto the rider"); + + let mut offered = false; + let mut activations = 0usize; + let mut halt = String::from("ran to the iteration cap"); + for _ in 0..40 { + if matches!(runner.state().waiting_for, WaitingFor::LoopShortcut { .. }) { + offered = true; + break; + } + match runner.act(GameAction::ActivateAbility { + source_id: rider, + ability_index, + }) { + Ok(_) => activations += 1, + Err(e) => { + halt = format!( + "activation #{} refused: {e:?} (waiting_for {:?})", + activations + 1, + runner.state().waiting_for + ); + break; + } + } + // Settle the activation off the stack; stop early if the offer surfaces mid-settle. + for _ in 0..60 { + match &runner.state().waiting_for { + WaitingFor::LoopShortcut { .. } => break, + WaitingFor::Priority { .. } if runner.state().stack.is_empty() => break, + _ => {} + } + if let Err(e) = runner.act(GameAction::PassPriority) { + halt = format!( + "settle after activation #{activations} stalled: {e:?} (waiting_for {:?})", + runner.state().waiting_for + ); + break; + } + } + } + offered |= matches!(runner.state().waiting_for, WaitingFor::LoopShortcut { .. }); + + // (1) REACH-GUARD: the engine really executed and really grew a `+1/+1` counter, so an empty + // target set below means "the registration missed the class" and not "no loop happened". + // + // THRESHOLD IS ONE, deliberately, and not the `>= 2` the charge cascades above use. Those + // fixtures need the BOARD to iterate because they are witnessing a Path-C mark that only + // recurrence can produce. This one witnesses an OFFER, and the offer fires as soon as a single + // period is recorded and the clone-drive confirms it recurs — the real board never iterates + // twice. Measured: with `>= 2` this guard failed at `got 1 counters after 1 activation(s)` + // while the offer had already surfaced, i.e. the guard was rejecting a working fixture. + // The halt reason rides along because a stalled driver and a broken registration otherwise + // fail identically. + let grown = plus1_of(&runner, rider); + assert!( + grown >= 1, + "reach-guard: the +1/+1 engine must actually run; got {grown} counters after \ + {activations} activation(s) — {halt}" + ); + + // (2) REACH-GUARD: a real offer surfaced, so the accept below drives production's + // `materialize_object_growth_shortcut` rather than a grafted stash. + assert!( + offered, + "reach-guard: the +1/+1 growth loop must raise a natural CR 732.2a offer, got {:?}", + runner.state().waiting_for + ); + + runner + .act(GameAction::DeclareShortcut { + count: IterationCount::Fixed(1), + template: None, + }) + .expect("P0 (proposer) declares the +1/+1 growth shortcut"); + while matches!( + runner.state().waiting_for, + WaitingFor::RespondToShortcut { .. } + ) { + runner + .act(GameAction::RespondToShortcut { + response: ShortcutResponse::Accept, + }) + .expect("the opponent accepts"); + } + + // (3) THE ASSERTION — the discriminator. The accept registered the `+1/+1` pair as an `∞` + // DISPLAY target. Under the `Generic`-only registration this set is EMPTY. + let targets = runner + .state() + .unbounded_counter_targets + .get(&P0) + .cloned() + .unwrap_or_default(); + assert!( + targets.contains(&(rider, CounterType::Plus1Plus1)), + "(3) the accept must register the +1/+1 pair as an ∞ display target — this is the \ + assertion the Generic-only display partition failed; got {targets:?}" + ); + + // (4) …and it reaches the WIRE as a pill, which is the user-visible half of (3). Asserted + // separately because (3) could hold while the projection filtered it back out. + let views = derive_views(runner.state(), None); + assert!( + views + .unbounded_counters + .get(&rider) + .is_some_and(|cts| cts.contains(&CounterType::Plus1Plus1)), + "(4) the +1/+1 ∞ pill must reach the wire, got {:?}", + views.unbounded_counters + ); +} diff --git a/crates/engine/tests/integration/loop_shortcut.rs b/crates/engine/tests/integration/loop_shortcut.rs index bc0ee9bd3b..c6d0f8f8f7 100644 --- a/crates/engine/tests/integration/loop_shortcut.rs +++ b/crates/engine/tests/integration/loop_shortcut.rs @@ -7529,7 +7529,7 @@ fn scheduled_collapse_still_renders_the_unbounded_badge() { let scheduled_families: Vec = views .unbounded_families .iter() - .filter(|f| matches!(f.state, FamilyCollapseState::Scheduled(_))) + .filter(|f| matches!(f.state, FamilyCollapseState::Scheduled { .. })) .map(|f| f.family) .collect(); assert!( @@ -7611,8 +7611,10 @@ fn stale_pile_member_is_omitted_from_the_wire_but_kept_in_the_store() { assert!( stored.len() >= 2, "reach-guard: this rig's pile has >= 2 members, so removing ONE leaves a non-empty \ - wire — the case is about a STALE member, not about the whole backing set dying \ - (that is `object_growth_infinity_row_dies_with_its_last_pile_member`), got {}", + wire — the case is about a STALE member, not about the whole backing set dying. The \ + whole-set case is `accepted_object_growth_row_survives_losing_its_entire_pile`, which \ + asserts the row SURVIVES it, because that rig's collapse has been accepted (CR 732.2c); \ + got {}", stored.len() ); assert!( @@ -7757,7 +7759,7 @@ fn unregistered_axis_still_renders_its_infinity_badge() { assert!( v.unbounded_families .iter() - .any(|f| matches!(f.state, FamilyCollapseState::Scheduled(_))) + .any(|f| matches!(f.state, FamilyCollapseState::Scheduled { .. })) && j.contains("\"Scheduled\""), "R3/pre-clear: a registered materialization SCHEDULES a family AND emits it, got {:?}", v.unbounded_families diff --git a/crates/engine/tests/integration/loop_shortcut_mana_engine.rs b/crates/engine/tests/integration/loop_shortcut_mana_engine.rs index c596e1806e..136c40866b 100644 --- a/crates/engine/tests/integration/loop_shortcut_mana_engine.rs +++ b/crates/engine/tests/integration/loop_shortcut_mana_engine.rs @@ -1215,7 +1215,10 @@ fn scheduled_drive_still_renders_the_already_spendable_mana_badge() { ); assert_eq!( state_of(UnboundedFamily::Life), - FamilyCollapseState::Scheduled(CollapseCertainty::Committed), + FamilyCollapseState::Scheduled { + certainty: CollapseCertainty::Committed, + prompted: Some(P0), + }, "R4/agree positive: the deferred life family of the SAME stash IS scheduled, so the \ mana assertion above is discriminating rather than vacuous. It is COMMITTED because \ a `DriveSequence` replays real cycles and has no non-push exit (viewer {viewer:?})" From c9afcd8cce088473cc45cd239788c32cae5469c1 Mon Sep 17 00:00:00 2001 From: lgray Date: Sat, 8 Aug 2026 00:37:10 -0500 Subject: [PATCH 02/13] fix(engine): state the full ceiling in the unbounded object-growth offer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An infinite object-growth loop shortcut published a ceiling of MAX_SHORTCUT_CYCLES but seeded its own iteration_count at Fixed(1), so the finite resolution a player accepted yielded exactly one counter no matter what they chose. Reported from a real 4-player game (kilo + Freed from the Real + Relic + Pentad); the capture is committed as the regression fixture and drives the test through the production load path. CR 732.2a: the shortcut proposal must state the number of iterations it is offering. CR 732.2c: the count the players agree to is the count that is taken. The producer now seeds the schema with the very ceiling it publishes, so the offer, the collapse boundary, and the interaction picker all name the same number. THE SECOND DECLARE AUTHORITY. materialize_loop_shortcut_response maps (AcceptSuggested, Fixed { suggested, .. }) to the declared count, and that path is live today via the server's handle_full_game_submission and the WASM submit_interaction_js. Post-fix it emits the byte-identical DeclareShortcut the React echo already produced; fixing the producer without this moving would have been the defect. PROMPT WORDING. The count line reads "Repeat at most once." / "Repeat at most N times." — the cap is an upper bound, not a promise, and the wording now says so. English is written into all seven locale catalogs to satisfy the key-set parity gate without inventing translations. DISCLOSED, NOT FIXED HERE. Resolving the full 1000 cycles takes 67.572 s in a debug build (super-linear; release unmeasured). The cap stays at 1000 and the O(N) counter-side replay is a scheduled follow-up — see LEDGER 5. The wire-visible `suggested` value changes 1 -> 1000 for this offer class; no field or variant shape changes. Assisted-by: ClaudeCode:claude-opus-5 --- .../__tests__/LoopShortcutModal.test.tsx | 14 + client/src/i18n/locales/de/game.json | 4 +- client/src/i18n/locales/en/game.json | 4 +- client/src/i18n/locales/es/game.json | 4 +- client/src/i18n/locales/fr/game.json | 4 +- client/src/i18n/locales/it/game.json | 4 +- client/src/i18n/locales/pl/game.json | 4 +- client/src/i18n/locales/pt/game.json | 4 +- crates/engine/src/game/engine.rs | 51 ++- crates/engine/src/game/interaction.rs | 10 +- ...o_freed_relic_pentad_max_of_one_4p.json.gz | Bin 0 -> 859943 bytes .../kilo_live_offer_from_real_dump.rs | 337 +++++++++++++++++- .../engine/tests/integration/loop_shortcut.rs | 11 +- 13 files changed, 418 insertions(+), 33 deletions(-) create mode 100644 crates/engine/tests/fixtures/kilo_freed_relic_pentad_max_of_one_4p.json.gz diff --git a/client/src/components/modal/__tests__/LoopShortcutModal.test.tsx b/client/src/components/modal/__tests__/LoopShortcutModal.test.tsx index a5e8429a74..4bed27913e 100644 --- a/client/src/components/modal/__tests__/LoopShortcutModal.test.tsx +++ b/client/src/components/modal/__tests__/LoopShortcutModal.test.tsx @@ -81,6 +81,20 @@ describe("LoopShortcutModal", () => { type: "DeclareShortcut", data: { count: { Fixed: 1 }, template: null }, }); + // §1b (`fixedCount_one`): CR 732.2b makes a proposal an upper bound, so the modal says + // "at most" — the ruled wording. Fails against the pre-§1b catalog ("Repeat once."). + expect(screen.getByText("Repeat at most once.")).toBeInTheDocument(); + }); + + // §1b (`fixedCount_other`, CR 732.2c): post-fix the object-growth offer seeds + // Fixed(MAX_SHORTCUT_CYCLES), and the modal echoes it verbatim — so the ceiling must render with + // the "at most" wording. Covers the other plural leaf and the {{count}} interpolation; the + // pre-§1b catalog renders "Repeat 1000 times." and fails. + it("renders the ceiling with the at-most wording (§1b)", () => { + seed(buildLoopShortcutWaitingFor({ schema: { iteration_count: { Fixed: 1000 } } })); + render(); + + expect(screen.getByText("Repeat at most 1000 times.")).toBeInTheDocument(); }); // T3: display-only — a ConvokeTaps point renders a read-only info line and NO diff --git a/client/src/i18n/locales/de/game.json b/client/src/i18n/locales/de/game.json index da5d264659..78b0e8343a 100644 --- a/client/src/i18n/locales/de/game.json +++ b/client/src/i18n/locales/de/game.json @@ -16,8 +16,8 @@ "shorten": "Break out", "decline": "Decline the shortcut", "untilLethal": "Repeat until the game ends.", - "fixedCount_one": "Repeat once.", - "fixedCount_other": "Repeat {{count}} times.", + "fixedCount_one": "Repeat at most once.", + "fixedCount_other": "Repeat at most {{count}} times.", "convokeInfo_one": "Auto-taps up to 1 creature for convoke each iteration.", "convokeInfo_other": "Auto-taps up to {{count}} creatures for convoke each iteration.", "winKind": { diff --git a/client/src/i18n/locales/en/game.json b/client/src/i18n/locales/en/game.json index 5c9695141f..e54bcdf49a 100644 --- a/client/src/i18n/locales/en/game.json +++ b/client/src/i18n/locales/en/game.json @@ -22,8 +22,8 @@ "shorten": "Break out", "decline": "Decline the shortcut", "untilLethal": "Repeat until the game ends.", - "fixedCount_one": "Repeat once.", - "fixedCount_other": "Repeat {{count}} times.", + "fixedCount_one": "Repeat at most once.", + "fixedCount_other": "Repeat at most {{count}} times.", "convokeInfo_one": "Auto-taps up to 1 creature for convoke each iteration.", "convokeInfo_other": "Auto-taps up to {{count}} creatures for convoke each iteration.", "winKind": { diff --git a/client/src/i18n/locales/es/game.json b/client/src/i18n/locales/es/game.json index d730908c56..2a18e7fb92 100644 --- a/client/src/i18n/locales/es/game.json +++ b/client/src/i18n/locales/es/game.json @@ -16,8 +16,8 @@ "shorten": "Break out", "decline": "Decline the shortcut", "untilLethal": "Repeat until the game ends.", - "fixedCount_one": "Repeat once.", - "fixedCount_other": "Repeat {{count}} times.", + "fixedCount_one": "Repeat at most once.", + "fixedCount_other": "Repeat at most {{count}} times.", "convokeInfo_one": "Auto-taps up to 1 creature for convoke each iteration.", "convokeInfo_other": "Auto-taps up to {{count}} creatures for convoke each iteration.", "winKind": { diff --git a/client/src/i18n/locales/fr/game.json b/client/src/i18n/locales/fr/game.json index 43e97cd349..38cf5d78d9 100644 --- a/client/src/i18n/locales/fr/game.json +++ b/client/src/i18n/locales/fr/game.json @@ -16,8 +16,8 @@ "shorten": "Break out", "decline": "Decline the shortcut", "untilLethal": "Repeat until the game ends.", - "fixedCount_one": "Repeat once.", - "fixedCount_other": "Repeat {{count}} times.", + "fixedCount_one": "Repeat at most once.", + "fixedCount_other": "Repeat at most {{count}} times.", "convokeInfo_one": "Auto-taps up to 1 creature for convoke each iteration.", "convokeInfo_other": "Auto-taps up to {{count}} creatures for convoke each iteration.", "winKind": { diff --git a/client/src/i18n/locales/it/game.json b/client/src/i18n/locales/it/game.json index e4fdc4bbdb..dab591e502 100644 --- a/client/src/i18n/locales/it/game.json +++ b/client/src/i18n/locales/it/game.json @@ -16,8 +16,8 @@ "shorten": "Break out", "decline": "Decline the shortcut", "untilLethal": "Repeat until the game ends.", - "fixedCount_one": "Repeat once.", - "fixedCount_other": "Repeat {{count}} times.", + "fixedCount_one": "Repeat at most once.", + "fixedCount_other": "Repeat at most {{count}} times.", "convokeInfo_one": "Auto-taps up to 1 creature for convoke each iteration.", "convokeInfo_other": "Auto-taps up to {{count}} creatures for convoke each iteration.", "winKind": { diff --git a/client/src/i18n/locales/pl/game.json b/client/src/i18n/locales/pl/game.json index a497e8e47a..362b3b5e81 100644 --- a/client/src/i18n/locales/pl/game.json +++ b/client/src/i18n/locales/pl/game.json @@ -16,8 +16,8 @@ "shorten": "Break out", "decline": "Decline the shortcut", "untilLethal": "Repeat until the game ends.", - "fixedCount_one": "Repeat once.", - "fixedCount_other": "Repeat {{count}} times.", + "fixedCount_one": "Repeat at most once.", + "fixedCount_other": "Repeat at most {{count}} times.", "convokeInfo_one": "Auto-taps up to 1 creature for convoke each iteration.", "convokeInfo_other": "Auto-taps up to {{count}} creatures for convoke each iteration.", "winKind": { diff --git a/client/src/i18n/locales/pt/game.json b/client/src/i18n/locales/pt/game.json index 22741211f8..a00ea06830 100644 --- a/client/src/i18n/locales/pt/game.json +++ b/client/src/i18n/locales/pt/game.json @@ -16,8 +16,8 @@ "shorten": "Break out", "decline": "Decline the shortcut", "untilLethal": "Repeat until the game ends.", - "fixedCount_one": "Repeat once.", - "fixedCount_other": "Repeat {{count}} times.", + "fixedCount_one": "Repeat at most once.", + "fixedCount_other": "Repeat at most {{count}} times.", "convokeInfo_one": "Auto-taps up to 1 creature for convoke each iteration.", "convokeInfo_other": "Auto-taps up to {{count}} creatures for convoke each iteration.", "winKind": { diff --git a/crates/engine/src/game/engine.rs b/crates/engine/src/game/engine.rs index 2e82da75de..7f217852f9 100644 --- a/crates/engine/src/game/engine.rs +++ b/crates/engine/src/game/engine.rs @@ -4904,11 +4904,34 @@ fn try_offer_object_growth_shortcut( // CR 732.2a: an UNBOUNDED object-growth offer is not repeated a CR 704-limited number of // times — it is materialized once as an unbounded axis — so it states no narrowed count // bound and keeps the global safety limit. + // + // CR 732.2a + CR 732.2c: the count this offer STATES is the count the table binds. There is + // no declare-time picker (the frontend echoes `iteration_count` verbatim), and once the last + // player accepts, "the shortcut is taken" at that count, which then caps the CR 500.5 + // collapse prompt. An offer that narrows no bound must therefore STATE the global limit it + // publishes as its ceiling; stating less silently caps the controller's collapse choice. + // This mirrors `certified_bounded_cycle_offer`, which already states `Fixed(max_iterations)`. + // + // CR 704.5a / CR 704.5c: the `UntilLethal` arm is UNREACHABLE FROM THIS PRODUCER — `delta` is + // a two-`snapshot` diff, and `ResourceVector::snapshot` writes neither `damage_dealt` nor + // `extra_turns` and never keys a poison `counters` entry by `ObjectClass::Player`, while + // `has_no_loss_axis` just above forces `life >= 0`, `library_delta >= 0`, `poison <= 0` on + // every seat; together those negate every non-`Advantage` branch of `classify_win_kind`. The + // arm is kept anyway so `shortcut_iteration_count` stays the SINGLE authority for that + // classification, and so this wildcard-free match build-breaks on a future third + // `IterationCount` variant — the guard `handle_declare_shortcut` states for its own cap. The + // unreachability is editorial, not structural: this function already event-feeds + // `tokens_created` into the same delta, so feeding `damage_dealt` would make the arm live. + use crate::analysis::decision_template::IterationCount; + let iteration_count = match shortcut_iteration_count(certificate.win_kind) { + IterationCount::UntilLethal => IterationCount::UntilLethal, + IterationCount::Fixed(_) => IterationCount::Fixed(MAX_SHORTCUT_CYCLES), + }; let schema = build_shortcut_schema( // CR 732.2a: an unresolvable pin WITHDRAWS the offer rather than publishing an // undeclarable point — see `pinned_decisions_to_points`. pinned_decisions_to_points(&schema_template.decisions, state, caster)?, - shortcut_iteration_count(certificate.win_kind), + iteration_count, MAX_SHORTCUT_CYCLES, ); Some((certificate, schema)) @@ -15924,7 +15947,31 @@ mod stage2_injector_tests { // COLLISION NOTE: a separate in-flight CR 500.5 `max` bugfix also edits this file // above this producer. Whichever lands second MUST re-derive by content; it cannot // reuse this number, and neither entry's arithmetic is authority for the other's. - "game/engine.rs:11814".to_string(), + // + // CR 500.5 `max` BUGFIX (WB-7048): `:11814 ⇒ :11837`, `+23`. This IS the in-flight + // bugfix the COLLISION NOTE directly above anticipated, and it is the one landing + // SECOND — so the coordinate was re-derived BY CONTENT exactly as that note + // requires, and the arithmetic was computed afterwards as a CHECK, never as the + // source. The number above was NOT reused. The insertion is a single expression in + // `try_offer_object_growth_shortcut` — the unbounded object-growth producer now + // STATES the ceiling it publishes (`Fixed(MAX_SHORTCUT_CYCLES)`) instead of seeding + // `Fixed(1)`, since CR 732.2c makes the accepted count binding and that count caps + // the CR 500.5 collapse prompt. Its 33 lines replace 10 (23 of the 33 are comment), + // netting `+23`; the shift is LOCAL, originating in this diff, not rebase-induced. + // That insertion sits ABOVE this producer and BELOW nothing else pinned by this + // row. Predicted `11814+23` equals the observed coordinate exactly. + // + // Identity re-established, hashing convention per the entry above (hashed WITH the + // trailing newline — not restated here): the line at `:11837` is sha256-identical + // to every earlier coordinate this row has carried, that digest is still UNIQUE + // under a whole-file scan, and it is still inside + // `begin_pending_trigger_target_selection`. + // + // SET PRESERVATION: unchanged. The other four entries live in `game/effects/mod.rs` + // and `game/effects/scoped_library_search.rs`, neither of which this change touches, + // and the inserted expression adds no line matching the needle — total still 37, + // partition still 5/7/25. + "game/engine.rs:11837".to_string(), ], "the five production producers, NAMED: the CR 603.5 gate in `resolve_chain_body` \ plus the two repeated-optional-payment drivers, the per-player acceptance cursor \ diff --git a/crates/engine/src/game/interaction.rs b/crates/engine/src/game/interaction.rs index d3dff9378f..cb4edc9d81 100644 --- a/crates/engine/src/game/interaction.rs +++ b/crates/engine/src/game/interaction.rs @@ -2469,9 +2469,13 @@ fn loop_shortcut_projection( // restored dump into an engine panic. // // LATENT, NOT LIVE (measured at this head): no in-tree producer can reach this - // arm with `0`. `build_shortcut_schema` (`game/engine.rs`) has exactly two call - // sites and both pass `MAX_SHORTCUT_CYCLES`; the per-viewer projection in - // `game/visibility.rs` only re-projects an existing schema's value; and + // arm with `0`. `build_shortcut_schema` (`game/engine.rs`) has THREE call sites: + // `interactive_loop_bridge` and `try_offer_object_growth_shortcut` pass + // `MAX_SHORTCUT_CYCLES`, while `certified_bounded_cycle_offer` passes a NARROWED + // `max_iterations` — which cannot be `0` either, because that producer refuses + // outright unless `(1..MAX_SHORTCUT_CYCLES).contains(&max_iterations)`. The + // per-viewer projection in `game/visibility.rs` only re-projects an existing + // schema's value; and // `ShortcutDecisionSchema::default().max_iterations == default_max_iterations() // == MAX_SHORTCUT_CYCLES` (`analysis/decision_template.rs`), which is also the // `#[serde(default)]` for a pre-bound save. The only way `0` diff --git a/crates/engine/tests/fixtures/kilo_freed_relic_pentad_max_of_one_4p.json.gz b/crates/engine/tests/fixtures/kilo_freed_relic_pentad_max_of_one_4p.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..48acb6116cac6fbbd84a387b270ae0a4a0bce83a GIT binary patch literal 859943 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

Rl*);YEd28BB+#@j9P`1BZZ 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

jL#S~vPFykPX$rY| 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

p}^Z)U!ts#EU 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¨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%0AH2!@WSy|>=mx~5IFXUAQ?UgEAKOB9L57D zHp@k>nnxaqc+4jO@Wr3xU9UigvPaEr#%nZTObKXEodn`zIW~41KDKHrK)LyBwfH8m zWKlp>WpMBeV9*3ao8}@nEYPLcWi$Fy8NH%=of%`11W?XkRrAL;wHB2sezl0_l}$wJ z;fjfoX*Y(%e9C@WOo#0Zjc&;x^5jSMD9OP+0zw|_AhTFlmjTzlJ0MBM!sugH2KL}} z)>e0qCs|mE{RkeuFnm5PZ->Lsg4=7ROrTnA8eNY#mo0X<=*lh|frCntbssg=8sXd; zqU|lhRmbj(%7H6JcEI>gJEO@0Qms{uv>ppoPr^U4(XjT$ft%_YT-8aw`)$!ucrLzi zawi<`Mc~Wu3U{n>;dBZxy!ChD-f*(r#5!XagxvO{VHsn9KiO7@7B_*v)A5>a4f?U< zgdYK(*@iekczlcJcG=!Jkk+35|0eIg!2JMlhjTXRA=>y(uh>)y7^I6S0X+U3dfU=+ zD?RUa4T$U>em(rOIjpI~f~wJ_y5R`#c#g%JB*BN9@Ysqav_gaQMr~}%P_J-$XSPn3 z-orc`H#uV@Ujw~Hb_-#dyq|Dslev^|%w?YnSCgeG(imRFeYN@`Y4^0vdETv`gjID_ zn2acJug8QVDl5YmPjG#VBm&Y_2jeE!m-d<&k%TwW6WkQ>_=;fOUGE;h=uTuO3&T=V z4*bf|A|%CQ7mUTf)A1t3#S}7ngvBgc#%AH&j1f_N?;TOrYMpc1r@_=7305g;abm2OjDAzzO@sK3Ae z;_h>K@dEnvhjy7>YLS&4Hzj-bm+;rSzr`P)-Q9rSt$GAM{r2v{LT|Nv7%{ut&DS@& zv0hwQ>h8(Q&#V{Z3I2Qb^7-|vF!m3;826WD{JWoeoMq{;G_t5fh!gWDa^;`q+C$)? z!@~_9bJOaF*K~h(vFFc;d-K;^%E$4mF_34GN*U%4cBONO@AObI&^#9X3N0;7Y;oVr zJWQx5L5QJZ!gbB7LAsN&2B6O=!HQj2Y_l(cE0X^eHnrqEJHXc`A|Qxzbf zB!u|rHJ7lN+Dr_z$3%XiKA_5BjhC); z>UCLxm8pzPR|cY>Z2_esLnvug7=>vnzQ|d?5PHpwhAF|jP1vAzVCg#`R=1#R4M1L& zIZRi|v;zddbnM>xAUxA-sXyG+2gar+!>9~*&jpZlm``Z9@v#=Z3M>Glb6mph083yx zW^Dq>M21b!Hf=)d3pbPbX( z4yz?^^^tFJa>Cp_d3k?l4)NdIo7H=#7WDht9=~b$K9yJgipwhl;Q7YchD*l60cFNa z*TQ)pRfj;;wfqtHKz`Us`TuB@{FWgQ_vcIeu=S*^M3HJiU8PpV+7o-kgG)oqoqbem@r8r}E$5 z!{~n_9{=i^*!=;?mj8Gqmn4{~`s0;rc^%)zC*J?d?TSbH^`oa|9<<0WF*oy$fqN@O za~RsC ze66MQNar_{)}{@IjU1i}f0a?#?$VAaj=hs+Bi>4I{UXdS$4xX$vbxEegvI5q3B z%XUhOR9Q*_slX|MH7~mPjkSooSq*q>Rr7$y?Zcq+yCyRS!FioBdI@JO`tNZak+!|_ z(rl#cAU#lbp@jvHJ;<`*xhd752YzodGDfx)OqMpEif69cOSF=})XE7QI$T-Wn1y^v zQJSk^1|9IYPqLwcLR#gC?=vT2b8euo@cP3_c!PuYv|%7|&eF)TxR_vvmnz zT^gq{rfhc`nG<^t@9V2f#tN)8;gsCY7Pn_REEUgAj;LF`VjHC3tFLB)zSr>Eov~QP z9*!H6O%c`4bWX>*8n0Qwcb9xfLd9}LrpI>1JNVwV8r_z++IgL07I8W}si;{`SCY5l z*Anr)=b8*jCK{G*4dYxBh}vMKTTrZKNV>e;t;NFP!Oe=h#%`X3$3y%!TW$-aQf(wl z8&i*u*##>w96q`}NcowHk0bsoIgP`3PQy zkuj2uP0{MsIBlKg>m|LtVM~1=ktrwT`iVoe@CW3+FDzWD)^pJ1uo`rcCyp%yt1!dY zT*u1xwOPPx)yI)ztaEblFqgU6*V7>cksP5o(j{1qWMJzOe&0bou(p(uN{ian+|Q{~ z`o)quNSL>$? zMqOZ!lhKO{<7s$f!LE&yt_okK5A){tSxs(XoNW(>Z%on@FKoRUk~jq#r?ayG1{;f? zaJ*eierjJi6w5J4$HAW1Yh`tP4wT3VnGX{OtK*JWTbM{{qS(&rnGIsPYFgNB#!_^b z+Csuf?9*I3$pF?rk5x70f4bO+MyaZ-t3cUKrG^ub}}<>FRt5(1QMWDR(- z{gSVK+|KLY-CC}{0qtLh^gaTJ|3gNC zehL8oY65_<{m8fI*}hX+|3og7TUFAva{v4c0`%@7mR5R;|qZ?xmftjfF1^hS(+eH@&_uh4J5J3*k$5q91>51M7nz|NkLn z1j{Z|J!hY{BE5o(eiKBix8`e=TCTLxb8FAxBr?Sbgbzr;+Y;UjRp{14?*i&05Jm$b zK>Q_0h2!p+ahBVPDJs1vNX6N>EHgS5A#9V_^^TyWZ5Ir&lIpYk@z0$?-bsM#=^f4e z^bL+EHVU2f)9Gs$&c8q^&fMD;{+;CrbDc^Y9F$SO*58Xh(|IJ#p1LpiXb4rXp1J_@ z_o>Ff@Yb=qFV8vi60>Y^ifa`Ca=UDmi|Y8`Pi)5gZHm)$amiI#S`3@V6m#tQ{VLGe zb14cC9A4p+A__3PIq^mjybOJITP!;bq&B09AGlM+;Ln;SZj4ha)d0>O`29|U3b*oH zae>1Zon@3UMUigqIT3xoPhA+=wDCkYsI_*%=3f~8nO9U~9P#lf?mLYTB$2&=LxJ1F zY`Xh1@dh6vH8JLfyON3CcZ(ylMS(%MPkIYUZG6R*POWQ~Wy~^px2OKxxw1j}THnJJ zHt%!S=^Z@8WW%CpHE6X*kgYz3eo5F|ooS1?sjHjav`E8BxKj5(gN!Y5OteAv>eM-k zVVGdG-nesBThzd&LY&Bvabm8m?6HdOJS* zSWzt^gqxa??qCjCWtUM!l(!jcXP25f`CZp?HX^1T8$OC4GipRT3(DFt7pt$Kcrzn} zZ5dTx(7U}S9Fu}C4gV@;_y`!@R{>#jB|IxG&;5s2B$)m`dhf{2IQOmL$j$f3YRg%i z2EM&4)W~CLWCdC_9eg6XnkIU+#6jQcGlg9{SiyPXg*Hn2z zZJJv&c=V-MZ{O4&+)~urLb=n*IMtYVE<80_fy@mUbzllmqh{F9#d3{+j+v*JEG8fH zH|jxjZ!T>dHjXb={z|crMnQQZ<0kEHbA5VhFPbA(K&oXzI1D*Pem0r6$x}Nz>7Z#| zKJ0Y=Qn*z$QQt7~gffuIXKdls^>WkyvMEtDJB#XX^IT)E3oZU=#cE(nbg}A1ewFq9 zXb6xB6aUT6mRQ**zxrdc-v0xb`;Y1@{;i5>KKPV<-+8oFka&U?n5?Dstz@66rce&2 z`Dq3Vc=`}w^F45R{vG8B>AlMnzFmz$`dZSs|1+iR{zYsAe2;6owf6hq1oe7?z8yi~ z9z<_q6o}YI$UDByb5b!)&#SOk$U+Q6$hL6=cKW@^&Nk=mZUrxF?;4IRgTuG0ACq&z z@6>nunqcHdpS=0>W37lE{a}3ji_bp&(;1uoX6OEMukjxi_wVuI9yy1b(S{5Th?{?N z8WqE%5ZgH#3;N)|@L{j=e`T+-q|-3%njIoMtJ9?2+EWLb5Yg&u0iHf2-+dTbAGSrj z1^q#t&#hhb--VUdc=>qFD+c~l^9(v3RVk`lH+}7~kJMl8mdTG8i6r;iN-iE381YJLhvU z2AvyKX=43!ZHwneeW+RWjoYs~>0#IOQOk71&iaQtWBXFes%AksBG<5?G{%9zhGSI|1QOSS9w=7~mijoHQB68>I-N&i;A#Sx5h%o&**kKu$teJ;QCS1U26e6Z8>Y5 zCp@m)j9I-qwz0fMtu7(eKb}Xp8nMURs?O}`>RoJeg*i2(nKjHwP)s4AKUISas;=~Q zx*KL?wbglJ*$=^uB8a|1?B(YAv3)#Ere!zYCmovN!LRCyiQdJ_pW&3nQK zwGtEAI9R}Rcieih5vZfLo7-EDD!=ubm=bW~I=GnW@1CxAHB0M#zBJM5gRya@fU!Yx z+dVUTN^EW);dtk5SN3Y1-Bfw(SlN(|`dr+jG(HP^&%5l`W?IONZTQZqgT^VQR#80! z%T;WtW{GCs@9IEJ->D5EF!-4i^0iY=Oz!AU%%f_ps0PnCtZ|tZ{>GmB8kixE8k6}0 z+&i&FWU^)Vl78UJ}c`q|HgXaDQX z$De&{qLz<7ee>VvH>*;@9QF9FLBfA&_(^A1|``FGbU{nPw+wd)V; z(Leu62#`^ZPhL0sZit$Hefd9sHjK*uz#jL_r+WC$zxrXn{Ok>-0AIF@VZ=WaYcu{n z`U1;}X#Vt9AHBI>lcrsb1eoo|LZHThKmDWO^Y8(m|3&6L&vs9VkMD)D)?A*RoA3*+ z^hc2NRb1>gMxyy>-RD?;Rr3%LBo2c02gS6N+1uX# z?!yX#+u_O1EEz^&P_zNh9Fhv!6r za?ifcPs#0D3Co3m?e2}kj6miIzq_@zH&Bm;!7i4?*q zv29_{l6rhy7J`KUdAwJ&?hA3caXC&MVk0YVGYtBnuo7^a+pN&DsN>ShFRKp(5&c=-wNs)nS8+ zUcrSKT?pIUz+)C7N&@5#Yx*=r8$^iexU{*7c(|^Hu?@zmdV%%=d_<}u= zBhJ`{(I3JV^x;m#LttA^VdnltPoIN2<03#hbx!m*4Si3ecBBmBs-;nFjg@L31ER29 z3D{g}|1ESW^2n#P>(sF>9xN0WAL6G#&fEDd`sQ4+>55Vey}K@?{ZcuTc7P$$76jbY zkuhxr<0JYRHV(fQIwfl6U^vZ-Nk`2hRz}^$$at^MedUY?j`e|~5s&xdM=@6e!VaQ^ zw@<6x7K$8)cnrOdse22-Oq^!vYqidq5sD3AdQlAVXyH#cT&yBq-3UwY?WkX9@Z-)z zJ(Brbmv)7D)!g%CgB$(!SZq&1x(jjSXGU@_a*riwrg$Blve`ymv3h=tKovI?}{S%c-?RPfoxxznLfdg?HCVFY}E07T*?oyX~=tUERq0KPx6D#`8^I2!xv{QUp+keEkmx4t{&yr?pxoaO8Dk?{pXadzBMcTeR|bzO?$ps zjr`ZYlOEZ9yazA(E}GeQcivYUzE|H}Kl%9^!Q20M^RZno2K8Ic72g|7uf=eeqE)f% zQ97kJ-(3VwGk?0(o9;lS95-v z?PjktS#-~+7FU9wW}R86QIIOv(~sFM4S^zoH6f3MoxecdBUW;ras_mR-F&IbY!F3p zaD!|IqkNx`l#*(4{cZUQ1zUj9P44uIj%`^Yfxt``ae1Qf*ojr(*_E#^+n-<&^O42D z+K$D0`V#(WX0<=THk-h8U%e~=8#YC=VDj8qVD;p6gn^G<%wO2T{`(G`zrjiHd*UJZ zS3mspr(gc|D-+z?mEzsyCx6+6C(bzy?aX$th*H|7H^xd;q^ux=4V3}!9LE+uia_7< z3jA%z>q*hrN6f4`i!5}j+JRH9b#c7&HmfTwvE;IRy|yba{wpfU!C3_LHcL?=$)&Rg z!AWB@C4cBSxvQHQxTsD$^zgV`i8S4H4m1%#(tDeW|{Ztfq@XJRM}oL=d?h1LuS;n~=ig z68D-5@iV^8$j7VrW~^)HBWmtVd+)@;HmVMC`?L;`=GH|0Ym9ert~Rgjduh@iOHZnm zlZ}}{ZW-Bm{bZMGuRU82DYfbsRiDO=3tEYGwD^_gn(k$bKieaeu4PTFRWSz;G1iLI z^x-agJ(Q2$y?RI!?VRh1>yy8B^$1!O^+c)86Gy+xSf(TOWMBz#@dX$S$IMb5=XdW} ztoXIT;JTKsh4zH{{uEXs{JN^ca4TJJq1emn`)2ii3>4Uh;9PoY5f=fDn&ZQACYg34 zRl$g@79f))HruuH&kmVQ09=J_WNH0PEw!g{I-E%E?D&OeUpS^ytG)d+5;!y7$~9bez$!%}$Xo6}5bt1`hFdW$l?=^7a;HSF=UJ89Uw5+%B_z)R&Zg zG>Gk}Q4%{;b!LgXTr;1+4l_mGkP{anDH&WL;MFbp9+8L%gD1~)y z*+!rSf_Iw7p1n|NH4Pqptlpi*-Uusdda_3#peQebhfFO%%xcoyl+V!*!gKNUvJRF881O&2u;$tBB^{Nr=Ny)y&Hf1xBAgg=2 z)l8(`GzU9(UVGL0?6QnsKf7y)|1e8$V^EE%mq_aS2vk_J7>G>2%E1) za2Ugxq{%r%Jk(x(h2i?KCyl$YUaLV0DN#tf#48?sMMB0mlCyS8OYN`Oz!&p9A;U4+ z%(I=3eZz+Avb#27a(#OsB2zDm5}33vh9;@J(zOI)UBt+JZ_>3I209L}cJ-PY^SRDq zcJ&5`gOcPTR zy9Sc?PHTuQA3`hVZgu`Z$YdHs78U`exHYQ0dg8PK2d}x*^=Z{FoU9W$T$kn>!n(FU z>Jir8x^NXa5Ql)@bck5P8=gJvQtn#Yf}lL0C$7F>!Z=+tEw zTmMJ%B!V{$D&iV67Mj*BO(3DZE^B&Ox_gllP)$X|Dj1}xvKGuZrU{<>paev-^QxC* zgHEsliN}|eT1|`fHL^xWS4el|OB1wN7!cnRUxr0dT7xjXlLM>4wqNSop%?Vvw6Bhv zv`X8P3hIc@)@M&}NFW)@qoLG7a4Usk?InaA3`yPdK%JJzmt^(Qy1oVJs_U;$Tf~>r zo(nWM7qwI*EQ>{-NfNW!qo})JqolbPkw;a%`6{*WkKHp&bw*}HWQ6~dCAIC&^_E;3CHvZlO$r+pgo<1a|jx_x3b7J&Qs|^d%4U!Q)DDUr(XC z4pvOCDZDySM}#{m!Q4&LlF&)?qatB#pEklF&~!kB!`vs(ogS^VWw?M`7|CA95Jso; zHg{7;rJ6_oP>dV>g*1+zwZXl+W5-5fk)U*{&RJv7p5>`hG%g$MRO+ER=Exi95!i2X zB!@6#l(k%gsqw;FGBi@ar%o9t3Ho@!ll6OlXkmN)PPbY4eNny}Q6b^=WU}otIVJnHB(v zP%x7A+X^pt%DXOWDO&Mr6L1)`Z8oGVOp-NkcE+MhePw#o)W)6L15H`$QRpxV4l$4_ zNU$A@cf#ysm+8ac2OlQCEW}ACU|yz zCf}*cjxLC&W6lmiaIp+Dk=Mh^@j{{H?6M@xChJ@?E?Uc|%QnH4JFjCS3-t*$j#zUu#I?DhEsl0ghp?&0 zgcXe3=Axpqyq3fGuymRBBC0a2GLzbvt(3_`EL0b+>j^=TN(n*Rr+empsfVR*!N}Hv z&S_8KQj3;HHVi-*s~4qDlfT)7AKKAM9_M@8gh{KuN_$2dDd@DMO;}HGLsq$@c~YTm z+l=~wVn9!?XikVTu8#7rYlD|>(XKAb8KgMsLs^YbooaV=J>z1bq(c72Ui} z|I}ht)Hrnj^$1=Df7PaTZLVk&*kxr6bSoSztlxo0+G2|kd7@5@s_S`~A~?Cy;Q6#w z|H$YIm5NMgoI3lqEooYlC6jMqv3BGTWQ_%Wdhjbb2!HAv%vogGFXyxuIQ8^uWP%W3 z<^P|V`BnJlF-A=Kd0N%e_&w=MNagLS<0n-^gk zM(CYQd&}V~gx9SK5O|#KZtg>WRLH?|;~P65mQIGI&jdKsPpH-bW5zBFLC z$Y96;A2M>mpO291taGQT8m&RqvkEdbA;_-gKB6^5>)!&5Af(QDQb^yB`q9zzc^ir~ zZQ2`=RGp*&!xAoNCu*YsCeJL_ST+GiYnj)#p_-iPitsm0xjlwug?1oop+`z*XT4WQ zmgvrQ&;rU@616);F|wA$pIxzAopCxCF{l*C5p+)dq{~AH&=F#o`{+(+&_@AUD)$rv z(DGikETlRQ{U2+u-sEp&CnkORATDd)5HO#v6@ku{%4sbXB{gRJ>jbGzx?*M7mrZzl z$hh}25|MwbP?n08< zly09VpxxJ5wnSd8K#-uLOh-D;EbL>=P?n}MW=7MaXP!cF{mOApw5&Am*HLD#c3E~9 zrNs@-LM~{2XuI$0P>do}J`6eRa)whFSzZPqqhWn#avy8arr3|>R#W5Mclk7}s-P)7 z-2_`{11RqTJ|WNAj23X;%475?e&^pS_MknLf zpe-V=O=x;1B)jQ#XQ2Z5$z;}2_DBeWW)~8K#)(!)1o@&9qCMM-h1k1b5y~&xu2}K{ z)s0*lIxbaqYrSY9?=sKpl!uSS4j>4h5ag)ns>z``^I1%Ol%lgItII?J>d!hZIx+rWl<1jb++|$^I(F+N z+>c{N0&Y1#c)pU^hL+TSv=M4cEuZVV6s$$SVp#np#vFwZ6kf_kkPhJYcduP z4L728ecE7rM2jU4p+HlvC);8*C`KGkoaRb7IyySL*7P`H7<;cK!lCc$X}})?GV%#( z9TN%E`z@(Nx0wgr=c-V&$V4~Xhhktdjae8;VWN{a*bL_FQvqb#joXNBERziKr>;&L zt8mzHe%i=$*H#O}96oXY`74F2P}i=t4IY8yQ(U#d1hHXH0b7=&M^M1I!~VLi=Vf{T zNQ7kZ5W%yiR2Q`hW7i@Ii&*%tZJqpT^%D#Uq&_SrwGX`}t!~@S%Z8%Z71Tzwn-h~9 zs9WijBReGUx1E<&b`mA$2^p3Gs305bw7)AIud8Y0>5zCD0+%?*g3GSMQH$~1%iJR} zNcL&Y(q$g7tb z)*?nQd6Y%UtDJZ}u++l7d4%(_G@>9#GGbf>U}R`z2E(Qxt8TH`tPgTn1AbuV@G?hb zmQ8o5_)4hGM()OWnc(oyQSzjPyF5o-v71{Mp%uC-r(Gtaw>1W3s0gIQG?=1+yza7D zIw1S7{?J`PYr`FTOP1<`iY%y(7n+_rD7%eP35xZ$$_$#xq{;+x$O`Tt`{|193?unn z8>w$>e*8ivmT|EzPWX8qK|bvArELfk>Ce+)L5in$RRCiOqs1YcYomMK*WFgKH-K5% zV7HV-3i8<6VG0$7M&7pB5-CkvbsLfI`uM2uKS>nbUHrx@?<@+LzH7 z8k>Q!!Yn%`OCNGnSZyh5jEhrvxoA@(D!U@J)rg&$nUqzltF3A3PRBc-hKdc*E31@{ zv~9CYB#Ck(*Vfalc9eRe)0cRm=(24UXj+d^1{J?YmAy}gR6R&Bw&&S6Vmw6Ce3 z7NTp#GI}9_>{BwHCMPIjORvb>(k7*O;4!kCp;$|e0%yhO)28U4Q1kK$i-3Zqg&Fe< z)e3nbR4quh-K+TK*oA6V%sDNxGK0e2dXc3)1#s-#U%;) zE2B7Vo!9wBEE>p_k{0DH~;yiB2LkfA&dqv}qa*v&5r!wy$#JuZB8^6uF| zRkzEx=(B@f4b42R%TVbMMw3rtThX<<$N*Wj!cr5$mUIc7!KdwB!4#U<&klJ7`*O^R zG?pe~rYEj@F!C*hG)zSJWsP=DT{vm$LpQSh?A_(EA-K2~rYmJ?oVgDMb|K4Z2c>6! zURE|nh@CavljE+``!XW3I{9^2A>Pk5*atBHahAQZv0k{c6`gB2e|sSl>ceAOrnMZ* z3dMC0E|4Fnkm zMuAqFjMUi^@I&yn!7JIx)i&Mgh}x4vR&)f}WnS=r!U#!5JEuaZ-3Gy7aF^-h5#Y*` z0T7rhbkjSGYGD$B5IycA%wXcr5KE%jn^7UKA&){odV|7kQhv7_S5PFsN0KEgB@0Ek zg#Wvav+O?kykXEi$bV>6;QK zV0aU*({nIxqG$FB;Fp;wpc;H9L*ffj^Nv?bQ?(lU2sK^Sw=D`e(aK0Ps`BxE@)=Ma)? z@eceC*N~vPY^@q;2*}NF9vO5ZQNC25LB-nVrGBAZ+LkZ6x70QvJw-dqE9{qusY5 z^lhJ}JJl9pbKtX>77{$xtxiR^Sw42QQv(%%W9fTRh>SkL3ZU03pGmyFSt=}0-=ry} znWjZnWSlznOvUs;XE!Riu*>vv1ebIGDapx+3OT@_xuXrQ%~&m>6zY}@kfU?}LH#xM z?Om)LHv%+!dGmMSvbQSrTiZqHwwik5gH(&V?zv4(8)a7;2~o1roMmJvLUUYI~$&)%E-M92bAfu3afS=beHoCQ8R zIbW@`};lq`}D4x6tjMhT|#wORs_X-5rBPdji zG@67t)47`x-Cy#()JtR7?cSnpomA(t+b|Y|e_@Y71B;MgNFfdr(?!n#4Rkp&f?^MQ zglvc)WD+PHVLQn=C_Eoo?=#bWMIygYAjl0R_UShT?dN4a9)sYPAPLSU>_>>1YtHY^MP{_zg?+O@IOQ*-(9S5oY zWF3o;SEK_OU#HM)_nQEV&ARQ0tOFR3K5Rg|V$vx`sgPo>*%JNF@inrGB1;`jbDoPsR}vIUI^wo;InZx2Grd+h8-V z=8S}SrvNTJjm$dAQR7eB;uKI$tzB3xH4#H}lg-i4`1K?R3Y{XW5ie8|Rktph?4BGzMK>h0 zAcGc1){pHnfe3l^MIOjH%RIrh?6kmf9W{)y+Pw)1t_ms_y-Ut1peoXGAbU3$y*sS` zEv8;62$NU?BOUbS$)*cEb_KEXlG%n0S9E6suqgC$IcTvo#*jJxXSMqOAzh<-gYg6n=`sb9XE|enIxEzr(t7$w(V{Dco z6T-)J8&OSExE47|@SE@0thy)SLm>F5yy+l0v zQz0?3pgVJ)^!9{(m6gFaTg@oSyGPl1ZEfsZBLOZ0qm86*r15I=CVH*+qm!*zMphQL zEA#3j+`Ue5qJpSttQ)b9opdLeRC0rpBO~MK^v%MZtB|)D2Q!^|Z+quSDc|IhxmAWD z^qAempM**Vq}1B3G%LB-DY&e5yyRvX)!gkeA#$9%R-Gz6(JsJMJ8v|Z+Z?S4N|#ah zmXq>;#ztie$)GLLtEP2REWu?{h`7sLO%uFfZ^~4$g`;AuCg*)>icev$LpIqBQvIFE zmRCR{GYO+Jfst`<>$ob6X=f(Y+Lj7mzip)9U?wszqewT`qE$c&j5%Wx9TA>p@7iqg z=a%#n2#>3iH|R#0Jm|9aRR6UEyEZK2)#qh;^3G(4vyl&GhXIW!31xv{XL)iR9PJj0 zkKI(nD(_9^wKXC5HLhvcsn=z_F^Lj_Cqql;6`obzL<_Oix>{$cw%V4_a*Jc*oFc0x zfV~`*uZgs!8Q-DYDSYn>&Es@8=+t*Tb6aJ@^yas2)iI%lwPYF97MZA~i$QO;P}Uy@ z)x%_hUP6L06gqn{P)z$wM{k~6rsC^WaZ=o^L5rBaP>5^Z+NZH^#=0a}N1aHYVoF`Y zww*Vy2e=r8A8CxBchS?qD&ubh>&ICT&Wx#Rm%%HmryB~OhpcKo+O)`MQ=Q!=M}*5i1RFg9)tDLF^+Yo2 za?L)>^Gg-J(~%otlJu29e;}wf2WoE$cI_-2a4b#6;u}o@8?;_R&I+XkKLxlIcGwQl z&B2vJi~~HTZ7J=D*b%Z#1z(mYKaQ%PP^UiDZqoA*nC&oy(b&_pLYDbCj+O>e0dfG8 zZ&uX)Xf(=+el-rhk>4L$A3+I9K;Sn>+$jsRLgSdzk+nISBSpO%P@ggbo;iAeLEs*azi>F9i z>bs&5asxE~gF~~|gO4Z+xYaS50gQuo$(5r7YV!$M0qxvHz;OzbhjpFjy-k{~5#BP5 zA3iN1J2!J~foXQjha7aLLqd?Pv8`J3ST4)%$kxg!XY;3r!m~kFfB+P67Pz-7lx8MP z5iW8OcAVvm^tPCur!I5&d6t%vHUxp&h$qiksqv6~TpSIrx;Mg#3Ot@0S=rs265#=( zJI=icPEc~3^_WeD%gTiZQWs5TcT&Liq^2@;;9b#z>|@n`*hXps2Sg>!G#6poNCF(R z@U<#LF{@E%$gj5~tU)cYp2H@&u*6Q@NibXiqOGYG3T%a#Km;R^dX>L9Mhw`H+0WOj z|ID;W1rm93lw_J(Qv6;_^sOG}IUT|Bj>lL~S&up7t%eJ2fP>7Lk9NN*@ z!udFxihGzeZ*JP;<`Vf`D?hsu{Q! z1YGykk~?ymIEK~u2uZ|JOV04N*e2J`SeKb=4>*>?kVAqN4F$(xY;zk%Jkc_`Ya<;9 zDV(qOfCWW9vRMWrFuKA#Bpo_cH*^_H(4P)DzoF=(8`X_q9{sktD#lKsuF*7SQV!b8 z%`8WfT$G=2^2@j1VdML~4%iOz%K=!;$A>xLq39VkgHx4ViIqU9D!=)Hy z->|2RNt8?He4@u}YB>kpnCGX-iKA6XQ3?h@vhG=b#q`(F6`r3@Dq~+Mv!w%llE5Q$ zy_J#{Zzr8s8`g4T1_tKE9VybW55>UIE-QKjlvWu9^ufep2Oco{p;uBj zb03PQu%yCHb8F`eRHpevPE|n#A7Mt7%aVSwQq
)^cmrClRayD6%#j2)%xtr4jdhep+FgA?Xc}i&iK{a^7l@ zL}Ys({`@qWm1V>y2*|Wk(uDo7Y;uk<=&85!vRrAYX*1YZ74(v_H(L)YwNiw0xJ>(_ zXp1guq|EA8x^x85c1C65kUKLpn0ni5rzyd@UbS7dIe-tL3~H-~H*BfP!l2>NHA)%X ztPI^4tB(ReDJPo;Ouah{yFfS@jGX9%Q{dUMKv|eHC)ksYEmRt`0;ENXJD4sMB;4DK z-O`7QP3JvZwbo-rh zA)R+|Q^=+OCGWO-WpsWPXr(^7bxv`_m8v}`AEPBPIZI51p|CIR9_Z9N72P6*T55!q!F}tiZm(WeOB$ zpEh!Rt!)Krr zn$krP*TAhfMih-yn4R3{PW0AqS**c+B{?6~V2NRiD06XOl6I+Llg&>_MrRzoOl|bA zS9>8v*kx7xwb7QRK!Bmw?5qm54}z9ci>!ogCwmk+eX3^3#~$^1wL_2WWF>9)3cSdG zR)sv&PicaqZHR=;Vf0~&#<{GL4%e<80RlhTI;dQsuie~HOYD~Fr!E8{U5=G>6Jvu} z-e5uHu)3gV?9|Lw45?T#Ly1k3K(iX9U-XQlFvqBGvCE+1^@$jVL`T#n*mSE}!0vYX zlFhXVLb6)=G+ruAOt6vZOS4>-!r=msQ1>^2rVQ0%3hQ3^d1_z;zl5pv??+ za&`Y9u!>UbPkyKWX?Cs{N!QzJo$Radp!gIxj{b}w;&^w(5vIJNg6L*H-0$m z<^WqBF6@2HX;kwIv+X9nz9(3=N&1(hsC^TX5DY(DF>G1Zbv+J6%<$akoOY_%q?MQ# zTtigkyBkT~<~MqFGcD>mfaK+w#i#mO<37%ySf*ky03e@iEqpk+6>`DMz?x!{!?G*% zt8EJH7uj~=9>JpmkZ1}iraW?M2F%JvFSU^Wv}A%cc_&8KCbE{1`guGx+Btf%9El)B zh?0g^JJV5?*Fi&Q8tn=vgLd!qfS+BEpwM}%9aT6r({1NvM-Fh_4aWHVMg}A5bKADX zN*Vbibk~-c&5#%xoVqs>L^_4CN=MU4Y^yE3V&f2)Gnn*0$&yp{@{n(oGIf~96mXgR zk2WAm6;^B0jx@@DHi!bnZQboGXk~PGpa~qO8mC1cOz=kH@YtGlH<8Y#V?Eifdgp*0`wBNgMrLdCVCGFz=XN7 z`7A|1Iqa_{;D|+E*D?TDq+L<%h zpu6+{z6w8Ppr?)kMYj$j61t7@B*{!L`A)C9K`H1R!#>YPh_nRC`NaeLP1Y z$8bZQ$SUr;>zCi3UiESeqnaAQ$3I7vq~PL(p0zwj4F;<7*#k8ZiUgH zUAKEH+ITw|42tW1rE*7ahxV!#C#|_#uBHGBfu=_XsqP)p5_+fy;tq!#+qtH)w21^L zwe*Y5fb7yTbg&NQ+`VPYgg^BcLgKEon-Bv{@MFqd2)*wL)OK4_Mwt+DlYtrxGUFo^ zMfI`mQIV@+Ap5jt8&qhJwlzV5K$p&xiSB_8NBL`ey=_ZcJV;U~dm-8>fFT35k7}gSNgT13jquplSnZZN>bVhTi{!@HT@bK?? z13J*mr`Zb`g3H~G=*mDY4KvgR=+hlcBSdR7Qbfax)XgxY#TYJy0|n5qMlj!T=HHOq zfB{uz&`5F$s78KsCkrO*tk1MB)eD6`VHt!m-pg?5Qz)V;KGU`3WFskx1{2_pwi74< zgjD0^mY!yt`qRT%d|Fr9!u0cz2vRJwIrZRC(d5dA%UQmutD;8oeQ;|qeIvLc=eXG6 zjVpb-CNZHW(cu(ws5E{s9;SF0RRat<6`WVPxFnvd3)*>$}`z7b$jJ>!bAAHQJ@V{CDobF9p9FG=h*K^KHP2Cu8S}7<{ za7i-2LYqX%ww{ z9T^ru>Ep~fr08^S$BbEP>RLSch8;btXo2&kX!}-uf-vMHG*!fC84N{XTW205@01H^ zuuf#94&sF_Yk63}USp73N<^Bpdr=3Hp%=nm9iv5h=y17=94bLEjp7NCV@KyklOsr^ z8Z0d=v=!-zUqZq-bZSxBfcj4#gI;uRmU>m-UaWASfNDR*!)5=dy3F9n-g+}NkVC+N z&VVG%V`SYCiDoRX3DXO2+r8zDW_YVzlTN4N2}g@=T?c&g!VmUBGHnxKU)BkobE3bO zLFSymva6y)n-QpG7sAnY4FwOF$mY>zBaH2;K(uVRU8X3hdU{o$X#UJky6iuh6UNBZWfTdP8B7>-CMEhnT1c44-G(=H8FO{Ak)8xmr+W|1 zjJzrE39t^%^RglI-}T-Yw?phpTWzOrJPOP9*fujYdg2L1o?aBW8pd2I?5w*G63uME z8!&4MP8DiRhMwq5U}BWf4jF@ORbV8WZ8}j~q1A%3&KQ^eUR#a)gb?>0&gr&w`DgRa4ImW*6tw2+8OWvTBEKLDsY88OlR(oqB#7Y0O6OHK zOODV}6Gp(??luk4cC9Z=wHsWodK&Vi1;bvGd|cZ`uzT|%2sT-Q2q6f%>0pjsb%MI0 z+T-LK)V2b0Zi?%x3Bog#sZF3T7K)jfPaD$wXbP0z5TmD&0a=ANS}g7I;a3JLPqi-X zYX}F{jWbREIz!!%Ea)K0#AS0vO(<_RkM=2USN28N5>5&0H!Yjb*7(t4feJ6t%wrTN z@$5|SZYT^`g@|lMpy>rF4n%!|_qM?T0F74I6!IvfbSK|nOKF2TQ#Uh=W@OqpvBLbl z%Xu&gZ1znrKaCgrCmYMg8ocYY85uR6DM_gdm(ZW znJn*^=K+Mnf}iyG{|8t&;o%&E)mzEZ7u6K`)0-NrrjvlizXa7RniKHVd~<$;k% zer_a1j1G$wj5N2vZwVr4!UQ(?>ntDAdWzKvy6=EEKLXNfT+2AU&dr72vQ1aX?#S)Z zGFqUegN0G&B~5{P3h#EAHWG?<)inB&nP|NqIUb!F?YwsGkV!KWWDh2W){Tfn?!%f? zG2fe|g_}I+;pAI{uITS2(V^G6Oaa5aC82sN7q&UwAdc`rY1uf$9-%rAkb-B+Z`S15 zR~iKUt`M8!?6Z6pndZvad}l<<<|yTLyUTK=A<`=a4# zz#VM_qq`|=fR79|17#gVdLcqKv`HX0$C2sG@(HXiTQeQ^V6ELWJE5;U1PZJ}k|Bj; zXs}ajBcqf+%i8m9QwS*lYmcxcCo@JO@2rk70FEivN(UJZ9SGCeAS-QbQsG1n^x;F2 z(_|wA-_uE+)_29VjuHtZcYcL{5&za{n?GiV(RjVPoaw>zML}9mr(Qt{oxVCMN!X6U zt!aQL%GrpngC#l~)mZwD&gxU6<;K2LcGOd-I(*4z>ua^D%T#QWh{+6K^x$Cd&dX-= z^%GR%wf=H_b0gVtX0|)*HwY?D4yz~HDaaQdt>|^Qt)7O9`GW`@>&`TcHDg;h?H1(& zwM~v{MzzPd1^`Vmt_j8`kiMZRk+N^K1|uBk^hXv41m(ySU^n_pLBY&$iOpk=a4>_V zmkOOMyO*S&c8IXHR!#v;wPZqvjw;H_=&Oxo)N`l?vvn&0|9;Yk60Hc~`lV6Nu#`>~ zBw2=2_}l0{Gj`UVf}^WZFKQ5p)6Ob%pv#0GSH98`9i8Wa!Pu{K`gw-Xkib;Db3o-b zyScWW0}UedVNySJO>Vwn!h*uIqY2(wR;p*klSxZoj6T#c9zsB?SB|`8BBRb_S`fzw zosH%gTV~xAH1ObqVa3w}LJZt{HAM(t0*M~MYdZgR#5KbR?%H_$tq9?D>1~< z-OnCO3t3T?Ikf4|JSv551q;P4u&)!*~oI73g*^5o+oQ;NA<8M4+2lq!=V9PL3CWb z4V9a<96nl)_$-tmXlJj~TDyY*yb~nYz3D?v{a0uv{JPRZTc|*Fo&F>FW_*M2QPe3M zQek-2Dp06WSds9irFB_V+ep(X!dIkeBpIIZu*``ag0qcWnm0h(XYw)xm6e2-0QPCi zTMI3%V+tEtE*g%-VNzxu`YE_S%Al=FQ4#!V@LtZwO-?I5F@v&M-H}hT z%c!R5-H%F1PX8shl$fY%bVk?i#`$TZ2zBX~j-c4lqRiBq?9@?XP}FL~l|YpSiA3d& zJd;ReVqS9qoeJfy=a=eT!~8q~*%f&|qTNp0Lxr4GP7t`F*iMIggAz8`P#7eKST8tb z3carVyo`@U3;CdB6b^$zl42Yrn5P0?OArk?Cx!5O1FNON4#F{+l%QBqk?p!>i%*4M z6mNIdiTWw~yLu=S6`xkPrn2=CjLpkIQ+(>QEy0Qi8SfH9%`rEb$n*6Q2C%`5u}d}_ z8f*Ec*7YKfHWc(vyG#aeY$Ow??HtrTD!kB&4}@JxJEtjpP_p+O2^Be=0w*bXf&~&P`7ARJJ($agZBKyu2M>zgo)r zn4XFLVw?#>hL6k={nC^Rjh;gXI|QvxqmE(`CG=O8xzzz9|F#px%JRq~RGsjH%I$es z1ZWCfn_@FO+YXwUt;n|P(4TBe3Y%wUx}+9n#~SnnhwP?ona~9)!iKnpLLhmB{n8(@ z`$C%qdc{>o!b1{cuUB4f*f`2=lids~c}Q|RW5-ePleLU02pB??iQ+1$u!=Yr{oO}) zGS9MMt7!#SS}x#)V@{NrPEsK>B^_B2Pfll_gK?(9L8B0xEP-044*=0knjW6A*O(-9buv0p(WrJld73;_ybe%`S zf5tmy2FY=G$b}+v$b!AraxiRI0911zWp^@HP#ao>YC@g+G*%4-t3A#JT`gq@5*;Yc z!LzP~)9qDjK$UMjY8^1>5ZsZRPe=$x==_hwB$u5m!8--lZh?andqY7PBWK(_tGtXs zcU`8{g#Ds#MuFmpvpUL+f@Fhe*MyzdAdj#KHt)3G$avzGA`S16M%Ym;7d;)5-Y{sb za3-AO8%8IA*yEJxD#&T>)V_U8^F&g!@h4U1{DrT}O zHY8~qOm{i(r6?&Dxo?H5T0O>&f`LZHwMhmn^xWc%gybCOzgFbv{eI5v&K>Rpg&PXQ zEn~)$;yx5@1UWMzS-Y&$**XP0hV|wlZvhYO>{%$$ugR8Pm&xsF)u|7WPA}*AKZe4k zUQBV)1b%X1ltB=ScOMxWYq0A_1+6sIH}j_xuBE!sieL=(3|_&Hq=<*?q|FhTX5iK< zbwr~iCbR~IZ?~S%L2aio< zVw5X#!b0en)<9dmX&lH)!r@aXvyhs|6snMPk$z*7wrE?*Fu%&`K;jP2XKs

(*b&+QPaJT5g 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%0D!`87rYW&S5GgMUpHAf<;k;q9mY#=*YT?E z)=)FUYDo<6$k3F6vwM)RX4WBpQVTBFC95R1YDXF69Gyi!xpaj-q+wT_Q_agz2FnRP zzD_(=+|bKCl8&gEu^x7QV(N1hx2re3PY7<}aqYQPr!k$^8mcDg1G3!Vwaf07Ju^}Y zj6CR}N;?`7M(LxsHS6uMS|;K+fdO~Vx{k~0Zcp1QKYl8P&d3)_%`9BPL#0cnWJ)DS zv&^Q_QSYoQ&}FqSCG6`G{60?UMkr|xe$bQw6kNWuUvDbEmH*C8#|Tq7B6~yTeSRR% zqrl-yZ{E`QLc30_yo*kXt}?B|fOOw}c2KI?wKTpN`|+@MX)CFM zz0PACR`UI|dh5wEDkO$okz91sc~-bjk-qI_fsA3fgSRa}?Jqgfa_)^j@B zQDkW^=eXhA#Zn>$#=#%9=<15zt;1djd9Y<%>;1UwQn%VGcQe19pgc+}WPAF-hxi*# zV-sS0O$;%@ZtJvESB2UfOG;@~p*Y_h|9GaQd}Yj7mbP=(oTjXW%UTKLL`A%O>n3|V zi_g{R5LAhGGX3*LK3p<~7GNh&^pvCfXz$)o1WViB{rGF!j2uTn38`SmIJnl9Ha6%DM1TF)}mT z^o;RqSRp@jDyaPP%G6sDGM_X`3cgwH;G8?w%F>>%MJ`Ep+%ofV14B8gi(2G!RV54I zb`K^YMF~P>7J+Ie{7E>m*Sp=~O26T$BTDvoR@spGFzKwxP*}pI1MQ-3BU!~$ZzWvxw|hs&eZ@=T(*yoe%BIsw0x_T`+@W`~R{5$6Wv}4E=FPxF;DbH1 zVc!Bd#F<4dShu{`796C8x8DrmIo*X7W@rXhv=DPK#Dz? zje?m_By0}spF;V?GKTK}`>AT^rfrGrs?p)yc(rn`bC?0UOm&dBnTLn?*C&jrirah| z)6m$sCa}c9swe5hLFte2IBYMopju|oDd0=;6Mu*&|MJVvKl@TA-2eLNXZw2%3HLjO z`0Xj{U!rXBt3Jb`kpJ-Nv;MJI@&Efc6*ilris7+7SS>J6yFh3kt||r9NkD$h!76bx z>sd~9T;Zy2A3Rv`FiOQv_$jeY7f+3#z%6J7HzEYG>t{nWN z%9}o=9@mq~(4Y#If+T33+{J_%zh25O4&Wsv#&fHgquIa^Ve=b99}})1srFlm*WmU6 zBiSVf$t z&|vmc1(PRVm`vL98pZ>|sO<#98@A=;TD_%Z(FO2Zg~A$L{Hw19cak6vUSZ8IJtD0|ws)Csd_nTr*)pw$5iDND&R9S_a~9>_9Z2)5oOR$DSx6na!c(gqr?wpR7gmVV5jnU;baFi^ z@&g^imygz4uNp0hv%9cpvxrD zp>YYIeSkX38DK*_JwwO`a|j%WqC<8rUmHa6JW-LPq?)z~q~INVWZ(dyR$1EfF7YUp z!PMz9tYa|8Dg*BD#hlZt@WY+lR0QEhGzlhcnXUn;>bP)HsV`M`AAorIxh@Dcz$EA9 zzM%qQxyyGZG#IPY6DoWXML<{z!JiFTY+mt*&*;}d)0A;ltbGq#hhQ4b&ape^1KKK zgp+0EmAT*7#=x|fP$l@cvkJ6k=UaF$AavtVPng}i&B6fg`GFnERbw2W4e&$&Qc7o5 zs2I4>E)(j8E=es`bv5jI$4U>}xMc@V3)@H*?9cSFqOv2@?Vt~!GNYyd9g8&@rvTB< z<(T>_+pAL4o|I&=E=vugbPPf-mef7c=Za3V06Ap|UNPSt!{TKvDH40M*q8g+D)Pc2 zF>O2xmL$M(AjJlHS74Tu!J4v_v$E8%-!K%_wA_j5FpISEXwWU7we{#Ys%Z{h61&z0 zqxo*Y5<>)Ywh98}vv0*ECY(~1d`7_G{vHp&$IgANxZ;=p^*ONh z&A)u1Hk$i=Rabm}fcd_Zi9?+ZeiI+JWdUF`_%t~-z=YgW9R34NfBcoweSh;lsw!S8 z!oT<`8S-OQ#Scw|{AwV77F88%oD|fSt2C=E)-g#gSeB}yG^}B5*7>90TddAf$?*6g zRW)J_Tg4tbi|XmJ=}UItsQe1ht0eSdanvR$c<|)4c(lJ8uMZOKSL3orxM!?Q zs`EB0yNvi$h4sPWFQ6}%4=}M72;SGT&3?tQ@P0WxUcNQSw+_`TgBv>zclu@T7NHSI zT`8thyVUqPw zeS#Vc)X397;{YFx+ikJj6I3>@77MK@G|VBBe@)Z~9ZP^|FDE5-I#Kdw~b zmFNF*avuT0kExY-XAD0`Y~Xt+kZHLE=-CLWYJ*kzGcqiA|1W!2vTMhYTz}<38*h|A z&cj-ZZWx{*p<#Go7#We7;)5wYnM1b+=-+)#6sacFlth}8MYZlm0?GUCtyfjI;zYz5 z&~}-5Sis%i^K@u;P~(!#u@YTOR>8Ag=yJ)I^*Ae9PqG}?I?^{Rufl=RK>3x`tW)xx z4W6}>w1zUnq=_CTqo(82>o}fen#!bHxW+Nul4V?SMe{0(v7ex7(>)sB^x+bRj=7xZ zCZ{-!HU*J=xR|dJivK>D)-dD=oP-ug=+{*M3kt;>dzz-=#J<{e*F>vP{Me{SO(mlv z+%+5Nze*@$p^Z-5+h*hV=;5T~lw3(=F;myJfJi1ck$st61V9*i4tGk)p|+M{GdrB4 zAxu(I%HRoMVckRBnIUTo=prwN6{!NGu-xF1J=6Ae0%W)_(NUt=Z!f()+Deom%p^Rv zLG2|sYV80%NRv{pW$Ip$wnd^`dUE3=6rL+rLR~pYG;fbau1Eod0954Ij^j=}PVtum zO%-}c&PP^H=)mb9vq+1XW)~BuE1kkiE_cmFXlW~bbN-vSgr>QYh>|_kkI?-yL{n&N zw9c~z=gk;{6I+?wzG+J{12^r<_F#s@1*}Vl^WQ*IBAi$kn})*?R@k-!t5VGFDbVK4&Gp`~Ab?#}9w{ zWds$kJ?(FTiW{o=K~z)MZh;n(Iak_0@?lEef#^zGD;~Q>Pq+yxZi0%x0zt*wV&zY- z29eLuKYTdE{OUmH2AtmuIDhoBHQ)^HCEc1_Z)l~v*hub-xRt~iiSu$SnLv=sr9h2n z=2VAD-CSmAZH*djeH%lHl}o!$x>_bXcaEfvcIbFW<6oBTvx7<^ZQ8eFo`UoPARjMNP5i@)m}!zJI%iiFNj!cA(bzD%p$N zyLoJrhKvI+`b2;{Gf2~oCcFg~Ojb=!zH~y?l7aEop$V~p&w?Ln>dIt$Vkn;sL6UG( z^=P$xf~9qYjbqb69%}8RHkRPl4zUkF)X+_-J9P<8z6+!lWO|LF@o#Q*Y4L<9{=zk< zwGnKU#dR8qgp+>pzLB|I(NkC#WA2CaD+VH$%l~8y*)A%*_=W^8uPJr^@tfz5xfJ=Q zNu>5cXJK!6-rZ(lH`MqesPT;5b}z++&5o0#k`ct?iGprOigYyaAM-5i-M3{=zwep# zXPw|xyl=(%)y3h*=_1y=QGkqLb{4cShOg&L+MScDA2|O|W5x?= zaz(8$$9Au6j5$yPNI9sR4vcuM_r;g(ThL2n)SG4!n`SQb;uy5mD%(|5!@5wvyO}bl zd_t}#xym_3UXcnNv*4l>!js-$#_qlBMv;NHx<_~Sk;gz$4Ngo2NZVUBE;9i`4z%}t!fr)ES;<9C$D zwX_52gi8g}02sPiSktAN=%d#`gJanP&x(0TAu1^piPVrnc0GMGW@j0Un$M)=m>Gk% zFm!L_Xonm_4xk3jNzjpoi4zahVuF-;TCaU_T}F!a!n*-KxI^mqI46Z>9wxJG;E?Fr z;p%B|Ew+W@w+`e}LiA=XETIQaCwCdNus@XpD7(tMe&n!|)jKp&HPLRu~roTX!fw6$ZY6|ku?0w`A{z3>dzX(}>j zPs40&cNlHuNb*=^T1~^p`{Nyv(*cAGTEnY&;q&?L>*49$XYg_L`GjF)#H;g;{^pQ(t7b)*TFVOL& zW4eLXwCk1?L;r}URqysq`6XsqZ-^Ivx*y{ouOpbxcq2VLer|vM^aql`Klzu3=bwDf zec>H!6<&t^0S4-AQua|#%5I6nf9)!dns;Xugp5h3(>(B1@2*V`fEPnKh9pCz0ED15 z8o1*ah&wZa*%A}XjMjA7ZD>EsFNvWw04yd@`1%ypb zNrRQJd@-SPlqK1d)nz%G43_EQz0K09CPgbcE-8H@bAy>8bk3%e-2m*bKz2Y;@ytuU zF^|L(>gD^E6RlyX@~CBWNyS7g7KT()VD>{f^xUUH(55@F%1Iq}e)5KLGZ(KSZWqQr zaRDkcl^edVwS6kX9Ot-SITU=Bx~$hA^_2hdd#+GhRoeqs;CR`Er2WBdJm**hoPhBH z^w(1|*-PuQYv0R_$&EMrb6G&zdYFHNu0u@`&}8}C&^4$fZ4^2cFofi2?7fO=uy^aB z)ymvb>Rd@#Z%nh;jE`I)R`vN(XHPBYVlsMvQivk#2f*_i-B)Gan zOY!K7F4^^3eo{~}4&?%saUz<fOL&l4}Klo&~#tK2^kbz%tHx@NTLGeTx!`kV{3SF z_-xaM?PrY07?6bzv{l6zH;zyOS@=i=G7?hsub(*-|zo#W}*T z9X@Prbdc#^Sv^f-8tpvr4BoGGeEaeJe>|r^_T91%fYtyw|G4kIez^N;{^$Ky&%ZJN zdiV7Hzh9>neD;>J;dfTeDsGj+C>cB+84Aac2cD6Gn_{B9^~W-O-+=1@Xjt6$cW??H zF%5sbL>=#mOL>A{zTt~j@dZ+PH1QkYRrgPMP^i@RU%v_-exfP;@w5KPOBD6mN4`L# z|M2kl*AFlc{tLYP6Zr{~Mnzz07&39(x2-XO!mTx;d|b4;`p2 zK;{LX(z(8|D2UDZWn|t#V_tW*R7X=2!8G4kZ_jqPS5vv2YY~n8&$s_Sz+IoI9q@4tM+>CMw$hS>M{jo5b^mA)OZPe+VsOoIJ8Oz2IrS^50{FNpRPJvDVaZ+M1YGK%@CKJ*2 zl>MZiUsDb@gs~87bhlEb*QiqVU=zHk@$BhVWi;$K%u1zeL|MS(C+%rAWzv|*>7!eL zqqz*|BmkjKfxF5PO~r&V+V%m`D>!eA<&FfwjQehFP^y~%NaMx1tCLw|LXVuh8T?7# z3@L4UT~wCZPzZqXD1hds1!gu=zu~!&pK>N(x{v8~l=jWD=TG+C7vJ1J**_mdd-|PK z+5NM-=U;PIVHN9}`CoVc6TW>Fvi;yg=eF~{0lBw|=)(8!9MW>OZA0jC63|n%t_@G0 ztwHxk4CH?5tMW?#ySFLH@06?XTLXR9b^JG6!|;Q03_4+t!@Ul z>JTT)cRi~qAob2-3%FKK)g_Y&b=>>_M0ak$TN*Q!ehi#mZq_`0nb|AeGVKssnOuLG z;~A~gacmlC7E?D>CS;A02)iQf`tv0tW)6L#DJ5yGvNl2)3Llj)?o;rNh0p(WgspZqqlqw9!t_zl4tC&%sykg(+UY z+;10t75F8(Nkx9+Qjw7k9`J#CFLF_)M{QubtK^vINg_7u2s_5s66=fSjGZqQXU4YAsB9%j<*4M?f?3zx-BxS&u2{^(?S9>=+lJ^Q{yJqoHp3ti{pc0)C zH(RV~*-Wd^L$-=LOq;ok)*^A_tlN)JQa1bR?I&}K&DqB+Z6U)X#HT#n<9?kXeCwctvuY!LI2Jx5$pMnZW{@i5hOh4ETE*5MIgM6EV0sIgF^i$< zQM@bYD)HbOc^`{2OIzmRGpkYWxoCP{=X4DPV1^lcxh(X9rl04{{6Z!*WmCP@euc&2nA8JU zQ~k-fBj8Aa*OI($YUJt_$m%oT=>|+^gi)Spxas}Dq3$unm)LCJ(g$ZH0qsp@ry*!E zBu=9Fz7&UmBQybF9&(s;f}d{JcB*q!?Pu%0R_0ULl&3VbI~kxhl1t8%O!;5--eiZi zF3Zk(6+{af8?CzNf~X|uP_(U83JcpqKoj)?t$g&fYa^eiz3P;?#?>T3$ zV$LzEF}gzj;5IV0_ihVs`k2QZf4+QB9`eCIp`Ghn5_)wClDy@N+`Lm!mrsoRIqg^r z8|~N~T#2zw8|WI*39+yCg#=75iVgZk78fxB2jUTwJX=y2$_w(klnH(x_p#*lLK z*>@GjJL$n!@TO0@>2qg=2rqNlPtsB^=FrT|P^Cd2XL@5bj+jc``ul4fXk~>`-FJ#5 z_$V0MMKM z@?U?JPJmwJ&zI=m7ir{q!dU<7pa1qhuIhjM$13TM$YT7X-{Jb}CH+@VH#YXq z=x@v-m_hivw^09IuJQllz5cv~^RG|RyCVOdt?$46pZrY(~({GaQ65qt}4)Q6oz51PF14?6WVX%W_-J#$(bwk?mCoL5NjG&g~?Bp9rT{ z0M~-hJcGwH1}>_w3Or6#_}ept%SOXFYe1>3Pg5&FmDKzEDIg4W>~gA!btzQ^BLi>p`?{%ia8(Q@VmbQYW=s&s;P{^s( zSdohFF3dq8B?P(=^%y!SF7|V`errpn;T-FjPG1TGDI`G5gO8>4sksKfe(_#GrZ4Kx zk5~MqcvK4#%OdJNihs|}rVU%*_CA>&h^htI8O<1NiqmrLqQG)aZ={~S_^jx7*n&6& zLMQCk<;Icx%zfIYwX9$~EQPF>t*6_NX)D}aC?(r`4w%pbyRZ#q&HS z(dyEfpG(uYMUWxR>C5iwg?FFVy`Gfa8vU^fXRTACBXg)@8NzKP#rF18*8pu$#BQMN z=}07_)g1IOo{;()6HHb3KQ_#SMo@%A&Ir0$I+dlyyAiE^tmyF$c%h60$PMj6VvOHU z1Yd(Y^Ue4lh0LyhS*xTk)$TT!dAg2o)%k$moyXGfLDv(KBZQ-?KCS6k=Cp%z2=-O` z(!8k`>@QaaN@~|ZTIg?|*z(+!5-*R<-uBT^s~2wi0lk*X^UIfMHLjrr=WXeTb}dx6 z(O6Dlht)yK#W51vCk%p(atlp%Wx$rKrVJw>}`kHzYP?z47*H!X;C`o(H%x4piz zS}OsHMxDlPl5}*2`LFo^{m{KvhbE+3tez}$MpIZxB++#A^|Q|Y(Io?*0L&p zQ}nr9wsB5*qSkc;*x)ug@Kq}~j$dCmsii7^lT7k+$x4kL;#Ve(S5X&Ykm_qmakrmU zpKpX%ErqS$s{_WBajM!74G?m8M-JY?18!8`21BK3*ikUg4 z)q2h5YJx1SPfd`A50Y1tt1+eKBgh?ljlo<^*hd!XxbG$~az^Nxk()V>lgE!KTD?Xt z!d-z$nR%L?DH63VWbFj;U7z}EYXy!+Hgq@hdrae7_mvF0YuiPEk$6mmI?26unY>RS z3${>Zu-7E8HVz{{d6jODRlRl;;;I)8dg^CwuA+cO5lHdOCmB$Jk+AZm9?eIHj2ak1 zpdf|fPC3?ArJrCuU~-S3+5vIlg^NjnjE{LkfQ7?Xm?6(qsdHU~fR1p1JgXZ!$us5D zjS^J5QS-35FdCtv{-ePfAA>7bi#>%k42)z&4V%IrKE$Ppq(Bn@Z#~0$FT8}qUwfl% z@M*~r$fl8fYmFg~#5t^L9d$d);pd`nIdqH*WPJia07F2$zfORtB8ITnu%^H*%rSKo zzB4KOb;U9r)F-%gxBTdx9{etBsiP%G7#FNs$;rJQ0nF9bO;reLn1~3}SuV)rX1Oo` zrktupD&AcoPl#5F`ChN+%-WP`<6Any9Rcw}JQl<1-CVSus##&1eoQ9rg`OWd@}h%v zrgM4NZ`0w(ebeRMpiU4D|JsuOZ^7?7OBE`6o;);$>-5`@tyGAh{h%jp?~)Y)tWh7~ zWAg$q!lA|>p$J&Z3sI_%M5W>6R{w_Y{a^mKzxrqYk_PJkO8)5IQ~By|_>RAnul`cL z`qwLCE68UgmTZYAblSC`7@<)Ozl0AEiHmx9&!v89RsBHE-(AET;g7H z(Umt4jvN#p_805g`NXn)B01oSbGz*P-7<`f7J`7@z8d2lkigHI?Xl>_3XG3>*c`N- zW9XZ&Jg8$ByIYfaey)>YHg-Wcsrr)yDG0f>opJ^8eO%tPk`j6K1;Vyc; zl#kxM6Vjr-f8FmK;)n}^U6cz_okv06UDl-MTG?fg+q-0AM{`23iUFM8z2_TKG85x^ z)FB&<@a=@S-_4>2vLyl_KCKFg_ojd?`vRvtt&s22R>^SLR>VisRNSHnGLgRb z=N#AS+tYDI^HioHUz#@r!#br6HTbPiBzfC~*|lsju#+51EzOu&|5IO5`q3peRwg~R zbuSelAZ2Q^G~I~x@6fG}q{!_{=SY{K+TENr04e^W1f-KUgTl=c`uoyxcT{9sHyPnh z#p5!As^~NJT(%2#PnQnQS&ZT&1Rk&<`r)!XD6!QogJTP_6t8qb$eQ?VB!iF6u~yr+ zsL-|BoR3?lSU@`1b(1mcSr@I{Gh!^-{%yOk-3^4^^OC6EFzFlNz7A+oDC<_R^R|n3 zvSZ&~q?Q{~Lprz=M$!l?$~@UCY`uP7?o)6ao;LYRop#Nm|1oEXZ?p8jVoet1ksa?a zo9Mj7k~#zi=XASS5F}^MSQ=&!3(+$ovpyE@tJC?n-*$^`sSaaiRxHh^-!`4rXU6E( zmF4X=_3eDn6Nt>UK>ehU;Gam)6?Ap`@!KBL-g&w*0}2F3+csgiYqAS7%{IGHDQh)G zjygz=G2tXEP1W>%P3Ax$Fl5B<(-fmygKQv>_g4XFydaiy7{@cDcU9-cleqP?kn*Y>ia8$*)lKkg>*k$RI2 zcJ7pBkLesVn3y;9;e2FNH#3Mcjx6JcV2C}IkI^xA8E{gmvPfefowBB0!0R^HfMS?I zjvzn;PTD*3SdxWEKIhE9;pz6+-d(1Pwa2K!R+D9sB142z27G7ZXAEcVPR1is$JI5| zo{p|_HMU=2xc(;j<8JtCEl6RUW+w`9@zYmmHR2h`XdHc7T7OvsUnuJ#J~N_Op6z_> zT2w0+_;lB%ilJ|}I_G=>f#il5QY^tPpnv=}LCbqBd$38kk?-;C#(b`jg*_%;a=Rcw z^yb>=xz(o~C&Ss!oKF}-n4?Bm2G(uRe+ytR3Hj|3#%dvrVVWpDa|)<<9N+lEEm=kKu0toSoTer&VBt9}AFI(#RG^rL!wTvo42`>le-S$T(!p>V4u5v~M z;H>j`QjMLmZ?GfXwYIU3Q}=C-3ewbFN4}FW$|et3+RB1U(F*2z>}H+UPj)gQ+QGOZ zoSVAI%gKO*`W|cAEZD~v{pY5?7zKl5Dr?d4^K;qq4)jW7ok^L|3SJp^lr6kncTi@r zzMD1V&gDUMT=~*OyR|Ujw`GvZs7rwE4eQFh3$T2;Y{A?*(;M z(~a8`90F6+@WKT+f{QkFF#&5o8TcQY?gmC!cVt)>>Lp#JUVLm3#kY$a-9=-VAPnRuIm!mjqmjCcDX%Y z3FwwWTrdR>b?CIox(*@ROo11ci}S((pC-(%8D4+w!llGGovyom+R0U*N!PiM3`Ehr z(R1&XwonE#ALGwLmSECSaU%tDj}kg!H>Cu`uqY^2BkhXYSE_Uyi&XW^6XDn%YV7h< zP2SNSYXTry*F2MazINW^NUAVnk+pQ$IeSdTBOy&t@Xl;jld1o-IT@Odd!JFg!k&RY{{@^L7MBGw$!G+ozS4y;n=O{V0Wzewq0Mo zTcyDJm{AaNmD+X6{!xJC6RM0|6fk;^>BEvX;J85foz9CQFmfR+NeZHzfAj6tl_W1( zwsl^}FDN>~d*v+)vgr7DkJT-Rr)$m$IkNggP*J|ACOO_#f`vSSqrz--H*{RIwo#7- z!IjwM^P|j&1yC||y^jXB2!csIp1YEaZ<0&wj zb$jgSh|7kc#|7sb{Vy_d!52kk-HjUEdrW7sYU>yE8oz9Ye14~dtOuQY5H$E(az@Tx zkrb^cg%SY4NLX3-bT_k>L0~2a!vKV_iZ{3*Bp86`!U{K1sEiDM^ z32w+Lk9PArA>kJNfnvbKL`-kY-a9W-qhoqle2aGVSPyOp_a^G<2rgSJlUu1ro<`BI z{Wb+>fMDT}%a{5}8L5Le>bag$lWo1woTCY%Y&%F611MY-rV^sjzA7xV$BKM#a^H5) z2e`@2qPYegC;8Oj9s@!=@oZg8A!a&O23lEyQcj^pL9Mi!qYOd;8NJey47y`2WqovQ zQCb%CsU~a|l5YP+*<#a=fN->KiY&PfwO`lK)?|+jmleM&xI?`w0*`dWJ|Xg^&rZ9U zVg^pXU%Aqp_%x^gkd;BQS{HYhtGjQ<5``sMGWixZE7BSuYb@}yb8_S$3_0krJ7n5_ z_jIFu?GrRcd%+f@8(_aJ6ISsp*0_^(Vd*gb5nXm!C2%GEFl5aDE zp>pyvVB1K&>4b4CudYVdb(9^nFRlC308_Rztz{r6eM1WVT#*wU{@v56vl?Yv&_aBj zWr9bUc`g)9yiVqPkG0x$TShhRq)G#tL*20Tt4pdtHks;SOqgLAhfVGB5>a{tp4+~t z0hXUQ;t-~>svxura$yjDP>q$p#OcQMbjSBV{F)ygI3Y;7C}ubqn0lZ7Tdpz|f>;ct>tJg; zWx{mzQV&P5rqNc)R&3p*LpKdBC=#{7p5AYlYaHQmP6@^ccX(5EL}Ug9xn1Z0&2kCa z=+oMhflLa?8d8GPRY{u=wR=S|vX&z~3AZqBxgG|qPP{NMVG$`hc|=(tLX20B_CkZH z2+$&cv$$8suu}2 zS@tgoj~^NL{UY%|XJ*;*d#t_ATVeK3*SYA*c%okuiPs7$z!qr82NMmRnuk*DQlNYA z@6Ar{AyU<6ELhwXY-k0$4mqqQij$XnjiN#Oscjga&N>Mjy~l`wJypPTA%E$1knY6y zZ{|ulAq(CUf?{}A6t{)`jDtQmy>4IZn+LVuEAXQg=mCb2XzM0haSJvpaI=mqQcIV9 zTNw{}kRG6o?vBvN%ME&68`?)$BpID@LWs^=nl2(L3F2Cae=4qbT<2zm|CHPrcN_ny zP76i}25tJ6g@6YskLZqKl){WE%NykkuQ0N_46^R>1X?$_4>xouVqIR|;c?kGc2&?6 z0YZYU768goz$f=RWlQWaxyis-Z$tdjp8XMX{Jy6FL95TS!7c=-s zk=G_PeF;f?;jCS#Kz_2BwUj*)!r1c3Bnb6ytP84A_=gKfrpH3;2n`rT_d^q#+$Zu) zgAn9S*)7L)Hx}BZ^_7P&!!95QpAe+#{(?kg&umY#VD!-4lhuV&Pp?3?^as^Z(&d@m zqyS?%Ow2B@I)tzsOL;vRfuq2r-F6LZ$10?G3w3-N_aL^_CrpybvMvH0(PRcqj zeHDb4CYkLc1f1QD`j_%w7FNWTi;N0uPmT)(s#cs#%5`H6o#tuucG^;>vmgv$-GYil z(69A6SHko8hW+^dWC)s*1wew6W^rmWkse1vB7b=6pLT9Ywanw+d^gEaWsyPN#cp zIzyYbh18%*+sO(CH#eEZ{qCva4LLAbszWRzTSFs_48D$0qUk?dTA113GjI47QM*2k z{s-BcAP=EHQ?AGQZ6aNbFfl1SA|C=vRFiKCr`D2B+}amw@~OK)r&mEnrp(ch+ST7G zG8n}N^MLU>g`xwEGG`1abVIu?jHEEp%NqoPdGR({U=CL~V%1Vd8k&C;?``_M9JcUO3i9YwJY)JC-1p^yyvfr=4> z?u*~$2v0mqU%FpX1?9+Udsc3Y_kOh}rr@zY@x5ka7D?+tT^GP;c zzX+b`-voX1u#(Yxe@ZNNLXwwp9Qs8B-nud@h(b}lf^0+YUIAHqLVQVPc>d9tOi!|t z6Q31JE$rJ(ZAFi@Qv^YDTA3Zu4;&NjtQ-_%%}~~OvVO51#X@>DyiA?&V(V8bz7nc4 zedzNZ6C8%aE0Gr7@*LA)H$y&oX$OZvf`l+_Sg5*E5oitRVnqYpMcFLqC66<@F$Jv) zcbqI)y3pE7l}TP0Hw}1Oyctx)-Zu_^kt6 zGLqA|?W03yJ$p@lTA+9o>VQaB57cNB0coQsb6QSSkAOd9dG^eX~!K-IQ{b!^{c%&IvE{!``vep$EsQ34o>s`qd1^zfT{9`Z zf$05n#*P}11B$}lTFR=xFXcGw^y)n=(^LbK0gNMAI=xJ&aHl|;g|VbZ?-iohiz_qr z3cZt9r+rWW+r9o(tVYT*l(lZFcyePy`V@v$Kj*Ar+q%)w=ovAH6OLLY)F23)e#=nl z5|(1GpkpPk4Rfm@u576ZVau@4v?us{+`d;fh1wpj`|-dk()gB)ncjHDY@(D3X}ZpG z`dqPl$~Xe`m%M$}NA=`?j~&6qIFJIDsqyAMm?F|YmZ72aoZe$2pm*=1BW+@A_zF@K z3`~6j#2I$puFLj8v(xuW*{jRVLwg*C?zNo1Er?7*)lvGcwH&}(ILUD;z|w7Q9du`p z6$df?CvO6Z)=8g{`YF7`r*vWI_occsjH#?S$T`TKPKaIPCVWeJ(PJ{+a182TYU>5@ zsh^zJhk1(5q>z=azL7I3_K3t^gCwKfQz2AEcnXy3D)Qv+Q9ULMfWRa(SIJ{k2WkO? z=p~+ft(7!;`IAE$(!=@!>>gDoWKF%=rTlI=uB=Et7Lp~7l7%8%!hfh{WcSJE9fR&! z{zJPe&**7{&cahdpz%ANn^~{Gwf#0(Re#|2Ox7eoH>^T%8TKZhs9&CJ9!Tb{3$tp& zA%n!)ksIX0 zLiSsiO|IQ`A<1^43cDf|&tsJoTCitWMPNY($z;jW-one{Q?NyqXH%SmnK~|?w>2HC zCm?Y=wKjbOB{>4^G2=)!l&VefW&Y@>R!0q@^85Xfp{^?U<*iTCShg7I9v#6SB$&Qit42E) zDUx?(XeXCD6ds-?l_3w&^xJaoO|U_$XMq4sA2EP?5)I@;6m3z;rc)~UU4KH#JqX5Y zp9FH5I&EMGp_=7%u#PaZH<*`&4I!BYzme(>z+*uTkE4y@2z}e9>6hw=a5(T;vsjb1 ze(F_p+hN&S#;ZO6IF`OAg;?nf#~?bnXeJDFA8fOzZ_<>qJbT&|88-%tsk&s{-J;;a z9@F9oF6jbNl9Lk^a!3@a1PGcA z$}DY18!P5~ZE!ZPOGQq=191}^9gvrK5XI-v`z~|4l)lF@{6;KOX%2(njDs90z;$(KoKPE(`%OTL$SY01%k zThUJ^)%iurQ;EXAu*ac+MMyBWT#k)>J1Rb&j!ZZ256q*rp>9JHQ!i>qVC5>$;$_Z&WSwKe#)gF^Kmp{?{rQ0M6Y;^^~ z3iG3Wa-7Fmg`FUOhs${bXKje*#zdmA#SSo4{%Y?$rc2@J20T2<0Vg)p|R74I|cQv>;4%VK}ma%miZLA z5U|UWcjEU^^ygiuzggb0==kSG4ksAhe0}wSa=QNb&FJd}YT4z1 ztg|c;Y|Bmy9M3cJ8Bd*FP|zu;{Ir(bQ$Q61OH4T(lKp1z{3vMm$JwUSSx1 zZ3VISm)R~tk~4#%3~_NQS{Mu*%i)kaJC<`O^3-KVIw#2aZdjhF6!Re6>(!)mftiOyypNOb8#>ZEOT3pqZenR4KD! zvu02LCAgfm3q4s*waiOzD>ceP;OWpkt(K0%A1jJ5R8xp}^iPGv$b!biU=ijnI$0Tf zv(=1>ynB(Ihl3jgL;@Uc1J5_ocoovL$0mJ?ie+SFal6dH7hxn_r6d27udxx7eIn^j zGO0F!&6Sby^!jGuP6w5@@j7BUwQdomS}Wi5(fO%@iBYe)i=B{DPw?~-c$$@b*%Vxi zB~srwy9?IBSB?-l&Rx4sm7Zu9;Hr~%mdtH0)&!-;sC&yvB|zh%vb7WlhC;8J_D!(_ zk6j_+Eq8Tk4NII&nJSKOQH-_nAM6)b*sIDW`$MXKQ`v&SQfAWcJ_w9By%m~+4)y&@ z&QnC=>q8(7CqFsO%P7+A6H*4G(HCN?HbdwxqeMZs&jaiXM7Z~=IC)dT%X`%Q?qFRwO>n8KMmJqxvuAQfd z=EGjh;^ho83lPLStGtOeBFyR5qqUIl7eHaEj(gh3x<{Rm$=4Lx(%6M6cbeq;Kbpts zZqThqUSz>mp_LC$QCO(KjV`0Q${hHt#L5oJ`lnJo6ojzHbeoT{+oQ;WRB+SUe^>Ff zQ=C+yHE0pj4+?QBS^G5h4SKr*UFmX3pMqbI-PgBk1!88XQ}~g_2znP29jr3`zMDjx z6@>MEcFJJ$)Y}~e(5S#LByC7vZi8rH6W-C2ReBH ztz;gnhzpcS*DHll;n0R;jF54m@~*JMPKbV-;;KrF13ac}sRHz33!UO>jW-2|<_f(-}r zYkZ%EKm=$fSt<;#PnEY=Ais4NEiGKzj*3Re4bc1#4(&-Veu^w$nCC157?pNO$5jHg zrKZ;%(7y^eUSaa=+G8c%m#GSVthCg0APC$}vFwU4 zS*fy*pQqs!T2w|vfyXzHm5s@!s`c2aIQJzuLCNuw^L9^*`(&ErA1~l7+NKLTS7SaL~fHrVz!Q$sU83c)&C}xC;!MbU2o#mv<5jSAb}H zs*M6$>F^UO2C5)a{-&Oiu_1TA<<Rk-WA0dr&oDVod%k* zp(VRAPAU}Q#DbSyqPbf$jLZ!kgs^vL-gMIYSyt+UeU zx9w9gcFWTh;{<3u>o705-AaE*j3l)o2GC2A;8h@H%PVkUt;B)kMcNb&8y@g*!u1d0 z==RucLff#^I4gEDx?-ibsKu4#y_QaIBWxW1SB(9@3788+7PM4v+=^|=dxfD8F<@%) znt!YtmzC4p_3NJDQjGF+<`$DEzs~takJ;6B9=b8#r^$&cp5`%@7hEXJu2+yhu3O>x zds7+vNtq4m9W5`fu(c|VMpe1)bRP@XY`b4NuL9OGFav`;T!fPVW%6`n}LFf9jB_Gf{!qx%3~&O)GLV&YHhS-fuiMC zn|^Dvd%Bw77YxE4rmJikc(nUwc*&a%QhA@&wcXnFO9ZO`imVM6Ld&nabV}^+(+1NF zO)Eey8uIx`K0KU5L>Bi+@6%{jmJz=opp*}&W(X~hP*LL5TR(mboqAeoma#s;>D19s z3OhS$r7^bh_%Re*>F~QknbkYGbOh0$?(5~qof#Tzd&RkFO0ce1C?0eev~GDEYO6Ip zTC%%Z*J%(K%oD4>9biyg{TwS0nUz!u_O;5;^1}%mA z+$>_iCP*09E#wyj9_?nGMBslv9buT&GJVlByf=!pL^2knw9^VN|5hteCmC`Hx_~lM zi&B&21_j=b>(eiqKor1K8;2`!AG6g$0grNPl&mKWWdRBi`>pw4GKUVhRU4(WoVD25r^JX?Pm z3X?Mmy(A|WQum{C%UyQI>09XDYM^sRgU69c+f^HG_Y?s#x4eJ9NEnGZ6S=lB6q!!w z%WPCi_v27MH=TgC4_E>5-^$)>Es$<$V5@=UJt6X8%F}F7jvJ;4U_Jy@f%-kvD z{&Zu?ylc&3Y2h9OvPtzX^a0Xxq*F;1gx&jgM3uG+!89VY^~T3S`A)F}Lo+&Wip8`o zMyeN`jAs@;F|J2YCNp$0#Xtk!BP0H0~s(%~n2Ojfc5W-iCAUBU15maFLuV$wCST>&E%h<#+6 z1ZetB3d)vcetOy@6K#S6!?kDR2ZMrmxZ( zA}>(r&DExCSC>o@E6HQUg-iCp)2^KwQcQ~0zP+bHC8yKt-eYAf<^cH7HCY}^@Wp!FW$ES} z)N7UrSTLXE7OEL~r95G3wKr`W#ydGsqV{y0DN_ux(mM7s7T3n#de@fT3lc-zF6a=9 zp@{3?Ry-q$Puz~=I^BuM`Ynew*gKN**=0)%_a|=W!6fTf#U`8IkfS?wkE??Ym#jS| z?BW!E1={i+&FAgjs$lUDwDhOwkwYYVlsA2ZdLQBK;uEd}D)M-aw&Zr0Yb{ zm}RyVxOl~i9jOkQ1eVn(k-ZR@WRCF|3zN`J3p9kt;*sbmIs{PkX#=;9^d-+nSGn0O zeHx2O6O;B-)(cg{tT4Fvcb%7GV2A8DkLkT-O&B0kbX$$jYy2J~c;26n$95r7Ggu!2 zvUhUyrft2>d=IiPKFGKQBKh%e)Iy`A}p zIaka;_b9xKC1(^|QF{=Q5Dc$=7`7bFxmp!5L&pd|F;#5RO3VwoTon1TyznRldUiW4 z>IwPc5tzlN`Z`NIFDRC&I1B*DCtC|2PR==s-3+WLHmR0fpr|j_gr=jCB-BfKV(XJ;a!#GAeI2E9#ZktTqWu(5 zRjBAVn@M5LH>~HU%CAv9FXppGKWEZZ7&1l`$1IF0oCdeT5ekb2rDR;=h-5IfDXmhu zqqjq6RhxsntL172un=fkH%K*ZNK5FUJ_;CIm1BE*Dofi)fKp4>T?jVAE*GYYRhe^7 zmN6SJnFb+ozd23X5?M>ZF1ZV#_ozV4#AXJgOfYoIKph5|@sY4To)C*7SH(c~Y0D0% z&>(GVf&>ug`YRK?GaZid*S5SXG;JOvDU`h~cMRr8`tNP&x;gQ&dT0!|Qxu}8A)_kj z_c2R1{PawiyvO8&2b9&;5GY{Q7wO-rE0mfm!I2#&NxgU}x-j}n z+XbN({edFQW7RSEiD6s}!&9WuX?q-r$B~?5G>7Ux#b-Hjy{T3}7n=DrTaY8TyzPoQ z26Abbp*BFD?qM3CSfi058WvJN#z>K=8S3y>qu372cf9{zUR4*G6P-_e-$$;--q z$$2Oku*VoBxKrW(v;;Wao3uFARcP1q{z)AN#+%?&E)-mv4Dc}4Zh3GWj>3R~J=SFr z1lV^a`k*;pk)ysj64@*K+~!a9n0}dJ9C@VsOO^^{TRudwQS&w1DM10CR6 zf2cgBph(JZzFzKC?}`w0vF;|QRWdy|SqE-L-AWsTnfjU|ltc!a$wvwYMB?)Q)oDZZ zr;miY9V?7@%W=_OI2jgJRI-IsYCY99OaAo0eo|Q31o>&N+N_o78_9~@tZQOMJC|G( zZ)1b>BUT-xBYZ}7<(k1)L?TeF)63{KsR_E%QGU?xzrH4&+4tC}fqBPc-6o`7``$V* zatpFtf(|w@s;elJM+bOr@noECiBBHCS3$XsaY+?l-x{O)W|XQ2#R( z82b0J)T;vbVTA()RLq%OpgRS(bh9UWo9-i47odeeH5_XmBkS(AVi`fzB}_jafvN&f zn&GW>O*);5Cmb#M=?BVp;RjogPTNF|pF?XSHTruQWbO?t>l7W@jKCaG2uH^?Bj_ia zyvgAUr=9AjK(uVRJ*FsW8uKeM1UL&g{GkJqkrnVIhOx((yAs%{fyOpQKCHj@C~7CL z$jOokQ?`M*RVd^s@WEpik$soDbzSDGSimkISvs}0cIXzKh+5F1oc$4o-OOj%L0Yl` z4*b?laD&*{Q+%G5xC}+nusueAN!rs`s;)kFY~33LSqg>RrBq^%=}1#cjNZaAIFB+D z0N7VV@00bIL7by789L=n3`qKZ=ty;~?nO%@*rcr`GvuJhZX^gRAmap)!MHXabo6FR2B*AF^M%^MR}%Qm(SrfVaadGE zJi4o9-wspWU?+I;6P~pVLH8)!e{}2CYY5cNmrL6c$|bKnEySbMu38)g76PpEJ%-Hy zwFPTYmf0o8xpY2a=s*Wsx3fFE6Z&mbV+8=9ZDPy`>JA!EPaDEZ~nw*wpnrr!j~`t<~G_i#ERPA#faG@U{9Gm>A0f8485nQy06D9xIAR$Kaes0UEJ7is*UHqa?$#u;(r zq|UHoCG_JLE7wXo0{Xzlf_Y)UVdv!HV5Wr%|p~ z@OY6^C9TjHrq0P}2jsEhJ4lKcJr*e!vv2TQf=HGyfldB;%ZIGp%JhQn5fGP7mV?2j zGkBMEZ+`ri>-tG{M{d_tjG(21g;DpVU4eQE@AjAuQc0ecZ+yL(XswSNk8X`l-g+nG z(#!+j%Is_zw zw)T3#^Y|XqtLILe3~j)&8lWgA*H62XKB3r{>QTcMhTJaT!UFQj^`8QUhfE@_OL33Bf1EY)Mss8xY&RAm|n zkI5j#H?wR3?qVYt+h1V=d}Ov6DC;27f(Y5rCNaXX5sb|&pTO!D78uD+2>fWBes%?v zS}^<4Pz6*$gD4&ub43F!>&*M05K;ivULiCuGe#osRmT_r#}p$$CBvZ$f#KR@rHxH0 zKjc6kJ|sCyHbU^dJ@T|271w%7B#_)C2LU7gZPPYiZ!TpOd+Z2RG78$rU`z-O==9Z9 zLB@f?Ef-LSL)W`e_~S88HI}}kSAANv+}M}OjwT9KHI4pSU#C@Fu40=;OlAOMXRnCm z^e@WWt7ys>sXetBqweaj6cob&h~PKKf9i6(QX8E$SJT z(&>UE-|-567u{#Z&bnLnbTw+B;E+e-y9piWG2utYS6ZTD^FA;br>B(65ZXb?%)_%Z zk$1Oy+A|Fz^kGsz^-FGkVZt){8B6favQoP%o`hT(j&%(fu8plXIvhR)K+#3(#(biT;0I?B!Vm`oA*9@$tcEqUrP>;kENk|b}l zw17_U0UhsxA+XW^RutNVtkV;etjY8(hWc?vw8?45FJ@3SYkTr( z_88SPt^Jvl!P{Ysv_^o8b{y(wV;2h13|WW%Ac zmTy{H3t87u(0}bQ8N3rnCQ#c!Mo4}#Fl0}c(O7RP^9UH)^z54xPlHBEcm;3CoL-qe zTadU9+<%I{=#_$Hm;#EfGp&ux3R)eIC~LyILW?&%+la1G?^%{OAttp?%TRH$Mc1wj z!*ood>Pl#`lTrs8a;o;Eb1fmJM^$ z1dM38fESKAQD!abERUdPO&T;lSn_oSL?hjr;fxiMwa$Btsu_1+^h3RFmh8*H|?atnP9bbhVTrNOVltGsYd-IFxOz z0ad=W&Us+aA-E$suNabv4DV)bOmaO@s;$de{09do_J)EoM$WiT_hIT$V=&g3Xck8yQdBQla6!&k@GTdkp#=9i&Kx-dN)2PF+TTfsiAtXfwqG z?($A>X^`j;Hih#Fxq%4HVVTtiB!z*sk4##5j-|7S(W2EB&O-}VQKZRlK?nxZUC(@J zgRxESTj8p9kFld{ppkKHk^vt*w>TpqInVu{axi73_~v$Rg!@3@h5~WRnDM5#4@DbU z&WuRb9@})bUIC9|y?Mx6z(ad?7fMX7+1BeZxn1o#^&!&f@fT4b=e%7T!PNtAL5GiZ@`z1?E zuL_S9!4-WnT!{0vd+B%|xSM9Bfp5JpmAT_xKV2jf;|+2Nj>%W~#!v*#thA(HMH>X0 zTqHqs=p~q=+SQnF*<_m&*ZFKf6EL}ZG?=Z@&YCxkx?WL}$(d47qs-RJvh*g!Zs8EL zsN}E*1W_i?#ze7h975oaxuVnJq)n&6RdJ^Eg5DNr7QKLQ3>OoX!&^(8YYNHeFS5rH zm8~N0Ofmshg$|&-3h14}0{VsRF`N039fH!^hy*7}BhJ-Em%L1_EpJmy2ob34GLu2V z)7njX_63}E9mCT}xt-)G9iTPPTMMy3y9=;jx)ajPgWpSO{IynQ5yx zjRSc}ID95$7E%+PLKTuO@~_m1vNIE{$7E%-3^Ghq?vB;O^;2`m0yS<|qi4Ca!eizG zj4wL8gW{tM`wftRrBUB?mSOQbk;A8Sj)?Vu(E12(Rev+__n;eT>ig!&7BAebvrI`&AcuZ( zv`>gKn4mh7V1mmAFoJeTzm<%t&Ft9G+w#_}Dy*eQj z8CCy8KvWjl)To3#GVQARCaOdEyeQe15@2S}*Q(zxY@~+6r?vBR+#jZduJJw4msqxY zvSvcD%#72!KvM>ED4SLeCnpAHrkPI{6dloC7zBSZ*)E?aa1>pk--GrO z!wBF$3l9X%y3w}TE+~8+T5H%iEQQv8$=fimqHHqW0XD;KF!+LBJoJ(m z7OQv#Rh!({d?IPS(zqIM!HQMLL;;!tH2Op9U^#3p?#v_r8jNg;s2~GCPDCd}K2V3- zvI~eRRUt)2UMO`KRS)bqSz+FsOC6u0QqR5q_KS1Ef zMsLv?>U!y~$Qd(D6qe;tpn*xSG3e^y{4;aw$8L~tR@7HK$+bGlW~LIRa2oUBcNI>_ zLSR!{b!rLku^IHXAB9oSH`R6pSV7VLrM$BYf;mNXG)0r~Wk7Hd1JVD-6vz%bQ{xG^ z!D=orRl+p}Q23J1{?=MuD@XeDJe@Zxn2gPVBBOD3asdO`CqeYn-Cem61u&rffy|X%G5IOb*VI=0_l!J|=klARuF2L>OfB zFpa{^F=0eHVHhO?q4)$H)$cRtkuEX*pcQm#{v7xkASdK&vTwW>Dl&cW)b>>Dj4<;%pfCA zqfowp0A)a$zZx3`LuX}ex4mL)8ZgUVkD^l1AdEinqaWRr=NEQEBZhi7fcK%C>Cf6O02oS%OFLWT#`Dp zt6K`42GynjWY^k@1*~$hIijHDX)AvsX)yi4{+X}-u3F!m_wpt*BfAclOefvKfWhpF zn5H9rAM7!`_%xvw2;q*k(vxn{R(U$(t4*JHjBxK$j=%~Ikh~#v5>azd_!M40wL%ze zms}qFb-V)db3*D%&V664$h4xR52bl%;L3%d3lUKC-98UhvbTb!=^(}6Ni%(yEU?+P z4qeb;&Q#%xFE-iiV|H1Qg|&ECnL=)$!#gSjWRh!*R^Mp!w-g*WZx9EZrLd*x$eIV#t&+)? zYm1QaDWZZd#`?c>lZUUv+nA<+1U+o@AaIZvbb?~~D?aWeEEZk^rblfo!W(BzK%O?( zH94g+yAY=y;~n87Y?Ib8wr>v_U>Ox=PM`MH+L=68ixi$9yhAJk%^bROX}Q@96y-Ov z>`_$gaHthx?oKNfT*u`ykUL=BGNr6mkFJai{>bhpL{{vgjg)20+avz*jOs#cRu&l} zL?=7VOg)BNWiYA9*<*`&l%VTuG-+hH5#-SESf|7*V`Z<>Y1n??1|Y1}GHjzimpSfE z|Hv51nZKmsM+5F5*%5L-)|&>CO&iR0Fw~0oq05w3%s?lV7Whg0t?tnI_yVl#$r*pf zAUAfRPJF5g-R&_tct~&}_LJmXp|kV!*g63=48G~SkvSR)*>wRJQbGSS1G_G3sJnHo z?&|kWyEq7>ZM>DfIeA3u$87u3KxpfB7|h{zlHN%s7K7?c^*)z&QByR9u_Gg_T_G7p zLmc`enc)C5ue@&NC{Kt?4s%g*w*kRm!YPc3I$)Ws?>1)W;2;Q=m&s^CCC1nW-qHzo zL&Z7cc`9DIz0F(y2Of~=;Z*4#fv7Pu?J$30UxjvujYLG+FlrMyuucfR9rq++JhU>0 zs+#ei=|ao_orYX{)^W|VJh3lGtbteuU+=y_f&I*CO(E*A8fimijxdt#@kYz4aH;B8)c$^3&!o4IAEbN{A%E2=m4&ZN z-0$(zw$iP~k zU^{Q6Bpdn+c|t$Iya*!*NTV9fZS_rIpOXVH)*Q&d0>zL#SUe;`Y^q5o$H@oN3~7hF z(AEJ<2i2N{T5jLC4-Z4PqPSuu_kc}}M2QKWLPEDeCQ_%eX@lo=;eDy_jUoiW6>q#s zH1HtSx(@N}T#qO;z(m0iZO>!@$tgCtJ@lGTr^fndT~IFd4Mn>GCZ}fFSD^~D&hc=d zKM^5|Y4zAK)sYN^+iZ|WB5suB&TND<^s+PZu}@@U!P4YOK`2_#-Up#UJ8#3?32SXO zqA8>&6wi^6M>|}>ezDni+9waS;`69_bT$X$16_AaF5sXf@idxFXPkBxqfRlsvIK=^ z)IusIEmrIei<7sZJ)nbzVQDzjbehr?aG3cK5QZhRk!^;XR(kECoRO}KqQtl{KhS$Xws}DTmgoc4e8}Iv*^h8<7JHCX5qJ4ARybT$XsA43H+F773C?LzeJJR z^e%=1VSOq2Xc|?XM$^_G(E2wKmrC2}u1Ky`h1ak}K1~UQ%{Uou92Mrkg*?&0 zAuGcbb9#{R+-n|$|mU=R0jD3^R@LGN=0a;_6oZE z@6&{qy$!mh@H@RQTj*$lLeCCnxP;J2W@)n$@j{?G7Y;?iVnzE0nh9IpKtEeySa#X; zFuNchB7@8qW(9cB^rQ6G7apgSj0XaqX?oC>Lwn%pcG{;2$XwZe`2|A`)Pysl${42# z!OYXP%3+vLwjc{$22s9=SdiZV_M%)2Me8xhbuW#;v?^Fx8=R)QOQvo-QX)d1eFW~} zAoBxF)%G9atF@3%D?-x{jRGoL<9Iqms=Tj4>J5HYLCX;+Fl>LkcFWr!UHD95l~l2;#2; zn&77v-J@ECm&|bKF@D3QR83{xNbpE22}=j(Lz?Z0R?(pdVG81~X&LF3fQy`Nxc;Cr zYv)a2g>{orH)nLCKW;{9jkyUR<@tWwJy6wHuO9^YvLTahi-kUraQ&ke&{|-45VD{G zS5ZsPB&nE4tQ&Xww5gS^>{T}N9wwcwei5vcET~7MxDJwRi%b!wKFrsH2E^>pkXAoP!f&edyPwxWW)&p&@ zHlL94Dl``a0oPMxHe>dGNMI?J&J6bu#-fVaO)1gSd@M(np70%Xn%VN_d}*MH8%?wh zB3!s_jo?B4%Ug57$rLTUHNOYrz;}fiYG(!2GtlxKAqWs%m5loakPKbfhfvot=%DtswJSi$6+ zS&O3}#e^0UnQ$0=Pzoby0w3JOBwe|n(w`K2K|3mR5ZA%bU*$~uog}Rovgd}1@141|jI=^%zmqq|}?yKynpz?5=62 zK0z(0bfcWRHLj9T7zA++Vl5amwh{U!Xeeq{Ab<=9LOZfZIFiF4j!sFl5qaIrd0=q9 zm(=TKR__KxZWYzdO6uKqp`aizm<{cw^R|eQwy?LLTp`nGIj#gZyYAWt9T43Xup>a` zv}KfKbFMf2c0HC08M6#4kSXg<&XqtSZSwg>n}Vg+h@2fkKRu*0>#=Tx0kY5+X$^a9 zwF28SwLAiLn}>qyTG4WbyCJ_<5cFV9?k?jFhr0+tj<(O(qy+jqA+;dIX<;_@}l9v%*F-u9D3wq|*cbRM4~q;mv5}8+rF?UDOcHF{EMy zCggPsnV))^@jIg8mm$s%R=!~l0WKwkWy*$?T^MqY#Vh$7)82*3&4sk_%Ibw6@NjO`)ix;4Xk+ z)^aKutXIB1GeF}ebgcrvI);X(6zxChFtq3g^Mw=+6do`txW6bI#C4t-MxD(2db5PmPs>4b1{cV)EiX@V&{z-OhqQH}NYHi&F zUD7d8ru9cYWZ`zNGob~ApXRgRrMbAgP>sR=kI@G0ju)oM4-LY|EvUz^B((8p%E&~a zXi9?nx;UQ*tbu_-ilW5me}0Kbr_oh}H|de7ZKYLj-gM zbyoJMy|q)D;Ea=NJ~0^|Fya4Y_Bnj8%F~M= z$6#VOGFzpv?9Iq^hK*S1n|p%2ou*;a-EsqbyRMjXq6Dr9=iv|NF;aISUNh$cEAah z?vz(H%D}AkxK(EN6q;&LOCQXaJ2`tH3`K#~^@*-U;GYL?x?34Cb;WN!SKW!$=!3Jz zysof-E}YCHz=_&q`V~?*Ylj$C_R2^^S?@wL`g1~4c=WTMvCiH{d6GnNy8*LYfHKVJ z_L&aSo1PQUw)52lj-m`SBq%Z}B>hm<2A0SHHf9aeBS%!Ev9`dOu6Z&&Mrj| zaw;x&Xn~Bo2vzn$I;CcE_*P#yg6>*RcDbgP7S6RP`b)^tQbb$UZDQnct#PGi?N6^v zsQdM|lDw+Ol_vr-ooPrmX|}e<&eirai)IwObaZ4#N>2e}D@c^sV~rde1BuaO0~{T& z-G8L=Izp_kawj~VY+gSYJHkYmozyGDt24E&*t)&PwEHM1M!1VALs%E6af^UdcXgUt zvQQpff3&zzd|ZesGn!iDv8z_DWy8H$A#(7tSu#jOA5?Boj37ZhSKL~h{2t5Q>|Q0& zF?8N0YMaYorEY3{Qgy<90xCt=lB!}1bfoI?94IdDWF(?Ly|Pp&aW1m1oNV|+VIZhA z1nLWx%~MPRt11?dXm{A;$S!pKL(T5Si`p{WU&XrUF{+0i(nXCrHyday&nY7f^j|%nJ!KKnhc7(lY6=Amd9nD9R2`-T}rF z{rPS6(1r7a$P|u3NA0Z9NFf4M9wwM)m<$y?9HPh8Cf;`jQcSMgX|*Y5m@?rq7CNCm z`6a#DMqV?m2Evcj#3_>MR9>sx$;Asq+b{_kjL94!eOAp{(n_Si%Zv+6gqZZNWvXwrwXz#hT%r{Wdzy*9p0 zE?W4X>OT|AB_xQV+Y{8%3DB{cG{vu{FxCXd^x?Vbqavzh_E;^luzCd($__M|0P_>v zP?zGn;Wr@_;VS)bv?fS^Z>X{>OqTbWX09E}5;hbwfnhTLn|+VYID%!QPpQ$mjEiE} z2(y^CgrspqHxSA2jWkRiPv9tS?{$fo5`(}3=LfV2GKPqg#A2*qCHrQqcM+DJ#9+pR zzdANKP=W2_tdvZl=45!0*J zD~{L)P3CDrJ$KW)0@rOtcr1)MP3ya~zAluQgae;7Ms!3-1_G6ea9c}H>`SI!K8%?R z>&`aq7s{ysy_NTQs&PHaj_ZVwJ%^*BQiun$v^h{ZSXPE8o#`pcH>SIVD`ogX>%+93 zcVj+fHUV{k33GYz$#x24F{`($!jG=#-PEXtJ{ppzZ5**oOw+0_ki&G~g`Ca4RN+#C zcvUX1{nF`*lfMH|N{7GQvd3i>IlA(P_>w@20EYHsD}K-AB0p$%VG`ymrq-7*x&f&q z1TQ_%+Mv7Cta(h2olu#s*gyhkR^%xdfF4Xw%`>grL^q(_wh-zm=Ii^buwUGl(3z0A z9VGo>Lro4IYtnS|aVg?DU1mXEa=q+vAy>@AJ1loV_X%$tbzsJG2RsC}ZuD)yyyH;v zHu0sw?Y@M;!Y0C}b^+ztoWC%vK!KHGZCT{!~XxKV8oL=iSQ{6nD%He9BM3(?0J zMhte^6L4F197wk|fuNjtBe<)yWyZDLjq^SsvT(I10#GzeB{?bTr%a{m^2P=|=6g&b ze>6!NNKENd75Mg_zOrWsu9r1Im5rXyg^j}opm85FLv|tnsw?JxYI|Blhva3Rng?~@|ETRtKVhO+Nm?sA0>x?5p!>&1|W>L7Uilp za8#z}wGQx|->7%d&X01Bpt*_Rgc!z#BM|b(R0OtW7F=Bua;_toX8}~zYD|K#J1{ki zrWBgsbl%X6a)Pm@s)VAle9(vV0drlnlFL}HEHLa&4>vwpvqR;gkZD9LLQrEu0d?W& zWzxD@d|FfT1kZ>p-~r*_3h0#)FNH{qa^7PyX8;cqaElBc2Jj70T9E%Jra>oQI6cFe zgJ3IB@gB%H%y?3qa(oXt2z~fMp4=lRBiD$^Gy}T=V8W@g=kJ6FZ+NoRjnrE*Vyh(7 zcPI!b7}615@3CD?+hm%=AKcpXKW2|!QW9!?yO787G}v#*Tm+9%sF0Z`Q7%Eg;!eZl zRhH}Ui^62H0Pza0BH9rUcgYqQjZiJOZMqZBvHB_00_Yf5I0bZ{bgBIlB9rBotzVuh zPcP7uWcq5lw(8PsG@nvdxa42LH4bdK^9I3-a~*LXmxmR*brq?G>x7Wh7F?m@JOWqN z&_PttYi%TTK-8dM*;7ABrs+95Vz#n;b5aYmo23|y0qZYM0)dTOd4U*ZQw;J{Ji~ho z)x)hTL$q69Eq2rl$L)e|O)xn;L9H#og0doI2yg)^E&R4dG`8#Su{x~8?a>8KnLbsT z2N#3`K?w1X*mixqY#=7oDRBOzy;H3ro$OFTr}ajOqS5HKw)<~ytHsN(p&*u ztta3Y)d`aR@_mkRK>@G&9z&N!5bKq1Y$Ts99ooSBzO!1qP424!Dd@dA zxo=vN&Ax2~pfDeM+RUIC{SoK7XhhB_lKDc_e9cefkoFt=t;X5f-KWJ>xqzA4*IdCuj2evU_HqrS?z;F z9-RAdEVdz|YKE&hxk?H#!CHez70f&>nFLue)2k+iqpMLMCPlUxUL`~iIwV1Ip#ZyW zO(`tkG$)=tIF=)wz=S6xZ;`%K_SM=X(U%8S%1 zC4|mJlcAGmS!X=N)e@>VZ=i!F0fbtR;zXsf2+}K{{5`e?4bKxYAB(fd#R`DQe0sDo zEIF^c2O~(O&%yW%m__EBV~^k>gyWyW*h=^vjmIKmHp^sU2#m<}J*h$hy7(BdbFUCvJ`BZ!t z!A16^)d`g|1q*;miJo}Eu`fmE{?JWf32+!WO&l1o6BRK))@$l#@)4x^WK}rADB3|S zv$rslfRf;$$-y;pEfuO-G7?0T^CGE?(uXm-jCJR@K;4uTx9$ICT;{`0BgH%{! zRmIk4lPQIRVVEKcch^*JOI?=8PfLP}ZqGdYAcW)v!+lA>BVQJYf z$S5I$Yh-o8h%&}d%EeE zJCn6y(%&SoIOAjwpxR3_@25At=^W^(-dvyV))Cg%&kAoyr!e<1WNNxjYfvO}E%Vb3 z((p1t2YFpxGwr&tA_+7(dM5U5=B}MA-`C=scvpB(U)CLxH<_A{U-r0ZAr=M25s$Gi z)8fKrHJHW=SwB-maWKTv9}+s93DkDUc9off9vV5Mr)}j|<7aiFoB`12{g@&uj4%X! znW>J*&v|IkeMNWcy6|X(mckV%;I6YO50F_%NCw7cxI0`@U7l5-M^B&>Ql1*sxKkgZ zV`+I=ex-w9OPC2-7@FtpF~zSi^+sCz6#^t9kNT{8T#qOQwl@s}u@3ZmY1Kez(JG$7 z4*|cE$F>A`4_m-ryRa`UE{Wtk4dIzW_tj5*Lt%PMaITY1Yrs5!8Kkm`7ll-M6h1Xk z7Zd=g(l3ZRO>w<3c;|&Jb<=}_xu-^jJ_BiXR>iWCR%;K!W#nsDv{*(a2w2ZB9eHvv znWc0_){0Sptmny0ZTQ$3ZUUGE_%`X%*|pRXM(bt2PrD^&x*k#Sp>9I8QQ>C4C=7=`3405 zh>I4d+1PrT8IL2Fc#qLVLW_&DkyhM1guYRil(KDH>pi9$rEr`s#QB7w8kj}Fw%PExT_&ejrERV40~X3ZKd1dLC1x zMSJ)%X+(%g9Rj=<4R?3WPs%AnRiL1_*|DUf1J&Qn=+NCr1lgO;rf=8r88(S#IaQ?U z@`-K>xVU63E`45yJTO|gAXV_VsHzglngS9PuuFm*^Sz9vRR0A z4)7bF(q`=Ekz4lzIW+?^M1HcpL~Z0$*9x0Ksg$2wl7Q19j19)pM8g~dUA|mDypDCK zPX{T=%2Fh}OxjX2faUdz%%DJDRN7Njf+@-9`iMRd02z-aQ(<`OLk`bg;p$gfH1CZ~ zjf3Q)=PYOh8PpVkmlnLcA7f(Y*=h9lDpd-lwWm zuR>{*QjEkDOYSMBmWxJhV~X5#ko2WTzgg#ooCDMPsOKn(-|>KA-(3p(#b9B*DLaBkJe?FfG1?@y$AwYWQ4#`4Y9$YXuRf)IdR6HM?}BY7sE(Q-$AOc zS058;y}Qt(X-&}@3z(L9!oN_^|BV+k+kFoc!{tuIWs(q+9rn``dK(mFb_tvg*G znj@6aF}m$%|PPXXOXum%zz35ug`xVMqFR0LGDffx3rV-OTwtHWMzW4D5c zhx!iTal)9OLu8LpTvkM>71&P#OQ99%rc87zlVDAEqbnAJ)5<|JCE<}E0iwEt?p+)O zovlyL2gyZ5MAS@;V=2}h zG$5fUpUC$?XD4peXcXe3Dx)cnrz7 z)pnWB6;MNZf|(R3-x~}JWoIpL7OF6eL^kf2dLgdHirpRk3AdL5B*BCe-(!p(n5HWL z%1E%_Y`$4gjQ?b!c0WS*NlVNv^gglbOs$=S0}BW zT=H!D2^`6eYZ;-#)XR`rq@)I)5FoxNOcy;D;hp)YXWxEwcBfP~nzV zGswc59wXB*la6fQ99$v!>94KZT?&O{WUnD z%O^M^j~0QTbHb(;&>E`q$UyB(c5~ctREt>N|gS&pwA~tQuU`-hzpU zP|Bv84$jsvf)3?e0zD?f0>LjzSssdrWMWSY&1?iEWO?%wvS2tYL1!gc@N0rv?nQ)O;3B4s=zc+)F7ZKri!VJ)rAtk?>9Z4#Z*M5krI6~#-b70 zlRwqLf!MY9WJYyD#HDTcX_$T1JJkNuYsom27O*AYH5UC{^tUIruUCSVMbh+%Y zCg47Fvy2BLz)74K6qvI8r8AFYUpizCnL3QkLPfaQith9_UN)W0R!r0d>{7g(d$t~0 zYow&ZszKdPsAe<8b8f+MlsyuSy9H(*S$X@(VRmqs%(G!dRyu)V_3qhC=!Zz9m6~J7GP<9xD#czS*3(-dlE9 z@kt&gFb-V;>t-`tx}~w0=)u&koTz=e#)}EhOB*_+g6WiI6{WkU=ToCizUZ#HmnUzu zGT;*`DJW+%Df4KlXu28@EZT%ii=@qqK*&{iS}o49%oxHzD|xG=*!UYa=m_yOa1TKZjb_&+h6w1=)NdPP4?k;#mwc3P+CIDt!(p736_$qQhZ z@ZB;ZT)MwT642bbsb*@BcX1JHVY~!EHcQ^g`cyN@ym#8^wSp_bT|soxs*1x2N=4nc zDXW@;wJj-xmHDKOZ;g}|*TEvJZ>CpK@Z9Eh5m5E8FhMd8p96gkKqi=qWc>Q;C0Ieo zaN&+KVB0YxfG`}?ii#v?0yF`Tps*@w*)z@NS}Rx%bi3u&v`rL>tzN%^mIOY*3=Z!gj1CECu#v`v>4drB4J$&f1$xY^=t_-fjf z2h15pv@T;~zYQ59Y6i#pk)SkhwAoaFADIKeh50^Bn+8`@Fp;#}&@i#_3B7+{ytKbh zQ`jHSk6AX8(wTSNjPdHM!C#P!HAn~sHfjX4siZ)S);4N3IyYgB0i&~t;V@xlL$>e| zFv#5D?ke>15?&Oa#C(Z|!qK<{61)uzCMKlQXN z5z7Wr{f(sGqV&Jfluu93XB*^Ij7KA7hI=+c&mwc+DGt69GP>*;eOxP93!g#--EVCQ zV(US-@c8%G?K*)dD6T&&QZxdPP>O5eu`R733rC^Kp$nVjs!OV-JlTh{(5o(lux-2>QUidt^72+4Nj}!2do;nc4;-OnlQwo{_ zohiZ%`-=7t4FP)$B|tP?kI_*_Q#8ZNL@2XIx=#SaN7sj$1ne7{1=SkVS#D5ou%hJAK48t)wumeKny>!D>l zY{JpgCi3tXU3B|xS^`-pu+#S+s zrXMvA?}70MTQ=oMb`&k4{Wc4+5A$*){U?)RrnP9*|4p|OA{(0w4RvO)zBR^-4qw#E z4WgOTpmU6#jM;*g5cad;oc_OCs(%tOH7GRDYB3Bys0IBxn0U>XsPKw9}8oJM0E#QSrYjv(i{sTrGh)1WG_SVzO;>abY8WmtlI=dGlHd1 z57NdebZHAR8LfCt`XDa!+Yyat6e2Ed#C&R0sGKof$k+=V;956%KE?IAfU*_tnzcl5 z3c?QffUP8FEH2bvrk`7Y!P_vMB5UMZ`96#TA-$Zn+y~^6erq+K%#^;H`9gB4?!|ze zBEwR+UatPd)0P*w!2;+iRl1&`Dxx)2H|r`Q)`^}L*Y8E#*@mz>w|-DUki~;Qe8zY} zz6Ra*y7C#id)ufL=t6A_isjztv4DPfR zz#X8&t1#(lzbNE^po}haIyxxdY(_AII0tiK*1K{%LzucPCSjXsq*c6!0COFvc`G<^ zPjIGphqlqL*WDP~7CfE8nP)R5WD+qh*wpcKSj#0-({OUfdJ;ly&AjsorKcjBRXB8s zV7m*l%SF4Z$bITcKJ6D|nB}A#gh7evS<}rfvWNmcwLZF9S-BmE5)>M8EIH(zdgg@# zL%%!QK{_$_5)P8r$2k3#wIV^1Q-y@lX|gX(QHT$+RYbCEAa|a?Y8RGND93ut4z-s7 z*eV#31Ff(^Fc{ny6uxrMCQd@+U@c=v^ctB}gX~E$iE#GW^IbrNQO%oh!X_6@rg=~z zle>XBx2_TLdrX0tOmwt#dZ(#aA?p{A0jeH)-=E5j7mOkQLb8+vL54%dp~G0ZR(;Ex z6Y*IPsxf_I)VYy~Rmd5ScUtPFT$IaN^rI98mQtsF+D#in@wGO#Ow+7plBZC`T*kZN zQ2llCg;SD=%(m&%3gc;u?icei*E4;o z07|wH_fdZI$R`LX>xZR>RE4J-&7~i`p7cetZWG229e)`vZPu{IX3nt2C@^wA(fFaQ z(5`O|7%0#l14l!ng6~zl%;3CUf#FttNv3pb5-~w0nS4(-bOwuy>;RQpHwJQ(;px&W zDq!??SxYyBuQp{9)_c1+IWY66N((b+k=W z0?HuM?m~?$LEzN7e#7>tbC-+8;d`uKhIgo_zA2K98sQaO5|WaQx9-iGPmzf-!Z*6p zD;mPg+$pHoOC~NE8oc?YOPk#4RCzr45Ful&kD@u!U&ELyg!UBy4hw~$wLxrMmrpLb zI5}wT)stZEYOxiR z1SE)!LryMpS$b0upfKK!CX#mR5Q0P6x)DHKEASOGH?k0Mqwsy77|u3Ujhp;>gD^JP z9brw<5fKL3PYfs6Fbz!uu#u3mmhn8urtGuoHh-!}XDBj&j+Mgkk5P$- z{`vmey*g~ELbfFx($dWg*RJ$&Ztb()pnR1)1t z&gaF{rTsQqaTJWoxl>`+VR;$MrO>pF16Q7H*1mv}{*ih9qu71vQR(+Yp{~b4q=(RG zhb@gyV~l4+$Vq4s4T=VTLOrxuFg;Bv2|GQ>llw0)98gD=ck6#H>hiQU{$FUi{O5m1 znl2eG6!f!n@0l01L5iAlM34O!{2>+Vr8leN%1Ds^SMbnl#HnrXBCtRdMlKIREkp1uf1GIo@9;ClkxdbTXhLx zoyr(5vMCDUHrcsd<;chD#*ss=P>PTb0nU-j)-V5@5e|$5QGtoDR39c>{l+r=lsW0k zI&@`L6u?abBHunCt#aEauxxJMMHVmatEGQatFHKMDa3=yI4oQr^f5G=j+hmrC5viZ zk&m*;M+;YJq!(H?X}ydVT3_>ti7-0ijM-zqDj5AuU+nUyP-t!Igw&a5FfA!E$~LFK z@=|bjL!0VPh{jFo+6YFW&=??l*-nN^(t__6Ph+`&mKJgql{^l@opySKJv!9`c}TiSLVRt~5cI61-yN*pr|;6uCEa9t zyoph=AW)6IpiaeQ3fdksO_uh>FpckmDwtkI3#CmDvThbAxdkP$p3reKy#TrgbS(YK za@8**qt<_`aAq@=-+sz3VUJG%u`GqIP_cZt_p4iQ zKekN~9(s)Zg!EuR6%2{uQwb3S6e7KyvGJk%-w5+5O)7Y4>%}ZS<~8*%K0+)?Z!{0< zP1kg&cnKvN7l)4!yuf}VH}))2qcNr*g(#tP0p|B<)AiRWR1EMBW|iCL={^|fyxKgG z=X#R>KUNPR4(X7rY`KkrJn1n<>C@G{R!I0FAZMh?o!n^{3fo$!*0Jofu02dS&Z;>y z33g`^xb31UgwwFcgu)@)RvcF7=tDgUKaEzYF18}>{2tSBZ@T6-7N4D8Z1)Tem`adtxLSjCe} z%I4Z)g)q=00d$4=*%mo^dT}mda8FYy5fW0GjIwP`5z2m25v^ExO4l4B;Y2qcuI46q z1Uh~6_S@Q+2fVN=xl^RLN628FzC zqwF$@5=PsIo*hba%rRW3)t>MvV}R@`l!?@a7~{2`e;xj{nFO{$Z`uB2s?P_mcWst? z1*x30{`4rlOofM8h$@(~F%V{JCzeMBN{?6%jV;K~4`9f?T84)dR9~_ci}_K+J-5}D zd5jt1Pk}#$6`I7(VMH-(CRD>4c=1D56Qi1R_{r-WI=VJAJkimad9B^oLoq!MDrTgA z8hX3{FeVL~KCHZ6Sue8{Y1cn{+297ulUf=mVv1)vd%aI1vh18UI)yTg^yu!oJmvAK zw$~Ctev(BmF9A+23u35tKgz+b$tqpzV$x&RbW9fmovBd;VQPKnQbx^)`q{e8wmm~( z#V+6?c|GKoFkGudcwEiY%)UvZd<$*j)D!L_b8Y1@1jfqm0xGD#0?Z$%kObO%6F>tT zmd`j(o7xl2l6cUuxW7H6NmMsU#!?n(Tl0y>8PU5I)BQWF4r^||+V!F_rgFwb1^cL!4+ zBQT!!Bwd6Xpg~>~wVlI#EZT*#?vy-jwXh-t1R*0MDx}SAMidQVzA$#d#A*ICKzqUo zxy*er()clJ@ag6aA!2z$%fy0Pa*~5XQ&$P+&>ZU^r?58pZUw^9gYo9f{A5$A7F?T%XgJK_lwK5U#jFijJn7C) zge65tYalsIwNkf0<1FgRMy=I;8aH}5^Ue_IP>_<9VMMX&jO+7ae8c;2t9ZyF1Q+QF zhVKT&_5yK*HqkwS;*bTEccx*6u3&0v&2*jzM1~L*T9QhZX~?Le{>e-t^Vz5te5>g0 zg#y3B{K=+FhC+>l@D+|3N6os=laA|X({Ks{NaI0|6Tek{NlFp&O5YCYNYKW955EqX3v6cBgt;5C}V1b~I7lg0P z#G4?N1EZm>TOD$!PmPgmr{V=gYT7$DmoC;o8l1-z-<$B`vCfSfAlcEqSu&`I+J|5Q zf1%Z-h}BLchrBS?93Z)ky1Dyk&rAxZt&O(Rw~WI?hl*hwhQj6OJM?VU$|9(U!52#0 zRyd}Q7lxwFj>7N#nw|96L~>E^xY(#HVzRvj zr?rIG#>TaR1*IbT*Iwga*vxT|vcAURb&X(p>Xc?H?uN%E8jjE@ zo%1%ltq6>WOY0WtpjG_Vo~Cy=H2_Q~YSO6CP%sgG&-#)DH}^8|gJ#5rZ&EQg5v4aF zaYzztCI!5PO>hgJC_EJ=Q*?%bvBu`2NJS8hT283`ed#&|S4yRM5DPdm>N;W2#kc7a zG)WgXve6eHK9_7j8nq+YJz4)4Lb66Ig@wfl7cd!Q9i$Fg>TAmLekcrhWc%>hXIhT- zPr-z{pkc$J@0`EwwhLe7@w6rHNs}6mduj$FAD75a#^4f?o!chYijW#lD z)8)8oA}pwyB}Wu&VoANe2}kea$eU4h(+h|}XZkQKUih>nINsn$uL(}@xyI8MlOb1_ zF`+P|feq54K^aRB#IMO|wjs@^chC=o!q7D1oPl^97@ZuU*?3<^UyS-J0rO87>`w~9 zsWBV@rCnFpVB!wsk*;j=wyt2vY5E~h$^aEX=_g1eYoeesM|(BY2avIlkqe8fjNp@H zSM=CXu&b@N0;q1uuk@yPQYiEUZ}Dlwd7&!jm=;380D?;0g)0!DtG}9IBgVT=Y>piyHNW>~H_UD;+FCb2ScE3f@T^irbgYE^LP zM0IAPHJS$-JDTG zK_~l)=nr1z^@qVQrmu_H$uZb2bQY0rLl03;p&)exS5BkNgc+QtogrN6_*n(alBm!$ z2;AbSMGK%;zvBs=2##_WhAWS6wow+Y)(sH*jHc%D%Ka`YI{Y(+Q}M?03jl&>v(dGwIx*<82Dz31Cbb zG-)SzkI@xNqN7=2jeIXZu#_I*z0#7-C&IFbxfHeG>)CaSjHWCU#28^cH6J1Tg^Y#C zbR-OkP*F_MyieM)6nrnk5c$%1Z7wFvSLS6j?Vp@f^F&MQDtiRNPzdQBT0}d5y)kFEb zqQA0j`jU@?g!s#lKxXINFvT2g&rB~MHRWZZ8XEj4%tDpao4F5oMgqM42MGd1Ek5{C z*jSpd%6<&kx=PpjZ96LKHYn5>+#-d$A>DawEy!(XOTEAkzYT(`xfEaouQiu-$@j@v zM3)g6_~a}=g96a4Mv|hJfk3TCd5=M@&JfFF)+y}u^EVeoXkpX7o>of-RADI1hQNxM zDGSR(rtM_+tvyL63_cYC0ZZh@_C#1l&TSy2eV<4{yu!1(#NI}G7`&Wl;tEp=i_OsX zd0H)U?UVrS zod>Oyr(m+-v0_4*>pb8gUr@h#$|zYLw!X*YW$E4wCNzARxn_oDF@YyLx}Ks$nFHD; zXuC-1bQ($)beBsw3RNSc{Xy|MJFKXsbij*k*wq(g7OhaD?@_nOwmd94pv1Ndeu<5Y_p?lDTqyibNXz>E*1X&`ZKM$iI9+En%^7&9aF`mSwQUxJi_CIfPvf71UKvI^ z8IOUUg`BhfwgcTS%0?Ocrc+0hSQrm1QRu#A_k>P#63GokR!g>%esp7fhN0jn`ZsDs zWRuCB%B?`EEC8$JZPp2i)^lds=1G$X(diYI={Q3XW&EFb*?2dseD zKv9T?4$dKWQyk;(@6&W*EGnf0m^?hxv|lsNsPmRE!c^QVZht8wd zkt>1~PnzUfF*jP5W{2SDE^8N3XxbQbt-R3|96%Jwef-Lgh3tu3=3O#p*F-UIc7 zqX4Q0dhoM69cLkga+o?7eq%w9Z$q&hjkBT%M7PO)TUfOtSz{nBF>%_8b$>Y~VWymn ziLk^h(1ik>ae~oO+b1WT%*r78eu@$i4u{2;l6Vk&g7}Ql2N-v|;&e;GWRwiCYA3&r z4kpeD2FipywS|@&%v4`6FtT12#*WVrsmz~Mut^NtWBT?}WulK!TQj7$jka-c5rwM9 zd+bicRtVGU5B#8jKsvQSbzd#~&su}Vb|N4ECU38o>;Pz(I0@zfvu=Cj23*sCU@U_f zK1LVggp{*AIfeuq&mbjx>F6K{gIuVBXjwf0^51!bQ5B`vPQ6wEl)e-`#wIw^nWcY) z(X3ZRi}SNgjB%;a-~U=__w7jK*<SjV2d9NxJv?tlLEpfO40NMNssE@3FmfTCM-I1g7d(!V*3jwT-_1=( z$o3TCdwgW$m?(_hlnd!|P(%gQ&r_Dq8>zD(wzk={X*MRMy5RwzOKJ z`;E^)vf*{8i}1Z7NcUt@qOdbWJz#QV$OiJn4u0}Ueak3`;Io`ehBcG=(&D53Ndxmp z^6pVy%=T1HpQIg4KD;hDRfKUFifLYVyc%fC$p025ZRxzU&f8wL+%8f>S4VnSy&j0> zwr+B>1W|`bHaj%D2D5s?Bu2%lukO0C^^=L9k^*xLOj*KoG0G4Mv6QEWvdJs}u?#y4 z-^c-dtHA2p7PC|)CK6>G#lfstK5qX>8ErXLm39 z4%;+t6sp4e%djEB6O$@-0|t+4`d-Ust`Ym|n89x0KYpPTTl6~>unMmGr~IPDfL)G3 zW~MKpSEWD@3o`1k?7Z`~BRbBcER6pX@@od(poY+KX;^N=m(UyU2J%)4wvRB{`%Ha@mk>MHDEoLw5${gBr z@GZmGs5+A@Tn&%VOyRri6^?E#(M~i*JB}qP?VcUfm39c7-`Ze+ zK3`_BK-9x1@ML_Z&@i=i`;X9qwNwdW3fpgHE~$wxMsO#KSF`*HHF>k-#p|a)&y@rA zO+kS1#ecGsy5>SY-MV!2n}_@m7+~Hv2svp~VA!mpZQKl77J{0JT9Gp|h+=(%ghcM= z_z~*k*wkYMazy5uu}I_wjh)|HE!Wp$9UTIXK6lb42#_cGPC9y~!=Zp4!f()9C(?WL z))({ViZAIl*0u@c$!-WvEt8^Vj^^kFeg5Kh6PZR@&T3wY6#ACMGhL5>-k){#TU$PI z_DLqi!&E*>gSg;5HU?2i>F^I2e-smWvY0wgYv=JaM`WSpI;mZgEbY+Ops-ozN-=g+ z?`(M~%mNykgENQPKDq>^)m3qb!MHez47T+R?#n?!l#~%$LD0Nf-MFpyX;k9n0gF}t zH#U92I^q@cRzdA+>CKXOC-PQ~k*L6|Q$qm(f#z@o;EmI@K;pOzOp;jh@cAIKdSQ^& z2A%WvG?D*>?rwoCIVK&xqj`IzpJGO%(JRo4Z~E}Nzdt#93Q_`9LHJ%C#0oBYtjhK) z5U}x?jIU>IL}n^g2CSc#5gJj**CQ&8ctCy|1b5d7?NIN2-J2yt;;#!IV8ls?do;!X z5si%s>}EFt5W#e~2$2w4mfkduCNEPg&!MXh8B!pqdy~E-}cS*#$(ko{7qAGpPt;PMW!3l&pwRWD8?~#s-QC+3Eyu zt~Mpm^XcTnM|*_>xq1Q938kbBQ|k~69~olGw6Mlsd|EgU^x!~2M&CQU7H@$UQbq3?8!?aY%R$AaG59amqOp(0V6Dl{tEK7R|dC}a)zytHwumpdg zM!DcOKQh3Z+GEqL@K0Suaj64>-af+H`VPNVNBnxB8E1v~0?`{Fr4|gn;-EJYg?&GI zyWi|EEs2+&J=r|Z$S)F*m!WW-YT4%$SjFLz` zt^^tz9*+XuMkZIWCu-@mL|AsEU@Bp+ghvO%mFYHV5Q#U%{uFWSO?99)eIwfvlAxv8 zb!|5#FF1kfJG~H-2JQmkW`a0}T+SyDLt9>;dS;Im-62^S5|nsAIOue-g`TzEC+2Lu zc{ISl#KPp`9}Kb3<2MvxV2vA=x2#T%#U%M)s!nxU+$&oVuJDOA{PkN_hhztWuolZC z>sZzLc-{JCJTCq{CUVuP4b8`4QU{}*ify9bnkMX85N*w39r=@01#dQcWGN1L!9_y%e(lIiq6%P9T#>N#W z${u;lRW-c;lmk57!uryPE}~6I*J&iTOoqk%PA?3-pW+$xjdXl$Ub4=zE5(3XjM(#1 z&(~9H)D+MN#VfKH+2EK zwLUspgZKwRqY7SH2|vXg=mX)+BQn}3KXrbk@Ga9NE61lwQ>rg$qGe-}f#B%q>#Okn zqA@cWAp?A1owmaTIjku(AvY-?(a~RQgp?*;qu11b$nKfMMun`?d-9V_pSl4?_E^4A zJEHq*{YbQGDcn<_r28vOh0={Zro#;-NoSTf0rNYwW>ZlKy{s~`@6!~4LC0+(90^WO z#pXksvPtcE{oPZ{(RFJuibuF#jGV;ubEi-wntt5^C@PvTYC)X9EGH+=Atn-2hhBAU zYf-MW^g#lqt54>SQs$JuQFyNNn!22Zsa?3h!Ep*mNq{%hZn#-hxC7=wmqQ2f#8uQV z?6Ii0i-Kt|CTFHo&=Z6fMOPTbL4$cMR%i6lmsLpv)?d=*6)v1XZu`DZn-Gp8^+l8C zig4!8>DLvNw1R%ZQ}a=LAwMSgN4q{+x$?I#@JzjR5Kgstp(*+p3%5H=E7`arq3l5` z;~*wt%tb9>xTx|>jH;{w+?_D9t)oRNcfUQ=&!GoqDyxfHnGyuW+316 zQ%N=I$|!U*nH~z&G}6eUgx8zLFtDIh9b7h~WK5Mt;bmfi8-4{7d2b%cGJQ+vH27N? zLQWybP00J8<|1eZS0q(eq5E?b0>%2|W*9gaLii3#UfFu+Zf}D?>gbyd<_QhRB+3tY zW4WPn*PuEPC_}!u%i!B@>kxJK34=ZBMkfqhQNC??AJne~&?% zZH{@rPQU5pxS%OoVOByNdu;3qwT8C>AM_3*>FTd7gw_2S?6^P2u0?3X%te5@1MV&)h1rl|CKQd6hqVIi2YDrupw8%A2hJ@rhCGdV#Q*p(G!uEQQX8EFO? z{MSv#7+1vrXC`ZO#N5-7$$?2o#S3&XB(n?QlKGzs*)B6q_Lzbm(-E3Ea=nnTm<2Y229pf(Mr{f`ovRq_sjJ8YW^~a9>mB9aiDaL=QBlM{u|vr;3XPIT=G8B# zJ>=A<1p=KJD0W@TP~YGc{Dj(KG}%fn)1VYx_^77AbXebTTPMY)!>^!vO}&{Zm3tU^ksTIMR(}8orAN zB~gMD{KzDl;gVm?3M$c1rb7~jnx-2J;eQx=F-2qNtsHM^Y`GX6-26?+Edzm7fNtwuw-qa-GvH!ZlcYVPG*QiPn;b<`d%+QBLQ|WdzSARcO<7T(vi3%=8}95zuVygWyA)*5aba zmLk(4FGJTGYti9&32t3E)IJ{xq!4*rWT1tCEU~r_6H>HWoUWeCcQX>9F6g%pOyz^H z0v2BCjo(rDMX9R3nz+0!E$x&GNisv$3dg`#VfT}FZ`nr7`p9iFbEW75Qv=n>Myso# z-46ALO$Jd$VczVEqZwy4<8M0ia-Pwhh!&i^!jKK2Y1TJ`Qm}@>*s9n`u^1I@(~Rpn zcLOP$6JXJ|iTJJnQvtrvR3zPFCxoN|iR0aty#ioMW^iw>4>(8W@(DTVD{e=}bDF4; zd)bw6wcPqU9TYQzvt0U`nJyxa#GKI*WIB!}x!n6tT5bu<4aHxT4mtf2cnK!o?De4v z6T;I}S^_R|I>_PCGKw++ikBP$#dVO;+Ab`GFQ%0W`?&sw3ux3clUg+*73SJ#-R!g+ zBoO{4RA6+`p%lr;{u3+jTew^1=d;{!QVfUm4&!fvKDndKV^?PPC~v}4j!|*ir_r7O zK_{7?{hauo75zh|z|4u0>eq{VuZt`vC8uG+VH?gcvTm8`zhizuf!s$@Ys(A?7d$O0 z@>9BYCsV$e6m1npez!9EDR=kyqx6`Ngbw3@omsXQeOLt;J4c8?skWQJKUG1#f@1mJ z{3x2I^%!s6NSTQo-IJ^m(za&o)@^{O5@%&tm5!pvxwcgV^jKBg3w^W=`duy{arV)D zhiLUx*cEzhThD5Whn?x0DrmbSa;~*11~b=&3aC-~L&~U6Tdz<}wqY!K!k!?JE1^R6 z;Vl=9R=QlMP&DfAN&gXy9ccKbtx9kcQZvdX!h(G(6buR1pDK+fy}}UUu-2f zPI%F(o0gTLKDVoGTxKhhBTKmC=>pV3khm`!1s$G_IXa}w;L}jh9HfQg3SlIMdER5f zVyGS5%``-($}3m;oO#2w5yfGu%|3K+_~h(-9PMRm1wiWiEt7lM0W z2(M=ee(MT6ZEpG4gtYxPDkhpCtxijz%DOE
e?x36yu5%a-qc}Lfw!44pa`!Sk?3g@P$SOp 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

i}_@3D7~rE%HEghxU2b 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

q?D45zE3+%Vd%;>{c*{!&|6?WVDEIT_<6a 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

- {counters.map(([type, count]) => { + {counters.map(({ type, count, isUnbounded }) => { // CR 732.2a / CR 701.34a: an accepted counter-growth loop pumps this // counter unboundedly — render ∞ instead of the (still-finite) real count. - const isUnbounded = unboundedCounterTypes.includes(type); return ( - type === "loyalty" || count == null ? [] : [[type, count] as const], - ); const keywords = sortKeywords(obj.keywords); const colorsChanged = obj.color.length !== obj.base_color.length || @@ -1344,7 +1341,8 @@ function CardInfoPanel({ // CR 732.2a / CR 701.34a: the ∞ mark for this object. Same engine channel // PermanentCard's pill and ArtCropCard's badge read — every counter display mode // must agree, or the ∞ silently drops in one of them. - const unboundedCounterTypes = useUnboundedCounterTypes(obj.id); + const unboundedCounterRows = useUnboundedCounterRows(obj.id); + const counters = unboundedCounterRows.filter((row) => row.type !== "loyalty"); const deref = { objects, transientContinuousEffects }; const keywordSources = buildGrantedKeywordSources(attribution, obj.id, deref); const ptSources = buildPTSources(attribution, obj.id, deref); @@ -1512,11 +1510,10 @@ function CardInfoPanel({ {/* Counters */} {counters.length > 0 && (
- {counters.map(([type, count]) => { + {counters.map(({ type, count, isUnbounded }) => { // CR 732.2a / CR 701.34a: an accepted counter-growth loop pumps this counter // unboundedly — render ∞ instead of the (still-finite) real count, and tell the // tooltip so its summary can't contradict the row. - const isUnbounded = unboundedCounterTypes.includes(type); return ( diff --git a/client/src/components/card/__tests__/ArtCropCard.test.tsx b/client/src/components/card/__tests__/ArtCropCard.test.tsx index 4486d26690..061db77890 100644 --- a/client/src/components/card/__tests__/ArtCropCard.test.tsx +++ b/client/src/components/card/__tests__/ArtCropCard.test.tsx @@ -320,7 +320,7 @@ describe("ArtCropCard", () => { useGameStore.setState({ gameState: { objects: { [permanent.id]: permanent }, - derived: { unbounded_counters: { [permanent.id]: ["charge"] } }, + derived: { unbounded_counters: { [permanent.id]: [{ counter: "charge", count: 2 }] } }, } as never, }); @@ -356,7 +356,7 @@ describe("ArtCropCard", () => { useGameStore.setState({ gameState: { objects: { [permanent.id]: permanent }, - derived: { unbounded_counters: { [permanent.id]: ["charge"] } }, + derived: { unbounded_counters: { [permanent.id]: [{ counter: "charge", count: 2 }] } }, } as never, }); diff --git a/client/src/components/card/__tests__/CardPreview.test.tsx b/client/src/components/card/__tests__/CardPreview.test.tsx index 78acda7b5b..37c2e56101 100644 --- a/client/src/components/card/__tests__/CardPreview.test.tsx +++ b/client/src/components/card/__tests__/CardPreview.test.tsx @@ -581,7 +581,7 @@ describe("CardPreview blocked abilities", () => { // Matched pair: the ONLY difference between the two cases is the engine mark, so // it is the discriminator. describe("CardPreview unbounded counters", () => { - function inspectPentadPrism(unbounded: string[] | null) { + function inspectPentadPrism(unbounded: Array<{ counter: string; count: number }> | null) { const object = battlefieldObject({ id: 409, name: "Pentad Prism", @@ -595,7 +595,7 @@ describe("CardPreview unbounded counters", () => { } it("renders ∞ for a counter the engine marks as unbounded", () => { - const { container } = inspectPentadPrism(["charge"]); + const { container } = inspectPentadPrism([{ counter: "charge", count: 2 }]); expect(container.textContent).toContain("charge: ∞"); expect(container.textContent).not.toContain("charge: 2"); @@ -611,7 +611,7 @@ describe("CardPreview unbounded counters", () => { // LOW: the ∞ row and its TOOLTIP must agree — a badge saying ∞ over a tooltip // interpolating the finite count contradicts itself (mirrors ArtCropCard.test.tsx:353). it("the ∞ status row's tooltip agrees with the badge", () => { - const { container } = inspectPentadPrism(["charge"]); + const { container } = inspectPentadPrism([{ counter: "charge", count: 2 }]); // `GameplayTooltip` renders its lines through `createPortal(…, document.body)`, so the // summary is NOT inside `container` — query it via `screen`, exactly as the tooltip @@ -622,29 +622,30 @@ describe("CardPreview unbounded counters", () => { expect(screen.queryByText(/2 charge counters/i)).not.toBeInTheDocument(); }); - // KNOWN GAP (F2), not desired behaviour, and STILL OPEN: the ∞ counter targets are derived by - // `analysis::resource::grown_beneficial_counter_deltas` over the two frames - // `game::engine::drive_one_period_frames` produces, and its BEFORE frame is a clone of the LIVE - // state. A pair that grows 0 → 1 across the driven period is therefore registered while the live - // object carries none of that counter. Every display mode iterates `obj.counters`, so such a - // mark renders nowhere. The frontend must NOT synthesize a counter row the engine says does not - // exist; if the ∞ should be visible there, the ENGINE must decide it. + // REGRESSION (F2) — this test used to assert the GAP, and now asserts its fix. The ∞ counter + // targets are derived by `analysis::resource::grown_beneficial_counter_deltas` over the two + // frames `game::engine::drive_one_period_frames` produces, and its BEFORE frame is a clone of + // the LIVE state. A pair that grows 0 → 1 across the driven period is therefore registered + // while the live object carries none of that counter. While the channel published bare counter + // TYPES, every display mode iterated `obj.counters` and such a mark rendered NOWHERE — a real, + // accepted, registered ∞ that was invisible. // - // The derivation was renamed and widened by the ∞ axis-scoped-revocation change — the display - // channel and the batched-collapse δ stash now share ONE derivation instead of running a second - // `Generic`-only diff. That does not touch this gap's mechanism (the same frame diff against the - // same BEFORE clone), but it does enlarge the gap's domain from `Generic` counters to the whole - // beneficial partition (+1/+1, loyalty, defense). Comment repointed at the surviving symbol; the - // gap it describes is unchanged. - it("KNOWN GAP: a marked counter type the object does not carry renders nowhere (F2)", () => { - const { container } = inspectPentadPrism(["oil"]); + // The engine now publishes a self-sufficient ROW carrying the live count (`0` when absent), so + // the display renders it without synthesizing anything: the frontend still must NOT invent a + // counter row the engine did not publish, and it does not — the ENGINE decided this row exists. + // Pinned end-to-end on the engine side by + // `loop_counter_growth::plus_one_counter_growth_registers_a_target_the_bearer_does_not_yet_carry`. + // + // DISCRIMINATOR: `charge: 2` in the same frame is the paired positive — it proves the finite + // path still renders finitely, so this is not a component that started drawing ∞ for + // everything, and it makes the `oil: 0` negative non-vacuous. + it("renders a marked counter the object does not carry, with count 0 (F2 regression)", () => { + const { container } = inspectPentadPrism([{ counter: "oil", count: 0 }]); + expect(container.textContent).toContain("oil: ∞"); expect(container.textContent).toContain("charge: 2"); - // "nowhere" is asserted against `document.body`, not `container`: `GameplayTooltip` - // portals its summary lines out of the RTL container (GameplayTooltip.tsx:86-107), so - // a container-scoped negative could not see a tooltip that DID render the ∞. - expect(document.body.textContent).not.toContain("∞"); - expect(document.body.textContent).not.toContain("oil"); + // The ∞ must not be bought by showing a bogus finite count for a counter that is absent. + expect(container.textContent).not.toContain("oil: 0"); }); }); diff --git a/client/src/components/ui/LoyaltyBadge.tsx b/client/src/components/ui/LoyaltyBadge.tsx index b74b127f31..4348144570 100644 --- a/client/src/components/ui/LoyaltyBadge.tsx +++ b/client/src/components/ui/LoyaltyBadge.tsx @@ -7,12 +7,23 @@ type LoyaltyBadgeProps = { kind: "cost" | "total"; size?: "default" | "battlefield"; reinforcedTopRim?: boolean; + isUnbounded?: boolean; className?: string; style?: CSSProperties; }; -function loyaltyText(amount: number, kind: LoyaltyBadgeProps["kind"]): string { - if (kind === "total") return String(amount); +function loyaltyText( + amount: number, + kind: LoyaltyBadgeProps["kind"], + isUnbounded: boolean, +): string { + // CR 306.5c: a planeswalker's loyalty IS its loyalty-counter count, so an accepted + // counter-growth loop on that counter makes the TOTAL unbounded. + // CR 606.4: a loyalty ABILITY COST is a number of loyalty counters to put on or + // remove, shown by the ability's loyalty symbol — a different game fact from the + // total, and never unbounded. The `kind === "total"` guard makes an `∞` cost badge + // structurally unrepresentable, whatever a caller passes. + if (kind === "total") return isUnbounded ? "∞" : String(amount); if (amount > 0) return `+${amount}`; return String(amount).replace("-", "−"); } @@ -35,10 +46,14 @@ export function LoyaltyBadge({ kind, size = "default", reinforcedTopRim = false, + isUnbounded = false, className, style, }: LoyaltyBadgeProps) { - const text = loyaltyText(amount, kind); + // `aria-label={text}` below, so the accessible name becomes "∞" automatically. + // `data-loyalty-value={amount}` deliberately stays the real number: the DOM attribute + // stays truthful and existing selectors keep working. + const text = loyaltyText(amount, kind, isUnbounded); const iconClass = loyaltyShapeClass(amount, kind); return ( diff --git a/client/src/components/ui/__tests__/LoyaltyBadge.test.tsx b/client/src/components/ui/__tests__/LoyaltyBadge.test.tsx index 10a414d9a5..ed28b7e669 100644 --- a/client/src/components/ui/__tests__/LoyaltyBadge.test.tsx +++ b/client/src/components/ui/__tests__/LoyaltyBadge.test.tsx @@ -63,4 +63,42 @@ describe("LoyaltyBadge", () => { "drop-shadow(-1px -1px 0 rgba(255,255,255,0.8)) drop-shadow(0 -1.25px 0 #e2e8f0) drop-shadow(1px 1px 1px rgba(15,23,42,0.98))", ); }); + + // CR 306.5c: a planeswalker's loyalty IS the number of loyalty counters on it, so an accepted + // counter-growth loop on that counter makes the TOTAL unbounded and the badge renders ∞. + it("renders ∞ instead of the finite amount for an unbounded loyalty TOTAL", () => { + render(); + + expect(screen.getByText("∞")).toBeInTheDocument(); + expect(screen.queryByText("4")).not.toBeInTheDocument(); + // Accessibility is preserved, not simplified away: `aria-label` follows the text. + expect(screen.getByRole("img", { name: "∞" })).toBeInTheDocument(); + // …while the DOM attribute stays truthful, so existing selectors keep working. + expect(screen.getByRole("img", { name: "∞" })).toHaveAttribute("data-loyalty-value", "4"); + }); + + it("renders the finite total when the same badge is not marked unbounded (matched pair)", () => { + render(); + + expect(screen.getByText("4")).toBeInTheDocument(); + expect(screen.queryByText("∞")).not.toBeInTheDocument(); + }); + + // CR 606.4: a loyalty ABILITY COST is a number of loyalty counters to put on or remove, shown + // by the ability's loyalty symbol — a different game fact from the total, and never unbounded. + // Rendering ∞ on an activation cost would be a rules-visible bug. This is the revert-probe for + // the `kind === "total"` guard: delete it and this test reds. + it("NEVER renders ∞ on a loyalty COST badge, even when isUnbounded is passed", () => { + render(); + + expect(screen.getByText("+4")).toBeInTheDocument(); + expect(screen.queryByText("∞")).not.toBeInTheDocument(); + }); + + it("NEVER renders ∞ on a NEGATIVE loyalty COST badge either", () => { + render(); + + expect(screen.getByText("−4")).toBeInTheDocument(); + expect(screen.queryByText("∞")).not.toBeInTheDocument(); + }); }); diff --git a/client/src/hooks/useUnboundedCounterRows.ts b/client/src/hooks/useUnboundedCounterRows.ts new file mode 100644 index 0000000000..434358b91c --- /dev/null +++ b/client/src/hooks/useUnboundedCounterRows.ts @@ -0,0 +1,83 @@ +import { useMemo } from "react"; +import type { ObjectId } from "../adapter/types.ts"; +import { useGameStore } from "../stores/gameStore.ts"; + +// CR 732.2a / CR 701.34a: stable empty refs so a permanent with no unbounded counter +// (the dominant case) never re-renders on identity churn. +const EMPTY_UNBOUNDED_ROWS: ReadonlyArray<{ counter: string; count: number }> = []; +const EMPTY_ROWS: CounterRow[] = []; + +/** + * One renderable counter pill. `type` matches the object's `counters` map key + * (e.g. "charge", "P1P1"); `count` is the live count; `isUnbounded` is the + * render-time distinction, never an engine-published boolean. + */ +export interface CounterRow { + type: string; + count: number; + isUnbounded: boolean; +} + +/** + * CR 732.2a / CR 701.34a: every counter pill for this object, `∞`-marked ones first. + * + * The single union point for "the engine's `∞` counter rows" and "the object's own + * counters", so the four already-drifting `Object.entries(obj.counters).filter(...)` + * spellings do not become five. Engine rows come from + * `DerivedViews::unbounded_counters` and carry the ENGINE's count; every remaining + * `obj.counters` entry follows as a finite row. + * + * WHY THE ENGINE'S COUNT AND NOT `obj.counters[type]`: an engine row may legitimately + * have no entry in the object's map at all. A pair an accepted loop pumps from `0 -> 1` + * is registered while the live object carries none of that counter, so the row's count + * is `0` and there is nothing to join back to. Re-deriving a count here would also be + * the frontend inferring game state, which this codebase forbids. + * + * ORDER: engine rows first, then the object-map remainder — so a permanent with both + * marked and unmarked counters renders its `∞` pills ahead of its finite ones, where it + * previously rendered in `obj.counters` insertion order. Deliberate; match assertions by + * pill content, not by index. + * + * ZUSTAND v5 HAZARD, and why this shape is not stylistic: there is no equality argument + * and no `shallow` default in v5 — the selector result IS React's `getSnapshot` return, + * compared with `Object.is`. A selector that ALLOCATES therefore returns a fresh + * reference on every store read, fails React's getSnapshot cache check, and produces + * "The result of getSnapshot should be cached to avoid an infinite loop" plus a render + * loop. `tsc` cannot see it. So both subscriptions below return store-owned refs or the + * module constant, and the one allocation lives in a `useMemo` OUTSIDE them — the house + * pattern from `useCastableZoneObjects.ts`. + * + * Subscribed today by exactly three render sites: `board/PermanentCard`, + * `card/ArtCropCard`, and `card/CardPreview`'s `CardInfoPanel`. Two counter render + * sites remain unsubscribed, each with a measured blocker: + * - FU-A `controls/AttackTargetPicker` (`StackLabel`) — a chip stands for N grouped + * objects and the mark is per object id, so it needs an `.every()` intersection + * threaded through `groupByName`/`AttackerStack` (mirroring `isUnboundedPile`), + * not a representative lookup, or it renders a FALSE `∞`. + * - FU-B `hud/DialogAttachmentCard` — no component test file exists for it. + * Do not claim this hook covers every counter render site until both land. + */ +export function useUnboundedCounterRows(objectId: ObjectId): CounterRow[] { + // Both selectors return store-owned refs / the module constant — never an allocation. + const engineRows = useGameStore( + (s) => s.gameState?.derived?.unbounded_counters?.[String(objectId)] ?? EMPTY_UNBOUNDED_ROWS, + ); + const objectCounters = useGameStore((s) => s.gameState?.objects?.[String(objectId)]?.counters); + + return useMemo(() => { + if (engineRows.length === 0) { + if (!objectCounters) return EMPTY_ROWS; + const finiteOnly = Object.entries(objectCounters) + .filter((entry): entry is [string, number] => entry[1] != null) + .map(([type, count]) => ({ type, count, isUnbounded: false })); + return finiteOnly.length === 0 ? EMPTY_ROWS : finiteOnly; + } + const marked = new Set(engineRows.map((r) => r.counter)); + return [ + ...engineRows.map((r) => ({ type: r.counter, count: r.count, isUnbounded: true })), + ...Object.entries(objectCounters ?? {}) + .filter((entry): entry is [string, number] => entry[1] != null && !marked.has(entry[0])) + .map(([type, count]) => ({ type, count, isUnbounded: false })), + ]; + }, [engineRows, objectCounters]); +} diff --git a/client/src/hooks/useUnboundedCounterTypes.ts b/client/src/hooks/useUnboundedCounterTypes.ts deleted file mode 100644 index 35f79fa38f..0000000000 --- a/client/src/hooks/useUnboundedCounterTypes.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { ObjectId } from "../adapter/types.ts"; -import { useGameStore } from "../stores/gameStore.ts"; - -// CR 732.2a / CR 701.34a: stable empty ref so a permanent with no unbounded counter -// (the dominant case) never re-renders on identity churn. -const EMPTY_UNBOUNDED_COUNTERS: string[] = []; - -/** - * CR 732.2a / CR 701.34a: the counter-type keys the engine marks as `∞` for this - * object (`DerivedViews::unbounded_counters`). Keys match the object's `counters` - * map (e.g. "charge"). DISPLAY-only — the object's real counter count is - * deliberately left finite (`game/engine.rs::materialize_object_growth_shortcut`), - * so a site that reads `obj.counters` alone shows a stale pre-shortcut number. - * - * Subscribed today by exactly three render sites: `board/PermanentCard`, - * `card/ArtCropCard`, and `card/CardPreview`'s `CardInfoPanel`. Two counter render - * sites remain unsubscribed, each with a measured blocker: - * - FU-A `controls/AttackTargetPicker` (`StackLabel`) — a chip stands for N grouped - * objects and the mark is per object id, so it needs an `.every()` intersection - * threaded through `groupByName`/`AttackerStack` (mirroring `isUnboundedPile`), - * not a representative lookup, or it renders a FALSE `∞`. - * - FU-B `hud/DialogAttachmentCard` — no component test file exists for it. - * Do not claim this hook covers every counter render site until both land. - */ -export function useUnboundedCounterTypes(objectId: ObjectId): string[] { - return useGameStore( - (s) => s.gameState?.derived?.unbounded_counters?.[String(objectId)] ?? EMPTY_UNBOUNDED_COUNTERS, - ); -} diff --git a/client/src/test/fixtures/unbounded-counter-wire.json b/client/src/test/fixtures/unbounded-counter-wire.json index 354d100e5c..ada5ae66b5 100644 --- a/client/src/test/fixtures/unbounded-counter-wire.json +++ b/client/src/test/fixtures/unbounded-counter-wire.json @@ -1,7 +1,10 @@ { "unbounded_counters": { "405": [ - "charge" + { + "count": 4, + "counter": "charge" + } ] }, "unbounded_families": [ diff --git a/client/src/viewmodel/__tests__/cardProps.test.ts b/client/src/viewmodel/__tests__/cardProps.test.ts index 07256a8176..2c5ff4dcb2 100644 --- a/client/src/viewmodel/__tests__/cardProps.test.ts +++ b/client/src/viewmodel/__tests__/cardProps.test.ts @@ -190,7 +190,8 @@ describe("toRoman", () => { // LOW-4 (CR 732.2a / CR 701.34a): while an accepted counter-growth loop pumps a counter, the // badge renders `∞` — the tooltip summary must say "unbounded" and NOT leak the still-finite // count. `isUnbounded` is the display-only flag threaded from the engine's `unbounded_counters` -// membership set (never computed in the frontend). +// ROW list (never computed in the frontend) — each row names an (object, counter) pair and +// carries the live count, which is `0` when the loop pumps a counter the object does not carry. describe("formatCounterTooltip — unbounded summary", () => { it("says ∞ and hides the finite count when unbounded (fallback, no translator)", () => { const summary = formatCounterTooltip("charge", 4, undefined, true); diff --git a/client/src/viewmodel/__tests__/unboundedWireSeam.test.ts b/client/src/viewmodel/__tests__/unboundedWireSeam.test.ts index 429535ee20..e091881745 100644 --- a/client/src/viewmodel/__tests__/unboundedWireSeam.test.ts +++ b/client/src/viewmodel/__tests__/unboundedWireSeam.test.ts @@ -28,7 +28,7 @@ import type { UnboundedFamily, } from "../../adapter/types"; import { familyOf, UNBOUNDED_FAMILY_FOR_TEST } from "../../components/hud/HudBadges"; -import { useUnboundedCounterTypes } from "../../hooks/useUnboundedCounterTypes"; +import { useUnboundedCounterRows } from "../../hooks/useUnboundedCounterRows"; import { buildGameObject } from "../../test/factories/gameObjectFactory"; import { buildGameState } from "../../test/factories/gameStateFactory"; import counterWire from "../../test/fixtures/unbounded-counter-wire.json"; @@ -54,7 +54,8 @@ describe("unbounded ∞ wire seam (engine-emitted goldens)", () => { // (2) reach-guard + the two counter seam facts: the map key is a JSON STRING, and // `CounterType` serializes FLAT ("charge", not {"Generic":"charge"}). A regressed Serialize // would silently blank every ∞ pill. - expect(counterWire.unbounded_counters).toEqual({ "405": ["charge"] }); + // The value is a ROW list carrying the engine's live count, not a bare type list. + expect(counterWire.unbounded_counters).toEqual({ "405": [{ counter: "charge", count: 4 }] }); // (3) omit-when-empty, engine-attested in BOTH directions. expect("unbounded_pile" in counterWire).toBe(false); expect("unbounded_counters" in tokenWire).toBe(false); @@ -191,13 +192,36 @@ describe("unbounded ∞ wire seam (engine-emitted goldens)", () => { ); }); - it("feeds the real useUnboundedCounterTypes hook from the engine wire", () => { + it("feeds the real useUnboundedCounterRows hook from the engine wire", () => { setGameStoreForTest({ gameState: buildGameState({ derived: counterWire as unknown as DerivedViews }), }); - // (10) paired POSITIVE through the real zustand selector. - expect(renderHook(() => useUnboundedCounterTypes(405)).result.current).toEqual(["charge"]); + // (10) paired POSITIVE through the real zustand selector — the engine's count is carried + // through to the row, not re-derived from the object (which is absent from this state). + expect(renderHook(() => useUnboundedCounterRows(405)).result.current).toEqual([ + { type: "charge", count: 4, isUnbounded: true }, + ]); // (11) paired NEGATIVE: 404 is on the same battlefield and carries no ∞ mark. - expect(renderHook(() => useUnboundedCounterTypes(404)).result.current).toEqual([]); + expect(renderHook(() => useUnboundedCounterRows(404)).result.current).toEqual([]); + }); + + // The zustand v5 hazard the hook's shape exists to avoid: v5 has no shallow default, so the + // selector result IS React's `getSnapshot` return, compared with `Object.is`. An allocating + // selector returns a fresh ref on every store read and trips the getSnapshot cache. `tsc` + // cannot see it; this asserts the referential stability directly. + it("returns a referentially STABLE array across re-renders (zustand v5 getSnapshot)", () => { + setGameStoreForTest({ + gameState: buildGameState({ derived: counterWire as unknown as DerivedViews }), + }); + const marked = renderHook(() => useUnboundedCounterRows(405)); + const firstMarked = marked.result.current; + marked.rerender(); + expect(marked.result.current).toBe(firstMarked); + + // The dominant no-∞ case must be stable too — that is what the module constant is for. + const bare = renderHook(() => useUnboundedCounterRows(404)); + const firstBare = bare.result.current; + bare.rerender(); + expect(bare.result.current).toBe(firstBare); }); }); diff --git a/crates/engine/src/game/derived_views.rs b/crates/engine/src/game/derived_views.rs index ad574ff930..ac5f2d93e5 100644 --- a/crates/engine/src/game/derived_views.rs +++ b/crates/engine/src/game/derived_views.rs @@ -338,8 +338,8 @@ impl FamilyCollapseState { /// `∞→N` on the badge and a plain `∞` on its own token group and counter pill in the SAME frame. /// Witnessed rather than asserted: /// `kilo_live_offer_from_real_dump::kilo_accept_marks_pentad_charge_as_unbounded_display_target` -/// pins `unbounded_counters[Pentad] == [charge]` — a bare `∞` pill — in the exact frame whose -/// golden family state is `Scheduled(Committed)`. +/// pins `unbounded_counters[Pentad]` as a single `charge` row — a bare `∞` pill — in the exact +/// frame whose golden family state is `Scheduled(Committed)`. /// /// THE ANSWER, not a disclosure: this is not the `Mana(_)` false-promise case. The collapse really /// IS scheduled for that axis, so the quiet surfaces under-announce; none of them promises a bound @@ -371,6 +371,37 @@ pub struct UnboundedFamilyView { pub state: FamilyCollapseState, } +/// One RENDERABLE `∞` counter row: an accepted counter-growth loop pumps `counter` on the +/// object this row is keyed by, and `count` is that object's LIVE count of it. +/// +/// CR 122.1: a counter is a marker ON an object, so a row names an (object, counter) pair, not a +/// stored quantity. The `unwrap_or(0)` at the projection site is the PROJECTOR/PRODUCER +/// convention, not a rule: it mirrors `analysis::resource::grown_beneficial_counter_deltas`, +/// which reads the producing side with the same `unwrap_or(0)`, so both ends share one +/// definition of "absent". +/// +/// WHY THE COUNT IS IN THE ROW rather than left to the display layer: the pair is derived by +/// diffing a SIMULATED one-period frame against a clone of the LIVE state +/// (`game::engine::drive_one_period_frames`), so a pair growing `0 -> 1` across that period is +/// registered while the live object carries NONE of that counter. Publishing only the type left +/// such a pair unrenderable — the display had no row to hang `∞` on, and inventing one from +/// `objects[..].counters` would be the frontend deriving game state. Dropping the pair instead +/// would trade a display over-KEEP for an over-DROP, which this subsystem's stated polarity +/// forbids (see [`UnboundedFamilyView`]): it may leave an `∞` standing one boundary too long, +/// never hide a real one. +/// +/// DISPLAY-only — never written back to `GameState`. Carries data only; `isUnbounded` stays a +/// render-time distinction and never becomes an engine-published boolean, per this file's +/// NO-SURFACE-IS-FILTERED invariant ("no row carries a flag"). +/// +/// Derive list matches its siblings [`UnboundedResourceView`] / [`UnboundedFamilyView`] exactly. +/// `Eq` is not optional: [`DerivedViews`] itself derives `Eq`. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct UnboundedCounterView { + pub counter: CounterType, + pub count: u32, +} + /// The display family a pumped [`ResourceAxis`] groups into. Exhaustive by design (no wildcard) — /// a new `ResourceAxis` variant must make a deliberate grouping choice here. Payload-independent /// by construction: only the variant tag decides the family, exactly as the client's @@ -651,8 +682,18 @@ pub struct DerivedViews { /// ObjectId; DISPLAY-only (the real counter count is unchanged). Public board state — no /// viewer filtering. Empty (and omitted) when no counter-growth loop is active — the /// dominant case. + /// + /// SHAPE: each entry is a self-sufficient [`UnboundedCounterView`] ROW, not a bare counter + /// type. The row carries the object's LIVE count, which is `0` when the loop pumps a counter + /// the object does not yet carry — a real row, not a marker needing a host row that does not + /// exist. See [`UnboundedCounterView`] for why the count is engine-supplied. + /// + /// CR 306.5c: a `Loyalty` row states that this planeswalker's loyalty TOTAL is unbounded + /// (loyalty IS its loyalty-counter count), so it drives the loyalty total badge rather than a + /// pill. Loyalty ABILITY COST badges are never unbounded — CR 606.4, an activation cost is a + /// number of loyalty counters to pay, a different game fact from the total. #[serde(default, skip_serializing_if = "HashMap::is_empty")] - pub unbounded_counters: HashMap>, + pub unbounded_counters: HashMap>, } /// Serialize-only wrapper: the WASM getter passes `&GameState` by reference @@ -1339,14 +1380,38 @@ pub fn derive_views(state: &GameState, viewer: Option) -> DerivedViews // Unconditional while a collapse is merely scheduled — see the CR 732 timing block above. for targets in state.unbounded_counter_targets.values() { for (id, ct) in targets { + // CR 110.1 + CR 122.2: a counter is a marker ON a permanent, and counters cease to + // exist on a zone change — an off-battlefield bearer has no row. if !state.battlefield.contains(id) { continue; } + // CR 122.1: a counter is a marker ON an object, so a row names an (object, counter) + // pair, not a stored quantity. The `unwrap_or(0)` is the PROJECTOR/PRODUCER + // convention, not a rule: it mirrors `analysis::resource:: + // grown_beneficial_counter_deltas`, so both sides share one definition of "absent". + // + // WHY A `count: 0` ROW EXISTS: the pair is derived by diffing a SIMULATED one-period + // frame against a clone of the LIVE state (`game::engine::drive_one_period_frames`), + // so a pair growing 0 -> 1 across that period is registered while the live object + // carries none. Publishing only the type left such a pair unrenderable. Dropping it + // instead would trade a display over-KEEP for an over-DROP, which this subsystem's + // stated polarity forbids. Row existence is decided by the ∞ stores and live + // battlefield membership — never by `objects[..].counters`; see the + // NO-SURFACE-IS-FILTERED invariant (stated in this file and mirrored above + // `GameState::scheduled_collapse_axes`). + let count = state + .objects + .get(id) + .and_then(|o| o.counters.get(ct).copied()) + .unwrap_or(0); views .unbounded_counters .entry(*id) .or_default() - .push(ct.clone()); + .push(UnboundedCounterView { + counter: ct.clone(), + count, + }); } } diff --git a/crates/engine/src/types/game_state.rs b/crates/engine/src/types/game_state.rs index d7eebf3b52..1f92f4a861 100644 --- a/crates/engine/src/types/game_state.rs +++ b/crates/engine/src/types/game_state.rs @@ -25273,7 +25273,14 @@ mod tests { crate::game::derived_views::derive_views(&state, Some(PlayerId(0))).unbounded_counters; assert_eq!( pills.get(&bearer), - Some(&vec![CounterType::Plus1Plus1]), + Some(&vec![crate::game::derived_views::UnboundedCounterView { + counter: CounterType::Plus1Plus1, + count: state + .objects + .get(&bearer) + .and_then(|o| o.counters.get(&CounterType::Plus1Plus1).copied()) + .unwrap_or(0), + }]), "ARM2 pill projection: the surviving pair really reaches `unbounded_counters` — the \ store half alone would not prove the display over-keep is visible, got {pills:?}" ); diff --git a/crates/engine/tests/integration/combo_infinite_pile.rs b/crates/engine/tests/integration/combo_infinite_pile.rs index cca8c2a689..4c7c22deee 100644 --- a/crates/engine/tests/integration/combo_infinite_pile.rs +++ b/crates/engine/tests/integration/combo_infinite_pile.rs @@ -246,7 +246,8 @@ fn real_4p_object_growth_accept_writes_infinite_pile() { // able to regenerate the client goldens with `UPDATE_WIRE_GOLDEN=1`, or the client-side half of // that probe (RP-1b, RP-2) is unreachable. An assert panic aborts the test. // - // DETERMINISM: `unbounded_counters` is a std `HashMap` (derived_views.rs), but + // DETERMINISM: `unbounded_counters` is a std `HashMap>` + // (derived_views.rs) — the VALUE is a row list, not a bare counter-type list — but // `serde_json::Map` is BTreeMap-backed (serde_json has no `preserve_order` feature in this // workspace — see Cargo.lock), so `to_value` re-sorts every map key. Measured byte-identical // across independent test processes. No normalization needed. diff --git a/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs b/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs index 2d2e1e1a9e..f9f1ac63e3 100644 --- a/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs +++ b/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs @@ -483,7 +483,7 @@ fn drive_to_collapse_boundary(state: &mut GameState) { /// (display-only: the real count is untouched) HOLD BOTH WAYS. #[test] fn kilo_accept_marks_pentad_charge_as_unbounded_display_target() { - use engine::game::derived_views::{derive_views, DerivedViews}; + use engine::game::derived_views::{derive_views, DerivedViews, UnboundedCounterView}; use engine::types::counter::CounterType; let mut state = load_migrated_dump(); @@ -587,7 +587,8 @@ fn kilo_accept_marks_pentad_charge_as_unbounded_display_target() { // Where a pre-WRITE frame must be asserted, CAPTURE it into a local above and assert the local // below (see combo_infinite_pile.rs's declined-wire emitter). // - // DETERMINISM: `unbounded_counters` is a std `HashMap` (derived_views.rs), but + // DETERMINISM: `unbounded_counters` is a std `HashMap>` + // (derived_views.rs) — the VALUE is a row list, not a bare counter-type list — but // `serde_json::Map` is BTreeMap-backed (serde_json has no `preserve_order` feature in this // workspace — see Cargo.lock), so `to_value` re-sorts every map key. Measured byte-identical // across independent test processes. No normalization needed. @@ -620,10 +621,26 @@ fn kilo_accept_marks_pentad_charge_as_unbounded_display_target() { .expect("write the wire golden"); } + // The row's count is READ FROM THE DUMP, never invented — this frame's Pentad really carries + // this many charge counters, and the committed wire golden compared below carries that literal. + let pentad_charge = state + .objects + .get(&PENTAD) + .and_then(|o| o.counters.get(&charge).copied()) + .unwrap_or(0); + assert!( + pentad_charge >= 1, + "reach-guard: this real-dump frame's Pentad must actually carry charge counters, so the \ + row's `count` below is a NONZERO live value and not vacuously 0; got {pentad_charge}" + ); assert_eq!( views.unbounded_counters.get(&PENTAD), - Some(&vec![charge.clone()]), - "the ∞ charge pill stays projected while the collapse is merely SCHEDULED" + Some(&vec![UnboundedCounterView { + counter: charge.clone(), + count: pentad_charge, + }]), + "the ∞ charge pill stays projected while the collapse is merely SCHEDULED, and it carries \ + the LIVE count so the display never has to join back to `objects[..].counters`" ); assert!( @@ -664,8 +681,11 @@ fn kilo_accept_marks_pentad_charge_as_unbounded_display_target() { let round: DerivedViews = serde_json::from_str(&json).expect("derived views round-trip"); assert_eq!( round.unbounded_counters.get(&PENTAD), - Some(&vec![charge]), - "the ∞ counter channel survives a serde round-trip" + Some(&vec![UnboundedCounterView { + counter: charge, + count: pentad_charge, + }]), + "the ∞ counter channel survives a serde round-trip, count included" ); let empty_json = serde_json::to_string(&DerivedViews::default()).expect("empty derived views serialize"); @@ -756,7 +776,7 @@ fn departed_counter_target_drops_its_pill_but_keeps_its_row_and_store_entry() { before .unbounded_counters .get(&PENTAD) - .is_some_and(|cts| cts.contains(&charge)), + .is_some_and(|rows| rows.iter().any(|r| r.counter == charge)), "reach-guard: the pill is on the wire before the departure" ); let row_axes_before: Vec<_> = before.unbounded_resources.iter().map(|r| r.axis).collect(); diff --git a/crates/engine/tests/integration/loop_counter_growth.rs b/crates/engine/tests/integration/loop_counter_growth.rs index ce2849649c..343b5a8038 100644 --- a/crates/engine/tests/integration/loop_counter_growth.rs +++ b/crates/engine/tests/integration/loop_counter_growth.rs @@ -17,6 +17,7 @@ //! prompt. use engine::analysis::resource::{CounterClass, ResourceAxis}; +use engine::game::derived_views::UnboundedCounterView; use engine::game::scenario::{GameRunner, GameScenario}; use engine::types::ability::AbilityKind; use engine::types::actions::GameAction; @@ -232,39 +233,24 @@ fn plus1_of(runner: &GameRunner, id: ObjectId) -> u32 { .unwrap_or(0) } -/// THE `∞` DISPLAY CHANNEL REGISTERS A `+1/+1` GROWTH (CR 122.1 + CR 732.2a). -/// -/// WHY THIS FIXTURE HAD TO BE BUILT rather than reused: a census of every test touching -/// `unbounded_counter_targets` found that all of them grow `charge` — a `Generic` counter, which -/// registers IDENTICALLY under the old cover partition and the current beneficial one. So the -/// whole suite passed byte-for-byte with or without the display/collapse consolidation, and no -/// existing test could distinguish the change from its absence. -/// -/// REACHABILITY, measured rather than assumed — a `+1/+1` loop is detected by a DIFFERENT -/// disjunct than a charge loop, and it matters: `CounterType::Plus1Plus1 -/// ::is_monotone_loop_resource()` is `true`, so `project_out_resources` strips it and the frames -/// read EQUAL under `loop_states_equal_modulo_resources`. (A charge loop cannot do that — -/// `Generic` is preserved, which is exactly why `loop_states_cover_modulo_counter_growth` exists.) -/// So this loop arrives through the base equality disjunct, is offered, and its `+1/+1` growth is -/// materialized at the boundary by `counter_is_beneficial_materializable` — while the DISPLAY -/// registration, when it was partitioned by the `Generic`-only ω-cover rule, saw nothing. That -/// gap is the defect: a real loop whose collapse lands and whose pills never render `∞`. +/// Drives the `PLUS1_TOKEN_ENGINE` rider to a DECLARED, not-yet-accepted CR 732.2a offer. /// -/// THE REVERT-PROBE (the evidence, run and recorded): restore the display registration to the -/// `Generic`-only derivation — i.e. re-point it at a `grown_generic_counter_targets`-shaped -/// filter instead of projecting `growths` — and assertion (3) flips to an EMPTY target set. Every -/// other assertion here holds under that revert, which is what makes (3) the discriminator rather -/// than a bystander. +/// A pure extraction of what was this file's single `+1/+1` fixture: setup, the activation +/// drive, both reach-guards, and `DeclareShortcut`. Two tests share it so the matched pair +/// below differs in exactly ONE line (the counter clear) — one authority for a 100-line +/// drive, because two copies drift. /// -/// DIVISION OF LABOUR, stated so neither half is overread: this fixture is DERIVED state (a -/// scenario-built loop), so it proves the registration covers the `+1/+1` class end-to-end -/// through a real offer and accept. It does NOT carry production-dump provenance; that burden is -/// `kilo_live_offer_from_real_dump`'s, on a real 4p dump. -#[test] -fn plus_one_counter_growth_registers_its_infinity_display_target() { +/// THE WINDOW THIS RETURNS IN IS LOAD-BEARING. CR 732.2b: the declaration fans the offer out +/// to each other player in APNAP order, and CR 732.2c: the shortcut is taken only once the +/// LAST of them accepts. So at the returned instant the shortcut is DECLARED and OFFERED and +/// nothing has been materialized — which is the only window in which a board edit still +/// reaches the accept-time re-derivation. The `RespondToShortcut` assert pins that: with a +/// single living opponent the fan-out lands here, but a future one-opponent-less shape +/// (a conceded seat, a solo proposer) would take CR 732.2c's "nobody else to poll" branch +/// and materialize AT declaration — silently degrading the cleared test below from a `0 -> 1` +/// test into an `N -> N+1` test that still passes. The assert makes that loud. +fn drive_plus1_token_engine_to_declared_offer() -> (GameRunner, ObjectId) { use engine::analysis::decision_template::IterationCount; - use engine::analysis::loop_check::ShortcutResponse; - use engine::game::derived_views::derive_views; let mut scenario = GameScenario::new_n_player(2, 7); scenario.at_phase(Phase::PreCombatMain); @@ -380,6 +366,58 @@ fn plus_one_counter_growth_registers_its_infinity_display_target() { template: None, }) .expect("P0 (proposer) declares the +1/+1 growth shortcut"); + + // (RG-0) The offer must be PENDING on a living opponent's response, not already taken. + // See this helper's doc: this is what pins "materialization happens at accept, not at + // declaration" (CR 732.2b fan-out reached, CR 732.2c completion not yet reached). + assert!( + matches!( + runner.state().waiting_for, + WaitingFor::RespondToShortcut { .. } + ), + "the declared shortcut must be pending a living opponent's response (CR 732.2b), so \ + nothing is materialized yet (CR 732.2c); got {:?}", + runner.state().waiting_for + ); + + (runner, rider) +} + +/// THE `∞` DISPLAY CHANNEL REGISTERS A `+1/+1` GROWTH (CR 122.1 + CR 732.2a). +/// +/// WHY THIS FIXTURE HAD TO BE BUILT rather than reused: a census of every test touching +/// `unbounded_counter_targets` found that all of them grow `charge` — a `Generic` counter, which +/// registers IDENTICALLY under the old cover partition and the current beneficial one. So the +/// whole suite passed byte-for-byte with or without the display/collapse consolidation, and no +/// existing test could distinguish the change from its absence. +/// +/// REACHABILITY, measured rather than assumed — a `+1/+1` loop is detected by a DIFFERENT +/// disjunct than a charge loop, and it matters: `CounterType::Plus1Plus1 +/// ::is_monotone_loop_resource()` is `true`, so `project_out_resources` strips it and the frames +/// read EQUAL under `loop_states_equal_modulo_resources`. (A charge loop cannot do that — +/// `Generic` is preserved, which is exactly why `loop_states_cover_modulo_counter_growth` exists.) +/// So this loop arrives through the base equality disjunct, is offered, and its `+1/+1` growth is +/// materialized at the boundary by `counter_is_beneficial_materializable` — while the DISPLAY +/// registration, when it was partitioned by the `Generic`-only ω-cover rule, saw nothing. That +/// gap is the defect: a real loop whose collapse lands and whose pills never render `∞`. +/// +/// THE REVERT-PROBE (the evidence, run and recorded): restore the display registration to the +/// `Generic`-only derivation — i.e. re-point it at a `grown_generic_counter_targets`-shaped +/// filter instead of projecting `growths` — and assertion (3) flips to an EMPTY target set. Every +/// other assertion here holds under that revert, which is what makes (3) the discriminator rather +/// than a bystander. +/// +/// DIVISION OF LABOUR, stated so neither half is overread: this fixture is DERIVED state (a +/// scenario-built loop), so it proves the registration covers the `+1/+1` class end-to-end +/// through a real offer and accept. It does NOT carry production-dump provenance; that burden is +/// `kilo_live_offer_from_real_dump`'s, on a real 4p dump. +#[test] +fn plus_one_counter_growth_registers_its_infinity_display_target() { + use engine::analysis::loop_check::ShortcutResponse; + use engine::game::derived_views::derive_views; + + let (mut runner, rider) = drive_plus1_token_engine_to_declared_offer(); + while matches!( runner.state().waiting_for, WaitingFor::RespondToShortcut { .. } @@ -407,13 +445,174 @@ fn plus_one_counter_growth_registers_its_infinity_display_target() { // (4) …and it reaches the WIRE as a pill, which is the user-visible half of (3). Asserted // separately because (3) could hold while the projection filtered it back out. + // + // (A-3) THE MATCHED POSITIVE for the cleared sibling below. The row carries this object's + // LIVE count, and the helper's `grown >= 1` reach-guard makes that count NONZERO here — so a + // projector that hardcoded `count: 0` (the way to make the sibling's A-1 pass vacuously) reds + // exactly here. The pair is across two tests because a SelfRef-only pump + // ("…on this creature") registers exactly one object, so a zero-count row and a nonzero-count + // row cannot coexist in one frame. + let live = plus1_of(&runner, rider); let views = derive_views(runner.state(), None); assert!( - views - .unbounded_counters - .get(&rider) - .is_some_and(|cts| cts.contains(&CounterType::Plus1Plus1)), - "(4) the +1/+1 ∞ pill must reach the wire, got {:?}", + live >= 1, + "(A-3) reach-guard: the un-cleared rider must carry counters, or the count assertion \ + below is vacuous; got {live}" + ); + assert_eq!( + views.unbounded_counters.get(&rider), + Some(&vec![UnboundedCounterView { + counter: CounterType::Plus1Plus1, + count: live, + }]), + "(4)/(A-3) the +1/+1 ∞ pill must reach the wire carrying the rider's LIVE count \ + ({live}), got {:?}", views.unbounded_counters ); } + +/// THE `0 -> 1` HALF OF THE PAIR — a registered pair the live object carries NONE of still +/// renders (CR 122.1 + CR 732.2a). +/// +/// THE DEFECT THIS PINS. `unbounded_counter_targets` is derived by diffing a SIMULATED one-period +/// frame against a clone of the LIVE state (`game::engine::drive_one_period_frames` feeding +/// `analysis::resource::grown_beneficial_counter_deltas`, which admits a pair on `a > b` with +/// `b = counters.get(ct).unwrap_or(0)`). So a counter growing `0 -> 1` across that period is +/// registered while the live bearer carries none of it. While the channel published bare counter +/// TYPES, the display could only draw such a mark by finding a matching row in the object's own +/// `counters` map — there was none — so a real, accepted, registered `∞` rendered NOWHERE. That +/// is the subsystem's own polarity violated: it may leave an `∞` standing one boundary too long, +/// never hide a real one. +/// +/// HOW THE `0` IS REACHED, and what is production vs. harness — stated rather than blurred. +/// The MATERIALIZATION is entirely production: a real offer, a real `DeclareShortcut`, a real +/// `RespondToShortcut::Accept` driving `materialize_object_growth_shortcut` -> +/// `current_period_counter_growth` -> `register_unbounded_counter_targets`. The PRECONDITION — +/// the bearer sitting at zero — is harness-injected, and deliberately so: this pump is +/// `PutCounter{this creature}`, so the only object it can ever reach is the rider itself, and the +/// rider was necessarily present for the period that recorded it. The state is nonetheless a real +/// one the engine can reach (`AbilityCost::RemoveCounter` and CR 122.3's `+1/+1`/`-1/-1` +/// annihilation both decrease a battlefield permanent's counters), and it is legal on its own +/// terms: a 2/2 base creature with no `+1/+1` counters is a 2/2, so no state-based action fires. +/// It is injected as a faithful stand-in for that class, not smuggled in as production shape. +/// +/// WHY THE CLEAR CANNOT BE UNDONE BY THE ACCEPT. The accept consumes the proposal already latched +/// in `WaitingFor::RespondToShortcut` and re-derives against LIVE state, which is the point: with +/// the rider cleared, `before` has no `Plus1Plus1` entry and `after` has one, so the `a > b` +/// admission is reached by production code. And `materialize_object_growth_shortcut` only STASHES +/// the concrete finite growth (`register_pending_materialization`) — it is applied at the next +/// phase/step boundary — so the rider's live count is still `0` at `derive_views`. RG-1 and the +/// post-accept re-check below assert both halves rather than assuming them. +#[test] +fn plus_one_counter_growth_registers_a_target_the_bearer_does_not_yet_carry() { + use engine::analysis::loop_check::ShortcutResponse; + use engine::game::derived_views::{derive_views, ClientGameStateRef}; + + let (mut runner, rider) = drive_plus1_token_engine_to_declared_offer(); + + // THE ONE LINE that differs from the sibling above. Placed AFTER `DeclareShortcut` and BEFORE + // the first Accept — the only window that matters, because CR 732.2b's fan-out has happened + // (so declaration-time handling already saw an unmutated board) while CR 732.2c's completion + // has not (so nothing is materialized yet). The helper's RG-0 assert pins that window. + runner + .state_mut() + .objects + .get_mut(&rider) + .expect("the rider is still on the battlefield at the accept beat") + .counters + .remove(&CounterType::Plus1Plus1); + + // (RG-1) MANDATORY PRECONDITION — the only thing separating `0 -> 1` from `N -> N+1`. Nothing + // else in this test reds if it is removed, which is exactly why it is asserted, not assumed. + // NEVER weaken it to make the test pass: RG-1 *is* the proof the `0 -> 1` path was driven. + assert_eq!( + plus1_of(&runner, rider), + 0, + "RG-1: the bearer must carry ZERO +1/+1 counters at the accept beat, or this fixture is \ + an N -> N+1 test wearing a 0 -> 1 label" + ); + + while matches!( + runner.state().waiting_for, + WaitingFor::RespondToShortcut { .. } + ) { + runner + .act(GameAction::RespondToShortcut { + response: ShortcutResponse::Accept, + }) + .expect("the opponent accepts"); + } + + // (RG-3) The registration happened. Separates "registration missed the 0 -> 1 pair" from + // "the projection dropped it" — without this, a red A-1 has two explanations. + let targets = runner + .state() + .unbounded_counter_targets + .get(&P0) + .cloned() + .unwrap_or_default(); + assert!( + targets.contains(&(rider, CounterType::Plus1Plus1)), + "RG-3: the accept must register the +1/+1 pair even though the bearer carries none of it \ + — this is production's `a > b` admission with `b == 0`; got {targets:?} (waiting_for \ + {:?})", + runner.state().waiting_for + ); + + // Premise re-check: the stashed growth is applied at the next phase/step boundary, so the + // bearer is STILL at zero here. If a boundary had already run, A-1 would fail with a nonzero + // count and this names the reason. + assert_eq!( + plus1_of(&runner, rider), + 0, + "the accepted growth must still be STASHED, not applied, at the derived-view seam" + ); + + // (A-1) THE DISCRIMINATOR. The row exists and carries `count: 0`. Under the old bare-type + // shape this row was unrenderable; under a projector that filtered on + // `objects[id].counters.contains_key(ct)` it would be absent entirely. + let views = derive_views(runner.state(), None); + assert_eq!( + views.unbounded_counters.get(&rider), + Some(&vec![UnboundedCounterView { + counter: CounterType::Plus1Plus1, + count: 0, + }]), + "(A-1) a registered pair the bearer carries NONE of must still publish a renderable row \ + with `count: 0`, got {:?}", + views.unbounded_counters + ); + + // (A-2) …and it survives to the real adapter-visible envelope, not just the in-process view. + let envelope = serde_json::to_value(ClientGameStateRef::wrap(runner.state(), None)) + .expect("the client envelope serializes"); + let rows = envelope + .get("derived") + .and_then(|d| d.get("unbounded_counters")) + .and_then(|c| c.get(rider.0.to_string())) + .unwrap_or_else(|| panic!("(A-2) no wire rows for the bearer; envelope={envelope}")); + // The `"P1P1"` key is the serde authority's spelling (`CounterType::as_str`), written as a + // literal deliberately: this is the adapter-visible contract the TS mirror matches against, + // so deriving it from the enum here would make the assertion agree with itself. + assert_eq!( + rows, + &serde_json::json!([{ "counter": "P1P1", "count": 0 }]), + "(A-2) the wire row the frontend actually reads must carry `count: 0`" + ); + + // (A-4) RULES STATE STAYED CLEAN. The display row must NOT have been bought by writing a + // `{plus1plus1: 0}` entry into the object — `GameObject::counters` sits inside `PartialEq` + // and these envelopes round-trip into the `.json` dumps engine tests reload, so a phantom + // zero entry would corrupt CR 104.4b / CR 732.2a loop equality: the very subsystem this fix + // repairs. This is what pins DISPLAY-only. + let wire_counters = envelope + .get("state") + .and_then(|s| s.get("objects")) + .and_then(|o| o.get(rider.0.to_string())) + .and_then(|o| o.get("counters")) + .expect("(A-4) the bearer is on the serialized board"); + assert!( + wire_counters.get("P1P1").is_none(), + "(A-4) the display row must not materialize into rules state, got {wire_counters}" + ); +} From 3b7927026f7179686b799952b0d91cce32fc2ada Mon Sep 17 00:00:00 2001 From: lgray Date: Sat, 8 Aug 2026 09:51:14 -0500 Subject: [PATCH 04/13] fix(engine): collapse cross-seat duplicate unbounded-counter rows `unbounded_counter_targets` is keyed per seat, so its `BTreeSet` dedupes within a controller and never across controllers. Two accepted loops pumping the same (object, counter) pair each held their own entry, and the projector pushed both. Before this PR that surfaced as one pill, because the display iterated the object's own counter map and applied the mark as a membership test; publishing rows made the duplicate visible as two pills sharing one React key, since every render site keys on the counter type alone. The rows are byte-identical -- `count` is read from `state.objects` keyed only by `(id, ct)`, with no seat input -- so collapsing them is a deduplication, not a choice of whose row wins. Flattening into a `BTreeSet` also drops a nesting level; its `(ObjectId, CounterType)` ordering is what the single-seat case already produced, so no existing assertion moves. Fixed at the seam that owns the row set: deduplicating engine-published game state in the display layer is the inversion this codebase forbids. Also corrects two doc self-contradictions this PR introduced -- the field and projector comments still described publishing counter *types* and marking an existing pill -- and re-splits a compound citation so CR 122.1 carries the marker-on-an-object half, CR 110.1 the permanent-on-the-battlefield half, and CR 122.2 the zone-change half. Assisted-by: ClaudeCode:claude-opus-5 --- client/src/adapter/types.ts | 17 +++- .../card/__tests__/CardPreview.test.tsx | 4 +- client/src/hooks/useUnboundedCounterRows.ts | 4 +- crates/engine/src/game/derived_views.rs | 95 +++++++++++-------- .../tests/integration/loop_counter_growth.rs | 81 ++++++++++++++++ 5 files changed, 155 insertions(+), 46 deletions(-) diff --git a/client/src/adapter/types.ts b/client/src/adapter/types.ts index f4b2fdcf6f..61caea1064 100644 --- a/client/src/adapter/types.ts +++ b/client/src/adapter/types.ts @@ -2715,6 +2715,21 @@ export interface UnboundedFamilyView { state: FamilyCollapseState; } +/** + * One renderable `∞` counter row on one object. Mirrors + * `engine::game::derived_views::UnboundedCounterView`. + * + * `counter` matches the object's `counters` map key (`CounterType`'s serde spelling — e.g. + * `"charge"`, `"P1P1"`). `count` is the object's LIVE count and is engine-supplied because a row + * may legitimately have no entry in that map at all: a pair the loop pumps from `0 -> 1` is + * registered while the object still carries none, so the count is `0` and there is nothing to join + * back to. Re-deriving it here would also be the FE inferring game state. + */ +export interface UnboundedCounterView { + counter: string; + count: number; +} + /** Mirrors `engine::analysis::loop_check::WinKind` (unit variants → bare strings). */ export type WinKind = | "LethalDamage" @@ -3001,7 +3016,7 @@ export interface DerivedViews { * Empty/omitted when no counter-growth loop is active. Mirrors * `engine::game::derived_views::DerivedViews::unbounded_counters`. */ - unbounded_counters?: Record>; + unbounded_counters?: Record; } /** Mirrors `engine::types::game_state::NextSpellModifier` (serde tag="type"). */ diff --git a/client/src/components/card/__tests__/CardPreview.test.tsx b/client/src/components/card/__tests__/CardPreview.test.tsx index 37c2e56101..5cde1df662 100644 --- a/client/src/components/card/__tests__/CardPreview.test.tsx +++ b/client/src/components/card/__tests__/CardPreview.test.tsx @@ -1,7 +1,7 @@ import { act, cleanup, render, screen, waitFor } from "@testing-library/react"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { GameObject } from "../../../adapter/types.ts"; +import type { GameObject, UnboundedCounterView } from "../../../adapter/types.ts"; import { useCardImage } from "../../../hooks/useCardImage.ts"; import { useGameStore } from "../../../stores/gameStore.ts"; import { usePreferencesStore } from "../../../stores/preferencesStore.ts"; @@ -581,7 +581,7 @@ describe("CardPreview blocked abilities", () => { // Matched pair: the ONLY difference between the two cases is the engine mark, so // it is the discriminator. describe("CardPreview unbounded counters", () => { - function inspectPentadPrism(unbounded: Array<{ counter: string; count: number }> | null) { + function inspectPentadPrism(unbounded: UnboundedCounterView[] | null) { const object = battlefieldObject({ id: 409, name: "Pentad Prism", diff --git a/client/src/hooks/useUnboundedCounterRows.ts b/client/src/hooks/useUnboundedCounterRows.ts index 434358b91c..456e075206 100644 --- a/client/src/hooks/useUnboundedCounterRows.ts +++ b/client/src/hooks/useUnboundedCounterRows.ts @@ -1,10 +1,10 @@ import { useMemo } from "react"; -import type { ObjectId } from "../adapter/types.ts"; +import type { ObjectId, UnboundedCounterView } from "../adapter/types.ts"; import { useGameStore } from "../stores/gameStore.ts"; // CR 732.2a / CR 701.34a: stable empty refs so a permanent with no unbounded counter // (the dominant case) never re-renders on identity churn. -const EMPTY_UNBOUNDED_ROWS: ReadonlyArray<{ counter: string; count: number }> = []; +const EMPTY_UNBOUNDED_ROWS: ReadonlyArray = []; const EMPTY_ROWS: CounterRow[] = []; /** diff --git a/crates/engine/src/game/derived_views.rs b/crates/engine/src/game/derived_views.rs index ac5f2d93e5..0ceb985fc8 100644 --- a/crates/engine/src/game/derived_views.rs +++ b/crates/engine/src/game/derived_views.rs @@ -667,18 +667,19 @@ pub struct DerivedViews { pub unbounded_pile: Vec, /// CR 732.2a / CR 701.34a: the per-object `∞` COUNTER channel — for each - /// battlefield object, the counter types whose preserved BENEFICIAL counters an - /// accepted counter-growth loop (proliferate charge on Pentad Prism, burden on + /// battlefield object, one ROW per PRESERVED BENEFICIAL counter that an accepted + /// counter-growth loop (proliferate charge on Pentad Prism, burden on /// The One Ring, a +1/+1 or loyalty pump loop) pumps unboundedly (projected from /// `GameState::unbounded_counter_targets`, filtered to objects still on the - /// battlefield). Which counters qualify is + /// battlefield, and deduplicated ACROSS seats — the per-seat store can hold one pair twice). + /// Which counters qualify is /// `analysis::resource::counter_is_beneficial_materializable`'s wildcard-free partition /// (`Generic(_)`, `Plus1Plus1`, `Loyalty`, `Defense`), derived once by /// `game::engine::current_period_counter_growth`. The counter analog of `unbounded_pile`: /// object-growth marks whole objects, but a counter-growth loop's unbounded axis MAY be /// object-agnostic (one accepted proposal can carry both an object-classed counter axis and - /// the display channel's `Counter(Other, Other)`), so this keys the specific pumped counter - /// so the frontend renders `∞` (not `×N`) on that counter pill and nothing else. Keyed by + /// the display channel's `Counter(Other, Other)`), so each row names the specific pumped + /// counter and the frontend renders `∞` (not `×N`) for that row and nothing else. Keyed by /// ObjectId; DISPLAY-only (the real counter count is unchanged). Public board state — no /// viewer filtering. Empty (and omitted) when no counter-growth loop is active — the /// dominant case. @@ -1374,45 +1375,57 @@ pub fn derive_views(state: &GameState, viewer: Option) -> DerivedViews // +1/+1 / loyalty / defense, per `analysis::resource::counter_is_beneficial_materializable`) // the certified-unbounded loop pumps each cycle — dropping any that have since left // the battlefield (stale member). Display-only per-object channel mirroring - // `unbounded_pile`; the frontend renders `∞` (not `×N`) on any counter pill whose - // type is in this set. Runs in every format (BEFORE the Commander short-circuit). + // `unbounded_pile`; each row emitted here IS one `∞` (never `×N`) pill, rather than a mark + // applied to a pill the object's own counter map already supplies — see the `count: 0` note + // below for why no such pill need exist. Runs in every format (BEFORE the Commander + // short-circuit). // // Unconditional while a collapse is merely scheduled — see the CR 732 timing block above. - for targets in state.unbounded_counter_targets.values() { - for (id, ct) in targets { - // CR 110.1 + CR 122.2: a counter is a marker ON a permanent, and counters cease to - // exist on a zone change — an off-battlefield bearer has no row. - if !state.battlefield.contains(id) { - continue; - } - // CR 122.1: a counter is a marker ON an object, so a row names an (object, counter) - // pair, not a stored quantity. The `unwrap_or(0)` is the PROJECTOR/PRODUCER - // convention, not a rule: it mirrors `analysis::resource:: - // grown_beneficial_counter_deltas`, so both sides share one definition of "absent". - // - // WHY A `count: 0` ROW EXISTS: the pair is derived by diffing a SIMULATED one-period - // frame against a clone of the LIVE state (`game::engine::drive_one_period_frames`), - // so a pair growing 0 -> 1 across that period is registered while the live object - // carries none. Publishing only the type left such a pair unrenderable. Dropping it - // instead would trade a display over-KEEP for an over-DROP, which this subsystem's - // stated polarity forbids. Row existence is decided by the ∞ stores and live - // battlefield membership — never by `objects[..].counters`; see the - // NO-SURFACE-IS-FILTERED invariant (stated in this file and mirrored above - // `GameState::scheduled_collapse_axes`). - let count = state - .objects - .get(id) - .and_then(|o| o.counters.get(ct).copied()) - .unwrap_or(0); - views - .unbounded_counters - .entry(*id) - .or_default() - .push(UnboundedCounterView { - counter: ct.clone(), - count, - }); + // + // CROSS-SEAT DEDUPE: the store is per-seat (`BTreeMap>`), so it dedupes + // WITHIN a seat and never ACROSS seats. Two controllers whose accepted loops pump the same + // (object, counter) pair each hold their own entry, and emitting both produced a duplicate row + // — two identical pills sharing one React key, since every render site keys on the counter + // type alone. The rows are byte-identical (`count` below is keyed only by `(id, ct)`, with no + // seat input), so collapsing at the source is a deduplication, not a choice of whose row wins. + // Flattening into a `BTreeSet` keeps the wire order the single-seat case already had: sorted + // by `(ObjectId, CounterType)`. + let targets: BTreeSet<&(ObjectId, CounterType)> = + state.unbounded_counter_targets.values().flatten().collect(); + for (id, ct) in targets { + // CR 122.1 + CR 110.1 + CR 122.2: a counter is a marker placed ON an object, a permanent + // is a card or token ON THE BATTLEFIELD, and counters cease to exist when their bearer + // changes zones — so an off-battlefield bearer has no row. + if !state.battlefield.contains(id) { + continue; } + // CR 122.1: a counter is a marker ON an object, so a row names an (object, counter) + // pair, not a stored quantity. The `unwrap_or(0)` is the PROJECTOR/PRODUCER + // convention, not a rule: it mirrors `analysis::resource:: + // grown_beneficial_counter_deltas`, so both sides share one definition of "absent". + // + // WHY A `count: 0` ROW EXISTS: the pair is derived by diffing a SIMULATED one-period + // frame against a clone of the LIVE state (`game::engine::drive_one_period_frames`), + // so a pair growing 0 -> 1 across that period is registered while the live object + // carries none. Publishing only the type left such a pair unrenderable. Dropping it + // instead would trade a display over-KEEP for an over-DROP, which this subsystem's + // stated polarity forbids. Row existence is decided by the ∞ stores and live + // battlefield membership — never by `objects[..].counters`; see the + // NO-SURFACE-IS-FILTERED invariant (stated in this file and mirrored above + // `GameState::scheduled_collapse_axes`). + let count = state + .objects + .get(id) + .and_then(|o| o.counters.get(ct).copied()) + .unwrap_or(0); + views + .unbounded_counters + .entry(*id) + .or_default() + .push(UnboundedCounterView { + counter: ct.clone(), + count, + }); } if state.format_config.commander_damage_threshold.is_none() { diff --git a/crates/engine/tests/integration/loop_counter_growth.rs b/crates/engine/tests/integration/loop_counter_growth.rs index 343b5a8038..6c8549e1ff 100644 --- a/crates/engine/tests/integration/loop_counter_growth.rs +++ b/crates/engine/tests/integration/loop_counter_growth.rs @@ -616,3 +616,84 @@ fn plus_one_counter_growth_registers_a_target_the_bearer_does_not_yet_carry() { "(A-4) the display row must not materialize into rules state, got {wire_counters}" ); } + +/// CROSS-SEAT DEDUPE — one `(object, counter)` pair registered by TWO seats projects ONE row. +/// +/// THE DEFECT THIS PINS. `GameState::unbounded_counter_targets` is +/// `BTreeMap>`: the `BTreeSet` dedupes WITHIN a seat +/// and nothing dedupes ACROSS seats. The projector iterated `.values()` and pushed every pair +/// unconditionally, so two controllers whose accepted loops pump the same pair emitted the pair +/// TWICE. Both rows are byte-identical — the count is read from `state.objects` keyed only by +/// `(id, ct)`, with no seat input — so this is a duplicate, never a "whose count wins" question. +/// Downstream, all three render sites (`board/PermanentCard`, `card/ArtCropCard`, +/// `card/CardPreview`) key their pill on the counter TYPE alone, so a duplicate row is two React +/// children sharing one key: undefined reconciliation plus a dev warning. The frontend cannot fix +/// this — deduping engine-published game state in the display layer is exactly what this codebase +/// forbids — so the collapse belongs here, at the seam that owns the row set. +/// +/// WHY A DIRECTLY-CONSTRUCTED STATE IS HONEST HERE. Reachability is STRUCTURAL, not scenario- +/// dependent: `register_unbounded_counter_targets` is the store's single write authority and it +/// keys strictly by the winning controller (`game::engine::materialize_object_growth_shortcut` +/// passes `proposal.proposer`), so "two seats hold the same pair" is reached by two accepted +/// proposals in either order and carries no per-seat state beyond the key. Driving two full +/// concurrent loop accepts would exercise the offer machinery, not this projection. The +/// registrations below therefore go through that same production write authority; only the +/// scheduling around them is harness-built. +#[test] +fn one_pair_registered_by_two_seats_projects_a_single_row() { + use engine::game::derived_views::derive_views; + use engine::game::zones::create_object; + use engine::types::identifiers::CardId; + use engine::types::zones::Zone; + + const P1: PlayerId = PlayerId(1); + + let mut state = GameState::new_two_player(42); + let bearer = create_object( + &mut state, + CardId(1), + P0, + "Shared Bearer".to_string(), + Zone::Battlefield, + ); + // NONZERO on purpose: it makes the surviving row's `count` a discriminating value, so a + // "dedupe" that dropped both rows and re-invented one from thin air cannot pass. + state + .objects + .get_mut(&bearer) + .expect("the bearer is on the board") + .counters + .insert(CounterType::Plus1Plus1, 3); + + // Both seats register the SAME pair, through the store's real single write authority. + state.register_unbounded_counter_targets(P0, vec![(bearer, CounterType::Plus1Plus1)]); + state.register_unbounded_counter_targets(P1, vec![(bearer, CounterType::Plus1Plus1)]); + + // REACH-GUARD (the positive control). Without this, a registration that silently dropped the + // second seat would make the single-row assertion below pass vacuously — it would be asserting + // that one row came from one entry, which was never in doubt. + let seats: Vec = state + .unbounded_counter_targets + .iter() + .filter(|(_, pairs)| pairs.contains(&(bearer, CounterType::Plus1Plus1))) + .map(|(seat, _)| *seat) + .collect(); + assert_eq!( + seats, + vec![P0, P1], + "reach-guard: BOTH seats must really hold the pair, or the dedupe below is untested" + ); + + // THE ASSERTION. Exactly one row — not two identical ones sharing a React key. + let views = derive_views(&state, None); + assert_eq!( + views.unbounded_counters.get(&bearer), + Some(&vec![UnboundedCounterView { + counter: CounterType::Plus1Plus1, + count: 3, + }]), + "one (object, counter) pair held by two seats must project ONE row carrying the live \ + count; duplicates collide on the counter-type React key at every render site. Got {:?}", + views.unbounded_counters + ); +} From 883565893b9861e593106d7278a1ab4733a29c5f Mon Sep 17 00:00:00 2001 From: lgray Date: Sat, 8 Aug 2026 10:43:28 -0500 Subject: [PATCH 05/13] test(engine): pin the cross-seat collapse in both directions The dedupe added in the previous commit had no over-collapse control: the only two-seat registration in the tree registered the same pair twice, so narrowing the set key -- or the merged multi-seat ordering, which nothing asserted -- would have redded nothing. The fixture now registers a shared pair from two seats and a distinct pair from one, with unequal counts so a collapse that kept the wrong row cannot coincide, and asserts both surviving rows in `(ObjectId, CounterType)` order. Measured in both directions: narrowing the key to `ObjectId` drops to one row, removing the dedupe yields three. Also corrects two doc defects this PR introduced. `NO-SURFACE-IS-FILTERED invariant` was cited at two sites and stated at neither -- and on inspection named a different proposition at each, plus a third one elsewhere in the file, so the name is dropped and each site now says its own claim. And the field and projector comments described the published set as "PRESERVED BENEFICIAL", where "preserved" is this repo's term for `is_monotone_loop_resource() == false`, which intersects the published partition only at `Generic`; both now read "BENEFICIAL-MATERIALIZABLE", the predicate the production path actually filters on. No production behavior changes: `derived_views.rs` is comment-only here. Assisted-by: ClaudeCode:claude-opus-5 --- crates/engine/src/game/derived_views.rs | 15 ++-- .../tests/integration/loop_counter_growth.rs | 70 ++++++++++++++----- 2 files changed, 59 insertions(+), 26 deletions(-) diff --git a/crates/engine/src/game/derived_views.rs b/crates/engine/src/game/derived_views.rs index 0ceb985fc8..8a8ff68301 100644 --- a/crates/engine/src/game/derived_views.rs +++ b/crates/engine/src/game/derived_views.rs @@ -390,9 +390,9 @@ pub struct UnboundedFamilyView { /// forbids (see [`UnboundedFamilyView`]): it may leave an `∞` standing one boundary too long, /// never hide a real one. /// -/// DISPLAY-only — never written back to `GameState`. Carries data only; `isUnbounded` stays a -/// render-time distinction and never becomes an engine-published boolean, per this file's -/// NO-SURFACE-IS-FILTERED invariant ("no row carries a flag"). +/// DISPLAY-only — never written back to `GameState`. Carries data only: the row's PRESENCE in +/// this channel is the entire unboundedness claim, so `isUnbounded` stays a render-time +/// distinction and never becomes an engine-published boolean field on the row. /// /// Derive list matches its siblings [`UnboundedResourceView`] / [`UnboundedFamilyView`] exactly. /// `Eq` is not optional: [`DerivedViews`] itself derives `Eq`. @@ -667,7 +667,7 @@ pub struct DerivedViews { pub unbounded_pile: Vec, /// CR 732.2a / CR 701.34a: the per-object `∞` COUNTER channel — for each - /// battlefield object, one ROW per PRESERVED BENEFICIAL counter that an accepted + /// battlefield object, one ROW per BENEFICIAL-MATERIALIZABLE counter that an accepted /// counter-growth loop (proliferate charge on Pentad Prism, burden on /// The One Ring, a +1/+1 or loyalty pump loop) pumps unboundedly (projected from /// `GameState::unbounded_counter_targets`, filtered to objects still on the @@ -1371,7 +1371,7 @@ pub fn derive_views(state: &GameState, viewer: Option) -> DerivedViews } // CR 732.2a / CR 701.34a: project the accepted counter-growth loop's per-object ∞ - // counter targets — the objects whose PRESERVED BENEFICIAL counters (charge / burden / + // counter targets — the objects whose BENEFICIAL-MATERIALIZABLE counters (charge / burden / // +1/+1 / loyalty / defense, per `analysis::resource::counter_is_beneficial_materializable`) // the certified-unbounded loop pumps each cycle — dropping any that have since left // the battlefield (stale member). Display-only per-object channel mirroring @@ -1410,9 +1410,8 @@ pub fn derive_views(state: &GameState, viewer: Option) -> DerivedViews // carries none. Publishing only the type left such a pair unrenderable. Dropping it // instead would trade a display over-KEEP for an over-DROP, which this subsystem's // stated polarity forbids. Row existence is decided by the ∞ stores and live - // battlefield membership — never by `objects[..].counters`; see the - // NO-SURFACE-IS-FILTERED invariant (stated in this file and mirrored above - // `GameState::scheduled_collapse_axes`). + // battlefield membership — never by `objects[..].counters`, which supplies only the + // count once the row's existence is already settled. let count = state .objects .get(id) diff --git a/crates/engine/tests/integration/loop_counter_growth.rs b/crates/engine/tests/integration/loop_counter_growth.rs index 6c8549e1ff..a254d18ffe 100644 --- a/crates/engine/tests/integration/loop_counter_growth.rs +++ b/crates/engine/tests/integration/loop_counter_growth.rs @@ -617,7 +617,8 @@ fn plus_one_counter_growth_registers_a_target_the_bearer_does_not_yet_carry() { ); } -/// CROSS-SEAT DEDUPE — one `(object, counter)` pair registered by TWO seats projects ONE row. +/// CROSS-SEAT DEDUPE — one `(object, counter)` pair registered by TWO seats projects ONE row, +/// and a DISTINCT pair on the same object survives that collapse. /// /// THE DEFECT THIS PINS. `GameState::unbounded_counter_targets` is /// `BTreeMap>`: the `BTreeSet` dedupes WITHIN a seat @@ -639,8 +640,17 @@ fn plus_one_counter_growth_registers_a_target_the_bearer_does_not_yet_carry() { /// concurrent loop accepts would exercise the offer machinery, not this projection. The /// registrations below therefore go through that same production write authority; only the /// scheduling around them is harness-built. +/// +/// THE NEGATIVE CONTROL IS IN THIS FIXTURE, NOT A SIBLING. A dedupe is only half-tested by a +/// state where every seat holds the SAME pair: that pins "collapses enough" while leaving +/// "collapses too much" free, so narrowing the set key to `ObjectId` alone would red nothing. +/// One seat here therefore also holds a DISTINCT pair on the SAME object, which must survive +/// alongside the collapsed one. Both directions are live against one state: dropping the dedupe +/// yields three rows, narrowing the key to the object yields one, and the assertion below names +/// exactly two. It also pins the merged multi-seat ORDERING — rows arrive sorted by +/// `(ObjectId, CounterType)`, which nothing else asserts beyond a single seat. #[test] -fn one_pair_registered_by_two_seats_projects_a_single_row() { +fn two_seats_collapse_the_shared_pair_and_keep_the_distinct_one() { use engine::game::derived_views::derive_views; use engine::game::zones::create_object; use engine::types::identifiers::CardId; @@ -656,22 +666,29 @@ fn one_pair_registered_by_two_seats_projects_a_single_row() { "Shared Bearer".to_string(), Zone::Battlefield, ); - // NONZERO on purpose: it makes the surviving row's `count` a discriminating value, so a - // "dedupe" that dropped both rows and re-invented one from thin air cannot pass. - state + // NONZERO and DISTINCT on purpose: the counts make each surviving row discriminating, so a + // "dedupe" that dropped rows and re-invented one from thin air cannot pass, and a collapse + // that kept the wrong one of the two pairs cannot pass either. + let charge = CounterType::Generic("charge".to_string()); + let bearer_counters = &mut state .objects .get_mut(&bearer) .expect("the bearer is on the board") - .counters - .insert(CounterType::Plus1Plus1, 3); + .counters; + bearer_counters.insert(CounterType::Plus1Plus1, 3); + bearer_counters.insert(charge.clone(), 7); - // Both seats register the SAME pair, through the store's real single write authority. + // Both seats register the SAME pair, through the store's real single write authority; one of + // them also registers a DISTINCT pair on the SAME object (the over-collapse control). state.register_unbounded_counter_targets(P0, vec![(bearer, CounterType::Plus1Plus1)]); - state.register_unbounded_counter_targets(P1, vec![(bearer, CounterType::Plus1Plus1)]); + state.register_unbounded_counter_targets( + P1, + vec![(bearer, CounterType::Plus1Plus1), (bearer, charge.clone())], + ); // REACH-GUARD (the positive control). Without this, a registration that silently dropped the - // second seat would make the single-row assertion below pass vacuously — it would be asserting - // that one row came from one entry, which was never in doubt. + // second seat would make the collapse assertion below pass vacuously — the shared pair would + // be projecting one row from one entry, which was never in doubt. let seats: Vec = state .unbounded_counter_targets .iter() @@ -683,17 +700,34 @@ fn one_pair_registered_by_two_seats_projects_a_single_row() { vec![P0, P1], "reach-guard: BOTH seats must really hold the pair, or the dedupe below is untested" ); + // REACH-GUARD (the over-collapse control's own positive control). If the distinct pair never + // landed in the store, "it survives the collapse" below would be asserting nothing. + assert!( + state.unbounded_counter_targets[&P1].contains(&(bearer, charge.clone())), + "reach-guard: the distinct pair must really be stored, or the over-collapse control is \ + vacuous" + ); - // THE ASSERTION. Exactly one row — not two identical ones sharing a React key. + // THE ASSERTION. Exactly two rows: the shared pair collapsed to ONE (not two identical rows + // sharing a React key), the distinct pair NOT collapsed away with it, both sorted by + // `(ObjectId, CounterType)` — `Plus1Plus1` is declared before `Generic`, so it comes first. let views = derive_views(&state, None); assert_eq!( views.unbounded_counters.get(&bearer), - Some(&vec![UnboundedCounterView { - counter: CounterType::Plus1Plus1, - count: 3, - }]), - "one (object, counter) pair held by two seats must project ONE row carrying the live \ - count; duplicates collide on the counter-type React key at every render site. Got {:?}", + Some(&vec![ + UnboundedCounterView { + counter: CounterType::Plus1Plus1, + count: 3, + }, + UnboundedCounterView { + counter: charge.clone(), + count: 7, + }, + ]), + "the (object, counter) pair held by two seats must project ONE row carrying the live \ + count (duplicates collide on the counter-type React key at every render site), while a \ + DISTINCT pair on the same object must survive that collapse in `(ObjectId, CounterType)` \ + order. Got {:?}", views.unbounded_counters ); } From 1af4afebb61d14cd444c4988501d91f4451af44c Mon Sep 17 00:00:00 2001 From: lgray Date: Sat, 8 Aug 2026 15:30:46 -0500 Subject: [PATCH 06/13] fix(engine): publish the complete per-object counter-display projection DerivedViews::unbounded_counters becomes counter_display, keyed by ObjectId and carrying every rendered counter row rather than only the infinity-marked counter types. Each row is CounterRowView { counter, count, magnitude }, with CounterMagnitude { Finite, Unbounded } typed rather than a bool, and rows are pre-partitioned into ObjectCounterDisplay { pills, loyalty } so the display layer selects, filters and interprets nothing. Row key is (ObjectId, CounterType) per CR 122.1, so one pair cannot produce two rows and the client-side dedupe/shadow rule ceases to exist rather than moving. Infinity annotation existence stays gated on the loop stores plus live battlefield membership (CR 122.2 + CR 110.1); finite row existence gates on the object's own counters, deferring to zones::counters_persist_on_move for the CR 113.6b carve-out rather than re-deriving a second, weaker zone rule. Extends the NO SURFACE IS FILTERED BY THE SCHEDULE invariant to the widened projection: the schedule may annotate a row, never admit or withhold one. Assisted-by: ClaudeCode:claude-opus-5 --- crates/engine/src/game/derived_views.rs | 699 ++++++++++++++++++++---- crates/engine/src/types/game_state.rs | 36 +- 2 files changed, 609 insertions(+), 126 deletions(-) diff --git a/crates/engine/src/game/derived_views.rs b/crates/engine/src/game/derived_views.rs index 10719eefec..cb7f6a74c5 100644 --- a/crates/engine/src/game/derived_views.rs +++ b/crates/engine/src/game/derived_views.rs @@ -27,7 +27,7 @@ use crate::types::ability::{ use crate::types::attribution::EffectRef; use crate::types::card::TokenImageRef; use crate::types::card_type::CoreType; -use crate::types::counter::CounterType; +use crate::types::counter::{positive_counter_entries, CounterType}; use crate::types::events::GameEvent; use crate::types::format::GameFormat; use crate::types::game_state::{ @@ -334,13 +334,14 @@ impl FamilyCollapseState { /// SAME-FRAME ASYMMETRY — UNCHANGED AND LIVE. Carried forward from the `scheduled` flag this /// channel replaced, because retyping the flag as [`FamilyCollapseState`] did not answer the /// objection, and a reader still sees it on screen. Only THIS channel carries a collapse state. -/// `unbounded_pile` (card groups) and `unbounded_counters` (counter pills) are `ObjectId`-keyed and +/// `unbounded_pile` (card groups) and `counter_display` (counter pills) are `ObjectId`-keyed and /// carry no collapse projection at all, so during the accept→boundary window one loop can show /// `∞→N` on the badge and a plain `∞` on its own token group and counter pill in the SAME frame. /// Witnessed rather than asserted: /// `kilo_live_offer_from_real_dump::kilo_accept_marks_pentad_charge_as_unbounded_display_target` -/// pins `unbounded_counters[Pentad]` as a single `charge` row — a bare `∞` pill — in the exact -/// frame whose golden family state is `Scheduled(Committed)`. +/// pins `counter_display[Pentad]` as a single `charge` row carrying [`CounterMagnitude`]'s +/// `Unbounded` — a bare `∞` pill — in the exact frame whose golden family state is +/// `Scheduled(Committed)`. /// /// THE ANSWER, not a disclosure: this is not the `Mana(_)` false-promise case. The collapse really /// IS scheduled for that axis, so the quiet surfaces under-announce; none of them promises a bound @@ -372,35 +373,59 @@ pub struct UnboundedFamilyView { pub state: FamilyCollapseState, } -/// One RENDERABLE `∞` counter row: an accepted counter-growth loop pumps `counter` on the -/// object this row is keyed by, and `count` is that object's LIVE count of it. -/// -/// CR 122.1: a counter is a marker ON an object, so a row names an (object, counter) pair, not a -/// stored quantity. The `unwrap_or(0)` at the projection site is the PROJECTOR/PRODUCER -/// convention, not a rule: it mirrors `analysis::resource::grown_beneficial_counter_deltas`, -/// which reads the producing side with the same `unwrap_or(0)`, so both ends share one -/// definition of "absent". +/// CR 122.1 + CR 732.2a: whether a counter row's count is a real quantity or one an accepted +/// shortcut pumps without bound. Typed rather than a bool because the row is engine-classified +/// data, not a render-time guess. `Finite` is the dominant case and is therefore the serde +/// default, so the wire stays quiet for it. +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum CounterMagnitude { + #[default] + Finite, + Unbounded, +} + +/// `skip_serializing_if` predicate for [`CounterRowView`]'s `magnitude`, mirroring the free-fn +/// `is_false` shape every sibling display row in this module already uses. +fn is_finite(magnitude: &CounterMagnitude) -> bool { + matches!(magnitude, CounterMagnitude::Finite) +} + +/// One RENDERABLE counter row on one object: an (object, counter) pair. CR 122.1 — a counter is a +/// marker ON an object, so the pair IS the row key and no two rows can name one pair. /// -/// WHY THE COUNT IS IN THE ROW rather than left to the display layer: the pair is derived by -/// diffing a SIMULATED one-period frame against a clone of the LIVE state -/// (`game::engine::drive_one_period_frames`), so a pair growing `0 -> 1` across that period is -/// registered while the live object carries NONE of that counter. Publishing only the type left -/// such a pair unrenderable — the display had no row to hang `∞` on, and inventing one from -/// `objects[..].counters` would be the frontend deriving game state. Dropping the pair instead -/// would trade a display over-KEEP for an over-DROP, which this subsystem's stated polarity -/// forbids (see [`UnboundedFamilyView`]): it may leave an `∞` standing one boundary too long, -/// never hide a real one. +/// `count` is the object's LIVE count; the `unwrap_or(0)` at the projection site is the +/// PRODUCER/PROJECTOR convention mirroring `analysis::resource::grown_beneficial_counter_deltas`, +/// so both ends share one definition of "absent". An `Unbounded` row with `count: 0` is real, not +/// a placeholder: the pair is derived by diffing a SIMULATED one-period frame against a clone of +/// the LIVE state (`game::engine::drive_one_period_frames`), so a pair growing `0 -> 1` across +/// that period is registered while the live object carries NONE of that counter. /// -/// DISPLAY-only — never written back to `GameState`. Carries data only: the row's PRESENCE in -/// this channel is the entire unboundedness claim, so `isUnbounded` stays a render-time -/// distinction and never becomes an engine-published boolean field on the row. +/// DISPLAY-only — never written back to `GameState`. /// /// Derive list matches its siblings [`UnboundedResourceView`] / [`UnboundedFamilyView`] exactly. /// `Eq` is not optional: [`DerivedViews`] itself derives `Eq`. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct UnboundedCounterView { +pub struct CounterRowView { pub counter: CounterType, pub count: u32, + #[serde(default, skip_serializing_if = "is_finite")] + pub magnitude: CounterMagnitude, +} + +/// Every counter row one object renders, PRE-PARTITIONED by where it renders — so the display +/// layer selects nothing, filters nothing, and interprets no counter type. +/// +/// CR 306.5c: a planeswalker's loyalty IS its loyalty-counter count, so a loyalty counter on an +/// object that HAS a loyalty characteristic drives the total badge, never a pill. +/// CR 606.4: a loyalty ABILITY COST is a different game fact and is never projected here. +/// A loyalty counter on an object with NO loyalty characteristic is a `pills` row — CR 306.5c +/// speaks only of planeswalkers, and hiding such a marker would be an over-DROP. +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub struct ObjectCounterDisplay { + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub pills: Vec, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub loyalty: Option, } /// The display family a pumped [`ResourceAxis`] groups into. Exhaustive by design (no wildcard) — @@ -667,35 +692,42 @@ pub struct DerivedViews { #[serde(default, skip_serializing_if = "Vec::is_empty")] pub unbounded_pile: Vec, - /// CR 732.2a / CR 701.34a: the per-object `∞` COUNTER channel — for each - /// battlefield object, one ROW per BENEFICIAL-MATERIALIZABLE counter that an accepted - /// counter-growth loop (proliferate charge on Pentad Prism, burden on - /// The One Ring, a +1/+1 or loyalty pump loop) pumps unboundedly (projected from - /// `GameState::unbounded_counter_targets`, filtered to objects still on the - /// battlefield, and deduplicated ACROSS seats — the per-seat store can hold one pair twice). - /// Which counters qualify is - /// `analysis::resource::counter_is_beneficial_materializable`'s wildcard-free partition - /// (`Generic(_)`, `Plus1Plus1`, `Loyalty`, `Defense`), derived once by - /// `game::engine::current_period_counter_growth`. The counter analog of `unbounded_pile`: - /// object-growth marks whole objects, but a counter-growth loop's unbounded axis MAY be - /// object-agnostic (one accepted proposal can carry both an object-classed counter axis and - /// the display channel's `Counter(Other, Other)`), so each row names the specific pumped - /// counter and the frontend renders `∞` (not `×N`) for that row and nothing else. Keyed by - /// ObjectId; DISPLAY-only (the real counter count is unchanged). Public board state — no - /// viewer filtering. Empty (and omitted) when no counter-growth loop is active — the - /// dominant case. + /// CR 122.1 + CR 732.2a: the COMPLETE per-object counter-display projection — every counter + /// row every display surface renders, for EVERY object that has one, in ANY zone. The single + /// authority for counter display: the client looks up its object's [`ObjectCounterDisplay`] + /// and renders it, joining nothing, filtering nothing, sorting nothing, and interpreting no + /// counter type. Produced by `counter_display_views`. + /// + /// TWO DISTINCT EXISTENCE GATES, and conflating them is the bug this shape exists to prevent: + /// - A FINITE row exists iff the object's own map carries that counter with a POSITIVE count + /// (`types::counter::positive_counter_entries` — CR 122.1, a zero map entry is not a + /// marker). It is NOT battlefield-gated. CR 122.2 already makes counters cease to exist on + /// a zone change, and `zones::counters_persist_on_move` is the SINGLE authority for the + /// CR 113.6b carve-out that overrides it (Skullbriar, Me the Immortal) — so a zone gate + /// here would be a second, weaker copy of that rule, and it would also delete a suspended + /// card's time counters in exile (CR 702.62b). The projection defers; it never re-derives. + /// - The `Unbounded` ANNOTATION exists iff the pair is registered in + /// `GameState::unbounded_counter_targets` AND the bearer is on the LIVE battlefield. + /// CR 110.1: a permanent is a card or token on the battlefield, and the CR 732.2a mark + /// claims a PERMANENT's counters are being pumped — off the battlefield there is no + /// permanent, so the annotation drops while a persisting finite row may survive. + /// + /// Cross-seat duplication is structurally impossible rather than deduplicated: the row key is + /// `(ObjectId, CounterType)`, so the per-seat store holding one pair twice yields one row. /// - /// SHAPE: each entry is a self-sufficient [`UnboundedCounterView`] ROW, not a bare counter - /// type. The row carries the object's LIVE count, which is `0` when the loop pumps a counter - /// the object does not yet carry — a real row, not a marker needing a host row that does not - /// exist. See [`UnboundedCounterView`] for why the count is engine-supplied. + /// ORDER: `Unbounded` rows lead, then `CounterType`'s declaration `Ord` inside each class. + /// The lead is display salience under clipping — all three subscribed strips are fixed-size + /// overlay stacks, so a row pushed past the fold is a row the player does not see, and the `∞` + /// state is the exceptional one. The finite tie-break is `CounterType`'s `Ord` because that is + /// already the order `counter_map_serde` puts `objects[*].counters` on the wire in, so the + /// finite-only case — the dominant case — renders exactly as it did before. /// - /// CR 306.5c: a `Loyalty` row states that this planeswalker's loyalty TOTAL is unbounded - /// (loyalty IS its loyalty-counter count), so it drives the loyalty total badge rather than a - /// pill. Loyalty ABILITY COST badges are never unbounded — CR 606.4, an activation cost is a - /// number of loyalty counters to pay, a different game fact from the total. + /// PAYLOAD: this field's population grew from `∞`-registered battlefield pairs (usually zero + /// entries) to every counter-bearing object. Measured on the production dumps this PR drives: + /// ONE entry on a 411-object board and ZERO on a 410-object one, and `HashMap::is_empty` still + /// omits the channel entirely for a counterless board. #[serde(default, skip_serializing_if = "HashMap::is_empty")] - pub unbounded_counters: HashMap>, + pub counter_display: HashMap, } /// Serialize-only wrapper: the WASM getter passes `&GameState` by reference @@ -853,10 +885,12 @@ pub struct ClientGameState { pub derived: DerivedViews, } -/// Compute all engine-authored projections over `state`. Runs in O(damage -/// entries) per call; the JIT short-circuit for non-Commander formats -/// (where `commander_damage_threshold` is `None`) keeps the cost at exactly -/// zero for the overwhelmingly common case. +/// Compute all engine-authored projections over `state`. Runs in O(objects + `∞` +/// targets + damage entries) per call; the JIT short-circuit for non-Commander +/// formats (where `commander_damage_threshold` is `None`) still keeps the +/// commander-damage grouping at exactly zero cost. The per-object counter walk +/// (`counter_display_views`) allocates nothing for the dominant counterless +/// object. /// /// CR 903.10a: commander damage is public information tracked per commander /// — no viewer-based redaction is applied here, and the grouping runs @@ -1296,8 +1330,12 @@ pub fn derive_views(state: &GameState, viewer: Option) -> DerivedViews // i.e. it hid a badge beside a pool the player can visibly keep spending. // // NO SURFACE IS FILTERED BY THE SCHEDULE — that, and only that, is the invariant here. Which - // rows/groups/pills EXIST is decided by the `∞` stores and the LIVE battlefield alone; nothing - // below hides a surface because a collapse is scheduled. The schedule is read to ANNOTATE, not + // rows/groups/pills EXIST is decided by the `∞` stores, the object's own counters, and the + // LIVE battlefield alone; nothing below hides a surface because a collapse is scheduled. That + // now covers a COMPLETE projection, not just the `∞` subset: `counter_display` publishes every + // rendered counter row on every object, and the schedule decides the existence of none of + // them. The schedule may only ANNOTATE (`unbounded_families`), never admit or withhold a row. + // The schedule is read to ANNOTATE, not // to filter: the row loop accumulates a per-`(player, family)` `FamilyCollapseState` emitted as // a SEPARATE channel (`unbounded_families`), and NO row carries a flag. Still additive. // @@ -1320,6 +1358,10 @@ pub fn derive_views(state: &GameState, viewer: Option) -> DerivedViews // lose a row" — falsified when that arm stopped reading the controller-keyed store WHOLE // and started deriving each registered pair's own axis, which is an axis-scoped // authority and therefore may revoke a counter row too. + // 6. "…and the counter-pill loop projects only `∞`-marked pairs" — falsified when the + // channel widened to the complete per-object projection in `counter_display_views`. `∞` + // became an ANNOTATION on a row whose existence is decided by the object's own counters, + // and `Finite` row existence stopped being battlefield-gated at all. // The gate itself reads the schedule for the first time, and it still does not FILTER by it: // an accepted collapse can only ADD a row back that the backing check would have dropped // (CR 732.2c — the shortcut is already taken), never remove one. @@ -1416,62 +1458,12 @@ pub fn derive_views(state: &GameState, viewer: Option) -> DerivedViews } } - // CR 732.2a / CR 701.34a: project the accepted counter-growth loop's per-object ∞ - // counter targets — the objects whose BENEFICIAL-MATERIALIZABLE counters (charge / burden / - // +1/+1 / loyalty / defense, per `analysis::resource::counter_is_beneficial_materializable`) - // the certified-unbounded loop pumps each cycle — dropping any that have since left - // the battlefield (stale member). Display-only per-object channel mirroring - // `unbounded_pile`; each row emitted here IS one `∞` (never `×N`) pill, rather than a mark - // applied to a pill the object's own counter map already supplies — see the `count: 0` note - // below for why no such pill need exist. Runs in every format (BEFORE the Commander - // short-circuit). + // CR 122.1 + CR 732.2a: the COMPLETE per-object counter-display projection. Emitted HERE, + // above the Commander short-circuit below, for the same reason the two loops above are: that + // `return` would drop this channel in every non-Commander format. // // Unconditional while a collapse is merely scheduled — see the CR 732 timing block above. - // - // CROSS-SEAT DEDUPE: the store is per-seat (`BTreeMap>`), so it dedupes - // WITHIN a seat and never ACROSS seats. Two controllers whose accepted loops pump the same - // (object, counter) pair each hold their own entry, and emitting both produced a duplicate row - // — two identical pills sharing one React key, since every render site keys on the counter - // type alone. The rows are byte-identical (`count` below is keyed only by `(id, ct)`, with no - // seat input), so collapsing at the source is a deduplication, not a choice of whose row wins. - // Flattening into a `BTreeSet` keeps the wire order the single-seat case already had: sorted - // by `(ObjectId, CounterType)`. - let targets: BTreeSet<&(ObjectId, CounterType)> = - state.unbounded_counter_targets.values().flatten().collect(); - for (id, ct) in targets { - // CR 122.1 + CR 110.1 + CR 122.2: a counter is a marker placed ON an object, a permanent - // is a card or token ON THE BATTLEFIELD, and counters cease to exist when their bearer - // changes zones — so an off-battlefield bearer has no row. - if !state.battlefield.contains(id) { - continue; - } - // CR 122.1: a counter is a marker ON an object, so a row names an (object, counter) - // pair, not a stored quantity. The `unwrap_or(0)` is the PROJECTOR/PRODUCER - // convention, not a rule: it mirrors `analysis::resource:: - // grown_beneficial_counter_deltas`, so both sides share one definition of "absent". - // - // WHY A `count: 0` ROW EXISTS: the pair is derived by diffing a SIMULATED one-period - // frame against a clone of the LIVE state (`game::engine::drive_one_period_frames`), - // so a pair growing 0 -> 1 across that period is registered while the live object - // carries none. Publishing only the type left such a pair unrenderable. Dropping it - // instead would trade a display over-KEEP for an over-DROP, which this subsystem's - // stated polarity forbids. Row existence is decided by the ∞ stores and live - // battlefield membership — never by `objects[..].counters`, which supplies only the - // count once the row's existence is already settled. - let count = state - .objects - .get(id) - .and_then(|o| o.counters.get(ct).copied()) - .unwrap_or(0); - views - .unbounded_counters - .entry(*id) - .or_default() - .push(UnboundedCounterView { - counter: ct.clone(), - count, - }); - } + views.counter_display = counter_display_views(state); if state.format_config.commander_damage_threshold.is_none() { return views; @@ -1496,6 +1488,109 @@ pub fn derive_views(state: &GameState, viewer: Option) -> DerivedViews views } +/// CR 306.5c: route one row to the loyalty TOTAL or to the pill strip. A `Loyalty` counter drives +/// the total only on an object that HAS a loyalty characteristic; on anything else CR 306.5c says +/// nothing, so hiding the marker would be an over-DROP and the row stays a pill. CR 606.4's +/// loyalty ABILITY COST is a different game fact and is never projected here. +fn push_counter_row(display: &mut ObjectCounterDisplay, has_loyalty: bool, row: CounterRowView) { + if has_loyalty && row.counter == CounterType::Loyalty { + display.loyalty = Some(row); + } else { + display.pills.push(row); + } +} + +/// CR 122.1 + CR 732.2a: build the COMPLETE per-object counter-display projection — every counter +/// row every display surface renders, for every object that has one, in any zone. +/// +/// TWO DISJOINT PASSES, so no `(ObjectId, CounterType)` key can be emitted twice and a duplicate +/// pill is structurally unrepresentable rather than removed by a step that could regress. CR 122.1 +/// — a counter is a marker ON an object, so the pair IS the row key. +/// +/// PASS 1, the `∞` ANNOTATION, driven from the registered target set: +/// +/// CR 122.1 + CR 110.1 + CR 122.2: a counter is a marker placed ON an object, a permanent is a +/// card or token ON THE BATTLEFIELD, and counters cease to exist when their bearer changes zones +/// — so an off-battlefield bearer carries no `∞` ANNOTATION. Only the annotation is gated this +/// way; a FINITE row for the same bearer may still survive the move (pass 2). +/// +/// CROSS-SEAT DEDUPE: the store is per-seat (`BTreeMap>`), so it dedupes +/// WITHIN a seat and never ACROSS seats. Two controllers whose accepted loops pump the same +/// (object, counter) pair each hold their own entry, and emitting both produced a duplicate row — +/// two identical pills sharing one React key, since every render site keys on the counter type +/// alone. The rows are byte-identical (`count` is keyed only by `(id, ct)`, with no seat input), +/// so collapsing at the source is a deduplication, not a choice of whose row wins. Flattening into +/// a `BTreeSet` keeps the wire order the single-seat case already had: sorted by +/// `(ObjectId, CounterType)`. +/// +/// The `unwrap_or(0)` is the PROJECTOR/PRODUCER convention, not a rule: it mirrors +/// `analysis::resource::grown_beneficial_counter_deltas`, so both sides share one definition of +/// "absent". WHY A `count: 0` ROW EXISTS: the pair is derived by diffing a SIMULATED one-period +/// frame against a clone of the LIVE state (`game::engine::drive_one_period_frames`), so a pair +/// growing `0 -> 1` across that period is registered while the live object carries none. Dropping +/// it would trade a display over-KEEP for an over-DROP, which this subsystem's stated polarity +/// forbids (see [`UnboundedFamilyView`]). +/// +/// PASS 2, the FINITE rows, driven from the objects themselves: +/// +/// Admission is `types::counter::positive_counter_entries` — CR 122.1, an internal map entry with +/// count zero is not a marker. There is NO zone gate: CR 122.2 already makes counters cease to +/// exist on a zone change and `zones::counters_persist_on_move` is the SINGLE authority for the +/// CR 113.6b carve-out that overrides it, so a gate here would be a second, weaker copy of that +/// rule — one that would silently delete a persisting bearer's graveyard pills and a suspended +/// card's time counters in exile (CR 702.62b). The projection defers to that authority instead of +/// re-deriving it. Collecting into a `BTreeMap` is what makes the intra-class order +/// `CounterType`'s declaration `Ord`, which is the order `counter_map_serde` already puts +/// `objects[*].counters` on the wire in. +fn counter_display_views(state: &GameState) -> HashMap { + let mut display: HashMap = HashMap::new(); + let mut annotated: HashMap> = HashMap::new(); + + let targets: BTreeSet<&(ObjectId, CounterType)> = + state.unbounded_counter_targets.values().flatten().collect(); + for (id, ct) in targets { + if !state.battlefield.contains(id) { + continue; + } + let object = state.objects.get(id); + let count = object + .and_then(|obj| obj.counters.get(ct).copied()) + .unwrap_or(0); + // A battlefield id with no `state.objects` entry cannot answer the CR 306.5c question, so + // the row goes to the pill strip — matching what this channel published before it widened. + push_counter_row( + display.entry(*id).or_default(), + object.is_some_and(|obj| obj.loyalty.is_some()), + CounterRowView { + counter: ct.clone(), + count, + magnitude: CounterMagnitude::Unbounded, + }, + ); + annotated.entry(*id).or_default().insert(ct); + } + + for (id, object) in &state.objects { + let annotated_here = annotated.get(id); + let finite: BTreeMap<&CounterType, u32> = positive_counter_entries(&object.counters) + .filter(|(counter, _)| !annotated_here.is_some_and(|set| set.contains(counter))) + .collect(); + for (counter, count) in finite { + push_counter_row( + display.entry(*id).or_default(), + object.loyalty.is_some(), + CounterRowView { + counter: counter.clone(), + count, + magnitude: CounterMagnitude::Finite, + }, + ); + } + } + + display +} + /// Derive a viewer-safe presentation from `filtered_state`, retaining only the /// decision-authority projection from the pre-filter rules state. This keeps /// rules state pure and makes repeated filtering idempotent. @@ -5551,4 +5646,386 @@ mod tests { assert_eq!(wire["derived"]["unique_authorized_submitter"], 1); } } + + // ---- `counter_display_views`: the COMPLETE per-object counter projection ---- + + fn make_counter_bearer( + state: &mut GameState, + card: u64, + zone: Zone, + counters: &[(CounterType, u32)], + ) -> ObjectId { + let id = create_object( + state, + CardId(card), + PlayerId(0), + format!("Bearer {card}"), + zone, + ); + let obj = state + .objects + .get_mut(&id) + .expect("the bearer was just created"); + for (counter, count) in counters { + obj.counters.insert(counter.clone(), *count); + } + id + } + + /// "Counters remain on this permanent as it moves to any zone other than a player's hand or + /// library" (Skullbriar / Me, the Immortal). Rig mirrored from `zones`' own + /// `CountersPersistAcrossZones` building-block tests, so this exercises the shipping shape. + fn grant_counter_persistence(state: &mut GameState, id: ObjectId) { + state + .objects + .get_mut(&id) + .expect("the bearer exists") + .static_definitions + .push( + crate::types::ability::StaticDefinition::new( + StaticMode::CountersPersistAcrossZones { + excluded_zones: vec![Zone::Hand, Zone::Library], + }, + ) + .affected(TargetFilter::SelfRef) + .active_zones(vec![ + Zone::Battlefield, + Zone::Graveyard, + Zone::Exile, + Zone::Command, + Zone::Stack, + ]), + ); + } + + /// CR 113.6b + CR 122.2: a FINITE row is NOT battlefield-gated. `zones::counters_persist_on_move` + /// is the single authority for which counters survive a zone change; `counter_display_views` + /// defers to it and never re-derives a zone rule of its own. Arm C is what proves the survival + /// is that authority and not a zone-blind projection — without it, a projection that never + /// cleared anything would pass arm B. + #[test] + fn counter_rows_survive_a_bearer_that_keeps_its_counters_off_the_battlefield() { + let mut state = GameState::new(FormatConfig::standard(), 2, 42); + let keeper = make_counter_bearer( + &mut state, + 1, + Zone::Battlefield, + &[(CounterType::Plus1Plus1, 3)], + ); + grant_counter_persistence(&mut state, keeper); + let plain = make_counter_bearer( + &mut state, + 2, + Zone::Battlefield, + &[(CounterType::Plus1Plus1, 3)], + ); + + let expected = ObjectCounterDisplay { + pills: vec![CounterRowView { + counter: CounterType::Plus1Plus1, + count: 3, + magnitude: CounterMagnitude::Finite, + }], + loyalty: None, + }; + + // ARM A — MATCHED POSITIVE: on the battlefield both bearers render the same finite pill, + // so arm C's later absence is a measured transition rather than a fixture that never had + // a row. + let before = derive_views(&state, None); + assert_eq!( + before.counter_display.get(&keeper), + Some(&expected), + "arm A: a battlefield bearer's own positive counters are finite pills" + ); + assert_eq!( + before.counter_display.get(&plain), + Some(&expected), + "arm A: the paired negative's bearer starts with the identical row" + ); + + let mut events = Vec::new(); + crate::game::zones::move_to_zone(&mut state, keeper, Zone::Graveyard, &mut events); + crate::game::zones::move_to_zone(&mut state, plain, Zone::Graveyard, &mut events); + let after = derive_views(&state, None); + + // ARM B — THE ANSWER: CR 113.6b kept the counters, so the row must keep rendering. + assert_eq!( + after.counter_display.get(&keeper), + Some(&expected), + "arm B: a bearer whose counters persist off the battlefield keeps its FINITE row — \ + gating the finite pass on battlefield membership reds exactly here" + ); + // ARM C — PAIRED NEGATIVE: the plain bearer's counters ceased to exist (CR 122.2), so it + // has no row at all. + assert!( + !after.counter_display.contains_key(&plain), + "arm C: an ordinary bearer's counters ceased to exist on the move, so the projection \ + must invent no row; got {:?}", + after.counter_display.get(&plain) + ); + } + + /// The `∞` ANNOTATION leads its object's rows and SHADOWS the finite row for the same pair — + /// exactly two rows, never three. CR 122.1: the `(object, counter)` pair is the row key, so a + /// duplicate pill is unrepresentable rather than deduplicated. + #[test] + fn unbounded_row_leads_and_shadows_the_same_pair() { + let charge = CounterType::Generic("charge".to_string()); + let mut state = GameState::new(FormatConfig::standard(), 2, 42); + let bearer = make_counter_bearer( + &mut state, + 1, + Zone::Battlefield, + &[(charge.clone(), 4), (CounterType::Plus1Plus1, 2)], + ); + state.register_unbounded_counter_targets(PlayerId(0), vec![(bearer, charge.clone())]); + + assert_eq!( + derive_views(&state, None).counter_display.get(&bearer), + Some(&ObjectCounterDisplay { + pills: vec![ + CounterRowView { + counter: charge, + count: 4, + magnitude: CounterMagnitude::Unbounded, + }, + CounterRowView { + counter: CounterType::Plus1Plus1, + count: 2, + magnitude: CounterMagnitude::Finite, + }, + ], + loyalty: None, + }), + "the registered pair renders ONCE, annotated and leading; the unregistered counter \ + follows as a finite row. A third row is a shadow regression; a flipped order is a \ + salience regression" + ); + } + + /// CR 122.1: an internal map entry with count zero is not a marker, so it is not a finite row. + /// An `Unbounded` row's existence comes from the `∞` store instead, so a zero-count one is + /// real. The two arms break under OPPOSITE mutations, so neither is satisfiable by weakening + /// the other. + #[test] + fn a_zero_count_entry_is_not_a_pill_but_a_zero_count_unbounded_pair_is() { + let charge = CounterType::Generic("charge".to_string()); + let finite_row = CounterRowView { + counter: CounterType::Plus1Plus1, + count: 1, + magnitude: CounterMagnitude::Finite, + }; + + let mut unmarked = GameState::new(FormatConfig::standard(), 2, 42); + let bearer = make_counter_bearer( + &mut unmarked, + 1, + Zone::Battlefield, + &[(charge.clone(), 0), (CounterType::Plus1Plus1, 1)], + ); + + // ARM 1 — dropping `positive_counter_entries` grows a row here. + assert_eq!( + derive_views(&unmarked, None).counter_display.get(&bearer), + Some(&ObjectCounterDisplay { + pills: vec![finite_row.clone()], + loyalty: None, + }), + "a zero-count map entry is not a marker, so it publishes no finite row" + ); + + // ARM 2 — the SAME map, the pair now registered: applying `positive_counter_entries` to + // the `∞` pass too would lose this row. + let mut marked = unmarked.clone(); + marked.register_unbounded_counter_targets(PlayerId(0), vec![(bearer, charge.clone())]); + assert_eq!( + derive_views(&marked, None).counter_display.get(&bearer), + Some(&ObjectCounterDisplay { + pills: vec![ + CounterRowView { + counter: charge, + count: 0, + magnitude: CounterMagnitude::Unbounded, + }, + finite_row, + ], + loyalty: None, + }), + "a registered pair the bearer carries none of is still a real row" + ); + } + + /// CR 306.5c speaks only of planeswalkers, so a `Loyalty` counter drives the TOTAL only on an + /// object that has a loyalty characteristic. On anything else, hiding the marker would be an + /// over-DROP — arm 2 is that hostile fixture, and it is a disclosed behavior change. + #[test] + fn loyalty_routes_to_the_total_only_when_the_object_has_one() { + let mut state = GameState::new(FormatConfig::standard(), 2, 42); + let walker = make_counter_bearer( + &mut state, + 1, + Zone::Battlefield, + &[(CounterType::Loyalty, 4)], + ); + state + .objects + .get_mut(&walker) + .expect("the walker exists") + .loyalty = Some(4); + let creature = make_counter_bearer( + &mut state, + 2, + Zone::Battlefield, + &[(CounterType::Loyalty, 1)], + ); + assert!( + state.objects[&creature].loyalty.is_none(), + "reach-guard: arm 2's object must have NO loyalty characteristic, or it is arm 1 again" + ); + + let views = derive_views(&state, None); + assert_eq!( + views.counter_display.get(&walker), + Some(&ObjectCounterDisplay { + pills: vec![], + loyalty: Some(CounterRowView { + counter: CounterType::Loyalty, + count: 4, + magnitude: CounterMagnitude::Finite, + }), + }), + "arm 1: a planeswalker's loyalty counters drive the TOTAL, never a stray pill" + ); + assert_eq!( + views.counter_display.get(&creature), + Some(&ObjectCounterDisplay { + pills: vec![CounterRowView { + counter: CounterType::Loyalty, + count: 1, + magnitude: CounterMagnitude::Finite, + }], + loyalty: None, + }), + "arm 2: partitioning on the counter TYPE alone would hide this marker entirely" + ); + } + + /// The cross-language discriminator `tsc` cannot see: the TS mirror types `magnitude` as + /// optional, so an inverted `skip_serializing_if` would make every client row read `Finite` + /// with no type error anywhere. + #[test] + fn finite_magnitude_is_omitted_on_the_wire_and_unbounded_is_not() { + let finite = CounterRowView { + counter: CounterType::Plus1Plus1, + count: 2, + magnitude: CounterMagnitude::Finite, + }; + let unbounded = CounterRowView { + counter: CounterType::Plus1Plus1, + count: 2, + magnitude: CounterMagnitude::Unbounded, + }; + + let finite_wire = serde_json::to_value(&finite).expect("the finite row serializes"); + assert!( + finite_wire.get("magnitude").is_none(), + "the dominant case stays off the wire, got {finite_wire}" + ); + let unbounded_wire = serde_json::to_value(&unbounded).expect("the ∞ row serializes"); + assert_eq!( + unbounded_wire.get("magnitude"), + Some(&serde_json::json!("Unbounded")), + "the exceptional case is always written, got {unbounded_wire}" + ); + + assert_eq!( + serde_json::from_value::(finite_wire).expect("finite round-trip"), + finite, + "an absent `magnitude` deserializes back to the serde default" + ); + assert_eq!( + serde_json::from_value::(unbounded_wire).expect("∞ round-trip"), + unbounded, + "the ∞ annotation survives a round-trip" + ); + } + + /// WHY THIS TEST EXISTS. `counter_display` projects EVERY object, including objects `hide_card` + /// redacts — six call sites in `filter_state_for_viewer`, of which face-down exile (CR 406.3) + /// can hold a counter-bearing object per `zones::counters_persist_on_move`. That widening + /// publishes nothing new ONLY because `GameObject`'s `counters` is serialized unconditionally + /// and `hide_card` does not clear it, so the projection is a pure function of data already on + /// the same wire. Nothing in either function states that dependency. Clear `counters` in + /// `hide_card`, or gate its serialization on anything that can omit a POPULATED map, and the + /// projection silently becomes a real information leak — this test is what turns that into a + /// red build. + /// + /// A fidelity note, not a leak: `hide_card` DOES clear `loyalty`, so on a redacted object a + /// `Loyalty` counter routes to `pills` rather than to the total. That is still zero new + /// information — arm 4 is exactly the assertion that a client reading the same filtered + /// envelope computes the identical partition. + #[test] + fn counter_display_publishes_nothing_a_viewer_cannot_already_read() { + let mut state = GameState::new(FormatConfig::standard(), 2, 42); + let hidden = create_object( + &mut state, + CardId(1), + PlayerId(0), + "Exiled Bearer".to_string(), + Zone::Exile, + ); + { + let obj = state.objects.get_mut(&hidden).expect("the bearer exists"); + obj.face_down = true; + obj.counters.insert(CounterType::Plus1Plus1, 2); + } + let viewer = PlayerId(1); + let filtered = crate::game::visibility::filter_state_for_viewer(&state, viewer); + + // ARM 1 — REACH-GUARD (matched positive). Without it, arms 2-4 could pass on an + // unredacted object and prove nothing. Compared against the original name rather than the + // private redaction constant. + assert_ne!( + filtered.objects[&hidden].name, state.objects[&hidden].name, + "reach-guard: `hide_card` must really have redacted this face-down exiled card in \ + this frame, or this test is measuring an unredacted object" + ); + + // ARM 2 — THE PIN: `hide_card` does not clear counters. + assert_eq!( + filtered.objects[&hidden].counters, state.objects[&hidden].counters, + "`hide_card` must leave the counter map alone; clearing it there turns the widened \ + projection into a leak" + ); + + // ARM 3 — THE PIN: the counter map really reaches the wire beside the projection. Any + // `skip_serializing_if` predicate that can omit a POPULATED map reds here. + let wire = serde_json::to_value(&filtered.objects[&hidden]) + .expect("the filtered object serializes"); + assert_eq!( + wire["counters"]["P1P1"], + serde_json::json!(2), + "the redacted object still carries its counters on the same wire the projection \ + rides, got {wire}" + ); + + // ARM 4 — THE CLAIM: the projection is recomputable from that same envelope, so it + // publishes nothing new. + assert_eq!( + derive_filtered_views(&state, &filtered, Some(viewer)) + .counter_display + .get(&hidden), + Some(&ObjectCounterDisplay { + pills: vec![CounterRowView { + counter: CounterType::Plus1Plus1, + count: 2, + magnitude: CounterMagnitude::Finite, + }], + loyalty: None, + }), + "the rows are exactly what a client rebuilds from the filtered object's counters, its \ + loyalty, the battlefield set and the `∞` store — zero new information" + ); + } } diff --git a/crates/engine/src/types/game_state.rs b/crates/engine/src/types/game_state.rs index 1b7a874c3c..7a1555f589 100644 --- a/crates/engine/src/types/game_state.rs +++ b/crates/engine/src/types/game_state.rs @@ -3567,9 +3567,10 @@ pub enum PersistentAxisMaterialization { /// counter target to its axis, with exactly four production call sites: `scheduled_collapse_axes` /// and `clear_collapsed_materializations`' surviving-target guard (twice) in this file, plus /// `game::derived_views::object_growth_backing`, which derives each registered pair's own axis to -/// decide whether THIS axis still has live board backing. The ∞ counter-PILL projection in -/// `game::derived_views` is NOT one of them — it projects the battlefield-surviving entries of -/// `unbounded_counter_targets` directly and never maps them to an axis. +/// decide whether THIS axis still has live board backing. The counter-DISPLAY projection in +/// `game::derived_views` is NOT one of them — `counter_display_views` unions the +/// BATTLEFIELD-SURVIVING entries of `unbounded_counter_targets` (as the ∞ ANNOTATION) with every +/// object's own positive counters (as `Finite` rows, in every zone), and maps neither to an axis. /// /// LIVE RE-DERIVATION — DELIBERATE DISPLAY-ONLY TOLERANCE. The class is read from the /// object as it stands NOW, not snapshotted at accept. `state.objects` retains an object @@ -14514,8 +14515,9 @@ declare_game_state! { /// Re-derived once at loop materialization by /// `game::engine::current_period_counter_growth` (drive one period on a clone, /// diff beneficial counters) — the SAME single derivation the batched-collapse δ - /// stash carries, projected to `(object, counter)` — and projected again to - /// `DerivedViews::unbounded_counters`. Written ONLY by + /// stash carries, projected to `(object, counter)` — and projected again, as the ∞ + /// ANNOTATION half only, into `DerivedViews::counter_display`, whose rows also exist + /// for objects this store never names. Written ONLY by /// `register_unbounded_counter_targets`. Cleared by TWO authorities: /// `clear_unbounded_loop` (whole-map, in lockstep with `unbounded_resources` / /// `unbounded_loop_pile`) and `clear_collapsed_materializations`, which filters @@ -25449,18 +25451,22 @@ mod tests { nothing about it has ended" ); let pills = - crate::game::derived_views::derive_views(&state, Some(PlayerId(0))).unbounded_counters; + crate::game::derived_views::derive_views(&state, Some(PlayerId(0))).counter_display; assert_eq!( pills.get(&bearer), - Some(&vec![crate::game::derived_views::UnboundedCounterView { - counter: CounterType::Plus1Plus1, - count: state - .objects - .get(&bearer) - .and_then(|o| o.counters.get(&CounterType::Plus1Plus1).copied()) - .unwrap_or(0), - }]), - "ARM2 pill projection: the surviving pair really reaches `unbounded_counters` — the \ + Some(&crate::game::derived_views::ObjectCounterDisplay { + pills: vec![crate::game::derived_views::CounterRowView { + counter: CounterType::Plus1Plus1, + count: state + .objects + .get(&bearer) + .and_then(|o| o.counters.get(&CounterType::Plus1Plus1).copied()) + .unwrap_or(0), + magnitude: crate::game::derived_views::CounterMagnitude::Unbounded, + }], + loyalty: None, + }), + "ARM2 pill projection: the surviving pair really reaches `counter_display` — the \ store half alone would not prove the display over-keep is visible, got {pills:?}" ); From 4af87da73f95b7531a3a6a12dc993ea7157aefe0 Mon Sep 17 00:00:00 2001 From: lgray Date: Sat, 8 Aug 2026 15:30:48 -0500 Subject: [PATCH 07/13] test(engine): pin the complete counter projection and its CR 122.2 gate Adds the four-arm CR 122.2 test driving a real accepted counter-growth loop: a populated row, the store still holding the pair after the bearer leaves the battlefield, the row gone, and the bearer's counter map empty. The store arm is what separates 'the projection gated it' from 'the store was wiped'. Retargets the boundary-collapse assertion rather than renaming it: that frame leaves the bearer on the battlefield carrying real counters, so the widened projection emits a finite row where the old channel emitted nothing. It is now the only test of the infinity-clears-while-the-finite-row-survives transition. Replaces the goldens' filter_map key list with an exact key-set assertion. The old form dropped a misspelled key silently and the drift compare then agreed with itself. Assisted-by: ClaudeCode:claude-opus-5 --- .../test/fixtures/unbounded-counter-wire.json | 17 +- .../tests/integration/combo_infinite_pile.rs | 33 +++- .../kilo_live_offer_from_real_dump.rs | 112 +++++++++--- .../tests/integration/loop_counter_growth.rs | 168 +++++++++++++++--- 4 files changed, 264 insertions(+), 66 deletions(-) diff --git a/client/src/test/fixtures/unbounded-counter-wire.json b/client/src/test/fixtures/unbounded-counter-wire.json index ada5ae66b5..153c39d0ee 100644 --- a/client/src/test/fixtures/unbounded-counter-wire.json +++ b/client/src/test/fixtures/unbounded-counter-wire.json @@ -1,11 +1,14 @@ { - "unbounded_counters": { - "405": [ - { - "count": 4, - "counter": "charge" - } - ] + "counter_display": { + "405": { + "pills": [ + { + "count": 4, + "counter": "charge", + "magnitude": "Unbounded" + } + ] + } }, "unbounded_families": [ { diff --git a/crates/engine/tests/integration/combo_infinite_pile.rs b/crates/engine/tests/integration/combo_infinite_pile.rs index 4c7c22deee..52ecadd780 100644 --- a/crates/engine/tests/integration/combo_infinite_pile.rs +++ b/crates/engine/tests/integration/combo_infinite_pile.rs @@ -246,16 +246,16 @@ fn real_4p_object_growth_accept_writes_infinite_pile() { // able to regenerate the client goldens with `UPDATE_WIRE_GOLDEN=1`, or the client-side half of // that probe (RP-1b, RP-2) is unreachable. An assert panic aborts the test. // - // DETERMINISM: `unbounded_counters` is a std `HashMap>` - // (derived_views.rs) — the VALUE is a row list, not a bare counter-type list — but - // `serde_json::Map` is BTreeMap-backed (serde_json has no `preserve_order` feature in this + // DETERMINISM: `counter_display` is a std `HashMap` + // (derived_views.rs) — the VALUE is a pre-partitioned row set, not a bare counter-type list — + // but `serde_json::Map` is BTreeMap-backed (serde_json has no `preserve_order` feature in this // workspace — see Cargo.lock), so `to_value` re-sorts every map key. Measured byte-identical // across independent test processes. No normalization needed. let wire = serde_json::to_value(&derived).expect("derived views serialize"); let golden: serde_json::Map = [ "unbounded_pile", "unbounded_resources", - "unbounded_counters", + "counter_display", "unbounded_families", ] .into_iter() @@ -285,6 +285,31 @@ fn real_4p_object_growth_accept_writes_infinite_pile() { "derive_views().unbounded_pile must equal the pile set (battlefield-filtered)" ); + // NON-VACUITY GUARD for the key list above, and it sits HERE — below the WRITE — under this + // emitter's own stated rule, because it reads `golden`, which is derived from `derived`. + // `filter_map` DROPS a name that matches no `DerivedViews` field, and the drift compare below + // then reads a committed file the same typo wrote — so both sides omit the channel and the + // compare agrees with itself. Asserting the exact key SET turns a mistyped name into a RED. + // `BTreeSet` so this does not depend on which container backs `serde_json::Map`. + // + // PER-FILE RESIDUAL, CLOSED BY THE PAIR: this frame legitimately carries no `counter_display`, + // and a name a frame never populates is indistinguishable from a mistyped one from inside that + // frame. `kilo_live_offer_from_real_dump`'s twin guard covers `counter_display` (and this file + // covers the `unbounded_pile` its frame lacks). The UNION of the two guards spans all four + // names ONLY while both arrays keep the same four — do not change one array without the other. + let channels: BTreeSet<&str> = golden.keys().map(String::as_str).collect(); + assert_eq!( + channels, + BTreeSet::from([ + "unbounded_families", + "unbounded_pile", + "unbounded_resources" + ]), + "the golden key list names a field `DerivedViews` does not have, or this frame stopped \ + carrying one it must: a mistyped name is dropped silently and the drift compare below \ + then agrees with itself. Check every name against `DerivedViews`." + ); + // Cross-seam wire pin, PART 2 — the drift COMPARE (see PART 1 for why it sits here). let committed: serde_json::Value = serde_json::from_str(&std::fs::read_to_string(path).expect("committed wire golden")) diff --git a/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs b/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs index f9f1ac63e3..ec929c9507 100644 --- a/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs +++ b/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs @@ -471,7 +471,7 @@ fn drive_to_collapse_boundary(state: &mut GameState) { /// loop marks Pentad Prism's charge counter as an unbounded DISPLAY target — so the frontend /// renders `∞` on that pill — WITHOUT mutating the real charge count. Composite of the new /// field write (`register_unbounded_counter_targets`), the derived-view projection -/// (`DerivedViews::unbounded_counters`), and the serde wire shape, all driven through the real +/// (`DerivedViews::counter_display`), and the serde wire shape, all driven through the real /// accept pipeline from the real 4p dump. /// /// REVERT-PROBE (measured, non-vacuous): deleting the `register_unbounded_counter_targets` @@ -483,7 +483,9 @@ fn drive_to_collapse_boundary(state: &mut GameState) { /// (display-only: the real count is untouched) HOLD BOTH WAYS. #[test] fn kilo_accept_marks_pentad_charge_as_unbounded_display_target() { - use engine::game::derived_views::{derive_views, DerivedViews, UnboundedCounterView}; + use engine::game::derived_views::{ + derive_views, CounterMagnitude, CounterRowView, DerivedViews, ObjectCounterDisplay, + }; use engine::types::counter::CounterType; let mut state = load_migrated_dump(); @@ -587,16 +589,16 @@ fn kilo_accept_marks_pentad_charge_as_unbounded_display_target() { // Where a pre-WRITE frame must be asserted, CAPTURE it into a local above and assert the local // below (see combo_infinite_pile.rs's declined-wire emitter). // - // DETERMINISM: `unbounded_counters` is a std `HashMap>` - // (derived_views.rs) — the VALUE is a row list, not a bare counter-type list — but - // `serde_json::Map` is BTreeMap-backed (serde_json has no `preserve_order` feature in this + // DETERMINISM: `counter_display` is a std `HashMap` + // (derived_views.rs) — the VALUE is a pre-partitioned row set, not a bare counter-type list — + // but `serde_json::Map` is BTreeMap-backed (serde_json has no `preserve_order` feature in this // workspace — see Cargo.lock), so `to_value` re-sorts every map key. Measured byte-identical // across independent test processes. No normalization needed. let wire = serde_json::to_value(&views).expect("derived views serialize"); let golden: serde_json::Map = [ "unbounded_pile", "unbounded_resources", - "unbounded_counters", + "counter_display", "unbounded_families", ] .into_iter() @@ -634,11 +636,15 @@ fn kilo_accept_marks_pentad_charge_as_unbounded_display_target() { row's `count` below is a NONZERO live value and not vacuously 0; got {pentad_charge}" ); assert_eq!( - views.unbounded_counters.get(&PENTAD), - Some(&vec![UnboundedCounterView { - counter: charge.clone(), - count: pentad_charge, - }]), + views.counter_display.get(&PENTAD), + Some(&ObjectCounterDisplay { + pills: vec![CounterRowView { + counter: charge.clone(), + count: pentad_charge, + magnitude: CounterMagnitude::Unbounded, + }], + loyalty: None, + }), "the ∞ charge pill stays projected while the collapse is merely SCHEDULED, and it carries \ the LIVE count so the display never has to join back to `objects[..].counters`" ); @@ -661,6 +667,31 @@ fn kilo_accept_marks_pentad_charge_as_unbounded_display_target() { views.unbounded_families ); + // NON-VACUITY GUARD for the key list above, and it sits HERE — below the WRITE — under this + // emitter's own stated rule, because it reads `golden`, which is derived from `views`. + // `filter_map` DROPS a name that matches no `DerivedViews` field, and the drift compare below + // then reads a committed file the same typo wrote — so both sides omit the channel and the + // compare agrees with itself. Asserting the exact key SET turns a mistyped name into a RED. + // `BTreeSet` so this does not depend on which container backs `serde_json::Map`. + // + // PER-FILE RESIDUAL, CLOSED BY THE PAIR: this frame legitimately carries no `unbounded_pile`, + // and a name a frame never populates is indistinguishable from a mistyped one from inside that + // frame. `combo_infinite_pile`'s twin guard covers `unbounded_pile` (and this file covers the + // `counter_display` its frame lacks). The UNION of the two guards spans all four names ONLY + // while both arrays keep the same four — do not change one array without the other. + let channels: std::collections::BTreeSet<&str> = golden.keys().map(String::as_str).collect(); + assert_eq!( + channels, + std::collections::BTreeSet::from([ + "counter_display", + "unbounded_families", + "unbounded_resources", + ]), + "the golden key list names a field `DerivedViews` does not have, or this frame stopped \ + carrying one it must: a mistyped name is dropped silently and the drift compare below \ + then agrees with itself. Check every name against `DerivedViews`." + ); + // Cross-seam wire pin, PART 2 — the drift COMPARE (see PART 1 for why it sits here). let committed: serde_json::Value = serde_json::from_str(&std::fs::read_to_string(path).expect("committed wire golden")) @@ -675,22 +706,26 @@ fn kilo_accept_marks_pentad_charge_as_unbounded_display_target() { // the wire, and survives a round-trip; an EMPTY derived view omits it (skip_serializing_if). let json = serde_json::to_string(&views).expect("derived views serialize"); assert!( - json.contains("unbounded_counters"), - "the populated ∞-counter channel is present on the wire" + json.contains("counter_display"), + "the populated counter-display channel is present on the wire" ); let round: DerivedViews = serde_json::from_str(&json).expect("derived views round-trip"); assert_eq!( - round.unbounded_counters.get(&PENTAD), - Some(&vec![UnboundedCounterView { - counter: charge, - count: pentad_charge, - }]), - "the ∞ counter channel survives a serde round-trip, count included" + round.counter_display.get(&PENTAD), + Some(&ObjectCounterDisplay { + pills: vec![CounterRowView { + counter: charge, + count: pentad_charge, + magnitude: CounterMagnitude::Unbounded, + }], + loyalty: None, + }), + "the counter-display channel survives a serde round-trip, count and magnitude included" ); let empty_json = serde_json::to_string(&DerivedViews::default()).expect("empty derived views serialize"); assert!( - !empty_json.contains("unbounded_counters"), + !empty_json.contains("counter_display"), "the field is omitted (skip_serializing_if) when empty" ); } @@ -774,9 +809,9 @@ fn departed_counter_target_drops_its_pill_but_keeps_its_row_and_store_entry() { let before = derive_views(&state, None); assert!( before - .unbounded_counters + .counter_display .get(&PENTAD) - .is_some_and(|rows| rows.iter().any(|r| r.counter == charge)), + .is_some_and(|display| display.pills.iter().any(|r| r.counter == charge)), "reach-guard: the pill is on the wire before the departure" ); let row_axes_before: Vec<_> = before.unbounded_resources.iter().map(|r| r.axis).collect(); @@ -800,9 +835,9 @@ fn departed_counter_target_drops_its_pill_but_keeps_its_row_and_store_entry() { // (3) THE PILL IS GONE — departure is an object event and the pill has object identity. assert!( - !after.unbounded_counters.contains_key(&PENTAD), + !after.counter_display.contains_key(&PENTAD), "(3) the departed target's ∞ pill must leave the wire, got {:?}", - after.unbounded_counters + after.counter_display ); // (4) THE ROW REMAINS — because the collapse was ACCEPTED (CR 732.2c), not because nothing @@ -876,7 +911,9 @@ fn departed_counter_target_drops_its_pill_but_keeps_its_row_and_store_entry() { /// (priority advances straight into combat) ⇒ the boundary reach-guard (2) FLIPS to a panic. #[test] fn kilo_accept_collapses_at_boundary_to_exactly_n_counters() { - use engine::game::derived_views::derive_views; + use engine::game::derived_views::{ + derive_views, CounterMagnitude, CounterRowView, ObjectCounterDisplay, + }; use engine::types::counter::CounterType; const N: u32 = 5; @@ -956,10 +993,29 @@ fn kilo_accept_collapses_at_boundary_to_exactly_n_counters() { "the collapsed ∞ counter target is cleared for P0, got {:?}", state.unbounded_counter_targets.get(&P0) ); + // (5b) THE ∞ ANNOTATION CLEARS BUT THE FINITE ROW SURVIVES, on an object that never left the + // battlefield: `clear_collapsed_materializations` drops the registered pair, and the finite + // pass in `counter_display_views` keeps publishing the now-real count — so the pill renders + // the real number rather than `∞`, and it does not vanish. + let display = derive_views(&state, None) + .counter_display + .get(&PENTAD) + .cloned() + .expect( + "after the collapse Pentad still renders a FINITE charge row — the `∞` ANNOTATION is \ + what `clear_collapsed_materializations` clears, not the row itself", + ); assert_eq!( - derive_views(&state, None).unbounded_counters.get(&PENTAD), - None, - "the derived ∞-counter view no longer projects Pentad after the collapse" + display, + ObjectCounterDisplay { + pills: vec![CounterRowView { + counter: charge.clone(), + count: baseline + N, + magnitude: CounterMagnitude::Finite, + }], + loyalty: None, + }, + "the collapsed pair renders as EXACTLY one FINITE row carrying the real collapsed count" ); // (6) The boundary protocol closed cleanly back to ordinary priority (CR 800.4a). diff --git a/crates/engine/tests/integration/loop_counter_growth.rs b/crates/engine/tests/integration/loop_counter_growth.rs index a254d18ffe..709bcd24d6 100644 --- a/crates/engine/tests/integration/loop_counter_growth.rs +++ b/crates/engine/tests/integration/loop_counter_growth.rs @@ -17,7 +17,7 @@ //! prompt. use engine::analysis::resource::{CounterClass, ResourceAxis}; -use engine::game::derived_views::UnboundedCounterView; +use engine::game::derived_views::{CounterMagnitude, CounterRowView, ObjectCounterDisplay}; use engine::game::scenario::{GameRunner, GameScenario}; use engine::types::ability::AbilityKind; use engine::types::actions::GameAction; @@ -460,14 +460,18 @@ fn plus_one_counter_growth_registers_its_infinity_display_target() { below is vacuous; got {live}" ); assert_eq!( - views.unbounded_counters.get(&rider), - Some(&vec![UnboundedCounterView { - counter: CounterType::Plus1Plus1, - count: live, - }]), + views.counter_display.get(&rider), + Some(&ObjectCounterDisplay { + pills: vec![CounterRowView { + counter: CounterType::Plus1Plus1, + count: live, + magnitude: CounterMagnitude::Unbounded, + }], + loyalty: None, + }), "(4)/(A-3) the +1/+1 ∞ pill must reach the wire carrying the rider's LIVE count \ ({live}), got {:?}", - views.unbounded_counters + views.counter_display ); } @@ -573,14 +577,18 @@ fn plus_one_counter_growth_registers_a_target_the_bearer_does_not_yet_carry() { // `objects[id].counters.contains_key(ct)` it would be absent entirely. let views = derive_views(runner.state(), None); assert_eq!( - views.unbounded_counters.get(&rider), - Some(&vec![UnboundedCounterView { - counter: CounterType::Plus1Plus1, - count: 0, - }]), + views.counter_display.get(&rider), + Some(&ObjectCounterDisplay { + pills: vec![CounterRowView { + counter: CounterType::Plus1Plus1, + count: 0, + magnitude: CounterMagnitude::Unbounded, + }], + loyalty: None, + }), "(A-1) a registered pair the bearer carries NONE of must still publish a renderable row \ with `count: 0`, got {:?}", - views.unbounded_counters + views.counter_display ); // (A-2) …and it survives to the real adapter-visible envelope, not just the in-process view. @@ -588,7 +596,7 @@ fn plus_one_counter_growth_registers_a_target_the_bearer_does_not_yet_carry() { .expect("the client envelope serializes"); let rows = envelope .get("derived") - .and_then(|d| d.get("unbounded_counters")) + .and_then(|d| d.get("counter_display")) .and_then(|c| c.get(rider.0.to_string())) .unwrap_or_else(|| panic!("(A-2) no wire rows for the bearer; envelope={envelope}")); // The `"P1P1"` key is the serde authority's spelling (`CounterType::as_str`), written as a @@ -596,7 +604,9 @@ fn plus_one_counter_growth_registers_a_target_the_bearer_does_not_yet_carry() { // so deriving it from the enum here would make the assertion agree with itself. assert_eq!( rows, - &serde_json::json!([{ "counter": "P1P1", "count": 0 }]), + &serde_json::json!({ + "pills": [{ "counter": "P1P1", "count": 0, "magnitude": "Unbounded" }] + }), "(A-2) the wire row the frontend actually reads must carry `count: 0`" ); @@ -713,21 +723,125 @@ fn two_seats_collapse_the_shared_pair_and_keep_the_distinct_one() { // `(ObjectId, CounterType)` — `Plus1Plus1` is declared before `Generic`, so it comes first. let views = derive_views(&state, None); assert_eq!( - views.unbounded_counters.get(&bearer), - Some(&vec![ - UnboundedCounterView { - counter: CounterType::Plus1Plus1, - count: 3, - }, - UnboundedCounterView { - counter: charge.clone(), - count: 7, - }, - ]), + views.counter_display.get(&bearer), + Some(&ObjectCounterDisplay { + pills: vec![ + CounterRowView { + counter: CounterType::Plus1Plus1, + count: 3, + magnitude: CounterMagnitude::Unbounded, + }, + CounterRowView { + counter: charge.clone(), + count: 7, + magnitude: CounterMagnitude::Unbounded, + }, + ], + loyalty: None, + }), "the (object, counter) pair held by two seats must project ONE row carrying the live \ count (duplicates collide on the counter-type React key at every render site), while a \ DISTINCT pair on the same object must survive that collapse in `(ObjectId, CounterType)` \ order. Got {:?}", - views.unbounded_counters + views.counter_display + ); +} + +/// CR 122.2 + CR 110.1 — THE `∞` ROW DIES WITH ITS BEARER WHILE THE STORE DOES NOT. +/// +/// The widened projection is not battlefield-gated for FINITE rows (see +/// `derived_views`' `counter_rows_survive_a_bearer_that_keeps_its_counters_off_the_battlefield`), +/// so the question this fixture answers is the OTHER half: an ordinary bearer's counters cease to +/// exist when it changes zones (CR 122.2) and it stops being a permanent (CR 110.1), so NEITHER +/// magnitude may publish a row — even though the `∞` store still names the pair. +/// +/// THE SPECIFIC REGRESSION THIS PINS. The counter pass must NOT gain an +/// `!accepted_axes.contains_key(..)` KEEP conjunct copied from the axis-row loop: that would make +/// the accepted-collapse SCHEDULE decide a row's EXISTENCE, which the mirror invariant in +/// `derive_views` forbids. Arm 3 reds if it does. +/// +/// Arm ORDER matters. Arm 1 asserts a POPULATED row in the same run, so arm 3's emptiness is a +/// measured transition rather than a fixture that never had rows. Arm 2 separates "the projection +/// gated it" from "the store was wiped" — without it arm 3 has two explanations and proves +/// neither. Arm 4 separates "the `∞` gate fired" from "the finite pass would have emitted a row +/// and something else suppressed it": it proves `zones::move_to_zone`, the single authority, did +/// the clearing and the projection merely declined to invent rows. +#[test] +fn unbounded_counter_row_dies_with_its_bearer_but_the_store_does_not() { + use engine::analysis::loop_check::ShortcutResponse; + use engine::game::derived_views::derive_views; + use engine::game::zones::move_to_zone; + use engine::types::zones::Zone; + + let (mut runner, rider) = drive_plus1_token_engine_to_declared_offer(); + + while matches!( + runner.state().waiting_for, + WaitingFor::RespondToShortcut { .. } + ) { + runner + .act(GameAction::RespondToShortcut { + response: ShortcutResponse::Accept, + }) + .expect("the opponent accepts"); + } + + // (1) POSITIVE CONTROL — matched, and FIRST so a regression on the negative cannot skip it. + let live = plus1_of(&runner, rider); + assert!( + live >= 1, + "(1) reach-guard: the bearer must carry counters here, or the populated row below is \ + vacuous; got {live}" + ); + assert_eq!( + derive_views(runner.state(), None) + .counter_display + .get(&rider), + Some(&ObjectCounterDisplay { + pills: vec![CounterRowView { + counter: CounterType::Plus1Plus1, + count: live, + magnitude: CounterMagnitude::Unbounded, + }], + loyalty: None, + }), + "(1) the accepted pair really publishes an ∞ row before the departure" + ); + + // (2) REACH-GUARD / THE DISCRIMINATOR: the departure happens through the production + // chokepoint, and the STORE keeps the pair — only the projection filters. + let mut events: Vec = Vec::new(); + move_to_zone(runner.state_mut(), rider, Zone::Graveyard, &mut events); + assert!( + !runner.state().battlefield.contains(&rider), + "(2) reach-guard: the departure really happened" + ); + assert!( + runner + .state() + .unbounded_counter_targets + .get(&P0) + .is_some_and(|pairs| pairs.contains(&(rider, CounterType::Plus1Plus1))), + "(2) the STORE must still hold the departed pair — the CR 500.5 boundary collapse reads \ + it — so arm 3 can only be explained by the projection's gate, got {:?}", + runner.state().unbounded_counter_targets + ); + + // (3) THE ANSWER. + assert_eq!( + derive_views(runner.state(), None) + .counter_display + .get(&rider), + None, + "(3) the bearer is no longer a permanent and its counters ceased to exist, so no row of \ + either magnitude may be published" + ); + + // (4) THE POLARITY GUARD. + assert!( + runner.state().objects[&rider].counters.is_empty(), + "(4) `move_to_zone` — the single authority — is what cleared the counters; the \ + projection merely declined to invent rows. Got {:?}", + runner.state().objects[&rider].counters ); } From 4605d972120bf1cbdd20f4db563d31ca5b0b5068 Mon Sep 17 00:00:00 2001 From: lgray Date: Sat, 8 Aug 2026 15:30:49 -0500 Subject: [PATCH 08/13] fix(client): render the engine's counter projection instead of joining it The hook joined the engine channel with GameObject.counters, filtered entries, deduplicated them with a Set, ordered the result and assigned the unbounded display interpretation - a second, incomplete authority for what a permanent displays. It now reads the engine's rows and nothing else. Deletes the obj.counters fallback deliberately: a state envelope missing derived now renders no pills at all, where it previously still rendered the finite half. Restoring a fallback would restore the authority this deletes. Assisted-by: ClaudeCode:claude-opus-5 --- client/src/adapter/types.ts | 56 ++++++++----- client/src/components/board/PermanentCard.tsx | 27 +++--- .../board/__tests__/PermanentCard.test.tsx | 63 +++++++++++--- client/src/components/card/ArtCropCard.tsx | 27 +++--- client/src/components/card/CardPreview.tsx | 21 +++-- .../card/__tests__/ArtCropCard.test.tsx | 62 +++++++++++++- .../card/__tests__/CardPreview.test.tsx | 48 +++++++++-- client/src/hooks/useCounterDisplay.ts | 66 +++++++++++++++ client/src/hooks/useUnboundedCounterRows.ts | 83 ------------------- .../src/viewmodel/__tests__/cardProps.test.ts | 17 +--- .../__tests__/unboundedWireSeam.test.ts | 42 ++++++---- client/src/viewmodel/cardProps.ts | 4 - 12 files changed, 315 insertions(+), 201 deletions(-) create mode 100644 client/src/hooks/useCounterDisplay.ts delete mode 100644 client/src/hooks/useUnboundedCounterRows.ts diff --git a/client/src/adapter/types.ts b/client/src/adapter/types.ts index 27dce777f5..384c663cdc 100644 --- a/client/src/adapter/types.ts +++ b/client/src/adapter/types.ts @@ -2718,9 +2718,12 @@ export interface UnboundedFamilyView { state: FamilyCollapseState; } +/** Mirrors `engine::game::derived_views::CounterMagnitude`. Absent on the wire ⇒ `"Finite"`. */ +export type CounterMagnitude = "Finite" | "Unbounded"; + /** - * One renderable `∞` counter row on one object. Mirrors - * `engine::game::derived_views::UnboundedCounterView`. + * One renderable counter row on one object. Mirrors + * `engine::game::derived_views::CounterRowView`. * * `counter` matches the object's `counters` map key (`CounterType`'s serde spelling — e.g. * `"charge"`, `"P1P1"`). `count` is the object's LIVE count and is engine-supplied because a row @@ -2728,9 +2731,24 @@ export interface UnboundedFamilyView { * registered while the object still carries none, so the count is `0` and there is nothing to join * back to. Re-deriving it here would also be the FE inferring game state. */ -export interface UnboundedCounterView { +export interface CounterRowView { counter: string; count: number; + magnitude?: CounterMagnitude; +} + +/** + * Every counter row one object renders, PRE-PARTITIONED by the engine. Mirrors + * `engine::game::derived_views::ObjectCounterDisplay`. + * + * CR 306.5c: `loyalty` is the loyalty TOTAL row for an object that has a loyalty characteristic + * (loyalty IS its loyalty-counter count); everything else is a `pills` row, including a loyalty + * counter on an object with no loyalty. Loyalty ABILITY COST badges are never unbounded (CR 606.4 + * — a cost is a number of loyalty counters to pay, not a total). + */ +export interface ObjectCounterDisplay { + pills?: CounterRowView[]; + loyalty?: CounterRowView; } /** Mirrors `engine::analysis::loop_check::WinKind` (unit variants → bare strings). */ @@ -2998,28 +3016,22 @@ export interface DerivedViews { */ unbounded_pile?: ObjectId[]; /** - * CR 732.2a / CR 701.34a: per-object `∞` counter channel — for each battlefield - * object (keyed by ObjectId-as-string), the engine-authored counter ROWS an accepted - * counter-growth loop pumps unboundedly. Covers the full beneficial materializable - * partition — `Generic` markers (charge, burden), `+1/+1`, loyalty, and defense — - * not `Generic` alone. - * - * SHAPE: each entry is a ROW, not a bare counter-type key. `counter` matches the - * object's `counters` map key (e.g. `"charge"`, `"P1P1"`); `count` is the object's - * live count, which is `0` when the loop pumps a counter the object does not yet - * carry. Render every row as `∞` (never `×N`). Never re-derive which counters are - * unbounded, and never infer a row's count from the object's `counters` map — a row - * may legitimately have no entry there. + * CR 122.1 + CR 732.2a: the COMPLETE per-object counter-display projection, keyed by + * ObjectId-as-string — every counter row every display surface renders, for every + * object that has one, in ANY zone (a Skullbriar-class permanent keeps its counters in + * the graveyard per CR 113.6b; a suspended card carries time counters in exile per + * CR 702.62b). * - * CR 306.5c: a `"loyalty"` row means the planeswalker's loyalty TOTAL is unbounded - * (loyalty IS its loyalty-counter count), so the total badge renders `∞`. Loyalty - * ABILITY COST badges are never unbounded (CR 606.4 — a cost is a number of loyalty - * counters to pay, not a total). + * CONTRACT FOR CONSUMERS: render `pills` in the order given; never sort, never filter, + * never read `obj.counters`; `magnitude` absent means `"Finite"`. The engine already + * dropped zero-count entries (CR 122.1), partitioned loyalty (CR 306.5c), deduplicated + * across seats, and ordered the rows (`∞` first, then `CounterType` order). * - * Empty/omitted when no counter-growth loop is active. Mirrors - * `engine::game::derived_views::DerivedViews::unbounded_counters`. + * An object with no renderable row is absent from this map; the whole field is omitted + * when no object has one. Mirrors + * `engine::game::derived_views::DerivedViews::counter_display`. */ - unbounded_counters?: Record; + counter_display?: Record; } /** Mirrors `engine::types::game_state::NextSpellModifier` (serde tag="type"). */ diff --git a/client/src/components/board/PermanentCard.tsx b/client/src/components/board/PermanentCard.tsx index 8616e1175c..5abc2aaf0a 100644 --- a/client/src/components/board/PermanentCard.tsx +++ b/client/src/components/board/PermanentCard.tsx @@ -14,7 +14,7 @@ import { useCardHover } from "../../hooks/useCardHover.ts"; import { useIsCompactHeight } from "../../hooks/useIsCompactHeight.ts"; import { useIsMobile } from "../../hooks/useIsMobile.ts"; import { useLongPress } from "../../hooks/useLongPress.ts"; -import { useUnboundedCounterRows } from "../../hooks/useUnboundedCounterRows.ts"; +import { isUnbounded, pillsOf, useCounterDisplay } from "../../hooks/useCounterDisplay.ts"; import { useGameStore } from "../../stores/gameStore.ts"; import { renderDescription } from "../../utils/description.ts"; import { usePreferencesStore } from "../../stores/preferencesStore.ts"; @@ -303,7 +303,7 @@ export const PermanentCard = memo(function PermanentCard({ const isCopiedPermanent = useGameStore((s) => (s.gameState?.derived?.copied_permanents ?? []).includes(objectId), ); - const unboundedCounterRows = useUnboundedCounterRows(objectId); + const counterDisplay = useCounterDisplay(objectId); const isManaPaymentPreviewSource = useGameStore((s) => s.manaPaymentPreviewSourceIds.includes(objectId), ); @@ -603,14 +603,9 @@ export const PermanentCard = memo(function PermanentCard({ ? undefined : gameObjects?.[String(temporaryCantBeBlockedSourceId)]?.name; - // Filter out loyalty counters — shown separately as the loyalty badge (which renders its - // own `∞` per CR 306.5c when the engine marks a loyalty row). - const counters = unboundedCounterRows.filter((row) => row.type !== "loyalty"); - // CR 306.5c: a planeswalker's loyalty IS its loyalty-counter count, so an engine `∞` - // loyalty row means the TOTAL is unbounded. - const isLoyaltyUnbounded = unboundedCounterRows.some( - (row) => row.type === "loyalty" && row.isUnbounded, - ); + // CR 306.5c: the engine already split the loyalty TOTAL out of the pill strip, so this site + // classifies nothing — it renders the rows it is given, in the order it is given them. + const counters = pillsOf(counterDisplay); // Tap rotation: 17deg in MTGA mode (or compact-height), 90deg in classic mode const tapBaseOpacity = (isCompactHeight || tapRotation === "mtga") && obj.tapped ? 0.85 : 1; @@ -926,7 +921,7 @@ export const PermanentCard = memo(function PermanentCard({ - {counters.map(({ type, count, isUnbounded }) => { + {counters.map((row) => { + const type = row.counter; const iconClass = counterIconClass(type); // CR 732.2a / CR 701.34a: an accepted counter-growth loop pumps this // counter unboundedly — render ∞ instead of the (still-finite) real count. + const unbounded = isUnbounded(row); return ( )} - {formatCounterType(type)} {isUnbounded ? "∞" : `x${count}`} + {formatCounterType(type)} {unbounded ? "∞" : `x${row.count}`} ); diff --git a/client/src/components/board/__tests__/PermanentCard.test.tsx b/client/src/components/board/__tests__/PermanentCard.test.tsx index 3516b2effb..bc5ef8a9db 100644 --- a/client/src/components/board/__tests__/PermanentCard.test.tsx +++ b/client/src/components/board/__tests__/PermanentCard.test.tsx @@ -340,13 +340,15 @@ describe("PermanentCard", () => { }); // CR 732.2a / CR 701.34a: an accepted counter-growth ∞ loop (Kilo proliferate → Pentad - // charge) marks the pumped counter in `derived.unbounded_counters`; the pill renders ∞ + // charge) annotates the pumped row in `derived.counter_display`; the pill renders ∞ // instead of the (still-finite) real count. Matched pair — the ONLY difference between the - // two cases is the presence of the engine mark, so it is the discriminator. + // two cases is the row's `magnitude`, so it is the discriminator. it("renders ∞ on a counter the engine marks as unbounded", () => { const gameState = makeState(); gameState.objects[1].counters = { charge: 4 }; - gameState.derived = { unbounded_counters: { 1: [{ counter: "charge", count: 4 }] } }; + gameState.derived = { + counter_display: { 1: { pills: [{ counter: "charge", count: 4, magnitude: "Unbounded" }] } }, + }; useGameStore.setState({ gameState, waitingFor: gameState.waiting_for }); const { container } = renderPermanent(); @@ -358,7 +360,8 @@ describe("PermanentCard", () => { it("renders the finite ×N count when the counter is not marked unbounded", () => { const gameState = makeState(); gameState.objects[1].counters = { charge: 4 }; - gameState.derived = {}; // no unbounded_counters mark + // `magnitude` omitted exactly as the engine omits the serde default. + gameState.derived = { counter_display: { 1: { pills: [{ counter: "charge", count: 4 }] } } }; useGameStore.setState({ gameState, waitingFor: gameState.waiting_for }); const { container } = renderPermanent(); @@ -367,6 +370,33 @@ describe("PermanentCard", () => { expect(container.textContent).not.toContain("∞"); }); + // THE NO-FALLBACK MATCHED PAIR. `counter_display` is the SINGLE authority: an object carrying + // real counters with no projection entry renders NO pill. This is the only test that catches a + // render site re-introducing `Object.entries(obj.counters)`, and it is worthless without its + // positive twin — alone it would also pass on a component that rendered nothing at all. + it("renders no pill for an object with counters but no projection entry", () => { + const gameState = makeState(); + gameState.objects[1].counters = { charge: 4 }; + gameState.derived = {}; // a frame that arrived without `derived.counter_display` + useGameStore.setState({ gameState, waitingFor: gameState.waiting_for }); + + const { container } = renderPermanent(); + + expect(container.textContent).not.toContain("x4"); + expect(container.textContent).not.toContain("∞"); + }); + + it("renders the pill for that SAME object once the projection carries it", () => { + const gameState = makeState(); + gameState.objects[1].counters = { charge: 4 }; + gameState.derived = { counter_display: { 1: { pills: [{ counter: "charge", count: 4 }] } } }; + useGameStore.setState({ gameState, waitingFor: gameState.waiting_for }); + + const { container } = renderPermanent(); + + expect(container.textContent).toContain("x4"); + }); + // THE `0 -> 1` ROW, at the render layer. The engine registers a pumped pair while the // object carries NONE of that counter, so the row's `count` is 0 and there is no entry in // `obj.counters` to join back to. Before the channel published rows, this pill could not be @@ -379,7 +409,16 @@ describe("PermanentCard", () => { it("renders ∞ for a marked counter the object does not yet carry (count 0)", () => { const gameState = makeState(); gameState.objects[1].counters = { burden: 2 }; - gameState.derived = { unbounded_counters: { 1: [{ counter: "charge", count: 0 }] } }; + gameState.derived = { + counter_display: { + 1: { + pills: [ + { counter: "charge", count: 0, magnitude: "Unbounded" }, + { counter: "burden", count: 2 }, + ], + }, + }, + }; useGameStore.setState({ gameState, waitingFor: gameState.waiting_for }); const { container } = renderPermanent(); @@ -389,14 +428,16 @@ describe("PermanentCard", () => { expect(container.textContent).not.toContain("x0"); }); - // CR 306.5c: a planeswalker's loyalty IS its loyalty-counter count, so a marked `loyalty` - // row means the TOTAL is unbounded and the BADGE renders ∞. The pill-side "loyalty" filter - // stays, so there is no ∞ pill beside a stale numeric badge. + // CR 306.5c: a planeswalker's loyalty IS its loyalty-counter count, so the engine routes that + // row to `loyalty` rather than to `pills` and an `Unbounded` one means the TOTAL is unbounded. + // The partition is engine-side now, so there is no ∞ pill beside a stale numeric badge. it("renders ∞ on the loyalty TOTAL badge when the engine marks a loyalty row", () => { const gameState = makeState(); gameState.objects[1].loyalty = 4; gameState.objects[1].counters = { loyalty: 4 }; - gameState.derived = { unbounded_counters: { 1: [{ counter: "loyalty", count: 4 }] } }; + gameState.derived = { + counter_display: { 1: { loyalty: { counter: "loyalty", count: 4, magnitude: "Unbounded" } } }, + }; useGameStore.setState({ gameState, waitingFor: gameState.waiting_for }); const { container } = renderPermanent(); @@ -413,7 +454,9 @@ describe("PermanentCard", () => { const gameState = makeState(); gameState.objects[1].loyalty = 4; gameState.objects[1].counters = { loyalty: 4 }; - gameState.derived = {}; + gameState.derived = { + counter_display: { 1: { loyalty: { counter: "loyalty", count: 4 } } }, + }; useGameStore.setState({ gameState, waitingFor: gameState.waiting_for }); const { container } = renderPermanent(); diff --git a/client/src/components/card/ArtCropCard.tsx b/client/src/components/card/ArtCropCard.tsx index 88f98c06ff..83ba960f9a 100644 --- a/client/src/components/card/ArtCropCard.tsx +++ b/client/src/components/card/ArtCropCard.tsx @@ -5,7 +5,7 @@ import type { PTColor } from "../../viewmodel/cardProps"; import { useCardImage } from "../../hooks/useCardImage.ts"; import { useIsCompactHeight } from "../../hooks/useIsCompactHeight.ts"; import { useIsMobile } from "../../hooks/useIsMobile.ts"; -import { useUnboundedCounterRows } from "../../hooks/useUnboundedCounterRows.ts"; +import { isUnbounded, pillsOf, useCounterDisplay } from "../../hooks/useCounterDisplay.ts"; import { cardImageLookup, tokenFiltersForObject } from "../../services/cardImageLookup.ts"; import { CARD_BACK_URL } from "../../services/scryfall.ts"; import { useGameStore } from "../../stores/gameStore.ts"; @@ -29,7 +29,7 @@ const PT_COLORS: Record = { export const ArtCropCard = memo(function ArtCropCard({ objectId }: ArtCropCardProps) { const { t } = useTranslation("game"); const obj = useGameStore((s) => s.gameState?.objects[objectId]); - const unboundedCounterRows = useUnboundedCounterRows(objectId); + const counterDisplay = useCounterDisplay(objectId); const isMobile = useIsMobile(); const inspectObject = useUiStore((s) => s.inspectObject); const isCompactHeight = useIsCompactHeight(); @@ -79,14 +79,9 @@ export const ArtCropCard = memo(function ArtCropCard({ objectId }: ArtCropCardPr // Kamigawa flip card stores its alternative half in the same slot and has no // face 1 to inspect. Use the engine-provided layout discriminant. const hasDfc = !obj.face_down && hasOtherPrintedFace(obj); - // Filter out loyalty counters — shown separately as the loyalty badge (which renders its - // own `∞` per CR 306.5c when the engine marks a loyalty row). - const counters = unboundedCounterRows.filter((row) => row.type !== "loyalty"); - // CR 306.5c: a planeswalker's loyalty IS its loyalty-counter count, so an engine `∞` - // loyalty row means the TOTAL is unbounded. - const isLoyaltyUnbounded = unboundedCounterRows.some( - (row) => row.type === "loyalty" && row.isUnbounded, - ); + // CR 306.5c: the engine already split the loyalty TOTAL out of the pill strip, so this site + // classifies nothing — it renders the rows it is given, in the order it is given them. + const counters = pillsOf(counterDisplay); const devotionValue = obj.devotion ?? null; // --- Dynamic Text Sizing Logic --- let ptNumClass = "text-[14px]"; @@ -210,21 +205,23 @@ export const ArtCropCard = memo(function ArtCropCard({ objectId }: ArtCropCardPr {/* Top-right overlay stack: counter badges kept clear of the bottom P/T and loyalty badges. */}
- {counters.map(({ type, count, isUnbounded }) => { + {counters.map((row) => { + const type = row.counter; // CR 732.2a / CR 701.34a: an accepted counter-growth loop pumps this // counter unboundedly — render ∞ instead of the (still-finite) real count. + const unbounded = isUnbounded(row); return ( - {isUnbounded ? "∞" : count} + {unbounded ? "∞" : row.count} ); @@ -306,7 +303,7 @@ export const ArtCropCard = memo(function ArtCropCard({ objectId }: ArtCropCardPr s.gameState?.transient_continuous_effects, ); - // CR 732.2a / CR 701.34a: the ∞ mark for this object. Same engine channel - // PermanentCard's pill and ArtCropCard's badge read — every counter display mode - // must agree, or the ∞ silently drops in one of them. - const unboundedCounterRows = useUnboundedCounterRows(obj.id); - const counters = unboundedCounterRows.filter((row) => row.type !== "loyalty"); + // CR 122.1 + CR 306.5c: the engine's complete counter projection for this object. Same channel + // PermanentCard's pill and ArtCropCard's badge read — every counter display mode must agree, or + // a row silently drops in one of them. The loyalty TOTAL is already partitioned out by the + // engine; this site renders no loyalty badge, so it takes the pills alone. + const counterDisplay = useCounterDisplay(obj.id); + const counters = pillsOf(counterDisplay); const deref = { objects, transientContinuousEffects }; const keywordSources = buildGrantedKeywordSources(attribution, obj.id, deref); const ptSources = buildPTSources(attribution, obj.id, deref); @@ -1510,14 +1511,16 @@ function CardInfoPanel({ {/* Counters */} {counters.length > 0 && (
- {counters.map(({ type, count, isUnbounded }) => { + {counters.map((row) => { + const type = row.counter; // CR 732.2a / CR 701.34a: an accepted counter-growth loop pumps this counter // unboundedly — render ∞ instead of the (still-finite) real count, and tell the // tooltip so its summary can't contradict the row. + const unbounded = isUnbounded(row); return ( - + - {formatCounterType(type)}: {isUnbounded ? "∞" : count} + {formatCounterType(type)}: {unbounded ? "∞" : row.count} ); diff --git a/client/src/components/card/__tests__/ArtCropCard.test.tsx b/client/src/components/card/__tests__/ArtCropCard.test.tsx index 061db77890..e114123217 100644 --- a/client/src/components/card/__tests__/ArtCropCard.test.tsx +++ b/client/src/components/card/__tests__/ArtCropCard.test.tsx @@ -118,6 +118,9 @@ describe("ArtCropCard", () => { useGameStore.setState({ gameState: { objects: { [token.id]: token }, + // The counter badge is engine-projected, so the frame must carry the projection to have + // a badge at all — this site renders `counter_display`, never `obj.counters`. + derived: { counter_display: { [token.id]: { pills: [{ counter: "p1p1", count: 1 }] } } }, } as never, }); @@ -320,7 +323,11 @@ describe("ArtCropCard", () => { useGameStore.setState({ gameState: { objects: { [permanent.id]: permanent }, - derived: { unbounded_counters: { [permanent.id]: [{ counter: "charge", count: 2 }] } }, + derived: { + counter_display: { + [permanent.id]: { pills: [{ counter: "charge", count: 2, magnitude: "Unbounded" }] }, + }, + }, } as never, }); @@ -337,7 +344,10 @@ describe("ArtCropCard", () => { useGameStore.setState({ gameState: { objects: { [permanent.id]: permanent }, - derived: { unbounded_counters: {} }, + // `magnitude` omitted exactly as the engine omits the serde default. + derived: { + counter_display: { [permanent.id]: { pills: [{ counter: "charge", count: 2 }] } }, + }, } as never, }); @@ -356,7 +366,11 @@ describe("ArtCropCard", () => { useGameStore.setState({ gameState: { objects: { [permanent.id]: permanent }, - derived: { unbounded_counters: { [permanent.id]: [{ counter: "charge", count: 2 }] } }, + derived: { + counter_display: { + [permanent.id]: { pills: [{ counter: "charge", count: 2, magnitude: "Unbounded" }] }, + }, + }, } as never, }); @@ -373,7 +387,10 @@ describe("ArtCropCard", () => { useGameStore.setState({ gameState: { objects: { [permanent.id]: permanent }, - derived: { unbounded_counters: {} }, + // `magnitude` omitted exactly as the engine omits the serde default. + derived: { + counter_display: { [permanent.id]: { pills: [{ counter: "charge", count: 2 }] } }, + }, } as never, }); @@ -382,4 +399,41 @@ describe("ArtCropCard", () => { expect(screen.getByText(/2 \S+ counters/i)).toBeInTheDocument(); expect(screen.queryByText(/∞ \S+ counters/i)).not.toBeInTheDocument(); }); + + // THE NO-FALLBACK MATCHED PAIR. `counter_display` is the SINGLE authority: an object carrying + // real counters with no projection entry renders NO badge. This is what catches this render + // site re-introducing `Object.entries(obj.counters)`, and it is worthless without its positive + // twin — alone it would also pass on a component that rendered nothing at all. + it("renders no counter badge for an object with counters but no projection entry", () => { + mockUseCardImage.mockReturnValue({ src: "card.png", isLoading: false, isRotated: false, isFlip: false }); + const permanent = pentadWithCharge(); + useGameStore.setState({ + gameState: { + objects: { [permanent.id]: permanent }, + derived: {}, // a frame that arrived without `derived.counter_display` + } as never, + }); + + render(); + + expect(screen.queryByText("2")).not.toBeInTheDocument(); + expect(screen.queryByText("∞")).not.toBeInTheDocument(); + }); + + it("renders the badge for that SAME object once the projection carries it", () => { + mockUseCardImage.mockReturnValue({ src: "card.png", isLoading: false, isRotated: false, isFlip: false }); + const permanent = pentadWithCharge(); + useGameStore.setState({ + gameState: { + objects: { [permanent.id]: permanent }, + derived: { + counter_display: { [permanent.id]: { pills: [{ counter: "charge", count: 2 }] } }, + }, + } as never, + }); + + render(); + + expect(screen.getByText("2")).toBeInTheDocument(); + }); }); diff --git a/client/src/components/card/__tests__/CardPreview.test.tsx b/client/src/components/card/__tests__/CardPreview.test.tsx index 5cde1df662..ae5f5d43f6 100644 --- a/client/src/components/card/__tests__/CardPreview.test.tsx +++ b/client/src/components/card/__tests__/CardPreview.test.tsx @@ -1,7 +1,7 @@ import { act, cleanup, render, screen, waitFor } from "@testing-library/react"; import { afterEach, describe, expect, it, vi } from "vitest"; -import type { GameObject, UnboundedCounterView } from "../../../adapter/types.ts"; +import type { GameObject, ObjectCounterDisplay } from "../../../adapter/types.ts"; import { useCardImage } from "../../../hooks/useCardImage.ts"; import { useGameStore } from "../../../stores/gameStore.ts"; import { usePreferencesStore } from "../../../stores/preferencesStore.ts"; @@ -565,8 +565,8 @@ describe("CardPreview blocked abilities", () => { // CR 732.2a / CR 701.34a: the hover status box under the full card render is the // THIRD counter render site (after PermanentCard's pill and ArtCropCard's badge). -// An accepted counter-growth ∞ loop marks the pumped counter in -// `derived.unbounded_counters` and deliberately leaves the object's real count +// An accepted counter-growth ∞ loop annotates the pumped row in +// `derived.counter_display` and deliberately leaves the object's real count // finite (engine.rs `materialize_object_growth_shortcut`: "the object's real // counter count is NOT mutated ... this only marks the pill to render ∞"), so a // site that reads `obj.counters` alone shows a stale pre-shortcut number. @@ -581,37 +581,62 @@ describe("CardPreview blocked abilities", () => { // Matched pair: the ONLY difference between the two cases is the engine mark, so // it is the discriminator. describe("CardPreview unbounded counters", () => { - function inspectPentadPrism(unbounded: UnboundedCounterView[] | null) { + // `null` means "a frame that arrived with no `derived.counter_display` at all" — the object's + // own `counters` map stays populated either way, so a site that fell back to it would show a + // pill in that case. It must not. + function inspectPentadPrism(display: ObjectCounterDisplay | null) { const object = battlefieldObject({ id: 409, name: "Pentad Prism", counters: { charge: 2 }, }); const gameState = gameStateWithObject(object); - gameState.derived = unbounded ? { unbounded_counters: { 409: unbounded } } : {}; + gameState.derived = display ? { counter_display: { 409: display } } : {}; useGameStore.setState({ gameState, spellCosts: {} }); useUiStore.setState({ inspectedObjectId: object.id, altHeld: false }); return render(); } it("renders ∞ for a counter the engine marks as unbounded", () => { - const { container } = inspectPentadPrism([{ counter: "charge", count: 2 }]); + const { container } = inspectPentadPrism({ + pills: [{ counter: "charge", count: 2, magnitude: "Unbounded" }], + }); expect(container.textContent).toContain("charge: ∞"); expect(container.textContent).not.toContain("charge: 2"); }); it("renders the finite count when the counter is not marked unbounded", () => { - const { container } = inspectPentadPrism(null); + // `magnitude` omitted exactly as the engine omits the serde default. + const { container } = inspectPentadPrism({ pills: [{ counter: "charge", count: 2 }] }); expect(container.textContent).toContain("charge: 2"); expect(container.textContent).not.toContain("∞"); }); + // THE NO-FALLBACK MATCHED PAIR. `counter_display` is the SINGLE authority: an object carrying + // real counters with no projection entry renders NO row. This is what catches this render site + // re-introducing `Object.entries(obj.counters)`, and it is worthless without its positive twin + // — alone it would also pass on a panel that rendered nothing at all. + it("renders no counter row for an object with counters but no projection entry", () => { + const { container } = inspectPentadPrism(null); + + expect(container.textContent).not.toContain("charge"); + expect(container.textContent).not.toContain("∞"); + }); + + it("renders the row for that SAME object once the projection carries it", () => { + const { container } = inspectPentadPrism({ pills: [{ counter: "charge", count: 2 }] }); + + expect(container.textContent).toContain("charge: 2"); + }); + // LOW: the ∞ row and its TOOLTIP must agree — a badge saying ∞ over a tooltip // interpolating the finite count contradicts itself (mirrors ArtCropCard.test.tsx:353). it("the ∞ status row's tooltip agrees with the badge", () => { - const { container } = inspectPentadPrism([{ counter: "charge", count: 2 }]); + const { container } = inspectPentadPrism({ + pills: [{ counter: "charge", count: 2, magnitude: "Unbounded" }], + }); // `GameplayTooltip` renders its lines through `createPortal(…, document.body)`, so the // summary is NOT inside `container` — query it via `screen`, exactly as the tooltip @@ -640,7 +665,12 @@ describe("CardPreview unbounded counters", () => { // path still renders finitely, so this is not a component that started drawing ∞ for // everything, and it makes the `oil: 0` negative non-vacuous. it("renders a marked counter the object does not carry, with count 0 (F2 regression)", () => { - const { container } = inspectPentadPrism([{ counter: "oil", count: 0 }]); + const { container } = inspectPentadPrism({ + pills: [ + { counter: "oil", count: 0, magnitude: "Unbounded" }, + { counter: "charge", count: 2 }, + ], + }); expect(container.textContent).toContain("oil: ∞"); expect(container.textContent).toContain("charge: 2"); diff --git a/client/src/hooks/useCounterDisplay.ts b/client/src/hooks/useCounterDisplay.ts new file mode 100644 index 0000000000..38fb5f6062 --- /dev/null +++ b/client/src/hooks/useCounterDisplay.ts @@ -0,0 +1,66 @@ +import type { CounterRowView, ObjectCounterDisplay, ObjectId } from "../adapter/types.ts"; +import { useGameStore } from "../stores/gameStore.ts"; + +// CR 732.2a / CR 701.34a: stable empty refs so an object with no counter row (the dominant +// case) never re-renders on identity churn. +const EMPTY_DISPLAY: ObjectCounterDisplay = {}; +const EMPTY_PILLS: ReadonlyArray = []; + +/** + * CR 122.1 + CR 306.5c: every counter row this object renders, exactly as the engine + * partitioned and ordered them. + * + * The engine's `counter_display` projection is the SINGLE authority for counter display. It + * already dropped zero-count entries (CR 122.1 — a zero map entry is not a marker), split the + * loyalty TOTAL out of the pill strip (CR 306.5c), deduplicated across seats, and ordered the + * rows (`∞` first, then `CounterType` order). So this hook joins nothing, filters nothing, sorts + * nothing, and interprets no counter type — it is one keyed lookup. + * + * THERE IS NO FALLBACK TO `objects[id].counters`, AND ONE MUST NOT BE ADDED — not here, not in a + * render site, not in `groupKey`. A frame that arrives with no `derived` renders NO counter pills + * at all, where the superseded hook still rendered the finite ones. That is the correct outcome + * of deleting a second authority: `adapter/types.ts` states of `derived` that "Consumers MUST + * treat absence as 'no data' and MUST NOT synthesize grouped values client-side — that's a + * CLAUDE.md violation", and the deleted fallback was itself a standing violation of that + * contract. The consequence is that a dropped-`derived` adapter regression — `ws-adapter.ts` + * records a real past one — now fails VISIBLY instead of silently half-correct. + * + * ZUSTAND v5 HAZARD, eliminated rather than mitigated: there is no equality argument and no + * `shallow` default in v5 — the selector result IS React's `getSnapshot` return, compared with + * `Object.is`. A selector that ALLOCATES returns a fresh reference on every store read, fails + * React's getSnapshot cache check, and produces "The result of getSnapshot should be cached to + * avoid an infinite loop" plus a render loop. `tsc` cannot see it. The single selector below + * returns only a store-owned ref or a module constant, so there is nothing left to memoize. + * + * SUPERSEDED — kept as a record of why, because deleting it would invite the same design again. + * This hook's doc once prescribed an `.every()` intersection through `groupByName`/`AttackerStack`, + * mirroring `isUnboundedPile`. That solves only the FALSE-`∞` half: `.every()` degrades a group + * whose members disagree to `×N`, which HIDES a real `∞` and contradicts the polarity + * `derive_views` states for this subsystem. `groupKey` instead keys on the engine's rendered rows, + * so members that render differently never group at all — no false `∞` and no hidden real one, and + * the fix lands at every `groupByName` consumer at once instead of per chip. `isUnboundedPile`'s + * `.every()` stays as written: it is a fail-safe over a channel `groupKey` does not key on. + * + * Subscribed today by exactly three render sites: `board/PermanentCard`, `card/ArtCropCard`, and + * `card/CardPreview`'s `CardInfoPanel`. Two counter render sites remain unsubscribed, each a + * "wire it up", neither a hazard: + * - FU-A `controls/AttackTargetPicker` (`StackLabel`) reads `obj.counters` itself and renders + * no `∞` at all. With group splitting on the counter rows in `groupKey`, subscribing it is a + * safe three-line change. + * - FU-B `hud/DialogAttachmentCard` — a four-line conversion blocked on a missing test file. + */ +export function useCounterDisplay(objectId: ObjectId): ObjectCounterDisplay { + return useGameStore( + (s) => s.gameState?.derived?.counter_display?.[String(objectId)] ?? EMPTY_DISPLAY, + ); +} + +/** The pill rows, in engine order. Never sort or filter the result. */ +export const pillsOf = (display: ObjectCounterDisplay): ReadonlyArray => + display.pills ?? EMPTY_PILLS; + +/** + * The single spelling of the engine enum → render-time distinction, so the three render sites + * cannot drift. An absent `magnitude` is the serde default, `"Finite"`. + */ +export const isUnbounded = (row?: CounterRowView): boolean => row?.magnitude === "Unbounded"; diff --git a/client/src/hooks/useUnboundedCounterRows.ts b/client/src/hooks/useUnboundedCounterRows.ts deleted file mode 100644 index 456e075206..0000000000 --- a/client/src/hooks/useUnboundedCounterRows.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { useMemo } from "react"; -import type { ObjectId, UnboundedCounterView } from "../adapter/types.ts"; -import { useGameStore } from "../stores/gameStore.ts"; - -// CR 732.2a / CR 701.34a: stable empty refs so a permanent with no unbounded counter -// (the dominant case) never re-renders on identity churn. -const EMPTY_UNBOUNDED_ROWS: ReadonlyArray = []; -const EMPTY_ROWS: CounterRow[] = []; - -/** - * One renderable counter pill. `type` matches the object's `counters` map key - * (e.g. "charge", "P1P1"); `count` is the live count; `isUnbounded` is the - * render-time distinction, never an engine-published boolean. - */ -export interface CounterRow { - type: string; - count: number; - isUnbounded: boolean; -} - -/** - * CR 732.2a / CR 701.34a: every counter pill for this object, `∞`-marked ones first. - * - * The single union point for "the engine's `∞` counter rows" and "the object's own - * counters", so the four already-drifting `Object.entries(obj.counters).filter(...)` - * spellings do not become five. Engine rows come from - * `DerivedViews::unbounded_counters` and carry the ENGINE's count; every remaining - * `obj.counters` entry follows as a finite row. - * - * WHY THE ENGINE'S COUNT AND NOT `obj.counters[type]`: an engine row may legitimately - * have no entry in the object's map at all. A pair an accepted loop pumps from `0 -> 1` - * is registered while the live object carries none of that counter, so the row's count - * is `0` and there is nothing to join back to. Re-deriving a count here would also be - * the frontend inferring game state, which this codebase forbids. - * - * ORDER: engine rows first, then the object-map remainder — so a permanent with both - * marked and unmarked counters renders its `∞` pills ahead of its finite ones, where it - * previously rendered in `obj.counters` insertion order. Deliberate; match assertions by - * pill content, not by index. - * - * ZUSTAND v5 HAZARD, and why this shape is not stylistic: there is no equality argument - * and no `shallow` default in v5 — the selector result IS React's `getSnapshot` return, - * compared with `Object.is`. A selector that ALLOCATES therefore returns a fresh - * reference on every store read, fails React's getSnapshot cache check, and produces - * "The result of getSnapshot should be cached to avoid an infinite loop" plus a render - * loop. `tsc` cannot see it. So both subscriptions below return store-owned refs or the - * module constant, and the one allocation lives in a `useMemo` OUTSIDE them — the house - * pattern from `useCastableZoneObjects.ts`. - * - * Subscribed today by exactly three render sites: `board/PermanentCard`, - * `card/ArtCropCard`, and `card/CardPreview`'s `CardInfoPanel`. Two counter render - * sites remain unsubscribed, each with a measured blocker: - * - FU-A `controls/AttackTargetPicker` (`StackLabel`) — a chip stands for N grouped - * objects and the mark is per object id, so it needs an `.every()` intersection - * threaded through `groupByName`/`AttackerStack` (mirroring `isUnboundedPile`), - * not a representative lookup, or it renders a FALSE `∞`. - * - FU-B `hud/DialogAttachmentCard` — no component test file exists for it. - * Do not claim this hook covers every counter render site until both land. - */ -export function useUnboundedCounterRows(objectId: ObjectId): CounterRow[] { - // Both selectors return store-owned refs / the module constant — never an allocation. - const engineRows = useGameStore( - (s) => s.gameState?.derived?.unbounded_counters?.[String(objectId)] ?? EMPTY_UNBOUNDED_ROWS, - ); - const objectCounters = useGameStore((s) => s.gameState?.objects?.[String(objectId)]?.counters); - - return useMemo(() => { - if (engineRows.length === 0) { - if (!objectCounters) return EMPTY_ROWS; - const finiteOnly = Object.entries(objectCounters) - .filter((entry): entry is [string, number] => entry[1] != null) - .map(([type, count]) => ({ type, count, isUnbounded: false })); - return finiteOnly.length === 0 ? EMPTY_ROWS : finiteOnly; - } - const marked = new Set(engineRows.map((r) => r.counter)); - return [ - ...engineRows.map((r) => ({ type: r.counter, count: r.count, isUnbounded: true })), - ...Object.entries(objectCounters ?? {}) - .filter((entry): entry is [string, number] => entry[1] != null && !marked.has(entry[0])) - .map(([type, count]) => ({ type, count, isUnbounded: false })), - ]; - }, [engineRows, objectCounters]); -} diff --git a/client/src/viewmodel/__tests__/cardProps.test.ts b/client/src/viewmodel/__tests__/cardProps.test.ts index 2c5ff4dcb2..36a6f55e21 100644 --- a/client/src/viewmodel/__tests__/cardProps.test.ts +++ b/client/src/viewmodel/__tests__/cardProps.test.ts @@ -128,16 +128,6 @@ describe("toCardProps", () => { expect(props.toughness).toBe(4); }); - it("extracts counters as typed array", () => { - const obj = makeGameObject({ counters: { P1P1: 2, loyalty: 3 } }); - const props = toCardProps(obj); - - expect(props.counters).toEqual([ - { type: "P1P1", count: 2 }, - { type: "loyalty", count: 3 }, - ]); - }); - it("detects creature and land types", () => { const creature = makeGameObject({ card_types: { supertypes: [], core_types: ["Creature"], subtypes: ["Elf"] }, @@ -189,9 +179,10 @@ describe("toRoman", () => { // LOW-4 (CR 732.2a / CR 701.34a): while an accepted counter-growth loop pumps a counter, the // badge renders `∞` — the tooltip summary must say "unbounded" and NOT leak the still-finite -// count. `isUnbounded` is the display-only flag threaded from the engine's `unbounded_counters` -// ROW list (never computed in the frontend) — each row names an (object, counter) pair and -// carries the live count, which is `0` when the loop pumps a counter the object does not carry. +// count. `isUnbounded` is the display-only distinction read off the engine's `counter_display` +// projection (never computed in the frontend): each `CounterRowView` names an (object, counter) +// pair, carries the live count — which is `0` when the loop pumps a counter the object does not +// carry — and carries a typed `magnitude`, absent on the wire for the dominant `Finite` case. describe("formatCounterTooltip — unbounded summary", () => { it("says ∞ and hides the finite count when unbounded (fallback, no translator)", () => { const summary = formatCounterTooltip("charge", 4, undefined, true); diff --git a/client/src/viewmodel/__tests__/unboundedWireSeam.test.ts b/client/src/viewmodel/__tests__/unboundedWireSeam.test.ts index e091881745..ce5c73239b 100644 --- a/client/src/viewmodel/__tests__/unboundedWireSeam.test.ts +++ b/client/src/viewmodel/__tests__/unboundedWireSeam.test.ts @@ -28,7 +28,7 @@ import type { UnboundedFamily, } from "../../adapter/types"; import { familyOf, UNBOUNDED_FAMILY_FOR_TEST } from "../../components/hud/HudBadges"; -import { useUnboundedCounterRows } from "../../hooks/useUnboundedCounterRows"; +import { pillsOf, useCounterDisplay } from "../../hooks/useCounterDisplay"; import { buildGameObject } from "../../test/factories/gameObjectFactory"; import { buildGameState } from "../../test/factories/gameStateFactory"; import counterWire from "../../test/fixtures/unbounded-counter-wire.json"; @@ -54,11 +54,18 @@ describe("unbounded ∞ wire seam (engine-emitted goldens)", () => { // (2) reach-guard + the two counter seam facts: the map key is a JSON STRING, and // `CounterType` serializes FLAT ("charge", not {"Generic":"charge"}). A regressed Serialize // would silently blank every ∞ pill. - // The value is a ROW list carrying the engine's live count, not a bare type list. - expect(counterWire.unbounded_counters).toEqual({ "405": [{ counter: "charge", count: 4 }] }); + // The value is a PRE-PARTITIONED row set carrying the engine's live count, not a bare type + // list — and `magnitude` is only written for the exceptional `Unbounded` case. + expect(counterWire.counter_display).toEqual({ + "405": { pills: [{ counter: "charge", count: 4, magnitude: "Unbounded" }] }, + }); + // (2b) the discriminator against a `skip_serializing_if` INVERSION. Without it, an inversion + // that made every row read `Finite` would leave the golden above looking plausible — the TS + // mirror types `magnitude` as optional, so `tsc` cannot see it either. + expect(counterWire.counter_display["405"].pills[0].magnitude).toBe("Unbounded"); // (3) omit-when-empty, engine-attested in BOTH directions. expect("unbounded_pile" in counterWire).toBe(false); - expect("unbounded_counters" in tokenWire).toBe(false); + expect("counter_display" in tokenWire).toBe(false); // (4) the ROW no longer carries a schedule at all — the flag was deleted. Pinning the exact // row shape is what catches a partial revert that leaves the field on one side. expect(tokenWire.unbounded_resources).toEqual([{ axis: "TokensCreated", player: 0 }]); @@ -156,7 +163,7 @@ describe("unbounded ∞ wire seam (engine-emitted goldens)", () => { }), ]; - const groups = groupByName(objects, new Set(), unboundedPileIds); + const groups = groupByName(objects, new Set(), unboundedPileIds, undefined); const groupOf = (id: ObjectId) => { const group = groups.find((g) => g.ids.includes(id)); expect(group, `no group contains ${id}`).toBeDefined(); @@ -192,36 +199,37 @@ describe("unbounded ∞ wire seam (engine-emitted goldens)", () => { ); }); - it("feeds the real useUnboundedCounterRows hook from the engine wire", () => { + it("feeds the real useCounterDisplay hook from the engine wire", () => { setGameStoreForTest({ gameState: buildGameState({ derived: counterWire as unknown as DerivedViews }), }); - // (10) paired POSITIVE through the real zustand selector — the engine's count is carried - // through to the row, not re-derived from the object (which is absent from this state). - expect(renderHook(() => useUnboundedCounterRows(405)).result.current).toEqual([ - { type: "charge", count: 4, isUnbounded: true }, - ]); - // (11) paired NEGATIVE: 404 is on the same battlefield and carries no ∞ mark. - expect(renderHook(() => useUnboundedCounterRows(404)).result.current).toEqual([]); + // (10) paired POSITIVE through the real zustand selector — the engine's row reaches the hook + // verbatim, not re-derived from the object (which is absent from this state). + expect(renderHook(() => useCounterDisplay(405)).result.current).toEqual({ + pills: [{ counter: "charge", count: 4, magnitude: "Unbounded" }], + }); + // (11) paired NEGATIVE: 404 is on the same battlefield and has no projection entry. + expect(pillsOf(renderHook(() => useCounterDisplay(404)).result.current)).toEqual([]); }); // The zustand v5 hazard the hook's shape exists to avoid: v5 has no shallow default, so the // selector result IS React's `getSnapshot` return, compared with `Object.is`. An allocating // selector returns a fresh ref on every store read and trips the getSnapshot cache. `tsc` // cannot see it; this asserts the referential stability directly. - it("returns a referentially STABLE array across re-renders (zustand v5 getSnapshot)", () => { + it("returns a referentially STABLE value across re-renders (zustand v5 getSnapshot)", () => { setGameStoreForTest({ gameState: buildGameState({ derived: counterWire as unknown as DerivedViews }), }); - const marked = renderHook(() => useUnboundedCounterRows(405)); + const marked = renderHook(() => useCounterDisplay(405)); const firstMarked = marked.result.current; marked.rerender(); expect(marked.result.current).toBe(firstMarked); - // The dominant no-∞ case must be stable too — that is what the module constant is for. - const bare = renderHook(() => useUnboundedCounterRows(404)); + // The dominant no-row case must be stable too — that is what the module constants are for. + const bare = renderHook(() => useCounterDisplay(404)); const firstBare = bare.result.current; bare.rerender(); expect(bare.result.current).toBe(firstBare); + expect(pillsOf(bare.result.current)).toBe(pillsOf(firstBare)); }); }); diff --git a/client/src/viewmodel/cardProps.ts b/client/src/viewmodel/cardProps.ts index 4ce69f1a8d..3f6c73c97a 100644 --- a/client/src/viewmodel/cardProps.ts +++ b/client/src/viewmodel/cardProps.ts @@ -26,7 +26,6 @@ export interface CardViewProps { isPowerDebuffed: boolean; isToughnessBuffed: boolean; isToughnessDebuffed: boolean; - counters: Array<{ type: string; count: number }>; isCreature: boolean; isLand: boolean; attachedTo: AttachTarget | null; @@ -74,9 +73,6 @@ export function toCardProps(obj: GameObject): CardViewProps { isPowerDebuffed, isToughnessBuffed, isToughnessDebuffed, - counters: Object.entries(obj.counters) - .filter((entry): entry is [string, number] => entry[1] != null) - .map(([type, count]) => ({ type, count })), isCreature: obj.card_types.core_types.includes("Creature"), isLand: obj.card_types.core_types.includes("Land"), attachedTo: obj.attached_to, From 8d6ad4f68ae73ea771b5d214156f750c9cef716d Mon Sep 17 00:00:00 2001 From: lgray Date: Sat, 8 Aug 2026 15:30:51 -0500 Subject: [PATCH 09/13] fix(client): make a collapsed group's representative faithful to its rows groupKey hashed obj.counters but carried no term for the engine's counter rows, so permanents differing only in their infinity marks collapsed into one group whose representative spoke for members it disagreed with. It now keys on the projection entry, applying groupKey's existing contract - collapse only what renders identically - to the field that was missing. groupByName's new parameter is required rather than defaulted so the compiler enumerates every call site; a default would have left BattlefieldPeekPopover silently on the old behavior with no type error. Assisted-by: ClaudeCode:claude-opus-5 --- .../components/hud/BattlefieldPeekPopover.tsx | 5 +- client/src/utils/combat.ts | 4 +- .../__tests__/battlefieldGrouping.test.ts | 95 +++++++++++++++---- client/src/viewmodel/battlefieldProps.ts | 46 ++++++--- client/src/viewmodel/gameStateView.ts | 16 +++- 5 files changed, 127 insertions(+), 39 deletions(-) diff --git a/client/src/components/hud/BattlefieldPeekPopover.tsx b/client/src/components/hud/BattlefieldPeekPopover.tsx index 61af24e8f4..3919e66ae1 100644 --- a/client/src/components/hud/BattlefieldPeekPopover.tsx +++ b/client/src/components/hud/BattlefieldPeekPopover.tsx @@ -58,6 +58,9 @@ export function BattlefieldPeekPopover({ // Threaded into groupByName so the peek renders `∞` (not `×N`) exactly like the // main board (see buildPlayerBattlefieldView in gameStateView.ts). const unboundedPile = useGameStore((s) => s.gameState?.derived?.unbounded_pile); + // CR 122.1: the engine's counter-display projection is part of the group IDENTITY, so the peek + // splits exactly where the main board does. Store-owned ref or `undefined` — no allocation. + const counterDisplay = useGameStore((s) => s.gameState?.derived?.counter_display); if (!battlefield || !objects) return null; const owned = battlefield @@ -82,7 +85,7 @@ export function BattlefieldPeekPopover({ .map((id) => objects[id]) .filter((obj): obj is NonNullable => obj != null); const unboundedPileIds = new Set(unboundedPile ?? []); - const groups = groupByName(candidateObjects, undefined, unboundedPileIds); + const groups = groupByName(candidateObjects, undefined, unboundedPileIds, counterDisplay); // Sort legal targets to the front during targeting so the cap can never // hide a card the player needs to see. In idle mode the order from // `partitionByType` (creatures → planeswalkers → support) is preserved diff --git a/client/src/utils/combat.ts b/client/src/utils/combat.ts index 7eede38df7..c7a12fb45d 100644 --- a/client/src/utils/combat.ts +++ b/client/src/utils/combat.ts @@ -188,7 +188,9 @@ export function groupAttackers( // `∞` like the battlefield (mirrors buildPlayerBattlefieldView in gameStateView.ts). const unboundedPileIds = new Set(state.derived?.unbounded_pile ?? []); - return groupByName(objects, ringBearerIds, unboundedPileIds) + // CR 122.1: the engine's counter-display projection is part of the group IDENTITY, so attacker + // stacks split exactly where the battlefield does (mirrors buildPlayerBattlefieldView). + return groupByName(objects, ringBearerIds, unboundedPileIds, state.derived?.counter_display) .flatMap((group) => subdivideByTargets( [...group.ids], diff --git a/client/src/viewmodel/__tests__/battlefieldGrouping.test.ts b/client/src/viewmodel/__tests__/battlefieldGrouping.test.ts index 0661ebc292..653f2ff8ed 100644 --- a/client/src/viewmodel/__tests__/battlefieldGrouping.test.ts +++ b/client/src/viewmodel/__tests__/battlefieldGrouping.test.ts @@ -222,7 +222,7 @@ describe("groupByName", () => { makeGameObject({ id: 3, name: "Mountain" }), ]; - const groups = groupByName(objects); + const groups = groupByName(objects, undefined, undefined, undefined); expect(groups).toHaveLength(2); expect(groups[0]).toMatchObject({ name: "Forest", ids: [1, 2], count: 2 }); @@ -236,7 +236,7 @@ describe("groupByName", () => { makeGameObject({ id: 3, name: "Forest", tapped: false }), ]; - const groups = groupByName(objects); + const groups = groupByName(objects, undefined, undefined, undefined); expect(groups).toHaveLength(2); const untapped = groups.find((g) => !g.representative.tapped); @@ -251,8 +251,14 @@ describe("groupByName", () => { makeGameObject({ id: 2, name: "Grizzly Bears", counters: { Plus1Plus1: 1 } }), makeGameObject({ id: 3, name: "Grizzly Bears", attachments: [99] }), ]; + // The group identity reads the ENGINE's rows, so the fixture supplies them; `obj.counters` is + // kept in sync only so the object stays a plausible engine snapshot. + const counterDisplay = { + "1": { pills: [{ counter: "Plus1Plus1", count: 1 }] }, + "2": { pills: [{ counter: "Plus1Plus1", count: 1 }] }, + }; - const groups = groupByName(objects); + const groups = groupByName(objects, undefined, undefined, counterDisplay); // Two copies with identical counters stack; the one with an attachment is solo expect(groups).toHaveLength(2); @@ -267,7 +273,7 @@ describe("groupByName", () => { makeGameObject({ id: 3, name: "Orc Army" }), ]; - const groups = groupByName(objects, new Set([2])); + const groups = groupByName(objects, new Set([2]), undefined, undefined); // The ring-bearer (id 2) never gets hidden behind a non-bearer // representative in a collapsed group — it always has its own entry so @@ -283,8 +289,13 @@ describe("groupByName", () => { makeGameObject({ id: 2, name: "Grizzly Bears", counters: { Plus1Plus1: 2 } }), makeGameObject({ id: 3, name: "Grizzly Bears", counters: { Plus1Plus1: 1 } }), ]; + const counterDisplay = { + "1": { pills: [{ counter: "Plus1Plus1", count: 1 }] }, + "2": { pills: [{ counter: "Plus1Plus1", count: 2 }] }, + "3": { pills: [{ counter: "Plus1Plus1", count: 1 }] }, + }; - const groups = groupByName(objects); + const groups = groupByName(objects, undefined, undefined, counterDisplay); expect(groups).toHaveLength(2); expect(groups.find((g) => g.count === 2)?.ids).toEqual([1, 3]); @@ -298,7 +309,7 @@ describe("groupByName", () => { makeGameObject({ id: 3, name: "Grizzly Bears", power: 2, toughness: 2 }), ]; - const groups = groupByName(objects); + const groups = groupByName(objects, undefined, undefined, undefined); expect(groups).toHaveLength(2); expect(groups.find((g) => g.count === 2)?.ids).toEqual([1, 3]); @@ -312,7 +323,7 @@ describe("groupByName", () => { makeGameObject({ id: 3, name: "Grizzly Bears", power: 2, toughness: 2 }), ]; - const groups = groupByName(objects); + const groups = groupByName(objects, undefined, undefined, undefined); expect(groups).toHaveLength(2); expect(groups.find((g) => g.count === 2)?.ids).toEqual([1, 3]); @@ -326,7 +337,7 @@ describe("groupByName", () => { makeGameObject({ id: 3, name: "Llanowar Elves", keywords: [] }), ]; - const groups = groupByName(objects); + const groups = groupByName(objects, undefined, undefined, undefined); expect(groups).toHaveLength(2); expect(groups.find((g) => g.count === 2)?.ids).toEqual([1, 3]); @@ -342,7 +353,7 @@ describe("groupByName", () => { makeGameObject({ id: 3, name: "Spectral Sailor", keywords: [ward2] }), ]; - const groups = groupByName(objects); + const groups = groupByName(objects, undefined, undefined, undefined); expect(groups).toHaveLength(2); expect(groups.find((g) => g.count === 2)?.ids).toEqual([1, 3]); @@ -356,7 +367,7 @@ describe("groupByName", () => { makeGameObject({ id: 3, name: "Grizzly Bears", color: ["Green"] }), ]; - const groups = groupByName(objects); + const groups = groupByName(objects, undefined, undefined, undefined); expect(groups).toHaveLength(2); expect(groups.find((g) => g.count === 2)?.ids).toEqual([1, 3]); @@ -369,7 +380,7 @@ describe("groupByName", () => { makeGameObject({ id: 9, name: "Mountain" }), ]; - const groups = groupByName(objects); + const groups = groupByName(objects, undefined, undefined, undefined); expect(groups[0].name).toBe("Forest"); expect(groups[0].representative.id).toBe(5); @@ -417,7 +428,7 @@ describe("groupByName", () => { color: ["Black", "Green"], }); - const groups = groupByName([attackPest, diesPest]); + const groups = groupByName([attackPest, diesPest], undefined, undefined, undefined); expect(groups).toHaveLength(2); expect(groups.map((g) => g.count).sort()).toEqual([1, 1]); @@ -465,7 +476,7 @@ describe("groupByName", () => { }), ]; - const groups = groupByName(objects); + const groups = groupByName(objects, undefined, undefined, undefined); expect(groups).toHaveLength(2); }); @@ -515,7 +526,7 @@ describe("groupByName", () => { }), ]; - const groups = groupByName(objects); + const groups = groupByName(objects, undefined, undefined, undefined); expect(groups).toHaveLength(2); }); @@ -534,7 +545,7 @@ describe("groupByName", () => { }), ]; - const groups = groupByName(objects); + const groups = groupByName(objects, undefined, undefined, undefined); expect(groups).toHaveLength(2); }); @@ -559,7 +570,7 @@ describe("groupByName", () => { }), ]; - const groups = groupByName(objects); + const groups = groupByName(objects, undefined, undefined, undefined); expect(groups).toHaveLength(1); expect(groups[0]).toMatchObject({ @@ -593,7 +604,7 @@ describe("groupByName", () => { const pile = new Set([1, 2]); // Both tapped Saprolings are pile members → the group is ∞. - const infinite = groupByName(tappedFodder, undefined, pile); + const infinite = groupByName(tappedFodder, undefined, pile, undefined); expect(infinite).toHaveLength(1); expect(infinite[0].isUnboundedPile).toBe(true); @@ -607,12 +618,56 @@ describe("groupByName", () => { toughness: 1, card_types: { supertypes: [], core_types: ["Creature"], subtypes: ["Saproling"] }, }); - const mixed = groupByName([...tappedFodder, untapped], undefined, pile); + const mixed = groupByName([...tappedFodder, untapped], undefined, pile, undefined); const untappedGroup = mixed.find((g) => g.ids.includes(3)); expect(untappedGroup?.isUnboundedPile).toBe(false); // Empty pile set → no group is ∞ (the dominant no-loop case; also the default). - expect(groupByName(tappedFodder)[0].isUnboundedPile).toBe(false); - expect(groupByName(tappedFodder, undefined, new Set())[0].isUnboundedPile).toBe(false); + expect(groupByName(tappedFodder, undefined, undefined, undefined)[0].isUnboundedPile).toBe(false); + expect(groupByName(tappedFodder, undefined, new Set(), undefined)[0].isUnboundedPile).toBe(false); + }); + + // CR 122.1 + CR 732.2a: the group identity keys on the engine's RENDERED counter rows, so a + // collapsed group's representative can never speak for a member that renders differently. This + // is the live `GroupedPermanent` representative bug — the collapsed branch subscribes the + // counter projection for `ids[0]` alone. + it("splits a group whose members disagree on their counter rows, and only then", () => { + const twins = () => [ + makeGameObject({ id: 1, name: "Pentad Prism", counters: { charge: 4 } }), + makeGameObject({ id: 2, name: "Pentad Prism", counters: { charge: 4 } }), + ]; + + // NEGATIVE — THE FIX. Byte-identical counter maps; only id 1 is `∞`-annotated. `magnitude` is + // absent on id 2's row exactly as the engine omits the serde default. + const divergent = groupByName(twins(), undefined, undefined, { + "1": { pills: [{ counter: "charge", count: 4, magnitude: "Unbounded" }] }, + "2": { pills: [{ counter: "charge", count: 4 }] }, + }); + expect(divergent).toHaveLength(2); + expect(divergent.find((g) => g.ids.includes(1))?.ids).toEqual([1]); + + // POSITIVE — THE REACH-GUARD. The SAME two objects with the SAME entry collapse into one + // group, which is what proves the split above is caused by the ∞ divergence and by nothing + // else (a groupKey that split on object id would pass the negative arm vacuously). + const identical = groupByName(twins(), undefined, undefined, { + "1": { pills: [{ counter: "charge", count: 4, magnitude: "Unbounded" }] }, + "2": { pills: [{ counter: "charge", count: 4, magnitude: "Unbounded" }] }, + }); + expect(identical).toHaveLength(1); + expect(identical[0].ids).toEqual([1, 2]); + + // FREE ARM 1 — objects with no entry at all still collapse, i.e. the new fragment does not + // accidentally key on identity. + expect(groupByName(twins(), undefined, undefined, {})).toHaveLength(1); + + // FREE ARM 2 — the DE-split direction (behavior change #5). The engine drops zero-count + // finite rows (CR 122.1), so a `{charge: 0}` permanent and a counterless one publish the same + // (empty) row set and now render identically. Reading `obj.counters` here instead of the + // projection splits them, as the head revision did. + const zeroVsAbsent = [ + makeGameObject({ id: 1, name: "Pentad Prism", counters: { charge: 0 } }), + makeGameObject({ id: 2, name: "Pentad Prism", counters: {} }), + ]; + expect(groupByName(zeroVsAbsent, undefined, undefined, {})).toHaveLength(1); }); }); diff --git a/client/src/viewmodel/battlefieldProps.ts b/client/src/viewmodel/battlefieldProps.ts index c9bbc7b155..ca43752a65 100644 --- a/client/src/viewmodel/battlefieldProps.ts +++ b/client/src/viewmodel/battlefieldProps.ts @@ -1,4 +1,11 @@ -import type { AttackerInfo, CombatState, GameObject, ObjectId, PlayerId } from "../adapter/types"; +import type { + AttackerInfo, + CombatState, + GameObject, + ObjectCounterDisplay, + ObjectId, + PlayerId, +} from "../adapter/types"; import { publicName, toCardProps } from "./cardProps"; import type { CardViewProps } from "./cardProps"; @@ -9,18 +16,25 @@ function canGroup(obj: GameObject, ringBearerIds: ReadonlySet): boolea return obj.attachments.length === 0 && !ringBearerIds.has(obj.id); } -function groupKey(obj: GameObject): string { +function groupKey( + obj: GameObject, + counterDisplay: Record | undefined, +): string { const kw = obj.keywords.map((k) => typeof k === "string" ? k : JSON.stringify(k)).sort().join(","); const colors = [...obj.color].sort().join(""); - // counters is a known-shape Partial>. Build the - // key from sorted entries rather than JSON.stringify — cheaper (no serialize - // allocation per permanent on every board rebuild) and order-independent, so - // two identical permanents always land in the same group regardless of the - // order their counters were applied (the old stringify could split them by - // insertion order; this matches the sorted keyword key above). - const counters = Object.entries(obj.counters ?? {}) - .sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)) - .map(([type, n]) => `${type}:${n}`) + // CR 122.1 + CR 732.2a: the group identity for counters is the engine's RENDERED rows, not the + // raw map — two permanents that render different pills must not collapse into one representative, + // and an `∞`-marked member must never hide behind an unmarked one. The engine already orders the + // rows deterministically (`∞` first, then CounterType order), so this is a straight join, never a + // sort. Zero-count entries are absent from the engine's rows (CR 122.1), so two permanents + // differing only by a `{charge: 0}` entry now group TOGETHER; they render identically, which is + // what this key is for. + const display = counterDisplay?.[String(obj.id)]; + const counters = [ + ...(display?.pills ?? []), + ...(display?.loyalty ? [display.loyalty] : []), + ] + .map((r) => `${r.counter}:${r.count}:${r.magnitude ?? "Finite"}`) .join(","); // Tokens that share a display name (e.g. SOS vs BLC Pest) differ by rules text // and/or preset art — include both so visually distinct tokens never stack. @@ -93,10 +107,18 @@ export function partitionByType(objects: GameObject[]): BattlefieldPartition { const NO_RING_BEARERS: ReadonlySet = new Set(); const NO_UNBOUNDED_PILE: ReadonlySet = new Set(); +/** + * `counterDisplay` is POSITIONALLY REQUIRED even though it accepts `undefined`: `ringBearerIds` + * and `unboundedPileIds` are *enrichment* inputs whose omission only degrades a badge, while + * `counterDisplay` is a *correctness* input to the group identity itself — a default would + * silently produce wrong grouping at any site that forgot it. Defaults are for enrichment; + * correctness inputs get the compiler. + */ export function groupByName( objects: GameObject[], ringBearerIds: ReadonlySet = NO_RING_BEARERS, unboundedPileIds: ReadonlySet = NO_UNBOUNDED_PILE, + counterDisplay: Record | undefined, ): GroupedPermanent[] { const groups = new Map(); @@ -107,7 +129,7 @@ export function groupByName( continue; } - const key = groupKey(obj); + const key = groupKey(obj, counterDisplay); const existing = groups.get(key); if (existing) { existing.push(obj); diff --git a/client/src/viewmodel/gameStateView.ts b/client/src/viewmodel/gameStateView.ts index c8f3a9037d..78ee8859bb 100644 --- a/client/src/viewmodel/gameStateView.ts +++ b/client/src/viewmodel/gameStateView.ts @@ -2,6 +2,7 @@ import type { GameAction, GameObject, GameState, + ObjectCounterDisplay, ObjectId, PlayerId, WaitingFor, @@ -755,10 +756,14 @@ export function buildPlayerBattlefieldView( // CR 732.2a: engine-authored ∞-pile membership (accepted object-growth loop). // Read exactly like ring_bearer — the adapter attaches `derived` onto gameState. const unboundedPileIds = new Set(gameState.derived?.unbounded_pile ?? []); + // CR 122.1: the engine's complete counter-display projection is part of the group IDENTITY — + // two permanents that render different counter rows must not share a representative. Read + // exactly like `unbounded_pile` above. return buildPlayerBattlefieldViewFromObjects( playerObjects, ringBearerIds, unboundedPileIds, + gameState.derived?.counter_display, ); } @@ -766,6 +771,7 @@ export function buildPlayerBattlefieldViewFromObjects( playerObjects: GameObject[], ringBearerIds: ReadonlySet = new Set(), unboundedPileIds: ReadonlySet = new Set(), + counterDisplay: Record | undefined, ): PlayerBattlefieldView { const partition = partitionByType(playerObjects); const objectMap = new Map(playerObjects.map((object) => [object.id, object])); @@ -775,11 +781,11 @@ export function buildPlayerBattlefieldViewFromObjects( .filter(Boolean) as GameObject[]; return { - creatures: groupByName(resolveObjects(partition.creatures), ringBearerIds, unboundedPileIds), - lands: groupByName(resolveObjects(partition.lands), ringBearerIds, unboundedPileIds), - support: groupByName(resolveObjects(partition.support), ringBearerIds, unboundedPileIds), - planeswalkers: groupByName(resolveObjects(partition.planeswalkers), ringBearerIds, unboundedPileIds), - other: groupByName(resolveObjects(partition.other), ringBearerIds, unboundedPileIds), + creatures: groupByName(resolveObjects(partition.creatures), ringBearerIds, unboundedPileIds, counterDisplay), + lands: groupByName(resolveObjects(partition.lands), ringBearerIds, unboundedPileIds, counterDisplay), + support: groupByName(resolveObjects(partition.support), ringBearerIds, unboundedPileIds, counterDisplay), + planeswalkers: groupByName(resolveObjects(partition.planeswalkers), ringBearerIds, unboundedPileIds, counterDisplay), + other: groupByName(resolveObjects(partition.other), ringBearerIds, unboundedPileIds, counterDisplay), }; } From 3a34a1b18b11c9267422477ed484a13bd4b2e995 Mon Sep 17 00:00:00 2001 From: lgray Date: Sat, 8 Aug 2026 17:06:42 -0500 Subject: [PATCH 10/13] fix(client): render counter pills in the attack picker from the engine projection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes the review MED that partition D introduced. `groupAttackers` began keying attacker-stack identity on the engine's `counter_display` projection, but `AttackTargetPicker` still built its chips from `Object.entries(obj.counters)` and rendered no unbounded mark. Two same-named attackers with byte-identical `counters` where only one carried an unbounded row therefore split into two stacks with identical name, identical chips and identical `x1` — a split with no visible cause, in the attack-assignment modal. `StackLabel` now reads `pillsOf(useCounterDisplay(stack.ids[0]))`, so the chips come from the same rows the grouping keyed on and the split explains itself. `ids[0]` is exactly the object `representative` is defined from (combat.ts), so the hook call is unconditional. This also fixes a pre-existing defect in the same lines: an unbounded-marked attacker rendered as plain in that modal. `objectCounterChips` is deleted rather than rewired. It re-derived what the engine projection already published — dropping zero-count entries (CR 122.1), excluding the loyalty total (CR 306.5c) and ordering the rows — making it a fifth client-side counter authority of exactly the kind this PR is removing. The unbounded spelling mirrors `PermanentCard` verbatim; no new one is invented. Also in this round: - Split a doc block in `derived_views.rs` that documented `derive_views` while sitting on `pending_payment_remaining`. The misattachment predates this PR, but this PR extended the block, so it is closed here. Pure doc move: 12 lines, identical multiset, zero code tokens touched. - Corrected the follow-up ledger in `useCounterDisplay.ts`. It undercounted the surviving `obj.counters` readers and mischaracterized them. `CardChoiceModal` enumerates counters removable as a cost (CR 118.3) and `DebugCardContextMenu` reads the map its own buttons mutate; both legitimately need the raw map, including loyalty, and are not pending display conversions. Its claim that FU-B was blocked on a missing test file was also false — that test exists. - Typed `CounterRowView.counter` as `CounterType` rather than `string`, matching the Rust field. Safe because the TS union carries a `(string & {})` arm. Assisted-by: ClaudeCode:claude-opus-4.8 --- client/src/adapter/types.ts | 2 +- .../controls/AttackTargetPicker.tsx | 35 ++++---- .../__tests__/AttackTargetPicker.test.tsx | 84 +++++++++++++++++++ client/src/hooks/useCounterDisplay.ts | 33 ++++++-- crates/engine/src/game/derived_views.rs | 24 +++--- 5 files changed, 142 insertions(+), 36 deletions(-) diff --git a/client/src/adapter/types.ts b/client/src/adapter/types.ts index 384c663cdc..7f89ae6f7a 100644 --- a/client/src/adapter/types.ts +++ b/client/src/adapter/types.ts @@ -2732,7 +2732,7 @@ export type CounterMagnitude = "Finite" | "Unbounded"; * back to. Re-deriving it here would also be the FE inferring game state. */ export interface CounterRowView { - counter: string; + counter: CounterType; count: number; magnitude?: CounterMagnitude; } diff --git a/client/src/components/controls/AttackTargetPicker.tsx b/client/src/components/controls/AttackTargetPicker.tsx index 69dedd6872..3502054167 100644 --- a/client/src/components/controls/AttackTargetPicker.tsx +++ b/client/src/components/controls/AttackTargetPicker.tsx @@ -4,6 +4,7 @@ import { Trans, useTranslation } from "react-i18next"; import type { AttackTarget, GameObject, ObjectId, PlayerId } from "../../adapter/types.ts"; import { getSeatColor } from "../../hooks/useSeatColor.ts"; +import { isUnbounded, pillsOf, useCounterDisplay } from "../../hooks/useCounterDisplay.ts"; import { useInspectHoverProps } from "../../hooks/useInspectHoverProps.ts"; import { usePlayerId } from "../../hooks/usePlayerId.ts"; import { useGameStore } from "../../stores/gameStore.ts"; @@ -673,14 +674,6 @@ function objectPtLabel(obj: GameObject | undefined): string | null { return `${obj.power}/${obj.toughness}`; } -function objectCounterChips(obj: GameObject | undefined): Array<{ type: string; count: number }> { - if (!obj) return []; - return Object.entries(obj.counters) - .filter((entry): entry is [string, number] => entry[1] != null && entry[1] > 0 && entry[0] !== "loyalty") - .sort(([a], [b]) => a.localeCompare(b)) - .map(([type, count]) => ({ type, count })); -} - function RestoreTab({ onClick }: { onClick: () => void }) { const { t } = useTranslation("game"); return ( @@ -831,7 +824,11 @@ interface StackLabelProps { /** Stack name + count badge + P/T + counter chips, with inspect-on-hover. */ function StackLabel({ stack, t, hoverProps }: StackLabelProps) { const ptLabel = objectPtLabel(stack.representative ?? undefined); - const counters = objectCounterChips(stack.representative ?? undefined); + // CR 122.1 + CR 306.5c: the engine's counter-display projection is the single authority — + // it already dropped zero rows, split the loyalty total out, and ordered the pills. Keyed on + // `ids[0]` because that is exactly the object `representative` is defined as (combat.ts), so + // the hook call is unconditional and the chips match the row set `groupKey` grouped on. + const counters = pillsOf(useCounterDisplay(stack.ids[0])); return (
@@ -853,13 +850,19 @@ function StackLabel({ stack, t, hoverProps }: StackLabelProps) {
{counters.length > 0 && (
- {counters.map(({ type, count }) => ( - - - {formatCounterType(type)} x{count} - - - ))} + {counters.map((row) => { + const type = row.counter; + // CR 732.2a / CR 701.34a: an accepted counter-growth loop pumps this counter + // unboundedly — render ∞ instead of the (still-finite) real count. + const unbounded = isUnbounded(row); + return ( + + + {formatCounterType(type)} {unbounded ? "∞" : `x${row.count}`} + + + ); + })}
)}
diff --git a/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx b/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx index 8f2bc0ae51..f33c478602 100644 --- a/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx +++ b/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx @@ -205,6 +205,90 @@ describe("AttackTargetPicker", () => { expect(screen.getAllByText("×2").length).toBeGreaterThan(0); }); + it("renders counter chips from the engine projection, never the raw counters map (CR 122.1)", () => { + // The raw map and the projection DISAGREE on every axis: a differing count, a row the map + // does not carry at all, and a map entry the projection dropped. Only a StackLabel reading + // `derived.counter_display` can satisfy all three, so any reintroduced `obj.counters` read + // (or a join back to it) fails here. + const goblin = makeCreature(101, "Goblin"); + useGameStore.setState({ + gameState: buildGameState({ + players: buildPlayers([0, 1, 2]), + seat_order: [0, 1, 2], + objects: buildObjectMap({ ...goblin, counters: { charge: 99, stun: 2 } }), + derived: { + counter_display: { + "101": { + pills: [ + { counter: "charge", count: 4 }, + // CR 122.1: engine-supplied row with NO entry in the raw map — a pair pumped + // 0 -> 1 is registered while the object still carries none, so it is + // unreachable by any client-side derivation from `obj.counters`. + { counter: "lore", count: 0 }, + ], + }, + }, + }, + }), + }); + render( + , + ); + enterDistribute(); + + // Projection count wins over the raw map's disagreeing count. + expect(screen.getAllByText("charge x4").length).toBeGreaterThan(0); + expect(screen.queryAllByText("charge x99")).toHaveLength(0); + // Projection-only row renders even though the raw map has no such key. + expect(screen.getAllByText("lore x0").length).toBeGreaterThan(0); + // Raw-map-only entry the projection dropped must NOT render. + expect(screen.queryAllByText("stun x2")).toHaveLength(0); + }); + + it("visibly distinguishes two same-named stacks that differ only in counter magnitude (CR 732.2a)", () => { + // The MED regression: `groupKey` splits these two attackers because their engine counter + // rows differ, but with a raw-map-fed StackLabel both stacks render an IDENTICAL name and + // an IDENTICAL `charge x1` chip — a split with no visible cause. The counters maps are + // byte-identical, so the ONLY channel that can tell them apart is the projection's + // `magnitude`. + const a = makeCreature(101, "Goblin"); + const b = makeCreature(102, "Goblin"); + useGameStore.setState({ + gameState: buildGameState({ + players: buildPlayers([0, 1, 2]), + seat_order: [0, 1, 2], + objects: buildObjectMap( + { ...a, counters: { charge: 1 } }, + { ...b, counters: { charge: 1 } }, + ), + derived: { + counter_display: { + "101": { pills: [{ counter: "charge", count: 1, magnitude: "Unbounded" }] }, + "102": { pills: [{ counter: "charge", count: 1 }] }, + }, + }, + }), + }); + render( + , + ); + enterDistribute(); + + // Two separate stacks, each rendering its own chip, and the two chips DIFFER. + expect(screen.getAllByText("charge ∞").length).toBeGreaterThan(0); + expect(screen.getAllByText("charge x1").length).toBeGreaterThan(0); + }); + it("steppers claim the lowest-id unassigned member deterministically", () => { const { onConfirm } = renderPicker(); enterDistribute(); diff --git a/client/src/hooks/useCounterDisplay.ts b/client/src/hooks/useCounterDisplay.ts index 38fb5f6062..85a1f8d075 100644 --- a/client/src/hooks/useCounterDisplay.ts +++ b/client/src/hooks/useCounterDisplay.ts @@ -41,13 +41,32 @@ const EMPTY_PILLS: ReadonlyArray = []; * the fix lands at every `groupByName` consumer at once instead of per chip. `isUnboundedPile`'s * `.every()` stays as written: it is a fail-safe over a channel `groupKey` does not key on. * - * Subscribed today by exactly three render sites: `board/PermanentCard`, `card/ArtCropCard`, and - * `card/CardPreview`'s `CardInfoPanel`. Two counter render sites remain unsubscribed, each a - * "wire it up", neither a hazard: - * - FU-A `controls/AttackTargetPicker` (`StackLabel`) reads `obj.counters` itself and renders - * no `∞` at all. With group splitting on the counter rows in `groupKey`, subscribing it is a - * safe three-line change. - * - FU-B `hud/DialogAttachmentCard` — a four-line conversion blocked on a missing test file. + * Subscribed today by exactly FOUR render sites: `board/PermanentCard`, `card/ArtCropCard`, + * `card/CardPreview`'s `CardInfoPanel`, and `controls/AttackTargetPicker`'s `StackLabel`. + * + * Every surviving reader of the raw `objects[id].counters` map, measured with `git grep` and + * cross-checked with `ast-grep` (an `Object.entries`-shaped pattern alone MISSES the indexed + * reads, which is how an earlier census undercounted this list): + * - FU-B `hud/DialogAttachmentCard` (`:115`) — the one remaining DISPLAY site, and the only + * entry here that is a pending conversion. It re-implements the projection's own work + * (drops zero rows, excludes `loyalty`). `__tests__/DialogAttachmentCard.test.tsx` EXISTS, + * so this is NOT blocked on a missing test file (an earlier revision of this ledger claimed + * it was); it is simply outside the frozen scope of the change that subscribed FU-A. + * - `modal/CardChoiceModal` (`:1712`, `:1715`, in `removableCounterCostEntries`) — NOT a + * display site and NOT a pending conversion. It enumerates which counters are legal to + * REMOVE AS A COST — CR 118.3, a player can't pay a cost without the resources to pay it + * fully, which is exactly the `count > 0` filter — so it must read the live payable map. It + * is reached for ability costs as well as spell costs, so the general cost rule governs, not + * the spell-casting payment step. It deliberately keeps + * `loyalty` (removing loyalty counters is a payable cost) where the display projection + * splits loyalty out per CR 306.5c, and a cost must be paid in real counters, so an + * `Unbounded` magnitude would be actively wrong here. + * - `chrome/DebugCardContextMenu` (`:253`, `:254`, `:258`, `:261`) — NOT a display site and NOT + * a pending conversion. It is a debug counter EDITOR: each `CounterRow` reads the current + * value of the counter its own +/- buttons are about to `ModifyCounters`, `loyalty` + * included. It needs the writable map it mutates, not the CR 306.5c-partitioned view. + * + * Do not claim this hook covers every counter render site until FU-B lands. */ export function useCounterDisplay(objectId: ObjectId): ObjectCounterDisplay { return useGameStore( diff --git a/crates/engine/src/game/derived_views.rs b/crates/engine/src/game/derived_views.rs index cb7f6a74c5..e420cc235b 100644 --- a/crates/engine/src/game/derived_views.rs +++ b/crates/engine/src/game/derived_views.rs @@ -885,18 +885,6 @@ pub struct ClientGameState { pub derived: DerivedViews, } -/// Compute all engine-authored projections over `state`. Runs in O(objects + `∞` -/// targets + damage entries) per call; the JIT short-circuit for non-Commander -/// formats (where `commander_damage_threshold` is `None`) still keeps the -/// commander-damage grouping at exactly zero cost. The per-object counter walk -/// (`counter_display_views`) allocates nothing for the dominant counterless -/// object. -/// -/// CR 903.10a: commander damage is public information tracked per commander -/// — no viewer-based redaction is applied here, and the grouping runs -/// unconditionally for every Commander-format game regardless of who is -/// viewing. Partner commanders under the same controller each get their -/// own `CommanderDamageView` entry, not a summed total. /// CR 118.3a + CR 601.2g: the cost still unpaid by `viewer`'s pinned pool units /// during their own manual mana payment for a spell. Reduces the locked spell /// cost against a pool containing ONLY the pinned units (so the residual is @@ -1046,6 +1034,18 @@ fn temporary_cant_be_blocked_source( }) } +/// Compute all engine-authored projections over `state`. Runs in O(objects + `∞` +/// targets + damage entries) per call; the JIT short-circuit for non-Commander +/// formats (where `commander_damage_threshold` is `None`) still keeps the +/// commander-damage grouping at exactly zero cost. The per-object counter walk +/// (`counter_display_views`) allocates nothing for the dominant counterless +/// object. +/// +/// CR 903.10a: commander damage is public information tracked per commander +/// — no viewer-based redaction is applied here, and the grouping runs +/// unconditionally for every Commander-format game regardless of who is +/// viewing. Partner commanders under the same controller each get their +/// own `CommanderDamageView` entry, not a summed total. pub fn derive_views(state: &GameState, viewer: Option) -> DerivedViews { let mut views = DerivedViews { unique_authorized_submitter: unique_authorized_submitter(state), From 297df5d9452949a12b31f4a99231cd9f33548b88 Mon Sep 17 00:00:00 2001 From: lgray Date: Sat, 8 Aug 2026 18:58:17 -0500 Subject: [PATCH 11/13] fix(client): render attachment counter pills from the engine projection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes the maintainer's remaining display-authority finding. `DialogAttachmentCard` enumerated and filtered raw `obj.counters` and rendered those derived pills, so it could not show an engine-projected `Unbounded` row — the same second-authority defect this PR exists to remove, at the last site still holding it. It now reads `pillsOf(useCounterDisplay(objectId))` with no raw-map fallback and no filter, and renders `∞` using the spelling the other four sites already share. The hook is placed with the other hooks, above `if (!obj) return null` — at the natural spot beside the old counters read it would sit after that early return and be a conditional hook. Also corrects a documentation claim that was wrong in a way a test was hiding. `counter_display_views` drops zero-count rows only in its finite pass; the unbounded pass publishes a live count, so a `count: 0` Unbounded row is legitimate and must stay displayable — it is exactly the `0 -> 1` case this PR set out to render. The consumer contract in `adapter/types.ts` claimed zero-count entries were dropped outright. The picker fixture had encoded the same misunderstanding: it seeded a zero-count row with no `magnitude`, so serde defaulted it to `Finite` — a shape the engine provably never emits — and asserted it rendered. That row is now nonzero, so the test proves the finite rendering path instead of an omission path, and the zero-count Unbounded case gets real coverage in the attachment tests instead. Finally, the two wire-golden emitters hard-coded the same four channel names with only comments coupling them, so editing one could silently drop a name there while the paired guard in the other still passed. Both now derive from a single `WIRE_GOLDEN_CHANNELS` const, which makes the coupling a compile-time fact: a typo in the shared list now fails both files. Assisted-by: ClaudeCode:claude-opus-4.8 --- client/src/adapter/types.ts | 14 ++++-- .../controls/AttackTargetPicker.tsx | 2 +- .../__tests__/AttackTargetPicker.test.tsx | 13 +++-- .../components/hud/DialogAttachmentCard.tsx | 36 +++++++------ .../__tests__/DialogAttachmentCard.test.tsx | 50 ++++++++++++++++++- client/src/hooks/useCounterDisplay.ts | 35 +++++++------ crates/engine/src/game/derived_views.rs | 2 +- .../tests/integration/combo_infinite_pile.rs | 45 ++++++++++------- .../kilo_live_offer_from_real_dump.rs | 31 ++++++------ .../tests/integration/loop_counter_growth.rs | 5 +- 10 files changed, 157 insertions(+), 76 deletions(-) diff --git a/client/src/adapter/types.ts b/client/src/adapter/types.ts index 7f89ae6f7a..82549aa9c8 100644 --- a/client/src/adapter/types.ts +++ b/client/src/adapter/types.ts @@ -2729,7 +2729,8 @@ export type CounterMagnitude = "Finite" | "Unbounded"; * `"charge"`, `"P1P1"`). `count` is the object's LIVE count and is engine-supplied because a row * may legitimately have no entry in that map at all: a pair the loop pumps from `0 -> 1` is * registered while the object still carries none, so the count is `0` and there is nothing to join - * back to. Re-deriving it here would also be the FE inferring game state. + * back to. Re-deriving it here would also be the FE inferring game state. That `count: 0` case is + * `"Unbounded"`-only — the finite pass drops zero entries, the unbounded pass does not. */ export interface CounterRowView { counter: CounterType; @@ -3024,8 +3025,15 @@ export interface DerivedViews { * * CONTRACT FOR CONSUMERS: render `pills` in the order given; never sort, never filter, * never read `obj.counters`; `magnitude` absent means `"Finite"`. The engine already - * dropped zero-count entries (CR 122.1), partitioned loyalty (CR 306.5c), deduplicated - * across seats, and ordered the rows (`∞` first, then `CounterType` order). + * partitioned loyalty (CR 306.5c), deduplicated across seats, and ordered the rows (`∞` + * first, then `CounterType` order). + * + * ZERO COUNTS ARE DROPPED IN THE FINITE PASS ONLY. `counter_display_views`' FINITE pass + * admits through `positive_counter_entries` (CR 122.1 — a zero map entry is not a marker), + * so no `"Finite"` row ever carries `count: 0`. The UNBOUNDED pass has NO zero filter: it + * reads the live count for a REGISTERED pair, so an `"Unbounded"` row legitimately carries + * `count: 0` for a pair the loop pumps `0 -> 1`. A consumer that filters on `count > 0` + * therefore deletes real `∞` rows — which is why consumers filter nothing. * * An object with no renderable row is absent from this map; the whole field is omitted * when no object has one. Mirrors diff --git a/client/src/components/controls/AttackTargetPicker.tsx b/client/src/components/controls/AttackTargetPicker.tsx index 3502054167..719f8834ee 100644 --- a/client/src/components/controls/AttackTargetPicker.tsx +++ b/client/src/components/controls/AttackTargetPicker.tsx @@ -825,7 +825,7 @@ interface StackLabelProps { function StackLabel({ stack, t, hoverProps }: StackLabelProps) { const ptLabel = objectPtLabel(stack.representative ?? undefined); // CR 122.1 + CR 306.5c: the engine's counter-display projection is the single authority — - // it already dropped zero rows, split the loyalty total out, and ordered the pills. Keyed on + // it already dropped zero FINITE rows, split the loyalty total out, and ordered the pills. Keyed on // `ids[0]` because that is exactly the object `representative` is defined as (combat.ts), so // the hook call is unconditional and the chips match the row set `groupKey` grouped on. const counters = pillsOf(useCounterDisplay(stack.ids[0])); diff --git a/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx b/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx index f33c478602..6fb313027a 100644 --- a/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx +++ b/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx @@ -221,10 +221,13 @@ describe("AttackTargetPicker", () => { "101": { pills: [ { counter: "charge", count: 4 }, - // CR 122.1: engine-supplied row with NO entry in the raw map — a pair pumped - // 0 -> 1 is registered while the object still carries none, so it is - // unreachable by any client-side derivation from `obj.counters`. - { counter: "lore", count: 0 }, + // CR 122.1: engine-supplied row with NO entry in the raw map, so it is + // unreachable by any client-side derivation from `obj.counters`. Count is + // nonzero on purpose: the FINITE pass of `counter_display_views` runs + // `positive_counter_entries`, so a zero-count Finite row is a shape the engine + // provably never emits. (Zero-count UNBOUNDED rows are real and are covered in + // `hud/__tests__/DialogAttachmentCard.test.tsx`.) + { counter: "lore", count: 3 }, ], }, }, @@ -245,7 +248,7 @@ describe("AttackTargetPicker", () => { expect(screen.getAllByText("charge x4").length).toBeGreaterThan(0); expect(screen.queryAllByText("charge x99")).toHaveLength(0); // Projection-only row renders even though the raw map has no such key. - expect(screen.getAllByText("lore x0").length).toBeGreaterThan(0); + expect(screen.getAllByText("lore x3").length).toBeGreaterThan(0); // Raw-map-only entry the projection dropped must NOT render. expect(screen.queryAllByText("stun x2")).toHaveLength(0); }); diff --git a/client/src/components/hud/DialogAttachmentCard.tsx b/client/src/components/hud/DialogAttachmentCard.tsx index 0d70705b90..03714cbc6e 100644 --- a/client/src/components/hud/DialogAttachmentCard.tsx +++ b/client/src/components/hud/DialogAttachmentCard.tsx @@ -4,6 +4,7 @@ import { useTranslation } from "react-i18next"; import type { ObjectId } from "../../adapter/types.ts"; import { dispatchAction } from "../../game/dispatch.ts"; import { useCardHover } from "../../hooks/useCardHover.ts"; +import { isUnbounded, pillsOf, useCounterDisplay } from "../../hooks/useCounterDisplay.ts"; import { useCanActForWaitingState, usePlayerId, waitingPlayer } from "../../hooks/usePlayerId.ts"; import { cardImageLookup } from "../../services/cardImageLookup.ts"; import { useGameStore } from "../../stores/gameStore.ts"; @@ -108,14 +109,15 @@ export function DialogAttachmentCard({ objectId, widthPx, onDismiss }: Props) { const { handlers, firedRef } = useCardHover(objectId); + // CR 122.1 + CR 306.5c: the engine's counter-display projection is the single authority — + // it already dropped zero FINITE rows, split the loyalty total out of the pill strip, and + // ordered the pills, so nothing is filtered or sorted here. Called ABOVE the `!obj` early + // return: a hook below it would be conditional and break render order (`tsc` cannot see it). + const counters = pillsOf(useCounterDisplay(objectId)); + if (!obj) return null; const lookup = cardImageLookup(obj); - // Non-loyalty counters only — loyalty applies to planeswalkers, never Auras. - const counters = Object.entries(obj.counters).filter( - (entry): entry is [string, number] => - entry[0] !== "loyalty" && entry[1] != null && entry[1] > 0, - ); const sizeVars: CSSProperties = { "--card-w": `${widthPx}px`, @@ -211,15 +213,21 @@ export function DialogAttachmentCard({ objectId, widthPx, onDismiss }: Props) { )} {counters.length > 0 && (
- {counters.map(([type, count]) => ( - - - {formatCounterType(type)} x{count} - - - ))} + {counters.map((row) => { + const type = row.counter; + // CR 732.2a / CR 701.34a: an accepted counter-growth loop pumps this counter + // unboundedly — render ∞ instead of the (still-finite) real count. + const unbounded = isUnbounded(row); + return ( + + + {formatCounterType(type)} {unbounded ? "∞" : `x${row.count}`} + + + ); + })}
)}
diff --git a/client/src/components/hud/__tests__/DialogAttachmentCard.test.tsx b/client/src/components/hud/__tests__/DialogAttachmentCard.test.tsx index 3239777d91..8507f211ac 100644 --- a/client/src/components/hud/__tests__/DialogAttachmentCard.test.tsx +++ b/client/src/components/hud/__tests__/DialogAttachmentCard.test.tsx @@ -94,12 +94,15 @@ function seed(options: { abilities?: unknown[]; legalActionsByObject?: Record; waitingFor?: WaitingFor; + counters?: GameObject["counters"]; + derived?: GameState["derived"]; }) { - const curse = makeCurse(options.abilities ?? [{ effect: { type: "Tap" } }]); + const base = makeCurse(options.abilities ?? [{ effect: { type: "Tap" } }]); + const curse = options.counters ? { ...base, counters: options.counters } : base; const waitingFor = options.waitingFor ?? buildPriorityWaitingFor(); useGameStore.setState({ gameMode: "local", - gameState: makeState(curse, waitingFor), + gameState: { ...makeState(curse, waitingFor), derived: options.derived }, waitingFor, legalActions: [], legalActionsByObject: options.legalActionsByObject ?? {}, @@ -209,4 +212,47 @@ describe("DialogAttachmentCard activation gate", () => { expect(useUiStore.getState().pendingAbilityChoice).toBeNull(); expect(benign.onDismiss).toHaveBeenCalledTimes(1); }); + + // FU-B: this site now consumes `derived.counter_display` with NO raw-map fallback and no + // filter. The raw map and the projection DISAGREE on every axis, so a reintroduced + // `Object.entries(obj.counters)` read (or a join back to it) fails at least one assertion. + // + // MEASURED (drop side): restoring the raw-map read fails with + // `Unable to find an element with the text: charge x4` (the projection count is gone, + // `charge x99` renders instead). + it("renders finite pills from the engine projection, never the raw counters map (CR 122.1)", () => { + seed({ + counters: { charge: 99, stun: 2 }, + derived: { counter_display: { [String(CURSE_ID)]: { pills: [{ counter: "charge", count: 4 }] } } }, + }); + + // Projection count wins over the raw map's disagreeing count. + expect(screen.getByText("charge x4")).toBeTruthy(); + expect(screen.queryByText("charge x99")).toBeNull(); + // Raw-map-only entry the projection dropped must NOT render. + expect(screen.queryByText("stun x2")).toBeNull(); + }); + + // CR 732.2a / CR 701.34a: the pill the superseded raw-map renderer could not express at all. + // `count: 0` is deliberate — the UNBOUNDED pass of `counter_display_views` has no zero filter, + // so a 0 -> 1 growth loop legitimately publishes an Unbounded row whose live count is still 0. + // + // MEASURED (drop side): restoring the raw-map read fails with + // `Unable to find an element with the text: charge ∞` — the map has no `charge` key at all, + // and even seeded it could only ever render a finite `x0`, which the old `> 0` filter dropped. + it("renders an Unbounded pill as ∞ even at count 0 (CR 732.2a)", () => { + seed({ + counters: {}, + derived: { + counter_display: { + [String(CURSE_ID)]: { + pills: [{ counter: "charge", count: 0, magnitude: "Unbounded" }], + }, + }, + }, + }); + + expect(screen.getByText("charge ∞")).toBeTruthy(); + expect(screen.queryByText("charge x0")).toBeNull(); + }); }); diff --git a/client/src/hooks/useCounterDisplay.ts b/client/src/hooks/useCounterDisplay.ts index 85a1f8d075..62b5bb2448 100644 --- a/client/src/hooks/useCounterDisplay.ts +++ b/client/src/hooks/useCounterDisplay.ts @@ -11,10 +11,16 @@ const EMPTY_PILLS: ReadonlyArray = []; * partitioned and ordered them. * * The engine's `counter_display` projection is the SINGLE authority for counter display. It - * already dropped zero-count entries (CR 122.1 — a zero map entry is not a marker), split the - * loyalty TOTAL out of the pill strip (CR 306.5c), deduplicated across seats, and ordered the - * rows (`∞` first, then `CounterType` order). So this hook joins nothing, filters nothing, sorts - * nothing, and interprets no counter type — it is one keyed lookup. + * already split the loyalty TOTAL out of the pill strip (CR 306.5c), deduplicated across seats, + * and ordered the rows (`∞` first, then `CounterType` order). So this hook joins nothing, filters + * nothing, sorts nothing, and interprets no counter type — it is one keyed lookup. + * + * ZERO COUNTS ARE DROPPED IN THE FINITE PASS ONLY, and a consumer that re-filters on + * `count > 0` therefore deletes real rows. `counter_display_views`' finite pass admits through + * `positive_counter_entries` (CR 122.1 — a zero map entry is not a marker), so no `Finite` row + * carries `count: 0`; its UNBOUNDED pass has NO zero filter and reads the live count for a + * REGISTERED pair, so an `Unbounded` row legitimately carries `count: 0` for a pair the loop + * pumps `0 -> 1`. * * THERE IS NO FALLBACK TO `objects[id].counters`, AND ONE MUST NOT BE ADDED — not here, not in a * render site, not in `groupKey`. A frame that arrives with no `derived` renders NO counter pills @@ -41,17 +47,17 @@ const EMPTY_PILLS: ReadonlyArray = []; * the fix lands at every `groupByName` consumer at once instead of per chip. `isUnboundedPile`'s * `.every()` stays as written: it is a fail-safe over a channel `groupKey` does not key on. * - * Subscribed today by exactly FOUR render sites: `board/PermanentCard`, `card/ArtCropCard`, - * `card/CardPreview`'s `CardInfoPanel`, and `controls/AttackTargetPicker`'s `StackLabel`. + * Subscribed today by exactly FIVE render sites — EVERY counter DISPLAY surface in the client: + * `board/PermanentCard`, `card/ArtCropCard`, `card/CardPreview`'s `CardInfoPanel`, + * `controls/AttackTargetPicker`'s `StackLabel`, and `hud/DialogAttachmentCard`. FU-B (the last + * one) landed with this ledger revision; it previously enumerated and re-filtered + * `obj.counters`, so it could not express an `Unbounded` pill at all. * * Every surviving reader of the raw `objects[id].counters` map, measured with `git grep` and * cross-checked with `ast-grep` (an `Object.entries`-shaped pattern alone MISSES the indexed - * reads, which is how an earlier census undercounted this list): - * - FU-B `hud/DialogAttachmentCard` (`:115`) — the one remaining DISPLAY site, and the only - * entry here that is a pending conversion. It re-implements the projection's own work - * (drops zero rows, excludes `loyalty`). `__tests__/DialogAttachmentCard.test.tsx` EXISTS, - * so this is NOT blocked on a missing test file (an earlier revision of this ledger claimed - * it was); it is simply outside the frozen scope of the change that subscribed FU-A. + * reads, which is how an earlier census undercounted this list). BOTH are DELIBERATE, PERMANENT + * EXCLUSIONS — neither is a display site, and neither is a pending conversion. There is no + * remaining conversion work: * - `modal/CardChoiceModal` (`:1712`, `:1715`, in `removableCounterCostEntries`) — NOT a * display site and NOT a pending conversion. It enumerates which counters are legal to * REMOVE AS A COST — CR 118.3, a player can't pay a cost without the resources to pay it @@ -66,7 +72,8 @@ const EMPTY_PILLS: ReadonlyArray = []; * value of the counter its own +/- buttons are about to `ModifyCounters`, `loyalty` * included. It needs the writable map it mutates, not the CR 306.5c-partitioned view. * - * Do not claim this hook covers every counter render site until FU-B lands. + * This hook now covers every counter render site. A NEW raw-map DISPLAY reader is a regression, + * not an omission — add it to the subscribed list above, or justify it here as a third exclusion. */ export function useCounterDisplay(objectId: ObjectId): ObjectCounterDisplay { return useGameStore( @@ -79,7 +86,7 @@ export const pillsOf = (display: ObjectCounterDisplay): ReadonlyArray row?.magnitude === "Unbounded"; diff --git a/crates/engine/src/game/derived_views.rs b/crates/engine/src/game/derived_views.rs index e420cc235b..eddf05d5e4 100644 --- a/crates/engine/src/game/derived_views.rs +++ b/crates/engine/src/game/derived_views.rs @@ -716,7 +716,7 @@ pub struct DerivedViews { /// `(ObjectId, CounterType)`, so the per-seat store holding one pair twice yields one row. /// /// ORDER: `Unbounded` rows lead, then `CounterType`'s declaration `Ord` inside each class. - /// The lead is display salience under clipping — all three subscribed strips are fixed-size + /// The lead is display salience under clipping — all five subscribed strips are fixed-size /// overlay stacks, so a row pushed past the fold is a row the player does not see, and the `∞` /// state is the exceptional one. The finite tie-break is `CounterType`'s `Ord` because that is /// already the order `counter_map_serde` puts `objects[*].counters` on the wire in, so the diff --git a/crates/engine/tests/integration/combo_infinite_pile.rs b/crates/engine/tests/integration/combo_infinite_pile.rs index 52ecadd780..9625a22d80 100644 --- a/crates/engine/tests/integration/combo_infinite_pile.rs +++ b/crates/engine/tests/integration/combo_infinite_pile.rs @@ -57,6 +57,24 @@ use std::collections::BTreeSet; use super::support::shared_card_db; +/// The `DerivedViews` channels both client wire goldens are lifted from, declared ONCE and +/// referenced by path from `kilo_live_offer_from_real_dump` so the two emitters cannot drift. +/// Previously each file hard-coded its own copy of these four names with only a comment coupling +/// them: `filter_map` silently DROPS a name that matches no field, and each file's drift compare +/// then reads a committed golden written by the same typo, so both sides omit the channel and +/// agree with themselves. One shared array makes an edit land on both emitters at once. +/// +/// Neither frame carries all four (this file's has no `counter_display`; kilo's has no +/// `unbounded_pile`), so each non-vacuity guard asserts this set MINUS the one name its frame +/// legitimately lacks — which is what makes the union of the two guards span all four by +/// construction rather than by comment. +pub(crate) const WIRE_GOLDEN_CHANNELS: [&str; 4] = [ + "unbounded_pile", + "unbounded_resources", + "counter_display", + "unbounded_families", +]; + const P0: PlayerId = PlayerId(0); const P1: PlayerId = PlayerId(1); const P2: PlayerId = PlayerId(2); @@ -252,15 +270,10 @@ fn real_4p_object_growth_accept_writes_infinite_pile() { // workspace — see Cargo.lock), so `to_value` re-sorts every map key. Measured byte-identical // across independent test processes. No normalization needed. let wire = serde_json::to_value(&derived).expect("derived views serialize"); - let golden: serde_json::Map = [ - "unbounded_pile", - "unbounded_resources", - "counter_display", - "unbounded_families", - ] - .into_iter() - .filter_map(|k| wire.get(k).map(|v| (k.to_string(), v.clone()))) - .collect(); + let golden: serde_json::Map = WIRE_GOLDEN_CHANNELS + .into_iter() + .filter_map(|k| wire.get(k).map(|v| (k.to_string(), v.clone()))) + .collect(); let path = concat!( env!("CARGO_MANIFEST_DIR"), "/../../client/src/test/fixtures/unbounded-token-wire.json" @@ -295,16 +308,14 @@ fn real_4p_object_growth_accept_writes_infinite_pile() { // PER-FILE RESIDUAL, CLOSED BY THE PAIR: this frame legitimately carries no `counter_display`, // and a name a frame never populates is indistinguishable from a mistyped one from inside that // frame. `kilo_live_offer_from_real_dump`'s twin guard covers `counter_display` (and this file - // covers the `unbounded_pile` its frame lacks). The UNION of the two guards spans all four - // names ONLY while both arrays keep the same four — do not change one array without the other. + // covers the `unbounded_pile` its frame lacks). The union spans all four BY CONSTRUCTION: both + // guards are `WIRE_GOLDEN_CHANNELS` minus the one name their own frame lacks, so a name added + // to the shared array reds whichever frame does not carry it instead of being silently dropped. let channels: BTreeSet<&str> = golden.keys().map(String::as_str).collect(); + let mut expected = BTreeSet::from(WIRE_GOLDEN_CHANNELS); + expected.remove("counter_display"); assert_eq!( - channels, - BTreeSet::from([ - "unbounded_families", - "unbounded_pile", - "unbounded_resources" - ]), + channels, expected, "the golden key list names a field `DerivedViews` does not have, or this frame stopped \ carrying one it must: a mistyped name is dropped silently and the drift compare below \ then agrees with itself. Check every name against `DerivedViews`." diff --git a/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs b/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs index ec929c9507..e3f526191d 100644 --- a/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs +++ b/crates/engine/tests/integration/kilo_live_offer_from_real_dump.rs @@ -595,15 +595,13 @@ fn kilo_accept_marks_pentad_charge_as_unbounded_display_target() { // workspace — see Cargo.lock), so `to_value` re-sorts every map key. Measured byte-identical // across independent test processes. No normalization needed. let wire = serde_json::to_value(&views).expect("derived views serialize"); - let golden: serde_json::Map = [ - "unbounded_pile", - "unbounded_resources", - "counter_display", - "unbounded_families", - ] - .into_iter() - .filter_map(|k| wire.get(k).map(|v| (k.to_string(), v.clone()))) - .collect(); + // Shared with `combo_infinite_pile`'s emitter — see `WIRE_GOLDEN_CHANNELS` for why the two + // copies of this list had to become one. + let golden: serde_json::Map = + crate::combo_infinite_pile::WIRE_GOLDEN_CHANNELS + .into_iter() + .filter_map(|k| wire.get(k).map(|v| (k.to_string(), v.clone()))) + .collect(); let path = concat!( env!("CARGO_MANIFEST_DIR"), "/../../client/src/test/fixtures/unbounded-counter-wire.json" @@ -677,16 +675,15 @@ fn kilo_accept_marks_pentad_charge_as_unbounded_display_target() { // PER-FILE RESIDUAL, CLOSED BY THE PAIR: this frame legitimately carries no `unbounded_pile`, // and a name a frame never populates is indistinguishable from a mistyped one from inside that // frame. `combo_infinite_pile`'s twin guard covers `unbounded_pile` (and this file covers the - // `counter_display` its frame lacks). The UNION of the two guards spans all four names ONLY - // while both arrays keep the same four — do not change one array without the other. + // `counter_display` its frame lacks). The union spans all four BY CONSTRUCTION: both guards are + // `WIRE_GOLDEN_CHANNELS` minus the one name their own frame lacks, so a name added to the + // shared array reds whichever frame does not carry it instead of being silently dropped. let channels: std::collections::BTreeSet<&str> = golden.keys().map(String::as_str).collect(); + let mut expected = + std::collections::BTreeSet::from(crate::combo_infinite_pile::WIRE_GOLDEN_CHANNELS); + expected.remove("unbounded_pile"); assert_eq!( - channels, - std::collections::BTreeSet::from([ - "counter_display", - "unbounded_families", - "unbounded_resources", - ]), + channels, expected, "the golden key list names a field `DerivedViews` does not have, or this frame stopped \ carrying one it must: a mistyped name is dropped silently and the drift compare below \ then agrees with itself. Check every name against `DerivedViews`." diff --git a/crates/engine/tests/integration/loop_counter_growth.rs b/crates/engine/tests/integration/loop_counter_growth.rs index 709bcd24d6..4ae8ef2f55 100644 --- a/crates/engine/tests/integration/loop_counter_growth.rs +++ b/crates/engine/tests/integration/loop_counter_growth.rs @@ -636,8 +636,9 @@ fn plus_one_counter_growth_registers_a_target_the_bearer_does_not_yet_carry() { /// unconditionally, so two controllers whose accepted loops pump the same pair emitted the pair /// TWICE. Both rows are byte-identical — the count is read from `state.objects` keyed only by /// `(id, ct)`, with no seat input — so this is a duplicate, never a "whose count wins" question. -/// Downstream, all three render sites (`board/PermanentCard`, `card/ArtCropCard`, -/// `card/CardPreview`) key their pill on the counter TYPE alone, so a duplicate row is two React +/// Downstream, all five render sites (`board/PermanentCard`, `card/ArtCropCard`, +/// `card/CardPreview`, `controls/AttackTargetPicker`, `hud/DialogAttachmentCard`) key their pill +/// on the counter TYPE alone, so a duplicate row is two React /// children sharing one key: undefined reconciliation plus a dev warning. The frontend cannot fix /// this — deduping engine-published game state in the display layer is exactly what this codebase /// forbids — so the collapse belongs here, at the seam that owns the row set. From 89d739310ff6282093f758821ff0e235ba8f4b70 Mon Sep 17 00:00:00 2001 From: lgray Date: Sat, 8 Aug 2026 19:20:53 -0500 Subject: [PATCH 12/13] test(client): guard the zero-count unbounded row at the two sites that could not MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A zero-count `Unbounded` row is legitimate and must stay displayable — it is the `0 -> 1` case this PR set out to render, and the reason the engine drops zero rows only in its finite pass. Three of the five subscribed render sites had a fixture that would catch a `count > 0` filter deleting those rows. Two did not. The picker lost its guard in this PR. Its fixture had seeded a zero-count row with no `magnitude`, so serde defaulted it to `Finite` — a shape the engine provably never emits — and the previous commit correctly made it nonzero. But the right replacement was a *valid* zero row, not none: removing it left the site unable to detect the regression its own comments warn about. It now carries a zero-count `Unbounded` row asserted as `∞`. The art-crop gap is older than this PR and is closed here too, since it is one fixture in a file already changed and it completes an invariant this PR is what establishes. Both new assertions were probed with the mutant they exist to catch, and each is the sole failure under it, so neither rides another assertion's coverage. The picker's separate projection-vs-raw-map discriminator was re-checked and still fails under a join-back mutant. Assisted-by: ClaudeCode:claude-opus-4.8 --- .../card/__tests__/ArtCropCard.test.tsx | 23 +++++++++++++++++++ .../__tests__/AttackTargetPicker.test.tsx | 10 ++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/client/src/components/card/__tests__/ArtCropCard.test.tsx b/client/src/components/card/__tests__/ArtCropCard.test.tsx index e114123217..c7dda5ed9c 100644 --- a/client/src/components/card/__tests__/ArtCropCard.test.tsx +++ b/client/src/components/card/__tests__/ArtCropCard.test.tsx @@ -338,6 +338,29 @@ describe("ArtCropCard", () => { expect(screen.queryByText("2")).not.toBeInTheDocument(); }); + // CR 122.1: a ZERO-count unbounded row is a shape the engine really emits — the unbounded pass + // of `counter_display_views` publishes its live count with no zero filter (only the finite pass + // runs `positive_counter_entries`). That is the `0 → 1` case, so it must still render as ∞; a + // `count > 0` filter over the projected rows here would silently delete real ∞ badges. + it("renders ∞ for a zero-count unbounded counter (CR 122.1 art-crop mode)", () => { + mockUseCardImage.mockReturnValue({ src: "card.png", isLoading: false, isRotated: false, isFlip: false }); + const permanent = pentadWithCharge(); + useGameStore.setState({ + gameState: { + objects: { [permanent.id]: permanent }, + derived: { + counter_display: { + [permanent.id]: { pills: [{ counter: "charge", count: 0, magnitude: "Unbounded" }] }, + }, + }, + } as never, + }); + + render(); + + expect(screen.getByText("∞")).toBeInTheDocument(); + }); + it("renders the finite count when the counter is NOT marked unbounded (discriminator)", () => { mockUseCardImage.mockReturnValue({ src: "card.png", isLoading: false, isRotated: false, isFlip: false }); const permanent = pentadWithCharge(); diff --git a/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx b/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx index 6fb313027a..51ce3cd9f7 100644 --- a/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx +++ b/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx @@ -225,9 +225,13 @@ describe("AttackTargetPicker", () => { // unreachable by any client-side derivation from `obj.counters`. Count is // nonzero on purpose: the FINITE pass of `counter_display_views` runs // `positive_counter_entries`, so a zero-count Finite row is a shape the engine - // provably never emits. (Zero-count UNBOUNDED rows are real and are covered in - // `hud/__tests__/DialogAttachmentCard.test.tsx`.) + // provably never emits. { counter: "lore", count: 3 }, + // CR 122.1: a zero-count UNBOUNDED row IS a shape the engine emits — the + // unbounded pass publishes its live count with no zero filter, so this is the + // `0 → 1` case. It must still render (as ∞), which is what fails if this site + // ever reintroduces a `count > 0` filter over the projected rows. + { counter: "quest", count: 0, magnitude: "Unbounded" }, ], }, }, @@ -249,6 +253,8 @@ describe("AttackTargetPicker", () => { expect(screen.queryAllByText("charge x99")).toHaveLength(0); // Projection-only row renders even though the raw map has no such key. expect(screen.getAllByText("lore x3").length).toBeGreaterThan(0); + // Zero-count unbounded row survives to the screen as ∞ — a `count > 0` filter deletes it. + expect(screen.getAllByText("quest ∞").length).toBeGreaterThan(0); // Raw-map-only entry the projection dropped must NOT render. expect(screen.queryAllByText("stun x2")).toHaveLength(0); }); From 9340075add0d4ae9f846243d3ae08631ee35bb02 Mon Sep 17 00:00:00 2001 From: lgray Date: Sat, 8 Aug 2026 19:42:40 -0500 Subject: [PATCH 13/13] test(client): order the picker pill fixture the way the engine emits it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fixture seeded `[charge(Finite), lore(Finite), quest(Unbounded)]`, which is the exact reverse of what `counter_display_views` produces for that content: the unbounded pass runs first, then the finite rows in `CounterType` declaration order, where `Lore` precedes `Generic("charge")`. `derived_views` states that contract directly — "`Unbounded` rows lead, then `CounterType`'s declaration `Ord` inside each class" — so the PR was shipping a documented order alongside a fixture demonstrating its reverse. Nothing was failing: every assertion in that test is order-independent, and the fixture's contents are unchanged. It is fixed because row order is load-bearing downstream — `battlefieldProps` folds it into `groupKey` — and a fixture depicting a frame the engine cannot emit invites the wrong conclusion about whether order matters. A comment now names the authority so the next row added does not re-scramble it. No order-asserting UI test accompanies this, deliberately. Order is already pinned engine-side, where `loop_counter_growth` asserts a real projection's row sequence; asserting it again at a render site would put a second authority for counter display back in the display layer, which is what this PR removes. Assisted-by: ClaudeCode:claude-opus-4.8 --- .../__tests__/AttackTargetPicker.test.tsx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx b/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx index 51ce3cd9f7..b3d747fa77 100644 --- a/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx +++ b/client/src/components/controls/__tests__/AttackTargetPicker.test.tsx @@ -219,19 +219,25 @@ describe("AttackTargetPicker", () => { derived: { counter_display: { "101": { + // Row order is the engine's, not this file's: `counter_display_views` runs the + // `Unbounded` pass first, then the `Finite` one through a `BTreeMap`, so + // `Unbounded` rows lead and each class is ordered by `CounterType`'s DECLARATION + // `Ord` — where `Lore` precedes `Generic(_)`. No assertion below depends on it + // (order is pinned engine-side), but a fixture in a different order than the + // engine can ever emit is a false picture of the frame this site receives. pills: [ - { counter: "charge", count: 4 }, + // CR 122.1: a zero-count UNBOUNDED row IS a shape the engine emits — the + // unbounded pass publishes its live count with no zero filter, so this is the + // `0 → 1` case. It must still render (as ∞), which is what fails if this site + // ever reintroduces a `count > 0` filter over the projected rows. + { counter: "quest", count: 0, magnitude: "Unbounded" }, // CR 122.1: engine-supplied row with NO entry in the raw map, so it is // unreachable by any client-side derivation from `obj.counters`. Count is // nonzero on purpose: the FINITE pass of `counter_display_views` runs // `positive_counter_entries`, so a zero-count Finite row is a shape the engine // provably never emits. { counter: "lore", count: 3 }, - // CR 122.1: a zero-count UNBOUNDED row IS a shape the engine emits — the - // unbounded pass publishes its live count with no zero filter, so this is the - // `0 → 1` case. It must still render (as ∞), which is what fails if this site - // ever reintroduces a `count > 0` filter over the projected rows. - { counter: "quest", count: 0, magnitude: "Unbounded" }, + { counter: "charge", count: 4 }, ], }, },

;v=CypuTZYrC8 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
N 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
5|0*&o9Rijn$FH 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 uEkend7Qm(nL String { use std::io::Read; let mut json = String::new(); @@ -73,6 +108,22 @@ fn load_migrated_dump() -> GameState { .into_game_state() } +/// Load the REPORTED playtest capture — the dump the "offer says ∞, collapse allows 1" bug was +/// filed from — through the same production restore chokepoint `load_migrated_dump` uses. It is a +/// DIFFERENT game from `kilo_freed_relic_pentad_4p.json.gz` (different seed, board size, phase and +/// ObjectIds); this is the one the regression row drives, so nobody has to argue that the older +/// fixture stands in for it. +fn load_reported_capture() -> GameState { + let json = gunzip(include_bytes!( + "../fixtures/kilo_freed_relic_pentad_max_of_one_4p.json.gz" + )); + let envelope: serde_json::Value = + serde_json::from_str(&json).expect("capture envelope parses as JSON"); + serde_json::from_value::(envelope["gameState"].clone()) + .expect("the reported capture's gameState deserializes through the production decoder") + .into_game_state() +} + /// The acting player for the current beat (choice prompts carry their own `player`; a priority beat /// is answered by the live holder so the multiplayer APNAP pass is authorized). fn beat_actor(state: &GameState) -> PlayerId { @@ -90,12 +141,12 @@ fn beat_actor(state: &GameState) -> PlayerId { /// fire live — this is NOT a simulation probe). Answers each fixed choice with the loop's demanded /// value (tap Kilo, Blue mana, proliferate Pentad), activates Freed once, and settles at the first /// of `{empty-stack Priority, LoopShortcut}` reached after Freed resolves. -fn drive_one_live_cycle(state: &mut GameState) { +fn drive_one_live_cycle(state: &mut GameState, ids: &LoopIds) { apply( state, P0, GameAction::ActivateAbility { - source_id: RELIC, + source_id: ids.relic, ability_index: RELIC_TAP_MANA, }, ) @@ -111,8 +162,14 @@ fn drive_one_live_cycle(state: &mut GameState) { kind: PayCostKind::TapCreatures { .. }, .. } => { - apply(state, actor, GameAction::SelectCards { cards: vec![KILO] }) - .expect("tap Kilo for the Relic mana ability"); + apply( + state, + actor, + GameAction::SelectCards { + cards: vec![ids.kilo], + }, + ) + .expect("tap Kilo for the Relic mana ability"); } // Relic's "add one mana of any color": choose BLUE to pay Freed's {U}. WaitingFor::ChooseManaColor { .. } => { @@ -132,7 +189,7 @@ fn drive_one_live_cycle(state: &mut GameState) { state, actor, GameAction::SelectTargets { - targets: vec![TargetRef::Object(PENTAD)], + targets: vec![TargetRef::Object(ids.pentad)], }, ) .expect("proliferate Pentad"); @@ -147,7 +204,7 @@ fn drive_one_live_cycle(state: &mut GameState) { state, P0, GameAction::ActivateAbility { - source_id: FREED, + source_id: ids.freed, ability_index: FREED_UNTAP, }, ) @@ -213,7 +270,7 @@ fn kilo_migrated_dump_fires_object_growth_offer() { "Pentad carries 3 charge counters in the real dump" ); - drive_one_live_cycle(&mut state); + drive_one_live_cycle(&mut state, &FIXTURE_IDS); // Non-vacuous reach-guard: the live drive rebuilt a clean, fully-recorded 2-step period. assert_eq!( @@ -302,7 +359,7 @@ fn kilo_reinjected_pinless_history_suppresses_offer() { } state.last_loop_action_sequence = pinless; - drive_one_live_cycle(&mut state); + drive_one_live_cycle(&mut state, &FIXTURE_IDS); // The stale pinless prefix makes `try_offer` re-drive from a pinless `seq[0]` and abort ⇒ // no offer surfaces (the C2 / R3.0-A baseline). @@ -349,6 +406,45 @@ fn drive_all_accept_n(state: &mut GameState, n: u32) { } } +/// Declare the offer's OWN stated count — exactly what the real frontend dispatches +/// (`LoopShortcutModal`'s `handleConfirm` sends `count: schema.iteration_count`, there being no +/// declare-time picker) — then accept in APNAP order. Returns the ceiling the SAME offer +/// published, so a caller can compare the CR 500.5 collapse range against it without restating a +/// literal that would pass on both sides of a regression. +fn drive_all_accept_as_offered(state: &mut GameState) -> u32 { + use engine::analysis::loop_check::ShortcutResponse; + let (proposer, ceiling, offered) = match &state.waiting_for { + WaitingFor::LoopShortcut { + proposer, schema, .. + } => ( + *proposer, + schema.max_iterations, + schema.iteration_count.clone(), + ), + other => panic!("expected a CR 732.2a loop-shortcut offer, got {other:?}"), + }; + apply( + state, + proposer, + GameAction::DeclareShortcut { + count: offered, + template: None, + }, + ) + .expect("the proposer declares the offer's own stated count, as the modal does"); + while let WaitingFor::RespondToShortcut { player, .. } = state.waiting_for.clone() { + apply( + state, + player, + GameAction::RespondToShortcut { + response: ShortcutResponse::Accept, + }, + ) + .expect("each living opponent accepts the as-offered ∞-charge shortcut"); + } + ceiling +} + /// Pass priority (for whichever seat holds it) until the next CR 500.5 phase/step boundary raises /// the deferred-collapse prompt. No player re-drives the loop — the accept cleared the recorded /// `last_loop_action_sequence` — so the phase simply ends and the boundary drain surfaces the @@ -391,7 +487,7 @@ fn kilo_accept_marks_pentad_charge_as_unbounded_display_target() { use engine::types::counter::CounterType; let mut state = load_migrated_dump(); - drive_one_live_cycle(&mut state); + drive_one_live_cycle(&mut state, &FIXTURE_IDS); // (1) Reach-guard (holds both ways under revert): the ∞-charge offer surfaced for P0. If // this ever regresses, every downstream assertion is vacuous — so it gates them. @@ -628,7 +724,7 @@ fn departed_counter_target_drops_its_pill_but_keeps_its_row_and_store_entry() { use engine::types::zones::Zone; let mut state = load_migrated_dump(); - drive_one_live_cycle(&mut state); + drive_one_live_cycle(&mut state, &FIXTURE_IDS); assert!( matches!(state.waiting_for, WaitingFor::LoopShortcut { proposer, .. } if proposer == P0), "reach-guard: at the CR 732.2a ∞-charge offer for P0, got {:?}", @@ -767,7 +863,7 @@ fn kilo_accept_collapses_at_boundary_to_exactly_n_counters() { let charge = CounterType::Generic("charge".into()); let mut state = load_migrated_dump(); - drive_one_live_cycle(&mut state); + drive_one_live_cycle(&mut state, &FIXTURE_IDS); // (1) Reach-guard (gates everything downstream): the ∞-charge offer surfaced for P0. assert!( @@ -853,3 +949,222 @@ fn kilo_accept_collapses_at_boundary_to_exactly_n_counters() { state.waiting_for ); } + +/// CR 732.2a + CR 732.2c REGRESSION, driven from the ACTUAL REPORTED PLAYTEST CAPTURE (the dump the +/// "the offer says ∞ but the collapse only allows 1" report was filed from — a DIFFERENT game from +/// the older fixture the rows above drive). +/// +/// The unbounded object-growth producer publishes the global safety limit as its ceiling but seeded +/// its stated count with a bare 1. The frontend echoes that stated count verbatim (there is no +/// declare-time picker), CR 732.2c makes the accepted count binding, and the accepted count caps the +/// CR 500.5 collapse prompt — so a stated count below the published ceiling silently picks the +/// controller's number for them. +/// +/// ONE flipping conjunct and THREE reach-guards. The flipping one is the boundary range: it reads +/// the ceiling off the SAME live offer rather than restating a literal, so no arm of it can pass on +/// both sides of the regression. Pre-fix it reads a collapse max of 1 against a published ceiling of +/// 1000. +/// +/// Never hard-code the declared count here: `drive_all_accept_as_offered` reads +/// `schema.iteration_count` to reproduce the frontend echo exactly, and that echo is what makes the +/// row discriminating. Never submit the amount either — the row stops at the prompt, because +/// asserting the offered RANGE is both the claim under test and the cheap path. +#[test] +fn kilo_reported_capture_offer_states_the_full_ceiling_it_publishes() { + let mut state = load_reported_capture(); + + // (1) LOAD REACH-GUARD (holds both ways): the reported capture is what loaded, not a stand-in + // for it. The board is the untouched 4p playtest capture, with the loop's four permanents on + // the controller's battlefield under the MEASURED ids. + assert_eq!( + state.objects.len(), + 409, + "the reported 4p playtest capture loads intact" + ); + for (label, id) in [ + ("Kilo", CAPTURE_IDS.kilo), + ("Freed", CAPTURE_IDS.freed), + ("Relic", CAPTURE_IDS.relic), + ("Pentad", CAPTURE_IDS.pentad), + ] { + let permanent = &state.objects[&id]; + assert_eq!( + (permanent.zone, permanent.controller), + (Zone::Battlefield, P0), + "{label} is on the loop controller's battlefield in the reported capture" + ); + } + + drive_one_live_cycle(&mut state, &CAPTURE_IDS); + + // (2) OFFER REACH-GUARD (holds both ways; gates 3 and 4). This assertion MUST sit here, between + // the live drive and the accept: `drive_all_accept_as_offered` CONSUMES the offer, and its own + // first statement panics on any non-offer beat, so placed after the accept this guard would be + // dead code and its failure mode unreadable. + assert!( + matches!(state.waiting_for, WaitingFor::LoopShortcut { proposer, .. } if proposer == P0), + "reach-guard: the CR 732.2a ∞-charge offer surfaced for the loop's controller, got {:?}", + state.waiting_for + ); + + // Declare the offer's OWN stated count and accept in APNAP order — the exact dispatch the modal + // makes. Returns the ceiling that same offer published. + let ceiling = drive_all_accept_as_offered(&mut state); + + // (3) NON-VACUITY FLOOR (holds both ways): a published ceiling of 1 could not tell a capped + // boundary apart from an honest one. + assert!( + ceiling > 1, + "the offer publishes a ceiling above 1, so a capped boundary is a real narrowing" + ); + + drive_to_collapse_boundary(&mut state); + + // (4) THE FLIPPING ASSERTION. CR 732.2c binds the accepted count, and CR 500.5's collapse prompt + // is capped by it — so the range the controller is offered must reach the ceiling the offer + // itself published. Pre-fix this reads a max of 1 against a ceiling of 1000. + let WaitingFor::PayAmountChoice { + player, + resource: PayableResource::LoopCollapse { .. }, + min, + max, + .. + } = &state.waiting_for + else { + panic!( + "the boundary drive must end at the deferred-collapse prompt it exists to reach, \ + got {:?}", + state.waiting_for + ); + }; + assert_eq!( + *player, P0, + "the loop's controller is the seat asked to name the collapse count" + ); + assert_eq!( + *min, 0, + "CR 732.2b: declining to shorten at every place makes every prefix consented to" + ); + assert_eq!( + *max, ceiling, + "CR 732.2c: the collapse prompt offers the very ceiling the accepted offer published" + ); +} + +/// CR 732.2a + CR 732.2c: the offer has TWO live declare authorities, and they must state the same +/// count. `LoopShortcutModal` echoes `schema.iteration_count` verbatim; the interaction wire echoes +/// it through the published `suggested`, and `AcceptSuggested` turns that `suggested` into the +/// declared `IterationCount`. If they disagree, a client on the wire binds a different CR 732.2c +/// count than the React client binds for the SAME offer. +/// +/// Driven from the REPORTED capture through the real producer — no hand-built schema anywhere, which +/// is exactly what the two `interaction_contract` rows this replaces could not offer. +/// +/// TWO assertions, with DIFFERENT jobs — do not read them as two revert-failing conjuncts. +/// The first is the revert-failing one: pre-fix the published pair reads a suggestion of 1 against a +/// max of 1000, it fails, and because a failing assertion panics, the second never evaluates on that +/// arm. The second is a MUTATION GUARD on the arm that maps the published suggestion to the declared +/// count: post-fix both are green, and forcing that arm to declare a bare 1 reds this row and only +/// this row. Without the second assertion that mutation leaves the row green, which would move the +/// coverage gap by one line instead of closing it. +#[test] +fn kilo_reported_capture_interaction_picker_suggests_the_full_ceiling() { + let mut state = load_reported_capture(); + drive_one_live_cycle(&mut state, &CAPTURE_IDS); + + // Reach-guard (holds both ways): the live offer is what we are about to project. + let WaitingFor::LoopShortcut { + proposer, schema, .. + } = &state.waiting_for + else { + // Wording is deliberately unlike every other abort message in this file — the regression + // triage procedure routes on message text, so two sites must never print a near-match. + panic!( + "the interaction-picker row needs the offer still live at this beat, got {:?}", + state.waiting_for + ); + }; + assert_eq!(*proposer, P0, "the loop's controller proposes the shortcut"); + let ceiling = schema.max_iterations; + // Non-vacuity floor (holds both ways): a ceiling of 1 could not discriminate. + assert!(ceiling > 1, "the offer publishes a ceiling above 1"); + + // Probe on a CLONE. `bind_interaction_authority` takes `&mut GameState`, and nothing in this + // row may perturb a drive; cloning makes the whole projection provably inert. + let mut probe = state.clone(); + bind_interaction_authority( + &mut probe, + InteractionSessionId("wb7048-ceiling".to_string()), + ) + .expect("bind the interaction authority over the live offer"); + let filtered = filter_state_for_viewer(&probe, P0); + let view = derive_viewer_interaction(&probe, &filtered, P0); + let opportunity = view + .opportunities + .first() + .expect("the live offer publishes an interaction opportunity"); + let InteractionOpportunityResponse::Schema { + spec: InteractionResponseSpec::Shortcut { count, points, .. }, + .. + } = &opportunity.response + else { + panic!( + "the live offer publishes a Shortcut response schema, got {:?}", + opportunity.response + ); + }; + let InteractionShortcutCountSpec::Fixed { suggested, max, .. } = count else { + panic!("an Advantage offer publishes a Fixed count spec, got {count:?}"); + }; + + // ASSERTION 1 — THE REVERT-FAILING ONE (hops 1-3): the producer's seed survives the clamp, at + // the offer's own bound. Pre-fix this reads a suggestion of 1 against a max of 1000, fails, and + // panics — so assertion 2 below does not evaluate on the pre-fix arm. + assert_eq!( + (*suggested, *max), + (ceiling, ceiling), + "CR 732.2a: the picker suggests the very ceiling this offer publishes" + ); + + // ASSERTION 2 — THE MUTATION GUARD (hop 4): `AcceptSuggested` declares that suggestion. It is + // green on BOTH arms of the seed fix; what it catches is a change to the arm that maps the + // published suggestion onto the declared count, which assertion 1 cannot see at all. Pins are + // derived from the PUBLISHED points, never by index — one pin per non-read-only point, holding + // exactly that point's `min` choices, which is what the materializer validates. + let pins: Vec = points + .iter() + .filter(|point| !point.read_only) + .map(|point| InteractionShortcutPin { + group: point.group, + choice_ids: point + .candidate_ids + .iter() + .take(point.min as usize) + .cloned() + .collect(), + }) + .collect(); + let action = resolve_interaction_response( + &probe, + P0, + &InteractionSubmission { + interaction_id: opportunity.interaction_id.clone(), + response: InteractionResponse::Shortcut { + decision: InteractionShortcutDecision::AcceptSuggested, + pins, + }, + }, + ) + .expect("AcceptSuggested materializes a declare against the live offer"); + let GameAction::DeclareShortcut { + count: declared, .. + } = &action + else { + panic!("AcceptSuggested materializes a DeclareShortcut, got {action:?}"); + }; + assert_eq!( + *declared, + IterationCount::Fixed(ceiling), + "CR 732.2c: the wire declare binds the same count the React echo binds" + ); +} diff --git a/crates/engine/tests/integration/loop_shortcut.rs b/crates/engine/tests/integration/loop_shortcut.rs index c6d0f8f8f7..eec0aaeb54 100644 --- a/crates/engine/tests/integration/loop_shortcut.rs +++ b/crates/engine/tests/integration/loop_shortcut.rs @@ -4131,7 +4131,7 @@ fn object_growth_random_recast_body_does_not_offer() { /// T1 ⭐: the object-growth (convoke-recast) offer carries exactly ONE `ConvokeTaps` /// decision-point whose `tappable` is the LIVE offer-time `is_convoke_eligible(P0)` set, and an -/// optional-loop `Fixed(1)` iteration seed. Board-derivation (hostile): the creature TAPPED to +/// optional-loop iteration seed EQUAL to the ceiling it publishes. Board-derivation (hostile): the creature TAPPED to /// pay convoke during the real cast is EXCLUDED; an untapped controlled creature is INCLUDED — a /// constant/hard-coded set could not track which creature was spent. Revert-probe: a builder /// that dropped the ConvokeTaps pin (empty points) or hard-coded the set fails these. @@ -4165,8 +4165,13 @@ fn object_growth_offer_schema_has_live_convoke_taps() { schema.points[0].kind ); }; - // Optional Advantage loop ⇒ Fixed(1) frontend count seed (not a determinate drain). - assert_eq!(schema.iteration_count, IterationCount::Fixed(1)); + // CR 732.2a + CR 732.2c: an optional Advantage loop narrows no CR 704 bound, so the offer + // STATES the same global ceiling it publishes — the frontend echoes this value verbatim and + // the accepted count caps the CR 500.5 collapse prompt, so a smaller seed would cap it too. + assert_eq!( + schema.iteration_count, + IterationCount::Fixed(schema.max_iterations) + ); // The tappable set is LIVE-derived from the offer-time board: exactly the untapped creatures // P0 controls (== is_convoke_eligible(P0)), compared as a set. From bd41a5051812e637ac06a9a57a09bee7a8dc8c05 Mon Sep 17 00:00:00 2001 From: lgray Date: Sat, 8 Aug 2026 08:40:53 -0500 Subject: [PATCH 03/13] fix(engine): publish renderable unbounded-counter rows with live counts The engine registered an (object, counter-type) pair as an infinity display target but published only the type. Every client display mode draws pills by iterating the object's own `counters` map, so a pair an accepted loop pumps from 0 -> 1 -- registered while the live object still carries none -- had no row to draw and rendered nowhere. Widening the registration from Generic to the full beneficial-materializable partition enlarged the affected class without touching that mechanism. `DerivedViews::unbounded_counters` now carries `UnboundedCounterView { counter, count }` rather than a bare `CounterType`, with the count read from the live object at projection time. The row is self-sufficient: the display neither infers that a row exists nor computes its count, so the client stays a display layer and the existing regression's prohibition on client-side synthesis remains in force. CR 122.1: a counter is a marker on an object, so a row names an (object, counter) pair rather than a stored quantity; the absent-means-zero convention mirrors `analysis::resource::grown_beneficial_counter_deltas` so producer and projector share one definition of "absent". CR 110.1 / CR 122.2: a row drops when the object leaves the battlefield. CR 306.5c: a planeswalker's loyalty is its loyalty-counter count, so loyalty totals render the infinity marker. CR 606.4 / CR 606.5 keep activation-cost badges out, an activation cost being a number of counters to pay rather than a total. The regression drives the production path -- ActivateAbility, DeclareShortcut, RespondToShortcut::Accept, materialize_object_growth_shortcut, register_unbounded_counter_targets, derive_views -- and asserts the 0 -> 1 row both in `DerivedViews` and in the serialized adapter envelope, with a sibling test pinning a nonzero count so neither can pass vacuously. Reverting the fix reds exactly the two 0 -> 1 tests and leaves every N -> N+1 sibling green. Assisted-by: ClaudeCode:claude-opus-5 --- client/src/adapter/types.ts | 26 +- client/src/components/board/PermanentCard.tsx | 18 +- .../board/__tests__/PermanentCard.test.tsx | 59 +++- client/src/components/card/ArtCropCard.tsx | 18 +- client/src/components/card/CardPreview.tsx | 11 +- .../card/__tests__/ArtCropCard.test.tsx | 4 +- .../card/__tests__/CardPreview.test.tsx | 47 +-- client/src/components/ui/LoyaltyBadge.tsx | 21 +- .../ui/__tests__/LoyaltyBadge.test.tsx | 38 +++ client/src/hooks/useUnboundedCounterRows.ts | 83 ++++++ client/src/hooks/useUnboundedCounterTypes.ts | 29 -- .../test/fixtures/unbounded-counter-wire.json | 5 +- .../src/viewmodel/__tests__/cardProps.test.ts | 3 +- .../__tests__/unboundedWireSeam.test.ts | 36 ++- crates/engine/src/game/derived_views.rs | 73 ++++- crates/engine/src/types/game_state.rs | 9 +- .../tests/integration/combo_infinite_pile.rs | 3 +- .../kilo_live_offer_from_real_dump.rs | 34 ++- .../tests/integration/loop_counter_growth.rs | 269 +++++++++++++++--- 19 files changed, 646 insertions(+), 140 deletions(-) create mode 100644 client/src/hooks/useUnboundedCounterRows.ts delete mode 100644 client/src/hooks/useUnboundedCounterTypes.ts diff --git a/client/src/adapter/types.ts b/client/src/adapter/types.ts index e8ee1f83fb..f4b2fdcf6f 100644 --- a/client/src/adapter/types.ts +++ b/client/src/adapter/types.ts @@ -2981,15 +2981,27 @@ export interface DerivedViews { unbounded_pile?: ObjectId[]; /** * CR 732.2a / CR 701.34a: per-object `∞` counter channel — for each battlefield - * object (keyed by ObjectId-as-string), the counter-type keys whose preserved - * `Generic` counters an accepted counter-growth loop (proliferate charge, burden) - * pumps unboundedly. Each value string matches the object's `counters` map key - * (e.g. `"charge"`). The FE renders `∞` (not `×N`) on any counter pill whose type - * is in this set, and never re-derives which counters are unbounded. Empty/omitted - * when no counter-growth loop is active. Mirrors + * object (keyed by ObjectId-as-string), the engine-authored counter ROWS an accepted + * counter-growth loop pumps unboundedly. Covers the full beneficial materializable + * partition — `Generic` markers (charge, burden), `+1/+1`, loyalty, and defense — + * not `Generic` alone. + * + * SHAPE: each entry is a ROW, not a bare counter-type key. `counter` matches the + * object's `counters` map key (e.g. `"charge"`, `"P1P1"`); `count` is the object's + * live count, which is `0` when the loop pumps a counter the object does not yet + * carry. Render every row as `∞` (never `×N`). Never re-derive which counters are + * unbounded, and never infer a row's count from the object's `counters` map — a row + * may legitimately have no entry there. + * + * CR 306.5c: a `"loyalty"` row means the planeswalker's loyalty TOTAL is unbounded + * (loyalty IS its loyalty-counter count), so the total badge renders `∞`. Loyalty + * ABILITY COST badges are never unbounded (CR 606.4 — a cost is a number of loyalty + * counters to pay, not a total). + * + * Empty/omitted when no counter-growth loop is active. Mirrors * `engine::game::derived_views::DerivedViews::unbounded_counters`. */ - unbounded_counters?: Record; + unbounded_counters?: Record>; } /** Mirrors `engine::types::game_state::NextSpellModifier` (serde tag="type"). */ diff --git a/client/src/components/board/PermanentCard.tsx b/client/src/components/board/PermanentCard.tsx index c2006787a2..8616e1175c 100644 --- a/client/src/components/board/PermanentCard.tsx +++ b/client/src/components/board/PermanentCard.tsx @@ -14,7 +14,7 @@ import { useCardHover } from "../../hooks/useCardHover.ts"; import { useIsCompactHeight } from "../../hooks/useIsCompactHeight.ts"; import { useIsMobile } from "../../hooks/useIsMobile.ts"; import { useLongPress } from "../../hooks/useLongPress.ts"; -import { useUnboundedCounterTypes } from "../../hooks/useUnboundedCounterTypes.ts"; +import { useUnboundedCounterRows } from "../../hooks/useUnboundedCounterRows.ts"; import { useGameStore } from "../../stores/gameStore.ts"; import { renderDescription } from "../../utils/description.ts"; import { usePreferencesStore } from "../../stores/preferencesStore.ts"; @@ -303,7 +303,7 @@ export const PermanentCard = memo(function PermanentCard({ const isCopiedPermanent = useGameStore((s) => (s.gameState?.derived?.copied_permanents ?? []).includes(objectId), ); - const unboundedCounterTypes = useUnboundedCounterTypes(objectId); + const unboundedCounterRows = useUnboundedCounterRows(objectId); const isManaPaymentPreviewSource = useGameStore((s) => s.manaPaymentPreviewSourceIds.includes(objectId), ); @@ -603,8 +603,14 @@ export const PermanentCard = memo(function PermanentCard({ ? undefined : gameObjects?.[String(temporaryCantBeBlockedSourceId)]?.name; - // Filter out loyalty counters — shown separately as the loyalty badge - const counters = Object.entries(obj.counters).filter((entry): entry is [string, number] => entry[1] != null && entry[0] !== "loyalty"); + // Filter out loyalty counters — shown separately as the loyalty badge (which renders its + // own `∞` per CR 306.5c when the engine marks a loyalty row). + const counters = unboundedCounterRows.filter((row) => row.type !== "loyalty"); + // CR 306.5c: a planeswalker's loyalty IS its loyalty-counter count, so an engine `∞` + // loyalty row means the TOTAL is unbounded. + const isLoyaltyUnbounded = unboundedCounterRows.some( + (row) => row.type === "loyalty" && row.isUnbounded, + ); // Tap rotation: 17deg in MTGA mode (or compact-height), 90deg in classic mode const tapBaseOpacity = (isCompactHeight || tapRotation === "mtga") && obj.tapped ? 0.85 : 1; @@ -920,6 +926,7 @@ export const PermanentCard = memo(function PermanentCard({ - {counters.map(([type, count]) => { + {counters.map(({ type, count, isUnbounded }) => { const iconClass = counterIconClass(type); // CR 732.2a / CR 701.34a: an accepted counter-growth loop pumps this // counter unboundedly — render ∞ instead of the (still-finite) real count. - const isUnbounded = unboundedCounterTypes.includes(type); return ( { it("renders ∞ on a counter the engine marks as unbounded", () => { const gameState = makeState(); gameState.objects[1].counters = { charge: 4 }; - gameState.derived = { unbounded_counters: { 1: ["charge"] } }; + gameState.derived = { unbounded_counters: { 1: [{ counter: "charge", count: 4 }] } }; useGameStore.setState({ gameState, waitingFor: gameState.waiting_for }); const { container } = renderPermanent(); @@ -357,6 +357,63 @@ describe("PermanentCard", () => { expect(container.textContent).not.toContain("∞"); }); + // THE `0 -> 1` ROW, at the render layer. The engine registers a pumped pair while the + // object carries NONE of that counter, so the row's `count` is 0 and there is no entry in + // `obj.counters` to join back to. Before the channel published rows, this pill could not be + // drawn at all — the display had nothing to hang `∞` on. + // + // DISCRIMINATOR: the finite `burden` pill in the SAME frame proves the component did not + // simply start rendering `∞` for everything, and it is a positive reach-guard for the + // negative assertion below — without it, "no x0" would pass on a card that rendered no + // pills whatsoever. + it("renders ∞ for a marked counter the object does not yet carry (count 0)", () => { + const gameState = makeState(); + gameState.objects[1].counters = { burden: 2 }; + gameState.derived = { unbounded_counters: { 1: [{ counter: "charge", count: 0 }] } }; + useGameStore.setState({ gameState, waitingFor: gameState.waiting_for }); + + const { container } = renderPermanent(); + + expect(container.textContent).toContain("∞"); + expect(container.textContent).toContain("x2"); + expect(container.textContent).not.toContain("x0"); + }); + + // CR 306.5c: a planeswalker's loyalty IS its loyalty-counter count, so a marked `loyalty` + // row means the TOTAL is unbounded and the BADGE renders ∞. The pill-side "loyalty" filter + // stays, so there is no ∞ pill beside a stale numeric badge. + it("renders ∞ on the loyalty TOTAL badge when the engine marks a loyalty row", () => { + const gameState = makeState(); + gameState.objects[1].loyalty = 4; + gameState.objects[1].counters = { loyalty: 4 }; + gameState.derived = { unbounded_counters: { 1: [{ counter: "loyalty", count: 4 }] } }; + useGameStore.setState({ gameState, waitingFor: gameState.waiting_for }); + + const { container } = renderPermanent(); + const badge = container.querySelector('[data-loyalty-badge="total"]') as HTMLElement; + + expect(badge).toBeInTheDocument(); + expect(badge.textContent).toContain("∞"); + expect(badge.textContent).not.toContain("4"); + // The DOM attribute stays truthful — selectors keep working. + expect(badge.getAttribute("data-loyalty-value")).toBe("4"); + }); + + it("renders the finite loyalty total when no loyalty row is marked", () => { + const gameState = makeState(); + gameState.objects[1].loyalty = 4; + gameState.objects[1].counters = { loyalty: 4 }; + gameState.derived = {}; + useGameStore.setState({ gameState, waitingFor: gameState.waiting_for }); + + const { container } = renderPermanent(); + const badge = container.querySelector('[data-loyalty-badge="total"]') as HTMLElement; + + expect(badge).toBeInTheDocument(); + expect(badge.textContent).toContain("4"); + expect(badge.textContent).not.toContain("∞"); + }); + it("lifts the permanent tree above siblings while keeping attachments behind the host", () => { const { container } = renderPermanent(); const host = container.querySelector('[data-object-id="1"]') as HTMLElement; diff --git a/client/src/components/card/ArtCropCard.tsx b/client/src/components/card/ArtCropCard.tsx index 33d38d3eed..88f98c06ff 100644 --- a/client/src/components/card/ArtCropCard.tsx +++ b/client/src/components/card/ArtCropCard.tsx @@ -5,7 +5,7 @@ import type { PTColor } from "../../viewmodel/cardProps"; import { useCardImage } from "../../hooks/useCardImage.ts"; import { useIsCompactHeight } from "../../hooks/useIsCompactHeight.ts"; import { useIsMobile } from "../../hooks/useIsMobile.ts"; -import { useUnboundedCounterTypes } from "../../hooks/useUnboundedCounterTypes.ts"; +import { useUnboundedCounterRows } from "../../hooks/useUnboundedCounterRows.ts"; import { cardImageLookup, tokenFiltersForObject } from "../../services/cardImageLookup.ts"; import { CARD_BACK_URL } from "../../services/scryfall.ts"; import { useGameStore } from "../../stores/gameStore.ts"; @@ -29,7 +29,7 @@ const PT_COLORS: Record = { export const ArtCropCard = memo(function ArtCropCard({ objectId }: ArtCropCardProps) { const { t } = useTranslation("game"); const obj = useGameStore((s) => s.gameState?.objects[objectId]); - const unboundedCounterTypes = useUnboundedCounterTypes(objectId); + const unboundedCounterRows = useUnboundedCounterRows(objectId); const isMobile = useIsMobile(); const inspectObject = useUiStore((s) => s.inspectObject); const isCompactHeight = useIsCompactHeight(); @@ -79,8 +79,14 @@ export const ArtCropCard = memo(function ArtCropCard({ objectId }: ArtCropCardPr // Kamigawa flip card stores its alternative half in the same slot and has no // face 1 to inspect. Use the engine-provided layout discriminant. const hasDfc = !obj.face_down && hasOtherPrintedFace(obj); - // Filter out loyalty counters — shown separately as the loyalty badge - const counters = Object.entries(obj.counters).filter((entry): entry is [string, number] => entry[1] != null && entry[0] !== "loyalty"); + // Filter out loyalty counters — shown separately as the loyalty badge (which renders its + // own `∞` per CR 306.5c when the engine marks a loyalty row). + const counters = unboundedCounterRows.filter((row) => row.type !== "loyalty"); + // CR 306.5c: a planeswalker's loyalty IS its loyalty-counter count, so an engine `∞` + // loyalty row means the TOTAL is unbounded. + const isLoyaltyUnbounded = unboundedCounterRows.some( + (row) => row.type === "loyalty" && row.isUnbounded, + ); const devotionValue = obj.devotion ?? null; // --- Dynamic Text Sizing Logic --- let ptNumClass = "text-[14px]"; @@ -204,10 +210,9 @@ export const ArtCropCard = memo(function ArtCropCard({ objectId }: ArtCropCardPr {/* Top-right overlay stack: counter badges kept clear of the bottom P/T and loyalty badges. */}