Skip to content

Self-hosting phase 4: the oracle split, the floor and view waves, and the honest 05 stay - #13

Merged
darko-mijic merged 16 commits into
mainfrom
feature/protocol-self-application-phase-4
Jul 26, 2026
Merged

Self-hosting phase 4: the oracle split, the floor and view waves, and the honest 05 stay#13
darko-mijic merged 16 commits into
mainfrom
feature/protocol-self-application-phase-4

Conversation

@darko-mijic

@darko-mijic darko-mijic commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

What this is

Phase 3 closed with three debts on the record, and this phase pays them in the order plan 20 prescribed. First, the golden corpus oracle — 3,888 lines in a single it() — was split so the first failure no longer masks every other law. Second, the two surfaces that each independently named the same six contract-dependent test files (the lint exemption and the test wrapper's preflight) now read from one shared module, so the clean-clone lint surprise of phase 3 cannot recur. Third, the biggest recorded corpus gaps — laws the engine already implements but no Spec carried — got their carrying Specs: the readiness floor's own clause tables, and the projection layer's view rules.

On that base, readiness matured from 51 ready / 36 defined to 71 ready / 37 defined with zero decorative promotions, and docs/concept/05 — the doc those gaps held in place — was re-audited for deletion and stays, two clauses short. That verdict is the audit working, not failing: the re-audit closed all three of its recorded phase-3 gaps and then surfaced two new ones (a per-team severity override and a team-overridable floor config, both designed-for deferrals stated nowhere else), and refused to stretch them into carried — the exact mis-grading the phase-3 review caught twice.

The phase ran as six sessions on plan 21 (plans/21-self-hosting-phase-4.md, now ✅ EXECUTED): five planned sessions, each closing on a fully green twelve-leg npm run check, plus a sixth remediation wave executing the owner's pre-PR review verdict on the branch. It was closed by an archived adversarial review (reviews/09 was phase 3's; this phase's is reviews/10) whose central method was again mutation testing with an independently designed mutation set — not a replay of the waves' own probes.

What landed

The golden oracle is split — 21 it()s over one hoisted extraction, zero assertion loss. test/self-hosting-graph.test.ts went from one 3,888-line it() to one it() per law, all sharing a single corpus extraction. The frozen expectations moved to ten authored transcription modules under test/self-hosting-oracle/ — one file per Spec family — so a conversion wave now touches one family file, never the monolith. The reconciliation is exact and was independently recomputed at review: 27 expect sites became 32 (the additions are length cross-checks and a "no Spec outside the families" law), and across all of test/ the count went 1313 → 1342 with every per-file delta non-negative. The count literals and the readiness histogram stay explicit, and the length cross-checks measure the authored arrays against those same literals — so the oracle cannot certify itself by moving both sides of a comparison at once. The corpus-test-granularity docket row, which had rolled forward since review-08, closes DONE.

One source of truth for the contract-dependent suites. contract-dependent-suites.mjs states the per-tree dependency rows once; vitest-test.mjs reads them to refuse fast when a generated tree is missing, and eslint.config.js derives its clean-room exemption list from the root row. When the phase's new bound suite arrived, it entered through one edit and both surfaces followed — and the review re-ran the negative control: remove the row and lint fails with exactly five no-unsafe-argument errors while the wrapper stops refusing fast. The coupling is load-bearing on both sides, proved rather than asserted.

The readiness floor now states its own law. spec:validation.readiness-floor was enriched from a one-sentence deferral into all four rungs in authored words — five idea clauses, three scoped, two defined, three ready, with cumulative evaluation stated explicitly — and the new spec:validation.kind-evidence carries the per-kind evidence table row for row, including the shared behavior/workflow/contract family, the contract row's named deferral, and the promoted-evidence honesty bound (an empty stub child is never evidence). The code table in src/validate/readiness-floor.ts remains the clause set's code-level source of truth; the Spec and the table are now one law read twice, and the Spec says so.

The projection laws the engine already implemented got carrying Specs. The derived-readiness banner (rendered beside the stated rung, raised only in the dishonest direction, naming the first unmet clause), the binding-language view rule (views render "Implementation binding / Verifier binding / Expected-outcome oracle / Runtime observation" — the internal delivery-fact names never render as text), the wholesale view rewrite (build to a temporary sibling, one atomic rename, no stale page survives; a failed run removes the view rather than leaving it readable-as-current), the one diagnostic rendering rule (location composed from the finding's structured fields, degrading cleanly by field, one diagnostic currency across the CLI and the Design Review), and validator self-testing.

Fifteen new bound points, every one mutation-probed red for the law it names. Five floor points, five view points, and five more from the remediation wave — including the one that took real design work: the wholesale-rewrite law is realized at two engine sites (the build's up-front invalidation and the view's temp-and-rename), and the original point survived deleting either site alone. The fix moved the world, not the engine: the example space now controls when the stale page is planted, so one point plants it late — after the invalidation has already run — and dies only when the swap itself is deleted, while its sibling isolates the invalidation. Each realizing site now has a point that goes red when that site alone is broken. The corpus holds 44 bound points across seven bound suites.

Readiness matured only where a verifier honestly landed — and the sweep refused 37 times. Every new rule Spec promoted to ready carries a resolving verifier landed in the same change. The S4 sweep then dispositioned all 37 then-defined Specs per-Spec with zero promotions: every one of them clears the ready floor structurally, and not one carries has-verifier, so any promotion would have manufactured the exact honesty/gaps warning the promotion law forbids. No verifier was invented to unlock one. One refusal deserves its own line: spec:validation.validator-self-testing stays defined because its only mechanical verifier would read the test corpus for should-fail/should-pass pairs — policing the delivery process, which checks never do.

A three-phase-old false record was caught and corrected. The review's one major finding was not a verifier defect: the frozen GWT then key had been written indirectly (["t","hen"].join("")) at 66 sites. Review-06 had called that out; the phase-1 remediation fixed it; a same-cluster commit silently reintroduced it nine hours later; and two later plans then recorded the fix as verified-intact — false when written. Nothing in the toolchain requires the indirection (no lint rule, no gate leg, no scanner reads test files for GWT shapes). Every occurrence is now the plain key, the product site carries a one-line constraint comment, bracketed errata sit beside the false claims in the historical plans (nothing rewritten), and AGENTS.md gained the discipline the episode teaches: a "verified" row is re-measured against the tree, never inherited from the prior row.

The reviews, closed on the branch

Two layers of review closed before this PR.

The archived adversarial review (reviews/10-self-hosting-phase-4-pre-close-review.md) ran 22 independently designed mutations. All ten then-existing points went red for the law they name; 17 of 18 point-directed mutations killed exactly one point, and the 18th killed exactly the two whose Spec text shares a clause. The oracle split held under corruption: a wrong descriptor reddens exactly its family's it(); a deleted entry is caught by the length cross-checks. Ten findings, all terminal — one major (the then key), one minor fixed by enrichment (the gap-signal's recomputed-facts clause now lives on spec:validation.warn-level-signals instead of resting on validator source), two ledger rows sharpened from measurement, two record slips corrected, one declined with a reason, one carried to the docket.

The owner's pre-PR review graded the branch sound to open, with a fix list. The remediation wave (S6) executed it: the under-bound wholesale-rewrite law got its teeth (three new points isolating the swap, the invalidation, and the failed-run removal), the pack-member table half of the binding-language rule is bound (the label-shorthand mutation on the pack table now dies while the index point stays green), the Design Review diagnostic twin is bound (em-dash cell, pipe escaping, and location composition all mutation-probed), the dead RenderedFinding shape is deleted after re-measuring that it truly has no producer, and the records items (errata, discipline line, the 07 §6 ④ four-line quote) landed. One line was refused honestly: the --check-clean double-render refusal stays unbound, because divergence is not honestly inducible in a world — the renderer is deterministic by its own Spec, and a world that supplies a lying renderer asserts nothing about the engine. The refusal and its reason are in the conversion ledger.

Verification

  • npm run check green on the full twelve-leg chain at every blessed commit across all six sessions, and again on a fresh git clone --no-localnpm ci → full chain at the close tip, reproducing identical numbers.
  • The self-hosting graph at close: 108 Specs · 1 Pack · 80 anchors → 189 nodes · 371 edges, 0 errors · 0 warnings. Kind mix: 44 example · 21 decision · 21 rule · 12 behavior · 8 model · 1 contract · 1 workflow · 1 constraint. --check-clean clean on both generated trees.
  • Readiness: 71 ready / 37 defined (zero idea/scoped). All 71 ready Specs carry has-verifier in the graph; none of the 37 defined Specs does — which is the sweep's uniform, recorded refusal reason. Zero honesty/gaps warnings.
  • The suite: 594 tests (540 in the parallel pool, 54 in the dedicated CLI process). No test file deleted, no residual case lost, no matcher loosened; the S1 reconciliation was verified at the diff level.
  • The worked example at close: 11 specs · 1 pack · 5 anchors → 17 nodes · 32 edges, 0 errors · 1 warning — the frozen invalid-cart warning the tracer bullet exists to show.
  • Both reviews are archived/recorded with every finding in a terminal disposition.

Three things that need your conscious yes

This phase ran autonomously — no live owner gate occurred during execution, and plan 21's gate ledger records that ratification happens here. Three items in particular:

  1. 05 stays, two clauses short. Gaps 13 and 14 (the per-team severity override; the team-overridable floor config) are recorded precisely and were independently re-verified — a repository-wide sweep finds them named only in 05 itself and in the plan's audit rows. The next phase owns exactly two cheap carries: one clause on spec:validation.warn-level-signals, one on spec:validation.readiness-floor beside the MD-13 posture it already states. With those carried, 05 deletes in one session — the deletion-cost inventory in plan 21 §5a already lists every re-pointing it will cost, down to the two pinned quotes in check-carrier-truth.mjs.
  2. The then-key normalization touches product code (one line in src/extract/markdown-body-owner-behavior.ts plus 65 test and oracle sites). It is byte-neutral at runtime and proven through the full gate and the clean clone — but it lands on a review finding rather than a plan ruling, and it reverses a shape that survived three phases. It survived them as a silent regression under a false verification, not as precedent; the errata now make that unmistakable in the historical record.
  3. spec:validation.validator-self-testing ships at defined with no verifier, yet is graded carried by the 05 audit. The dissolution decision asks that a law be carried by a Spec, not that the Spec be ready — this is the first time the corpus leans on that reading. When someone later binds should-fail/should-pass evidence, the Spec promotes then; nobody should invent a meta-validator to force it earlier.

What remains for full self-hosting

  1. Gaps 13 and 14, then the 05 deletion. Two narrow clauses on existing Specs (never new Specs — keep the dissolution cheap), then the one-session deletion the inventory already prices, including re-pointing the DECISIONS registry rows (MD-13, MD-9) and the CONTEXT.md section pointer at the carrying Specs.
  2. The strongest promotion candidate is named. spec:consumers.design-review no longer refuses on the phase-3 tranche reason — the view wave built exactly that world. It stays defined on evidence: verifiers are direct and never transitive, so its children verify themselves, never their parent. It needs one point of its own.
  3. Two honestly-unbound readings stay on the record: the --check-clean double-render refusal (divergence not honestly inducible) and the no-half-written-view concurrency reading (needs a concurrent reader mid-write). Both are stated in the conversion ledger with their reasons, not papered over.
  4. The 06/07 gap tails stand, out of scope by design: the impact graph's two assist roles, bySymbol's frozen-shape status, the discipline ≈ kind/section mapping, the distribution chart, the per-PR hosted preview, the Mermaid and reference-projection surfaces, the two open questions, and measure-what-hurts. Six of the twelve phase-3 gaps closed this phase; each Spec authored against the tail is a step toward 06 and 07 dissolving on their own audits.
  5. The readiness tail is honest, not lazy. The 37 defined Specs refused promotion for named reasons — the 21 decisions, the whole-pipeline worlds (the CLI pipeline, the reader over a full graph fixture, the clean-room rebuild that is the close's own proof), and the vocabulary parents whose executable path lives on children. They mature as the verification layer grows non-decorative verifiers for them.
  6. The docket tail carries with reasons: the Markdown Pack syntax ruling, the gen-1 .feature adapter, the no-reparse read seam, temporal-guard token assembly, the editor-association gap, control-character latitude, and the separate example-id namespace — each row with its standing reason in plan 21 §4.

https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw

Greptile Summary

The PR expands and strengthens the repository’s self-hosting specification corpus and verification infrastructure.

  • Splits the monolithic golden graph oracle into per-family expectation modules and independently reported laws.
  • Centralizes generated-contract-dependent test suites for the Vitest preflight and ESLint configuration.
  • Adds bound Specs and tests for readiness-floor evidence, projection behavior, diagnostic rendering, and wholesale view replacement.
  • Normalizes the authored GWT then key and records corrections to historical verification claims.
  • Updates plans, reviews, and concept documentation to reflect phase-4 outcomes and remaining gaps.

Confidence Score: 5/5

The PR appears safe to merge; no concrete changed-code defect was identified.

The shared suite registry covers the current generated-contract importers, and the split oracle preserves the existing checks while adding independent count, partition, and duplicate protections.

T-Rex T-Rex Logs

What T-Rex did

  • T-Rex executed the full gate of the general contract validation and observed an exit code of 1, blocked by an environment-generated .greptile-internal/security-findings.json.
  • T-Rex then ran the narrow suite of checks, which exited with code 0 and reported validators 17/17, projections 10/10, and graph 21/21.

View all artifacts

T-Rex Ran code and verified through T-Rex

Important Files Changed

Filename Overview
contract-dependent-suites.mjs Introduces a shared registry covering all current test suites that import either generated-contract tree.
eslint.config.js Derives clean-room typed-lint exemptions from the shared root-contract suite registry without broadening them to unrelated tests.
vitest-test.mjs Replaces the duplicated generated-contract dependency table with the shared registry while retaining existing filter and preflight behavior.
test/self-hosting-graph.test.ts Splits the golden corpus verification into isolated laws over one read-only extraction while adding explicit length and family-exhaustiveness checks.
test/self-hosting-projections.test.ts Adds bound projection worlds covering binding labels, atomic view replacement, failure cleanup, and diagnostic table rendering.
test/self-hosting-validators.test.ts Expands bound validator coverage for readiness-floor and kind-evidence rules.
src/cli/output.ts Removes an unused alternate finding shape and keeps formatting constrained to the canonical Finding contract.
src/extract/markdown-body-owner-behavior.ts Replaces indirect GWT result-key construction with the direct frozen then property.

Reviews (1): Last reviewed commit: "docs(plans): record the clean-clone proo..." | Re-trigger Greptile

…tions over one extraction

The golden corpus oracle stood as one `it()` over 3,888 lines, so the first
failure masked every other law and each conversion wave thrashed a monolith.
The suite now states each law as its own `it()` — 21 of them — over a single
hoisted extraction: the corpus walk runs once per suite run, never once per
assertion.

The frozen expectation moves to authored transcription modules under
`test/self-hosting-oracle/`: one file per Spec family (carrier, protocol,
extraction, validation, model, consumers, decisions), plus the Pack manifest,
the declared relations, the anchors, and an aggregating index. Nothing there is
computed from the graph it judges. The per-family descriptor comparisons are
joined by an explicit law that the union of the family slices is the whole
primitive node set, so no Spec escapes between two families.

Zero assertion loss: all 27 original `expect` sites survive at equal or
stricter strength, and five are added — three oracle-length cross-checks
against the frozen literals and the two-assertion no-Spec-outside-the-families
law. The redundant inline node-id roster is derived from the authored spec and
anchor arrays rather than kept as a second literal: deliberate de-duplication
of oracle data, with the sorted node-id equality itself untouched. The corpus
numbers enter and leave identical — 87 specs / 1 pack / 65 anchors, 153 nodes,
294 edges, ready 51 / defined 36.

Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
…odule

The test wrapper and the lint config named the same six bound suites
independently; the next bound suite would repeat the clean-clone lint
surprise. Both now import `contract-dependent-suites.mjs`, which states the
per-tree rows once — contracts dir, generation command, test paths — and the
lint exemption derives its file list from the root tree's suites. Behavior is
byte-identical: the same preflight recovery text, the same exemption set, and
the example tree stays outside the typed-lint globs. The documented exclusion
rule survives on the shared module: an in-memory suite that imports no
contract is never listed.

Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
…kind evidence table

The engine has evaluated five `idea` clauses, three `scoped` clauses, and two
`defined` clauses since the floor landed, but the carrying Spec deferred every
one of them to the code table and said so in a Rule bullet. It now states them
in authored words, states that evaluation is cumulative, and marks the two
evidence clauses as the floor's one kind-conditional place; the deferral
sentence is gone and the MD-13 posture survives — the code table stays the
clause set's code-level source of truth and the realizing entrypoint, read as
one law twice rather than as two floors.

`spec:validation.kind-evidence` is the new refining rule Spec that carries the
per-kind table: the shared behavior/workflow/contract row, the converged rule
and model rows, the example row's concreteness law, the constraint row's
machine-readable target, the decision row, the contract row's named deferral,
and the promoted-evidence honesty bound (a promoted child counts only when it
clears its own kind's present cell; a constrainedBy edge only when it resolves
to a constraint carrying its constraints).

Five bound points enter the validators suite in the probe-graph style, each
asserting the finding id and the failing clause id positively, and each
mutation-probed red against a broken copy of the clause it names.

Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
The two S2 conversion rows go done with their point counts, the readiness
ledger carries the six promotions and the one refusal, the session row states
what landed, and the shared-constant watch item records that it fired nothing.

Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
…tions suite

Five implemented-but-uncarried laws now have carrying Specs, four of them with
bound executable points in a new projections suite:

- the derived-readiness banner (`spec:consumers.derived-readiness-banner`):
  stated renders beside floor-reached always; the banner fires only in the
  dishonest direction and names the first unmet clause by id and description.
- the view-label rule (`spec:consumers.binding-language-views`): views speak
  binding language on the page and in the aggregate tables; the internal
  delivery-fact name never renders as label text.
- the wholesale rewrite (`spec:consumers.wholesale-view-rewrite`): temp sibling,
  removal, one rename; a run that cannot produce a current view removes the
  stale one; `--check-clean` renders twice and refuses divergence.
- the one diagnostic rendering rule (`spec:validation.diagnostic-rendering`):
  one currency, location composed from the structured file/line fields, both
  degradations stated.
- validator self-testing (`spec:validation.validator-self-testing`), stated at
  `defined`: its only mechanical verifier would police the delivery process
  rather than conformance or honesty, so none is authored.

`test/self-hosting-projections.test.ts` holds five bound points over two world
styles — probe graphs rendered through the real projection seam, and a temporary
extraction root for the filesystem law — and enters the shared
contract-dependent-suites row once, from which both the wrapper preflight and
the clean-room lint exemption follow.

Corpus 93 → 103 Specs · 70 → 75 anchors · 164 → 179 nodes · 317 → 351 edges;
`ready` 57 → 66, `defined` 36 → 37; zero errors and zero warnings.

Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
The conversion ledger carries the five S3 laws with their point counts and the
recorded family call for the diagnostic rendering rule; the readiness ledger
carries the wave's promotions and its two refusals; the session row and the
shared-constant watch item record the seventh bound suite entering through the
one row, negative control included.

Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
The sweep dispositioned all 37 `defined` Specs per-Spec: zero promotions and 37
named refusals. Not one of them carries `has-verifier`, so every promotion would
have introduced an `honesty/gaps` warning and failed the promotion law's second
clause — and no verifier was invented to enable one. All 37 clear the `ready`
floor structurally, so the refusals are about missing evidence, never missing
structure. Two reasons moved: `spec:consumers.design-review` no longer refuses
on tranche grounds (the view wave built exactly that world) but on evidence —
its children verify themselves, never their parent — and
`spec:validation.validator-self-testing` was re-judged and upheld, its only
mechanical verifier still being one that would police the delivery process.

The `05` re-audit closed all three of its recorded gaps — the lower floor rungs
and the per-kind evidence table, the derived-readiness banner, and validator
self-testing all now stand on Specs — and surfaced two new gap rows the earlier
table never decomposed: the per-team severity override for the informative
signals and the team-overridable floor config, both designed-for deferrals
carried by no Spec, registry, code surface, or surviving doc. That is the class
the earlier audit itself recorded as gaps, so `05` stays, with the residue and a
deletion-cost inventory recorded rather than a verdict stretched to force a
deletion.

`06` and `07` re-graded on the same pass: the banner, view-label, wholesale
rewrite, and diagnostic rendering rows are now carried, six of the twelve
recorded gaps close, and both docs stay with the rest of their ledgers intact.
One drift note recorded and deliberately not repaired: `07` §6 ④ quotes three
binding lines where the view renders four.

Records-only — no product surface changed; 103 specs · 1 pack · 75 anchors →
179 nodes · 351 edges, `ready` 66 / `defined` 37, zero errors and zero warnings.

Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
Mutation testing over the ten new bound points, an independently designed
set of twenty-two mutations, and a from-scratch recomputation of every
headline number. All ten points go red for the law they name, and the
discrimination is measured rather than asserted: seventeen of the eighteen
point-directed mutations kill exactly one point, the eighteenth kills the
two whose Specs name the same floor clause.

The oracle split is probed too — a corrupted family module reddens exactly
that family's it(), a deleted oracle entry is caught by the length
cross-checks rather than certifying itself, and the count literals move
independently of the authored arrays.

One major, on records honesty rather than verifier honesty: the indirect
`then` key was fixed once, silently regressed hours later inside the same
remediation cluster, and then re-verified as intact by a later phase. Two
recorded verifications are therefore false. The sandbox proves the full
gate green with every occurrence normalized.

Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
The GWT result key was assembled indirectly — `["t", "hen"].join("")` and
`"t" + "hen"` — at 66 sites across one product file and eight test files.
Review-06 called it guard evasion that hides the frozen given/when/then key
set from grep; the phase-1 remediation named the key directly, and the
grammar-hardening commit in the same cluster reintroduced it hours later.
The later phase's docket then recorded the remediation as intact, which it
was not.

Nothing requires the indirection. No ESLint rule or plugin can see an
object key, no gate leg reads it, none of the five check scripts contains
the token, and nothing scans test files for gwt-shaped object literals —
the extractor reifies only `.sdp.ts` and `.sdp.md` carriers. The product
was already inconsistent: reify.ts and serialize.ts write the key plainly.

Every occurrence is now the plain key. Byte-neutral at runtime; the graph,
the oracle, and the derived contracts are unchanged.

Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
The per-doc audit graded the derived-facts honesty row `carried` while one
of its clauses — the gap check reads the recomputed facts, so a faked fact
never silences it — stood only on `src/validate/validators.ts`. That is a
code surface under a deletion-authorizing verdict, the shape the phase-3
review made a major of and closed by enrichment rather than by argument.

`spec:validation.warn-level-signals`, whose realizing entrypoint is the gap
check itself, now states the clause in authored words. It is ratified
intended truth, not promoted code behaviour: the concept material says the
same sentence. The oracle transcription follows.

Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
…edgers

Plan 21 goes to EXECUTED. The done-record states what the five sessions
delivered, the S5 rulings log, the opening-to-closing numbers, and every
one of the seven acceptance criteria graded with its evidence. Criterion 5
grades PASS with `05` staying: the criterion asks for an audit-grounded
disposition, not a deletion, and the two blocking rows were independently
re-verified at the close.

The watch items are terminal — the per-family oracle-drift item and the
shared-constant item were probed rather than assumed. The docket rows are
dispositioned: corpus-test granularity, the row that had rolled since
review-08, closes DONE at S1; the rest are carried with stated reasons,
and the dead RenderedFinding shape enters carried.

The review's records findings land here too: the phase-3 close carried six
bound suites rather than five, and the pre-split node-id roster was an
88-item literal rather than 151 items. Two conversion-ledger rows are
sharpened from the measurement — which single-site mutations the
wholesale-rewrite point survives, and which half of the binding-language
rule the bound point does not reach.

AGENTS.md's status clause moves to the phase-4 close.

Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
Every finding of review-10 is terminal and the work landed before the PR,
so the archive now names which commit carries which disposition and what
the two substantive fixes teach: a docket row's condition must be
re-measured at the moment it is verified, and a `carried` verdict resting
on a code surface is closed by enrichment, never by argument.

Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
…the dead finding shape

The owner review of the phase-4 branch ordered four repairs to the bound
corpus and the engine, all landed here.

The wholesale-rewrite law was realized at two sites and discriminated at
neither: deleting the temp-and-rename swap alone, or the build's up-front
invalidation alone, left every point green. The law's example space now
carries when the stale page is planted and which command runs, and three
sibling points close the gap — a page planted after the build has already
invalidated the view (so only the swap can evict it), a run whose carrier
the extractor refuses (so only the failed-run removal can take the view
down), and a build that renders no view at all (so only the up-front
invalidation can). Each single-site deletion now reddens exactly one point.

The binding-language rule named both aggregate surfaces but only the index
table was exercised; a pack-member point now reads the member table's cells
for a bound member beside an unbound one, so a yes/no shorthand cannot pass.

The diagnostic rendering rule named two entrypoints and bound one; the
Design Review twin now runs through renderFindings under the same
composition rule, covering the em-dash cell and the table-escaped message.

RenderedFinding is deleted: an exhaustive search finds no producer anywhere
in the tree and no barrel export, so formatFinding narrows to Finding and
the file the Spec points a reader at no longer declares a second shape.

The frozen GWT result key gains a comment stating the constraint in force.

Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
…he falsified rows

The records half of the owner-ordered wave.

Plans 17, 18, and 18a each carry a row saying the indirect `then` key was
fixed or verified intact; every one of them was false from the commit that
silently reverted the fix until the phase-4 close. Each gets a bracketed
erratum beside the claim, never a rewrite: a plan is a process record, and
the correction is worth more standing next to what it corrects.

AGENTS.md gains the discipline that failure taught — a docket or ledger row
claiming fixed or verified is re-measured against the tree at the moment of
verification, never trusted from the row that closed it.

`07` §6 quotes three lines of rendered binding language where the view
renders four; the quote now matches the renderer and the Spec.

Plan 21 records the sixth session: the two sharpened §7 rows close, the
`RenderedFinding` docket row closes DONE, the closing-numbers table gains
the post-remediation column, and the S6 rulings log states why the
`--check-clean` line stays unbound rather than stubbed. The archived review
gains a post-review addendum updating P-1, P-2, and S-2 to fixed, with the
re-measured mutation results beside them; the original findings stand as
written.

Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
@darko-mijic
darko-mijic merged commit 5b8c2f9 into main Jul 26, 2026
3 checks passed
@darko-mijic
darko-mijic deleted the feature/protocol-self-application-phase-4 branch July 26, 2026 19:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant