63 KiB
Semuta discard producers and continuation inventory
Read-only engine audit, 2026-09-07. Read the complete docs/SEMUTA_DRUG_ENGINE_AUDIT.md, then inspected every current discard(...) call, direct Treachery-discard mutation and draw(g) caller in game/engine.ts, plus the Truthtrance discard callback and pure Box/Distrans results. Names below are integration anchors; approximate current lines are navigation aids only. This report adopts no additional source ruling and changes no project file.
Kull and a Basic Voice or Prescience response — 28 October 2026
Prototyped / Partial. A clean Basic native CHOAM/Richese battle preparation can suspend a printed Karama cancellation of a declared Voice or Prescience for Kull and its Semuta response. The existing Kull frame retains the original card, actor, response and battle event. Its battle-bound fresh-discard receipt preserves preparation, shared readiness and other live battle fields while the ordinary Semuta claim or pass is pending.
A successful Kull offers its own physical discard and leaves the attempted Karama unspent; the original declared power remains. A distinct Karama counter offers that counter's own discard and then resumes the original cancellation once. Declining Kull likewise resumes that cancellation without a Kull cost; the resumed printed cost follows its own native Semuta opportunity. Claiming a fresh card affects custody rather than undoing the settled interception or counter. No suspended response, leader, plan, physical force or payment is replayed.
This serialization is provisional, not a publisher-specified nested priority. The admission is limited to Basic battles with no sealed plans, live battle promises or competing parent and the existing bare preview profile; Advanced and other effects or optional-module combinations remain separate. The older non-battle receipt signature is unchanged. Complete modes and deployed acceptance remain open. Scope.
Completed Box search during Basic bidding — 28 October 2026
Prototyped / Partial. In the supported bare Basic Semuta profile, a completed paid Nullentropy Box search may offer the discarded physical Box to Semuta while a clean ordinary auction or a Richese Once Around or Silent cache lot is active. The owner has already paid two spice, selected the recovered card and shuffled the remainder. Claim or pass leaves that exchange and payment committed and resumes the original auction without a second search or payment.
The new continuation binds the existing auction, bidding order, public or sealed bids, funding, pledges and player spice. Its auction clock is excluded because the existing decision pauses it. The Box is the fresh discard; the privately recovered card and other cards in the shuffled pile are not fresh Semuta targets. A saved older Box-discard continuation without the optional auction binding retains its prior behavior. This scope excludes Black Market, completed sale and other optional-module compositions.
The scoped tests use real auction actions with conserved staging of physical Box and discard cards. They do not constitute full-game or deployed acceptance. The rule source does not specify an online suspension or priority protocol for this combination; the preserved continuation is a software interpretation. Source scope.
Native Moritani retention and initial battle discards — 28 October 2026
In the supported bare Basic Semuta profile, a defeated ally of native Moritani
discards played cards that cannot be retained with the original mandatory
battleResolved batch. The eligible played cards remain reserved for the
later Moritani choice. A neutral Semuta reaction can suspend the original
resolved-battle continuation at the initial batch; claiming or passing resumes
the original winner cleanup and the same retention choice without repeating
battle results. A later discard of the unkept eligible cards has its own fresh
Semuta opportunity. A recovered card never enters the original retention pool.
This split into two distinct opportunities is a provisional software ordering: the source does not establish the priority or whether those discards must be grouped. The ordinary winner-retention predicate, including the Cheap Hero and Traitor cases, determines which cards are ineligible; it is not inferred from their generic card types alone. Older saved retention records and non-preview games retain their original reservations. Controlled actual-battle fixtures exercise the new continuation; wider module combinations and final acceptance remain open. Retention scope.
Shrine physical-role stages — 16 October 2026
Fresh private semuta --discoveries setup retains the original Discovery
roster/modules; unsupported Skills/Homeworld/Nexus/E3 overlays stay excluded.
The existing Karama cost continuations accept an entitled physical
Truthtrance without changing its face. Auction and price resumption carry
that committed physical card; claim/pass preserves the original owner,
recipient, lot, payment and once-use. Emperor's post-revival disposal never
repeats its completed revival.
truthtranceDiscard also accepts the already-validated source: shrine
receipt for physical Karama after one definite answer. No fresh occupancy
check is imposed on that committed Truthtrance role; existing history,
promise, parent signatures and clean-continuation restrictions remain.
Semuta recovery changes custody, not the recorded answer or printed face.
Scoped evidence: 57 affected cases, eight controlled runtime paths,32 legal policy probes and two controlled390px journeys. This is not original Discovery acquisition, full-combination or saved/deployed assurance.
Native BG cost and counter stages — 16 October 2026
The actual physical Worthless creates bgKaramaCostDiscard before the
ordinary native conversion response. Its original KaramaUse, control
resume and opportunity stay bound. After claim/decline, the single native
conversion emitter opens the same counter: physical recovery is not
conversion allowance and does not change the card's printed role.
Printed cancellation of that conversion creates the separate
karamaBgConversionCancelDiscard, retaining the BG pending use in its
saved controls. Its exact fresh Karama, never the older Worthless, may be
recovered. Finish native denial once and restore any older power without
resetting already-passed seats or forcing an otherwise automatic wait.
Claimed-cost provenance passes through an allowed converted price to the existing grant refund boundary. Genuine subsequent CHOAM disposal cannot make that old cost refundable again. Ordinary opportunity stamps still permit previously supported hand/resource/private interruptions after the fresh event; no stale Game is restored.
Current source and scoped proof records238 affected cases,26 original paths, one explicitly controlled actual-rediscard probe and four original mobile journeys. The separate Nexus Kull fixture repair follows existing pre-leader/Voice controls; Kull's pre-discard priority and all public-start gates remain unchanged.
Printed special activation and cashout stages — 16 October 2026
specialKaramaDiscard retains the validated original native intent, cost,
controls and signature. The original activation pays its cost once; the
authenticated saved discard can invoke the single native effect body with
that committed canonical card even after it moves to the claimant.
effect: the native pre-effect printed cost is fresh; resume its original selection/permission/prevention/purchase/movement once.complete: native Emperor revival and its original ledger already committed before disposal. Retire the cost event without another return.cashout: CHOAM's selected hand cards are one private simultaneous batch after the original credit. Commit before inspection, choose one fresh other-player card, and never repeat credit or include the earlier cost.
Original joint Richese/Nexus cost ordering, once-use, original typed source, refund and queued parent remain native. The source signature binds outcomes and obligations, not a stale replacement Game. Existing paid purchase-income fixtures and price-stop consumers now issue actual neutral passes before their native suffix rather than assuming direct completion.
Scoped source/runtime proof distinguishes eight original and eighteen controlled paths plus two original/ two controlled mobile journeys. Advanced E3 entry gates, converted costs and full assurance remain separate.
Shipment-price activation cost — 16 October 2026
karamaShipmentPriceDiscard offers the exact public printed cost before
activating its original other-player price. The unused opportunity,
beneficiary, creator and cost identity stay bound. Claim/decline creates the
same grant once; no shipping payment or counter departure occurs at this
boundary. The physical claimant does not become the benefit's creator.
After a claim, the grant records costClaimed: true. The selected extension
to the provisional Guild-stop refund policy does not return a claimed cost,
even if its new holder later discards it again as the special-stop cost.
The same physical card can pay that new legal use, but is not also refunded
to its former owner. An unclaimed cost retains its older exact-card refund.
This is source/nonduplication composition, not a publisher worked example.
Current source and scoped proof records234 affected cases, fourteen original runtime/policy paths, two controlled extra-card refund probes and four actual mobile journeys. Converted costs and other special-Karama disposal sources remain unfinished; full Semuta/module certification and final assurance are not implied.
Native Guild cancellation cost family — 16 October 2026
karamaShipmentDiscard now suspends a printed cancellation cost for original
native permission/rate responses. Pending reserve, cross/return or typed
Homeworld frames remain in their own custody while the response is parked.
Existing response collectors see that saved response; an admitted Semuta
claim or all-seat decline restores it and finishes the cancellation once.
Unlike the already-paid income family, no shipment payment or physical departure has happened. Recovering the cost cannot create a route, keep half price, finance the unfunded group or repeat a delivery. Signature and existing native validators bind the original group, approved split, source books, allowance and any independent price grant. Ordinary permission and affordability interpretations are unchanged.
The current source/runtime checkpoint records158 affected cases,32 original runtime/policy paths and four actual mobile cancellation/continuation journeys. These are changed-rule proofs, not a new broad save/privacy/custody campaign or complete-mode acceptance. Shipment-price activation disposal and special-stop refund composition remain separate work.
Update: the exchange producers, three battle producers, Sabotage, Robbery overflow and completed Nullentropy Box searches, Ornithopter escrow retirement, definite Truthtrance answers and the five ordinary completed-card effects below now have production automatic continuation frames; see exchange checkpoint, battle checkpoint, forced Terror checkpoint, Box checkpoint, Ornithopter checkpoint, Truthtrance checkpoint and ordinary-card checkpoint. The remaining table is an implementation inventory, not a claim that Semuta is active.
30 September 2026 checkpoint: the explicit Semuta development preview
now stages a distransDiscard receipt only after a clean completed
private transfer. Its fresh batch contains the public played Distrans,
not the private card already transferred to its recipient. Neutral
all-seat acknowledgement precedes closure; claim or decline retires
the saved receipt without redoing the hand transfer. Pending responses,
gifts and competing parents retain the original direct transfer
behavior without this Semuta reaction. The table below remains the
broader producer/continuation inventory, not a claim of complete coverage.
11 October 2026 update: the same clean receipt is admitted during battle. Only the public used Distrans is fresh; the private gift and sealed plans remain committed. Claim or decline restores clean planning without another transfer. The recipient may claim with its own held Semuta while keeping the earlier gift. Competing parents retain their separate boundaries.
A clean ordinary definite Truthtrance answer now offers its consumed card even
when another question remains reserved, when the answer bound a supported
shipment or unsubmitted battle-plan promise, or when it concerns a submitted/
revealed battle plan or a fact during battle. Claim or all-seat decline leaves
public history, plans, the consumed card's custody and any bound promise settled,
then restores the same remaining queue at ask once. Submitted/revealed plans
bind no new promise; their answers do not skip the offer.
Shrine-source answers and competing-parent continuations remain automatic. Native Richese/No-Field shipment questions and unsupported module combinations remain outside the admitted shipment-question scope. A claim may move the consumed card, never re-answer the question or rewrite its history.
Mandatory and winner battle discards may now pause before native Advanced Harkonnen capture. The original pending capture remains bound to the winning Harkonnen, loser and territory; winner casualties and optional card cleanup still precede the capture offer. Claim or decline neither samples a captive early nor repeats the capture. Other pending battle rewards remain gated.
Mandatory and winner battle discards may also pause before native Tleilaxu Face Dance. The same saved winner/territory/owner opportunity survives claim or decline; original casualties and winner cleanup still precede it. Native replacement runs once, and the claimed Treachery card remains held afterward. Face Dancer cards are not Treachery cards and never enter the fresh batch.
Quoted Advanced CHOAM force-payment income may also remain pending across mandatory/winner discard offers. The original owner/amount stays unpaid through cleanup, then its native allow/Karama response resumes. Allow credits once; cancellation redirects only the income and does not refund force payments. The original post-battle CHOAM market still finishes before the next phase.
Native Auditor opportunities may also remain pending across those offers. The frozen survival limit and audited opponent's played IDs remain original; claim/pass changes the current hand before eligibility and payment are quoted. The authorized p29 exclusion names cards that opponent used, so an acquired other-combatant card can be eligible. Original payment or private inspection resumes once, with the snapshot entitled only to CHOAM.
Completed ordinary Ghola disposal may now offer Semuta during battle as well. Revival has already committed; the receipt binds the returned leader/forces and original battle, including a sealed opposing plan. Claim or decline restores planning without reviving again or changing that plan. The conditional native-income follow-up also parks the original one-spice Tleilaxu response from that Ghola, including self-income, until claim/Continue finishes. It then allows/cancels once; returned pieces and normal revival allowances stay committed. Other competing parents and market-specific Ghola interruptions remain outside this admission.
Completed paid Box disposal may now offer Semuta during battle as well. Only the used Box is fresh; payment, private acquisition, shuffled pile and original battle remain committed. Claim or decline restores clean planning without repeating the search, shuffle or payment. Competing parents remain separate.
The local Semuta entry additionally admits Basic native Richese/Moritani with classic opponents, CHOAM/Ecaz decks and no optional modules. Private Sabotage and Robbery overflow after clean ordinary shipment/movement arrivals now offer the fresh card before the original suffix. No face is projected before commitment. The random victim/draw, removed token, payment and physical arrival remain committed; Sabotage's optional gift is restored afterward. Other arrival parents retain their automatic paths. Advanced Moritani and wider family/module mixtures are not admitted by this entry.
Clean Once Around Sapho stages saphoAuctionDiscard after the open
lot's finite bidder reorder, hand-slot release and public card disposal,
but before settlement. The saved receipt binds the lot, prior funding,
active bidder and event; claim or decline restores bidding once.
Clean movement-order Sapho stages saphoMovementDiscard after its
finite first/last queue and public card disposal are committed.
The reaction retires before movementTurn opens the new actor's turn;
the queue, prior active seat and protected-last receipt bind its suffix.
Clean between-battles Sapho stages saphoBattleOrderDiscard after
its finite chooser priority and public card disposal commit, before
any next battle is selected. The receipt binds the last battle,
unselected board, chooser uses, hands and card identity; claim or
decline resumes the same active chooser without repeating the reorder.
Clean pre-plan aggressor Sapho stages saphoAggressorDiscard after
the aggressor event, ordinary tie priority and card disposal commit.
The receipt binds the same unsealed battle, readiness, player hands
and reserves. Claim or decline restores shared pre-leader preparation
without rerunning the aggressor change.
Clean Residual Poison stages residualPoisonDiscard only after its
single random leader death and public used-card disposal, before
reconciling battle inspections and preparation readiness. The receipt
binds the victim, leader custody and unsealed battle. The neutral
offer is limited to a pre-leader board with no inspection or ready
combatant; other accepted plays retain automatic continuation.
Printed Karama canceling clean CHOAM Charity, Inflation or Bene
Gesserit Charity stages karamaCharityDiscard,
karamaInflationDiscard or karamaBgCharityDiscard after the public
card cost but before accepted cancellation. The first two retain
their existing saved receipt signatures. Each binds the sole
suspended response, spent card and hand/spice custody; claim or
decline restores that response and finishes cancellation once.
Other cancellations and shipping retain their automatic paths.
Clean printed Karama normal-auction purchase or winning-bid payment
stages karamaPurchaseDiscard or karamaPaymentDiscard after the
public cost and before the reserved lot settles. The receipt binds
the original lot, round, cache, order, deck, hands and bid winner;
a neutral claim or decline completes the same free settlement once.
Richese lots, Worthless conversion and nested responses retain their
previous automatic paths.
A clean private normal-auction or Black Market Ixian ally replacement now stages
the existing ixAllyCard continuation as a neutral Semuta offer before
draw(g). The original buyer owns the discarded card. Its face stays
unknown to rivals and uncommitted holders; a sole committed claim
moves that exact card before one saved replacement draw and original
sale continuation. The 11 October Black Market extension preserves the original
paid amount, seller income and return to Richese Declaration. Cache purchases
retain their printed prohibition on native Ixian allied replacement.
A clean completed CHOAM market sale stages choamSaleDiscard only after
the accepted public card disposal and its quoted two- or three-spice
income. The saved receipt binds the sold card, duplicate witness when
present, earned balance and still-open market; claim or decline
restores the same owner's next market decision without paying again.
Canceled/invalid sales have no batch; competing market parents retain
their automatic continuation.
Clean Kulon stages choamKulonDiscard after its accepted public
Worthless card cost but before adding one turn-scoped movement range.
The receipt binds the active CHOAM player, prior bonus, card and
unspent movement. A neutral claim or decline restores the same
one-range increment without replaying the response. Reactive,
Nexus and overlapping movement parents retain their automatic path.
Clean proactive or reactive La La La stages choamLaLaLaDiscard after its
accepted public Worthless card cost but before blocking a selected
target's free force revival. The receipt binds the target, old
Revival rules and physical card. A neutral claim or decline applies
the one saved block; paid revival remains legal. A reactive request is already
stopped and its marker cannot revive or charge it. Nexus and other contexts
retain their automatic paths.
Clean proactive or reactive Baliset stages choamBalisetDiscard after its
accepted public Worthless card cost but before restricting the
chosen player from movement into CHOAM's occupied territory. The
receipt binds the target, territory, CHOAM's current forces,
existing restrictions and physical card. A neutral claim or
decline installs the one saved restriction; shipment remains possible. A clean
ordinary declared move is already stopped without spending its allowance.
Nexus, movement-card/Ambassador and overlapping arrival parents retain their
automatic paths.
Clean proactive or final-Mentat Trip to Gamont stages choamGamontDiscard after the accepted
public card cost but before its selected ordinary/elite return or native
No-Field reveal and capped recall. The receipt binds location, exact counter
type/marker event, target force/reserve/elite/No-Field custody and CHOAM hand.
Claim or decline completes the original selection once without replaying the
response. A zero marker reveals without inventing a force; revival usage stays
unchanged. A final-Mentat marker restores the same CHOAM-owned decision before
victory or turn advancement; Nexus and competing parents retain automatic paths.
Accepted printed Jubba Cloak stages choamJubbaDiscard after
its public Worthless card cost but before protecting CHOAM's
selected territory or resolving the moving storm. The receipt
binds the current storm traversal and original CHOAM forces;
claim or decline marks the one protected territory and resumes
the same storm exactly once. Canceled cards, Nexus conversion
and competing parents retain their direct paths.
Completed Ornithopter movement now offers its retired public card before the original arrival suffix, including native Bene Gesserit Intrusion. The final forces and move counter stay committed in the bound flight frame. Claim or decline retires that frame before logging arrival and opening the original optional fighter-to-advisor choice once. This order is the existing discard-before-arrival composition, not a new publisher priority ruling. Ecaz Ambassador, Moritani Terror and overlapping entry reactions remain outside this Semuta boundary. (11 October 2026)
Clean battleResolved now pauses the first public mandatory batch
after combat result and actual card custody are committed but before
casualty choices or winner follow-up. A mutual-Traitor outcome may
place two cards from different former owners in that one batch;
claimants can choose only a card from another player. Later mandatory
winning-card cleanup uses a separate winnerMandatoryDiscard batch,
and an optional winner selection uses a third battleCleanup batch.
Every supported stage has a neutral all-seat offer; committed holders
select one fresh card, leave the others in the pile and resume exactly
once. Native capture, Face Dance, quoted CHOAM force income and Auditor remain
pending across the offer; original native Tech is also supported in the fresh
three-to-six-seat CHOAM/optional-Ix entry. Token custody stays unchanged until
card cleanup completes and the original winner takes one loser-owned token,
still before Face Dance. The original compulsory winner-card queue may remain
reserved during the earlier loser batch. Native Ixian casualties/substitution
finish before the used winning Tooth becomes its own later fresh discard.
Basic native Moritani additionally admits preceding compulsory/optional winner
batches with the original choose-stage allied retention still pending, then
the completed battleCleanup with source: 'moritani'. The chosen kept card
never enters that batch. Native Karama finishes first; claim/pass neither
re-offers retention nor expands its original played-card pool. Canonical
aftermath validation and reciprocal alliance bind the preceding native choice.
battleResolved with pending retention, Nexus retention, Advanced native
Moritani and a pending Ixian substitution remain outside this bounded offer.
Other rewards remain automatic without Semuta.
The explicit Richese preview also accepts a fresh physical Ix deck.
Clean Thumper disposal stages thumperDiscard before blowSpice
injects a worm or draws from either spice pile. The saved frame binds
the undrawn decks, previous land/discard, forces and alliance state;
Semuta claim or all-seat decline retires it before one ordinary
Spice Blow suffix. A CHOAM-only preview has no Thumper identity.
The same Ix deck supplies Amal. In a clean phase opening, its
public disposal precedes halving every personal spice amount and
clearing prior opening passes. amalDiscard binds original balances,
the halved result and suspended opening; a neutral offer retires
before restoring that opening. Bidding pool draws, phase income and
other opening effects therefore still occur only after everyone
finishes the opening. Nested openings remain unintegrated.
Main findings
A post-applyAction pile diff cannot implement immediate Semuta. Ix Ambassador and Ixian ally replacement discard then draw directly. Ordinary Karama cancellation/purchase can reach replacement, Harkonnen bonus or a new auction pool indirectly. A stopped frame must resume at a named stage, never rerun its original public action.
There are three direct real discard-pile producers outside discard: finishNullentropy installs the pure result pile containing the newly used Box; finishOrnithopter pushes its owned escrow card; the Distrans branch pushes only the used Distrans. draw drains/shuffles the pile but creates no new discard. Setup resets and trial-state discards are not live reaction events.
For each batch retain actual former owner per entry, exact physical ID, a face snapshot as evidence (not extra custody), and whether the face is already public. The initiator may differ from the discarder. Private batch faces cannot appear in public decision, response, logs or event payloads before an entitled committed inspection.
Producer table
“Public” means the current engine actually announces/reveals the used face to the table. Private does not prevent a previously entitled individual from remembering it; it means the new feature must not broadcast that face. Continuation names and parameter sets below are proposed internal discriminants, not existing exports.
| Producer / anchor | Logical batch, former owner and face | Work at boundary; typed continuation needed |
|---|---|---|
discard(g,p,id) (~1806) |
Primitive for a caller-defined batch, never automatically a whole HTTP action. Owner p.id; face policy supplied by caller. |
Removes one exact held card after Box/gift guards. A batch primitive should validate all requested members before removal. Return/store a committed batch identity; do not throw midway and pretend the whole caller finished. |
finishNullentropy (~1241–1305) |
One new Box, public; owner pending.player. The old shuffled cards are not new discards, and the recovered card is a transfer. |
Search payment already happened in beginNullentropy; selection validation and the final shuffle already happen once here. Commit recovered hand + shuffled remainder + used Box, clear paid search, then pause before resuming the original context. afterBox {player, boxEvent, resume:{response,decision,pendingKarama,phaseOpening}}; never repeat payment, shuffle or selected transfer. Snapshot/verify the final pile, not the original discardSignature after it changes. |
spendKarama (~3455), printed card |
One activating Karama, public; card player's owner, not beneficiary. | Discard precedes completeKarama. afterKaramaCost {owner,card,form:'printed',use:KaramaUse} must continue the accepted use without rechecking that the spent card remains in hand. use already discriminates cancellation, shipment, immediate purchase and auction payment. |
spendKarama, BG Worthless |
One used Worthless, public because log names its conversion; owner BG. | afterKaramaCost {owner,card,form:'worthless',use} opens the conversion response once. Preserve the original canceled response inside use, and any surrounding Box/gift/conversion frame. Do not overwrite pendingKarama with Semuta state. |
finishOrnithopter (~3896) |
One public Ornithopter, owner flight.player, from g.ornithopter.card escrow rather than hand. |
Clear escrow and record completion once. Caller determines suffix: afterMovementCard {player,origin,to,sector,amount,elite,noField,entryKind:'movement'} for completeMove, or afterEndMovementCard {player} for endMovement. The former has already placed/removed forces and incremented moves before the discard; still needs rate clear, movement log, intrusion and territory entry. The latter still needs rate clear, allied separation, removing the actor, Sapho-last clear and movementTurn. |
decideAmbassador, CHOAM cards (~4502) |
All selected IDs from the beneficiary form one simultaneous batch; private (current log announces count, not identities). Empty selection creates no discard event. | Benefit is 3 * selectedCount, not a recomputation from the hand after Semuta. Prefer commit this earned spice with the discard, then afterAmbassadorDiscard {entryEvent,beneficiary,effect:'choam',selectedCount} → finishAmbassador. The finalizer can RNG-replenish ambassadors and resume a worm ride, so it must run once after the claim. |
decideAmbassador, Ix cards (~4502–4522) |
Exactly one private card from beneficiary. | Hard stop before draw(g). afterAmbassadorDiscard {entryEvent,beneficiary,effect:'ixians',replacementPending:true} → draw at most once, append private replacement, log, finish. Revalidate that the pending entry still belongs to the frame, not that its discarded card is still held. |
decideTerror, Sabotage (~4795) |
One randomly selected private victim card, owner entrant, not Moritani actor. No card/no batch if victim hand empty. | Victim selection RNG is before the discard: save that identity once. Terror token reveal/removal already happened. afterSabotageDiscard {entryEvent,entrant,moritani} → open optional gift if Moritani has cards, otherwise finishTerrorEntry; do not reroll or re-remove token. The later gift is not a discard. |
decideTerror, Robbery overflow (~4878) |
One private selected card per explicit overflow decision; owner current beneficiary p. Separate decisions are separate batches. |
Robbery draw already happened. afterRobberyDiscard {entryEvent,player} → reopen discard if still over limit, else finish entry. Never repeat the Robbery draw or paid territory entry. |
playSapho, Once Around (~5181) |
One public Sapho from actor. | Queue reordering and any just-restored bidder eligibility happen before discard. afterSapho {scope:'onceAround',event,player,mode} → log once and settleRicheseLot. No new reorder, bidder grant or reset of acted; settling can eventually start a later pool. |
playSapho, movement (~5204) |
One public Sapho from actor. | Queue/protected-last update already happened. afterSapho {scope:'movement',event,player,mode,previousActive} → log, invoke movementTurn only if current actor changed. Do not reopen an already settled Guild timing decision or lose the last override. |
playResidualPoison (~5794–5851) |
One public Residual Poison from attacker using it. | Victim RNG, death, captured/Duke cleanup already happened. afterResidualPoison {battleEvent,owner,target,victimId} → existing promise reconciliation, invalid Prescience-value re-answer and pre-leader readiness update. Do not reroll, kill again or award nonexistent bounty. |
resolveBattle, mandatory card cleanup (~7398) |
Collect all actually mandatory-discarded cards across both combatants as one mixed-owner batch. Faces public through revealed plans/late defense. Exclude retentionReservesCard; exclude retained winner cards. Activated Tooth/Artillery/hero/late defense obey their existing physical used/retention eligibility. |
Battle result, most deaths/force losses/bounty and pending income/Auditor/FaceDance facts precede this loop. Finish non-drawing bookkeeping and set lastBattle, clear battle, snapshot winner retained-card IDs and remaining casualty choices before exposing a pause. afterMandatoryBattleDiscards {battleEvent,territory,winner,winnerCards,lossChoices} → settleWinnerCasualties / battleLosses decision / finishWinner / finishBattle. Never rerun resolveBattle; do not call used() against hands after a Semuta transfer. |
Winner decision.kind:'battleCards' fallback (~11468) |
Selected subset of already played public winner cards, one batch. Empty subset means no discard event. | Decision has been taken; save normalized selected IDs/count. afterWinnerCardDiscards {winner,territory} → log and finishBattle. This is a later batch than mandatory loser cleanup. |
finishMoritaniRetention (~7697) |
All pending.played except keep form one later public batch; former owner pending.player, not the Moritani ally granting retention. |
Preserve chosen kept physical card and accepted retention result. Clear retention record at commitment so resumption does not require discarded cards in hand. afterMoritaniRetention {player,territory,keep} → one retention log then finishBattle. |
finishResponse('choamWorthless') (~8094) |
One public named Worthless on successful effect only; CHOAM owner. Canceled/stale effect leaves card held and produces no batch. | Local pending was already removed from g.pendingChoamWorthless; it must be retained in a typed frame. afterChoamWorthlessDiscard {pending:PendingChoamWorthless} applies its accepted effect once, then exact storm/revival/movement/Mentat suffix. Alternatively commit effect first and store only the suffix; do not rerun effect validation against post-discard custody. See branch inventory below. |
finishResponse('ixAllyCard') (~8233) |
One purchased card discarded by buyer. Private for normal/Black Market purchases unless separately publicly revealed; public for the offered Richese cache face. Do not assume every auction face was public: ordinary projection is Atreides-only. | Hard stop before draw(g). afterIxAllyDiscard {player,card,free,saleBinding} → one private draw, clear pendingIxAlly, continueAuctionSale(free). Original payment and acquired card already committed; seller/Emperor income and Harkonnen bonus may still follow. |
finishResponse('choamSale') (~8401) |
One card per successful sale; public because declaration logs revealed name/duplicate witness. Owner market owner. Witness duplicate remains held and is not in batch. | Price was quoted before the response; record earned sale.price once with discard. afterChoamSale {owner,saleIdOrBinding,price} → clear market.sale, resume market. Do not recompute duplicate eligibility after claimed card changes hands or repeat payout. |
Distrans branch in applyActionInner (~10286) |
Only result.discarded (public Distrans), owner giver. The secretly given card is a transfer. |
Both hand transfers already assigned from the pure result. afterDistrans {owner,recipient} needs at most log and generic action finalization. Never rerun transfer or expose action.give through public batch metadata. |
| Phase-opening Amal (~10351) | One public Amal from actor. | Discard precedes halving every personal spice and resetting opening passes. afterAmal {owner,openingBinding} applies the effect once, preserving phaseOpening.initialize; or commit halving first and resume only its opening suffix. Never call beginPhase here merely because a Semuta claim completed. |
| Thumper branch (~13037) | One public Thumper from actor. | afterThumper {owner,turn,phase} → log and blowSpice(g,true) once. Spice-card draw/worm sequence is a different deck, but still must not run twice or overtake the discard interruption. |
| Generic Hajr/Ghola/Harvester/Weather/Atomics (~13103) | One public played card from actor, one batch each. | Effects have already happened before the shared discard. afterOrdinaryCard {owner,cardId,cardName,effect} → log and normal finalization; do not reapply movement allowance, Ghola revival/tech/income, spice multiplier, weather setting or Wall casualties. A Ghola-created revival-income response must survive the pause. |
resolveTruthAction callback in game/truthtrance.ts (~460) |
One public Truthtrance belonging to queued asker, not the answering actor. Multiple queued questions are successive events, not one batch. Unknown/save does not discard. | Definite answer, promise binding, public history and answer log already committed. afterTruthtranceDiscard {queueHeadPlayer,queueHeadCard,questionBinding,remainingWindow} activates the next queued question exactly once; do not answer/bind/history again. Detach the consumed head into this frame before exposing the pause: the saved-shipment-question validator requires a live queued Truthtrance still be held. Preserve the remaining queue privately in the continuation until Semuta ends. A generic top-level truthtrance early return must not prevent this nested claim. |
Printed Karama cancellation of native capture, Auditor, quoted battle income,
Ixian substitution or Basic Moritani retention now uses karamaBattleDiscard.
The original accepted response is detached, not canceled early. Only the
public activating cost is fresh; claim/pass restores that response and calls
the original cancellation once before its later native cleanup. A claimed
cost cannot undo cancellation or enter the original losing-ally played pool.
Worthless conversion and other cancellation families retain their boundaries.
Special Karama stage inventory
executeSpecialKaramaIntent (~9579) already has a typed, validated declaration for each power. It is useful input to an after-activation executor, but cannot simply be called again after discarding: preparation assumes the activating physical card is still held. Every activating Karama face is public and belongs to its player. These are separate from any later discard caused by the power.
| Intent | Accepted continuation after activating discard |
|---|---|
richese |
{owner,acquire,turn,phase,resume}: pay 3, move exact private cache card, set once-use, then open stored Emperor income continuation. Selected acquisition is private; no extra discard for removing it from cache. Bind reservation/price before pause so resumption does not become a different purchase. |
choam |
{owner,selectedIds,selectedCount}: commit one second simultaneous private batch for the selected cards, credit 3 each and set once-use exactly once. Activator and selected cash-in are distinct stages; no array-diff grouping across both. A second frame must own the post-cash-in suffix. |
ixians |
{owner,route,collect}: set once-use then relocate/collect once. Preserve movement route and all territory-entry follow-up. |
tleilaxu |
{owner,target}: set prevention and once-use, clear the bound revival/request/decision once. The interrupted revival opportunity must be explicitly bound, not whatever decision happens to be current after Semuta. |
fremen |
{owner,territory,resume}: set once-use, install summoned-worm resume frame, clear the owned old spice/response/decision fields, then beginWorm once. afterWorm restores that frame via Object.assign; it must not restore an already completed Semuta opportunity. |
atreides |
{owner,target,battleBinding}: set once-use/full-plan entitlement and clear the bound offer once. The battle/plan remains private. |
guild |
{owner,shipper,shipmentBinding,rateRefundBinding}: set once-use and shipper opportunity spent; apply the existing provisional reserved-rate return and clear pending shipment/rate once. The already discarded shipping-rate Karama is not a fresh discard here. See reservation warning below. |
emperorLeader / emperorForces |
Revival, logs and tech income currently occur before activating discard. Save {owner,intentKind} only for setting once-use/finalization; never repeat those already applied mutations. |
harkonnen |
{owner,target,count,resume}: set once-use, perform random take exactly once, then create the equal-return decision. Current random selection is after discard, unlike Sabotage's already chosen victim. If Semuta truly pauses immediately here, sample the resulting live hand only after that pause. Do not prematurely sample and then pretend it was after Semuta, and never reroll on reconnect. The taken/returned cards are transfers, not discards. |
CHOAM Worthless suffix detail
The accepted pending record must retain owner,card,effect,target,location,elite,noFieldEvent and its existing storm/revival/movement/mentat continuation flags. Kulon changes movement bonus; Jubba changes storm protection; Baliset may clear the pending move; Gamont may reveal a No-Field and return one typed force; La La La sets free-revival prevention and may clear the revival. After that, the current suffix calls offerChoamStorm, offerRevivalStop, resumeChoamMovement, or opens choamMentat. Those are not interchangeable with a generic nextPhase.
Draw/refill consumers to guard
All actual Treachery draws funnel through draw(g) (~1795). It currently blocks only a paid Box; an unresolved Semuta batch needs an equivalent guard against refill/drain. Direct consumers are dealStartingTreachery; setAuction's pool loop; Ix Ambassador replacement; Robbery; finishResponse('ixAuction')'s multi-card pool loop; finishResponse('ixAllyCard'); finishResponse('harkonnenBonus'); and the Ix setup decision's Harkonnen starting bonus. Setup normally cannot have a fresh Semuta discard, but the guard should remain universal.
Cancellation/purchase chain: completeKarama → finishResponse or settleAuction → continueAuctionSale → auctionBonus/nextAuction → Richese next-lot or phase preparation. Preserve currentAuctionSale, original payment, lot/card index, free, and pending Ix replacement across that chain. A future multi-draw continuation must store already drawn cards plus remaining count if it can itself suspend; restarting a draw loop from zero duplicates cards. No current raw draw(g) performs a discard itself, so well-placed discard pauses can usually leave these loops indivisible.
finishAmbassador may replenish five tokens using RNG; finishBattle can open retention, CHOAM income, tech, capture, Auditor, FaceDance or the next phase; endMovement may start a new phase; finishChoamMarket advances storm/phase; Fremen worm restoration resumes older phase state. None may run ahead merely because Semuta is represented by a field that the current automatic-finalization loop does not know.
Exclusions, reservations and privacy hazards
- Not discards: Ix Technology substitutes hand and auction-pool cards; Ix auction selection returns a pool card to deck; unused auction cards return to deck; CHOAM allied swaps; Richese gifts; Harkonnen equal exchange; Sabotage gift; cache purchase; cache remove-from-game; normal purchase; Box's recovered target and shuffled old pile; Spice/Traitor/FaceDance/Nexus/leader/token movement. Do not emit events from generic hand disappearance or pile replacement.
- Reserved rate card:
karamaShipping.cardpoints to a physically discarded card which Guild special currently returns provisionally. BG conversion can carry this binding earlier insidependingKarama.use; if pausing immediately after the cost, the savedKaramaUsealready owns that future reservation beforekaramaShippingexists. An exclusion/escrow rule must inspect the suspended intent, not only the live top-level rate field. Do not silently settle the underlying refund ambiguity by giving the same card to two owners. - Other reserved cards: Truthtrance queue heads, paid Box, committed gifts, Black Market offerings, Moritani retained cleanup and Ornithopter escrow each have existing ownership rules. Semuta can target only a completed discard, not a still-held reserved card. Preserve reserved incoming hand slots from auctions and mandatory exchanges when checking Semuta's user-approved atomic full-hand exchange; the final hand must still fit those obligations.
- Trial engines:
findReachableBattlePlandiscards Ghola ontrial; special-intent and shipment-completion searches call effect executors on clones. These must not produce real Semuta prompts, consume RNG just to enumerate options, or treat a newly paused effect as already earned income. Give search execution an explicit internal simulation path that retains physical accounting without public interactive side effects. - Finalizer fences: add pending-discard/claim checks before
finishActionContinuations, both promise reconciliations andsettleAutomaticContinuations; also room recovery/bot scheduling and top-level Truthtrance/Box handling. Otherwise temporary suspension can release a feasible promise, answer the next queued question, settle a payout or draw before Semuta. Once a batch closes, resume its typed suffix then ordinary finalization exactly once. - Integrity before visibility: do not publish a battle halfway through mandatory cleanup: existing Auditor/Stone/late-defense invariants require coherent completed contexts. Similarly, do not leave a consumed Truthtrance at a live validated queue head or a discarded Ix purchase inside a validator requiring it still held. Move ownership to a stage-specific continuation before opening the neutral reaction.
Verification targets
Prioritize empty-deck Ix replacement (fresh target stays in pile until claim/pass); Sabotage (victim RNG once and private); mandatory mixed-owner battle batch plus separate winner/Moritani batches; Box (paid shuffle once); movement-card escrow (no second move/end-turn); nested Karama purchase/cancel and shipping refund binding; CHOAM activation versus cash-in batches; and Truthtrance history/binding once. At every stage test JSON/module reload and concurrent identical claim CAS, original resource benefit once, exact inventory, owner-only unknown faces after commitment, and byte-equivalent rival projections. Full-hand Semuta exchange is user-approved; the provisional shipping-rate refund remains separate. No new publisher timing ruling is asserted by this inventory.