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.
- A1 — Duel. The recommendation was to amend the city count 8 → 7. Computing all five rows found
a second wrong figure (
Large 120 against a derived 119), and then that 450‰ is the lowest land
ratio that both generates and lands Duel on exactly the 8 already printed. The smaller change made
the table true instead of accurately describing a broken tier.
- C3 — the art collision. The recommendation was one renumbering pass. The collision is far worse
than reported — 96 identifiers defined twice — but of 1,631 citations only 39 are genuinely
ambiguous; 992 sit in the defining document and 197 resolve. Renumbering 96 to repair 39 would
rewrite every reference in the log, the history and the art bundle's metadata with nothing to catch
the breakage.
- C2 — the ownership measure. Ruled wrong twice. First as "the threshold stands, the palette
is the defect"; the ceiling test disproved it, since black-on-white against white-on-black reaches
only 0.155 against a threshold of 0.25, so no palette could satisfy it. The asset team, asked about
the instrument rather than the colours, proposed the support-normalised CIEDE2000 score that is now
normative. It was verified before adoption: a CIEDE2000 implementation conformant to the Sharma
reference set (max error 4 × 10⁻⁵) reproduces their figures — foreground separation 41.5,
background 13.1, weakest asset 32.7 against their reported 32.8.
What the rulings now require
- 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.
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.
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.
- 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