Self-hosting phase 4: the oracle split, the floor and view waves, and the honest 05 stay - #13
Merged
Merged
Conversation
… waves, and the 05 dissolution attempt Claude-Session: https://claude.ai/code/session_01SoBtqnPU6EQrd1tgrUdxcw
…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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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/ 36definedto 71ready/ 37definedwith zero decorative promotions, anddocs/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 intocarried— 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-legnpm 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/09was phase 3's; this phase's isreviews/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.tswent from one 3,888-lineit()to oneit()per law, all sharing a single corpus extraction. The frozen expectations moved to ten authored transcription modules undertest/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: 27expectsites became 32 (the additions are length cross-checks and a "no Spec outside the families" law), and across all oftest/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.mjsstates the per-tree dependency rows once;vitest-test.mjsreads them to refuse fast when a generated tree is missing, andeslint.config.jsderives 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 fiveno-unsafe-argumenterrors 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-floorwas enriched from a one-sentence deferral into all four rungs in authored words — fiveideaclauses, threescoped, twodefined, threeready, with cumulative evaluation stated explicitly — and the newspec:validation.kind-evidencecarries the per-kind evidence table row for row, including the sharedbehavior/workflow/contractfamily, the contract row's named deferral, and the promoted-evidence honesty bound (an empty stub child is never evidence). The code table insrc/validate/readiness-floor.tsremains 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
readycarries a resolving verifier landed in the same change. The S4 sweep then dispositioned all 37 then-definedSpecs per-Spec with zero promotions: every one of them clears thereadyfloor structurally, and not one carrieshas-verifier, so any promotion would have manufactured the exacthonesty/gapswarning the promotion law forbids. No verifier was invented to unlock one. One refusal deserves its own line:spec:validation.validator-self-testingstaysdefinedbecause 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
thenkey 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), andAGENTS.mdgained 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'sit(); a deleted entry is caught by the length cross-checks. Ten findings, all terminal — one major (thethenkey), one minor fixed by enrichment (the gap-signal's recomputed-facts clause now lives onspec:validation.warn-level-signalsinstead 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
RenderedFindingshape is deleted after re-measuring that it truly has no producer, and the records items (errata, discipline line, the07§6 ④ four-line quote) landed. One line was refused honestly: the--check-cleandouble-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 checkgreen on the full twelve-leg chain at every blessed commit across all six sessions, and again on a freshgit clone --no-local→npm ci→ full chain at the close tip, reproducing identical numbers.--check-cleanclean on both generated trees.ready/ 37defined(zeroidea/scoped). All 71readySpecs carryhas-verifierin the graph; none of the 37definedSpecs does — which is the sweep's uniform, recorded refusal reason. Zerohonesty/gapswarnings.invalid-cartwarning the tracer bullet exists to show.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:
05stays, 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 in05itself and in the plan's audit rows. The next phase owns exactly two cheap carries: one clause onspec:validation.warn-level-signals, one onspec:validation.readiness-floorbeside the MD-13 posture it already states. With those carried,05deletes 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 incheck-carrier-truth.mjs.then-key normalization touches product code (one line insrc/extract/markdown-body-owner-behavior.tsplus 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.spec:validation.validator-self-testingships atdefinedwith no verifier, yet is gradedcarriedby the05audit. The dissolution decision asks that a law be carried by a Spec, not that the Spec beready— 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
05deletion. 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 theCONTEXT.mdsection pointer at the carrying Specs.spec:consumers.design-reviewno longer refuses on the phase-3 tranche reason — the view wave built exactly that world. It staysdefinedon evidence: verifiers are direct and never transitive, so its children verify themselves, never their parent. It needs one point of its own.--check-cleandouble-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.06/07gap 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 toward06and07dissolving on their own audits.definedSpecs 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..featureadapter, 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.
thenkey and records corrections to historical verification claims.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.
What T-Rex did
Important Files Changed
thenproperty.Reviews (1): Last reviewed commit: "docs(plans): record the clean-clone proo..." | Re-trigger Greptile