02-spec-rulings.md · non-normative

02 — Specification rulings, 2026-09-05

Twelve questions the implementation could not settle for itself, ruled and written into the specification.

This document is an index, not a source. Every ruling lives at the requirement it changed, with its reasoning attached; what follows is a list of what moved and where to look. It carries no normative text of its own on purpose — a second copy of a rule does not merely risk drifting from the first, it hides the disagreement, because each copy reads correctly in isolation. That is the failure EC-290 records and that C1 below finally cleared, and repeating it here to save a reader one hop would be a poor trade.

Status: applied at commits 8426b98 → 4ea0508. If you rely on any requirement listed here, re-read it.


The specification disagreed with itself

What was ruled Where it lives
A1 Duel takes a per-tier land ratio of 450‰, making its printed 8 cities true and the tier playable; Large corrected 120 → 119 GR-230, GR-1510 (01-game-rules.md)
A2 The sweep covers the four land roles, keeping the reference count of 86,016,000 over the prose "six" CB-2670 (11-combat.md)
A3 Isolated supply is its own row at +9/+5/+1; the procedure governs and the mirror table was the defect EC-960 (12-economy.md)
A4 The Terrain Record gains a City's works level, admitted at fidelity 3 GR-1140, GR-1260 (01-game-rules.md)
A5 The Attention catalogue opens to a twentieth class, Routed, with terms derived from CM-1740/1750/1760 CM-1720 (13-command.md)

The implementation read past the text

What was ruled Where it lives
B1 CM-380's three causes are exhaustive — a voluntary move is not displacement. Code follow-up applied 2026-09-07 (the displaced marker) CM-380 (13-command.md)
B2 grade and works are named in the fidelity ladder, which admitted them without saying so GR-1260 (01-game-rules.md)
B3 Capture prediction tests the capture capability, as the resolver always has CB-2210 (11-combat.md)
B4 The post-fight Assessment hold waits for its consumer; building it now ships state nothing reads CB-2320 (11-combat.md)

Recorded, and now paid

What was ruled Where it lives
C1 The roster stops pricing the auxiliaries — the duplicate is deleted, not reconciled §8.2 (02-units-and-industry.md), EC-290
C2 The ownership instrument is replaced by support-normalised CIEDE2000; both thresholds stay provisional until Phase 2 ART-1135 (02-terrain.md), UX-215 (04-ui-ux.md)
C3 Art citations name their document; enforced by pnpm check-art-refs, ratcheting from 38 open question 3 (04-decisions.md)

Ruled while authoring the roster

Two more, on 2026-09-05, found by the unit-set validator the moment it was pointed at the shipped tier-1 roster — which is the argument for building a validator before its data.

What was ruled Where it lives
D1 A bombarding class must engage some domain, not land specifically: three warships bombard while engaging sea alone, and US-240 already gates targets by domain for every attack US-390 (02-units-and-industry.md)
D2 zoc and mayOccupyCity are schema fields no table of §8 assigns; the shipped values are stated — zoc true for the Infantry, Field Gun and Militia, mayOccupyCity true throughout §8.1 (02-units-and-industry.md)

Where measuring changed the answer

Three of the twelve moved when the recommendation was tested before being applied. They are listed together because the pattern is the point: each looked settled on reading and was wrong on measurement.

What the rulings now require

  1. Calibrate the two ownership thresholds in Phase 2, then choose the palette — in that order, since the palette would be chosen against the measure. Calibrate by showing real scenes to readers and finding where the mechanical score stops predicting correct identification; ART-610 is authoritative. No sprite needs re-tinting whatever is chosen: the shipped cells are tint-mask bases and seat colours are substituted at render time.
  2. Carry works through the world increment — applied 2026-09-07: the Terrain Record carries the works level (admitted at fidelity 3, null otherwise, as of the observation turn), its canonical encoding and the fog refresh have the field, and CB-2310's predictions read it through the knowledge ClashView.
  3. Narrow ReturnToPost to CM-380's three causes — applied 2026-09-07: the persisted displaced marker on the unit, hashed state, set by a Reflex's route, a retreat or rout, or an external effect, cleared on landing on the assigned post.
  4. Qualify the 38 ambiguous art citations — the ratchet stops new ones; these need reading one at a time to say which document each meant.

Not ruled

Fifteen further readings are recorded in SESSION.md as interpretations of silence rather than conflicts. They need no ruling unless challenged, and are listed there rather than here so that this document stays a record of things that changed.


Owner scheduling ruling, 2026-09-19

What was ruled Where it lives
E1 Signed turn-bundle file play is retained but moves from Phase 5 launch scope to Phase 7. Server-hosted correspondence stays in Phase 5. Bundle-specific work is barred before the Phase 5 exit except where shared container, replay, signing, encryption or verification machinery independently serves the current phase. This changes scheduling, not the MP-750–MP-880 feature contract. 00-overview.md §3.2 and open question 7; 05-multiplayer.md §§9–10; 09-roadmap.md §§2.6, 2.8 and 3

The learning game against VC-960, 2026-09-24

What was ruled Where it lives
L1 UX-1300's learning game (Standard War on a Small map) raised VC-960's L3 on its own Terms, because Standard War's Dominion runs a Vigil of 3 and the Small map has 19 cities. The learning game runs Standard War with Dominion's Vigil at 2, carried as a visible override. That is the one change, and it lints clean. UX-1300's ruling note; client/src/setup/model.ts's learningDraft

What the victory readout publishes, 2026-09-25

What was ruled Where it lives
P1 The Standing is public, as VC-2390's Board and VC-2750's Verdict already require. A rival's held-city count is not. It is Dominion's exact progress over the public MAP_CITIES (VC-900, VC-920), so it reaches another player only as Dominion's published value. The client's Standing table prints a rival's count as "not published". The projection's field is a core follow-up. VC-2180's ruling note; client/src/victory/Standing.tsx
P2 DECIDED holds for an unbroken run of Seals and names the run's first Seal. While the live field is unchanged VC-2620's bound only tightens, so the mark lapses only when the decided player leaves the live field. It is then withdrawn, and a later run is named from its own first Seal. The establishing turn is derivable from the Seal records. VC-1380's ruling note; core/src/victory/elimination.ts (core follow-up)
P3 Replenish fires at the third consecutive Isolated phase, not the first (isolatedTurns ≥ 3, EC-1740); the restore threshold stays Supplied. Under the first-phase reading no unit could spend any of EC-1740's budget, so on a Small map, where the nearest cities lie beyond a city's supply, no first capture was reachable without a Depot carried out first, by the AI or by a person. Measured patched into the compiled core: stuck Small seeds took their first city, AI panel 53/0 → 53/1, ai-passive unchanged; two phases read 51/1. CM-2180's ruling note (amends the 2026-09-21 reading); core/src/world/knowledge.ts (core follow-up, moves hashes)

Owner-delegated rulings, 2026-09-26

The owner asked for these to be decided rather than left open: R1–R3 in the morning, R4 when its measurements were in. Each lives at the place it changed.

What was ruled Where it lives
R1 The version axes start at the first release candidate (the Phase 3 exit), not before. RulesVersion and the AR-350 randomness version stay at 1 through development and playtest, and rules changes are carried by re-emission; at the release candidate both start and AR-890's historical rules modules are kept from that build on. Meanwhile a save records its state hash and a reopened save that no longer reaches it says so. AR-890 (03-architecture.md §13); AGENTS.md, Open findings
R2 Requirement ids are not player text. Controls, notices, panels, tooltips, the report, the Dispatch, the playback and the wizard carry none; Help and the Encyclopedia may keep a folded "Where this is in the rules" line, and developer surfaces behind their own setting keep theirs. A client test holds it. UX-1360 (04-ui-ux.md)
R3 The human-facing AI measure leads. An AI change is kept when ai-passive is no worse on its nine and twenty-five games and better on at least one, the panel's decided count does not fall, and its cities held fall by no more than a tenth. A correctness fix that moves none of the three numbers is kept (clarified 2026-09-26, the garrison-class tie). AGENTS.md, Open findings (project process, not specification)
R4 A captured city needs one soldier, held longer by a bigger city (EC-1170): Town 1,1,1,0,0,0; City 1,1,1,1,0,0; Metropolis 1,1,1,1,1,0 across the Integration bands, replacing 2/4/6 at Integration 0. EC-1160 measured 73% of captures revolting against a target under 5%, nearly all never garrisoned; the new rows read 7.7%, every loss a garrisoned city lost under pressure, with the AI panel at 68 / 3 from 45 / 1. Core follow-up owed (moves hashes). 12-economy.md, under EC-1170

Built from source 47fa2827eff0 · VERSION.json