Connect owned Sandmaster destination pile choices

This commit is contained in:
Quintine committed 2026-10-09 04:51:12 +11:00
1 parent 24863480cb
commit 0040ed1921
17 files changed
+458 -89

No files matched your search

+14
View File
@@ -29,6 +29,20 @@ optional skill bands, combinations and public expansion starts remain open.
Rules implementation continues; comprehensive assurance and administration
remain deferred until all rules are implemented.
**Owned Sandmaster destination piles — 9 October.** Native worm rides and
physical Fremen Ambassador relocation now select an exact positive pile
when several exist. Collection remains optional and capped at one spice;
invalid/omitted ambiguous keys reject before transfer. Stored Ambassador
reconstruction retains the selected key. Basic/Advanced native smokes and
all four existing legal policies pass without destination-strategy changes.
At390px, actual worm controls debit Pasty Mesa6 while landing four forces
in Mesa5 (spice5→6); Ambassador controls reset on a destination change and
debit South Mesa5 while landing two forces in Mesa4 (spice20→21).
Types/lint and 91 affected cases pass. HMS multi-pile controls remain open.
See [worm](SANDMASTER_WORM.md#connected-behavior) and
[physical Ambassador](SANDMASTER_MOVEMENT.md#physical-ambassador-owned-destination-allocation--9-october-2026).
**Owned Sandmaster ground-pile choice — 9 October.** Ordinary route
collection now offers every positive pile, but permits only one selected
sector per entered territory. The checkbox group supports switching piles
+30
View File
@@ -1,5 +1,35 @@
# Dune implementation status
## 9 October 2026 — owned worm and physical Ambassador destination piles
The shared destination quote exposes all legal positive piles and an exact
selection. Native worm and physical Fremen Ambassador declarations add
`sandmasterPile` when collecting; ambiguity requires a supplied key.
Single-pile boolean declarations remain valid. One ride/relocation earns
only one spice, regardless of forces or piles, before arrival reactions.
Owner allocation is visibly provisional, not publisher adjudication.
The actual UI selectors reset stale destination selection, retain optional
opt-out and show before/after quantities. Existing native/profile,
same-territory and concealed-marker guards stay. Stored Ambassador movement
reconstructs its exact frozen key through the original receipt.
Basic/Advanced native smoke chooses Pasty Mesa6 (3→2), preserves Mesa5 at2,
lands four forces in Mesa5 and credits5→6 without changing normal movement.
Physical Ambassador smoke chooses South Mesa5 (2→1), preserves Mesa4 at4,
lands two forces in Mesa4 and credits20→21 with moved0/shippedfalse.
All four existing policies retain legal continuation and send explicit keys
when they choose collection; optional destination strategy is unchanged.
Isolated 390px production controls reproduce both results, including
Ambassador destination reset and opt-out/reselection. No existing game store
or deployed acceptance is claimed.
`check:quick` passes; 91 affected native, quote, control, bot, cancellation
and movement cases pass. The selected-pile Intrusion/JSON cases settle once.
A duplicate control case that enabled an undealt card variant was removed;
existing valid profile guards remain covered. Temporary scripts and the
dedicated service were removed. No broad recovery/HTTP campaign or deployment.
## 9 October 2026 — owned Sandmaster ground-movement pile selection
The shared ground quote now groups all positive pile keys by entered
+1 -1
View File
@@ -21,7 +21,7 @@ They supersede earlier software-absence claims only within their named scope.
| Full-hand Nullentropy Box | Basic and Advanced permit an atomic retrieval/Box-disposal exchange with final hand within its actual limit; Box remains last/on top. Intermediate capacity is not adjudicated. | [Box runtime](NULLENTROPY_BOX_ENGINE_AUDIT.md) |
| Kulon with Richese Ornithopter | Both modes coexist in Basic/Advanced. The fixed one-group card maximum remains three; Kulon extends each normal-range group. Explicitly provisional, not a publisher ruling. | [Movement policy](RICHESE_ORNITHOPTER_ENGINE_AUDIT.md#provisional-kulon-coexistence--9-october-2026) |
| Multi-pile battle skills | In both modes, surviving Smuggler allocates the fixed unmodified-strength-capped collection among reveal-time positive piles; Sandmaster winner then selects one remaining pile for +3. Single-pile/all/none/void effects stay automatic. Owner sector selection is provisional, not a publisher allocation ruling. | [Smuggler](SMUGGLER_BATTLE.md#multi-pile-allocation-policy-and-pure-api--9-october-2026), [Sandmaster](LEADER_BATTLE_EFFECTS.md#source-contract) |
| Multi-pile Sandmaster ground movement | The owner chooses one existing positive debit sector per entered territory, or declines its one-spice collection. Duplicate territory collection rejects. Worm/Ambassador destination and HMS multi-pile paths remain separate. Explicitly provisional, not a publisher allocation ruling. | [Ground-route policy](SANDMASTER_MOVEMENT.md#owned-ground-route-pile-selection--9-october-2026) |
| Multi-pile Sandmaster movement | Ground movement chooses one existing positive debit sector per entered territory; worm and physical Fremen Ambassador relocation choose one at their entered destination, or decline collection. Duplicate territory collection rejects; destination multi-pile requests need an explicit key. HMS multi-pile controls remain separate. Provisional owner allocation, not a publisher ruling. | [Ground](SANDMASTER_MOVEMENT.md#owned-ground-route-pile-selection--9-october-2026), [Ambassador](SANDMASTER_MOVEMENT.md#physical-ambassador-owned-destination-allocation--9-october-2026), [worm](SANDMASTER_WORM.md#connected-behavior) |
| Basic occupied Homeworld lifecycle | Current sole foreign garrison controls occupied income, Bidding effects, defenses, percentage shares and the Ecaz-victory holding; the entitlement ends immediately on departure, contest or native repopulation. A recorded source observation is still required. Basic Tupile slot leasing keeps the conservative original-epoch gate. Visibly provisional, not a publisher or numerical user ruling. | [Occupation](HOMEWORLD_OCCUPATION_RULES.md#basic-current-sole-benefit-policy--9-october-2026) |
No publication or faction/mode gate is opened. The exact 7 October user
+43 -4
View File
@@ -28,11 +28,50 @@ declines/reselects the territory, and commits the same move: personal
spice10→12, South Mesa4 remains4, South Mesa5 becomes1, Cielago East3
becomes3, and three forces arrive in Cielago East.
Worm/physical-Ambassador destination choices and native HMS relocation
retain their separate single-pile scope. No public start or broader
source adjudication is opened by this ground-route change.
Destination relocation choices are separate from these ground-route controls;
physical Fremen Ambassador allocation is recorded below and worm collection
in [its own contract](SANDMASTER_WORM.md). Native HMS relocation retains its
single-pile scope. No public start or broader source adjudication is opened
by this ground-route change.
## Physical Ambassador owned-destination allocation — 9 October 2026
Physical Fremen Ambassador relocation now offers every existing positive
destination-territory pile and collects at most one spice from exactly one
chosen sector before physical arrival and its reactions. The checkbox remains
optional. With multiple legal piles, the real relocation control shows their
sector quantities as before→before−1, defaults to the first legal pile, and
allows another sector. Changing source or destination resets the selection;
an unavailable selection cannot strand the draft. Declining sends no pile key
and transfers no spice.
`sandmasterCollect: true` with multiple positive piles requires an explicit
`sandmasterPile` key. A single-pile boolean declaration remains valid. Native
validation rejects missing, malformed, foreign, unknown or exhausted selections
before force or spice mutation. The shared `sandmasterDestinationCollection`
quote supplies the legal piles and the selected quantity; `ambassadorSandmaster`
retains the exact native trainer, key and original quantity as its frozen proof.
Stored continuation revalidates that same key, not a fresh default; a committed
arrival interruption resumes without collecting twice.
Choosing the debit sector is **provisional owner allocation**, not a publisher
ruling: the source grants one spice for entering the territory but does not
name its sector. Same-territory moves, living-native skill eligibility,
concealed-marker restrictions, typed forces, ordinary allowances and the
original Ambassador event remain unchanged. This does not change ground-route
or native HMS eligibility, add spice or invent intervening sectors.
Focused native-engine cases now cover Basic/Advanced alternate-pile allocation,
decline, invalid declarations without mutation, living-trainer restrictions and
collection before a JSON-restored Intrusion continuation. Integrated native
smoke in both modes chooses South Mesa5 (2→1), preserves Mesa4 at4,
lands two forces in Mesa4 and credits spice20→21 without ordinary
shipment/movement use. At390px, the actual control changes destination,
resets the pile selection, opts out/reselects and commits the same result.
The 8 October rejection evidence below remains a dated checkpoint, not
the current multi-pile policy.
## Physical Fremen Ambassador relocation — 8 October 2026
The Ambassador expressly relocates a board force group. The normal
@@ -129,7 +168,7 @@ Broad checkpoint results are recorded with the checkpoint. These checks do not c
The [worm-ride follow-up](SANDMASTER_WORM.md) connects native Fremen destination
collection, including saved arrival reactions. Physical Fremen Ambassador
relocation is connected above. Other nonordinary relocations, special cards,
concealed-marker collection, multi-pile destination/HMS collection and wider
concealed-marker collection, multi-pile HMS collection and wider
interaction/strategy acceptance remain. The lower battle band is in
[the battle-effects contract](LEADER_BATTLE_EFFECTS.md).
+54 -21
View File
@@ -24,35 +24,68 @@ the common skill-before-faction order. Subsequent arrival effects do not undo it
## Connected behavior
A shared public quote validates the player, destination, skill and single positive
pile. The checkbox defaults to collection but permits declining it. An empty or
ambiguous pile suppresses collection without blocking ordinary riding. Legacy
saved actions without the new field retain their original behavior. No invented
intermediate route or extra normal movement is consumed. Multi-sector and typed
elite selections transfer one spice total, not one per force or source sector.
A shared public quote validates the player, destination, skill and all positive
destination piles. Collection remains optional and capped at one spice for the
entire ride. With several valid piles, the owner chooses the exact sector supplying
that spice; placement of the riding forces does not constrain the chosen pile.
This allocation policy is **provisional**, not a publisher sector-allocation ruling.
It does not invent a pile, an intermediate route or extra normal movement.
Multi-sector and typed elite selections still transfer one spice total, not one
per force, source sector or destination pile.
The checkbox defaults to collection but permits declining it. A multi-pile
selector is controlled by the parent's selected quote key and shows each sector's
before → before − 1 quantity. A single pile needs no selector; an empty destination
or unsupported quote has no collection checkbox. None of these cases prevents
ordinary riding without collection, and there is no extra confirmation.
`sandmasterWormCollection(game, player, destination, sector, decision = game.decision,
selectedPile?: string)` retains its native Fremen, phase, decision, leader and
configuration guards. Its quote includes `piles: Array<{ key: string; before: number }>`,
the selected `key` and `before`, and any `blocked` reason. Without `selectedPile`,
the quote offers the first legal pile; this UI default is not action authorization.
An invalid selected key blocks the quote, and blocked quotes expose `piles: []`.
An accepted worm-ride action may set `sandmasterCollect: true` and
`sandmasterPile: "territory:sector"`. Collection from multiple positive destination
piles requires that explicit key; omitting it rejects the action without mutation.
Single-pile collection still accepts the legacy boolean-only action. Send the pile
field only when collecting. Declining collection or omitting both fields preserves
ordinary riding and leaves board/player spice unchanged.
`SandmasterWormChoice` receives `quote`, `collect`, `onChange(collect)` and the
required `onPileChange(key)` callback. The parent owns selection state, requotes
that exact key and includes it in the collecting action.
The engine validates every force before moving spice from the board to the
player, logs the automatic effect and then opens any Bene Gesserit arrival choice.
Existing versioned room writes commit that transfer once. A saved pending arrival
resumes only the remaining reaction and ride queue; no new receipt is needed.
All four AI profiles attach the optional collection flag to the existing legal
ride candidates. Destination policy and strength tuning are unchanged.
All four AI profiles attach the optional collection flag and exact quoted pile key
to the existing legal ride candidates. Destination policy and strength tuning are
unchanged.
## Verification and remaining work
Focused engine, controls and SQLite checks cover Basic/Advanced force custody,
source exclusion, decline, omitted legacy fields, empty and ambiguous piles,
illegal requests without mutation, native trainer ownership/visibility, public
mode guards, private views, duplicate concurrent requests and restart during a
Bene Gesserit reaction. Separate queued rides and a real special-Karama worm
through Nexus exercise the production continuation. The fixture preserves the
Fremen three-elite total rather than assuming the Emperor five-elite total.
Independent source and implementation review found no material defect in this
bounded contract. Final check/build/HTTP results, targeted browser continuation,
sample games, saved-game preservation and Git delivery belong to the private
source-bound checkpoint and commit message.
The focused suites include Basic/Advanced force custody, source exclusion, decline,
omitted legacy fields, empty destinations, explicit allocation between two positive
piles, ambiguous or invalid requests without mutation, native trainer
ownership/visibility, public mode guards, private views and JSON restoration during
a Bene Gesserit reaction. The selected pile loses only one spice, other piles remain
unchanged, and a pending arrival cannot collect a second time. Separate queued rides
and a real special-Karama worm through Nexus exercise the production continuation.
The fixture preserves the Fremen three-elite total rather than assuming the Emperor
five-elite total. Controls retain eligible-owner and blocked-state coverage rather
than pinning selector wording, HTML order or callback echoes.
Other expansion factions/modules, the Ecaz card variant and multiple positive
piles remain guarded. Other special relocation, full Leader Skills integration,
Integrated native smoke in both modes collects exactly one from selected
Pasty Mesa6 (3→2), leaves Mesa5 at2 and lands four forces in Mesa5 without
changing normal movement. An isolated 390px production control selects
Mesa6 and observes the same live-engine result, personal spice5→6.
All four existing policies retain legal continuation; collecting declarations
carry explicit pile keys without changing destination strategy.
Other expansion factions/modules and the Ecaz card variant remain guarded.
Other special relocation, full Leader Skills integration,
complete human games and final presentation remain unfinished. Strategy refinement
waits for the [AI feature-completion gate](AI_DEVELOPMENT_PLAN.md).