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
reconcile: reject a projected marker in the corpus, and check form per root
20-contract.md claimed the index raises DuplicateRegionId when an id appears in both
marker forms 'anywhere in the repository'. Nothing enforced it for the corpus, and the
gap was live: dropping ':declared:' from both markers of mirror-AttributeState made the
region invisible and the run still reported Valid, exit 0, with the obligation guarding
the wisdom defect silently gone.
A both-forms rule would not have caught that - the id never appears in declared form -
so the rule is that a projected marker in the corpus is MalformedRegion at all. The
corpus has no projector: SS1 makes every module read-only.
- Read-SpecSet.ps1: the pattern gains the projected form; seeing one fails the run
- Read-SpecSet.Tests.ps1: the typo is rejected, the declared form still accepted
- 20-contract.md: both sites narrowed to what is checked, and the half that stays open
named - an id declared in the corpus and projected outside it, which CP9 puts beyond
the spec-set checker and the glob table puts beyond IdCollision
Decision recorded in 90-decisions.md and design/state/decisions/.
Copy file name to clipboardExpand all lines: design/20-contract.md
+24-4Lines changed: 24 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -480,8 +480,12 @@ Authors write these; no code declares them, so this is their only home. The four
480
480
*Authored records* above. Binding on the corpus:
481
481
482
482
- A region's opening and closing markers must match and must not nest.
483
-
- A `(document, id)` pair must be unique, and one id must not appear in both marker forms anywhere
484
-
in the repository.
483
+
- A `(document, id)` pair must be unique within the corpus.
484
+
-**Every region in the corpus is declared, and a projected marker anywhere in it is a finding.**
485
+
The corpus has no projector — SS1 makes every module read-only — so a rendered region cannot
486
+
legitimately appear here, and treating one as merely unrecognised is how an obligation
487
+
disappears without trace: drop `:declared:` from both of a region's markers and the region
488
+
ceases to exist, the obligation with it, on a run that still reports `Valid`.
485
489
- A region must have a non-empty body.
486
490
-`provisional-register` occurs exactly once across the whole corpus.
487
491
@@ -742,10 +746,26 @@ clean. A declaration the index skipped is a declaration no check examined.
742
746
|---|---|---|
743
747
|`UnreadableDocument`| A corpus file cannot be opened or decoded as UTF-8 | Fix the file; check encoding, per `agent.md` on CP1252 imports |
744
748
|`UnknownDeclarationForm`| A fence contains a construct the restricted grammar does not accept | Extend the grammar, or rewrite the declaration into a known form |
745
-
|`MalformedRegion`| A marker is unclosed, mismatched, or nested| Fix the markers |
746
-
|`DuplicateRegionId`| A `(document, id)` repeats, or one id appears in both marker forms anywhere in the repository| Rename one region or make the form consistent|
749
+
|`MalformedRegion`| A marker is unclosed, mismatched, nested, or written in the projected form, which the corpus has no writer for| Fix the markers |
750
+
|`DuplicateRegionId`| A `(document, id)` repeats within the corpus| Rename one region |
747
751
|`CorpusNotFound`|`-CorpusPath` does not resolve to a directory | Fix the invocation |
748
752
753
+
**`MalformedRegion` covers the projected form as well as the unbalanced ones, and the name
754
+
reading narrower than what it checks is the price** — paid deliberately, for the third time in
755
+
this document, on the reasoning that widened `AnchorMissing` and `EnforcementUnevidenced` rather
756
+
than splitting them: the check, the remedy, and the reason are the same in every case, and a
757
+
second reason would have split one rule across two names for nothing.
758
+
759
+
**What this does not reach, stated rather than left to be found: an id declared in the corpus and
760
+
projected outside it.**`AGENTS.md` § *Marked regions* makes form consistency repository-wide and
761
+
`90-decisions.md` (2026-08-21, marked-region identity) settled it, but no checker applies it
762
+
across both roots. `IdCollision` enforces it over the design-state document set, which
763
+
§ *Artifacts of a unit kind* never resolves into `docs/docs/games/`; the spec-set checker cannot
764
+
reach the other direction either, because CP9 keeps it to exactly one corpus root and widening
765
+
that is a contract amendment rather than a slice's call. The exposure is small and worth naming:
766
+
the corpus's ids are `mirror-`, `provisional-`, `lifecycle-` prefixed and nothing outside it
767
+
projects under those names. The rule stands; what is checked is each root against itself.
768
+
749
769
`UnknownDeclarationForm` becoming frequent is the countable condition that reverses
750
770
`90-decisions.md` (2026-08-20, restricted grammar). When status 2 stops meaning "look at this" and
751
771
starts meaning "run it again", the real parser has become correct.
0 commit comments