feat(#58): trade & embargoes — TurnResult.economy ops (trade/embargo, declare/lift) with a deterministic per-turn effect and war auto-suspension
CI / build + unit + e2e (pull_request) Successful in 2m3s

This commit is contained in:
2026-10-15 17:26:24 +00:00
parent ed91735c8a
commit b5ea8ba5a4
15 changed files with 776 additions and 23 deletions
+21
View File
@@ -52,6 +52,21 @@ export interface StubPayload {
* deterministicTurn), so the hybrid path is covered by unit tests only.
*/
relations?: Record<string, RelationStatus>;
/**
* (v0.35.0, #58) The currently active bilateral trade agreements
* (`{ a, b }` nation-id pairs), emitted by the engine's user prompt. The
* stub ignores this field — it never declares, lifts or suspends a trade
* (see deterministicTurn), so the trade path is covered by unit tests only.
*/
trades?: Array<{ a: string; b: string }>;
/**
* (v0.35.0, #58) The currently active unilateral embargoes
* (`{ from, target }` nation-id pairs), emitted by the engine's user
* prompt. The stub ignores this field — it never imposes, lifts or
* suspends an embargo (see deterministicTurn), so the embargo path is
* covered by unit tests only.
*/
embargoes?: Array<{ from: string; target: string }>;
}
function truncate(s: string, n: number): string {
@@ -103,6 +118,11 @@ function truncate(s: string, n: number): string {
* (v0.34.0, #57) The stub likewise NEVER runs a hybrid / covert op (it always
* returns `hybrid: { ops: [] }`) — the hybrid-war path is covered by unit
* tests only, keeping the e2e assertions untouched.
*
* (v0.35.0, #58) The stub likewise NEVER declares, lifts or suspends a trade
* or an embargo (it always returns `economy: { trade: [], embargo: [] }`) —
* the trade & embargo economy path is covered by unit tests only, keeping
* the e2e assertions untouched.
*/
export function deterministicTurn(p: StubPayload): TurnResult {
const state = p.state;
@@ -172,6 +192,7 @@ export function deterministicTurn(p: StubPayload): TurnResult {
takeovers: [], // the stub never performs a takeover (see doc comment)
wars: { declare: [], end: [] }, // the stub never declares/ends wars (see doc comment)
hybrid: { ops: [] }, // the stub never runs hybrid/covert ops (see doc comment)
economy: { trade: [], embargo: [] }, // the stub never touches trades/embargoes (see doc comment)
markers: { add: [], remove: [] }, // the stub never touches markers (see doc comment)
};
}