Skip to content

Commit 40d52cc

Browse files
committed
reconcile: contract the concept check's third finding and the lifecycle- reservation
Test-SpecSet.ps1 raises a concept finding when a lifecycle- region names something outside the derived concept set, and S6.5 tests it, but the contract's Checks table listed only two concept rows and Authored records said stateless mechanisms are 'judged on the full-audit path' - which reads as the checker staying out of the way. - 20-contract.md: the third finding row, and the rule that the lifecycle- vocabulary is reserved to the derived set, on SS15's precedent and for the same reason No new SS id: an id is assigned once, and the row plus the sentence already bind. Decision recorded in 90-decisions.md and design/state/decisions/.
1 parent dccbc6f commit 40d52cc

4 files changed

Lines changed: 51 additions & 0 deletions

File tree

design/20-contract.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,14 @@ judged on the full-audit path. This bounds the fourth brief condition to somethi
157157
the index; the broad reading is not enumerable mechanically at all, and a check that cannot know
158158
what is missing does not check completeness.
159159

160+
**The `lifecycle-` vocabulary is reserved to the derived set, and a region naming anything else
161+
is a finding** — SS15's rule one check over, and for the same reason. A stateless mechanism's
162+
lifecycle is documented in ordinary prose, which is where the full-audit path reads it; a marked
163+
region is how a *checked* obligation is declared, and one naming a subject no check can enumerate
164+
declares nothing. What the reservation actually buys is the misspelling: `lifecycle-PlayerStat`
165+
is otherwise an orphaned region that every check silently skips, on a document the report then
166+
calls clean.
167+
160168
### Content path records
161169

162170
Nine record classes, five authored and four derived, and the authored/derived split answers the
@@ -754,6 +762,7 @@ A check produces findings, not errors. Findings yield `State = 'Invalid'`, exit
754762
| `provisional` | A provisional site has no register row, or a register row has no site |
755763
| `concept` | A state-bearing concept has no `lifecycle-` region |
756764
| `concept` | A lifecycle region states creation but not retirement, or retirement but not creation |
765+
| `concept` | A `lifecycle-` region names something outside the derived concept set |
757766
| `reference` | A section or document reference resolves to nothing |
758767
| `reference` | A cross-repository reference carries no pinned sha |
759768

design/90-decisions.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,33 @@ Append-only. Newest at the top. The rejected alternatives are the point — with
99

1010
---
1111

12+
### 2026-08-31 — The `lifecycle-` marker vocabulary is reserved to the derived concept set
13+
Context: `Test-SpecSet.ps1`'s concept check raises a third finding the contract's § *Checks* table
14+
does not list — a `lifecycle-` region whose name is outside the derived concept set — and S6.5
15+
tests it. § *Authored records* meanwhile says stateless mechanisms "are outside the derived
16+
concept set and are judged on the full-audit path", which reads as the checker staying out of the
17+
way for them, while the check next door fails the build on one. Two readings of one rule, with the
18+
code and the prose each holding a different half.
19+
Chosen: The contract gains the finding row and the rule behind it — the `lifecycle-` vocabulary
20+
is reserved to the derived set, a stateless mechanism's lifecycle is documented in ordinary prose
21+
where the full-audit path reads it, and a region naming anything else is a finding. This is SS15's
22+
rule one check over ("only a closed declaration may carry a mirror obligation") and is kept for
23+
the same reason: what the reservation actually buys is the misspelling. `lifecycle-PlayerStat` is
24+
otherwise an orphaned region every check silently skips, on a document the report then calls
25+
clean. No new `SS` id is minted for it — an id is assigned once and never renumbered, and the
26+
finding row plus the sentence already bind.
27+
Rejected: Deleting the third variant and its S6.5 test, which makes the contract true as written
28+
and lets an author put a stateless mechanism's lifecycle in a marked region. Rejected because it
29+
removes tested behaviour to match prose rather than the other way round, and because it buys that
30+
freedom by making the typo case silent — the mirror check flags "names a declaration that does not
31+
exist" for exactly this reason, and the two checks would then disagree about the same mistake.
32+
Also rejected: adding the row and leaving § *Authored records* alone — cheapest, and it leaves the
33+
sentence still reading as though the checker stays out of the way, which is the two-readings state
34+
this entry exists to end.
35+
Reversibility: cheap — one table row and one paragraph, and the deletion stays available.
36+
37+
---
38+
1239
### 2026-08-31 — CP2 and CP3 are scoped to production sources, and the CP3 check is tightened to match
1340
Context: `/reconcile` found CP3 ("Nothing in this repository reads a file under `content/`",
1441
Enforcement `Code`, Evidence `src/published-surface.test.ts`) broken in the tree:

design/state-index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ This document is a navigation view generated from `design/state/`. Edit the reco
159159
| decision/2026-08-30-the-game-content-path-enters-design-through-a-design-pass-before-it-is-contracted-or-sliced | `unit/document/design-10-design`, `unit/document/design-20-contract`, `unit/document/design-30-slices` |
160160
| decision/2026-08-31-a-length-narrowing-on-a-collection-field-is-cp10-compliant-s21-3-is-fully-met ||
161161
| decision/2026-08-31-cp2-and-cp3-are-scoped-to-production-sources-and-the-cp3-check-is-tightened-to-match ||
162+
| decision/2026-08-31-the-lifecycle-marker-vocabulary-is-reserved-to-the-derived-concept-set ||
162163
<!-- decision-affects:end -->
163164

164165
## Question affects
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# decision/2026-08-31-the-lifecycle-marker-vocabulary-is-reserved-to-the-derived-concept-set
2+
Date: 2026-08-31
3+
Anchor: 2026-08-31 — The `lifecycle-` marker vocabulary is reserved to the derived concept set
4+
Status: accepted
5+
6+
## Claim
7+
A `lifecycle-` region may name only a member of the derived concept set, and one naming anything
8+
else is a `concept` finding — the row is in `design/20-contract.md` § *Checks* and the rule in
9+
§ *Authored records*. A stateless mechanism's lifecycle is documented in ordinary prose, which is
10+
where the full-audit path reads it; a marked region declares a checked obligation, and one whose
11+
subject no check can enumerate declares nothing. The reservation's real value is that a
12+
misspelled concept name is a finding rather than an orphaned region every check skips on a
13+
document the report then calls clean. It is SS15's rule one check over, and carries no `SS` id of
14+
its own.

0 commit comments

Comments
 (0)