+ CHOAM Nexus · Secret Ally
+ During Spice Collection, discard one Worthless card to receive two spice from the bank. This also spends your CHOAM Nexus card.
+ {offer.cards.length > 1 && (
+
+ )}
+ {card && {card.name}
}
+ {offer.blocked && {offer.blocked}
}
+
+ Optional: keep both cards by continuing the phase. This Nexus card’s battle inspection alternative is still in development.
+
+ );
+}
diff --git a/docs/CURRENT_STATUS.md b/docs/CURRENT_STATUS.md
index 5e49a82c..55a50c82 100644
--- a/docs/CURRENT_STATUS.md
+++ b/docs/CURRENT_STATUS.md
@@ -4,6 +4,8 @@ Updated 13 September 2026. This is the short navigation dashboard; detailed evid
## Evidence and source of truth
+- Ix prototype checkpoint `5a76ae0`: types, lint, **4,211 offline tests**, build and **40 HTTP tests** passed. Genuine Basic/Advanced setup and two seeded complete simulations were exercised; a short browser game finished with private hand restoration. All 64 opening saved rooms were preserved; 31 QA rooms were added. This is bounded prototype evidence, not complete Ix compliance.
+
- [Rules implementation checklist](../game/reference.ts): `RULE_TOPICS`, topic `implementation-checklist`, and each feature's implementation, controls, AI, documentation and verification entries. Coverage is per stated boundary, not an implicit whole-game certificate.
- [Latest verified gameplay checkpoint](IMPLEMENTATION_STATUS.md): Truthtrance hand inventory, 13 September 2026 (`7454456`): types, lint, **4,200 offline tests**, production build and **40 HTTP tests** passed, with a phone/browser refresh journey and preserved saved games. These are recorded results, not checks rerun for this dashboard.
- Latest verification checkpoint `4a0b1ee`: genuine Advanced full-plan interaction tests; types, lint and **4,205 offline tests** passed. Private inspection restored after restart, with desktop/phone checks and all 64 saved games unchanged. No runtime change; prior build/HTTP evidence applies.
@@ -48,8 +50,11 @@ Likewise, the [Truthtrance readiness audit](TRUTHTRANCE_NONBATTLE_READINESS_2026
The first connected batch is the [Ixians & Tleilaxu prototype](IX_PROTOTYPE.md):
genuine setup, both expansion factions, full Ix deck and Sandtrout, shared human/AI
controls and saved continuation. The checklist now distinguishes its Prototyped
-development stage from Partial rules coverage. Discoveries remain missing; their
-seven spice cards and eight token faces need a verified inventory and adapters.
+development stage from Partial rules coverage. The next connected action is the [CHOAM Nexus Collection trade](NEXUS_CHOAM_SECRET_ALLY.md),
+with private controls, all four AI profiles and a saved payment/discard continuation.
+Its after-victory inspection remains missing. [Discovery components](DISCOVERY_COMPONENTS.md)
+now records all seven spice cards, eight tokens and exact card placements;
+Discovery runtime and controls remain missing.
The user changed the development order on 13 September: get working prototypes
of all remaining functions into the game, then use integration and play to find
diff --git a/docs/DISCOVERY_COMPONENTS.md b/docs/DISCOVERY_COMPONENTS.md
new file mode 100644
index 00000000..4f509a68
--- /dev/null
+++ b/docs/DISCOVERY_COMPONENTS.md
@@ -0,0 +1,89 @@
+# Discovery components
+
+This is a source-bound acquisition record for the *Ecaz & Moritani* Discovery
+variant. It records identities and values needed by an implementation; it does
+not reproduce card prose or artwork.
+
+## Sources and method
+
+- **EM rules:** Gale Force Nine's publisher-authored *Ecaz & Moritani*
+ rulebook, [retailer-hosted PDF mirror](https://gamers-hq.de/media/pdf/0f/7a/86/Dune_EcazMoritani_Rulebook_EN.pdf).
+ Page 4 establishes seven Spice Cards and eight Discovery tokens. Pages 12–13
+ establish the common card procedure, Great Maker behavior, the two token
+ types, all eight token names and their effects. The
+ [publisher URL](https://www.gf9games.com/dune/wp-content/uploads/EcazMoritani-Rulebook-LOWRES.pdf)
+ returned HTTP 403 during this acquisition pass.
+- **Printed card faces:** the clear English
+ [BoardGameGeek component scan](https://boardgamegeek.com/image/9022457/dune-ecaz-and-moritani)
+ ([image metadata](https://api.geekdo.com/api/images/9022457),
+ [original-resolution image](https://cf.geekdo-images.com/I9pgb8CJWnRp32GzKwyrug__original/img/tqGpry-Bh3D7ZYSZ3W60CaE6PCo=/0x0/filters:format(png)/pic9022457.png))
+ shows all six printed Discovery territory cards with © 2022 Legendary
+ markings. This is a scan of publisher components hosted by a community user,
+ not a fan rules implementation.
+- **Sector indexing:** territory names and token types are printed as text on
+ the card faces. Numeric sectors below are visual transcriptions of each
+ highlighted card wedge, checked against the GF9 board image on the original
+ designers' [Dune core page](https://futurepastimes.com/dune-board-game)
+ ([board image](https://images.squarespace-cdn.com/content/v1/5627edd5e4b0e42d8c948a6a/1658421042495-X385VWK17DPR8B5SX6E8/Dune%2BCore%2BGallery_0004_Background.jpg)).
+ Numbering starts with the printed Storm Start wedge in Meridian as sector 1
+ and continues counterclockwise. No repository or fan implementation supplied
+ these identities.
+
+## Seven Discovery Spice Cards
+
+Every territory card places six spice in its spice destination. The special
+blow removes any spice and forces already there, then places a random
+face-down token of the printed type at the separate token destination.
+
+| Printed card | Spice destination | Discovery token destination | Token type |
+| --- | --- | --- | --- |
+| Hagga Basin | Hagga Basin, sector 12 | Gara Kulon, sector 8 | Hiereg |
+| Rock Outcroppings | Rock Outcroppings, sector 13 | Meridian, sector 1 | Hiereg |
+| Sihaya Ridge | Sihaya Ridge, sector 9 | Cielago East, sector 3 | Hiereg |
+| Wind Pass North | Wind Pass North, sector 17 | Plastic Basin, sector 13 | Smuggler |
+| Funeral Plain | Funeral Plain, sector 15 | Pasty Mesa, sector 7 | Smuggler |
+| Old Gap | Old Gap, sector 10 | False Wall West, sector 17 | Smuggler |
+| Great Maker | No territory or sector | No Discovery token | Special sandworm |
+
+Great Maker resolves the usual sandworm removal in the last spice territory,
+then players vote in storm order on whether a Nexus occurs; a strict majority
+is required. Afterward, Fremen may ride using any number of reserve forces,
+subject to normal storm and occupancy restrictions. A Karama that kills Fremen
+forces in the affected territory does not cancel that reserve ride.
+
+## Eight Discovery tokens
+
+The first five entries are persistent location tokens. A revealed location is
+a territory nested inside its surrounding territory, admits at most two
+factions, can be shipped into at stronghold cost, and protects occupants from
+storm and sandworm effects. The last three resolve or become a carried benefit
+and are removed as stated.
+
+| Printed token | Type | Verified functional identity |
+| --- | --- | --- |
+| Jacurutu Sietch | Hiereg location | Counts as a normal stronghold; its battle winner receives one spice per opposing undialed force sent to the Tanks. |
+| Cistern | Hiereg location | An occupant gains two spice during Spice Collection. |
+| Ecological Testing Station | Hiereg location | An occupant may alter storm movement by one in either direction during the Storm phase; Weather Control is unaffected. |
+| Shrine | Hiereg location | An occupant may use Truthtrance as Karama or Karama as Truthtrance. |
+| Orgiz Processing Station | Smuggler location | During Spice Collection, an occupant takes one spice from every spice blow that is collected. |
+| Treachery Card Stash | Smuggler one-shot | Gain one Treachery Card; at the hand limit, gain first and then discard any card. Remove the token. |
+| Spice Stash | Smuggler one-shot | Gain seven spice from the bank, then remove the token. |
+| Ornithopter | Smuggler carried/one-shot | Take the token; on a later turn it gives movement three for one movement action, then is removed. |
+
+Face-down Hiereg tokens may be inspected privately by Fremen at any time;
+face-down Smuggler tokens have the equivalent Spacing Guild privilege. Other
+factions with non-advisor forces at the token may inspect it during Spice
+Collection and choose whether to reveal it.
+
+## Explicit limits
+
+- All 15 requested identities (seven cards and eight tokens), the six card
+ placements, and the Hiereg/Smuggler classifications are resolved.
+- The territory names are directly legible text. The sector numbers are a
+ visual reading of the printed highlighted wedges because the card sentence
+ names the destination territory but does not print its sector number.
+- No second independent physical scan of the Great Maker face or the eight
+ token faces was found in this bounded pass. Their identities and behavior are
+ verified from the publisher-authored rulebook only.
+- Card backs, token backs beyond the two type backs pictured in the rulebook,
+ dimensions, exact color, and artwork are not acquired or certified here.
diff --git a/docs/EFFICIENCY_PILOT.md b/docs/EFFICIENCY_PILOT.md
index ec5eca5e..e76c1168 100644
--- a/docs/EFFICIENCY_PILOT.md
+++ b/docs/EFFICIENCY_PILOT.md
@@ -82,3 +82,12 @@ leave the removed recurring automation absent. After `32791ed`, usage was 3% use
Use [current status](CURRENT_STATUS.md), [rule decisions](RULE_DECISIONS.md) and
[verification workflow](VERIFICATION_WORKFLOW.md) as short entry points. Historical
logs remain references, not mandatory full-context input on every turn.
+
+The next rapid prototype batch begins at aggregate counter 59,982,405 and adds
+one missing action: CHOAM Nexus Secret Ally Collection trade. A workhorse helper
+acquires the complete Discovery inventory for the following batch; a reused
+independent reviewer checks this trade and its queued-Collection lock. The owner
+connects runtime, private controls, AI and SQLite recovery. The battle inspection
+alternative stays explicitly missing instead of holding the independent trade
+for an exhaustive battle-cleanup design. Final checks, counter endpoint and
+checkpoint scope are recorded in the commit.
diff --git a/docs/IMPLEMENTATION_STATUS.md b/docs/IMPLEMENTATION_STATUS.md
index 05a6f459..85dbc69c 100644
--- a/docs/IMPLEMENTATION_STATUS.md
+++ b/docs/IMPLEMENTATION_STATUS.md
@@ -1,5 +1,22 @@
# Dune implementation status
+## 13 September 2026 — CHOAM Nexus Collection prototype and Discovery inventory
+
+Adds the missing absent-CHOAM Secret Ally Collection trade through the engine,
+private physical-card selector/inspector, all four AI profiles and JSON discard
+continuation. Both cards are spent for exactly two bank spice; stale actions,
+competing SQL writes and saved replay cannot duplicate the payment. The separate
+battle inspection remains missing. See [contract and scope](NEXUS_CHOAM_SECRET_ALLY.md).
+Independent review found a queued Grumman Collection lock mismatch; the server
+and private offer now share that automatic-continuation block.
+
+A bounded acquisition helper resolved [all Discovery component identities and
+card placements](DISCOVERY_COMPONENTS.md). No Discovery runtime is claimed.
+Focused trade tests pass; checkpoint-wide check/build/HTTP results are recorded
+in the verified commit and private source-bound report. Existing mode and
+publication gates remain closed. No server restart or saved-game reset is needed.
+
+
## 13 September 2026 — Genuine Ix expansion prototype
Connected Basic/Advanced Ix setup with both expansion factions, the complete
diff --git a/docs/NEXUS_CHOAM_SECRET_ALLY.md b/docs/NEXUS_CHOAM_SECRET_ALLY.md
new file mode 100644
index 00000000..840d7f61
--- /dev/null
+++ b/docs/NEXUS_CHOAM_SECRET_ALLY.md
@@ -0,0 +1,55 @@
+# CHOAM Nexus Secret Ally prototype
+
+13 September 2026. The Spice Collection trade is **Prototyped** in the development
+Nexus module. Its battle inspection alternative is still missing. This checkpoint
+does not enable normal Nexus starts, certify the full card family, or open a
+publication gate.
+
+## Source and behavior
+
+The printed CHOAM card's Secret Ally panel allows a Worthless card to be discarded
+during Spice Collection for two spice, or a random unused opposing hand card to
+be inspected after a victory. The [common source contract](NEXUS_CARD_RULES.md)
+records the [photographed publisher component](https://boardgamegeek.com/image/7767032/dune-ecaz-and-moritani)
+and publisher lifecycle rules. [Native Cunning](NEXUS_CHOAM_RULES.md) has different
+costs and effects and is not reused as a substitute for this panel.
+
+Only an unallied holder with CHOAM absent may use this trade, in Basic or Advanced.
+The server quotes the holder's actual Worthless cards. The player selects one;
+its printed identity and physical discard custody remain intact. Both that card
+and the CHOAM Nexus card are spent, and two spice are paid from the bank exactly
+once. No native faction identity, market sale, Cunning conversion, or Auditor
+payment is introduced. No blanket Nexus Karama immunity is inferred: this trade
+uses the absent-faction panel rather than a native CHOAM advantage.
+
+Collection readiness remains optional; continuing without trading keeps the
+cards. The action cannot interrupt a decision, Truthtrance, committed discard,
+exchange, or queued automatic Collection choice. It may still be used while its
+owner is ready if Collection has not ended. Exhaustive simultaneous Collection
+combinations remain part of the later integration pass.
+
+## Connected paths
+
+- `game/nexus-choam-trade.ts` provides the private quote and saved receipt checks.
+ `game/engine.ts` applies payment, Nexus/card custody and the semantic fresh
+ discard continuation. The completed history remains private server evidence.
+- `game/nexus-choam-trade-options.ts` supplies the shared human/AI action.
+ `components/nexus-choam-trade.tsx` provides a card picker, inspector, costs and
+ availability reasons at the table. All four AI profiles use eligible trades.
+- The existing JSON room state stores the receipt. No database migration or
+ server restart is required. Recovery validates the already-paid outcome and
+ retires the discard; it never credits spice a second time.
+
+## Focused evidence and remaining scope
+
+Run `npm test -- nexus-choam-trade`. Focused cases cover Basic/Advanced payment,
+physical custody, all four AI profiles, private rendered controls, wrong-mode and
+stale action rejection, Truthtrance locking, damaged saved receipts and JSON
+continuation. Production SQLite tests exercise competing trades, seat restoration,
+replay rejection and an already-paid discard resume.
+
+The after-victory inspection still needs an original battle receipt, exclusion of
+the opponent's used cards, a private one-card sample and composition with winner
+cleanup. Complete Nexus games, broader Homeworld interactions, strategic choice
+between the two Secret Ally uses and visual acceptance of that full family remain
+unfinished. Prototype evidence is deliberately narrower than complete compliance.
diff --git a/docs/RULE_DECISIONS.md b/docs/RULE_DECISIONS.md
index 6d88589c..3a630376 100644
--- a/docs/RULE_DECISIONS.md
+++ b/docs/RULE_DECISIONS.md
@@ -14,6 +14,7 @@ Updated 13 September 2026. This is the authoritative navigation index for existi
| Nexus lifecycle | Twelve physical cards, phase draw/replacement and alliance forfeiture; native Cunning, absent-faction Secret Ally and Betrayal have separate effects. No blanket Karama immunity. | [Common source contract](NEXUS_CARD_RULES.md), [lifecycle runtime](NEXUS_CARD_RUNTIME.md) |
| Nexus faction effects | Preserve physical custody, original faction identity and durable effect receipts; use each printed family instead of borrowing another faction's rules by analogy. | [Atreides](NEXUS_ATREIDES_RULES.md), [Harkonnen](NEXUS_HARKONNEN_RULES.md), [BG](NEXUS_BENE_GESSERIT_RULES.md), [Emperor](NEXUS_EMPEROR_RULES.md), [Fremen](NEXUS_FREMEN_RULES.md), [Guild](NEXUS_GUILD_RULES.md) |
| Expansion Nexus families | Source audit coverage does not imply every panel is playable; consult later runtime records in the status log. | [Ixian Cunning](NEXUS_IXIAN_CUNNING_RULES.md), [Ixian replacement](NEXUS_IXIAN_REPLACEMENT_RULES.md), [Tleilaxu](NEXUS_TLEILAXU_RULES.md), [CHOAM](NEXUS_CHOAM_RULES.md), [Richese](NEXUS_RICHESE_RULES.md), [Ecaz](NEXUS_ECAZ_RULES.md), [Moritani](NEXUS_MORITANI_RULES.md) |
+| CHOAM Secret Ally | Absent-faction Collection trade spends one actual Worthless card and the Nexus for two bank spice. It is separate from native Cunning and Auditor; the battle inspection alternative remains missing. | [Prototype contract](NEXUS_CHOAM_SECRET_ALLY.md) |
| Guild Secret Ally | One explicit Guild-priced ordinary shipment; borrowed prices/routes preserve native identity. Free Fremen reinforcement remains a separate choice. | [Route contract](NEXUS_GUILD_SECRET_ALLY_RULES.md), [verified runtime](NEXUS_GUILD_SECRET_ALLY_RUNTIME.md) |
| Homeworld custody and mobility | Physical home/visitor groups, population thresholds, tariffs and transport permissions retain distinct sources; Homeworld immunity is not universal immunity. | [Homeworld rules](HOMEWORLD_RULES.md), [benefits](HOMEWORLD_BENEFITS_RULES.md), [mobility](HOMEWORLD_MOBILITY_RULES.md), [invasion](HOMEWORLD_INVASION_RULES.md), [Guild transport](GUILD_HOMEWORLD_TRANSPORT_RULES.md) |
| Homeworld effects | Keep original payment/revival/placement identities and qualification observations; observations alone do not choose an occupied-benefit owner. | [Payments](HOMEWORLD_PAYMENT_INCOME_RULES.md), [card economy](HOMEWORLD_CARD_ECONOMY_RULES.md), [Collection](HOMEWORLD_COLLECTION_RULES.md), [revival deployment](HOMEWORLD_REVIVAL_DEPLOYMENT_RULES.md), [victory reinforcement](HOMEWORLD_VICTORY_REINFORCEMENT_RULES.md), [replacement](HOMEWORLD_REPLACEMENT_RULES.md), [Tupile](HOMEWORLD_TUPILE_INTELLIGENCE_RULES.md) |
diff --git a/game/bots.ts b/game/bots.ts
index 33203eff..b500cb6b 100644
--- a/game/bots.ts
+++ b/game/bots.ts
@@ -1,3 +1,4 @@
+import { nexusChoamTradeBotActions } from './nexus-choam-trade-options';
import { nexusGuildCunningAction, nexusGuildCunningActive, nexusGuildHajrAction, nexusGuildMovementAvailable, nexusGuildShipmentAvailable, nexusGuildSkipShipmentAction } from './nexus-guild-cunning-options';
import { nexusMoritaniBotActions } from './nexus-moritani-options';
import { choamPowerAction, choamPowerBotPlay } from './choam-power-options';
@@ -3368,6 +3369,8 @@ export function botActions(g: GameView): Action[] {
: nexusTraitorBotActions(g);
if (g.automaticContinuationPending) return [];
if (g.nexusCards?.waiting.length) return nexusCardBotActions(g);
+ const trade = nexusChoamTradeBotActions(g);
+ if (trade.length) return trade;
const sardaukar = nexusSardaukarBotActions(g);
if (sardaukar.length) return sardaukar;
const advisorConversion = nexusAdvisorBotActions(g);
diff --git a/game/engine.ts b/game/engine.ts
index 4021a0f9..68ca1842 100644
--- a/game/engine.ts
+++ b/game/engine.ts
@@ -1,3 +1,4 @@
+import { quoteNexusChoamTrade, validateNexusChoamTrade, nexusChoamTradeSignature, type NexusChoamTrade } from './nexus-choam-trade';
import { createNexusGuildSecretAlly, validateNexusGuildSecretAlly, quoteNexusGuildSecretShipment, type NexusGuildSecretAllyReceipt } from './nexus-guild-secret-ally';
import { shipmentAvailable } from './shipment-opportunity';
import { createNexusGuildCunning, validateNexusGuildCunning, nexusGuildCunningMoves, type NexusGuildCunningReceipt } from './nexus-guild-cunning';
@@ -883,6 +884,8 @@ type RicheseAllyOffer = {
payer: string;
};
export type Game = {
+ nexusChoamTrades?: NexusChoamTrade[];
+ nexusChoamTradeLast?: { event: string; stage: NexusChoamTrade['stage'] };
treacheryDiscardSequence?: number;
resolvedTreacheryDiscardSequence?: number;
/** Committed discard receipts are evidence, not additional card custody. */
@@ -891,6 +894,7 @@ export type Game = {
batch: FreshDiscardBatch;
continuation:
| { kind: 'ambassador'; entry: NonNullable