Compose Emperor Nexus with native Richese special purchase

This commit is contained in:
Quintine committed 2026-10-15 11:11:06 +11:00
1 parent 3ce2e1d32a
commit e2dc5f3d0d
16 files changed
+952 -33

No files matched your search

+2
View File
@@ -2953,6 +2953,8 @@ function policyActions(g: GameView): Action[] {
mode: 'special',
card: richesePurchase.karamas[0].id,
acquire: choice.id,
...(richesePurchase.emperorNexus?.canUse && !richesePurchase.emperorNexus.blocked
? { emperorNexus: true, nexusEvent: richesePurchase.emperorNexus.event } : {}),
},
];
}
+39 -5
View File
@@ -45,7 +45,7 @@ import { quoteNexusChoamBetrayal, validateNexusChoamBetrayal, nexusChoamBetrayal
import { quoteEcazInquiry, ecazInquiryAnswer, ecazInquiryHistory, ecazInquirySignature, validateEcazInquiry, type EcazInquiryReceipt } from './nexus-ecaz-inquiry';
import { nexusCleanPlayBlocked } from './nexus-play-boundary';
import { EMPEROR_NEXUS_REVIVALS, emperorNexusModeSupported, quoteEmperorNexusRevival, createEmperorNexusRevival, settleEmperorNexusRevival, validateEmperorNexusRevival, type NexusEmperorRevival } from './nexus-emperor-secret-ally';
import { emperorNexusPurchaseEvent, quoteEmperorNexusPurchase, signEmperorNexusPurchase, validateEmperorNexusPurchase, emperorNexusSellerPurchaseModeSupported, quoteEmperorNexusSellerPurchase, createEmperorNexusSellerPurchase, emperorNexusAmbassadorPurchaseModeSupported, quoteEmperorNexusAmbassadorPurchase, createEmperorNexusAmbassadorPurchase, type EmperorNexusPurchase } from './nexus-emperor-purchase';
import { emperorNexusPurchaseEvent, quoteEmperorNexusPurchase, signEmperorNexusPurchase, validateEmperorNexusPurchase, emperorNexusSellerPurchaseModeSupported, quoteEmperorNexusSellerPurchase, createEmperorNexusSellerPurchase, emperorNexusAmbassadorPurchaseModeSupported, quoteEmperorNexusAmbassadorPurchase, createEmperorNexusAmbassadorPurchase, quoteEmperorNexusSpecialPurchase, createEmperorNexusSpecialPurchase, type EmperorNexusPurchase } from './nexus-emperor-purchase';
import { createEmperorPaymentReceipt, validateEmperorPaymentReceipt, emperorPaymentUseBlock, emperorPaymentSourceQuote, requiredEmperorPaymentResponders, emperorPaymentReceiptSignature, type EmperorPaymentReceipt } from './nexus-emperor-payment';
import { FREMEN_NEXUS_FREE_FORCES, fremenNexusRevivalOffer, createFremenNexusRevival, upgradeFremenNexusRevival, validateFremenNexusRevival, type FremenNexusRevival } from './nexus-fremen-revival';
import { captureFremenCunningOccurrence, quoteFremenCunning, quoteFremenCunningRide, validateFremenCunningSelection, type FremenCunningOccurrence, type FremenCunningRideAuthorization, type FremenCunningSelection } from './nexus-fremen-cunning';
@@ -2812,6 +2812,9 @@ function nexusEmperorSecretIntegrity(g:Game) {
else if (record.version === 3)
requireRule(emperorNexusAmbassadorPurchaseModeSupported(g),
'An Emperor Ambassador purchase lost its original supported native profile.');
else if (record.version === 4)
requireRule(g.advanced && emperorNexusSellerPurchaseModeSupported(g),
'An Emperor special purchase lost its original supported native profile.');
requireRule(record.sequence === index && purchaseEvents[index] === record.event,
'Emperor Nexus purchase has duplicated or reordered a completed use.');
}
@@ -28022,7 +28025,7 @@ export type SpecialKaramaIntent = {
phase: number;
} & (
| { kind: 'choam'; cards: string[] }
| { kind: 'richese'; acquire: string }
| { kind: 'richese'; acquire: string; nexusEvent?: string }
| { kind: 'ixians'; route: string[]; collect: boolean; sandmasterPiles?: string[] }
| { kind: 'tleilaxu'; target: string; revival: PendingRevival }
| { kind: 'fremen'; territory: string }
@@ -28047,6 +28050,8 @@ export function prepareSpecialKaramaIntent(
action: Action,
): SpecialKaramaIntent {
const p = getPlayer(g, playerId);
requireRule(action.emperorNexus === undefined || p.faction === 'richese',
'Emperor Nexus retention is only available on the original Richese special purchase.');
// Delayed execution must respect the same enclosing windows as dispatch.
// CHOAM's early cash-in bypasses the later gates, but never Truthtrance.
requireRule(!g.truthtrance, 'Resolve the current Truthtrance first.');
@@ -28134,6 +28139,18 @@ export function prepareSpecialKaramaIntent(
g.richeseAuction.cardId !== acquire,
'The card already offered for auction must remain in that auction.',
);
requireRule(action.emperorNexus === undefined || action.emperorNexus === true,
'Choose the joint Emperor Nexus purchase explicitly, without coercion.');
if (action.emperorNexus === true) {
const quote = nexusRule(() => quoteEmperorNexusSpecialPurchase(g, p.id));
requireRule(!quote.blocked, quote.blocked ?? 'This Emperor Nexus purchase is unavailable.');
requireRule(typeof action.nexusEvent === 'string' && action.nexusEvent === quote.event &&
Object.keys(action).sort().join(',') === 'acquire,card,emperorNexus,mode,nexusEvent,type',
'Use only the current original special-purchase event and exact joint costs.');
return { ...base, kind: 'richese', acquire, nexusEvent: quote.event };
}
requireRule(action.nexusEvent === undefined,
'A Nexus event requires the explicit joint Emperor Nexus purchase.');
return { ...base, kind: 'richese', acquire };
} else if (p.faction === 'choam') {
requireRule(
@@ -28343,7 +28360,8 @@ function specialKaramaAction(intent: SpecialKaramaIntent): Action {
case 'moritani':
return { ...action, event: intent.source.event, keep: [...intent.keep], discard: [...intent.discard] };
case 'richese':
return { ...action, acquire: intent.acquire };
return { ...action, acquire: intent.acquire,
...(intent.nexusEvent ? { emperorNexus: true, nexusEvent: intent.nexusEvent } : {}) };
case 'choam':
return { ...action, cards: [...intent.cards] };
case 'ixians':
@@ -28424,6 +28442,9 @@ export function executeSpecialKaramaIntent(
JSON.stringify(intent.keep) === JSON.stringify(prepared.keep) &&
JSON.stringify(intent.discard) === JSON.stringify(prepared.discard),
'The original Moritani card selection changed before execution.');
if (intent.kind === 'richese' && prepared.kind === 'richese')
requireRule(intent.nexusEvent === prepared.nexusEvent,
'The original Emperor Nexus special-purchase event changed before execution.');
const p = getPlayer(g, intent.owner);
const card = p.hand.find((candidate) => candidate.id === intent.card)!;
const converted = card.effect === 'truthtrance';
@@ -28458,13 +28479,23 @@ export function executeSpecialKaramaIntent(
} else resumeMoritaniSpecialKarama(g);
} else if (intent.kind === 'richese') {
const selected = g.richeseCache!.findIndex((c) => c.id === intent.acquire);
if (intent.nexusEvent) {
const receipt = nexusRule(() => createEmperorNexusSpecialPurchase(g, p.id, card.id, intent.acquire));
requireRule(receipt.event === intent.nexusEvent,
'The original joint special-purchase source changed before disposal.');
g.nexusCards!.cards = nexusRule(() => discardNexusCard(g.nexusCards!.cards!, p.id, g.players));
(g.nexusEmperorPurchaseHistory ??= []).push(receipt);
(g.nexusEmperorPurchaseEvents ??= []).push(receipt.event);
}
discard(g, p, card.id);
p.spice -= 3;
if (!intent.nexusEvent) p.spice -= 3;
p.hand.push(...g.richeseCache!.splice(selected, 1));
p.specialKaramaUsed = true;
log(
g,
`${p.name} spent Karama and 3 spice to buy one secretly chosen card from the Richese cache. This once-per-game special power cannot be canceled.`,
intent.nexusEvent
? `${p.name} spent Karama and Emperor Nexus after proving three own spice, retained it and acquired one privately chosen Richese cache card. No bank payment, reimbursement or extra bonus is created. Provisional purchase composition; the original once-use still applies.`
: `${p.name} spent Karama and 3 spice to buy one secretly chosen card from the Richese cache. This once-per-game special power cannot be canceled.`,
{ faction: 'richese', name: 'Special Karama purchase' },
);
const emperor = byFaction(g, 'emperor');
@@ -28707,11 +28738,14 @@ function richeseSpecialKaramaView(g: Game, p: Player) {
blocked ??= error.message;
}
}
const nexus = nexusRule(() => quoteEmperorNexusSpecialPurchase(g, p.id));
return {
cards,
karamas,
blocked: cards.length ? null : blocked,
payee: byFaction(g, 'emperor')?.id ?? null,
emperorNexus: { ...nexus, canUse: !nexus.blocked,
policy: 'Provisional purchase composition: spend the original Karama and Emperor Nexus together, after proving three own uncommitted spice. Keep that spice; no bank payment, reimbursement or fake auction is created. Native capacity, once-use, reserved cards and enclosing continuation remain unchanged.' },
};
}
+140 -1
View File
@@ -16,6 +16,7 @@ import {
import type { RicheseAuction } from './richese-auction';
import { quoteRicheseSettlement, type RicheseSettlementQuote } from './richese-settlement';
import { quoteRicheseBetrayalInvoice } from './nexus-richese-betrayal';
import { RICHESE_CARD_DEFINITIONS, richeseCardDefinition } from './richese-cards';
export type EmperorNexusBankPurchase = {
kind: 'purchase';
@@ -62,10 +63,29 @@ export type EmperorNexusAmbassadorPurchase = {
token: string;
entrant: string;
};
export type EmperorNexusSpecialPurchase = {
version: 4;
kind: 'purchase';
event: string;
owner: string;
turn: number;
phase: number;
sequence: number;
faction: 'richese';
advanced: true;
origin: 'specialKarama';
price: 3;
card: string;
activation: string;
beforeSpice: number;
afterSpice: number;
signature: string;
};
export type EmperorNexusPurchase =
| EmperorNexusBankPurchase
| EmperorNexusSellerPurchase
| EmperorNexusAmbassadorPurchase;
| EmperorNexusAmbassadorPurchase
| EmperorNexusSpecialPurchase;
export type EmperorNexusSellerPurchaseInput = {
round: string;
lot: RicheseAuction;
@@ -121,8 +141,25 @@ export function emperorNexusAmbassadorPurchaseEvent(
return JSON.stringify(['nexusEmperorAmbassadorPurchase', turn, phase, owner, sequence, entry]);
}
/** Native once-per-game source identity; neither privately selected card face
* belongs in the offer shown before the original special purchase commits. */
export function emperorNexusSpecialPurchaseEvent(
turn: number, phase: number, owner: string, sequence: number,
): string {
return JSON.stringify([
'nexusEmperorSpecialPurchase', turn, phase, owner, sequence, 'richeseSpecialKarama',
]);
}
/** Consistency signature, not cryptographic authentication; field order is fixed. */
export function signEmperorNexusPurchase(record: EmperorNexusPurchase): string {
if ('version' in record && record.version === 4)
return JSON.stringify([
'emperorNexusSpecialPurchase', record.version, record.kind, record.event,
record.owner, record.turn, record.phase, record.sequence, record.faction,
record.advanced, record.origin, record.price, record.card, record.activation,
record.beforeSpice, record.afterSpice,
]);
if ('version' in record && record.version === 3)
return JSON.stringify([
'emperorNexusAmbassadorPurchase', record.version, record.kind, record.event,
@@ -191,6 +228,34 @@ export function validateEmperorNexusPurchase(
context.players.length &&
new Set(context.players.map((player) => player.faction)).size ===
context.players.length;
if (plain(record) && 'version' in record && record.version === 4) {
if (
!validContext ||
Object.keys(record).sort().join(',') !==
'activation,advanced,afterSpice,beforeSpice,card,event,faction,kind,origin,owner,phase,price,sequence,signature,turn,version' ||
record.kind !== 'purchase' || record.origin !== 'specialKarama' ||
record.faction !== 'richese' || record.advanced !== true ||
record.advanced !== context.advanced ||
context.players.some(player => player.faction === 'emperor') ||
context.players.find(player => player.id === record.owner)?.faction !== 'richese' ||
!whole(record.turn) || record.turn < 1 || record.turn > context.turn ||
!whole(record.phase) || record.phase < 1 || record.phase > 8 ||
!whole(record.sequence) || !text(record.owner) ||
!text(record.activation) || record.activation === record.card ||
!RICHESE_CARD_DEFINITIONS.some(({ card }) => card.id === record.card) ||
record.price !== 3 ||
!whole(record.beforeSpice) || record.beforeSpice < record.price ||
!whole(record.afterSpice) || record.afterSpice !== record.beforeSpice ||
record.event !== emperorNexusSpecialPurchaseEvent(
record.turn, record.phase, record.owner, record.sequence,
) ||
record.signature !== signEmperorNexusPurchase(record)
)
throw new EmperorNexusPurchaseError(
'Emperor Nexus special purchase has lost its original Richese source, activation, price or retained spice.',
);
return;
}
if (plain(record) && 'version' in record && record.version === 3) {
if (
!validContext ||
@@ -540,3 +605,77 @@ export function createEmperorNexusAmbassadorPurchase(
validateEmperorNexusPurchase(g, receipt);
return receipt;
}
/** The original special-purchase validator owns timing, uncommitted spice,
* capacity, once-per-game use and card roles. This is only Nexus entitlement. */
export function quoteEmperorNexusSpecialPurchase(
g: Game, owner: string,
): { event: string; price: 3; blocked: string | null } {
const buyer = text(owner) ? g.players.find(p => p.id === owner) : undefined;
let blocked: string | null = null;
if (!emperorNexusSellerPurchaseModeSupported(g))
blocked = 'Emperor Nexus special purchase requires a supported native Richese Nexus profile with Emperor absent.';
else if (g.status !== 'playing' || !whole(g.turn) || g.turn < 1 ||
!whole(g.phase) || g.phase < 1 || g.phase > 8)
blocked = 'Emperor Nexus special purchase needs the original game still in progress.';
else if (!g.advanced || buyer?.faction !== 'richese')
blocked = 'Only native Advanced Richese can retain its special Karama purchase price.';
else if (buyer.ally)
blocked = 'Emperor Nexus Secret Ally requires an unallied buyer.';
else if (!g.nexusCards?.cards)
blocked = 'Hold the real Emperor Nexus Secret Ally card to retain your purchase price.';
else {
try {
validateNexusCards(g.nexusCards.cards, g.players);
if (g.nexusCards.cards.hands[owner] !== 'emperor' ||
nexusCardMode('emperor', buyer.faction, g.players.map(p => p.faction)) !== 'secretAlly')
blocked = 'Hold the real Emperor Nexus Secret Ally card to retain your purchase price.';
else if (!whole(buyer.spice) || buyer.spice < 3)
blocked = 'The special Karama purchase needs the three-spice price held in Richese’s own spice.';
} catch (error) {
blocked = error instanceof Error ? error.message
: 'Hold the real Emperor Nexus Secret Ally card to retain your purchase price.';
}
}
return {
event: emperorNexusSpecialPurchaseEvent(
g.turn, g.phase, owner, g.nexusEmperorPurchaseHistory?.length ?? 0,
),
price: 3, blocked,
};
}
/** Called after original preparation, before either activation is discarded or
* the cache card moves. Bind both exact physical cards without paying/refunding. */
export function createEmperorNexusSpecialPurchase(
g: Game, owner: string, activation: string, acquire: string,
): EmperorNexusSpecialPurchase {
const quote = quoteEmperorNexusSpecialPurchase(g, owner);
if (quote.blocked) throw new EmperorNexusPurchaseError(quote.blocked);
const buyer = g.players.find(p => p.id === owner)!;
const chosen = g.richeseCache?.find(card => card.id === acquire);
const physical = [
...g.players.flatMap(p => p.hand), ...g.deck, ...g.discard,
...(g.richeseCache ?? []), ...(g.richeseRemoved ?? []),
...(g.ixSetupCards ?? []), ...(g.ixAuction?.cards ?? []),
...(g.ornithopter ? [g.ornithopter.card] : []),
];
if (!text(activation) || !text(acquire) || activation === acquire ||
!chosen || !richeseCardDefinition(chosen) ||
buyer.hand.filter(card => card.id === activation).length !== 1 ||
physical.filter(card => card.id === activation).length !== 1 ||
physical.filter(card => card.id === acquire).length !== 1)
throw new EmperorNexusPurchaseError(
'Emperor Nexus special purchase needs one exact native cache card and its single held Karama activation.',
);
const receipt: EmperorNexusSpecialPurchase = {
version: 4, kind: 'purchase', event: quote.event, owner: buyer.id,
turn: g.turn, phase: g.phase, sequence: g.nexusEmperorPurchaseHistory?.length ?? 0,
faction: 'richese', advanced: true, origin: 'specialKarama', price: 3,
card: acquire, activation, beforeSpice: buyer.spice, afterSpice: buyer.spice,
signature: '',
};
receipt.signature = signEmperorNexusPurchase(receipt);
validateEmperorNexusPurchase(g, receipt);
return receipt;
}
+27 -16
View File
@@ -560,10 +560,11 @@ export const RULE_TOPICS: RuleTopic[] = [
coverage: 'Partial',
developmentStage: 'Prototyped',
summary:
'Spend a Karama and three spice once per game to choose a private cache card for your own hand.',
'Spend a held Karama once per game to buy one private cache card for three own spice. An eligible Emperor Nexus joint option proves and retains that price while spending both cards at native purchase commit.',
steps: [
'In advanced development tables, Richese can use its special Karama once per game. Select an available Karama in your hand and one eligible card from your own cache. The activating Karama is discarded; the chosen card enters your hand secretly.',
'This is a purchase for Richese itself. Pay three of your available spice to Emperor when present, otherwise the bank. The general Emperor purchase-income rule supplies this payment destination. An ally receives no Harkonnen bonus or Ixian replacement from this direct cache acquisition.',
'With Emperor absent, an actual unallied Emperor Nexus holder may use the private joint option after proving three own uncommitted spice. Original Karama and Nexus both spend at purchase commit, one exact cache card enters your hand and native once-use/capacity/reservations remain. No bank money, reimbursement, ally bonus, fake auction or automatic public pause. This purchase composition is visibly provisional; ordinary paid use remains available.',
'A Karama cannot cancel the special purchase itself. Emperor income has a separate response: canceling that income does not undo the purchase or restore the spent special power.',
'The separate Richese Nexus Betrayal preview connects ordinary public self-cache auctions, not this private special acquisition. The native Karama cancellation exception above is not authority for deciding whether Nexus Betrayal applies to a special purchase.',
'The private hand panel provides both card selectors and enlarged inspection. It shows the payment recipient and the server’s current availability reason. A reserved auction card cannot be taken from that lot. Spending pledged or already committed funds is not allowed.',
@@ -585,35 +586,43 @@ export const RULE_TOPICS: RuleTopic[] = [
area: 'Implementation',
status: 'Partial',
detail:
'Private cache acquisition, once-use and separate Emperor income are integrated. Full-hand exchange is a visibly provisional final-capacity policy; final-cache acquisition reaches the resolved ordinary Bidding continuation. Further timing and transfer/search compositions remain open.',
'Original private acquisition, once-use and separate paid Emperor income remain. An eligible joint Emperor Nexus option retains three own uncommitted spice and spends both actual cards at native commit with strict source receipts. Full-hand/final-cache and enclosing continuation remain; no fake auction or income. Broader combinations stay open.',
},
{
area: 'Player controls',
status: 'Partial',
detail:
'Private activation and cache selectors include inspectors, payment recipient and authoritative blocked reasons. The desktop purchase flow and restored income response were verified in the browser. Mobile and broader interaction checks remain.',
'Original private activation/cache selectors retain ordinary Pay3 and add an eligible two-card joint button with visible provisional composition. Actual390px normal/full-hand/final-cache/joint and irrelevant-Nexus paid paths preserve native once-use and one acquisition without overflow/errors. Wider presentation acceptance remains open.',
},
{
area: 'AI',
status: 'Partial',
detail:
'Four profiles conservatively acquire only the currently usable canonical Karama, retain a spice reserve and honor pending interaction priority.',
'Minimal profiles keep original canonical-Karama choice, conservative spice budget and pending-priority rules, attaching the legal projected joint option when eligible. Easy’s genuine source earns one seller spice to meet its unchanged budget; no money or strategy is invented. Full strategy/calibration stay unfinished.',
},
{
area: 'Documentation',
status: 'Partial',
detail:
'Purchase, secrecy, payment, cancellation and explicit interpretation boundaries are explained here. Other acquisition effects await integration.',
'Native purchase secrecy, fixed price, once-use and capacity remain explicit. Emperor Nexus joint retention is visibly provisional source composition, not special-power immunity or publisher clarification. Existing Kull producer excludes Richese; combined admission is not fabricated.',
},
{
area: 'Verification',
status: 'Partial',
detail:
'Engine and independent review tests cover private custody, payments, nested response restoration and guards. All four AI profiles, concurrent purchase requests, restart and a real browser purchase are verified in bounded fixtures. Complete Richese games remain unverified.',
'Current joint13-file union112/112, types/lint/build and twelve real API profiles pass across phases2/4/5, paid/joint, full hand, final cache and intersection; depletion reaches original ordinary Bidding. Four actual390px surfaces prove retained5 to5, full-hand4 to4/spice3, last-cache1 to0/turn9 and paid5 to2, both costs/one acquisition/once-use, no overflow/errors. Prior native paid evidence remains; full Richese/combination/assurance/deployed acceptance is open.',
evidence: [
'tests/richese-acquisition-bots.test.ts',
'tests/richese-acquisition.test.ts',
'tests/richese-acquisition-review.test.ts',
'tests/fixture-nexus-emperor-special.ts',
'tests/nexus-emperor-special-purchase.test.ts',
'tests/nexus-emperor-special-runtime.test.ts',
'game/nexus-emperor-purchase.ts',
'game/engine.ts',
'components/richese-special-karama.tsx',
'docs/RICHESE_ACQUISITION_RULES.md',
'docs/NEXUS_EMPEROR_RULES.md',
'tests/richese-auction-recovery.test.ts',
'tests/reference.test.ts',
],
@@ -4346,7 +4355,7 @@ export const RULE_TOPICS: RuleTopic[] = [
category: 'Advanced & expansions',
coverage: 'Partial',
developmentStage: 'Prototyped',
summary: 'With Emperor absent, an unallied holder can choose exactly three extra free returns or retain a personally affordable original purchase price. Classic bank auctions, Richese cache/Advanced Black Market and the Richese Ambassador have distinct connected paths. Other real purchase sources and full combinations retain separate contracts.',
summary: 'With Emperor absent, an unallied holder can choose exactly three extra free returns or retain a personally affordable original purchase price. Classic bank, Richese cache/Advanced Black Market, Ambassador and joint special Karama have distinct connected paths. Full combinations and assurance retain separate gates.',
steps: [
'Use the private Emperor Secret Ally controls during Revival. Select the physical elite count when more than one legal group is available. The card returns exactly three eligible forces from Tanks to reserves and is discarded once.',
'These returns cost no spice and do not consume ordinary force-revival or free-revival allowances. You may use the card before or after ordinary revivals, while Revival remains open.',
@@ -4355,14 +4364,15 @@ export const RULE_TOPICS: RuleTopic[] = [
'At an eligible classic normal bank-auction winner payment, prove the positive final bid from your own spice and spend Emperor Nexus to receive the lot without losing spice. Every winner sees the same payment confirmation; the provisional recommendation is selected under the decision priority. Ordinary spice or legal Karama remains available.',
'Original Richese cache and Advanced Black Market offer Pay or eligible Emperor Nexus Use after original Richese Betrayal. The provisional seller-unpaid policy retains your full personally affordable price without bank reimbursement. One original lot, native Harkonnen bonus and source successor continue; legal self-cache is included but self-Black remains prohibited. Original self-purchase forced discard cannot consume this Nexus or acquire a card.',
'A committed Richese Ambassador trigger now offers its original beneficiary Pay or eligible Emperor Nexus Use, with no new decline. Under the visible provisional purchase composition, prove and keep three own spice while drawing one original deck card; no bank payment, reimbursement or fake auction is made. Original private inability, native bonus and entrant movement/worm continuation remain. Allies cannot Use; actual forming-alliance Nexus disposal stays original.',
'Original Advanced Richese special Karama has an eligible private joint option: spend the held Karama plus Emperor Nexus at native purchase commit after proving three own uncommitted spice, keep that spice and acquire one exact unreserved cache card. Native once-use, full-hand/final-cache and enclosing controls remain; no bank money, ally bonus, fake auction or automatic public pause. Ordinary Pay3 remains available. This source composition is visibly provisional, not immunity or broader Kull admission.',
],
related: ['nexus-cards', 'revival'],
checklist: [
{ area: 'Implementation', status: 'Partial', detail: 'Independent extra-three remains. Distinct original bank/Richese seller/Ambassador paths retain personally affordable price and actual acquisition with signed source receipts. Native draw/recycling, hand limits, bonus and source successor continue; no invented reimbursement or fake auction. Other real sources and full combinations remain open.', evidence: ['game/nexus-emperor-secret-ally.ts', 'game/nexus-emperor-purchase.ts', 'game/auction-continuation-quote.ts', 'game/engine.ts', 'game/ambassador-phase.ts', 'game/ambassador-resume.ts'] },
{ area: 'Player controls', status: 'Partial', detail: 'Private typed revival and uniform original winning-buyer/committed-beneficiary confirmations with eligible Use, price proof and visible provisional source policy. Actual Pay, Truthtrance and original entrant controls remain; no new beneficiary veto.', evidence: ['components/nexus-emperor-secret-ally.tsx', 'components/nexus-emperor-seller-purchase.tsx', 'components/nexus-emperor-ambassador-purchase.tsx', 'components/nexus-cards.tsx', 'components/game-table.tsx'] },
{ area: 'Implementation', status: 'Partial', detail: 'Independent extra-three remains. Distinct original bank/seller/Ambassador/joint special sources retain personally affordable price and actual acquisition with signed evidence. Joint use spends both actual cards at native commit; once-use, capacity/reservations and enclosing continuation remain. No reimbursement, ally bonus or fake auction. Full combinations and assurance are open.', evidence: ['game/nexus-emperor-secret-ally.ts', 'game/nexus-emperor-purchase.ts', 'game/auction-continuation-quote.ts', 'game/engine.ts', 'game/ambassador-phase.ts', 'game/ambassador-resume.ts'] },
{ area: 'Player controls', status: 'Partial', detail: 'Typed revival and original buyer/beneficiary confirmations remain. Original private special selectors now retain Pay3 plus eligible joint two-card Use, with visible provisional composition and no new automatic public pause. Native enclosing controls and once-use remain.', evidence: ['components/nexus-emperor-secret-ally.tsx', 'components/nexus-emperor-seller-purchase.tsx', 'components/nexus-emperor-ambassador-purchase.tsx', 'components/nexus-cards.tsx', 'components/game-table.tsx', 'components/richese-special-karama.tsx'] },
{ area: 'AI', status: 'Partial', detail: 'Minimal profiles use projected legal revival and original personally funded purchase choices, or Pay, without inspecting rival private custody. Complete strategy/calibration remain unfinished.', evidence: ['game/nexus-emperor-secret-ally-options.ts', 'game/bots.ts'] },
{ area: 'Documentation', status: 'Partial', detail: 'Printed alternatives and original purchase classification distinguish independent revival, bank/Richese seller/Ambassador source compositions from publisher rulings. Other real acquisition sources and full combinations retain separate contracts; CHOAM closing sales/trades are not direct purchase producers.', evidence: ['docs/NEXUS_EMPEROR_RULES.md', 'docs/NEXUS_EMPEROR_SECRET_ALLY_RUNTIME.md', 'docs/RULE_DECISIONS.md', 'docs/RICHESE_AMBASSADOR_RULES.md', 'docs/RICHESE_AMBASSADOR_IMPLEMENTATION.md'] },
{ area: 'Verification', status: 'Partial', detail: 'Current Ambassador13-file union111/111, types/lint/build and eight original API profiles pass. Four actual390px surfaces prove Pay3/Use0, one card and native movement/spice continuation without overflow/errors. Native allied Hark bonus, original alliance disposal and Truthtrance remain. Prior seller108/108/twenty API profiles and bank/revival evidence remain; broad assurance, combinations and deployed acceptance are open.', evidence: ['tests/nexus-emperor-secret-ally.test.ts', 'tests/nexus-emperor-secret-ally-recovery.test.ts', 'tests/nexus-emperor-purchase-engine.test.ts', 'tests/nexus-emperor-purchase-recovery.test.ts', 'tests/nexus-emperor-secret-ally-purchase-controls.test.ts', 'tests/fixture-nexus-emperor-seller.ts', 'tests/nexus-emperor-seller-purchase.test.ts', 'tests/nexus-emperor-seller-runtime.test.ts', 'tests/fixture-nexus-emperor-ambassador.ts', 'tests/nexus-emperor-ambassador-purchase.test.ts', 'tests/nexus-emperor-ambassador-runtime.test.ts'] },
{ area: 'Documentation', status: 'Partial', detail: 'Printed purchase panel composes with original bank/Richese seller/Ambassador/special purchase classifications under visible provisional recommendations. No fake money, auction, beneficiary veto or broader Kull admission. Full combination/assurance/publication gates remain; CHOAM closing sales/trades are not direct purchase producers.', evidence: ['docs/NEXUS_EMPEROR_RULES.md', 'docs/NEXUS_EMPEROR_SECRET_ALLY_RUNTIME.md', 'docs/RULE_DECISIONS.md', 'docs/RICHESE_AMBASSADOR_RULES.md', 'docs/RICHESE_AMBASSADOR_IMPLEMENTATION.md', 'docs/RICHESE_ACQUISITION_RULES.md'] },
{ area: 'Verification', status: 'Partial', detail: 'Joint special13-file union112/112, types/lint/build and twelve real API profiles pass across original phases2/4/5, paid/joint, full hand, final cache and intersection; depletion reaches ordinary Bidding. Four actual390px surfaces prove retained5 to5/full-hand4 to4/spice3/last-cache1 to0/turn9/paid5 to2, both actual costs, one acquisition and once-use, no overflow/errors. Prior Ambassador111/111, seller108/108, bank/revival evidence remains; broad assurance and deployed acceptance are open.', evidence: ['tests/nexus-emperor-secret-ally.test.ts', 'tests/nexus-emperor-secret-ally-recovery.test.ts', 'tests/nexus-emperor-purchase-engine.test.ts', 'tests/nexus-emperor-purchase-recovery.test.ts', 'tests/nexus-emperor-secret-ally-purchase-controls.test.ts', 'tests/fixture-nexus-emperor-seller.ts', 'tests/nexus-emperor-seller-purchase.test.ts', 'tests/nexus-emperor-seller-runtime.test.ts', 'tests/fixture-nexus-emperor-ambassador.ts', 'tests/nexus-emperor-ambassador-purchase.test.ts', 'tests/nexus-emperor-ambassador-runtime.test.ts', 'tests/fixture-nexus-emperor-special.ts', 'tests/nexus-emperor-special-purchase.test.ts', 'tests/nexus-emperor-special-runtime.test.ts'] },
],
},
{
@@ -4574,6 +4584,7 @@ export const RULE_TOPICS: RuleTopic[] = [
'Emperor Secret Ally revival selects exactly three real normal/starred counters for free, outside ordinary total/free and native allied-extra usage. Declaration spends one Nexus and enters original pending revival; no leader or absent native payer is granted. Under the visible provisional independent-source policy, native Tleilaxu may prevent it and actual free returns award income once; ordinary free-rate blocking and Recruits do not reprice or double this fixed grant. Denial keeps both spent cards without forces/income/Tech or refund. Native typed caps, reserve deposits, Axlotl and eligible newly returned Fedaykin placement continue. Tleilax ordinary Free Revival deployment is not extended to this extra source. Source receipts distinguish requested, returned and denied; old physical receipts never replay.',
'Original Richese cache and Advanced Black Market sold lots offer every buyer Pay after original Richese Betrayal. An eligible unallied Emperor Nexus holder, with Emperor absent and full price personally affordable, may Use to retain it and leave seller/bank unpaid under the visible provisional recommendation. Actual stock, hand limits, native Harkonnen bonus and successor run once. Legal self-cache is included; self-Black remains blocked. Original self-discard gives no acquisition or Emperor Nexus spend.',
'Original Richese Ambassador trigger offers the beneficiary uniform Pay or eligible Emperor Nexus Use, independently of hidden face or private availability. Under provisional purchase composition, an actual unallied holder proves/retains three own spice and acquires one original deck card, with no bank payment, reimbursement or fake auction. Native source phase/resume authority, private inability, draw/recycling, bonus and movement/worm suffix remain. An ally cannot Use; forming alliance disposes held Nexus originally. CHOAM closing sales/trades are not direct purchases.',
'Original Advanced Richese special Karama may jointly spend its held activation plus actual Emperor Nexus, after proving three own uncommitted spice. The provisional purchase composition retains that price and acquires one exact cache card at native commit, preserving original once-use, capacity, reserved-card and enclosing controls. Full hand exchanges within its actual limit; final depletion continues to ordinary Bidding. No bank payment, reimbursement, ally bonus, fake auction or public automatic pause. Ordinary paid use remains; broader Kull admission is not invented.',
'Emperor Betrayal has a battle alternative in Advanced play: an unallied opponent holding the Emperor Nexus card can spend it during the ordinary pre-plan Sardaukar response to suppress actual Sardaukar strength for this battle. Every seat receives the same response opportunity even with no card, keeping hidden custody private. The starred pieces remain physical Sardaukar; no card grants a new force or cancels their separate support benefit.',
'During an original positive normal-auction purchase by Emperor’s ally, possible unallied held-Nexus rivals acknowledge in storm order before winner payment, regardless of secret face. Only the current actual Emperor-card holder may Use; Pass keeps cards and original payment. Under the provisional conservative full-price interpretation, native Emperor covers the full original price, reusing prepaid aid and adding only missing own spice. The buyer keeps their own spice and acquires one original card. Native Emperor income remains separately cancelable without refund; original next-lot inspection continues. No excess gift, bank-created subsidy or future-income borrowing is granted. Underfunded/fully prepaid Use is unavailable; special seller lots and full combinations remain open.',
'With Fremen absent, an actual unallied Fremen-card holder may enable a fixed ordinary free quota of three at a quiet Revival boundary, then use normal partial/typed revival controls. Activation moves no counters, leader or spice. Actual prior free use counts; paid returns keep their cost and total usage. Native total limits, higher free rates, typed caps, prevention, Homeworld deposits/deployment, Axlotl activity and once-only Tleilaxu income remain original. Recruits doubles its native rate, not this fixed quota. Useless or unknown-ledger grants are unavailable. This is the visibly provisional recommended interpretation; strict old physical receipts adopt metadata without replay. Independent sandworm protection remains the separate operation below.',
@@ -4603,11 +4614,11 @@ export const RULE_TOPICS: RuleTopic[] = [
],
related: ['ecaz-modules', 'spice-blow', 'alliance-funding', 'choam-worthless', 'choam-kull', 'nexus-choam-kull', 'nexus-richese-betrayal', 'nexus-guild-betrayal', 'nexus-ixian-replacement', 'nexus-ixian-betrayal'],
checklist: [
{area:'Implementation',status:'Partial',detail:"Existing independent revival, compulsory funding and Richese seller paths remain. Emperor Secret Ally now applies to the original Richese Ambassador purchase through uniform beneficiary confirmation after trigger. Version3 source evidence binds original token, entry, phase, buyer and actual card; native draw/recycling and movement/worm continuation run once. No bank payment, reimbursement or fake auction is invented. Original source-bound Homeworld phase authority remains; full combinations and assurance are open.",evidence:['game/nexus-cards.ts', 'game/nexus-card-phase.ts', 'game/nexus-traitor-exchange.ts', 'game/traitor-declarations.ts', 'game/nexus-face-dancers.ts', 'game/nexus-suboids.ts', 'game/nexus-advisors.ts', 'game/nexus-sardaukar-options.ts', 'game/nexus-fremen-revival.ts', 'game/nexus-fremen-cunning.ts', 'game/nexus-ecaz-betrayal.ts', 'game/nexus-ecaz-inquiry.ts', 'game/nexus-ecaz-duke.ts', 'game/duke-vidal.ts', 'game/nexus-emperor-secret-ally.ts', 'game/choam-power-options.ts', 'game/nexus-moritani-options.ts', 'game/nexus-moritani-betrayal.ts', 'game/nexus-richese-options.ts', 'game/nexus-richese-betrayal.ts', 'game/nexus-guild-cunning-options.ts', 'game/nexus-guild-secret-ally-options.ts', 'game/nexus-module-profile.ts', 'game/engine.ts', 'game/nexus-tleilaxu-revival.ts', 'game/nexus-borrowed-voice.ts', 'game/combat-response-quote.ts', 'game/karama-context.ts', 'game/nexus-fremen-protection.ts', 'game/admin-seat-ai-shape.ts', 'game/richese-cancellation.ts', 'game/bot-mobility.ts', 'game/planetologist-movement.ts', 'game/revival.ts', 'game/nexus-fremen-revival-options.ts','game/nexus-emperor-payment.ts', 'game/nexus-emperor-secret-ally.ts', 'game/revival-resume.ts', 'game/revival-cancellation.ts', 'game/homeworld-revival-deployment.ts', 'game/homeworld-revival-return.ts', "game/nexus-emperor-purchase.ts", "game/auction-continuation-quote.ts", "game/nexus-emperor-purchase.ts", "game/ambassador-phase.ts", "game/ambassador-resume.ts"]},
{area:'Player controls',status:'Partial',detail:"Actual original buyer sees Pay and eligible Use after committed Ambassador trigger, with visible provisional purchase composition and no extra decline. Original Truthtrance discard restores the same decision; entrant control remains native. Actual390px Basic Use, Advanced Pay, irrelevant-card Pay and phase-one worm Use prove one original card and native successor without overflow/errors. Existing Nexus surfaces remain; complete-mode acceptance stays open.",evidence:['components/nexus-cards.tsx', 'components/nexus-traitors.tsx', 'components/nexus-tleilaxu.tsx', 'components/nexus-suboids.tsx', 'components/nexus-advisors.tsx', 'components/nexus-sardaukar.tsx', 'components/choam-power-cost.tsx', 'components/moritani-terror.tsx', 'components/nexus-moritani-betrayal.tsx', 'components/nexus-ecaz-betrayal.tsx', 'components/nexus-ecaz-inquiry.tsx', 'components/nexus-ecaz-duke.tsx', 'components/nexus-richese-betrayal.tsx', 'components/game-table.tsx', 'components/nexus-tleilaxu-revival.tsx', 'components/battle-preparation.tsx', 'components/nexus-fremen-revival.tsx','components/nexus-emperor-payment.tsx', 'components/nexus-emperor-secret-ally.tsx', "components/nexus-emperor-seller-purchase.tsx", "components/nexus-emperor-ambassador-purchase.tsx"]},
{area:'AI',status:'Partial',detail:"Minimal profiles use shared projected original Ambassador entitlement or native Pay, without private rival inspection or borrowing entrant control. Existing independent return, compulsory funding and seller adapters remain. Strategy and four-tier calibration remain deferred and unfinished.",evidence:['game/nexus-card-options.ts', 'game/nexus-traitor-options.ts', 'game/nexus-tleilaxu-options.ts', 'game/nexus-suboid-options.ts', 'game/nexus-advisor-options.ts', 'game/nexus-sardaukar-options.ts', 'game/choam-power-options.ts', 'game/nexus-moritani-options.ts', 'game/nexus-moritani-betrayal-options.ts', 'game/nexus-ecaz-betrayal-options.ts', 'game/nexus-ecaz-inquiry-options.ts', 'game/nexus-ecaz-duke-options.ts', 'game/nexus-richese-options.ts', 'game/bot-nexus-richese-betrayal.ts', 'game/nexus-guild-cunning-options.ts', 'game/bots.ts', 'game/nexus-fremen-revival-options.ts','game/nexus-emperor-payment.ts', 'game/nexus-emperor-secret-ally-options.ts']},
{area:'Documentation',status:'Partial',detail:"Printed purchase panel and existing Richese Ambassador purchase classification compose outside Bidding under a visibly provisional recommendation. Uniform confirmation does not add a beneficiary veto; bank payment/reimbursement and fake auctions are not invented. CHOAM closing market only sells/trades, not a missing direct purchase producer. Other real sources, complete combinations and publication gates retain separate contracts.",evidence:['docs/NEXUS_CARD_RULES.md', 'docs/NEXUS_ATREIDES_RULES.md', 'docs/NEXUS_HARKONNEN_RULES.md', 'docs/NEXUS_TLEILAXU_RULES.md', 'docs/NEXUS_IXIAN_CUNNING_RULES.md', 'docs/NEXUS_CUNNING_RUNTIME.md', 'docs/NEXUS_BENE_GESSERIT_RULES.md', 'docs/NEXUS_ADVISOR_RUNTIME.md', 'docs/NEXUS_EMPEROR_RULES.md', 'docs/NEXUS_SARDAUKAR_RUNTIME.md', 'docs/NEXUS_FREMEN_RULES.md', 'docs/NEXUS_ECAZ_RULES.md', 'docs/NEXUS_CHOAM_RULES.md', 'docs/NEXUS_CHOAM_RUNTIME.md', 'docs/NEXUS_MORITANI_RULES.md', 'docs/NEXUS_MORITANI_RUNTIME.md', 'docs/NEXUS_RICHESE_RUNTIME.md', 'docs/NEXUS_RICHESE_RULES.md', 'docs/NEXUS_GUILD_CUNNING_RUNTIME.md', 'docs/NEXUS_GUILD_RULES.md', "docs/NEXUS_EMPEROR_SECRET_ALLY_RUNTIME.md", "docs/RULE_DECISIONS.md", "docs/RICHESE_AMBASSADOR_RULES.md", "docs/RICHESE_AMBASSADOR_IMPLEMENTATION.md"]},
{area:'Verification',status:'Partial',detail:"Ambassador affected13-file union111/111 and types/lint/build pass. Eight actual Basic/Advanced shipment/worm API profiles prove Pay3 versus Use0, actual card and native suffix. Actual390px four surfaces prove Basic11 to11, Advanced11 to8, irrelevant-card Pay and phase-one worm11 to11 with one card and original entrant/spice controls, no overflow/errors. Native Hark allied Pay bonus once, original alliance disposal and actual Truthtrance remain. Fixture-only nonexistent Spice Card/retained-allied-Nexus assumptions and action/default pins were removed. Prior seller108/108, extra266/266, funding155/155 and quota329/329 evidence remains; broad assurance/deployed acceptance stay open.",evidence:['tests/mixed-nexus-modules-runtime.test.ts', 'tests/paired-e3-nexus-modules-runtime.test.ts', 'tests/sample-custody.test.ts', 'tests/ambassador-terror-overlap-engine.test.ts', 'tests/single-nexus-e1-runtime.test.ts', 'tests/single-nexus-e2-runtime.test.ts', 'tests/e3-nexus-ecaz-runtime.test.ts', 'tests/e3-nexus-moritani-runtime.test.ts', 'tests/homeworld-classic-nexus-skills-runtime.test.ts', 'tests/homeworld-classic-discovery-nexus-runtime.test.ts', 'tests/nexus-cards.test.ts', 'tests/nexus-card-engine.test.ts', 'tests/nexus-fremen-cunning.test.ts', 'tests/nexus-fremen-cunning-recovery.test.ts', 'tests/nexus-fremen-cunning-summon.test.ts', 'tests/nexus-fremen-cunning-summon-recovery.test.ts', 'tests/nexus-ecaz-betrayal-quotes.test.ts', 'tests/nexus-ecaz-betrayal.test.ts', 'tests/nexus-ecaz-betrayal-recovery.test.ts', 'tests/nexus-ecaz-inquiry.test.ts', 'tests/nexus-ecaz-duke-quote.test.ts', 'tests/nexus-ecaz-duke-engine.test.ts', 'tests/nexus-ecaz-duke-controls.test.ts', 'tests/nexus-ecaz-duke-recovery.test.ts', 'tests/nexus-traitor-recovery.test.ts', 'tests/nexus-face-dancer-engine.test.ts', 'tests/nexus-suboids-engine.test.ts', 'tests/normal-free-support.test.ts', 'tests/nexus-suboid-controls.test.ts', 'tests/nexus-advisor-controls.test.ts', 'tests/nexus-advisor-bots.test.ts', 'tests/nexus-sardaukar-controls.test.ts', 'tests/nexus-sardaukar-bots.test.ts', 'tests/nexus-choam-controls.test.ts', 'tests/nexus-choam-bots.test.ts', 'tests/nexus-moritani-controls.test.ts', 'tests/nexus-moritani-bots.test.ts', 'tests/nexus-moritani-betrayal.test.ts', 'tests/nexus-richese-controls.test.ts', 'tests/nexus-richese-bots.test.ts', 'tests/nexus-richese-betrayal-engine.test.ts', 'tests/nexus-richese-betrayal-recovery.test.ts', 'tests/nexus-guild-cunning-controls.test.ts', 'tests/nexus-guild-cunning-bots.test.ts', 'tests/nexus-module-payments-runtime.test.ts', 'tests/nexus-module-battles-runtime.test.ts', 'tests/paired-ix-nexus-modules-runtime.test.ts', 'tests/paired-choam-nexus-modules-runtime.test.ts', 'tests/classic-nexus-skills-payments-runtime.test.ts', 'tests/classic-nexus-skills-battles-runtime.test.ts', 'tests/nexus-skills-modules-payments-runtime.test.ts', 'tests/nexus-skills-modules-battles-runtime.test.ts', 'tests/paired-ix-nexus-skills-modules-runtime.test.ts', 'tests/paired-choam-nexus-skills-modules-runtime.test.ts', 'tests/ecaz-nexus-skills-modules-runtime.test.ts', 'tests/moritani-nexus-skills-modules-runtime.test.ts', 'docs/NEXUS_CARD_RULES.md', 'tests/nexus-tleilaxu-revival.test.ts', 'tests/fixture-nexus-tleilaxu-secret-ally.ts', 'tests/nexus-tleilaxu-secret-ally-runtime.test.ts', 'tests/nexus-borrowed-voice.test.ts', 'tests/fixture-nexus-borrowed-voice.ts', 'tests/nexus-borrowed-voice-runtime.test.ts', 'tests/nexus-fremen-protection.test.ts', 'tests/fixture-nexus-fremen-protection.ts', 'tests/nexus-fremen-protection-runtime.test.ts', 'tests/fixture-stronghold-factions.ts', 'tests/fixture-nexus-advisor-fresh.ts', 'tests/nexus-advisor-fresh-runtime.test.ts', 'tests/fixture-nexus-advisor-storm.ts', 'tests/nexus-advisor-storm-runtime.test.ts', 'docs/NEXUS_ADVISOR_RUNTIME.md', 'tests/nexus-fremen-free-quota.test.ts', 'tests/fixture-nexus-fremen-free-quota.ts', 'tests/nexus-fremen-free-quota-runtime.test.ts', 'tests/nexus-fremen-revival.test.ts','tests/nexus-emperor-payment.test.ts','tests/fixture-nexus-emperor-payment.ts','tests/nexus-emperor-payment-runtime.test.ts','docs/NEXUS_EMPEROR_RULES.md', 'tests/nexus-emperor-extra-source.test.ts', 'tests/nexus-emperor-extra-continuation.test.ts', 'tests/fixture-nexus-emperor-extra.ts', 'tests/nexus-emperor-extra-runtime.test.ts', 'tests/fixture-single-nexus-e1.ts', 'docs/NEXUS_EMPEROR_SECRET_ALLY_RUNTIME.md', "tests/fixture-nexus-emperor-seller.ts", "tests/nexus-emperor-seller-purchase.test.ts", "tests/nexus-emperor-seller-runtime.test.ts", "tests/fixture-nexus-emperor-ambassador.ts", "tests/nexus-emperor-ambassador-purchase.test.ts", "tests/nexus-emperor-ambassador-runtime.test.ts"]},
{area:'Implementation',status:'Partial',detail:"Existing independent revival, compulsory funding and seller/Ambassador purchases remain. Original Advanced Richese special Karama now optionally commits its held Karama plus Emperor Nexus, retaining three own uncommitted spice and acquiring one exact cache card. Version4 evidence binds both physical IDs and original phase/price. Native once-use, capacity, reservations and enclosing continuation remain; no bank money, ally bonus or fake auction. Full combinations and assurance remain open.",evidence:['game/nexus-cards.ts', 'game/nexus-card-phase.ts', 'game/nexus-traitor-exchange.ts', 'game/traitor-declarations.ts', 'game/nexus-face-dancers.ts', 'game/nexus-suboids.ts', 'game/nexus-advisors.ts', 'game/nexus-sardaukar-options.ts', 'game/nexus-fremen-revival.ts', 'game/nexus-fremen-cunning.ts', 'game/nexus-ecaz-betrayal.ts', 'game/nexus-ecaz-inquiry.ts', 'game/nexus-ecaz-duke.ts', 'game/duke-vidal.ts', 'game/nexus-emperor-secret-ally.ts', 'game/choam-power-options.ts', 'game/nexus-moritani-options.ts', 'game/nexus-moritani-betrayal.ts', 'game/nexus-richese-options.ts', 'game/nexus-richese-betrayal.ts', 'game/nexus-guild-cunning-options.ts', 'game/nexus-guild-secret-ally-options.ts', 'game/nexus-module-profile.ts', 'game/engine.ts', 'game/nexus-tleilaxu-revival.ts', 'game/nexus-borrowed-voice.ts', 'game/combat-response-quote.ts', 'game/karama-context.ts', 'game/nexus-fremen-protection.ts', 'game/admin-seat-ai-shape.ts', 'game/richese-cancellation.ts', 'game/bot-mobility.ts', 'game/planetologist-movement.ts', 'game/revival.ts', 'game/nexus-fremen-revival-options.ts','game/nexus-emperor-payment.ts', 'game/nexus-emperor-secret-ally.ts', 'game/revival-resume.ts', 'game/revival-cancellation.ts', 'game/homeworld-revival-deployment.ts', 'game/homeworld-revival-return.ts', "game/nexus-emperor-purchase.ts", "game/auction-continuation-quote.ts", "game/nexus-emperor-purchase.ts", "game/ambassador-phase.ts", "game/ambassador-resume.ts"]},
{area:'Player controls',status:'Partial',detail:"Original private special activation/cache selectors retain ordinary Pay3 and add eligible joint two-card Use with visible provisional composition. No public automatic pause is created. Actual390px retain5 to5, full-hand4 to4/spice3, final-cache1 to0/turn9 and paid5 to2 prove one acquisition and once-use without overflow/errors. Existing Nexus controls remain; complete-mode acceptance is open.",evidence:['components/nexus-cards.tsx', 'components/nexus-traitors.tsx', 'components/nexus-tleilaxu.tsx', 'components/nexus-suboids.tsx', 'components/nexus-advisors.tsx', 'components/nexus-sardaukar.tsx', 'components/choam-power-cost.tsx', 'components/moritani-terror.tsx', 'components/nexus-moritani-betrayal.tsx', 'components/nexus-ecaz-betrayal.tsx', 'components/nexus-ecaz-inquiry.tsx', 'components/nexus-ecaz-duke.tsx', 'components/nexus-richese-betrayal.tsx', 'components/game-table.tsx', 'components/nexus-tleilaxu-revival.tsx', 'components/battle-preparation.tsx', 'components/nexus-fremen-revival.tsx','components/nexus-emperor-payment.tsx', 'components/nexus-emperor-secret-ally.tsx', "components/nexus-emperor-seller-purchase.tsx", "components/nexus-emperor-ambassador-purchase.tsx", "components/richese-special-karama.tsx"]},
{area:'AI',status:'Partial',detail:"Minimal profiles attach the actual shared projected joint source only to an already legal original special purchase. Existing conservative spice budgets remain: Easy fixture earns one real seller spice instead of creating money or changing strategy. Irrelevant Nexus uses original Pay3. Existing Nexus adapters remain; strategy and calibration are deferred and unfinished.",evidence:['game/nexus-card-options.ts', 'game/nexus-traitor-options.ts', 'game/nexus-tleilaxu-options.ts', 'game/nexus-suboid-options.ts', 'game/nexus-advisor-options.ts', 'game/nexus-sardaukar-options.ts', 'game/choam-power-options.ts', 'game/nexus-moritani-options.ts', 'game/nexus-moritani-betrayal-options.ts', 'game/nexus-ecaz-betrayal-options.ts', 'game/nexus-ecaz-inquiry-options.ts', 'game/nexus-ecaz-duke-options.ts', 'game/nexus-richese-options.ts', 'game/bot-nexus-richese-betrayal.ts', 'game/nexus-guild-cunning-options.ts', 'game/bots.ts', 'game/nexus-fremen-revival-options.ts','game/nexus-emperor-payment.ts', 'game/nexus-emperor-secret-ally-options.ts']},
{area:'Documentation',status:'Partial',detail:"Printed purchase panel composes with original Richese special Karama purchase under visible provisional recommendation. Original Karama and Nexus spend at native purchase commit, not projection; no bank payment, reimbursement, ally bonus, fake auction or public pause. Full-hand/final-cache and enclosing rules remain. Native Kull producer excludes Richese; no unsupported admission is invented. Broad combinations/publication remain open.",evidence:['docs/NEXUS_CARD_RULES.md', 'docs/NEXUS_ATREIDES_RULES.md', 'docs/NEXUS_HARKONNEN_RULES.md', 'docs/NEXUS_TLEILAXU_RULES.md', 'docs/NEXUS_IXIAN_CUNNING_RULES.md', 'docs/NEXUS_CUNNING_RUNTIME.md', 'docs/NEXUS_BENE_GESSERIT_RULES.md', 'docs/NEXUS_ADVISOR_RUNTIME.md', 'docs/NEXUS_EMPEROR_RULES.md', 'docs/NEXUS_SARDAUKAR_RUNTIME.md', 'docs/NEXUS_FREMEN_RULES.md', 'docs/NEXUS_ECAZ_RULES.md', 'docs/NEXUS_CHOAM_RULES.md', 'docs/NEXUS_CHOAM_RUNTIME.md', 'docs/NEXUS_MORITANI_RULES.md', 'docs/NEXUS_MORITANI_RUNTIME.md', 'docs/NEXUS_RICHESE_RUNTIME.md', 'docs/NEXUS_RICHESE_RULES.md', 'docs/NEXUS_GUILD_CUNNING_RUNTIME.md', 'docs/NEXUS_GUILD_RULES.md', "docs/NEXUS_EMPEROR_SECRET_ALLY_RUNTIME.md", "docs/RULE_DECISIONS.md", "docs/RICHESE_AMBASSADOR_RULES.md", "docs/RICHESE_AMBASSADOR_IMPLEMENTATION.md", "docs/RICHESE_ACQUISITION_RULES.md"]},
{area:'Verification',status:'Partial',detail:"Joint special affected13-file union112/112, types/lint/build and twelve native API profiles pass. Genuine native setup/deal, other pact/draw, original positive seller income, paid ordinary wins and nine actual cache resolutions produce phases2/4/5, exact-price/full-hand/final-cache/intersection and Easy paths. Four actual390px surfaces prove retained5 to5, full-hand4 to4 at spice3, final-cache1 to0 at turn9 and paid5 to2 with Guild Nexus held. Both actual costs, one card and once-use remain; depletion reaches original ordinary Bidding. No overflow/errors. Prior Ambassador111/111, seller108/108, extra266/266, funding155/155 and quota329/329 evidence remains; broad assurance/deployed gates stay closed.",evidence:['tests/mixed-nexus-modules-runtime.test.ts', 'tests/paired-e3-nexus-modules-runtime.test.ts', 'tests/sample-custody.test.ts', 'tests/ambassador-terror-overlap-engine.test.ts', 'tests/single-nexus-e1-runtime.test.ts', 'tests/single-nexus-e2-runtime.test.ts', 'tests/e3-nexus-ecaz-runtime.test.ts', 'tests/e3-nexus-moritani-runtime.test.ts', 'tests/homeworld-classic-nexus-skills-runtime.test.ts', 'tests/homeworld-classic-discovery-nexus-runtime.test.ts', 'tests/nexus-cards.test.ts', 'tests/nexus-card-engine.test.ts', 'tests/nexus-fremen-cunning.test.ts', 'tests/nexus-fremen-cunning-recovery.test.ts', 'tests/nexus-fremen-cunning-summon.test.ts', 'tests/nexus-fremen-cunning-summon-recovery.test.ts', 'tests/nexus-ecaz-betrayal-quotes.test.ts', 'tests/nexus-ecaz-betrayal.test.ts', 'tests/nexus-ecaz-betrayal-recovery.test.ts', 'tests/nexus-ecaz-inquiry.test.ts', 'tests/nexus-ecaz-duke-quote.test.ts', 'tests/nexus-ecaz-duke-engine.test.ts', 'tests/nexus-ecaz-duke-controls.test.ts', 'tests/nexus-ecaz-duke-recovery.test.ts', 'tests/nexus-traitor-recovery.test.ts', 'tests/nexus-face-dancer-engine.test.ts', 'tests/nexus-suboids-engine.test.ts', 'tests/normal-free-support.test.ts', 'tests/nexus-suboid-controls.test.ts', 'tests/nexus-advisor-controls.test.ts', 'tests/nexus-advisor-bots.test.ts', 'tests/nexus-sardaukar-controls.test.ts', 'tests/nexus-sardaukar-bots.test.ts', 'tests/nexus-choam-controls.test.ts', 'tests/nexus-choam-bots.test.ts', 'tests/nexus-moritani-controls.test.ts', 'tests/nexus-moritani-bots.test.ts', 'tests/nexus-moritani-betrayal.test.ts', 'tests/nexus-richese-controls.test.ts', 'tests/nexus-richese-bots.test.ts', 'tests/nexus-richese-betrayal-engine.test.ts', 'tests/nexus-richese-betrayal-recovery.test.ts', 'tests/nexus-guild-cunning-controls.test.ts', 'tests/nexus-guild-cunning-bots.test.ts', 'tests/nexus-module-payments-runtime.test.ts', 'tests/nexus-module-battles-runtime.test.ts', 'tests/paired-ix-nexus-modules-runtime.test.ts', 'tests/paired-choam-nexus-modules-runtime.test.ts', 'tests/classic-nexus-skills-payments-runtime.test.ts', 'tests/classic-nexus-skills-battles-runtime.test.ts', 'tests/nexus-skills-modules-payments-runtime.test.ts', 'tests/nexus-skills-modules-battles-runtime.test.ts', 'tests/paired-ix-nexus-skills-modules-runtime.test.ts', 'tests/paired-choam-nexus-skills-modules-runtime.test.ts', 'tests/ecaz-nexus-skills-modules-runtime.test.ts', 'tests/moritani-nexus-skills-modules-runtime.test.ts', 'docs/NEXUS_CARD_RULES.md', 'tests/nexus-tleilaxu-revival.test.ts', 'tests/fixture-nexus-tleilaxu-secret-ally.ts', 'tests/nexus-tleilaxu-secret-ally-runtime.test.ts', 'tests/nexus-borrowed-voice.test.ts', 'tests/fixture-nexus-borrowed-voice.ts', 'tests/nexus-borrowed-voice-runtime.test.ts', 'tests/nexus-fremen-protection.test.ts', 'tests/fixture-nexus-fremen-protection.ts', 'tests/nexus-fremen-protection-runtime.test.ts', 'tests/fixture-stronghold-factions.ts', 'tests/fixture-nexus-advisor-fresh.ts', 'tests/nexus-advisor-fresh-runtime.test.ts', 'tests/fixture-nexus-advisor-storm.ts', 'tests/nexus-advisor-storm-runtime.test.ts', 'docs/NEXUS_ADVISOR_RUNTIME.md', 'tests/nexus-fremen-free-quota.test.ts', 'tests/fixture-nexus-fremen-free-quota.ts', 'tests/nexus-fremen-free-quota-runtime.test.ts', 'tests/nexus-fremen-revival.test.ts','tests/nexus-emperor-payment.test.ts','tests/fixture-nexus-emperor-payment.ts','tests/nexus-emperor-payment-runtime.test.ts','docs/NEXUS_EMPEROR_RULES.md', 'tests/nexus-emperor-extra-source.test.ts', 'tests/nexus-emperor-extra-continuation.test.ts', 'tests/fixture-nexus-emperor-extra.ts', 'tests/nexus-emperor-extra-runtime.test.ts', 'tests/fixture-single-nexus-e1.ts', 'docs/NEXUS_EMPEROR_SECRET_ALLY_RUNTIME.md', "tests/fixture-nexus-emperor-seller.ts", "tests/nexus-emperor-seller-purchase.test.ts", "tests/nexus-emperor-seller-runtime.test.ts", "tests/fixture-nexus-emperor-ambassador.ts", "tests/nexus-emperor-ambassador-purchase.test.ts", "tests/nexus-emperor-ambassador-runtime.test.ts", "tests/fixture-nexus-emperor-special.ts", "tests/nexus-emperor-special-purchase.test.ts", "tests/nexus-emperor-special-runtime.test.ts", "tests/karama-intents.test.ts"]},
],
},
{