Add opt-in printed Kull interception and saved counter continuation
This commit is contained in:
1 parent
3285172eec
commit
aeae152370
32 files changed
+2487
-146
No files matched your search
+43
-63
@@ -1,6 +1,6 @@
|
||||
# Kull Wahad: source limits and Karama interruption design
|
||||
|
||||
Audit date: 2026-09-06. This is a proposed implementation design, not a rules completion claim. Only this document was changed. The source audit in [CHOAM_REMAINING_RULES.md](CHOAM_REMAINING_RULES.md) remains applicable.
|
||||
Source audit: 2026-09-06; opt-in preview contract updated 30 September 2026. This is an engineering and product-policy record, not a rules-completion claim. The source audit in [CHOAM_REMAINING_RULES.md](CHOAM_REMAINING_RULES.md) remains applicable. The user-approved counter and BG choices supersede the original proposal; publisher-source uncertainty and full expansion gates remain.
|
||||
|
||||
## Authoritative boundary
|
||||
|
||||
@@ -10,19 +10,28 @@ The [November 2020 official FAQ](https://www.gf9games.com/dune/wp-content/upload
|
||||
|
||||
Evidence is indexed official publisher text retrieved in the preceding audit. Direct PDF access was unavailable: HTTP 403 through web retrieval, HTML through a local fetch. No inaccessible card face, tournament amendment, or community ruling is promoted to authority. No later official clarification settling the questions below was located.
|
||||
|
||||
Unresolved rulings that must remain visible:
|
||||
## Selected policy and remaining source limits
|
||||
|
||||
The user selected **Different Karama**: bind and reserve the interrupted physical card, allow a distinct eligible counter before Kull's restriction becomes active, and never let the original pay for both purposes. They selected **Before conversion** for advanced BG substitutions: successful Kull retains the still-unplayed Worthless card. A prevented original special activation leaves its once-per-game use and additional costs unspent. These are explicit product interpretations, not located publisher rulings; see [the recorded selection](CHOAM_KULL_SOURCE_UPDATE.md#user-selected-preview-timing--30-september-2026).
|
||||
|
||||
The user selected **Defer interaction** for a winning overbid whose sole Karama payment becomes unplayable. A late payment guard accepted an unfunded bid and then could not settle it, so the preview now privately refuses non-CHOAM unfunded Karama-dependent bids before commitment, independently of hidden Kull custody. Existing unfunded winning activations also remain guarded. CHOAM self-activations are outside interception and retain their ordinary payment behavior; non-preview bidding is unchanged. This is an explicit unfinished-composition fence, not a printed bidding prohibition, numeric UI cap, auction restart, free award, invented funding or approval of an auction recovery.
|
||||
|
||||
The wider publisher cancellation scope across other physical copies or Worthless names remains unclarified. Preserve existing exact-cost phase prevention rather than silently widening it. Combined modules, simultaneous-power ordering beyond supported continuations and complete CHOAM games remain acceptance boundaries, not a reason to call approved counter/BG choices unanswered.
|
||||
|
||||
## Opt-in development scope
|
||||
|
||||
The explicit `kull` development profile admits Basic or Advanced CHOAM with classic factions, the physical CHOAM and Ix Treachery decks, and **no optional modules**. It does not introduce Ixian/Tleilaxu factions merely because their physical deck is present. Basic uses ordinary printed Karama; Advanced additionally admits BG substitutions and the existing legal special powers of that roster. `initializeKullGameForAudit` opts the newly initialized Game into `kullPreview`; older saved games and ordinary public starts are not retrofitted.
|
||||
|
||||
The visible preview warning and closed expansion/module gates remain mandatory. Printed Kull's preview is not Nexus Cunning Kull, complete CHOAM, full expansion certification or deployed evidence. Checkpoint verification belongs to the integration owner, not this source/guidance update.
|
||||
|
||||
Ordinary cancellation with a live Truthtrance battle or shipment promise must pass the existing pure `assertKaramaPromiseFeasibility` post-cost proof. An unsupported/unprovable suffix is rejected actor-privately before a Kull offer or cost. Proven supported Voice, Prescience, elite, support and aid cancellation paths remain interruptible; no-obligation paths remain unaffected. This is an incomplete preview composition, **not** a publisher prohibition. Do not publicize an unvalidated attempt, release its promise or speculatively execute random effects merely to prove feasibility.
|
||||
|
||||
1. Whether the same Karama that Kull interrupts can instead cancel Kull, whether a second Karama by that target may do so, and how third-party responses are ordered.
|
||||
2. Whether Kull intercepts a Bene Gesserit Worthless conversion before discard, or only after conversion has succeeded; the resulting card custody in each case.
|
||||
3. Whether an already prevented player may still overbid using a held Karama, and the required recovery when an accepted winning bid becomes unpayable.
|
||||
4. Exact cancellation scope for CHOAM's prevented Worthless effect across other physical copies or another Worthless name.
|
||||
5. Self-targeting, simultaneous attempts, and phase-end abilities that may exchange a card while another declaration is unresolved.
|
||||
|
||||
Real Karama used for cancellation, shipment, purchase/payment, or a special faction power all fit the general attempted-play wording. Applying Kull to each is a strong textual inference, not an individually enumerated official ruling. Merely acquiring, holding, trading, selling, or discarding a card without activating Karama is not established as a trigger. Do not invent a phase-long ban on card ownership.
|
||||
|
||||
## Current activation inventory
|
||||
## Pre-interception activation inventory
|
||||
|
||||
The following paths were inspected in `game/engine.ts`; symbol names are the stable references because concurrent development changes line numbers.
|
||||
The following inventory records the original immediate-mutation hazards in `game/engine.ts`, before Kull interception. Symbol names are stable references because concurrent development changes line numbers. The preview must intercept the validated intent ahead of these effects.
|
||||
|
||||
| Entry | Present execution | Required interception boundary |
|
||||
| --- | --- | --- |
|
||||
@@ -48,70 +57,41 @@ Special branches bypassing `spendKarama()`:
|
||||
|
||||
`applyActionInner()` deliberately permits CHOAM special cash-in before ordinary response/decision gating, and dispatches other special modes before `g.response`. Intercepting only the ordinary response handler leaves those paths uncovered. Adding a blanket denial of every special while a decision exists would remove already supported gameplay and is not justified by this task.
|
||||
|
||||
## Proposed state and API responsibilities
|
||||
## State and API responsibilities
|
||||
|
||||
Names below are illustrative; this document does not add these types to the engine.
|
||||
The pure [Kull module](../game/choam-kull.ts) owns `KullPhaseRestriction`, `activeKullRestrictions`, `kullBlocksKarama`, restriction/attempt-stamp validation, `distinctKullCounter`, `kullNativeCostCards` and `kullCounterCards`. It validates stamped phase policy and conserved canonical physical-card binding without mutating a Game. The engine remains authoritative for live custody, validated ordinary uses, prepared `SpecialKaramaIntent`, response ownership and once-only continuation. A saved attempt must not contain an arbitrary client `Action`, function closure, cyclic state or whole-Game rollback snapshot.
|
||||
|
||||
```ts
|
||||
type KaramaBlock = { turn: number; phase: number; player: string };
|
||||
The original and counter cards have different obligations. The original stays reserved until Kull settles; ordinary counter eligibility excludes that exact physical ID. A different printed Karama or eligible BG substitution may counter while Kull is pending. A BG counter's own conversion response must not overwrite the original intent or its suspended response.
|
||||
|
||||
type PendingKaramaIntent = {
|
||||
id: string; // Stable server-issued attempt identity.
|
||||
owner: string; // Player activating the card, not its recipient.
|
||||
card: string; // Exact physical identity; no later auto-selection.
|
||||
turn: number;
|
||||
phase: number;
|
||||
form: 'printed' | 'bg-conversion';
|
||||
purpose: ValidatedOrdinaryOrSpecialIntent;
|
||||
stage: 'offer-kull' | 'resolve-kull' | 'convert-bg' | 'commit';
|
||||
offeredToChoam: boolean;
|
||||
suspended: KaramaContinuation;
|
||||
};
|
||||
```
|
||||
The consumer interface is `GameView.kullReaction`: `null` or `{ event, player, target, intent, cards, canDecline, blocked }`. It is present during the offer stage; the counter stage uses existing `responseControls`. `player` is the public CHOAM reactor, `target` the attempted activating player, and `intent` the ordinary purpose kind or the generic `special` label, never a special selection. All viewers see the same event/actors/intent; only CHOAM sees actual legal `cards` and `canDecline: true`. The current offer uses `blocked: null`, including no-card offers that CHOAM can decline. Countering reuses ordinary `card/mode: cancel` or `passResponse` actions. Never project raw special choices, saved response secrets, signatures, funding or either hidden hand.
|
||||
|
||||
`ValidatedOrdinaryOrSpecialIntent` should be a discriminated union, with only the fields needed for each use: shipment recipient; auction identity/index and payer; cancellation response identity; special target/leader/count/elite/route or selected cash-in IDs. Do not retain an arbitrary client `Action` object and replay it through the public dispatcher.
|
||||
`GameView.kullCounterEvent` is `null` or the same opaque public attempt event while the distinct-counter stage owns control, including a BG `worthlessKarama` overlay. Controls and bots use it only for precedence; legal physical choices still come from native `responseControls`. It reveals no original card, Kull cost or saved response payload. `GameView.karamaBlocked` is the current viewer's stamped activation-block reason or `null`, separate from a pending declaration; `kullPreview` supplies the visible opt-in warning.
|
||||
|
||||
`KaramaContinuation` must describe which suspended operation resumes or aborts, and own its response/decision data. Maintain explicit nesting frames or an equivalent bounded continuation structure; the present single `pendingKarama` field cannot represent both a suspended BG conversion and a new Karama counter-response. A numeric nesting limit, if needed as a defensive assertion, is not a game rule and must not reject a reachable legal sequence arbitrarily.
|
||||
CHOAM submits `{ type: 'kullDecision', event, decline: true }` or `{ type: 'kullDecision', event, card }`. Bind event and actor before costs. The declared Kull is a real held printed card, not a manufactured card or a free power. Nexus Cunning is not admitted by this preview.
|
||||
|
||||
Recommended helper responsibilities:
|
||||
## Settlement flow and cancellation
|
||||
|
||||
- Keep `canUseAsKarama()` as the physical/type classifier. Add a stateful activatability predicate that considers Kull's turn/phase restriction, custody, committed cards, and purpose. Distinguish this from hand valuation and any separately resolved overbid permission.
|
||||
- `validateKaramaIntent()` performs the same preconditions as the current branch without mutation or random draws. Invalid attempts must not open a public Kull window or reveal a private card.
|
||||
- `beginKaramaIntent()` saves the exact continuation, then offers CHOAM a decision based on the public attempt, regardless of whether its private hand contains Kull. The action must not yet change game resources or reveal future random results.
|
||||
- `commitKaramaIntent()` is an internal, once-only executor. It revalidates relevant live state, consumes the exact card once, applies the effect, and resumes the proper continuation. The already-offered attempt cannot reopen its own Kull opportunity.
|
||||
- `abortKaramaIntent()` restores or completes the underlying opportunity without applying the prevented effect. It must not restore a whole saved `Game`: doing so would undo legitimate intervening cash-ins, card custody changes, or unrelated response outcomes.
|
||||
1. Validate an actual activation before discard, payment, physical movement, once-use flags or random effects. Reject an already effective stamped phase restriction before costs. Invalid plays create no public offer and reveal no private payload.
|
||||
2. Save the exact typed intent and its parent ownership. Offer the same neutral CHOAM opportunity whether Kull is held or absent. Mere holding, transfer or nonactivation discard is not an attempted play.
|
||||
3. Declining resumes the original intent once, without another offer for that same attempt. Declaring Kull opens the ordinary CHOAM-effect response; **pending is not active**.
|
||||
4. Resolve legal distinct counters using existing response ownership. The reserved original cannot cancel Kull. A valid counter follows its own ordinary consumption/conversion rules; it does not consume the original card as payment for the counter.
|
||||
5. On successful Kull, discard the exact Kull cost once, retain the original unplayed printed/BG card, leave the original special once-use unspent, and abort its effect. Restrict the **activating player**, not an allied shipment recipient, for the current turn/phase.
|
||||
6. If Kull is prevented, retain its cost and prevent that physical cost's effect for the phase under existing native CHOAM semantics. Resume the original attempt once. Recheck custody rather than substituting another same-name card.
|
||||
7. Stamp comparison expires the effective restriction on phase/turn change, not a temporary response, market or worm substep. It blocks Karama activations including substitutes, not ownership, trades or otherwise legal nonactivation discards.
|
||||
|
||||
Persist attempt IDs, stages, and continuation ownership through JSON saves. Missing new fields in legacy rooms should normalize to no pending attempt/no block. A frame must not contain a function closure or cyclic object. Prevent two frames from independently owning the same original response or physical-card consumption.
|
||||
|
||||
## State-machine flow and cancellation
|
||||
|
||||
This is an implementation skeleton. It does **not** choose an answer to the unresolved nested-priority questions above.
|
||||
|
||||
1. Receive a legal attempted activation; reject an already active phase restriction before costs. Capture its continuation and announce the minimum public intent.
|
||||
2. Offer CHOAM the reaction. Declining resumes this attempt exactly once. Declaring Kull stores its exact card ID as `pendingChoamWorthless`, its target actor, and the attempt ID; consume neither side until its appropriate stage.
|
||||
3. Resolve whichever counters the eventual authoritative timing interpretation permits. Save the interrupted Kull frame and original attempt when another card is activated; never overwrite them with the top-level `g.response`.
|
||||
4. If Kull settles successfully, establish the actor's turn/phase restriction and abort the interrupted activation. Proposed pre-play custody behavior is to retain the prevented Karama and leave once-per-game power use unspent. This is a reasonable implementation choice, but the retrieved text does not explicitly state its discard treatment.
|
||||
5. If Kull is prevented, use the existing CHOAM prevention-of-discard contract, then resume the saved activation once. If Kull was sold, exchanged, or otherwise lost, grant no restriction; revalidate the interrupted activation instead of assuming its card is still owned.
|
||||
6. A new phase clears the effective restriction by stamp comparison. A temporary worm-resolution suspension in the same phase does not. Do not permit ordinary phase advance while an unresolved frame owns its continuation.
|
||||
|
||||
Do not silently install any of these as an official priority rule: target always wins the counter, CHOAM always wins the counter, same card may answer twice, same card can never answer, no counter is possible, or everyone gets an unlimited replacement response. The final engine may need a documented provisional policy under the existing expansion gate until primary clarification is available.
|
||||
This is the approved development interpretation, not an official nested-priority clarification. JSON continuation must preserve the same ownership and exact physical cards without a second random draw, payment or replayed effect.
|
||||
|
||||
## Bene Gesserit conversion
|
||||
|
||||
Current behavior intentionally differs from CHOAM Worthless cancellation: `spendKarama()` has already discarded BG's Worthless card when it exposes `worthlessKarama`. `finishResponse()` clears the conversion pending record; allowing calls `completeKarama()`, canceling a cancellation restores the original response, and canceling auction payment invokes recovery.
|
||||
Kull intercepts **before** the original Worthless conversion or discard. Success therefore retains the original Worthless card and stops its attempted Karama use. If CHOAM declines or Kull is countered, the saved original proceeds to the established ordinary conversion stage.
|
||||
|
||||
Preserve that established ordinary-cancellation behavior. Two possible Kull placements require a ruling:
|
||||
|
||||
- **Before conversion:** Kull stops an attempted use-as-Karama while its physical Worthless card is still in hand. This needs an explicit custody policy and cannot reuse the existing post-discard conversion cancellation result blindly.
|
||||
- **After conversion:** normal BG conversion responses occur first; an allowed conversion then reaches Kull. This requires retaining the discarded card's identity and a suspended original intent, and clarifying whether/when that card returns if Kull succeeds.
|
||||
|
||||
Whichever placement is eventually selected, a printed Karama canceling BG's conversion is itself an activation path. Test Kull on that counter as well as on the original substituted use. A successful Kull block must prevent the target bypassing it by choosing a different physical Worthless card on the next action, if substituted activation is included in the ruled scope.
|
||||
Ordinary conversion behavior remains different: `spendKarama()` discards the BG Worthless card before opening `worthlessKarama`; preventing that conversion leaves the card discarded. Kull's pre-conversion custody selection does not rewrite that FAQ-based consequence. A distinct BG Worthless counter likewise has its own ordinary conversion response, while the original remains reserved.
|
||||
|
||||
## Existing continuation and feasibility hazards
|
||||
|
||||
| Integration point | Required design check |
|
||||
| --- | --- |
|
||||
| `recoverAuctionPayment()` | A held-but-blocked Karama must not keep returning an impossible payment decision. Its auction-restart fallback is already documented as provisional; Kull does not certify that fallback. Preserve card secrecy and actual funding while deciding recovery. |
|
||||
| `recoverAuctionPayment()` | A held-but-blocked Karama must not keep returning an impossible payment decision. Its existing auction-restart fallback is provisional and is not the selected Kull remedy. Preflight the deferred sole-Karama winning-overbid composition instead of reaching an unfinishable settlement. |
|
||||
| Bid validation | `karamaCard()` currently removes the normal maximum bid. Separate held-card classification from activation eligibility; do not accidentally disclose whether CHOAM holds Kull during bidding. |
|
||||
| `findReachableBattlePlan()` / `cashInPreparationActions()` | These call `specialKarama()` on cloned trial state, then clear response/conversion fields. A new asynchronous gate would otherwise enqueue unchanged trials or treat pending cash-in as paid income. Provide a pure allowed-branch simulation or an explicit internal trial executor; an already effective Kull restriction must still apply. |
|
||||
| `pendingBattleRevivalIncome()` | Currently searches only the live response or `pendingKarama.use.response`. It must find the suspended relevant income through any new Kull frames without counting it as already received. |
|
||||
@@ -126,30 +106,30 @@ Whichever placement is eventually selected, a printed Karama canceling BG's conv
|
||||
|
||||
- Public attempted-play metadata can include actor, purpose category, public recipient, and attempt ID. Do not expose raw continuation frames: they can contain private plans, hidden hand choices, revival terms, or future card transfers.
|
||||
- The CHOAM opportunity must not depend on its hand containing `ix-kull-wahad`; otherwise the presence of a prompt leaks possession. Its available reaction card and exact pending CHOAM card ID belong only in its private projection. Existing public `g.decision` projection must be reviewed before placing private fields in a new decision variant.
|
||||
- Kull's settled target and expiry are public. Selecting another player's Karama beneficiary must not change which player is restricted. Whether the actor may target itself remains a ruling gap, not a reason to silently extend ally benefits.
|
||||
- Bots must handle offer/decline, counters if permitted, restored underlying decisions, and all blocked-activation filters. A card remaining physically in hand is not evidence the bot can play it. Prevent repeated invalid-action generation from both proactive special branches and ordinary cancellation branches.
|
||||
- Kull's settled target and stamped phase expiry are public. Selecting another player's shipment beneficiary must not change which player is restricted. Do not silently extend CHOAM's powers to an ally.
|
||||
- Bots must handle offer/decline, distinct counters, restored underlying decisions and blocked-activation filters. A card remaining physically in hand is not evidence the bot can play it. Prevent repeated invalid-action generation from proactive special and ordinary cancellation branches.
|
||||
- Preserve `choamWorthless.pending` during pending Kull and nested responses, just as with Jubba; an AI should not cash in the card it is currently using as protection/prevention unless it deliberately chooses to abandon that effect.
|
||||
- Human controls should describe the actual attempted use and phase restriction. Keep unconfirmed timing explanations out of claims of official completeness. Full card inspection must remain available without exposing unplayed opponents' hands.
|
||||
- Human controls describe the attempted purpose and distinguish pending Kull from a successful active restriction. The opt-in preview warning must remain visible; approved timing is product policy, not official completeness. Card inspection must not expose unplayed opponents' hands.
|
||||
|
||||
## Minimum validation plan
|
||||
|
||||
1. Conservation and no premature mutation for all four ordinary purposes and all eight existing special branches; validate Emperor revival and random Harkonnen transfer specifically.
|
||||
2. Direct cancellation nested under Kull, permitted counter-to-Kull, third-party counter, BG original conversion and BG counter-conversion; exact card IDs, one discard, once-use flag, response owner/passes and continuation preserved through JSON reconnect.
|
||||
3. Successful block rejects a second activation in the same phase and permits one next phase; distinguish actor/beneficiary. Verify unsupported acquisition/holding restrictions were not added accidentally.
|
||||
4. Payment with enough spice, alternate usable Karama, blocked held Karama, stale funding, hand-limit changes, and losing card custody. Mark auction recovery scenarios provisional where source interpretation is unresolved.
|
||||
4. Payment with enough spice, alternate usable Karama, blocked held Karama, stale funding, hand-limit changes and losing card custody. Confirm the deferred winning-overbid guard rejects before costs with the same private result whether hidden Kull is held or absent; no auction remedy is certified.
|
||||
5. Pending CHOAM cash-in, Fremen summon, Harkonnen exchange, revival-income preparation and Truthtrance feasibility; assert no response overwrite, false promise release, clone-search loop, duplicate random draw, or deadlock.
|
||||
6. Compare two states differing only in CHOAM's private Kull possession: rival/public opportunity shape must match. Check private selected special payloads and suspended contexts never appear in rival or spectator views.
|
||||
7. All four AI difficulties must complete each new continuation, including no-Kull/blocked-Kull decline and a response resumed after cancellation. Browser-check the new decision and its pending/canceled state after reconnect.
|
||||
|
||||
This pass inspected the source paths above and validated document structure. It did not edit the engine, UI, bots, or tests, and did not run tests for behavior that remains unimplemented. Exact nested priority and BG placement remain source questions; the state design deliberately exposes those decisions instead of turning them into hidden house rules.
|
||||
The original 6 September pass was a source/engine and document audit, not runtime verification. Its unanswered counter/BG proposals are superseded by the explicit 30 September selections above. The minimum validation plan remains a coverage contract, not a claim that every combination is verified.
|
||||
|
||||
|
||||
## Implemented prerequisite: prepared special intents
|
||||
|
||||
The engine now exports `prepareSpecialKaramaIntent` and `executeSpecialKaramaIntent`. The intent union represents all eight implemented factions, with separate Emperor force/leader branches. It copies normalized selections, binds the original turn and phase plus relevant current battle/shipment/revival declaration, and contains no random Harkonnen hand selection. The executor re-prepares and compares the intent before consuming the exact physical card or applying effects. Existing public special actions still call preparation and execution synchronously.
|
||||
The engine exports `prepareSpecialKaramaIntent` and `executeSpecialKaramaIntent`. The intent union represents all eight implemented factions, with separate Emperor force/leader branches. It copies normalized selections, binds the original turn and phase plus relevant current battle/shipment/revival declaration, and contains no random Harkonnen hand selection. The executor re-prepares and compares the intent before consuming the exact physical card or applying effects. The original prerequisite called these synchronously; the Kull preview pauses the prepared intent before execution.
|
||||
|
||||
Preparation includes public-dispatcher timing gates, with CHOAM's existing phase-opening/market/revival exceptions retained and all special activations blocked during unresolved Truthtrance. Feasibility clears Truthtrance only on its hypothetical future-state clone and retains binding battle promises. The executor mutates a disposable working Game; it is not independently transactional. Any future paused caller must restore its owned decision context, run on a clone, and publish only on success. Public `applyAction` remains the input-isolation boundary.
|
||||
|
||||
Ten regression cases in `tests/karama-intents.test.ts` cover all variants, serialization, preparation purity/no random draw, stale timing/custody/resources, copied CHOAM selection, exact declaration binding, deferred Harkonnen randomness, injected execution failure isolation, dispatcher parity and preserved CHOAM exceptions. The full 728-case unit suite and 33 persisted/database cases pass.
|
||||
|
||||
This prerequisite does not add a pending Kull frame or phase restriction. On 30 September the user approved the distinct-card counter and pre-conversion BG interpretation, while deferring unpayable winning overbids; see the [selected preview policy](CHOAM_KULL_SOURCE_UPDATE.md#user-selected-preview-timing--30-september-2026). Dependent Kull timing implementation remains unfinished.
|
||||
The prerequisite alone did not add a pending Kull frame or phase restriction. The later opt-in preview composes these prepared intents with the selected distinct-card/pre-conversion protocol. Full-game, combined-module, deployment and unpayable winning-overbid recovery acceptance are separate; the preview does not reopen public starts.
|
||||
@@ -1,6 +1,6 @@
|
||||
# Kull Wahad: official-source update
|
||||
|
||||
Checked 2026-09-07 for classic GF9 Dune and CHOAM & Richese. This supplements [CHOAM_KULL_DESIGN.md](CHOAM_KULL_DESIGN.md) and the Kull section of [CHOAM_REMAINING_RULES.md](CHOAM_REMAINING_RULES.md). No runtime behavior changes in this audit.
|
||||
Checked 2026-09-07 for classic GF9 Dune and CHOAM & Richese; preview policy updated 30 September 2026. This supplements [CHOAM_KULL_DESIGN.md](CHOAM_KULL_DESIGN.md) and the Kull section of [CHOAM_REMAINING_RULES.md](CHOAM_REMAINING_RULES.md). The source audit itself did not change runtime behavior; the later opt-in development implementation follows the explicit selections below.
|
||||
|
||||
## User-selected preview timing — 30 September 2026
|
||||
|
||||
@@ -38,16 +38,29 @@ Targeted official-domain and named-designer searches also surfaced a BGG discuss
|
||||
|
||||
## Implementable scope and remaining interpretation
|
||||
|
||||
| Area | Supported scope | Remaining material choice |
|
||||
| Area | Publisher-supported scope | Selected preview policy and remaining source limit |
|
||||
| --- | --- | --- |
|
||||
| Trigger and expiry | React to an attempted Karama play; restrict that player for the current phase. The text does not ban ownership, transfers or a non-activation discard. | Applying the broad trigger to every ordinary and special activation is a strong textual inference, not a new enumerated FAQ ruling. |
|
||||
| Counter priority | The expansion explicitly makes CHOAM's Worthless effect preventable. | Whether the original attempted card can be redirected against Kull; whether a different card can counter before the restriction applies; and priority for a third party. No retrieved source supplies this response order. |
|
||||
| BG substitution and custody | Ordinary prevention of BG conversion discards the Worthless card. The [base rulebook, printed p. 14](https://www.gf9games.com/dunegame/wp-content/uploads/Dune-Rulebook.pdf#page=14) discards a Karama after play. | Neither establishes whether Kull interrupts before or after BG conversion, or orders discard of a printed Karama whose play is prevented. Retaining the latter as unplayed is a reasonable implementation inference; applying BG's ordinary cancellation discard automatically to Kull is not an explicit ruling. |
|
||||
| Blocked overbids | Holding permission and actual Karama play are distinct in the FAQ. | Whether the permission persists after Kull, and how to settle a winning bid when Kull removes its only payment method. A bid cap, free award, forced alternative funding or auction restart would each add a policy absent from the retrieved Kull text. |
|
||||
| Countered CHOAM discard | The expansion supplies a phase-scoped prevention provision. | How that restriction applies to another physical copy or a different Worthless effect is not clarified here. This is shared CHOAM behavior, not a newly discovered Kull-only blocker. |
|
||||
| Trigger and expiry | React to an attempted Karama play; restrict that player for the current phase. The text does not ban ownership, transfers or a non-activation discard. | Applying the broad trigger to ordinary and implemented special activations is a textual inference, not a new enumerated FAQ ruling. Restrict the card's activating player, not a shipment beneficiary. |
|
||||
| Counter priority | The expansion explicitly makes CHOAM's Worthless effect preventable, but supplies no nested response order. | **Different Karama** is selected: reserve the original physical card; resolve an eligible distinct counter before the phase ban becomes active. The original cannot pay twice. Existing response ownership governs other eligible responders; this is product policy, not newly located publisher authority. |
|
||||
| BG substitution and custody | Ordinary prevention of BG conversion discards the Worthless card. The [base rulebook, printed p. 14](https://www.gf9games.com/dunegame/wp-content/uploads/Dune-Rulebook.pdf#page=14) discards a Karama after play. | **Before conversion** is selected: successful Kull retains the still-unplayed printed Karama or BG Worthless card and leaves an attempted special once-use unspent. If Kull is declined or countered, the original attempt resumes, including the separate ordinary BG conversion/discard rules. |
|
||||
| Blocked overbids | Holding permission and actual Karama play are distinct in the FAQ. | **Defer interaction** is selected for a winning overbid whose only Karama payment would become unplayable. Preflight the unsupported composition before costs or an unfinishable transaction. Do not restart the auction, award a free card, invent funding or add a hidden-Kull-dependent bid cap. |
|
||||
| Countered CHOAM discard | The expansion supplies a phase-scoped prevention provision. | Preserve native prevention-of-discard semantics: retain the selected Kull cost and phase-block its effect. The wider official scope across different physical copies or Worthless names remains unclarified; the preview does not resolve it. |
|
||||
|
||||
The first three unresolved interaction clusters—counter sequence, BG/custody sequence, and unfunded-auction recovery—need an explicit interpretation if those outcomes are shipped before further primary clarification. The existing design's provisional sequence remains a proposal; this audit neither endorses it as official nor records new user approval.
|
||||
The counter/BG choices are no longer unanswered user questions. They are approved preview policy with an unresolved **publisher-source** distinction. Unfunded-auction recovery was deliberately not selected. Full CHOAM, combined-module and publication acceptance therefore remain gated; an opt-in Kull preview is not official rules certification.
|
||||
|
||||
Validated intents, actor/phase restrictions, exact physical-card binding, safe continuation storage, private projections and duplicate-action protection must preserve that selected interpretation. A pending Kull declaration does not itself activate the phase restriction: only a successfully settled effect does. Decline or prevention resumes the reserved original intent once, not by replaying a public client action or restoring a whole Game snapshot.
|
||||
|
||||
An additional engineering admission boundary is the existing pure post-cost feasibility proof for ordinary cancellation under a live Truthtrance battle/shipment promise. An unprovable suffix is refused privately before the offer or cost, while proven supported cancellations remain available. This bounded preview exclusion does not establish a publisher prohibition or settle additional rule interpretation.
|
||||
|
||||
The runtime fence is before bid commitment, not only before payment:
|
||||
non-CHOAM unfunded Karama-dependent bids are privately unavailable in
|
||||
this explicit preview. The former late guard accepted such a bid and
|
||||
then could not settle it. The fence is independent of hidden Kull,
|
||||
does not change numeric UI bid limits or non-preview rules, and
|
||||
does not select an auction recovery. CHOAM self-activation stays
|
||||
outside interception and can use its ordinary Karama payment.
|
||||
Kull costs also receive a cloned post-cost own-promise check; counters
|
||||
are projected only when their same authoritative proof is available.
|
||||
|
||||
These limits do not prevent implementation of validated intents, actor/phase restrictions, exact physical-card binding, safe continuation storage, private projections, or duplicate-action protection. Those are engineering responsibilities. They must preserve the selected rule interpretation without silently choosing a counter order or auction remedy. The older design's wider list of speculative edge cases is not evidence that every such case independently requires a user ruling.
|
||||
|
||||
Validation: reviewed both prior documents, publisher text and the local rulebook extract; repeated focused official searches; verified the designer FAQ redirect. No gameplay tests were run for this documentation-only update.
|
||||
@@ -1,6 +1,6 @@
|
||||
# Remaining CHOAM rules: primary-source audit and engine contract
|
||||
|
||||
Audit date: 2026-09-06. Scope: Jubba Cloak, Kull Wahad, Auditor, and CHOAM's printed leaders for the classic GF9 2019 game with CHOAM & Richese. This document separates retrieved official rules from proposed software behavior. It does not certify complete CHOAM support. Only this document was authored in this subtask.
|
||||
Audit date: 2026-09-06; Kull preview policy updated 30 September 2026. Scope: Jubba Cloak, Kull Wahad, Auditor, and CHOAM's printed leaders for the classic GF9 2019 game with CHOAM & Richese. This document separates retrieved official rules from software behavior and explicit product interpretation. Later runtime records supersede historical absence claims; this does not certify complete CHOAM support.
|
||||
|
||||
## Evidence, access, and precedence
|
||||
|
||||
@@ -39,30 +39,30 @@ Open timing questions: earliest declaration relative to final storm confirmation
|
||||
|
||||
## Kull: coverage and interruption design
|
||||
|
||||
The printed trigger is broad, but the retrieved official text does not enumerate every Karama use. The table below gives recommended handling and the confidence limit, not an official scenario-by-scenario ruling.
|
||||
The printed trigger is broad, but the retrieved official text does not enumerate every Karama use. The table separates the approved preview handling from publisher confidence limits. The distinct counter and BG-before-conversion choices are recorded in the [source update](CHOAM_KULL_SOURCE_UPDATE.md#user-selected-preview-timing--30-september-2026); they are not outstanding user questions or publisher clarification.
|
||||
|
||||
| Attempt or situation | Recommended behavior | Evidence limit |
|
||||
| Attempt or situation | Approved preview handling | Evidence limit |
|
||||
| --- | --- | --- |
|
||||
| Real Karama cancels a faction/alliance ability | Intercept before card consumption or canceled-effect settlement; CHOAM may declare Kull | Ordinary use of the named card fits the printed trigger; nested order is unspecified |
|
||||
| Real Karama funds shipment, takes an auction card, or pays a winning bid | Route through the same interception | No purpose restriction is stated; blocked-bid recovery remains unresolved |
|
||||
| Real Karama activates a once-per-game faction power | Intercept before setting `specialKaramaUsed` or paying its additional costs | Strong textual inference from attempted card play; distinguish this from ordinary Karama canceling an already activated special power |
|
||||
| Bene Gesserit Worthless-as-Karama | Expose an equivalent attempt, with an explicit conversion stage | Whether Kull acts before conversion/discard is not settled by the retrieved CHOAM text; November FAQ only settles ordinary Karama cancellation of the conversion |
|
||||
| Holding Karama permits an overspice bid | Do not consume Kull merely because a hidden card might fund a bid | Holding is not the same as attempting to play; whether an already blocked player retains that bidding permission needs clarification |
|
||||
| Real Karama cancels a faction/alliance ability | Intercept before card consumption or canceled-effect settlement; CHOAM may declare Kull | Ordinary use fits the printed trigger; response priority is explicit preview policy |
|
||||
| Real Karama funds shipment, takes an auction card, or pays a winning bid | Route through the same pre-cost interception; guard an unpayable winning-overbid composition | No purpose restriction is stated; no auction recovery remedy was approved |
|
||||
| Real Karama activates a once-per-game faction power | Intercept its prepared intent before setting `specialKaramaUsed`, paying additional costs or drawing randomly | Broad trigger is a textual inference; this differs from ordinary Karama canceling an already activated special power |
|
||||
| Bene Gesserit Worthless-as-Karama | Intercept before conversion/discard; successful Kull retains the unplayed Worthless card | Selected product policy; November FAQ's ordinary conversion cancellation still discards the card if that later stage is reached |
|
||||
| Holding Karama permits an overspice bid | Holding alone is not an attempted activation and never spends Kull | Winning-payment infeasibility remains deferred, not solved by hidden-card-dependent bidding limits |
|
||||
| Target already blocked in this turn/phase | Reject another Karama activation before mutations | Use a turn-and-phase stamp so the restriction expires at the right boundary |
|
||||
| An ally plays Karama for a recipient who is blocked | Apply the restriction to the **card player**, not automatically to its beneficiary | Recommended reading of the named-player restriction; scenario not explicitly answered |
|
||||
| Acquiring, trading, selling, or discarding Karama without activating it | Do not treat this as a Kull trigger | No primary support for preventing ownership or a non-Karama-effect discard |
|
||||
| The attempted Karama is aimed at Kull itself | Requires a staged response protocol and a declared provisional priority | The apparent circular case is not resolved by retrieved official text |
|
||||
| The attempted Karama is aimed at Kull itself | Reserve the original card; allow only a distinct eligible counter before activating the ban | Different-card response priority is selected product policy, not a retrieved publisher ruling |
|
||||
|
||||
Current integration hazards:
|
||||
Implementation responsibilities:
|
||||
|
||||
- `spendKarama()` discards immediately. Save a validated pending intent before that mutation, including owner, physical card ID, purpose, recipients, interrupted `response`/`decision`, and phase stamp. Revalidate custody/legality on resumption. A blocked attempt should provisionally keep its unplayed card; do not silently charge a cost for an effect prevented before play.
|
||||
- `completeKarama()` supports `cancel`, `shipment`, `purchase`, and `auctionPayment`. Preserve its continuation instead of recursively calling the original user action, which could reopen Kull indefinitely.
|
||||
- `specialKarama()` is separate and directly mutates many powers. A fix only in `spendKarama()` would leave special powers outside the gate. Centralize attempted-play interception or explicitly route every branch through the same protocol.
|
||||
- `pendingKarama` currently represents Bene Gesserit conversion and preserves its original canceled response. Kull cannot overwrite that state or `g.response` without saving the suspended context. Use a bounded explicit stage/continuation, not implicit global ordering.
|
||||
- `recoverAuctionPayment()` already calls unfunded canceled-payment recovery provisional. A Kull-blocked payment must not award the auction card for free, leave an impossible decision, or assume this routine is source-certified. Distinguish an inability to fund a bid from merely choosing not to use another available payment method.
|
||||
- Offer CHOAM the Kull opportunity from an actual declared public attempt regardless of private Kull ownership. Reveal only the attempted card and permitted intent, never the rest of either hand.
|
||||
- Save a validated typed intent before mutations, including activating owner, exact physical card, purpose, interrupted response/decision ownership and turn/phase stamp. Invalid attempts must not expose a public reaction or hidden payload.
|
||||
- Preserve the original continuation rather than recursively dispatching the original user action. Decline resumes it once; successful Kull stops it while retaining the unplayed original and unspent special once-use. No whole-Game rollback is permitted.
|
||||
- Route ordinary and prepared special activations through interception, including Emperor revival before any physical return and Harkonnen before a random transfer. A hook placed only at discard is too late.
|
||||
- Keep a BG counter conversion separate from the reserved original attempt and Kull's own cost. Ordinary conversion cancellation has its existing discard consequence; successful pre-conversion Kull does not.
|
||||
- Guard the deferred winning-overbid composition before payment costs or saving an unfinishable transaction. An actor-private refusal must not depend on hidden Kull custody, reveal funding or install a free award, restart, new subsidy or bid cap.
|
||||
- Offer CHOAM the same neutral opportunity from an eligible public attempt regardless of private Kull ownership. Only CHOAM sees its own legal costs; neither a raw special selection nor a saved response secret belongs in a rival projection.
|
||||
|
||||
A possible provisional order is: validate attempted Karama; pause it; allow CHOAM's Kull declaration; resolve permitted responses to that declaration; establish the phase restriction if Kull succeeds; either abandon the still-unspent attempt or resume it once. The target's ability to use the same pending Karama or a second Karama against Kull, and priority for other players, need a primary ruling before this is called complete.
|
||||
An offered or declared Kull is **pending**, not an active ban. Resolve the ordinary CHOAM-effect response first, excluding the reserved original physical card from counter choices. Success then restricts the activating player for the stamped phase only. Prevention retains the Kull cost under existing native CHOAM semantics and resumes the original intent once. The wider publisher scope across canceled copies/effects and full combined-play acceptance remain boundaries.
|
||||
|
||||
## Auditor: integration and unresolved printed data
|
||||
|
||||
@@ -91,4 +91,4 @@ Recommended engine work, pending that roster verification:
|
||||
| Auditor | Survivor/dead and 0/1/2+ eligible-card cases; battle-used exclusions; full payment only; Karama prevention; private projection and stable random sampling; no capture/foreign ghola/skill; additional advanced setup identity; repeated revival and all listed battle outcomes. |
|
||||
| AI/UI | Easy/Medium/Hard/Brutal resolve every new decision using private projections; human controls explain target/scope and permit legal decline; normal/enlarged text tracks only verified behavior. |
|
||||
|
||||
This was a read-only source/engine audit plus documentation creation. No gameplay tests were rerun for unimplemented behavior. Validation consisted of official indexed-source retrieval, inspection of current integration points, image inspection, metadata/file-type checks, and document checks. The unresolved questions above are remaining work, not newly established house rules.
|
||||
The original 6 September pass was a read-only source/engine audit plus documentation creation. Validation then consisted of official indexed-source retrieval, inspection of integration points, image inspection, metadata/file-type checks and document checks, not gameplay tests. The later 30 September Kull choices are explicitly selected product policy; remaining publisher clarification, deferred overbid recovery and full combined-play acceptance are not completion claims.
|
||||
+29
-1
@@ -6,6 +6,32 @@ Expansion starts and full rules/publication acceptance remain gated.**
|
||||
|
||||
## Current checkpoint and work
|
||||
|
||||
The explicit `kull` development profile now connects printed Kull
|
||||
Wahad interception in Basic/Advanced CHOAM-plus-classic rosters
|
||||
with the physical CHOAM/Ix deck. Five implementation lanes delivered
|
||||
the typed engine, pure policy, human controls/legal bots, authenticated
|
||||
SQLite scenarios and internal guide. An original Karama stays
|
||||
reserved; only a distinct eligible card can counter Kull before the
|
||||
phase ban. BG is intercepted before conversion. Unpayable winning
|
||||
overbid remedies remain deferred: non-CHOAM unfunded bids are
|
||||
privately fenced before commitment to avoid an unfinishable payment.
|
||||
Numeric UI limits and non-preview rules are unchanged. Original,
|
||||
counter and Kull costs honor live promises; unproven suffixes reject
|
||||
before disposal. Review exposed Auditor-parent, orphan-frame and
|
||||
promise defects, which are repaired with regressions. Focused rules,
|
||||
controls, legal AI and SQLite checks pass; direct smoke kept the
|
||||
original card, spent one Kull and applied a phase ban without a rate.
|
||||
`npm run check` passed types, lint and 5,907 offline tests; build
|
||||
passed. Phone-width Basic/Advanced QA exercised Use, a distinct
|
||||
counter and Decline after refresh: Basic retained the original
|
||||
and phase ban; Advanced resumed BG conversion and its saved
|
||||
cancellation once. Independent repair reviews found no remaining
|
||||
scoped defect. Isolated Wrangler-dev HTTP passed 49/55 with five
|
||||
proxy 503s and one timeout, not a green local HTTP suite.
|
||||
Proxy-free CI remains pending for this checkpoint.
|
||||
Nexus Cunning Kull, wider modules and full expansion acceptance
|
||||
remain separate; no public starts or live NAS deployment are claimed.
|
||||
|
||||
The explicit [Semuta development preview](SEMUTA_SOURCE_UPDATE_20260907.md#30-september-2026--bounded-clean-discard-runtime)
|
||||
accepts a fresh Richese roster with CHOAM & Richese and optionally
|
||||
the physical Ix deck. Clean public ordinary-card, paid Box, retired
|
||||
@@ -59,7 +85,9 @@ phone-width full-hand QA seat acquired Hajr, spent Semuta,
|
||||
kept four cards and preserved that result across refresh.
|
||||
Isolated Wrangler-dev HTTP passed 49/55 with five proxy 503s
|
||||
and one timeout; this is not a green local HTTP suite.
|
||||
Proxy-free CI for the exact checkpoint remains pending.
|
||||
Proxy-free workflow `36684960601` passed the full isolated
|
||||
HTTP suite for `3285172` and published its image. No NAS
|
||||
deployment is claimed.
|
||||
Kull's approved distinct counter/BG-before-conversion timing
|
||||
is recorded but runtime remains unfinished; unpayable
|
||||
winning-overbid recovery is deliberately not chosen.
|
||||
|
||||
@@ -1,5 +1,60 @@
|
||||
# Dune implementation status
|
||||
|
||||
## 30 September 2026 — opt-in printed Kull Wahad integration
|
||||
|
||||
Five implementation lanes supplied validated activation frames,
|
||||
phase/physical-counter policy, mounted human controls and legal
|
||||
bot participation, authenticated SQLite regressions and source-bound
|
||||
internal guidance. The `kull` local profile starts only a fresh ready
|
||||
Basic/Advanced CHOAM-plus-classic roster with CHOAM/Ix physical cards,
|
||||
without public expansion starts or optional modules.
|
||||
|
||||
A legal ordinary or prepared special attempt pauses before its cost.
|
||||
Every seat sees neutral CHOAM timing regardless of held Kull.
|
||||
The interrupted card stays held and reserved; Kull may be prevented
|
||||
only by another eligible physical card. BG interception precedes
|
||||
conversion. Decline or prevention resumes the original typed effect
|
||||
once. Successful Kull discards its native cost, retains the original,
|
||||
leaves a prevented special unspent and applies a turn/phase activation
|
||||
ban, not an ownership/transfer ban. Native denied Kull remains held
|
||||
but its physical effect is blocked for that phase.
|
||||
|
||||
The user deferred unpayable winning-overbid recovery. The preview
|
||||
privately refuses non-CHOAM unfunded bids before commitment, as
|
||||
well as affected activations before cost. The former late guard
|
||||
accepted a bid that the preview could not settle; a targeted
|
||||
smoke reproduced that boundary before the early-fence repair.
|
||||
Numeric UI bounds and non-preview bidding are unchanged; no
|
||||
free award, funding or auction restart is invented.
|
||||
Unproven live-promise cancellation/counter suffixes likewise reject
|
||||
before cost. Pending-frame reconciliation cannot release a suspended
|
||||
promise; Auditor traversal now includes the saved parent; orphaned
|
||||
Kull declarations fail before private views or partial SQL writes.
|
||||
|
||||
Focused rules/control/bot/SQLite regressions include real Voice
|
||||
and Auditor parents, distinct/BG counters, orphan rejection,
|
||||
promise-compatible costs, legal progress and profile safeguards.
|
||||
`npm run check` passed types, lint and 5,907 offline tests;
|
||||
the production build passed. Independent re-reviews of the
|
||||
repaired rules/privacy/persistence paths found no scoped defect.
|
||||
Direct Kull and local-profile CLI smoke passed.
|
||||
|
||||
In isolated phone-width Basic/Advanced browser rooms, the actual
|
||||
reactor used Kull, Basic's other seat allowed it, and the original
|
||||
card and phase ban persisted across refresh with no rate-control
|
||||
shortcut. Advanced BG's held original could not counter Kull;
|
||||
its distinct printed card prevented Kull and resumed the original
|
||||
BG conversion. Another cancellation was then declined through
|
||||
the refreshed CHOAM offer and retired the same saved parent once.
|
||||
Kull stayed held, BG's already converted card remained discarded,
|
||||
and no shipment rate or ban was fabricated.
|
||||
|
||||
Isolated Wrangler-dev HTTP passed 49/55: five proxy-layer 503s
|
||||
and one 15-second timeout. This is not a green local HTTP suite;
|
||||
proxy-free checkpoint container CI remains pending.
|
||||
Nexus Cunning Kull, combined modules and full CHOAM completion
|
||||
remain unfinished. No NAS deployment is claimed.
|
||||
|
||||
## 30 September 2026 — user-approved full-hand Semuta exchange
|
||||
|
||||
The user selected atomic acquisition/disposal at the faction
|
||||
@@ -27,7 +82,9 @@ Commit, exchanged Semuta for Hajr and retained 4/4 after
|
||||
refresh. The throwaway staging script was removed.
|
||||
Isolated Wrangler-dev HTTP passed 49/55: five proxy 503s
|
||||
and one timeout. This local HTTP run is not green;
|
||||
proxy-free CI and NAS deployment are separate pending gates.
|
||||
proxy-free workflow `36684960601` passed the full isolated
|
||||
HTTP suite for `3285172` and published its image. No live NAS
|
||||
deployment is claimed.
|
||||
|
||||
## 30 September 2026 — Semuta after accepted CHOAM Jubba Cloak cost
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ CHOAM's Treachery advantage is on the ordinary faction-rules page, before its Ad
|
||||
|
||||
## Six effects and their timing
|
||||
|
||||
E2 lists **six**, not five. Five have current ordinary engine effect handlers; Kull Wahad retains its separate unfinished reaction subsystem.
|
||||
E2 lists **six**, not five. Five have current Cunning engine effect handlers. The separate opt-in [printed Kull preview](CHOAM_KULL_DESIGN.md) does not admit Nexus Cards and does not enable Cunning's sixth effect.
|
||||
|
||||
| Chosen effect | Printed outcome and timing |
|
||||
| --- | --- |
|
||||
@@ -39,10 +39,10 @@ The effect choice and native use may be public without revealing the rest of CHO
|
||||
|
||||
## Existing boundaries to preserve
|
||||
|
||||
- **Kull:** [the existing source update](CHOAM_KULL_SOURCE_UPDATE.md) leaves counter priority, BG conversion timing, interrupted-card custody and unfunded overbid recovery unresolved. Cunning does not settle those interactions. No new question was sent. Omitting Kull from a supported five-effect checkpoint must be explicit; it cannot be presented as all CHOAM Cunning.
|
||||
- **Kull:** the [source update](CHOAM_KULL_SOURCE_UPDATE.md#user-selected-preview-timing--30-september-2026) records approved distinct-card counters and BG-before-conversion custody as product policy, not publisher clarification. Unpayable winning-overbid recovery is deliberately deferred. The printed-card Kull development profile excludes optional modules, so Cunning Kull remains unavailable. Five supported Cunning effects must not be presented as all six.
|
||||
- **Phase cancellation scope:** the existing [Worthless continuation audit](CHOAM_WORTHLESS_CONTINUATION_AUDIT.md) records unresolved scope across other physical copies or effects. Current runtime binds a canceled physical card for the phase. A new Nexus use should preserve the selected policy rather than silently broaden or erase that historical restriction. The spent Nexus itself cannot be retried.
|
||||
- **Inherited effect boundaries:** fixed Ornithopter range versus Kulon, reactive movement/Revival/storm parents, special force custody, No-Field Gamont and other already documented exclusions remain properties of the selected effect. They are not reasons to reject an ordinary source-supported Cunning use with a different effect.
|
||||
- **No fresh hidden reaction policy:** native CHOAM's existing effect opportunities and public circumstances supply the interaction points. Extend those owner's controls without pausing only because a secret Nexus card exists, adding compulsory no-choice confirmations, or reopening another player's completed action. Kull retains its separate pending policy.
|
||||
- **No fresh hidden reaction policy:** native CHOAM's existing effect opportunities and public circumstances supply the interaction points. Extend those owner's controls without pausing only because a secret Nexus card exists, adding compulsory no-choice confirmations, or reopening another player's completed action. Printed Kull uses a neutral attempted-play opportunity; adding a Cunning Kull cost still requires genuine Nexus integration and acceptance.
|
||||
|
||||
## Pure saved receipt and integration contract
|
||||
|
||||
@@ -65,7 +65,7 @@ type NexusChoamReceipt = {
|
||||
};
|
||||
```
|
||||
|
||||
[game/nexus-choam.ts](../game/nexus-choam.ts) exports the six-name `CHOAM_NEXUS_EFFECTS` map, `NexusChoamEffect`, `NexusChoamContext`, `NexusChoamReceipt`, `createNexusChoam(context, owner, phase, card, effect)` and `validateNexusChoam(context, receipt)`. Context contains the current turn and ID/faction roster only. Intrinsic validation checks exact keys, effect/phase compatibility, original native owner/roster, nonempty card ID, safe numbers and signature. The event is `JSON.stringify(['nexusChoam', turn, phase, owner, card, effect])`. Kull's intrinsic timing admits phases 0–8; this does not authorize playing its still-gated effect. Historical validation neither reads private hands nor requires the card still held, CHOAM still unallied or the old Nexus still in discard. The engine owns canonical card validation, held Nexus/unallied eligibility, exact original effect source and physical custody.
|
||||
[game/nexus-choam.ts](../game/nexus-choam.ts) exports the six-name `CHOAM_NEXUS_EFFECTS` map, `NexusChoamEffect`, `NexusChoamContext`, `NexusChoamReceipt`, `createNexusChoam(context, owner, phase, card, effect)` and `validateNexusChoam(context, receipt)`. Context contains the current turn and ID/faction roster only. Intrinsic validation checks exact keys, effect/phase compatibility, original native owner/roster, nonempty card ID, safe numbers and signature. The event is `JSON.stringify(['nexusChoam', turn, phase, owner, card, effect])`. Kull's intrinsic timing admits phases 0–8; this does not authorize playing its unavailable Cunning effect. Historical validation neither reads private hands nor requires the card still held, CHOAM still unallied or the old Nexus still present.
|
||||
|
||||
The engine should separately bind progress (`pending`, `canceled`, `discarded`, `complete`) and the exact original resume context. An independently retained latest-progress marker prevents deleting or rewinding the detailed frame from restoring the Nexus or causing another discard. Bind target, territory/sector, elite type, No-Field event and movement/revival/storm parent only where the selected effect uses them. Avoid freezing unrelated hidden hands, resource changes or nested response passes in a signature.
|
||||
|
||||
@@ -73,4 +73,4 @@ Integrate through the existing native effect validator with an explicit selected
|
||||
|
||||
Four focused pure tests in [tests/nexus-choam.test.ts](../tests/nexus-choam.test.ts) pass: six-effect timing, later-turn/reordered-roster recovery with private getter traps, edited receipt rejection, and malformed/foreign creation. Type-aware lint and whitespace checks pass. These are receipt checks, not gameplay integration certification.
|
||||
|
||||
Meaningful integration tests should cover all five currently supported effects in their genuine producers, Basic/Advanced parity, arbitrary canonical card families, successful and canceled selected-card custody, normal Worthless parity, denied-card phase behavior, poison-income and fresh-discard children, real BG/Box interruption, exact saved parent, private owner projection, bots, JSON/CAS recovery and failed-action immutability. Kull is a named remaining effect until its own rules and runtime are resolved. No completed engine integration or gameplay verification is claimed here.
|
||||
Meaningful integration tests should cover all five currently supported effects in their genuine producers, Basic/Advanced parity, arbitrary canonical card families, successful and canceled selected-card custody, normal Worthless parity, denied-card phase behavior, poison-income and fresh-discard children, real BG/Box interruption, exact saved parent, private owner projection, bots, JSON/CAS recovery and failed-action immutability. Kull remains a named **Cunning integration** boundary, not an unanswered counter/BG product choice. Pure receipts alone do not establish gameplay acceptance or blanket Nexus immunity to Karama.
|
||||
@@ -1,6 +1,6 @@
|
||||
# CHOAM Nexus Cunning runtime
|
||||
|
||||
This checkpoint integrates native CHOAM Cunning with five existing Worthless effects, in Basic and Advanced. It does not complete CHOAM, Nexus or the expansions. The [source contract](NEXUS_CHOAM_RULES.md) lists **six** effects: Kull Wahad's Karama-prevention reaction remains explicitly unavailable. CHOAM Secret Ally and Betrayal remain outside this implementation.
|
||||
This checkpoint integrates native CHOAM Cunning with five Worthless effects, in Basic and Advanced. It does not complete CHOAM, Nexus or the expansions. The [source contract](NEXUS_CHOAM_RULES.md) lists **six** effects: Kull Wahad remains unavailable **as a Cunning choice**. The later opt-in [printed Kull preview](CHOAM_KULL_DESIGN.md) excludes Nexus Cards, so it does not expand this five-effect runtime. CHOAM Secret Ally and Betrayal have separate later contracts and are not implemented by this Cunning checkpoint.
|
||||
|
||||
## Physical cost and timing
|
||||
|
||||
@@ -20,11 +20,11 @@ Playing Cunning spends its physical Nexus card and opens one ordinary CHOAM-effe
|
||||
|
||||
The engine's owner-only `choamWorthless.plays` separates `source`, `effect`, the actual `card`, an optional Nexus `event`, and a blocking reason. The original printed-card descriptor remains available. [Shared options](../game/choam-power-options.ts) construct ordinary card actions unchanged and add the explicit effect/event only for a Nexus use. They fence stale events, actor identity and current interruptions, and use the server's source-specific blocking reason.
|
||||
|
||||
The [cost selector](../components/choam-power-cost.tsx) is reused by the existing [storm](../components/choam-storm.tsx), [revival/range](../components/choam-worthless.tsx), [movement prevention](../components/choam-baliset.tsx) and [force return](../components/choam-gamont.tsx) panels. It names and inspects the real cost card separately from the effect, supports transport-busy state, and exposes blocked choices without offering an illegal action. Kull Wahad has a visible unavailable explanation. Public response text identifies the chosen effect rather than disclosing the private cost card's name.
|
||||
The [cost selector](../components/choam-power-cost.tsx) is reused by the existing [storm](../components/choam-storm.tsx), [revival/range](../components/choam-worthless.tsx), [movement prevention](../components/choam-baliset.tsx) and [force return](../components/choam-gamont.tsx) panels. It names and inspects the real cost card separately from the effect, supports transport-busy state, and exposes blocked choices without offering an illegal action. Cunning Kull Wahad has a visible unavailable explanation; approved printed-Kull timing is not Cunning runtime authorization. Public reaction windows and controls disclose neither hidden Nexus ownership nor CHOAM's private cost list.
|
||||
|
||||
All four bot profiles use the same projected plays. They preserve printed effects first, then prefer lower-value legal Nexus fuel, retaining their existing public-target policies. Easy's existing policy of allowing free revival remains unchanged. The ordinary Trip to Gamont preservation policy still reserves that printed card during a closing market or cash-in even though playing it must wait for the next legal window. These are legal policy extensions, not a new AI calibration claim.
|
||||
|
||||
Existing reactive windows depend on public circumstances rather than whether CHOAM holds a matching card. Cunning uses those same windows, so holding a private Nexus card does not introduce an identifying public wait. Opponents receive no private cost list. Saved engine receipts, cancellation and physical disposal are handled by the engine; consumer code does not reconstruct an opportunity from card names or old saves. The existing fresh-discard/Semuta priority remains unfinished and gated; this checkpoint does not implement a Semuta interruption for these effects.
|
||||
Existing reactive windows depend on public circumstances rather than whether CHOAM holds a matching card. Cunning uses those same windows, so holding a private Nexus card does not introduce an identifying public wait. Opponents receive no private cost list. Saved engine receipts, cancellation and physical disposal are handled by the engine; consumer code does not reconstruct an opportunity from card names or old saves. Later bounded Semuta integration does not establish every Cunning fresh-discard composition. Native Cunning remains subject to its ordinary Karama response; neither this checkpoint nor the separate printed-Kull preview grants blanket Nexus immunity.
|
||||
|
||||
## Recovery evidence
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Rule decision index
|
||||
|
||||
Updated 14 September 2026. This is the authoritative navigation index for existing decisions, not a replacement rulebook or a new ruling. Detailed linked contracts retain their source citations and exact supported boundaries. Runtime follow-ups supersede historical absence claims; passing tests establish software behavior, not publisher authority.
|
||||
Updated 30 September 2026. This is the authoritative navigation index for existing decisions, not a replacement rulebook or a new ruling. Detailed linked contracts retain their source citations and exact supported boundaries. Runtime follow-ups supersede historical absence claims; passing tests establish software behavior, not publisher authority.
|
||||
|
||||
## Recorded contracts and implementation boundaries
|
||||
|
||||
@@ -47,7 +47,7 @@ Updated 14 September 2026. This is the authoritative navigation index for existi
|
||||
| Homeworld effects | Keep original payment/revival/placement identities and qualification observations; observations alone do not choose an occupied-benefit owner. | [Payments](HOMEWORLD_PAYMENT_INCOME_RULES.md), [card economy](HOMEWORLD_CARD_ECONOMY_RULES.md), [Collection](HOMEWORLD_COLLECTION_RULES.md), [revival deployment](HOMEWORLD_REVIVAL_DEPLOYMENT_RULES.md), [victory reinforcement](HOMEWORLD_VICTORY_REINFORCEMENT_RULES.md), [replacement](HOMEWORLD_REPLACEMENT_RULES.md), [Tupile](HOMEWORLD_TUPILE_INTELLIGENCE_RULES.md) |
|
||||
| Duke Vidal revival custody | The user selected set-aside custody after Ecaz revives the shared disc: revival clears the Tanks but does not itself grant battle control. Ecaz still needs a separate Ambassador or Nexus acquisition; only Ecaz may revive Duke, including by Ghola. This resolves one post-revival product interpretation, **not** the separate six-disc repeated-cycle, exceptional capture or battle-used Ghola questions. No publisher clarification assigning a post-revival controller was located. | [Publisher Ecaz/Moritani pp. 7–9](https://gamers-hq.de/media/pdf/0f/7a/86/Dune_EcazMoritani_Rulebook_EN.pdf#page=9), [revival readiness](ECAZ_DUKE_REVIVAL_READINESS.md) |
|
||||
| Mirror Weapon copied-card cleanup | The user selected ordinary winner retention for the physical Mirror even if its effective copy activates Tooth or Artillery. The original Tooth/Artillery cards retain their named mandatory-discard exceptions. This is a product interpretation, **not** a located publisher ruling. Independent copy-first Tooth/Stone choices and physical cleanup now have a bounded CHOAM/Richese-deck battle runtime; combined modules and full Richese games remain gated. | [Printed Mirror face and source audit](MIRROR_WEAPON_ENGINE_AUDIT.md#user-selected-cleanup-interpretation-28-september-2026) |
|
||||
| Kull Wahad preview timing | User selected a distinct eligible Karama counter while the interrupted card stays reserved, and interception of BG Worthless-as-Karama before conversion/discard. A prevented unplayable winning overbid remains guarded; no remedy was approved. Full CHOAM starts remain gated. | [Selected preview policy](CHOAM_KULL_SOURCE_UPDATE.md#user-selected-preview-timing--30-september-2026) |
|
||||
| Kull Wahad preview timing | User selected a **distinct eligible counter** while the interrupted physical card stays reserved, and BG Worthless interception **before conversion/discard**. A declaration is pending; only successful settlement activates the stamped phase ban. Decline or prevention resumes the original once; success retains its unplayed card and special once-use. The explicit Basic/Advanced CHOAM-plus-classic preview excludes optional modules/Nexus, leaves older games unchanged and retains native exact-cost cancellation semantics. An unplayable sole-Karama winning overbid is privately guarded before costs; no auction remedy was approved. This is product policy, not publisher clarification; full CHOAM starts remain gated. | [Selected preview policy](CHOAM_KULL_SOURCE_UPDATE.md#user-selected-preview-timing--30-september-2026), [runtime and remaining limits](CHOAM_KULL_DESIGN.md) |
|
||||
| Semuta full-hand exchange | User selected **Allow exchange**: acquisition followed by Semuta disposal is an atomic net-zero hand exchange at the faction limit. Existing incoming reservations still consume capacity; this does not permit an already overfull hand or settle Box/Richese purchase timing. | [Selected capacity policy](SEMUTA_SOURCE_UPDATE_20260907.md#user-selected-full-hand-exchange--30-september-2026) |
|
||||
|
||||
Shipment-only AND/OR now follows the FAQ's whole-question truth: Yes to AND
|
||||
|
||||
Reference in new issue
Block a user