P13-S26 amendment 3 RATIFIED; test 3 to be clause-scoped
Execution measured that pin 4a claims more than test 3 delivers. M12's first
application deleted the ordering referent from the requirement's normative
clause and left it standing in the closing recap; test 3 stayed green, because
it asserts phrase presence over the whole requirement block. A referent can
therefore leave the sentence where it does normative work and survive anywhere
else in the block.
Two repairs were available. Softening pin 4a to promise only what block-scoped
presence delivers would have made the contract honest and the guard no better,
leaving a measured escape undetected in a rung whose subject is documentation
drifting because nothing watches it. This amendment strengthens the guard
instead, so pin 4a's claim becomes true rather than smaller.
Test 3 will select the normative clause -- the sentence carrying the sole
\MUST{} -- and run all four assertions on that slice alone. The selector took
four rounds to get right and both halves of its start rule are load-bearing:
last ". " before the occurrence, falling back after the label only when there is
none. Revision B made the fallback unconditional, which would have handed M25 a
slice spanning label to recap containing every needle; revision C restored the
rule the fallback exists for.
Six signing mutations, one per step of the selector: M22 and M23 the referents'
clause scope, M24 the locality phrase, M25 the last-period rule, M26 the
fallback anchor, M27 the exactly-one-\MUST{} assertion. M27 closes the last open
item -- an assertion specified without asking what would exercise it -- and it is
the only mutation that varies which clause is chosen rather than what the clause
contains. Each carries a complete before/after requirement block so it applies
literally.
The section is an additive override: pin 4a and section 3 are frozen and are not
rewritten, the mutations are section 8's rather than inserted into section 3's
table, and the annex's 38/38 matrix is preserved with M22-M27 evidence appended.
Execution touches rows 4, 6, 7 and 8 only; core_spec.tex is not touched, because
the requirement's text was always correct and only the guard was weak.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ps1szk2mSfgp4Cz21eVH9x
This commit is contained in:
parent
96f6ede268
commit
7c8a30d282
|
|
@ -2084,3 +2084,446 @@ amendment is repairing. The category — §6's lifecycle statements — is what
|
|||
No implementation target is touched. `core_spec.tex`, `invariants.rs`, the
|
||||
ledger and the guard file remain untouched at `01c621d`. Execution resumes at
|
||||
pin 3 with amendment 1's shape unchanged.
|
||||
|
||||
---
|
||||
|
||||
## §8. AMENDMENT 3 — TEST 3'S CLAUSE SCOPE, POST-EXECUTION
|
||||
|
||||
STATUS: RATIFIED; DISPATCHED to clause-scope test 3.
|
||||
|
||||
**Ratified 2026-08-11 on the authority of the repository owner**, review round 4
|
||||
returning zero findings. The rung landed at `eddf6e9`; **this amendment does not
|
||||
reopen it.** The amended surface is executed, not edited; a further defect is its
|
||||
own amendment with its own review round.
|
||||
|
||||
**§8 is an ADDITIVE OVERRIDE.** Pin 4a and §3 are **not rewritten in place** —
|
||||
they are frozen and were executed. Where §8 conflicts with pin 4a's claim about
|
||||
what test 3 buys, **§8 governs from its ratification**; where it adds mutations,
|
||||
they are §8's, listed here, not inserted into §3's table.
|
||||
`spec/EVIDENCE_P13S26_EXECUTION.md`'s 38/38 matrix is a historical record of
|
||||
what execution measured and **is preserved unchanged**; M22–M27 evidence is
|
||||
*appended* as its own section.
|
||||
|
||||
### REVISION D — review round 4. One blocking finding. ACCEPTED.
|
||||
|
||||
1. **[P1] The exactly-one-`\MUST{}` assertion had no signature.** It is step 1
|
||||
of 8.3 and every earlier mutation varies the clause's *contents*, so none of
|
||||
them reaches it. **Fixed** — **M27** leaves the normative sentence unchanged
|
||||
and adds a second `\MUST{}` to the recap: a correct implementation fails the
|
||||
count before selection begins, while one that silently takes the *first*
|
||||
occurrence selects the original sentence and passes every clause assertion.
|
||||
*This closes the last item §8.6 carried open, and it was an open item because
|
||||
I had specified an assertion without asking what would exercise it.*
|
||||
|
||||
### REVISION C — review round 3. Four blocking findings, one smaller. ALL ACCEPTED.
|
||||
|
||||
1. **[P1] §8.3 and M25 contradicted each other.** Revision B made the clause
|
||||
start *always* fall after the label; under M25 that produces one slice
|
||||
running from the label through the recap, containing all four needles, so
|
||||
**M25 would have passed**. **Fixed** — the selector is restored to *last
|
||||
`". "` before the occurrence, falling back after the label only when there is
|
||||
none*, which is what makes M25 discriminate. *Revision B fixed the fallback
|
||||
and broke the rule it was a fallback for.*
|
||||
2. **[P1] The fallback had no signature.** Nothing failed if an implementation
|
||||
anchored the start at the block instead of after the label. **Fixed** —
|
||||
**M26**, the only mutation in the set that can tell those two
|
||||
implementations apart.
|
||||
3. **[P1] M24 and M25 were not verbatim**, using prose and ellipses for their
|
||||
recap edits while §8.4 claimed source blocks. **Fixed** — every mutation now
|
||||
carries complete fenced before/after blocks for the whole requirement.
|
||||
4. **[P1] Revision A's fourth finding fell below revision B's heading**, leaving
|
||||
revision A reading as three findings and a stray second item 4. **Fixed** —
|
||||
both historical records are accurate again.
|
||||
5. **[P2] M24 and M25 did not propagate into the live summaries.** The preamble
|
||||
said "M22/M23 evidence", 8.4 opened with "Both", and its closing credited
|
||||
only M22/M23. **Swept to M22–M26**, with no numeric total stated; row 8 and
|
||||
gate 7 likewise.
|
||||
|
||||
### REVISION B — review round 2. Three blocking findings, one smaller. ALL ACCEPTED.
|
||||
|
||||
1. **[P1] The clause start did not select a sentence.** The normative sentence
|
||||
is *first* in the requirement, so no preceding `". "` exists and the fallback
|
||||
silently started the slice at `\begin{requirement}`, swallowing the label.
|
||||
**Fixed** — the fallback is anchored **after the `\label{…}` argument**.
|
||||
*(Revision B over-applied this to every case; revision C item 1 corrects it.)*
|
||||
2. **[P1] Locality and normative force lacked symmetric scope mutations.** A
|
||||
faulty implementation could clause-scope `ordering` and `bounds` while
|
||||
searching the whole block for `same region` and `\MUST{}`, and M11, M16, M22
|
||||
and M23 would all behave as pinned. **Fixed** — **M24** and **M25**.
|
||||
3. **[P1] The ratification literal claimed implementation too early.**
|
||||
`RATIFIED. Test 3 clause-scoped; DISPATCHED.` is false for the whole interval
|
||||
between ratification and execution. **Fixed** — prospective wording.
|
||||
4. **[P2] M22 was described as the exact mutation previously run.** The annex
|
||||
records a *partial referent deletion*, not this sentence replacement.
|
||||
**Fixed** — M22 *reproduces* the measured escape.
|
||||
|
||||
### REVISION A — review round 1. Four blocking findings. ALL ACCEPTED.
|
||||
|
||||
1. **[P1] M22 was not literally executable** — it wrote `\n` as two Markdown
|
||||
characters where a LaTeX source line break was meant. **Fixed**: fenced
|
||||
source blocks and grammatical sentence replacements.
|
||||
2. **[P1] M22 alone did not sign both referents' clause scope.** An
|
||||
implementation could scope `ordering` to the normative sentence and keep
|
||||
checking `bounds` over the whole block: M13 would still fail, M22 would still
|
||||
pass, and the asymmetry would ship. **Fixed** — **M23**.
|
||||
3. **[P1] The execution and lifecycle surface was incomplete.** **Fixed** in
|
||||
8.5: rows 4, 6, 7 and 8, with §8's own status transitions pinned.
|
||||
4. **[P1] "Sentence containing `\MUST{}`" was under-specified**, leaving an
|
||||
implementation free to take the first match or widen back to the block.
|
||||
**Fixed** in 8.3 with an exactly-one assertion and explicit boundary rules.
|
||||
|
||||
**Rulings adopted:** the same-sentence rule stands and is deliberate — it guards
|
||||
the *current* normative construction, and a semantically valid multi-sentence
|
||||
rewrite **should** fail and force deliberate guard review. M23 added.
|
||||
|
||||
**Round 1 also corrected a false premise of mine:** §8.6 asked whether all three
|
||||
tests should share normalisation by construction. **Test 2 does not normalise at
|
||||
all** — it parses raw Rust lines with `strip_prefix("/// ")`. Only **tests 1 and
|
||||
3** share `normalise`.
|
||||
|
||||
### 8.1 The finding — measured, not reasoned
|
||||
|
||||
Pin 4a says test 3 buys that *"neither referent, nor the locality claim, nor the
|
||||
requirement's normative force can silently leave"*.
|
||||
|
||||
**M12's first application disproved the first clause.** The `ordering` referent
|
||||
was deleted from the requirement's **normative clause** — the sentence carrying
|
||||
the `\MUST{}` — and left standing in the closing recap. **Test 3 stayed green.**
|
||||
Transcript: `spec/EVIDENCE_P13S26_EXECUTION.md` §6(b).
|
||||
|
||||
The cause is structural: test 3 asserts phrase presence over the **whole
|
||||
requirement block**, so a referent that leaves the sentence where it does
|
||||
normative work survives anywhere else in the block.
|
||||
|
||||
### 8.2 Disposition: strengthen the guard, do not soften the claim
|
||||
|
||||
Softening pin 4a to promise only what block-scoped presence delivers would make
|
||||
the contract honest and the guard no better, leaving a measured escape
|
||||
undetected in a rung whose subject is documentation drifting because nothing
|
||||
watches it. **§8 strengthens test 3 instead**, so pin 4a's claim becomes true
|
||||
rather than smaller.
|
||||
|
||||
### 8.3 The strengthened test 3 — clause selection, specified
|
||||
|
||||
Test 3 slices the requirement block as now, in text normalised by the existing
|
||||
`normalise` helper (whitespace runs collapsed to one space), then:
|
||||
|
||||
1. **Assert exactly one `\MUST{}`** occurs in the normalised block. More than
|
||||
one and the clause is ambiguous; none and the requirement has no normative
|
||||
force. *This assertion exists so no implementation may silently take the
|
||||
first match.*
|
||||
2. **Select the clause** around that single occurrence, at position `p`:
|
||||
- **start** — the character after the **last occurrence of `". "` at or
|
||||
before `p`**; **only if there is none**, the character after the block's
|
||||
`\label{…}` argument. Both halves are load-bearing. The fallback is needed
|
||||
because the normative sentence is *first* in this requirement, so no
|
||||
preceding `". "` exists and a block-start default would swallow the label,
|
||||
which is not a sentence. The last-period rule is needed because M25 moves
|
||||
`\MUST{}` into a later sentence, and an unconditional fallback-after-label
|
||||
would then return one slice spanning label to recap — containing every
|
||||
needle, and passing.
|
||||
- **end** — the character after the first `". "` at or after `p`, taking the
|
||||
period; if there is none, the block end.
|
||||
3. **Run all four assertions on that slice, and on nothing else:** it names
|
||||
`ordering`, names `bounds`, states `same region`, and carries `\MUST{}`.
|
||||
|
||||
The recap sentence is out of scope, which is the whole of the measured gap.
|
||||
|
||||
**Test 3 remains phrase presence**, and weaker than tests 1 and 2, which compare
|
||||
exact sets. What changes is *where* the phrases must appear.
|
||||
|
||||
**Normalisation is shared with test 1 only.** Test 2 reads raw Rust source line
|
||||
by line and never normalises; the `.tex` side needs it because that source is
|
||||
hard-wrapped and a clause spans lines.
|
||||
|
||||
### 8.4 The signing mutations
|
||||
|
||||
Each is a replacement of the **whole requirement block**, given verbatim so it
|
||||
can be applied literally. `spec/core_spec.tex` is otherwise untouched.
|
||||
|
||||
**M22 — the `ordering` escape, made into a signature.** `ordering` leaves the normative clause and survives in the recap.
|
||||
|
||||
*Before* — the requirement as landed at `eddf6e9`:
|
||||
|
||||
```latex
|
||||
\begin{requirement}
|
||||
\label{req:time:aleatoric-reference-locality}
|
||||
Every event referenced by an aleatoric region's \texttt{ordering}
|
||||
DAG, and every event used as a key in its \texttt{bounds} map,
|
||||
\MUST{} be an event of that same region. Naming an event that does
|
||||
not exist is a dangling reference, governed by graph
|
||||
invariant~10; naming an event that exists in a \emph{different}
|
||||
region is a distinct defect, and this requirement is what forbids
|
||||
it. Neither the ordering DAG nor the bounds map may reach outside
|
||||
the region whose time model declares them.
|
||||
\end{requirement}
|
||||
```
|
||||
|
||||
*After:*
|
||||
|
||||
```latex
|
||||
\begin{requirement}
|
||||
\label{req:time:aleatoric-reference-locality}
|
||||
Every event used as a key in an aleatoric region's \texttt{bounds}
|
||||
map \MUST{} be an event of that same region. Naming an event that does
|
||||
not exist is a dangling reference, governed by graph
|
||||
invariant~10; naming an event that exists in a \emph{different}
|
||||
region is a distinct defect, and this requirement is what forbids
|
||||
it. Neither the ordering DAG nor the bounds map may reach outside
|
||||
the region whose time model declares them.
|
||||
\end{requirement}
|
||||
```
|
||||
|
||||
**This reproduces the measured escape** — the annex records a *partial referent deletion* that left the recap intact and passed, not this sentence replacement, so M22 is that escape's faithful reconstruction rather than a re-run of it. Its exact verdict is established during amendment 3's execution, not claimed here.
|
||||
|
||||
*Must fail:* test 3, **alone**.
|
||||
|
||||
**M23 — the symmetric `bounds` escape.** `bounds` leaves the clause and survives in the recap.
|
||||
|
||||
*Before* — the requirement as landed at `eddf6e9`:
|
||||
|
||||
```latex
|
||||
\begin{requirement}
|
||||
\label{req:time:aleatoric-reference-locality}
|
||||
Every event referenced by an aleatoric region's \texttt{ordering}
|
||||
DAG, and every event used as a key in its \texttt{bounds} map,
|
||||
\MUST{} be an event of that same region. Naming an event that does
|
||||
not exist is a dangling reference, governed by graph
|
||||
invariant~10; naming an event that exists in a \emph{different}
|
||||
region is a distinct defect, and this requirement is what forbids
|
||||
it. Neither the ordering DAG nor the bounds map may reach outside
|
||||
the region whose time model declares them.
|
||||
\end{requirement}
|
||||
```
|
||||
|
||||
*After:*
|
||||
|
||||
```latex
|
||||
\begin{requirement}
|
||||
\label{req:time:aleatoric-reference-locality}
|
||||
Every event referenced by an aleatoric region's \texttt{ordering}
|
||||
DAG \MUST{} be an event of that same region. Naming an event that does
|
||||
not exist is a dangling reference, governed by graph
|
||||
invariant~10; naming an event that exists in a \emph{different}
|
||||
region is a distinct defect, and this requirement is what forbids
|
||||
it. Neither the ordering DAG nor the bounds map may reach outside
|
||||
the region whose time model declares them.
|
||||
\end{requirement}
|
||||
```
|
||||
|
||||
**Without M23 the narrowing is only half signed:** an implementation could scope `ordering` to the clause and keep `bounds` checked over the block, and M13 plus M22 would both still behave as pinned.
|
||||
|
||||
*Must fail:* test 3, **alone**.
|
||||
|
||||
**M24 — the `same region` escape.** the locality phrase leaves the clause and appears in the recap instead.
|
||||
|
||||
*Before* — the requirement as landed at `eddf6e9`:
|
||||
|
||||
```latex
|
||||
\begin{requirement}
|
||||
\label{req:time:aleatoric-reference-locality}
|
||||
Every event referenced by an aleatoric region's \texttt{ordering}
|
||||
DAG, and every event used as a key in its \texttt{bounds} map,
|
||||
\MUST{} be an event of that same region. Naming an event that does
|
||||
not exist is a dangling reference, governed by graph
|
||||
invariant~10; naming an event that exists in a \emph{different}
|
||||
region is a distinct defect, and this requirement is what forbids
|
||||
it. Neither the ordering DAG nor the bounds map may reach outside
|
||||
the region whose time model declares them.
|
||||
\end{requirement}
|
||||
```
|
||||
|
||||
*After:*
|
||||
|
||||
```latex
|
||||
\begin{requirement}
|
||||
\label{req:time:aleatoric-reference-locality}
|
||||
Every event referenced by an aleatoric region's \texttt{ordering}
|
||||
DAG, and every event used as a key in its \texttt{bounds} map,
|
||||
\MUST{} be an event of that region. Naming an event that does
|
||||
not exist is a dangling reference, governed by graph
|
||||
invariant~10; naming an event that exists in a \emph{different}
|
||||
region is a distinct defect, and this requirement is what forbids
|
||||
it. Neither the ordering DAG nor the bounds map may reach outside
|
||||
the same region whose time model declares them.
|
||||
\end{requirement}
|
||||
```
|
||||
|
||||
Catches an implementation that clause-scopes the referents while still searching the whole block for the locality phrase.
|
||||
|
||||
*Must fail:* test 3, **alone**.
|
||||
|
||||
**M25 — the `\MUST{}` escape.** the normative force moves to the recap.
|
||||
|
||||
*Before* — the requirement as landed at `eddf6e9`:
|
||||
|
||||
```latex
|
||||
\begin{requirement}
|
||||
\label{req:time:aleatoric-reference-locality}
|
||||
Every event referenced by an aleatoric region's \texttt{ordering}
|
||||
DAG, and every event used as a key in its \texttt{bounds} map,
|
||||
\MUST{} be an event of that same region. Naming an event that does
|
||||
not exist is a dangling reference, governed by graph
|
||||
invariant~10; naming an event that exists in a \emph{different}
|
||||
region is a distinct defect, and this requirement is what forbids
|
||||
it. Neither the ordering DAG nor the bounds map may reach outside
|
||||
the region whose time model declares them.
|
||||
\end{requirement}
|
||||
```
|
||||
|
||||
*After:*
|
||||
|
||||
```latex
|
||||
\begin{requirement}
|
||||
\label{req:time:aleatoric-reference-locality}
|
||||
Every event referenced by an aleatoric region's \texttt{ordering}
|
||||
DAG, and every event used as a key in its \texttt{bounds} map,
|
||||
is an event of that same region. Naming an event that does
|
||||
not exist is a dangling reference, governed by graph
|
||||
invariant~10; naming an event that exists in a \emph{different}
|
||||
region is a distinct defect, and this requirement is what forbids
|
||||
it. Neither the ordering DAG nor the bounds map \MUST{} reach outside
|
||||
the region whose time model declares them.
|
||||
\end{requirement}
|
||||
```
|
||||
|
||||
**Its discrimination is not M24's, and the mechanism is worth stating.** The clause is *selected by* the `\MUST{}` position, so moving `\MUST{}` moves the clause onto the recap — which is exactly why 8.3's start rule takes the **last `". "` before** the occurrence, falling back after the label only when there is none. A correct implementation reads the recap alone as its clause, finds `ordering` and `bounds` there, and **fails on `same region`**, which the recap does not contain. An implementation that always started after the label would produce one slice running from label to recap, containing all four needles, and would pass.
|
||||
|
||||
*Must fail:* test 3, **alone**.
|
||||
|
||||
**M26 — the fallback anchor's own signature.** M22's clause replacement **plus** a period-free `ordering` decoy inserted before the unchanged label.
|
||||
|
||||
*Before* — the requirement as landed at `eddf6e9`:
|
||||
|
||||
```latex
|
||||
\begin{requirement}
|
||||
\label{req:time:aleatoric-reference-locality}
|
||||
Every event referenced by an aleatoric region's \texttt{ordering}
|
||||
DAG, and every event used as a key in its \texttt{bounds} map,
|
||||
\MUST{} be an event of that same region. Naming an event that does
|
||||
not exist is a dangling reference, governed by graph
|
||||
invariant~10; naming an event that exists in a \emph{different}
|
||||
region is a distinct defect, and this requirement is what forbids
|
||||
it. Neither the ordering DAG nor the bounds map may reach outside
|
||||
the region whose time model declares them.
|
||||
\end{requirement}
|
||||
```
|
||||
|
||||
*After:*
|
||||
|
||||
```latex
|
||||
\begin{requirement}
|
||||
The ordering DAG is discussed below
|
||||
\label{req:time:aleatoric-reference-locality}
|
||||
Every event used as a key in an aleatoric region's \texttt{bounds}
|
||||
map \MUST{} be an event of that same region. Naming an event that does
|
||||
not exist is a dangling reference, governed by graph
|
||||
invariant~10; naming an event that exists in a \emph{different}
|
||||
region is a distinct defect, and this requirement is what forbids
|
||||
it. Neither the ordering DAG nor the bounds map may reach outside
|
||||
the region whose time model declares them.
|
||||
\end{requirement}
|
||||
```
|
||||
|
||||
**This is the only mutation that tests the fallback itself.** The decoy carries no period, so it creates no `". "` boundary and the selector still falls back. A **correct** fallback starts after the label, excludes the decoy, finds no `ordering` in the clause and **fails**. A fallback anchored at the block start includes the decoy and **passes**. Nothing else in this set can tell those two implementations apart.
|
||||
|
||||
*Must fail:* test 3, **alone**.
|
||||
|
||||
**M27 — the exactly-one assertion's own signature.** The normative sentence is
|
||||
left **unchanged**; the recap gains a second `\MUST{}`.
|
||||
|
||||
*Before* — the requirement as landed at `eddf6e9`:
|
||||
|
||||
```latex
|
||||
\begin{requirement}
|
||||
\label{req:time:aleatoric-reference-locality}
|
||||
Every event referenced by an aleatoric region's \texttt{ordering}
|
||||
DAG, and every event used as a key in its \texttt{bounds} map,
|
||||
\MUST{} be an event of that same region. Naming an event that does
|
||||
not exist is a dangling reference, governed by graph
|
||||
invariant~10; naming an event that exists in a \emph{different}
|
||||
region is a distinct defect, and this requirement is what forbids
|
||||
it. Neither the ordering DAG nor the bounds map may reach outside
|
||||
the region whose time model declares them.
|
||||
\end{requirement}
|
||||
```
|
||||
|
||||
*After:*
|
||||
|
||||
```latex
|
||||
\begin{requirement}
|
||||
\label{req:time:aleatoric-reference-locality}
|
||||
Every event referenced by an aleatoric region's \texttt{ordering}
|
||||
DAG, and every event used as a key in its \texttt{bounds} map,
|
||||
\MUST{} be an event of that same region. Naming an event that does
|
||||
not exist is a dangling reference, governed by graph
|
||||
invariant~10; naming an event that exists in a \emph{different}
|
||||
region is a distinct defect, and this requirement is what forbids
|
||||
it. Neither the ordering DAG nor the bounds map \MUST{} reach outside
|
||||
the region whose time model declares them.
|
||||
\end{requirement}
|
||||
```
|
||||
|
||||
**This is the only mutation that reaches step 1 of 8.3.** A **correct**
|
||||
implementation asserts exactly one `\MUST{}` in the block, finds two, and
|
||||
**fails** before clause selection begins. An implementation that silently takes
|
||||
the **first** occurrence selects the original normative sentence as its clause —
|
||||
which still contains `ordering`, `bounds`, `same region` and `\MUST{}` — and
|
||||
**passes every clause assertion**. Nothing in M22–M26 separates those two: they
|
||||
all vary the *contents* of the clause, and this one varies which clause is
|
||||
chosen.
|
||||
|
||||
*Must fail:* test 3, **alone**.
|
||||
|
||||
**M11, M12, M13 and M16 are unchanged** and remain §3's. They delete or weaken
|
||||
across the whole block; M22–M27 cover the narrower escapes they cannot see.
|
||||
|
||||
### 8.5 Execution surface and lifecycle
|
||||
|
||||
| Row | Path | Why |
|
||||
|---|---|---|
|
||||
| 4 | `crates/epiphany-testkit/tests/invariant_ten_surface.rs` | test 3's clause selection and four assertions |
|
||||
| 6 | `spec/PASS13_CANDIDATES.md` | **append closes the finding recorded as open by `eddf6e9`** |
|
||||
| 7 | `spec/CONTRACT_P13S26_INVARIANT10_SURFACE.md` | §8's status transitions and historical marking |
|
||||
| 8 | `spec/EVIDENCE_P13S26_EXECUTION.md` | M22–M27 transcripts, **appended**; the 38/38 matrix is preserved |
|
||||
|
||||
`spec/core_spec.tex` is **not** touched: the requirement's text is already
|
||||
correct, and only the guard was weak.
|
||||
|
||||
**§8's status transitions, pinned** — otherwise this amendment lands still
|
||||
calling itself a draft, and the ledger finding stays open, which is the defect
|
||||
amendment 2 was written to close:
|
||||
|
||||
- **On ratification:** `STATUS: RATIFIED; DISPATCHED to clause-scope test 3.`
|
||||
*Prospective, because between ratification and execution the test is not yet
|
||||
clause-scoped and a perfect-tense literal would be false for that whole
|
||||
interval.*
|
||||
- **On landing:** `STATUS: LANDED by this commit.` — no hash, same rule as pin 11.
|
||||
- **On landing**, §8's revision records and this finding statement are marked a
|
||||
**dated historical record**, and the S26 ledger row is appended to record the
|
||||
finding **closed**.
|
||||
|
||||
**Gate 7 covers M22–M27** like any failing-evidence mutation: full workspace with
|
||||
`--no-fail-fast`, radius compared against 8.4, transcripts appended to the annex.
|
||||
|
||||
### 8.6 Settled, and what the next review must decide
|
||||
|
||||
**Settled by review round 1 — the delimiter.** `". "` is sufficient for the
|
||||
current pinned prose once the start is anchored as 8.3 requires. A future
|
||||
abbreviation inside the clause would be a deliberate prose change; if it affects
|
||||
a guarded phrase the test fails and forces guard review, which is the intended
|
||||
behaviour. **No general TeX sentence parser is warranted here**, and building
|
||||
one would add a component with its own failure modes to guard against a change
|
||||
that announces itself.
|
||||
|
||||
**Settled by review round 1 — the same-sentence rule stands.** It deliberately
|
||||
guards the *current* normative construction. A semantically valid multi-sentence
|
||||
rewrite **should** fail and force deliberate guard review rather than pass
|
||||
silently.
|
||||
|
||||
**Settled by review round 4 — every step of 8.3 is signed.** M22 and M23 sign
|
||||
the referents' clause scope, M24 the locality phrase, M25 the last-period rule,
|
||||
M26 the fallback anchor, and M27 the exactly-one-`\MUST{}` assertion — which was
|
||||
step 1 and, until this round, the only step no mutation reached.
|
||||
|
||||
**Open: none.**
|
||||
|
|
|
|||
Loading…
Reference in New Issue