You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Contract § Invariants — state the cross-cutting set as C1–C20 (#445)
§ Invariants named six families — determinism, envelope ownership, projection,
migration, validation, identifiers — and stated none of them, delegating to Core
Specification. The repository's only assertable invariants were the 19 in two
section-scoped blocks (§7.1's P1–P8, §7.4's L/D/B/A); all six named families had
zero. Delegation to a section that does not carry the statement leaves the
invariant unowned.
Twenty statements, each derived from something 10-design.md or Core Specification
already fixes, in the existing house style. Every one closes with an enforcement
clause, because the four that hold only by instruction — C6 envelope ownership,
C13 migration, C18 id stability, C19 opaque gameId/seed — are the ones a reader
must not trust without checking. C6 cites the five-instance ledger.
The projector's `invariants` marked region is deliberately still absent: with no
Invariant records under design/state/ it would render an empty table and arm
ProjectionStale over content nothing produces. Recorded in 90-decisions.md,
alongside what adopting the projection properly would cost.
Outside every human-doc block, so no page changes; guide digest re-stamped.
Copy file name to clipboardExpand all lines: design/90-decisions.md
+10Lines changed: 10 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1445,3 +1445,13 @@ Context: adopting `design/state-index.md` (above) immediately fired the exact re
1445
1445
Chosen: point the guard at `design/state/units`, matching `Test-DesignState.Tests.ps1` and `Update-DesignProjection.Tests.ps1` line for line, and rewrite the comment block that justified the old target. The guard's question is "has this repository adopted unit records," and `S4.6` reads unit records; `design/state/units` answers it directly where both `design/state/` and `design/state-index.md` are now proxies falsified by the work mirror and its projection respectively. All three guards agree again. Verified in both directions: the failure was observed with the old target before the change, and `tools/` returns to 324 passed / 0 failed / 35 skipped after it.
1446
1446
Rejected: **Creating `design/state/units/` records so the assertion passes** — the unscoped-feature-adoption rejection of 2026-08-21 and 2026-08-24, unchanged; `S4.6` demands a specific closure this repository has no use for. **Reverting `design/state-index.md`** — would trade a real, asked-for artifact for a stale guard. **Leaving the suite red** — a red gate that everyone knows is red stops being a gate.
1447
1447
Reversibility: cheap — one `Test-Path` target and its comment, reverted by pointing it back. Note for the next `/kit-sync`: this file is now divergent from the kit on this line again, deliberately, and the reasoning is here rather than in the diff.
1448
+
1449
+
### 2026-09-05 — `20-contract.md` § Invariants states the cross-cutting set as prose; the projector's `invariants` region stays unwritten
1450
+
1451
+
Context: `/contract` was invoked for "the invariants region", which resolves two ways. `tools/Update-DesignProjection.ps1:363` targets an `invariants` marked region in `design/20-contract.md`, rendering `Invariant` records from `design/state/`; the 2026-09-05 entry recording `design/state-index.md` as deliberately absent said writing a region "belongs to `/design` or `/contract` if it is wanted"; that entry has since been superseded for `state-index.md`, which #444 adopted the same day — but expressly not for this region, which #444 left unwritten on the same arithmetic reached here independently: "with zero `Invariant` records it would insert an empty machine-owned table into prose the Core Specification owns." Separately, `/contract` calls § Invariants "the highest-value section in the document," and this repository's copy was four lines of pure delegation: it named six cross-cutting families — determinism, envelope ownership, projection, migration, validation, identifiers — and stated none of them. The repository's only assertable invariants were the 19 in two section-scoped `#### Invariants` blocks (§7.1's P1–P8, §7.4's L1–L3/D1–D3/B1–B3/A1–A2), both added by recent slices. Every one of the six named families had zero.
1452
+
1453
+
Chosen: author § Invariants as twenty numbered statements, `C1`–`C20`, grouped under the six families and written in the existing house style — a bolded lead naming the maintaining module, then one bullet per invariant closing with an italic enforcement clause. Each is derived from a statement `10-design.md` or Core Specification already fixes; none is new behaviour. The section opens by declaring itself the cross-cutting set only, and names the two section-scoped sets rather than restating them. `C6` — the envelope-ownership invariant — is stated as *enforced by instruction only*, citing `CLAUDE.md`'s five-instance ledger, because a reader is entitled to know which of these hold by construction and which hold only while an author remembers them; that distinction is what the enforcement clause exists to carry, and `C6`, `C13`, `C18` and `C19` are the four that fail it.
1454
+
1455
+
Rejected: **Adding the `invariants:start`/`:end` markers** — the literal reading, and rejected on its own arithmetic: with zero `Invariant` records under `design/state/`, `Get-InvariantsProjectionContent` renders a bare table header with no rows and no `_(no … records yet)_` placeholder, unlike its six siblings, so the section's highest-value content would become an empty table. It would also newly arm `ProjectionStale` as a blocking finding on every `/track` — a gate over content nothing produces — and reverse the judgement #444 reached independently the same day. **Adopting the projection properly**, writing an `Invariant` record per statement so the table is machine-checked against records, is the version worth having and is not foreclosed: it needs the records and the region, and it is `/design`'s call whether this repository keeps `Invariant` records at all. #444 adopted the projection for `state-index.md` while declining exactly this region, so the mechanism is now in use here and only its invariant arm is unwired — which lowers the cost of adopting it later rather than raising it. **Leaving § Invariants as delegation** — rejected because delegation to a section that does not carry the statement is not single ownership, it is an unowned invariant.
1456
+
1457
+
Reversibility: cheap. Ninety-three lines in one canonical section, no type, signature, behaviour, test, or generated page changed — the section sits outside every `human-doc` block, so it publishes nowhere and only the guide's design digest was re-stamped. Adopting the projection later replaces this prose with records and a region, and the `C`-prefix is free for that: it collides with no existing invariant id.
0 commit comments