Skip to content

review: the whole repository, its fixes, and the durable-content inventory - #40

Merged
darko-mijic merged 139 commits into
mainfrom
fix/second-review-pass
Nov 4, 2026
Merged

darko-mijic merged 139 commits into
mainfrom
fix/second-review-pass

Conversation

@darko-mijic

@darko-mijic darko-mijic commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

A whole-repository review, its execution, and a second review of both

This pull request is the one record of three arcs on main b5e0a8be (PR #36):

  1. A whole-repository review, first opened as PR #38: twelve lanes read the Specs, code, tests, docs, frozen delivery records and recent pull-request record. It produced an inventory of the durable content in plans/, reviews/ and the concept documents, a seven-change proposal, and six questions for the owner.
  2. The execution of that review, first opened as PR #39: nine fix lanes carried out the confirmed findings and the owner's rulings.
  3. A second review of both, and its fixes. A fresh cross-family review read PRs docs(articles): publish the product and projection narrative #34, review: the whole repository, and the durable-content inventory #38 and fix: execute the whole-repository review's findings #39 again. Most of what it confirmed was the first pass's defect classes reaching further than the first fixes; four fix rounds closed it.

The owner chose to review and merge the three as one pull request. PRs #38 and #39 close in favour of this one; their descriptions stay as those arcs' records. Both branches are wholly inside this diff, including this pass's edits to PR #38's evidence (684844eb...3dedfaa4). History stays as it happened: merge commits are kept, and nothing was squashed, rebased or amended, because git is the Protocol's event log.

PR #34 is not in this diff. The article series stays a separate pull request, and this pass's 39 findings against it were handled there: fixes, among them a rewrite of the article evidence checker and its tests, were pushed straight to its branch and reviewed lane by lane by the other model family, but through no pull request of their own. PR #34 is not a draft and shows as mergeable, so merging it merges them. Review its second-pass range first: 31 commits, 15 files, +1725 / −211, of which the checker and its tests are +1607 / −141.

The questions it answers. Where do intent, code, tests and docs disagree, and does each fix reach the whole defect class or only the reported case? What durable content in the frozen records does the graph not carry yet, and where does each piece go? (The roadmap's first entry, the delivery-record cleanup, is blocked on that question.) How far has the product moved from its seed design, and what does the AI direction still need? Does the pull-request record hold anything the graph should?

Three guarantees hold again.

  • Delivery facts are derived, never authored. At main, a TypeScript carrier could author hasVerifier, or hide deliveryFacts in a section; now every carrier refuses every delivery-fact name, at every level, in any case.
  • A build writes only inside its root, under an honest threat model. At main, sdp build and sdp stamp wrote through a planted link to a file outside the corpus; now every writer rechecks its parent first, and the Spec says these are path checks, not race-free confinement.
  • Derivation does not depend on where the engine sits. At main, an engine installed outside this checkout derived this corpus without 105 of its anchors, silently; now it derives the same graph.
Part Commits Record
The review b5e0a8be...3dedfaa4, merged in by 12246171 PR #38, its evidence
The execution b5e0a8be...c7368f48 PR #39, its evidence
The second pass 4e7e9f95 to bcd2815f, one merge commit per lane this description, its evidence

The most important changes

1. Writes stay inside the root, across the defect class. The review found that sdp build's staging followed a planted link (L4-01, high); the execution fixed the staging. The second review found the class at more writers, two of them high: sdp stamp wrote through a planted or escaping link (A-c-1), and a watch that refused an escaping generated/ link then deleted the Studio's page set through it (A-c-2). Now every writer, from the build and the publishers' recovery to sdp new spec, projection-suite.mjs and package-artifact generation, rechecks the output parent before each write, rename or delete. A linked generated/ is refused even when it points inside the root. Node has no openat-style calls, so a writer inside the root can still race a check; the rule says the guards detect such a swap rather than prevent it. Stop: the build pipeline's write boundary.

2. No carrier can author a delivery fact, in any case. The honesty check missed hasVerifier (L3-01, high), and the execution gave it one spelling list. The second review found the hole one level down (C-g-1, high): a TypeScript carrier's section records went unchecked, so design.deliveryFacts reached the graph, as did claim, satisfies and the other derived names (S-C-2). The check now reads every key of each section record. As the owner ruled, every carrier now compares delivery-fact names case-insensitively, as Gherkin did (S-C-8), through one matcher: Has-Verifier: in a Markdown rule is refused, while has_verifier stays ordinary text. Stop: machine truth is never authored.

3. The same corpus derives the same graph wherever the engine sits. The extractor trusted only its own builder modules, so an engine installed elsewhere silently dropped 105 anchors (GAP9-1). The owner ruled that when the extraction root is the Protocol package itself, the extractor also trusts that root's src/ids.ts, src/anchors.ts and src/model/code-anchor.ts; lookalikes stay refused. The determinism Spec holds as written; a new test extracts an untouched copy of this repository with an engine outside it and one inside it, and requires equal graphs (GAP9-2). Stop: the anchor model (term "Protocol builder binding").

4. Two reserved Then words, kind and unspecified. A Then slot named kind collided with the generated Outcome's discriminant (L1-03); a Then keyed unspecified could never be bound, silently (D-c-2). The owner ruled to reserve both. Validation reports conformance/reserved-then-slot or conformance/reserved-then-key as an error, and generation withholds the contract with a warning naming the word. An oracle that selects unspecified fails a bound example with its own coverage-gap diagnostic. Stop: executable contracts.

5. "Floor not evaluated" is its own state. The reader evaluates no readiness floor over a Spec whose kind or altitude is unratified (L1-05), and every consumer read that as "below idea" or "nothing blocks" (C-c-5). Such a value comes only from a graph another producer hands to the package. As the owner ruled, the reader marks the Spec floorNotEvaluated, recipes report not evaluated, the Studio shows floor not evaluated with no divergence banner, and the Design Review, census and vault show floor not evaluated (unratified descriptor) (XG-T-1). A kind named constructor no longer crashes a page (F-pr40-claude-1). Stop: the next-rung floor (#notEvaluated).

6. The Node range says what the package needs. The root's require entry loads two ES-module-only dependencies, so it threw ERR_REQUIRE_ESM on Node 20.0–20.18 and 22.0–22.11, which engines: >=20 admitted (GAP5-1). As the owner ruled, engines.node is now ^20.19.0 || >=22.12.0; a package test loads the CommonJS root and fails if it needs an ES module while the range admits a Node that cannot require() one; the docs state the range. Subpath types sit under import, so TypeScript refuses a require that Node refuses (E-c-6). Stop: package.json.

7. A gate for Markdown links. Nothing checked Markdown links, so the cleanup could leave dangling links behind a green gate (S-M38-3). A new test reads every relative link in README.md, AGENTS.md, CONTEXT.md, docs/, jtbd-stories/ and the skills as cmark-gfm reads it, and checks each path and each fragment on a Markdown page against that page's headings (F-sweep2-23). Within those, it skips only the verbatim v0 concept set, so the notes in docs/lineage/ are checked (F-sweep2-10). Stop: test/markdown-links.test.ts.

8. Text scans are linear, and every line ending counts. The execution made one quadratic trim linear (L3-03). The second review found eight more quadratic patterns, from mention punctuation to the Studio's search tokenizer (C-c-1–3, C-g-3, GAP6-1–6-4); each now scans linearly, with a timing test. A lone CR, U+2028 or U+2029 can no longer hide text in any carrier's title, prose, entry or step, or in an @sdp tag line, and TypeScript line numbers count it as the compiler does (GAP6-5, GAP6-6, F-sweep1-4, F-sweep1-11, F-pr40-claude-3). Stop: test/linear-text-scans.test.ts.

9. The test wrapper merges a split run's reports. npm test runs test/cli.test.ts in its own process. pnpm's forwarded -- hid every filter (E-c-3), related and file:line filters went astray (E-c-4, S-E-1), and the CLI pass dropped the caller's options (E-c-5); the wrapper now routes each form as Vitest reads it. For report files the owner ruled to merge (F-sweep2-20): each pass writes a blob report, and vitest --merge-reports writes the one report the caller asked for. Coverage stays refused: no coverage provider is installed. Stop: vitest-test.mjs.

10. The accepted inventory, and how the cleanup lands it. The cleanup entry, spec:protocol.delivery-record-cleanup, is held at idea by #durableContent: what in plans/, reviews/ and the concept documents does nothing carry yet? The inventory answers it: most is carried or history; fourteen pieces need a home, four live dependencies must move, and 21 Markdown links and the handbook's and glossary's pointers must be repointed. The owner accepted it with row rulings. It lives in removable evidence, so the cleanup arc lands it in its first commit, which closes the question, as its provisional now says (J-c-3). Stop: the inventory's rulings.

Shown to a person. The second pass moves no human view of this corpus: the floor label needs an unratified descriptor, which no carrier can state. The execution moved the Studio's intent panel: each gathered intent names its action (Q6a), and a closed Preview memo shows the memo before it is copied (Q6b). Compare the panel's page in the Studio preview of main (PR #36's preview) with this pull request's. Each preview's stamp names a merge commit whose tree is exactly main's and this head's. These are live previews that track each push, not pinned images.

How the work ran

Working record

What changed, by area

Outcomes: fixed (with a test that fails without the fix), applied (as ruled or written), adapted (as a recorded choice or later ruling reshaped it), description, recorded. Proof names files under test/; the ledger names each test. "#39" marks the execution.

Area Findings Outcome Proof What changed
Writes L4-01 (high, #39), A-c-1 (high), A-c-2 (high), A-c-3, A-c-4, A-g-1, A-g-5, L4-02 (#39) fixed (A-g-1 a mitigation) cli-write-boundaries exclusive staging; every publication, recovery, stamp, script and package-artifact mutation rechecks its parent; a linked generated/ is refused; a case collision refuses publication
Writes A-g-6, F-sweep1-6, F-sweep1-17, F-sweep1-18 fixed (F-sweep1-17 adapted) cli-new-spec, cli scaffold and registrar parents created through held directories; each recheck named; --help says where PATH must resolve
Writes GAP1-1, S-A-5, F-pr40-claude-2, F-sweep1-1, GAP8-1 fixed (F-pr40-claude-2 adapted) cli-write-boundaries, studio-s4 vault placement checked before the build, each sync and the last cleanup; a default vault resolves inside the root; a failed stamp leaves no staging file; the preview discards the old page set
Writes A-c-5, A-c-6, claude-side-T-5, F-sweep1-22 applied oracle pins, cli-write-boundaries the rules that carry the boundary; the build's hooks documented
Discovery and watch Q1 (ruling, #39), Q1n (#39), B-c-1, claude-side-T-4, L4-04 (#39) applied, fixed (L4-04 adapted) exclude-diagnostics, validate-watch no link followed below the root; a link warns only when its entry could hide a carrier or anchor; only a watch resolves its root's physical path
Discovery and watch B-c-2, B-g-2, F-sweep1-3, F-sweep1-16 fixed validate-watch a watch reruns when a warned link comes or goes; a replaced directory, the root included, is dropped or rewatched
Honesty L3-01 (high, #39), C-g-1 (high), S-C-2, S-C-8 (ruling), F-sweep1-25, VR2-T-2 fixed (S-C-2 adapted: refused in validation), applied validators, extract, markdown-reifier, gherkin-reifier one case-insensitive matcher; every key of a section record checked; @deliveryFacts refused; refusal wording
Carriers L1-04 (#39), C-c-4, C-g-2, S-C-1, F-sweep1-7, F-sweep1-8, F-sweep1-9 fixed, applied markdown-reifier, oracle pins prose and list text refuse headings, fences, short setext underlines and lone list markers; the key and reserved-property rules say what is read, and where
Line endings GAP6-5, GAP6-6, F-sweep1-4, F-sweep1-11 fixed gherkin-reifier, anchor-forms, extract a lone CR, U+2028 or U+2029 is a line ending everywhere it is read
Linear scans L3-03 (#39), C-c-1, C-c-2, C-c-3, C-g-3, GAP6-1, GAP6-2, GAP6-3, GAP6-4, F-sweep1-23, F-sweep1-24 fixed (GAP6-2, GAP6-3 adapted) markdown-ascii-trim, linear-text-scans, codegen linear scans; example spaces decode over one index
Runtime and contracts L1-01, L1-02, L1-03 (ruling), L5-01, L5-02 (#39) fixed codegen, self-hosting-graph one handler per shared key; an unspecified oracle matches no Then; kind reserved; two suites bound as verifiers
Runtime and contracts D-c-2 (ruling), D-c-3, D-c-4, D-g-2, GAP7-1, GAP7-2, F-c-1, F-sweep1-2 fixed codegen, runner, testing, studio-s5 unspecified reserved; runtime imports aliased; no inherited name stands in for a handler, Condition, parameter or label
Floor not evaluated L1-05 (#39), C-c-5, XG-T-1 (rulings), F-pr40-claude-1, F-sweep2-12 fixed reader, recipes, studio-floor-not-evaluated, projections-floor-not-evaluated floorNotEvaluated, labelled everywhere a floor is shown; own-key lookups and tallies
Builder trust GAP9-1 (ruling), GAP9-2 fixed anchor-trust, cli, package-smoke the Protocol root's own builders trusted
CLI and package L2-3, L2-5, L9-F2, C1 (#39), E-c-1, E-c-2, E-g-3, E-c-6, GAP5-1 (ruling), M38-c-7 fixed, applied cli-q, studio-s3, package-smoke, bootstrap, check-temporal parse errors placed where the engine reads them; typed CommonJS root; the Node range; the guard sweeps DECISIONS.md
Test wrapper L4-03 (#39), E-c-3, E-c-4, E-c-5, S-E-1, claude-side-T-2, claude-side-T-3, F-sweep2-20 (ruling) fixed (E-c-5 adapted, then superseded by the ruling) self-hosting-duplicate-ids, with real Vitest runs routing as Vitest reads it; options reach both passes; merged reports
Test infrastructure S-I2-3, S-N-2, F-sweep1-13, S-J-1, S-N-1, F-sweep1-14 fixed package-smoke, cli, integration-review, vault-probe; budgets have no deterministic proof tests independent of the npm cache, ancestor configuration and temporary directory; the snapshot race; budgets
Docs and vocabulary L6-1, L6-4, L6-6, L2-6, L9-F1, L9-F4, L9-F5 (#39), H-c-1, H-c-3, H-c-4, S-H-1 (ruling), G-c-2 (ruling), G-c-3, J-c-3 fixed, applied self-hosting-graph, recipes, skills, checkout-v1; job stories have no test docs agree with the graph; carrier at both levels; #durableContent's provisional
Link gate S-M38-3, F-sweep2-23, F-sweep2-10 fixed markdown-links paths and fragments; the lineage notes checked
Corpus rulings (#39) P1–P7 (L2-1, L2-2, L6-3, L12-01), Q1–Q6, K1–K3 (L3-02, L9-F3, L10-9, L11-01, L12-02), Q6a, Q6b, SP1 applied, adapted, fixed oracle pins, recipe 20, studio-s5, studio-slice the accepted proposal; three idea captures; JS-F1's job; labelled intents; #memoPreview; #exportOmitsSlice
Review evidence (PR #38) M38-c-2, M38-c-3, M38-c-6, M38-c-8, M38-c-9, GAP13-1 adapted, fixed check-temporal; the rest is evidence prose one closure condition; row R12; the 21 links listed; 213 pinned links counted; exemptions pinned to the root
Round 4: runtime, recipes F-sweep3-2, F-sweep3-1, F-pr40-claude-4, F-sweep3-3 fixed (F-sweep3-2 adapted), applied runner, recipes, oracle pins dispatch boundaries hold in any realm, stated as #handlerDispatch; recipes 5, 21 and 31 tally foreign readiness exactly
Round 4: carriers F-pr40-claude-3, F-sweep3-5, F-sweep3-6 adapted, fixed, applied markdown-reifier, import-round-trip, gherkin-view, gherkin-reifier one line-ending law in every carrier; Gherkin refusals name their Spec; rule wording
Round 4: wrapper, watch F-sweep3-8, F-sweep3-9, F-sweep3-14 adapted, applied, adapted self-hosting-duplicate-ids, validate-watch @vitest/ui checked first; configuration read as Vitest reads it; fewer watcher rebuilds
Descriptions D-c-1, J-c-2, J-c-5, J-c-6, N-c-5, F-c-3, S-C-4, S-I1-2, F-audit-4, F-audit-8, F-audit-9, F-audit-14, F-sweep2-18 description — PR #39's description, carried forward corrected here
Descriptions M38-c-4, M38-c-5, M38-c-10, S-merge-5, claude-side-T-1, F-sweep2-24 description — PR #38's description, carried forward corrected here
Records N-c-1, F-sweep1-27, F-sweep2-17, F-sweep3-7, F-sweep3-10 recorded — the sections below; for F-sweep3-10, bcd2815f adds the later rounds and the ledger to the evidence

Where the review's other findings went. The concept-document drift (L6-2, D1, L6-5) and the record findings (R1–R12, L8-01, L8-02) go to the delivery-record cleanup. The eight article corrections (L10-4, L10-5, L10-7, L10-8, L10-11, L11-02, L9-F6, L9-F7) are in PR #34, with the 39 second-review findings against that pull request.

New in the corpus

The design diff (recipe 35) from the main graph, built by main's own CLI, measured at the head: 3 Specs added, 43 changed, none removed; 1 Pack changed; 9 bindings changed, each gaining a verifier. What kinds of change landed:

  • Three idea captures, each with a blocking deferral, in pack:self-hosting-v1: AI-assisted reading, bound-file freshness and combination coverage.
  • Answered questions become rules. Cited-line text records #lineRecorded and design entry lineBound; the slice page gains #exportOmitsSlice; the intent panel gains #memoPreview. The cleanup gains #inventoryFirst and keeps #durableContent blocking, its provisional naming the acceptance and the closing commit.
  • New rules on ready Specs: #entryAddressResolution (reader), #reservedThenSlot and #reservedThenKey (slot notation, executable contracts, runnable modules), #notEvaluated and #floorNotEvaluated (the floor and the answer shapes), #writeBoundary and #exclusiveStaging (build pipeline), #defaultInsideRoot (vault), #scaffoldWriteBoundary (authoring on-ramp), #physicalLines (Gherkin authoring), #lineEndings (Markdown authoring), #handlerDispatch (example runner).
  • Publication rules on the frozen projections' Specs: #portablePublication and #safeCleanup on the Design Review, Mermaid, Gherkin and wholesale-rewrite Specs, and a qualified posture on the projections model (delegated, below). The census, the readiness banner and the vault notes gain the ruled floor label.
  • Rules reworded to match the code: discovery's link warning, Markdown block shapes and keys, reserved names in every carrier, the trusted builders, the stamp, the watch, and every Spec that reports a floor.
  • Bindings: test/cli-write-boundaries.test.ts verifies six Specs, and three regression suites became verifiers (the Markdown body grammar's, the structural anchors' and the scaffolder's).
  • Round 4 added #lineEndings, the one line-ending law for every carrier, with matching rules on the envelope contract and the Gherkin view; #handlerDispatch, which executable contracts' planDispatch now points at; and clearer #blockShapes and #keyedEntryShape.

The decision registry gains no row; the carrier ruling (MD-18), the Pack syntax ruling (MD-25), the Gherkin carrier option (MD-27) and planning truths live in ruled graph homes (MD-33) now name the decisions that narrow them.

Rulings

The owner's rulings

Ruling One line Carried by
Accept the seven-change proposal 1–3 repair agent-surface drift; 4–7 record answers accepted in PR #36 reader, cited-line text
Discovery never follows a link (Q1) a link found warns; a root named explicitly resolves first excludes
The panel hands off scope, not a budget (Q2) the job changes, not a Spec JS-F1
Three captures (Q3, Q4, Q5) AI-written presentation, bound-file freshness and slot combinations AI-assisted reading
The hand-off preview splits (Q6) the missing action label is a defect; a collapsed memo preview, with a rule and a UI entry intent panel
The Studio build composes joins (U2) refused is a page that recomputes a join, or a second graph Spec Studio #noSecondGraph
PR #32's delegated rulings stand (U1) as the graph carries them; a later narrowing wins no edit
PR #38's delegated choices seven ratified, the guard's evidence/ exemption among them; one superseded check-temporal.mjs
The inventory answers #durableContent with row rulings: R1, R5, R7, R9, R11, L8-01, L8-02 take their proposed homes; R4 becomes spec:carrier.typescript-authoring; R2 goes to the cleanup's pull-request record, never a Spec; DECISIONS.md stays; the plan-reading gate checks retire with the folders; measure.mjs moves beside its test the rulings, cleanup
The cleanup comes first; PR #36's provisional answers stand recorded by proposal changes 4–7 cleanup
A Pack export leaves out the slice page the question becomes a rule slice page
The eight article corrections accepted PR #34
Reserve kind in Then slots (L1-03) an error and a withheld contract; the Outcome keeps its flat shape slot notation
Reserve unspecified as a Then key (D-c-2) mirrors kind, with its own coverage-gap diagnostic runnable modules
Narrow JS-F1 criterion 7 (G-c-2) "When the panel offers a memo, it previews the exact memo before it leaves." JS-F1
PR #34 stays pinned to b5e0a8be (L34-c-9, L34-g-3) the first refresh pull request after this one re-pins and regenerates the evidence PR #34's description
A floor not evaluated is its own state (C-c-5) in the reader, recipes 7, 9, 11 and 55, and the Studio next-rung floor
…in the frozen projections too (XG-T-1) a corrective label in the Design Review, census and vault; no new decision Spec census page
Trust the extracted Protocol root's own builders (GAP9-1) lookalikes refused; closes GAP9-2 and PR #38's question on dropped anchors anchors
Narrow the Node range (GAP5-1) ^20.19.0 || >=22.12.0, a CommonJS load gate, and the docs package.json
Gloss carrier at both levels (S-H-1, H-c-4) the format; "a carrier file" is one file in it CONTEXT.md
Delivery-fact names in any case (S-C-8) every carrier, as Gherkin did; underscore forms stay ordinary authored honesty
Merge a split run's reports (F-sweep2-20) coverage refused while no provider is installed vitest-test.mjs
One pull request for three arcs PRs #38 and #39 close in favour of this one; PR #34 stays separate —

Delegated choices awaiting the owner's review

Choice One line Where
Rules on the frozen projections' Specs (A-c-5, A-c-6) #portablePublication and #safeCleanup on Specs the shipped projections stay frozen (MD-32) protects, with no refining decision; pages are unchanged, but a case collision exits 1 Design Review
A linked generated/ is refused even inside the root (A-g-1) and the threat model is path checks, not race-free confinement build pipeline
A default vault must resolve inside the root (S-A-5, F-pr40-claude-2) one linked outside or nowhere is refused; a named vault may sit outside vault
The stamp names its staging file (F-sweep1-1) #stampVerb said the stamp touches no other file sharing
A replacing directory is watched in its place (F-sweep1-3, F-sweep3-14) the root included; a root that no longer resolves ends the watch with exit 1; a directory is rebuilt only when replaced or reporting itself validate watch
Gherkin physical lines (F-sweep1-11) titles, steps and description lines refuse a lone CR, U+2028 or U+2029 Gherkin authoring
Reserved properties and nested content (F-sweep1-9) clarifies existing behavior on a ready Spec: a Model term or a key inside a Design value stays content authored honesty
Keys and lone list markers (F-sweep1-7, F-sweep1-8) a key is a letter then letters or digits, and a hyphenated delivery-fact name reads as one; a lone list marker is refused Markdown body grammar
The scaffolder's boundary (claude-side-T-5, F-sweep1-17) each recheck names its checkpoint; a test-only hook authoring on-ramp
The floor label's name and reach (C-c-5) floorNotEvaluated lists the descriptors; every recipe reporting a floor says not evaluated, beyond the four ruled answer shapes
Inherited class methods are step handlers (F-sweep1-2, F-sweep3-2, F-sweep3-1) a class instance's methods dispatch, and so do a built-in parent's (Map, Array, Promise); any realm's Object.prototype and Function.prototype, and an inherited constructor, are refused example runner #handlerDispatch
One line-ending law across the carriers (F-pr40-claude-3) Markdown also refuses U+2028 and U+2029, at the physical line; TypeScript refuses a Spec or Pack whose kept strings hold one; the Gherkin view, a frozen projection, folds every line terminator to a space Markdown authoring #lineEndings
The wrapper's routing and reports (L4-03, E-c-4, F-sweep2-20) list, init and bench run in one spawn; related always splits; a file:line filter is read as its file; a blob report is refused, since Vitest cannot merge into one; an HTML report stops before any pass while @vitest/ui is missing vitest-test.mjs
The link gate's scope (S-M38-3, F-sweep2-10, F-sweep2-23) not carriers, plans/, reviews/, examples/, explorations/, evidence/ or the v0 concept set; fragments match leniently; line anchors stay unchecked markdown-links.test.ts
A lineage note's dead links repointed (F-sweep2-10) the dated annotation scout's links to two removed decision Specs point at 35539a0d, the last commit holding both docs/lineage/
The preview workflow discards the old page set (GAP8-1) so only a page set this run published is stamped studio-preview.yml
Slow-test budgets (S-N-1, F-sweep1-14) raised to hold under load, with no deterministic proof test/
Proposal change 5 stays as accepted (PR #38) the provisional it produced names the acceptance (J-c-3) proposal.json
L4-04 narrowed to the watch root; L4-02's collision refused, not renamed (#39) output keeps the named path and page names src/cli/
Q1's warning narrowed (lane L, B-c-1) departs from "each link it finds gets one warning": a non-candidate file link, and a directory link named like a skipped directory, stay silent excludes #canonicalDiscovery
Q6a's labels (#39) one label map; an unknown action shows its raw string intent-panel.ts
StepFn gains a required third parameter (L1-01) public on ./runner: code that calls, wraps or retypes a StepFn must pass the step runner/index.ts
The root's require condition gains types (L9-F2); the delivery-fact spellings stay internal (L3-01) the published export map changes; the exports do not package.json
Reserved-word findings are errors; generation withholds (L1-03) the ruling named no severity; every generation finding is a warning; D-c-2's ruling then mirrored this executable contracts
C1 fixes the exemption only; the carrier ruling (MD-18) names its narrowers too (L6-4) (#39) the temporal guard's law gets no Spec check-temporal.mjs, DECISIONS.md
Q3's relation types (#39) refines the projections model; dependsOn three Specs AI-assisted reading

Later rulings supersede two of the execution's delegated rows: C-c-5 replaces "an invalid altitude skips floor evaluation" (L1-05), and G-c-2 replaces "JS-F1 criterion 7 capitalized".

An honest record

Out of scope, and left open

  • For the cleanup arc: the record findings and the concept-document drift; R6's re-entry conditions, or dropping R6; R8's home; R12, keep it with a home or drop it; the new location of the plan-46 prototypes, which two Specs cite. None holds #durableContent open; each is settled before the record that holds it is removed. Nothing in plans/ or reviews/ is deleted here.
  • Open by design: register-input's three questions (registerEntry and inputForm, blocking, and textLinks), for its design pass at roadmap place 3; designColumnsSufficiency on the design-maturity Spec, which waits for the first adopter's design passes.
  • The temporal guard over docs/lineage/ (F-sweep3-7) needs a decision. The guard exempts the whole folder as "verbatim historical exhibits", but authored notes live there: the folder README, and PR docs(articles): publish the product and projection narrative #34's annotation context and dated scout. Narrowing it fails both pull requests on their dated lines, so the exemption carries weight while its stated reason is false. Either keep it and say it covers dated historical notes, or narrow it to v0-design/, exempt the scout by name and reword the two dated lines; either way a test pins the boundary.
  • An unratified stated readiness, such as done in a foreign graph, is outside both floor rulings and is left as it was.

Merging beside PR #34

The owner chose the order: this pull request merges first, and PR #34 then merges main into its own branch and merges once CI passes there. Before this merge, the combined tree (this head 93cf4194 with PR #34's head 22c49262 merged on top) passed npm run check (135 files and 4,137 tests, plus 102 in the CLI pass) and npm run check:articles (11 blocks at b5e0a8be). That was a local run; the gate of record is PR #34's CI on its updated branch.

Git reports one content conflict, at the top of README.md, and it is the same in either order. This branch moves the README's Carrier rule: paragraph under a new ## Carriers section and puts a newcomer's sentence in its place; PR #34 keeps the paragraph inside its new product-story section. PR #34's branch resolves it in this order:

  1. this branch's sentence ("You write Specs as Markdown files…") directly after the opening paragraph;
  2. PR docs(articles): publish the product and projection narrative #34's ## Read the product story, without its Carrier rule: paragraph;
  3. the existing "Read the [concept]…" line.

Check: grep -c 'default to Markdown' README.md prints 1 (N-c-1), and prettier --check README.md passes. Once both have merged, the link gate reads PR #34's articles and lineage notes too, and the scout's repointed links follow PR #34's rename of that file. The first refresh pull request after this one re-pins the articles, as the owner ruled; it needs this pull request's section-level deliveryFacts refusal (S-L34-2).

Try it

git fetch origin fix/second-review-pass && git checkout fix/second-review-pass
npm ci && npm run build

# 0 errors and the three pinned honesty/gaps warnings; note the "specs · packs · anchors" line
pnpm --silent sdp validate . --exclude explorations --exclude examples --exclude test/fixtures/import/parity

# The open-question register: the three captures, and #durableContent's provisional
pnpm --silent sdp:q "$(cat dist/recipes/20-open-question-register.js)"

# A linked generated/ is refused even inside the root: "unsafe output parent ... is a symbolic link"
mkdir -p /tmp/sdp-try/corpus/inside && ln -s inside /tmp/sdp-try/corpus/generated
cp specs/consumers/ai-assisted-reading.sdp.md /tmp/sdp-try/corpus/ && node dist/cli/sdp.js build /tmp/sdp-try/corpus

# A delivery fact in any case: extract/reserved-property for "Has-Verifier"
mkdir -p /tmp/sdp-try/fact && printf '%s\n' '---' 'id: spec:try.fact' 'kind: behavior' 'altitude: story' 'readiness: idea' 'relations: {}' '---' '# A hand-authored fact' '## Intent' '- outcome: Show the refusal.' '## Rule' '- Has-Verifier: the suite' > /tmp/sdp-try/fact/f.sdp.md
node dist/cli/sdp.js validate /tmp/sdp-try/fact

# A Then keyed unspecified: a conformance/reserved-then-key error; the space contract is withheld
mkdir -p /tmp/sdp-try/unspec && printf '%s\n' '---' 'id: spec:try.unspecified' 'kind: behavior' 'altitude: story' 'readiness: idea' 'relations: {}' '---' '# A reserved Then key' '## Intent' '- outcome: Show the refusal.' '## Example space' '```gwt-vocabulary' 'Given an order' 'When the order is placed' 'Then unspecified' '```' > /tmp/sdp-try/unspec/u.sdp.md
node dist/cli/sdp.js validate /tmp/sdp-try/unspec

# A foreign graph with an unratified altitude: [ 'altitude' ], then "| floor not evaluated (unratified descriptor) | 1 |"
node --input-type=module -e '
import { createReader, extract, renderCensus } from "./dist/index.js";
const { graph } = extract({ root: "examples/checkout-v1" });
const id = "spec:orders.order-placement-flow";
const foreign = { ...graph, nodes: graph.nodes.map((n) => (n.id === id ? { ...n, altitude: "planet" } : n)) };
console.log(createReader(foreign).specContext(id).floorNotEvaluated);
console.log(renderCensus(createReader(foreign)).find((p) => p.path === "index.md").content.match(/^\| floor not evaluated.*$/mu)[0]);
'

# The same graph wherever the engine sits: the copy prints the same "specs · packs · anchors" line
mkdir -p /tmp/sdp-try/copy && git archive HEAD | tar -x -C /tmp/sdp-try/copy
node dist/cli/sdp.js build /tmp/sdp-try/copy --exclude explorations --exclude examples --exclude test/fixtures/import/parity

# The link gate; one merged JUnit report from the split run (the second command runs the whole suite)
npm test -- test/markdown-links.test.ts
npm test -- --reporter=junit --outputFile=/tmp/sdp-try/report.xml

# The design diff from main, against a graph built by main's own CLI
git worktree add ../sdp-main b5e0a8be && (cd ../sdp-main && npm ci && node dist/cli/sdp.js build . --exclude explorations --exclude examples --exclude test/fixtures/import/parity && cp generated/graph.json ../main-graph.json)
pnpm --silent sdp:q "$(cat dist/recipes/35-the-design-diff.js)" --params base=@../main-graph.json

The quoted outputs were re-measured at bcd2815f, whose engine matches f5f7fd5b's build (bcd2815f changes only evidence/). The link gate ran inside npm run check. The JUnit command, re-run at bcd2815f, wrote one merged report of 4,112 tests in 135 files with no failure, the CLI pass included. The intent panel is in the live previews above: under rule.memoPreview, "Propose new text", "Gather", then open "Preview memo" in "Composing (1)".

Feedback wanted

  • Rules on the frozen projections' Specs. #portablePublication and #safeCleanup change no page but add rules to four Specs that the shipped projections stay frozen (MD-32) protects. Do they belong there, or in a decision that refines that ruling?
  • The write boundary's threat model. Path checks before each mutation, a refused linked generated/, and an identity check that detects a swap rather than prevents it. Is that the right line for a CLI with no openat-style calls?
  • Where a link warns. Only when the entry it stands for could hide a carrier or anchor. Is that Q1's intent, or should every link warn and this repository exclude its own?
  • The default vault. Refused only when it resolves outside the root, while a named vault may sit outside. Is that the placement the vault Spec means?
  • The temporal guard over docs/lineage/: which boundary?

Measured at the head

Re-run the recipes rather than inheriting these numbers. The base column was re-measured for this description with main's own CLI over an archive of b5e0a8be; both columns use the corpus exclusions.

Measure Base b5e0a8be Head
Specs · Packs · anchors 456 · 9 · 607 459 · 9 · 611
Graph nodes · edges 1072 · 2978 1079 · 2996
sdp validate 0 errors · 3 warnings (the pinned honesty/gaps) 0 errors · the same 3 warnings
Build backlog (recipe 1) 2: spec:consumers.edit-model, spec:consumers.intent-composition the same 2
Drift alarm (recipe 2) 0 0
Open questions (recipe 20): total · blocking · non-blocking 16 · 10 · 6 15 · 12 · 3
Deferrals · holds · Specs with questions · malformed 6 · 4 · 12 · 0 9 · 3 · 12 · 0
Mention audit (recipe 22): unbacked · unresolved 0 · 0 0 · 0
npm run check not re-measured at f5f7fd5b (the head less its evidence commit): every step through check:example passed, 134 files and 4,010 tests plus 102 in the CLI pass; the last step, preflight, flagged the then-uncommitted evidence files bcd2815f commits
npm run check:git-install not re-measured pass at f5f7fd5b: npm and pnpm clones, npm archive
CI — pass on bcd2815f: push and pull-request runs
Diff from main — 137 commits (26 merges); 217 files, +17,042 / −1,040; without evidence/, 201 files, +12,884 / −1,040

Next

The next work, from the roadmap (recipe 55, rendered at the head)

Roadmap: The Protocol's roadmap pack:roadmap

To state means the floor allows ready and a person still judges the statement. Built means every Spec of the entry's work states ready and has an implementation binding; it reports no passing test and no deployment.

The Protocol's next work, first entry first. The order is a preference: it dates, gates and sequences nothing, and what each entry still needs is read from the graph each time.

First the cleanup that removes the frozen plans, review reports and superseded concept material, as the roadmap and the pull request record make possible. Then the two steps a reader of the Studio's pages could not take, the words of a test line that checks a declaration and an outside register's entries, and then the composed-intent model the build backlog holds. What the first adopter's mass update asks for joins when the owner selects it; a capture landing adds nothing here. An entry leaves by an edit to this manifest once its selected work is complete or no longer belongs among the next work.

To design

Place Entry Next Purpose and reach
1 The Protocol removes its frozen plans, review reports and superseded concept material spec:protocol.delivery-record-cleanup itself idea → scoped, nothing holds it; blocked by spec:protocol.delivery-record-cleanup#question.durableContent Remove plans/, reviews/ and the superseded concept material from the tree, after moving into the graph the durable content they still hold, so the repository keeps one delivery record: the graph, git and the pull requests.
3 An outside register is a named Studio input, so a cited token links to its entry spec:consumers.spec-studio.register-input itself scoped → defined, held by no-blocking-open-questions; blocked by spec:consumers.spec-studio.register-input#question.registerEntry, spec:consumers.spec-studio.register-input#question.inputForm A cited token reads as bare text on every page, and the register that defines it is neither linked nor shown.

To state

Place Entry Earlier waiting statements Purpose and reach
2 A pinned declaration shows the words of each test line that cites it spec:consumers.spec-studio.cited-line-text No preceding waiting statement in the statement queue. The declarations page names each citing line by file and line only, so the reader leaves the page to read it, and has no route at all when the page set carries no source link.

To build

Place Entry Purpose and reach Rests on
4 Views compose scoped intent instead of patching canonical source spec:consumers.edit-model Let a view frame a requested change without giving derived surfaces a direct write path to canonical source. nothing unbuilt

Waiting on the owner

  • spec:protocol.delivery-record-cleanup#question.durableContent (blocking), place 1: Which content in plans/, reviews/ and the concept documents does no Spec, test, decision or recipe carry yet, and where does each piece belong?
  • State spec:consumers.spec-studio.cited-line-text: it states scoped and its floor allows ready; place 2
  • State spec:protocol.delivery-record-cleanup: it states idea and its floor allows scoped; place 1

Deferred, with their triggers

  • spec:carrier.sdp-import.feature-adapter#question.featureAdapter: Which bare .feature constructs can an import adapter preserve honestly? Trigger: an adopter migrates a gen-1 .feature corpus into the Protocol
  • spec:consumers.agent-surface.combination-coverage#question.combinationCoverage: Which combinations of slot values should coverage enumerate and report? Trigger: a design pass asks which combinations no example exercises
  • spec:consumers.ai-assisted-reading#question.aiPresentationBoundary: If an assistant generates explanations or arrangements beyond selecting deterministic readings, what contract keeps its output distinct from graph claims and makes the exact reading reviewable, including how the exact output is retained with its model, prompt and inputs? Trigger: the UX design pass measures that assistant selection or a generated explanation helps a named review task
  • spec:consumers.impact-graph.symbol-reach#question.symbolIdentity: Which language-neutral identity and extraction boundary can support exhaustive symbol reach without freezing a single compiler's representation into the Protocol? Trigger: a reader needs symbol-level reach that file-level imports and curated anchors cannot give
  • spec:consumers.projections-model.roadmap-views#question.releaseReader: Does a reader need release or baseline views that the roadmap, the recipes and git tags do not serve? Trigger: the first published release
  • spec:consumers.reference-projection#question.namedOutsideReader: Does a human reader outside the repository need a reference projection the four shipped roots do not serve? The taxonomy row is not that reader. Trigger: a named consumer outside the repository, with a way to measure that demand inside the arc that builds the projection
  • spec:consumers.structural-mermaid#question.namedStructuralReader: Does a reader need diagrams rooted at code units, which census tables and Spec-rooted one-hop Mermaid do not serve? Trigger: a named reader with that need, plus a decision that refines spec:decisions.shipped-projections-frozen for the affected Mermaid rendering or supersedes that ruling whole
  • spec:observation.run-evidence.bound-file-freshness#question.freshness: When should changes to bound files make recorded run evidence stale? Trigger: a reader cannot tell whether a run at another commit still applies, because nothing says whether its bound files changed since
  • spec:observation.runtime-overlay#question.observationIdentity: Which external observation identity and freshness boundary is small enough for the graph while still supporting an honest observed delivery fact? Trigger: An adopter needs runtime measurements linked to measurable Spec targets and can supply an observation identity and freshness policy for review.

Why this order (the owner's reasons, unchanged since PR #36; the memo does not carry them):

Place Entry The owner's reason
1 spec:protocol.delivery-record-cleanup A dedicated pull request removes plans/ and reviews/ once PR #36's precedent has landed
2 spec:consumers.spec-studio.cited-line-text Closes a step a reader could not take in PR #35's reader tasks
3 spec:consumers.spec-studio.register-input Closes the other such step
4 spec:consumers.edit-model The composed-intent model is the whole build backlog

Re-entry: the cleanup at place 1 opens once this pull request merges. Its first commit lands the accepted inventory, as ruled, and closes #durableContent; R6, R8, R12 and the prototypes' new location are settled within that arc, each before the record that holds it is removed.

Refused, durably (PR #36's list, with the Studio item as U2 worded it): a rung stated by tooling; priority as a date, a schedule, a gate or a new relation; a roadmap that lists every feature; a slice or a capability as a new grouping primitive; an "over-designed" check; a diagram derived from prose; an anchor added for coverage; a tool that edits a carrier itself; a count, date or plan number inside a Spec; a Studio page that recomputes a join, or a second graph.

The owner's decisions this pull request asks for:

  1. Review the delegated choices, above all the rules on the frozen projections' Specs, the write boundary's threat model, the narrowed link warning, StepFn's required parameter and the export-map change.
  2. Choose the temporal guard's boundary over docs/lineage/ (F-sweep3-7).
  3. Rule on R12, keep or drop, before the cleanup removes concept 01.
  4. Review PR docs(articles): publish the product and projection narrative #34's second-pass changes on its own branch and merge it first; then merge this pull request with the README resolution above.

This pull request completes no roadmap entry, so the manifest is not edited.

🤖 Generated with Claude Code

RetriggerView in GreptileConfidence Score: 5/5

The reviewed changes appear safe to merge; no actionable defect was established.

Summary

This PR hardens writes, carrier checks and generated contracts, then updates the Specs, docs and tests to match.

  • Build and publishing commands check output paths before changing files.
  • Carriers cannot author delivery facts, whatever case they use.
  • Readers show when a readiness floor cannot be evaluated.
  • The extractor finds anchors when the engine sits outside the Protocol root.
  • Executable examples reserve kind and unspecified for clear contract outcomes.
  • The test wrapper routes Vitest options and combines split-run reports.
  • The package declares Node versions that can load its CommonJS entry.
  • Carriers read physical lines consistently, and repository Markdown links gain a check.
  • The Studio labels gathered intents and lets people preview a memo before copying it.
  • The repository’s review records and guidance describe the accepted inventory and updated rules.

No actionable defect was established. Tests and builds were not run during this review.

Acknowledged choices from darko-mijic were not reported again: path checks do not promise race-free confinement; inherited built-in methods remain eligible handlers; StepFn gains its third argument; subpaths remain ES-module-only; related always splits; blob reports and coverage remain refused. darko-mijic also explicitly leaves the temporal guard over docs/lineage/ and foreign stated readiness open.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[Authored carriers and code anchors] --> B[Discover and reify]
  B --> C[Derive graph and validate]
  C --> D[Generate contracts]
  C --> E[Reader]
  E --> F[Render pages and notes]
  D --> G[Check output parent]
  F --> G
  G -->|Safe| H[Stage and publish]
  G -->|Unsafe| I[Refuse writes and cleanup through that parent]
Loading

Reviews (1) · Last reviewed commit: "fix: preserve cmark comment and referenc..." · Reviewed by Greptile

darko-mijic and others added 30 commits November 3, 2026 17:42
Owner working rules: run a deep review of the whole repository as one phase of the next
work, doing as much as possible through the relay plugin (GPT and Claude reviewers in
fan-outs and workflows) while the coordinating session keeps its context for coordination
and execution. Commits, push and a draft pull request are authorized; the owner reviews
and merges.
Base: main b5e0a8b (PR #36).
Arc Pack: none. The review is input to the roadmap's first entry,
spec:protocol.delivery-record-cleanup, whose blocking question its inventory answers.

Add the review's evidence scaffold: why it runs, the nine lanes with their reader and
verifier model families, and where each kind of finding goes. The directory is removed
before merge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR #34 named the review's second input: the compact article packet and the seed / current /
future distinctions. Add two lanes that carry it, seed to current and current to future,
each verified by the other model family, and say how the seed design is read: as a
reference lens, never intended truth.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An arc commits evidence that no test or recipe carries under evidence/prN/ on its branch
and removes it before merge, the convention PR #36 followed. That evidence is temporal by
genre: an inventory of the frozen records cites plan files by path and quotes the dated
records it classifies. Exempt evidence/ beside the existing .omo/evidence/ exemption, so a
review's evidence can cite what it reviews without failing the guard on its branch. On main
the directory is empty once each arc removes its evidence.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Twelve lanes read main at b5e0a8b: nine engineering lanes, two product-lens lanes (seed to
current, current to future) and a PR-record lane over PRs #36, #35, #33, #32 and #31. A
reader from one model family (GPT through the relay plugin, or Claude) produced each lane's
findings; a verifier from the other family re-measured each one.

- README.md: the dossier, with lanes, models, counts, coverage gaps and re-measure commands.
- findings.md and findings.json: the engineering lanes' findings with their verdicts.
- product-lens.md and .json, pr-record.md and .json: the other three lanes.
- inventory.md: the measured answer to
  spec:protocol.delivery-record-cleanup#question.durableContent, for the owner's review.
- open-questions.md: owner questions ready to author.
- proposal.json, proposal-check.json, proposal-memo.md, not-proposed.md: one change
  proposal based on b5e0a8b, seven changes, checked by recipe 38 with nothing moved or
  unresolved.

Arc evidence: removed before merge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner working rules: execute the confirmed findings of the whole-repository review (PR #38)
with the same approach as the review: workflows of Claude and GPT agents (GPT through the
relay plugin), each lane implemented by one model family and reviewed by the other, while
the coordinating session keeps its context for coordination and execution. Commits, push
and a draft pull request are authorized; the owner reviews and merges.
Base: main b5e0a8b (PR #36), the commit the review read.
Arc Pack: none. The arc executes PR #38's findings; record findings wait for the
delivery-record cleanup, and owner questions are authored, not answered.

Add the arc's plan: six lanes with their finding ids, implementing and reviewing families,
and what stays out of scope. The directory is removed before merge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hrough against the graph

L6-1: AGENTS.md names only honesty/gaps as check:self-hosting's retained warning, tested against the oracle.
L6-4: DECISIONS.md names every narrowing decision on the narrowed row (MD-33, MD-25, MD-27, MD-18), tested over refines edges.
L2-6: the recipe catalog lists every recipe reporting an absent subject by its answer shape, tested by running each.
L6-6: the sdp-agent-surface skill separates the three ruled entry adapters from the reader joins, tested against the rule.
L9-F1: the checkout-v1 README shows the build summary its extraction produces, tested.
L9-F4: the capture job asks for kind and altitude and accepts a parent relation for intent, matching AC1.
L9-F5: the README explains carriers after the quick start and states the Studio's five lenses as the graph does.

From the whole-repository review (PR #38). Each finding was verified by a second model family, and this lane's diff was reviewed by the other.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The owner accepted the inventory as the answer to
spec:protocol.delivery-record-cleanup#question.durableContent, with row rulings: proposed
homes for R1, R5, R7, R9, R11, L8-01 and L8-02; a new TypeScript-authoring carrier Spec for
R4; R2 in the cleanup pull request's record, never a Spec; and the live dependencies'
dispositions. R6, R8 and the plan-46 prototypes stay open for the cleanup arc. The cleanup
arc lands this inventory in its first commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ry review

L3-01: one delivery-fact spelling list, outside the public barrel, feeds the authoring-shape check, extraction's reserved keys and the Gherkin tag pattern, so the camelCase hasVerifier is refused everywhere.
L1-04: Markdown list text refuses the block shapes the carrier rules list (nested bullets, ordered prefixes, pipes, block quotes, thematic breaks); code-span forms stay accepted.
L1-05: readiness-floor evaluation and derived readiness skip a Spec with an unratified altitude instead of reporting floor failures for it.
L1-03: not changed; reserving kind in Then slots needs an owner ruling.

From the whole-repository review (PR #38). Each finding was verified by a second model family, and this lane's diff was reviewed by the other.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pecified oracle

L1-01: a key shared across phases gets one handler that branches on the occurrence's phase, so the first When invokes the product and a Then compares; StepFn gains an optional third step parameter.
L1-02: an unspecified oracle never matches a Then, so completion raises the existing noMatchingThen diagnostic and no observation or assertion runs.

From the whole-repository review (PR #38). Each finding was verified by a second model family, and this lane's diff was reviewed by the other.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s verifiers

L5-01: test/markdown-reifier.test.ts declares test:protocol.markdown-body-grammar-regressions, verifying spec:carrier.markdown-body-grammar.
L5-02: test/structural-anchors.test.ts declares test:protocol.structural-anchor-regressions, verifying spec:model.anchors.
The self-hosting oracle pins move by the two new anchors, nodes and binding edges.

From the whole-repository review (PR #38). Each finding was verified by a second model family, and this lane's diff was reviewed by the other.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…answers

From the whole-repository review: two ready consumer Specs have drifted behind the realized agent surface, and three provisional answers the owner accepted in PR #36 are recorded only in its description.
Proposal base: b5e0a8b.

P1: wrapIdiom calls the recipe through the `recipes` binding
P2: the reader's method inventory names resolveEntryAddress
P3: the reader gains the #entryAddressResolution rule; its rule keys shift
P4: delivery-record-cleanup gains the #inventoryFirst rule
P5: #durableContent keeps blocking with the accepted provisional
P6: cited-line-text records #lineText's answer as the #lineRecorded rule
P7: cited-line-text records #lineBound's answer as a design entry; readiness stays scoped

From the whole-repository review (PR #38). Each finding was verified by a second model family, and this lane's diff was reviewed by the other.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Q1: no symbolicLinks question; the owner ruled it out of the corpus
Q2: JS-F1 hands scoped intent to an agent that picks its own budget (recipe 36)
Q3: the AI-assisted reading capture keeps the four ruled links, each a reasoned relation
Q4: the bound-file freshness trigger is the owner's wording; the owner decides
Q5: #perSlotOnly drops its deferral clause; the combination capture carries it
Q6: no handOffPreview question; the label and memo preview go to another lane
K1: spec:consumers.ai-assisted-reading, an idea capture with a blocking deferral
K2: spec:observation.run-evidence.bound-file-freshness takes #freshness off the ready parent
K3: spec:consumers.agent-surface.combination-coverage, an idea capture with a blocking deferral

From the whole-repository review (PR #38). Each finding was verified by a second model family, and this lane's diff was reviewed by the other.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
L4-01: stage build outputs with exclusive creation after unlinking stale entries, and refuse an unsafe or dangling generated parent before any write or cleanup.
L4-04: resolve only the watch root's physical path, so validate, Studio and vault watch run through a linked root while output keeps the named path.
L4-02: refuse view, mermaid and gherkin publication when two page paths collide by case, naming both paths and IDs.
Q1: discovery never follows a symbolic link below the root, warns once for each link outside an excluded or skipped path, and resolves an explicitly named root first; the excludes Spec and oracle pins follow the owner's ruling.

From the whole-repository review (PR #38). Each finding was verified by a second model family, and this lane's diff was reviewed by the other.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
L2-3: sdp q reports an unterminated template at its correct body position.
L2-5: studio help states the build-owned-path refusal the CLI enforces.
L3-03: Markdown ASCII trimming is linear, so long whitespace runs no longer stall extraction.
L4-03: the vitest wrapper forwards option values and listings, keeping the dedicated CLI pass for executing commands.
L9-F2: the root export ships CommonJS declarations for require consumers, and check:git-install walks nested conditions.
C1: the temporal sweep no longer exempts the decision registry.

From the whole-repository review (PR #38). Each finding was verified by a second model family, and this lane's diff was reviewed by the other.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	test/self-hosting-graph.test.ts
Nothing failed the gate after the merges; the full npm run check passed at 58a1690. The merge did
leave the handbook stating a falsehood that neither lane could see alone. Lane D rewrote the
AGENTS.md paragraph to say check:self-hosting emits only honesty/gaps warnings and that any other
new warning is a regression. Lane W's discovery ruling (Q1) makes the same step's build line count
one pinned extraction warning, extract/symbolic-link-skipped for the CLAUDE.md link. Lane D's test
read only validateGraph's findings, so it passed while the paragraph misled.

The paragraph now names that pinned extraction warning, and the handbook test also requires every
pinned extraction finding to be named there. Without the sentence the test fails: expected the
paragraph to contain "`extract/symbolic-link-skipped` names the `CLAUDE.md` link".

The one merge conflict, lane H2 against lane C's oracle totals, was resolved in the H2 merge by
adding both sides' deltas and confirming them with sdp validate and the oracle tests:
459 Specs, 609 anchors, 812 binding edges, 1077 nodes, 2989 edges.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…or anchor

Q1n: discovery still never follows a link below the root, but a link now warns only when it targets a directory or its name is a carrier or anchor-candidate name; the CLAUDE.md link no longer warns, and the handbook sentence and test pins for it are removed.
Carries out the owner's rulings on the whole-repository review (PR #38); the diff was reviewed by the other model family.
Narrows the owner's Q1 ruling to candidate links; awaiting the owner's review.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Q6a: each gathered row reads `<scope> <action label>: <request>`, per #ui.gatheredIntents; the compose dialog and the panel share one label map, and change-pack gets its own label.
Q6b: new rule #memoPreview and UI entry memoPreview; the panel shows a closed, read-only `Preview memo` of the memo it copies and saves, before the copy and save actions.
Carries out the owner's rulings on the whole-repository review (PR #38); the diff was reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SP1: the slice page's open question #exportCarriesSlice becomes rule #exportOmitsSlice; the export already behaved this way, and a new test pins it.
Carries out the owner's rulings on the whole-repository review (PR #38); the diff was reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The owner ruled on all six of the review's questions (PR #38); this arc
carries the rulings out. The README now lists lanes S and L, a results
table per lane, and what stays open: L1-03, and R6, R8 and the plan-46
prototypes for the cleanup arc.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- L1-03: a Then slot named `kind` collides with the flat Outcome
  discriminant. The slot-notation and executable-contracts Specs gain a
  keyed `#reservedThenSlot` rule; a new error-level conformance check,
  `conformance/reserved-then-slot`, reports it with a probe pair; contract
  generation withholds the affected space or step contract with a
  `contracts/reserved-then-slot` warning that names the reserved word.
  Given and When slots stay unrestricted and the Outcome stays flat.

Carries out the owner's ruling on the whole-repository review (PR #38); the diff was reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
L1-03 is ruled by the owner and carried out by lane K (6780da5): Then
slots reserve `kind`. Lane H1's row keeps its finding that L1-03 needed
a ruling; L1-03 leaves the still-open list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	check-temporal.mjs
@darko-mijic darko-mijic changed the title fix: a second review pass over PRs #34, #38 and #39 review: the whole repository, its fixes, and the durable-content inventory Nov 4, 2026
@darko-mijic
darko-mijic changed the base branch from fix/review-findings to main November 4, 2026 02:30
darko-mijic added a commit that referenced this pull request Nov 4, 2026
`views the self-hosting corpus from the default repository root` builds and views a copy of the
whole self-hosting corpus twice. CI's runner took 15.1 s and 15.5 s on two recent runs, past its
15 s budget, and failed the gate. The budget is now 120 s, the same change PR #40 makes to this
test, so the two branches merge cleanly in either order.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
darko-mijic added a commit that referenced this pull request Nov 4, 2026
Adds the same two-line comment PR #40 writes above this budget, so the two branches make the identical change and merge without a conflict in either order.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
darko-mijic and others added 15 commits November 4, 2026 04:06
- F-sweep3-2: stop at terminal object and callable prototypes across realms,
  preserving inherited instance and static class handlers and their receiver.
- F-sweep3-1: state dispatch eligibility, refusals and diagnostics in the
  carrying Specs and update the exact self-hosting oracle pins.

Second review pass over PRs #34, #38 and #39; the diff is reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- F-pr40-claude-4: count readiness in Maps in recipes 5 and 31 so constructor
  and __proto__ remain numeric counts and every member or decision is counted.
- F-sweep3-3: count foreign readiness under unratified in recipe 21, retaining
  the original value on each row and the structural meanings of unresolved
  and nonSpec.

Second review pass over PRs #34, #38 and #39; the diff is reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… keys

- F-sweep3-6: #blockShapes now says a star, a plus sign or an ordered-list
  prefix is refused when followed by whitespace or the end of the line, and
  names the hyphen-and-tab opener the parser already refuses. #keyedEntryShape
  now says a key is one ASCII letter followed by zero or more letters or
  digits, so `a: note` is a key. The oracle pins follow, and new reifier tests
  pin both edges in narrative, section prose and list text.

Second review pass over PRs #34, #38 and #39; the diff is reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- F-sweep3-5: the lone CR, U+2028 and U+2029 refusal for title and step lines
  carried no subjectId, so a per-Spec findings lookup and the census subject
  column dropped it. The check now takes the owning Spec's id: a Scenario's
  own id for its title and steps, and the Feature's id for the Feature title,
  Rule titles and the @example-space pseudo-scenario. The other refusals
  inside a Rule or the pseudo-scenario, its steps included, now name the
  Feature as well. The Feature and Scenario title checks run after the
  identity tags are read; final findings are still sorted by line.

Second review pass over PRs #34, #38 and #39; the diff is reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…reporter first

- F-sweep3-9: the wrapper read reporting settings with Vitest's public resolveConfig, which
  ignores --configLoader and reads a --config value as a path only. A configuration that loads
  only under the runner loader, or that comes from a package, went unread, so the merge was
  skipped and the CLI pass overwrote the pooled pass's report. The wrapper now passes the
  caller's loader and looks a --config value up as a module from the root first, as the passes
  do. Two real-Vitest tests cover both cases.
- F-sweep3-8: a split run with the html reporter ran every test before the merge step failed on
  the missing @vitest/ui. The wrapper now looks for @vitest/ui where Vitest does, from the root
  and from Vitest's own folder, and refuses the run before any pass when it is missing.

Second review pass over PRs #34, #38 and #39; the diff is reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- F-pr40-claude-3: only the Gherkin carrier refused these separators in titles,
  so a Markdown or TypeScript Spec could carry `Title<U+2028>@implemented ...`
  and the Gherkin view published it unchanged. One law now holds, stated as
  #lineEndings on the Markdown authoring Spec: no title, prose line, entry or
  step of a Spec or Pack holds a lone CR, U+2028 or U+2029; LF and CRLF are
  the only line endings. The Markdown envelope refuses all three anywhere in a
  carrier, Spec or Pack manifest, at the physical line (a lone CR was refused
  at line 1 before). The TypeScript carrier refuses a Spec or Pack whose
  title, narrative, framing or section string holds one, at the literal's
  line. The Gherkin view folds CRLF, CR, LF, U+2028 and U+2029 to one space
  and splits narrative paragraphs at LF or CRLF blank lines. `sdp new spec`
  refuses the separators in --title and --outcome, so it never writes a
  carrier the extractor refuses. The envelope-contract and gherkin-view Specs
  and their oracle pins follow; evidence/pr40/README.md records the law as a
  delegated ruling for the owner.

Second review pass over PRs #34, #38 and #39; the diff is reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…reports itself

- F-sweep3-14: the watcher retired and resubscribed a watched directory's subtree on any rename
  at its path, and rebuilt every handle when the root's handle reported a rename under the
  root's own name. A non-carrier entry named after the root (`docs/docs`), a rename macOS
  reports for a directory that has not moved, and a filesystem whose inode numbers change from
  one read to the next all rebuilt handles and started runs.
  - A rename at a watched directory's path no longer retires it while its identity matches.
  - A directory deleted and recreated with its inode reused is still recovered: inotify reports
    the deletion on the directory's own handle, under its own name, and that report now
    reconciles the directory in place, the root included. The watcher remembers which
    directories hold an entry with their own name, so that entry's events stay ordinary.
  - A changed identity counts only when a second read confirms it.
  - Tests count opened and closed handles and runs for each case, and cover recovery of a
    directory and of a root recreated with a reused inode. Real watchers on macOS and Linux
    no longer run for the `docs/docs` entry.
  - The watch Spec states that a directory's own report schedules a run, and that a platform
    reporting a change to the directory's attributes the same way runs then too; the oracle pin
    follows.

Second review pass over PRs #34, #38 and #39; the diff is reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…or line breaks

- F-pr40-claude-3 (review round 1): the separator check scanned every literal under a title,
  narrative, framing or section, so a lone CR, U+2028 or U+2029 written only in an erased type,
  such as `title: ("Normal title" as string | "
")`, refused the whole Spec or Pack. The
  check now walks the reified value beside its syntax, as the section sanitizer does, and runs
  after the field is reified. A type in an assertion and a value dropped as non-static or
  repeated refuse nothing; a separator inside an asserted value is still refused at its line.

Second review pass over PRs #34, #38 and #39; the diff is reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- F-sweep3-9: the wrapper resolved a `--config` value with Node's require
  resolver, which reads a package's exports for require. Vitest reads them as
  an import does, so a configuration package exported for import alone went
  unread, the merge was skipped, and the report kept the CLI pass alone with
  exit 0. The wrapper now calls the resolver Vitest bundles, mlly's
  resolvePathSync, with the same arguments, and declares mlly 1.8.2 (already
  in the lockfile through tsup) as a development dependency. New rows cover an
  import-only package and one whose require entry names another file.
- F-sweep3-9: the runner-loader test passed without the configLoader fix when
  its temporary root had no node_modules above it, because Vite then bundles
  beside the configuration and the relative import resolves. The fixture now
  has its own node_modules folder.

Second review pass over PRs #34, #38 and #39; the diff is reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…birth time

- F-sweep3-14: a directory deleted and recreated with its inode number reused,
  whose new self already held an entry with its own name (`docs/docs`), kept
  its dead handle: the dead handle's report of the deletion named an entry that
  now stood there, so it read as that entry's event. With such an entry
  standing, a rename event naming it now rebuilds the directory unless the
  directory still has the birth time its handle was opened with. A recreated
  directory is born again even when it gets the old inode number, so recovery
  holds, and an entry renamed or created under a directory that stays put
  still costs nothing. Where the filesystem reports no birth time, the event
  rebuilds the directory once and schedules a run.
- The watch Spec's carrier-and-ignore rule states that remaining run, and its
  oracle pin follows.
- Tests: the root and a watched directory deleted and recreated with the inode
  reused and an own-name entry, with and without one before, with and without
  birth times; the one rebuild where no birth time is reported. The cost tests
  for own-name entries now state the birth times they assume.

Second review pass over PRs #34, #38 and #39; the diff is reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- F-sweep3-14: an event naming a watched directory that kept its identity
  still read that directory and every directory under it, and reported their
  carriers as created, so a run started that changed nothing. Discovery now
  reads only directories that are not watched yet: new ones, and replaced or
  rebuilt ones, whose handles are dropped first. The cost tests now keep their
  carrier inside the directories the events name, and a new test checks that
  a directory that arrives or replaces a watched one is still read in full.

Second review pass over PRs #34, #38 and #39; the diff is reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The plan named the first fix lanes only. Record what followed: a final verification of the
integrated branches and a closing review of the third round's diffs, the fix lanes each fed, and
the merge of PR #38's branch that makes this the one pull request for all three arcs. Correct two
statements in the plan: the owner ruled on ten questions, and three of the fifteen review lanes
were read by one model family. Add the findings ledger: every finding of the pass with its
verdict, where it was handled and the commits that name it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
darko-mijic added a commit that referenced this pull request Nov 4, 2026
The Design Review's two-root render and the 40-by-40 capability fold timed out under a loaded
parallel run (20 s and 5 s budgets). These are the same budgets PR #40 raises, to 120 s and 60 s;
the two files are now byte-identical to PR #40's, so the branches merge cleanly in either order.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner working rules: review PR 40 with model agents, fix only high-confidence findings, and verify with npm run check. Commit and push are owner-authorized. Base: bcd2815 (PR 40 head), targeting main b5e0a8b. No arc Pack; these repairs carry out the PR's existing review record.
@darko-mijic
darko-mijic marked this pull request as ready for review November 4, 2026 07:27
@darko-mijic
darko-mijic merged commit 480ded4 into main Nov 4, 2026
6 checks passed
darko-mijic added a commit that referenced this pull request Nov 4, 2026
The owner ordered the merges: PR #40 first, then this branch merges
main and merges once CI passes. One content conflict, at the top of
README.md, resolved in the order both descriptions give: PR #40's
newcomer sentence, then this branch's product-story section without
its Carrier rule paragraph, which now lives under PR #40's ## Carriers.
`grep -c 'default to Markdown' README.md` prints 1.

The merged tree (385e3af) is the one that passed `npm run check` and
`npm run check:articles` locally before PR #40 merged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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