Implement Nexus card ownership, private draws and full card reference

This commit is contained in:
Quintine committed 2026-09-10 09:29:54 +10:00
1 parent 61689514a0
commit d2a1d63517
20 files changed
+2477 -5

No files matched your search

+2
View File
@@ -1,5 +1,7 @@
# Component inventory and verification ledger
**Nexus update, 10 September 2026:** all twelve physical Nexus identities and all thirty-six effect panels are verified against the original printed components. The separate inventory preserves one card per faction, independent of the selected roster; held cards remain private. The internal rules gallery and owner panel provide complete original-language effect text, existing bundled faction artwork and enlarged inspection. Common draws, replacement, preselected own-faction redraw, alliance forfeiture and saved phase progress are integrated. Individual effects and complete module games remain unfinished and gated. See [NEXUS_CARD_RULES.md](NEXUS_CARD_RULES.md) and [NEXUS_CARD_RUNTIME.md](NEXUS_CARD_RUNTIME.md) for current verification and limits.
**Homeworld update, 9 September 2026:** all 13 cards and 26 physical faces are verified, including native population/battle values and occupied income symbols. The internal gallery supplies both faces, complete original gameplay prose, enlarged inspection and thirteen original bundled illustrations. Separate typed custody and population helpers are tested; actual Homeworld gameplay, occupation and effect integration remain unfinished and gated. See [HOMEWORLD_IMPLEMENTATION.md](HOMEWORLD_IMPLEMENTATION.md) and [HOMEWORLD_COMPONENT_AUDIT.md](HOMEWORLD_COMPONENT_AUDIT.md). Earlier missing-Homeworld statements below are historical.
**Auditor update, 7 September 2026:** the separate strength-2 Advanced CHOAM disc and matching traitor are now represented, with one original portrait alongside Duke Prad Vidal in the special registry. Ordinary leader inventory remains 60. Root inspected Auditor at normal and enlarged sizes on desktop and phone; its inspector supplies complete original gameplay prose. Private audited-card faces, payment controls, setup identity, capture/foreign-ghola exclusions and first native revival have focused tests. Repeat/sixth-disc revival cycles and full module combinations remain unresolved. See [CHOAM_AUDITOR.md](CHOAM_AUDITOR.md); earlier missing-Auditor artwork/runtime statements below are historical.
+2
View File
@@ -1,5 +1,7 @@
# Dune implementation status
**Nexus ownership and complete component reference checkpoint, 10 September 2026:** [NEXUS_CARD_RUNTIME.md](NEXUS_CARD_RUNTIME.md) records the twelve-card physical deck, whole-phase Basic/Advanced draw opportunity, private replacement policy, all three alliance-forfeiture paths and complete inspectable 36-panel reference. Review fixed real Storm-entry initialization, edited progress/replay acceptance, one-way alliances and the private redraw prompt's public timing leak. Pre-draw preferences resolve without extra confirmations. **Types, lint, all 3,795 offline tests, production build and 40 HTTP/session tests pass.** Three-seat keyboard draw/redraw/refresh and all twelve normal/enlarged desktop/phone cards passed; independent review inspected 48 renders. All **3,173** preexisting room versions/hashes remain unchanged. All individual Nexus effects, Discoveries and complete expansion games remain unfinished; no release gate opened. Existing server reused, no restart due, no automation recreated.
**Tupile private intelligence and occupation evidence checkpoint, 10 September 2026:** [HOMEWORLD_TUPILE_INTELLIGENCE_RUNTIME.md](HOMEWORLD_TUPILE_INTELLIGENCE_RUNTIME.md) records current low-population contact checks, one historical spice/category answer per opposing faction, private controls and shared legal bot requests. Genuine setup binds qualification history and lifetime usage; legacy history stays unknown. Ordered battle observations retain brief sole occupation while simultaneous destruction does not invent it. Deterministic source identities make direct actions and restored continuations agree. **3,755 offline tests, types, lint, production build and 40 HTTP/session tests pass.** Three-seat desktop/mobile keyboard shipment, private disclosure, later balance change and refresh passed. The hourly restart and final comparison preserved all 3,112 preexisting room versions/hashes. Occupation entitlement/expiry/income, complete module games and the full expansion goal remain unfinished; no release gate opened. The removed automation stays removed.
**Grumman Collection and stacked Terror checkpoint, 10 September 2026:** [GRUMMAN_STACKED_TERROR_RUNTIME.md](GRUMMAN_STACKED_TERROR_RUNTIME.md) records one hidden-token addition with four bank spice, separate Mentat placement, private stacked-token selection, shared controls/AI and durable discard/alliance continuations. Review fixed selected-choice rewinds and restoration of a consumed Sabotage token during its genuine discard child. **3,712 offline cases, types, lint, production build and 40 HTTP/session cases pass.** Desktop/phone keyboard Collection, shipment, token selection, Robbery payment, public stack count and three-seat private refresh passed. All 3,081 preexisting room versions/hashes remained unchanged. Removal custody, occupation, unfinished effects and complete expansion games remain unresolved; no release gate opened. The existing server was reused and the removed automation stays removed.
+77
View File
@@ -0,0 +1,77 @@
# Nexus cards: primary-source contract
Source audit, 10 September 2026. This document establishes the printed component inventory and implementation contract; it does not claim runtime support or lift expansion release gates. The ordinary worm-triggered alliance Nexus already in the engine is distinct from this optional card module.
## Authority and acquisition
- [GF9 Ecaz & Moritani rulebook](https://www.gf9games.com/dune/wp-content/uploads/EcazMoritani-Rulebook-LOWRES.pdf), printed pp.4, 9, 11 and 16: component count, independent variants, common lifecycle, Atreides example and two Nexus FAQ answers. Official-domain indexed text was inspected, but direct retrieval returned 403 during this audit. The coordinator successfully fetched the [publisher-authored PDF mirror](https://gamers-hq.de/media/pdf/0f/7a/86/Dune_EcazMoritani_Rulebook_EN.pdf) to `/tmp/dune-e3-nexus-rules.pdf` and `.txt`. This is a mirror of the publisher's rules, not a separate rules authority.
- [Photograph of all twelve printed Nexus cards](https://boardgamegeek.com/image/7767032/dune-ecaz-and-moritani), uploaded by Jaakko / zaksalo on 2 October 2023. The original 3024×4032 photograph was downloaded and visually inspected, including all three panels on every card. The authority is the photographed publisher-authored component text, not the uploader's commentary. [Original image](https://cf.geekdo-images.com/zYJXVuckZugNx0kwjdcUAQ__original/img/pRh3dPJSueYj0aLYTbYidMxVXaQ=/0x0/filters:format(jpeg)/pic7767032.jpg); temporary inspection copy `/tmp/dune-nexus-cards.jpg`.
- Atreides' physical face independently matches the example on printed p.11. All twelve faces carry the 2022 Legendary notice and the E3 expansion mark. This is the original E3 module, not a later edition or fan revision.
Search also encountered tournament compilations that change the draw procedure and add effects. They were not used as authority. The former `dunecards.com` reference currently resolves to an unrelated collectibles storefront and is not a usable component source.
## Publisher's common rules
The module contains twelve cards and can accompany any faction selection, independently of the other variants. At the end of Spice Blow and Nexus, if a Nexus happened and an alliance exists, unallied players may draw, or replace their held card. Draws follow alliance negotiations. Cards stay secret until use and are discarded afterward; joining an alliance also requires discarding the held card. Exhaustion recycles shuffled discards. Drawing one's own faction allows an immediate optional replacement in Basic and Advanced.
Each card has mutually exclusive modes: **Cunning** for its native player, **Betrayal** when another player controls that faction, and **Secret Ally** when the faction is absent. The printed FAQ requires Bene Gesserit Secret Ally before Prescience; cards retained by Tleilaxu through Harkonnen Secret Ally are Face Dancers. [GF9, pp.4, 9, 11, 16](https://www.gf9games.com/dune/wp-content/uploads/EcazMoritani-Rulebook-LOWRES.pdf#page=11)
## Executable lifecycle composition
These are implementation consequences of the common rule, rather than additional quotations:
1. Keep a separate twelve-identity deck, discard and at-most-one held card per player. This is not a Treachery Card: no Treachery hand-limit slot, auction, ordinary discard hook, CHOAM sale, or Ecaz poison receipt follows from holding or discarding one.
2. Initialize only when this variant is selected. Include cards for absent factions; removing them would eliminate Secret Ally. No initial deal is prescribed. Use the twelve photographed factions exactly: Atreides, Bene Gesserit, Emperor, Fremen, Harkonnen, Spacing Guild, Ixians, Tleilaxu, CHOAM, Richese, Ecaz, Moritani.
3. Preserve a phase-level `nexusOccurred` fact separately from the transient negotiation flag. The explicit draw trigger is the end of the whole phase. Advanced blow A alone must not issue a draw, and blow B must not erase an earlier qualifying Nexus. Evaluate the final alliances when opening the opportunity.
4. A player with no card can draw or decline; one with a card can keep it or discard-and-replace. These are one opportunity, not repeated replacements. The printed own-faction redraw permission is implemented by a private preference selected **before** the draw: keep any card, redraw one's faction once, or redraw whenever one's faction appears. The server performs that policy atomically without a later confirmation. This automation prevents a public waiting state from identifying an own-faction draw. It is not an anytime exchange of a previously kept card, and it does not filter that faction out of the physical deck.
5. One event must survive the complete draw policy, reload and uncertain responses. Store the actual final card and physical intermediate discards before projecting the result. Randomness is not rerun when reading, normalizing, reconnecting or retrying the same committed action. Own-faction and other-faction draws complete the same public opportunity; no private redraw decision remains to reveal the drawn identity through public phase progress.
6. All actual alliance producers must discard both incoming partners' held cards as part of the accepted alliance transaction: ordinary Nexus, Ecaz Ambassador and Moritani's alliance offer. An offer, refusal or canceled formation does not discard. Leaving an alliance does not independently generate a draw.
7. Secret Ally selects the card's effect; it does not create a real allied player, change the stronghold victory target, unlock generic ally transfers or provide every ability of the absent faction.
8. Native roster identity determines the mode. A stolen leader, alliance benefit, Ghola or temporary battle controller does not change one's faction.
9. Public views may expose the module's inventory and readable reference for all twelve faces. Held identities, own-faction redraw eligibility and source deck order remain private. A public action list must not reveal which opponents hold a relevant Betrayal. Card play and its ensuing action need a saved original-effect commitment so a discarded card is not consumed twice.
The text does not specify a Nexus-dealing seat order. A deterministic storm-order serializer can be documented as implementation ordering under the game's general precedence convention, not attributed to a special Nexus instruction. It must not replace secret dealing with publicly revealed batches.
## All twelve printed effect contracts
Every row below is a semantic transcription of the photographed face, not a reproduction of its prose. Alternative effects within a panel consume the same single Nexus card. Timings below come from that panel; where a panel does not state an explicit phase, do not invent one from a similarly named faction ability.
| Card | Betrayal: opposing native faction seated | Cunning: native player | Secret Ally: faction absent |
| --- | --- | --- | --- |
| **Atreides** | Stop Atreides' attempt to inspect one battle-plan element. | Obtain a second element from the battle opponent. | In one's battle, choose one opposing plan element to inspect: leader, weapon, defense or dial. |
| **Bene Gesserit** | Stop Voice. | During one's Shipment and Movement action, convert any selected advisor groups to fighters; each territory must finish with a single stance. | Use Voice against one's battle opponent. The official FAQ places this before Prescience. |
| **Emperor** | During Bidding, require Emperor to cover the ally's purchase, at least the necessary spice; alternatively suppress Sardaukar while battle plans are being made. | Before making a battle plan, treat five own forces as Sardaukar when that battle contains none. | On a Treachery purchase, retain the spice after demonstrating the required funds; alternatively revive three extra forces free beyond the normal limit during Revival. |
| **Fremen** | Suppress worm riding for this turn, or suppress the two-territory movement advantage during Shipment and Movement. | A worm appearing in a territory without forces permits a group from one desert territory to ride elsewhere, respecting storm and occupancy. | Protect one's forces from a worm, or revive three forces free during Revival. |
| **Harkonnen** | Cancel a revealed Harkonnen traitor, shuffle that identity into the Traitor Deck, and give Harkonnen a replacement draw during Mentat Pause. | At any time, draw a Traitor Card into the hand, then choose one held Traitor Card to shuffle back. | During Mentat Pause draw two Traitor Cards, then choose two held cards to shuffle back. Tleilaxu's retained card is a Face Dancer under the official FAQ. |
| **Spacing Guild** | Take one entire shipment payment otherwise owed to Guild or bank, including one's own payment. The face expressly overrides income for occupying Junction. | Immediately after one's Shipment and Movement, make a second shipment. That group cannot move unless Hajr permits it. | Use Guild shipping prices; cross-shipping or returning to reserves is allowed as the shipping action. |
| **Ixians** | Prevent either the Bidding advantage or Technology advantage; one card cannot cancel both. | Before making one's battle plan, give every Suboid full unsupported strength in all battles for the remainder of this turn. | Discard a just-purchased Bidding Treachery Card and take the next Treachery deck card. |
| **Tleilaxu** | Cancel a revealed Face Dancer. It stays revealed until all Face Dancers have been revealed. | Set all revealed Face Dancers aside, secretly replace them, then shuffle the set-aside identities into the Traitor Deck. | During Revival, revive an own leader free and up to five forces at one spice each. |
| **CHOAM** | Make CHOAM discard a random held card without earning spice for that discard. | Spend any Treachery Card to obtain a selected Worthless special effect. | During Collection, trade a Worthless card for two spice; alternatively after winning a battle privately inspect a random opposing held card that was not used in that battle. |
| **Richese** | Stop a Richese self-purchase by discarding its intended Richese card without payment; alternatively divert payment for a Richese sale to the bank. | Combine two No-Fields in one shipment, still priced as one force; reveal one immediately and put it in front of the shield. | Replace normal shipping with a reserve shipment of up to five forces priced as one. |
| **Ecaz** | Before Shipment and Movement, where Ecaz and ally share a territory, make the ally return its forces from one such territory to reserves. | Take Duke Vidal for the current turn even from capture, Tanks or Ghola custody, overriding Moritani; set him aside at turn end. | Make one player disclose whether any of one's leaders are among their traitors, without identifying those leaders. |
| **Moritani** | Return a board Terror token to Moritani without revealing it. | When placing a Terror token, permit any Arrakis territory, including an existing Terror location. | After losing a battle with a winner, retain one played Treachery Card that could have been retained after winning. |
Source for the entire table: [the twelve original printed components](https://boardgamegeek.com/image/7767032/dune-ecaz-and-moritani). All card identities appear once; the photograph is arranged Moritani/Tleilaxu/Richese/Ixians, Atreides/Bene Gesserit/CHOAM/Emperor, Guild/Ecaz/Harkonnen/Fremen.
## Effect integration boundaries
**Atreides is the first complete effect family to implement.** It has independent rulebook and physical-face evidence, and the engine already has private plan-element inspection. The Nexus effect needs its own cause and receipt rather than temporarily changing the inspecting faction. The second element must differ from the already inspected element. Preserve the original disclosed value if an allowed later battle edit occurs; follow the existing plan commitment rules instead of refreshing an old observation. The card specifies an element, not the entire hand or battle plan. A weapon/defense request uses actual played-card classification, including the published Reinforcements/Harass exclusions, rather than leaking a card merely because it occupies that slot.
**Cancellation needs the original attempted effect.** Betrayal is not a blanket Karama flag. For Atreides, identify the inspection attempt being prevented; for Voice, the command; for a traitor/Face Dancer, the actual revealed identity; for economy, the original invoice and settlement. Do not refund or replay a completed payment merely because the next input happens to be a Nexus play. Effects with no printed phase still need a safe explicit action boundary and cannot bypass another player's committed private choice.
**Physical custody remains authoritative.** Replacement Traitor Cards, Face Dancers, discarded Treachery Cards, reserve groups and Duke Vidal are existing components. Draw first then return cards in the order stated; do not shuffle a just-set-aside Face Dancer early enough to redraw it as its own replacement. The Nexus card does not generate an additional Duke disc or additional physical Sardaukar. Virtual Sardaukar strength belongs to battle modifiers, not a change to elite counter custody. A canceled Harkonnen traitor owes a later replacement even after the original battle is finished.
**Delayed effects outlive card custody.** Turn-long Suboid strength, Fremen riding prevention, Harkonnen's Mentat replacement, Guild's extra shipment and Ecaz's temporary Duke claim need saved receipts. Discarding the Nexus card cannot erase those commitments, and drawing another cannot replay them. Moritani retention must join the existing winner/loser card-retention sequence without retaining mandatory-discard Tooth or Artillery merely because a weapon slot was used.
**Existing unresolved rules stay local.** Guild Betrayal's explicit Junction override is not a ruling for ordinary low-Junction contribution rounding. Moritani Betrayal's explicit return-to-supply instruction is not evidence that high-Grumman's differently worded removal returns a token. Free Nexus revival effects need source identity and original newly revived groups for Homeworld interactions; they are not ordinary free revival by default. Do not silently resolve the pending Southern Hemisphere threshold/splitting questions or Ix revival shortage question through a Nexus adapter.
## Remaining source questions and release boundaries
- The common trigger is the end of the full Spice Blow and Nexus phase. The later shorthand about the next Nexus is read with that opening condition; it does not establish an extra draw after each Advanced blow. Keep that implementation decision explicit in runtime documentation.
- No retrieved card or E3 FAQ gives a general rule that every Nexus effect is Karama-immune, or that playing one suspends all ordinary responses. Homeworld immunity on the preceding page is limited to Homeworld advantages/penalties. Audit cancellation of an underlying native advantage separately from cancellation of the Nexus card before enabling each family.
- Duration is explicit for several panels but not all. Ixian Betrayal's scope over multiple auction lots, the optional continuation after canceling native Prescience, and exact multi-party cancellation priority require the corresponding existing faction timing contract. Do not make an entire-phase cancellation merely from the word “advantage.”
- Emperor forced ally payment needs a precise invoice allocation when the ally has some funds and Emperor is short. Its own purchase-refund alternative also needs original payer contributions. Tleilaxu's combined leader/force revival requires an audit of partial selection and interaction with ordinary free rates; the card does not say that all five force revivals are free.
- Richese's two-No-Field effect needs its own physical counter and immediate-reveal transaction; the normal single-marker action cannot represent it by adding private values. Ecaz's Duke override needs explicit restoration/end-turn handling across capture, death and Ghola records. These are material implementation tasks, not reasons to invent substitute effects.
- A complete twelve-card reference/inventory and common lifecycle are substantial first work, but do not alone make all thirty-six panels playable. Keep the public module release gated until every face's supported timing, secrecy, custody, bots, UI, rejection, multiplayer CAS and saved continuation paths are verified. If development supports only Atreides' family first, other faces must remain accurately represented and explicitly unavailable in the audit mode; they must not silently act as blanks in a released module.
No user question was sent during this audit. No tournament rule, fan effect, public predeal reveal, extra Nexus identity or Discoveries prerequisite has been adopted.
+47
View File
@@ -0,0 +1,47 @@
# Nexus cards: common lifecycle checkpoint
Integration record, 10 September 2026. **Types, lint, all 3,795 offline tests, the production build and 40 HTTP/session tests pass.** This checkpoint implements the optional Nexus card inventory and common draw/keep/replace lifecycle, plus a complete inspectable reference. It does **not** implement the thirty-six card effects, enable a complete public Nexus module, or certify Ecaz & Moritani or all expansions. Source facts, photographed component faces, and unresolved effect interactions are in [NEXUS_CARD_RULES.md](NEXUS_CARD_RULES.md).
## Implemented scope
- [nexus-cards.ts](../game/nexus-cards.ts) owns the twelve physical identities, deck/discard/one-card hands, shuffle/recycling, alliance forfeiture, owner-only projection, and native/opposing/absent faction mode selection. The deck includes all twelve factions regardless of the seated roster.
- [nexus-card-phase.ts](../game/nexus-card-phase.ts) records a whole Spice Blow and Nexus phase, whether a real Nexus occurred, the final eligible unallied owners, and completed choices. Its consistency signature binds the original phase progress; it is not a cryptographic defense against wholesale fabrication of a saved game.
- The engine remembers Nexus occurrence across Advanced A/B blows and offers cards only when the entire phase ends with an alliance present. Earlier worm responses, alliance negotiations, rides and entry reactions finish before the closing card choices. The next phase waits for the eligible owners; a stale turn, card identity or already-finished opportunity cannot draw again. Genuine first-turn/no-Nexus/no-alliance cases remain distinct.
- Accepted alliance formation discards the incoming partners' held Nexus cards through the common physical custody helper. Failed offers and canceled alliance attempts do not forfeit a card. Existing card effects remain unavailable.
- [nexus-card-options.ts](../game/nexus-card-options.ts) provides the shared action shape and bot choices. All four bot profiles use the common ownership controls; future strategic selection of actual Nexus effects is separate work.
## Private pre-draw preference
An owner chooses **draw**, **discard and replace**, or **keep/skip**, as offered by the server. Before drawing, the optional selector specifies what to do if the drawn card matches the owner's faction:
| Preference | `ownRedraws` | Behavior |
| --- | --- | --- |
| Keep it | `0` | Retain the drawn card, including one's faction. |
| Redraw once | `1` | Replace an own-faction result once, then retain the next result. |
| Redraw whenever it appears | `2` | Continue replacing an own-faction result within the bounded twelve-card physical inventory until a different faction is drawn. |
The value `2` is a policy encoding, not an authorization to redraw arbitrary cards twice. A keep/skip action always sends `0`. Every action binds the current turn and the owner's original held identity, including `null` before a first draw. All policy draws and discards commit within one action. No owner-only confirmation is left pending afterward, so public readiness or phase advancement does not reveal that someone drew their own faction. The policy is available in Basic and Advanced.
Original intermediate draws remain physical transactions. Recycling can draw the same own-faction card again; the runtime preserves that possibility instead of silently excluding it. A lost HTTP response or reconnect must restore the committed final card without new randomness.
## Inspectable cards and privacy
[nexus-card-reference.ts](../game/nexus-card-reference.ts) contains faithful English summaries of every original panel, independently checked against all twelve physical faces. [nexus-cards.tsx](../components/nexus-cards.tsx) shows the owner's card with its applicable mode, all three readable panels, the existing faction-associated Homeworld artwork, and an accessible enlarged dialog. A collapsed gallery contains the full twelve-card reference, which is public rules information and does not identify opponents' held cards.
The panel also shows deck/discard/held counts and the names of players still choosing. It obtains those from the projected offer and public roster. No opponent hand, spice balance, traitor pool, hidden battle plan or deck sequence is consulted. Choice buttons disable during submission. The panel says that card effects are not playable and has no effect-play button. Historical art and source text do not imply live support for the corresponding advantages.
## Verification record
- **Focused UI/reference:** 9 control cases passed, covering all twelve identities and all thirty-six panels, material physical-card numbers and timing, exact action binding, all three private draw policies in both modes, stale and nonowner actions, mode selection, disabled/busy controls, public waiting information, and hidden-field getter traps.
- **Focused lint:** type-aware lint passed for the reference, component and controls test.
- **Pure inventory and phase:** 18 cases pass, including twelve-card conservation across two through six seats, absent-faction roles, malformed identities/RNG, reciprocal alliances, signed phase progress, own-card recycling and identity-independent public completion.
- **Engine:** 10 cases pass through genuine setup and Storm entry, Basic and Advanced A/B phases, first-turn skipped worms, no-alliance/no-worm phases, a summoned-before-blow Nexus, all three actual alliance producers, preselected redraw policies, stale/corrupt requests, private projections and all four bot profiles. The Storm-to-Spice path opens with `initialize=false`; review fixed tracker initialization at that real entry rather than assuming only normal phase initialization.
- **Production SQLite recovery:** three cases pass with real room/session code and disposable databases: competing keep-own/redraw-own requests produce one committed result; a lost response restores the same private card without reroll or extra writes; malformed inventory and changed/missing closing progress reject before projection or storage. An unrelated room remains unchanged.
- **Final integrated checks:** `npm run check` passes types, lint and **3,795/3,795 offline tests**, with no skips or cancellations (93.9 seconds for the tests). This adds 40 cases to the preceding checkpoint. `npm run build` and **40/40 HTTP/session checks** pass. Final logs are `/tmp/dune-nexus-final-check.log`, `/tmp/dune-nexus-final-build.log` and `/tmp/dune-nexus-final-http.log`.
- **Three-seat browser:** isolated room `43U78HGQ` reached its genuine closing opportunity at version 3. Harkonnen selected “Redraw whenever it appears” and used the keyboard to draw. The physical Harkonnen card went to discard and Ecaz became the one held card; version 4 advanced to Charity with ten deck cards, one discard and one held card. All three private sessions restored after refresh; only Harkonnen receives Ecaz's identity. Desktop and 390-pixel phone layouts had no overflow or page errors.
- **Complete component review:** the internal rules gallery opened all twelve normal and enlarged faces by keyboard. Each phone dialog scrolled to its final panel and restored focus on closing. Independent inspection of all **48 screenshots** (normal, enlarged desktop, and paired phone top/bottom for every card) found no readability, clipping, truncation or rules-text discrepancies. This verifies the 36 displayed panels, not their unimplemented effects. Artifacts: `/tmp/dune-nexus-gallery/results.json` and sibling PNGs.
- **Saved-game preservation:** the pre-work baseline contains **3,173** rooms; every original version and SHA-256 state hash is unchanged after browser and HTTP work. The database contains 3,234 rooms: that baseline, the isolated Nexus room and 60 rooms from two HTTP runs. Read-only three-seat restoration also passed for Tupile `ZMA84DY8` v7, Grumman `HU6YUC7Z` v10, Caladan `LV2TNQ88` v5 and revival `463GUCY3` v7. The existing development server was reused; no restart was due during this checkpoint, no database was reset, and the removed automation stays removed.
## Remaining release gates
Every effect family still needs its own original-action timing, cancellation, payment/discard/force or leader custody, hidden-information, bot, UI and recovery integration. Atreides' inspected elements are a distinct upcoming family; they are not enabled merely because the panel is displayed. Existing unresolved Homeworld, revival, No-Field and occupation interpretations remain isolated. Original-format saved games without this optional module are not retroactively dealt cards, and arbitrary saved JSON is not a substitute for a genuine setup/draw history.