33 KiB
Kull Wahad: source limits and Karama interruption design
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 remains applicable. The user-approved counter and BG choices supersede the original proposal; publisher-source uncertainty and full expansion gates remain.
Basic Kull and Truthtrance bribes — 27 October 2026
Prototyped / Partial. The printed Kull preview now also supports existing structured ordinary bribe-payment questions in its Basic CHOAM/classic roster, including grouped and mixed questions that use the same bribe rules. Yes and No retain their native cumulative payment meaning, private respondent guidance and the original deferred receipt. Other independent Truthtrance commitments remain under their existing preview boundaries.
A pending Kull attempt temporarily suppresses ordinary bribe controls. For a feasibility quote, the engine considers the suspended parent on a detached copy; this allows a genuinely available later Charity claim to fund the original bribe without treating the temporary Kull response as impossibility. At the unsettled phase-two CHOAM opening, either outcome preserves another faction’s Charity entitlement under the existing bank-shortfall policy; the quote does not choose which response will actually settle. Decline or a distinct eligible counter resumes the original attempt; successful Kull prevents it and retains its physical card. Each outcome retains the bribe obligations and their private ledger. No actual Charity or bribe is paid by the quote, and the real Kull frame is not retired or replayed by it.
The publisher's Basic Kull rule and the general Truthtrance current-turn commitment authority do not prescribe this online continuation, so the composition remains provisional. Existing distinct-counter timing and the user-deferred non-CHOAM unfunded-overbid fence remain. Nexus Kull, Advanced, revival, bidding, alliance, whole-turn compositions and broader combinations are separate; this does not certify complete modes, recovery, browser or deployed behavior.
The focused public fixture selects the original unopened Kull, two Karama, Truthtrance and Spice positions before native setup. Actual Charity-opening responses exercise a previously promised Charity-funded payment through decline, success and a distinct counter; two-recipient AND/OR and mixed questions use real later payments. A conserved Kull/deck swap is labeled as a controlled supplement. Thirteen related files pass 140/140; type/lint and build pass. Server-rendered controls do not certify browser or deployed play.
Basic public start — 27 October 2026
Prototyped / Partial. An explicit lobby opt-in enables the existing printed Kull response for a fresh Basic start with the CHOAM and Ix Treachery decks, native CHOAM plus classic factions, and no optional modules. The default remains off; the separate Nexus Kull fuel source is not enabled. The faction's publisher rulebook, printed page 7 provides the Basic Karama interception; the existing source and selected interruption protocol below remain authoritative for this prototype.
The supported path retains the user's distinct eligible Karama counter, with the original attempted physical card reserved until the response finishes. The previously selected before-conversion policy remains applicable to its existing supported Advanced preview, which this Basic start does not extend. The user-deferred non-CHOAM winning-overbid interaction keeps its existing private funding fence; this is an unfinished software boundary, not a printed rule.
The opt-in visibly explains that some existing structured Truthtrance commitments, including ordinary bid, alliance, revival and combined turn-action questions, remain unavailable in this preview. Structured bribe questions are supported as described above. Its deferred unfunded non-CHOAM overbid fence is also disclosed before start. The default retains the existing non-Kull behavior. Existing games are not upgraded, and other factions, optional modules, Advanced starts and Nexus Kull remain under their separate existing profiles. Broader interactions, full Basic/expansion modes, comprehensive assurance, browser and deployed acceptance remain open; this does not open a publication gate.
The public-start fixture selects original unopened cards and Spice positions, then uses genuine lobby, setup, auction and movement actions. A conserved card swap and an unstamped legacy-shape case are labeled controlled supplements. Ten related files pass 77/77; type/lint and build pass. Server-rendered controls are covered; browser and deployed behavior remain unverified.
Advanced effect scope — 18 October 2026
New Advanced attempts use the supplied rulebook’s specific-effect scope; exact source and duration interpretation. Basic and previously unstamped pending/settled frames retain all-purpose phase scope. The older phase-wide descriptions below apply to that path.
game/kull-purpose.ts defines finite semantic keys and readable labels.
KullPhaseRestriction.purpose and the signed pending frame’s optional purpose
select the new scope. Omission retains the original meaning. Four-argument
kullBlocksKarama asks only about an all-purpose ban; a fifth key checks that
ban or the matching effect. Active restriction copies retain keys and exact
same-effect duplicates reject. Source feasibility and final settlement use the
same restriction factory; all committed activations check the intended effect.
GameView.karamaBlocked remains only the all-purpose message. Its own
karamaPurposeBlocks lists {purpose,label,message} for active scoped effects.
kullReaction adds public scope: effect | phase and a readable effect name,
without exposing the private intent payload. Response controls, auction payment,
shipment pricing and faction specials consult the same scope. No restriction
removes physical ownership or legal nonactivation transfers/discards.
Genuine-action fixtures select the unopened original deal and unopened Baliset/ Spice positions explicitly, then use real setup, normal1 purchase, CHOAM1 shipment, Kull, normal desert shipment and ground movement. No postdeal hand, wallet, force or clock is installed. Advanced can use the retained original to cancel native Baliset in the same phase; Basic keeps its broad ban. Separate controlled intent tests check Emperor variants, purchase/payment and original unstamped semantics. These are not full combinations or persistence assurance.
Frozen 12 files111/111, types/lint/build and two original-action/rendered-table programmes pass. Basic uses62 source+8 continuation actions; Advanced70+14. Actual Baliset1 purchase, CHOAM1 city shipment and normal desert2 shipment lead to the real Baliset response. Advanced’s retained original cancels it, while Basic’s unavailable control stays disabled. All four minimal policies legally pass that response; no strategy calibration. Controlled intent tests also prove shared purchase/payment and Emperor variants, different special/cancellation use, and the original unstamped frame behavior.
The source-bound aggregate is outside Git at
~/.local/share/dune/checkpoints/20261018-kull-purpose/frozen-integrated-final/report.json:
base b82441c834ebf6c59a3b09a22a4e8821f4b7ccf8, source tree
7624106ac78c036d15c74ef3a226b4dfea52e51cfebe7b36f378c10736fea177.
All passed checks bind that exact source. The first union exposed two fixture
expectations (forced Harkonnen return and an obsolete Fremen Cunning fence);
those repaired cases passed before the frozen union. The initial native case
also corrected a final active-seat assumption at CHOAM’s real phase-end market.
Types caught one nullable fixture guard. The external table smoke’s Basic
expectation and enabled-button matcher were then corrected; only that smoke was
rerun on the unchanged tree, preserving the earlier successful check reports.
Only checkpoint prose/reference evidence changed afterward.
Recovery schema expectations were maintained but SQL assurance was not run. Runtime table rendering uses framework aliases/CSS stubs and does not establish visual/browser/deployed behavior. Original Nexus/alias programmes, wider combinations, full modes and comprehensive assurance remain due. No saved-game/ database/reset/restart or deployment operation occurred.
Authoritative boundary
GF9 CHOAM & Richese rulebook, printed p. 7: Kull reacts to an attempted Karama play and prevents that player from playing Karama for the phase. Printed p. 12 permits Karama to prevent CHOAM's special-effect discard of a Worthless card during that phase. These clauses establish both directions of interaction, but do not specify a nested-response protocol.
The November 2020 official FAQ, printed p. 7, says ordinary Karama stops one use of an eligible ability; it can affect alliance powers. A Bene Gesserit Worthless card is discarded if its conversion is stopped. This FAQ predates Kull's CHOAM ability and does not resolve its timing. The later expansion's specific rules take precedence over generic assumptions where they differ.
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.
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.
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; the supported fresh Basic lobby opt-in is described above. Older saved games are not retrofitted.
The separate nexus-kull profile admits fresh two-to-six-seat Basic or Advanced native CHOAM plus classic factions, exactly the physical CHOAM/Ix Treachery decks and Nexus alone, without physical Sandtrout. initializeNexusKullGameForAudit sets nexusKullPreview and shared kullPreview; it does not retrofit new choices into saved games. Unallied native CHOAM with the actual CHOAM Nexus may choose eligible own canonical Treachery fuel at the pending Karama opportunity. Other expansion factions/modules, Semuta and Richese Betrayal remain excluded; other Nexus previews retain the Kull guard. See the source/cost boundary and runtime evidence.
Both development profiles retain their preview boundaries and visible warnings; the separate supported Basic lobby opt-in is described above. The old kull profile remains printed-only without Nexus. This bounded Cunning interaction is verified locally, with broader verification Partial, not complete CHOAM, full Nexus/expansion certification or deployment evidence. Prior printed-Kull evidence remains scoped to the older preview.
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.
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.
Pre-interception activation inventory
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 |
|---|---|---|
g.response plus card/mode: cancel |
karamaCard() -> spendKarama() -> completeKarama() -> finishResponse(..., true) |
Before discard or consuming the original response; retain that response's owner, kind, and passes |
card/mode: shipment |
Checks phase/recipient and rate availability, then spendKarama() |
Before discard and assigning karamaShipping; actor is the card owner, recipient is a separate identity |
card/mode: purchase |
Checks bidding eligibility, then spendKarama(); settlement changes bidder and transfers card |
Before changing bidder, hand contents, or auction index |
decision: auctionPayment, karama: true |
Clears g.decision, selects card, calls spendKarama() |
Preserve the payment decision before the generic decision dispatcher clears it |
| Bene Gesserit ordinary Karama substitution | spendKarama() discards Worthless, writes pendingKarama, replaces response with worthlessKarama |
Add an explicit conversion stage; never reuse the existing pendingKarama slot for a different nested owner |
| All special powers | specialKarama() handles the action directly |
Validate and intercept the entire special intent before entering any effect mutation |
Special branches bypassing spendKarama():
| Faction | Immediate mutation to postpone until approved continuation |
|---|---|
| CHOAM | Activating Karama discard, selected cash-in discards, spice gain, specialKaramaUsed |
| Ixians | Card/once-use consumption, mobile stronghold relocation and collection |
| Tleilaxu | Card/once-use consumption, revival-prevention flag, deletion of pending revival and its decision/request |
| Fremen | Card/once-use consumption, summonedWorm.resume, clearing response/decision/conversion/spice state, beginning worm resolution |
| Atreides | Card/once-use consumption, full-plan request, clearing fullPlanOffer |
| Guild | Card/once-use consumption, marking shipper shipped, optional rate-card return, clearing shipment/decision |
| Emperor | Leader/force revival and tech income occur before the current discard call; a hook placed only at discard is too late |
| Harkonnen | Card/once-use consumption, random hand transfer, pendingExchange, replacing response/decision |
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.
State and API responsibilities
The pure Kull module owns KullPhaseRestriction, activeKullRestrictions, kullBlocksKarama, restriction/attempt-stamp validation, distinctKullCounter, kullNativeCostCards, kullNexusCostCards and kullCounterCards. It validates stamped phase policy and conserved canonical physical-card binding without mutating a Game. kullNexusCostCards(held, physicalCards, reservedIds) returns uniquely held canonical any-Treachery fuel excluding reservations; it infers neither Nexus presence, profile, phase nor promises. The engine remains authoritative for live source-specific promises/custody, actual Nexus and mode authorization, 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.
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.
The consumer interface is GameView.kullReaction: null or { event, player, target, intent, scope, effect, plays, canDecline, blocked }. The old cards array is removed. Each private play is { source: 'printed' | 'nexus', effect: 'kull', card: Card, event: string, blocked: string | null }, separating the real selected fuel from the effect and source. 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 generic special label, never a special selection. All viewers see the same event/actors/intent; only CHOAM receives its plays and canDecline: true; others get empty plays. The offer remains declinable with no legal cost. Countering reuses ordinary card/mode: cancel or passResponse. Never project special choices, saved secrets, signatures, funding or hidden hands, and never derive public opportunity timing from a secret Nexus or cost.
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 shared interception warning and nexusKullPreview identifies the new source capability.
CHOAM submits { type: 'kullDecision', event, decline: true } or { type: 'kullDecision', event, source: 'printed' | 'nexus', card }. Source is mandatory on Use, including the old printed path; no omitted-source compatibility remains. Bind actor, event, source and physical cost before mutation. Printed source is a held printed Kull; Nexus source is real eligible Treachery fuel plus the actual held CHOAM Nexus under the explicit new profile. No client effect, target, price or Nexus ID is admitted. Generic proactive choamPowerAction cannot play Kull.
Settlement flow and cancellation
- 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.
- 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.
- Declining spends nothing and resumes the original intent once, without another offer for that same attempt. Declaring Kull opens the ordinary CHOAM-effect response; pending is not active. Accepted Nexus source immediately spends its physical CHOAM Nexus once using the existing Cunning receipt/history, while fuel remains held until success. A prevented declaration does not refund that Nexus.
- 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.
- On successful Kull, discard the exact selected printed or Nexus fuel once, retain the original unplayed printed/BG card, leave the original special once-use unspent, and abort its effect and additional costs. Restrict the activating player, not an allied shipment recipient, for the current turn/phase. A Nexus fuel's actual canonical identity is unchanged; no Kull card is minted and Karama fuel is not also activated.
- If Kull is prevented, retain its selected fuel and prevent that physical cost's effect for the phase under existing native CHOAM semantics. An accepted Nexus declaration remains spent and its Cunning history completes canceled. Resume the original attempt once. Recheck exact custody rather than substituting another same-name card or restoring a whole Game.
- 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.
This is the approved development interpretation, not an official nested-priority clarification. Accepted-declaration Nexus disposal and retained pending fuel reuse the existing Cunning application convention, not a newly located publisher Kull transaction rule. JSON continuation must bind original attempt, chosen source/fuel and Cunning receipt/history through suspended pendingKull.resume/Worthless or pendingKarama parents. Deleted/orphaned source, original or receipt ownership must reject before view, normalization, actions or SQL writes, not auto-resume or expose a private cost. Completed history must not require spent cards to remain forever in discard. There is no second random draw, payment, Nexus spend or replayed effect.
Bene Gesserit conversion
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.
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 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. |
reconcileBattlePromises() |
Runs after every action. Do not release a Truthtrance promise merely because an undecided Kull interruption temporarily hides its still-possible preparation; re-evaluate after a settled restriction. Do not permit an actor to voluntarily evade a promise through the new path. |
Fremen summonedWorm.resume / afterWorm() |
Present snapshot includes pendingKarama and multiple phase fields. New frames must survive a legitimate nested summon, without a resumed snapshot resurrecting a completed attempt or erasing a phase block. |
Harkonnen pendingExchange / handExchange |
Present snapshot owns only response/decision. Preserve any surrounding attempt chain separately. A stolen or returned pending card requires custody revalidation; never substitute another card with the same name. |
| Guild special canceled shipment | Current rate-card refund is already provisional. If Kull prevents the Guild special before commitment, no shipment/rate-card refund mutation may have occurred yet. |
| CHOAM cash-in before response gating | Continue to allow already authorized paths where legal. Recheck pending-card custody; preserve CHOAM's exact declared Worthless ID in bot policy, including while hidden beneath a BG response. |
phaseOpening and phase-end markets |
Existing dispatch order gives these their own windows. Avoid offering Kull on a not-yet-legal special attempt; do not clear phase restrictions during a temporary market or response substep. |
Projection, UI, and AI
- 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 holding
ix-kull-wahad, CHOAM Nexus or eligible fuel; otherwise the prompt leaks possession. Its source-aware plays and exact selected fuel belong only in its private projection. Public viewers receive the same attempt metadata for CHOAM Nexus, an irrelevant Nexus, absent Nexus and no-cost hands. Saved private ownership must not enter publicg.decisionoutput. - 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.pendingduring pending Kull and nested responses, just as with Jubba; it binds the actual selected printed/Nexus fuel so an AI does not accidentally cash in the card currently committed to prevention. The already spent Nexus is separate from that retained physical fuel. - 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
- Conservation and no premature mutation for all four ordinary purposes and all eight existing special branches; validate Emperor revival and random Harkonnen transfer specifically.
- 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.
- 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.
- 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.
- 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.
- Compare printed-held/absent and CHOAM-Nexus/irrelevant-Nexus/absent-Nexus/no-fuel states: rival/public opportunity shape must match. Check private selected special payloads, source choices and suspended contexts never appear in rival or spectator views.
- 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.
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.
The new interaction has its own frozen evidence: types, lint, 6,022 offline tests, build, authenticated source-aware SQLite restart/races, four legal bot policies and actual Basic/Advanced CLI/runtime/phone weapon-fuel success and distinct prevention with refresh. Review repairs protect canonical descriptors, native suspended parents, reserved parent counters and CHOAM auction funding. Verified old printed counter saves migrate source binding without mutating callers or enabling Nexus; corrupt new-profile selections still reject. Local HTTP 49/55 retains four 503s and two timeouts; proxy-free CI and deployed acceptance remain separate. Historical printed-Kull and Richese results are not substituted for this proof. Full combinations and deferred auction remedies remain open.
Implemented prerequisite: prepared special intents
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.
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 later bounded Basic lobby opt-in is described above.