Skip to content

fix: execute the whole-repository review's findings - #39

Closed
darko-mijic wants to merge 25 commits into
mainfrom
fix/review-findings
Closed

darko-mijic wants to merge 25 commits into
mainfrom
fix/review-findings

Conversation

@darko-mijic

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

Copy link
Copy Markdown
Contributor

Consolidated into PR #40. PR #40 was opened on top of this branch, so every commit here is in it unchanged, and it now targets main with the whole-repository review (PR #38), this execution and a second review pass in one pull request. This description stays as the execution's record; it was corrected for accuracy before the pull request closed, and the corrections that needed code are fixed in PR #40.

Executing the whole-repository review

This pull request carries out the confirmed findings of the whole-repository review in PR #38, read at main b5e0a8be. It closes the review's two high-severity defects, repairs the drift between ready Specs and the agent surface, gives the deferred design questions a home in the graph, and corrects the docs a newcomer reads first. A second pass then carries out the owner's rulings that the first pass left: the intent panel's labels and memo preview (Q6a, Q6b), the slice-page rule, and the reservation of kind in Then slots (L1-03). It also narrows the symbolic-link warning, a delegated choice that awaits the owner's review.

The two high-severity fixes:

  • A planted link no longer makes sdp build write outside the corpus (L4-01). Its staging files followed an existing link, so a planted symbolic or hard link under generated/ made a build overwrite the file it pointed to. Staging now unlinks a stale entry and creates the file exclusively. An output parent that resolves outside the root, or dangles, is refused before any write or cleanup, and is checked again before each staged write. These are path checks, not race-free confinement: a process writing inside the root during a build could still swap generated/ between a check and a later delete or rename. PR review: the whole repository, its fixes, and the durable-content inventory #40 rechecks before every mutation, refuses a linked generated/, checks that directory's identity after publication, and states this threat model in spec:extraction.build-pipeline#writeBoundary.
  • A hand-authored delivery fact is refused in every carrier (L3-01). The honesty check missed the camelCase spelling hasVerifier, so a TypeScript carrier could author a fact the Markdown carrier refuses. One internal spelling list now feeds the authoring-shape check, extraction's reserved keys and the Gherkin tag pattern.

Delivery facts are derived, never authored, and a build writes only inside its root. These fixes put both principles back in force, the second against planted links. The rest of the arc fixes smaller defects, records the owner's rulings in the corpus, and brings the docs in line with the graph.

The rulings pass:

  • The intent panel says what each gathered intent asks for (Q6a). A row named only its scope and the free-text request, though #ui.gatheredIntents asks for the change too. Each row now reads <scope> <action label>: <request>, and the panel and the compose dialog read one label map.
  • The person can read the hand-off before it leaves (Q6b). The panel shows a closed, read-only Preview memo holding the exact memo Copy memo copies. The carrying Spec gains rule #memoPreview and UI entry memoPreview in the same change.
  • A Pack export leaves the slice page out. The owner kept the provisional answer, so #exportCarriesSlice becomes rule #exportOmitsSlice, and a new test pins the behavior the export already had.
  • Only a link that could hide a carrier or anchor warns. The first pass made every symbolic link below the root warn, including this repository's own CLAUDE.md. A link now warns only when it targets a directory or its name is a carrier or anchor-candidate name, and never when its own name is one discovery skips (a dot-name, node_modules, dist, generated or coverage); discovery still follows none. This narrows the owner's Q1 ruling and awaits the owner's review. PR review: the whole repository, its fixes, and the durable-content inventory #40 judges a link by the entry it stands for, so a candidate-named file link warns even when its name starts with a dot.
  • A Then slot cannot be named kind (L1-03). A Then slot named kind collided with the generated Outcome's discriminant, so a legal carrier produced an invalid Outcome type. The owner ruled to reserve the word. Graph validation now reports conformance/reserved-then-slot as an error, and contract generation withholds the affected contract with a warning naming the word. The Outcome keeps its flat shape, and Given and When slots may still be named kind.

How the work ran. Same approach as the review:

  • Nine lanes in two passes, each implemented by one model family (Claude or GPT through the relay plugin) and reviewed adversarially by the other.
  • Every fix proves itself with a test that fails without it.
  • The first pass merged into fix/review-findings in the order C, W, H1, H2, P, D; the rulings pass merged S, L, then K. The full gate ran over each merged result.

Working record. Branch fix/review-findings; base main b5e0a8be. Owner's working rules: execute PR #38's findings with workflows of Claude and GPT agents, while the coordinating session keeps its context for coordination and execution. Commits, push and this draft are authorized; the owner reviews and merges. There is no arc Pack: the arc executes findings and owner rulings, and its corpus changes are measured below with the design diff (recipe 35) from the base. The lanes' plan and results are in evidence/pr39/README.md; evidence/pr39/ is arc evidence and is removed before merge.

What each lane did

Outcomes: fixed (a code or doc defect, with a test), applied (a proposal change, capture or rule as written), adapted (carried out as a later owner ruling reshaped it), needs-ruling (parked for the owner). The verdict column is the reviewing family's last round.

C, corpus (Claude implements, GPT reviews: changes, then approve in round 2)

Item Outcome Proof What changed
P1 applied self-hosting oracle (consumers.ts pin) #wrapIdiom calls a recipe through the recipes binding instead of inlining its body
P2 applied oracle pin the reader's method inventory names resolveEntryAddress
P3 applied oracle pin the reader gains rule #entryAddressResolution; its rule keys shift
P4 applied oracle pin the delivery-record cleanup gains rule #inventoryFirst
P5 applied oracle pin #durableContent keeps blocking, with the accepted provisional
P6 applied oracle pin cited-line-text records #lineText's answer as rule #lineRecorded
P7 applied oracle pin cited-line-text records #lineBound's answer as a design entry; readiness stays scoped
Q1 adapted lane C leaves the excludes Spec unchanged; lanes W and L change it, and the code is in lane W no symbolicLinks question: the owner ruled the policy
Q2 adapted no test reads jtbd-stories/ the job changes, not the Spec: JS-F1 hands scoped intent to an agent that picks its own budget (recipe 36)
Q3 adapted self-hosting-graph.test.ts totals and consumers family (3 tests fail with the old pins) the AI-reading capture keeps the four ruled links, each a declared relation with a reason
Q4 adapted observation family descriptors fail with the old trigger the freshness trigger is the owner's wording; the owner decides
Q5 applied oracle pin #perSlotOnly drops its deferral clause; the combination capture carries it
Q6 adapted lane C leaves the intent-panel Spec unchanged; lane S changes it no handOffPreview question; the code half is carried in lane S
K1–K3 applied oracle pins, recipe 20 three idea captures, each with a blocking deferral (below)

W, writes inside the root (GPT implements, Claude reviews: changes, then approve in round 2)

Item Outcome Proof What changed
L4-01 (high) fixed test/cli-write-boundaries.test.ts: 14 build-boundary cases, including dangling generated links; sentinel bytes are overwritten without the fix exclusive staging after unlinking stale entries; unsafe or dangling output parents refused before any write
L4-04 adapted the same suite: validate, Studio and vault watch run through a linked root; "keeps the named root" guards ordinary output only the watch root's directory check resolves its physical path; root parsing stays lexical
L4-02 fixed the same suite: view, mermaid and gherkin exit 0 on a case collision without the fix publication refused when two page paths collide by case, naming both paths and ids
Q1 applied test/exclude-diagnostics.test.ts "names skipped candidate links while resolving an explicitly linked root" (lane L renamed lane W's version, which named every skipped link): without the fix it fails first on the explicitly linked root, whose carrier path runs through the link instead of the real corpus directory discovery never follows a link below the root, warns once per link outside an excluded or skipped path, and resolves an explicitly named root first; lane L narrows which links warn

H1, honesty and carriers (GPT implements, Claude reviews: changes, then approve in round 2)

Item Outcome Proof What changed
L3-01 (high) fixed six honesty cases in test/validators.test.ts and test/extract.test.ts report no finding without the fix; package-smoke export pins unchanged one delivery-fact spelling list, outside the public barrel
L1-03 needs-ruling, then carried by lane K graph queries confirm the slot grammar, the Outcome shape and the closed generation-finding list none in this lane: a legal kind slot generates an invalid Outcome type, and the two options were reserving kind in Then slots or changing the Outcome payload's representation; the owner ruled for the reservation (lane K)
L1-04 fixed 17 block-shape cases in test/markdown-reifier.test.ts list text refuses the block shapes the carrier rules list; code-span forms stay accepted
L1-05 fixed test/readiness.test.ts, test/validators.test.ts: invalid-altitude floor findings without the fix floor evaluation and derived readiness skip a Spec with an unratified altitude

H2, verification runtime (GPT implements, Claude reviews: changes, then approve in round 2)

Item Outcome Proof What changed
L1-01 fixed test/codegen.test.ts: 5 dispatch cases fail without the fix a key shared across phases gets one handler that branches on the occurrence's phase
L1-02 fixed test/codegen.test.ts: 2 cases resolve instead of rejecting; "preserves the noMatchingThen" guards the message an unspecified oracle never matches a Then, so the existing noMatchingThen diagnostic fires
L5-01 fixed test/self-hosting-graph.test.ts: 608 anchors against the pinned 609 without the binding test/markdown-reifier.test.ts verifies spec:carrier.markdown-body-grammar
L5-02 fixed the same, 811 binding edges against 812 test/structural-anchors.test.ts verifies spec:model.anchors

P, CLI and package polish (Claude implements, GPT reviews: changes twice, then approve in round 3)

Item Outcome Proof What changed
L2-3 fixed test/cli-q.test.ts "names a body that stops inside a template literal" sdp q reports an unterminated template at its real line and column, not 1:1
L2-5 fixed test/studio-s3.test.ts "states in its help the refusal the command applies" studio --help states the build-owned-path refusal the CLI enforces
L3-03 fixed test/markdown-ascii-trim.test.ts the Markdown carrier's ASCII trim helpers scan linearly, so a long whitespace run no longer makes prose and title trimming quadratic. Two other extraction paths still slow down on a long space run: the thematic-break check, which this PR also applies to list text, and the anchor comment-line pattern. PR #40 makes both linear
L4-03 fixed test/self-hosting-duplicate-ids.test.ts: option values, listings, and watch/dev keep the dedicated CLI pass the vitest wrapper reads its arguments with Vitest's own parser, so an option's value is no longer taken for a file filter and the CLI suite keeps its dedicated pass; listings are forwarded once. The caller's options reach the pooled pass only: the CLI pass runs without the caller's name pattern, and a report file leaves its tests out. PR #40 gives the dedicated pass the caller's options, drops a package manager's leading --, and stops a report file or coverage from silently leaving the CLI pass out
L9-F2 fixed test/package-smoke.test.ts types a .cts consumer under Node16; test/bootstrap.test.ts pins the export map; check:git-install passes at the head the root export's existing require condition gains .d.cts declarations. The CommonJS root requires two ES-module-only dependencies, so it loads only on a Node that runs require(esm), while engines.node still says >=20; PR #40 narrows it to ^20.19.0 || >=22.12.0
C1 fixed test/check-temporal.test.ts "sweeps the decision registry" the temporal sweep no longer exempts DECISIONS.md

D, docs and vocabulary (Claude implements, GPT reviews: approve in round 1)

Item Outcome Proof What changed
L6-1 fixed test/self-hosting-graph.test.ts "names in the handbook exactly the warning kinds the oracle retains" AGENTS.md names honesty/gaps as the retained warning (prose-mention warnings no longer exist)
L6-4 fixed "names every narrowing decision on the narrowed decision's registry row" (14 refines edges) DECISIONS.md rows MD-33, MD-25, MD-27 and MD-18 name their narrowers
L2-6 fixed test/recipes.test.ts runs every recipe with an absent subject the catalog intro lists both answer shapes completely
L6-6 fixed test/skills.test.ts resolves #entryAdapters the skill separates the three entry adapters from the reader joins
L9-F1 fixed test/checkout-v1.test.ts builds the expected summary line the example README shows the build summary its extraction produces
L9-F4 fixed checked against sdp new spec and a scratch corpus; no test reads it the capture job asks for kind and altitude, as its AC1 does
L9-F5 fixed checked against the lenses Spec's title; no test reads it the README explains carriers after the quick start and names the Studio's five lenses

S, Studio rulings (Claude implements, GPT reviews: approve in round 1)

Item Outcome Proof What changed
Q6a fixed test/studio-s5.test.ts "names each gathered intent's scope and the change it asks for": rows lose their action label with the row hunk reverted each gathered row reads <scope> <action label>: <request>; the label map moves into intent-panel.ts, and change-pack reads "Change Pack membership or framing"
Q6b fixed test/studio-s5.test.ts "previews the memo it hands off, closed and read-only, before the copy actions": no details element without the fix a closed Preview memo holds the memo Copy memo copies; rule #memoPreview and UI entry memoPreview on the intent-panel Spec, with oracle pins moved
SP1 applied test/studio-slice.test.ts "leaves the slice page out of the Pack export": fails when the export is made to copy the slice page #exportCarriesSlice removed; rule #exportOmitsSlice added; no export code changed

L, link-warning scope (GPT implements, Claude reviews: approve in round 1)

Item Outcome Proof What changed
Q1n fixed test/exclude-diagnostics.test.ts and three more suites: 225 failures with lane L's discover.ts change reverted at the head (the mixed-link fixture, the CLAUDE.md, types.d.ts, other.txt and other.feature cases, two self-hosting runs, and 218 cases in test/recipes.test.ts, whose recipe runs now expect an empty stderr) a link warns only if it targets a directory or carries a carrier or anchor-candidate name; #canonicalDiscovery says so; the CLAUDE.md warning pins and the handbook sentence are gone

K, reserve-kind (GPT implements, Claude reviews: changes, then approve in round 2)

Item Outcome Proof What changed
L1-03 fixed test/codegen.test.ts "reserved Then slot kind": 20 of its 26 cases fail with the source change reverted (the other 6 guard lawful slot names and kind in Given and When); the validator audit (test/validator-audit.test.ts) fails 6 tests too, because its probe table gains a conformance/reserved-then-slot pair rule #reservedThenSlot on the slot-notation and executable-contracts Specs; an error-level conformance check naming the reserved word; generation withholds the space or step contract with contracts/reserved-then-slot

Integration

The merge had one conflict: lane H2's oracle totals against lane C's. It was resolved by adding both lanes' deltas, then confirmed with sdp validate and the oracle tests. The full gate then passed on the first run. One defect showed only in the merged result. Lane D's handbook paragraph says check:self-hosting emits only honesty/gaps warnings. Since lane W's discovery change, the same step's build line also counts a pinned extract/symbolic-link-skipped warning for the CLAUDE.md link. fix: integrate the review lanes adds that sentence, and the handbook test now requires every pinned extraction finding to be named (it fails without the sentence).

The rulings pass merged lanes S and L, then lane K, each without a conflict, and the full gate passed on the first run each time, so it needed no integration fix. Lane L removes the CLAUDE.md warning itself, so it also takes back the first pass's handbook sentence and its test loop; the self-hosting test now pins that discovery reports no extraction finding at all.

New in the corpus

The design diff (recipe 35) from the base graph, measured at the head: 3 Specs added, 11 changed, 1 Pack changed, 2 bindings gained a verifier.

Rulings

Owner rulings

None are new in this pull request. It carries out the rulings the owner made on PR #38's questions and in two follow-ups:

Ruling One line Carried by
Accept the seven-change proposal P1–P7 as proposed, base b5e0a8be; 1–3 repair drift, 4–7 record answers accepted in PR #36 lane C, reader and the Specs above
Discovery never follows a symbolic link below the root (Q1) a found link warns; an explicitly named root is resolved first; no open question lanes W and L, excludes, discover.ts
Change the job, not the Spec (Q2) JS-F1 drops the token-budgeted preview; the agent picks its own budget lane C, 06-edit-through-the-lens.md
Author the trimmed AI-reading capture (Q3) four links, each a declared relation; one-line provisional lane C, ai-assisted-reading
Author the freshness capture, owner decides (Q4) the trigger reworded lane C, bound-file-freshness
Author the combination capture, owner decides (Q5) #perSlotOnly keeps its key lane C, combination-coverage, example-space-coverage
The missing action label is a code defect (Q6a) fix it with a test; no open question lane S, intent-panel-element.ts
The memo preview is yes (Q6b) collapsed, read-only, with a rule and a UI entry in the same change lane S, spec-studio.intent-panel
A Pack export does not carry the slice page the provisional stands; the question becomes a rule lane S, spec-studio.slice-page
PR #32's delegated rulings (U1) ratified as the graph carries them; a later narrowing wins no edit
The Studio's refusal is worded by the Spec (U2) refused: a page that recomputes a join, claim, fact or floor, or a second graph no edit; spec-studio #noSecondGraph, #recipeAnswers
PR #38's delegated choices seven ratified; "design findings stay open questions" is superseded by Q1, Q2 and Q6 PR #38
The eight article corrections accepted PR #34 (2dc6a1a2)
The inventory answers #durableContent accepted with its row rulings; the cleanup lands it in its first commit the cleanup arc, delivery-record-cleanup
Homes for R1, R5, R7, R9, R11, L8-01, L8-02 use the proposed homes the cleanup arc
R4, the TypeScript carrier's static grammar a new spec:carrier.typescript-authoring, its rung stated honestly the cleanup arc
R2, field evidence from the earlier system the cleanup pull request's record, not a Spec; at most a number-free rationale sentence the cleanup arc, point-per-example
Live dependencies DECISIONS.md stays; the plan-reading gate checks retire with the folders; measure.mjs moves beside its test the cleanup arc, roadmap-replaces-plans #gateRecord
Reserve kind in Then slots (L1-03) a conformance finding and a generation refusal naming the reserved word; the flat Outcome shape stays lane K, slot-notation, executable-contracts

Delegated choices awaiting the owner's review

Choice One line Where
L4-04 narrowed to the watch root only watch setup resolves the root's physical path; output keeps the named path, so macOS /var → /private/var does not leak into ordinary output validate-watch.ts
A case collision is refused, not renamed (L4-02) the frozen projection names stay unchanged artifacts.ts
Q1's warning narrowed to candidate links (lane L) departs from the ruling's "each link it finds gets one warning": a file link whose name is no carrier or anchor candidate could never hide one, so it is silent; a directory link warns unless its name is one discovery skips (a dot-name, node_modules, dist, generated, coverage). At this head a dot-named candidate file link is silent as well; PR #40 makes it warn. A dangling or looping non-candidate link is silent too discover.ts, excludes
Q6a's labels (lane S) one label map shared by the panel and the compose dialog; change-pack reads "Change Pack membership or framing"; an unknown action shows its raw string intent-panel.ts
The delivery-fact spelling list stays internal (L3-01) not exported from the package barrel, so the public exports are unchanged delivery-fact-spellings.ts
An invalid altitude skips floor evaluation (L1-05) the altitude finding stands alone, with no floor findings piled on it readiness-floor.ts
StepFn gains a required third parameter (L1-01) the step occurrence, so one handler can branch on phase. StepFn and StepBindings are public on ./runner: a handler may still declare two parameters, but code that calls, wraps or retypes a StepFn or a StepBindings entry must now pass the step. Bindings handed to ./testing are unaffected runner/index.ts
list and init are forwarded in one spawn (L4-03) a bare related or bench now splits, though the base ran each as one spawn, so once benchmarks exist a bare bench runs the CLI unit suite after them. As at the base, related <source> stays one pooled spawn that also selects test/cli.test.ts, and a file:line filter goes unrecognized, so a CLI location runs pooled and a contract-dependent one skips the contract preflight. PR #40 forwards bench once, splits every related, and reads a file:line filter as its file vitest-test.mjs
The root export's existing require condition gains .d.cts declarations (L9-F2) the base already published require; the conditions now nest so import and require each carry their own types, which changes the published export map. The CommonJS root loads only on Node 20.19+ or 22.12+, and PR #40 sets engines.node to ^20.19.0 || >=22.12.0 package.json
C1 fixes the exemption only the finding's second half, that the temporal guard's law has no Spec, is not authored check-temporal.mjs
MD-18 also names its narrowers (L6-4) beyond the three reported rows, so the test holds for every refines edge; drop it and skip MD-18 if unwanted DECISIONS.md
JS-F1 criterion 7 capitalized the ruled sentence with a capital first letter, matching the list 06-edit-through-the-lens.md
Q3's relation types refines projections-model; dependsOn claim-taxonomy, spec-studio and shipped-projections-frozen ai-assisted-reading
L1-03's finding is an error; generation withholds (lane K) the ruling named no severity: the conformance finding is an error, so validation fails; generation's refusal is a withheld space or step contract with a warning, because every generation finding is a warning and gating belongs to graph validation validators.ts, contracts.ts

Out of scope, on purpose

  • The record findings and the inventory go to the delivery-record cleanup, which lands the accepted inventory in its first commit and closes #durableContent there. The same applies to the second set of rulings: the homes for R1, R2, R5, R7, R9, R11, L8-01 and L8-02, the new spec:carrier.typescript-authoring (R4), and the live dependencies. R6 and R8 are still open (below). Nothing in plans/ or reviews/ is deleted.
  • The concept-document drift (L6-2, D1, L6-5) belongs to the cleanup, which dissolves those documents.
  • The article corrections (L9-F6, L9-F7 and six more) are in PR docs(articles): publish the product and projection narrative #34.

Left open

  • For the cleanup arc: R6's re-entry conditions (or dropping R6), R8's home, and the plan-46 prototypes' new location.
  • Still open by design: register-input's three questions (its design pass, roadmap place 3) and designColumnsSufficiency (waits for the first adopter's design passes).

Try it

Run at the head:

npm ci && npm run build

# The corpus: 0 errors and the three pinned honesty/gaps warnings; no warning for the CLAUDE.md link
pnpm --silent sdp validate . --exclude explorations --exclude examples --exclude test/fixtures/import/parity

# The open-question register, with the three new captures
pnpm --silent sdp:q "$(cat dist/recipes/20-open-question-register.js)"

# The anchor model's verifiers now include the structural refusal suite
pnpm --silent sdp:q "$(cat dist/recipes/03-what-does-this-spec-guarantee-and-who-verifies-it.js)" --params '{"spec":"spec:model.anchors"}'

# A broken body is reported where it breaks: "line 1, column 12"
pnpm --silent sdp:q 'return `abc'

# A build refuses a generated/ link that escapes the root ("unsafe output parent ... escapes the extraction root")
mkdir -p /tmp/sdp-try/corpus /tmp/sdp-try/outside && ln -s ../outside /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

# Only a link that could hide a carrier or anchor warns: "linked" does, NOTES.md is silent
rm /tmp/sdp-try/corpus/generated && echo hi > /tmp/sdp-try/outside/notes.md
ln -s ../outside/notes.md /tmp/sdp-try/corpus/NOTES.md && ln -s ../outside /tmp/sdp-try/corpus/linked
node dist/cli/sdp.js build /tmp/sdp-try/corpus

# A Then slot named kind is refused: one conformance/reserved-then-slot error, and the space contract is withheld
mkdir -p /tmp/sdp-try/kind && printf '%s\n' '---' 'id: spec:try.kind' 'kind: behavior' 'altitude: story' 'readiness: idea' 'relations: {}' '---' '# A Then slot named kind' '## Intent' '- outcome: Show the reserved Then slot.' '## Example space' '```gwt-vocabulary' 'Given an order' 'When the order is placed' 'Then the result is {kind:string}' '```' > /tmp/sdp-try/kind/kind.sdp.md
node dist/cli/sdp.js validate /tmp/sdp-try/kind

# The Studio's intent panel, on a Spec page (the top-level pages offer no composing action)
node dist/cli/sdp.js studio . --exclude explorations --exclude examples --exclude test/fixtures/import/parity
# Open generated/spec-studio/specs/consumers.spec-studio.intent-panel.html#rule.memoPreview in a browser.
# Under rule.memoPreview press "Propose new text", enter a request and press "Gather".
# Open "Composing (1)", give a base commit and a reason, then open "Preview memo".

Feedback wanted:

  • The narrowed link warning (lane L). It departs from Q1's literal text so that a link which cannot hide a carrier or anchor stays silent. Is that the ruling's intent, or should every link warn and this repository exclude its own CLAUDE.md?
  • The memo preview (Q6b). Is a closed disclosure before the copy actions the right weight, or should it open once a base and a reason are given?
  • CommonJS as a typed surface (L9-F2). The base already published a require condition, and this PR gives it its own types. Should CommonJS stay a typed surface, on Node ^20.19.0 || >=22.12.0 as PR review: the whole repository, its fixes, and the durable-content inventory #40 sets, or should the package drop the condition, which breaks every CommonJS consumer?

Measured at the head

Measured at the head, with the corpus exclusions. Re-run the recipes rather than inheriting these numbers.

Measure Base b5e0a8be Head
Specs · Packs · anchors 456 · 9 · 607 459 · 9 · 609
Graph nodes · edges 1072 · 2978 1077 · 2989
sdp validate not re-measured 0 errors · 3 warnings (the pinned honesty/gaps); no extraction warning
Build backlog (recipe 1) 2 2: spec:consumers.edit-model, spec:consumers.intent-composition
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 not re-measured 0 · 0
npm run check not re-measured pass: 129 files and 3307 tests, plus 100 in the dedicated CLI pass. A known flake, present at the base too: the vault watch example's snapshot helper can race the vault sync's staging rename and fail with ENOENT on a .sdp-tmp file, so a rerun at this head may fail once. PR #40 fixes the helper in a51bf5c6
check:git-install not re-measured pass (npm and pnpm clones, npm archive)

The base column comes from the base graph (sdp build at b5e0a8be): node counts read from it, and recipes 1, 2 and 20 run over it with the head's built recipes. The head column is the live graph at c7368f48754528b4303fae12a601d88da84e65c1. The diff stat from the base is 93 files, +2270 / −274.

Second review pass

A second review read this pull request at c7368f48. This pass changes no commit on this branch: the head stays c7368f48, and only this description changes. It corrects, in place:

  • the StepFn row: the third parameter is required and public on ./runner (L1-01);
  • the L9-F2 rows: the require condition already existed, and the CommonJS root needs Node ^20.19.0 || >=22.12.0;
  • the L4-01 headline, which now states the threat model the path checks meet;
  • the L3-03 row, narrowed to the trim helpers it fixed;
  • the two test-wrapper rows (L4-03), and the link-warning text in the rulings pass, the corpus list and the delegated choices, which now name the links that stay silent;
  • stale proof cells, with lane L's failure count re-measured at c7368f48 by reverting its discover.ts change and running the four suites;
  • the gate row, which now names the vault snapshot flake;
  • the Try-it Studio step, which now opens a page that composes;
  • the forward section, which gains the owner's reasons, the re-entry condition and the refused list;
  • a pinned link to the evidence README.

The engine and corpus fixes this review found are carried by PR #40, the one pull request for them. It targets this branch, fix/review-findings, so they land here when it merges. Its changes as pushed at 3a22c914: c7368f48...3a22c914. A row above that names PR #40 describes c7368f48 first, then what PR #40 changes.

Next

The next work, from the roadmap (recipe 55, re-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 from PR #36, not the memo's):

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 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 starts after this pull request merges, once R6's re-entry conditions are written or R6 is dropped (see Left open). It opens with the accepted inventory in its first commit.

Refused, durably (PR #36's list, plus 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, claim, fact or floor, or a second graph.

The owner's decisions this pull request asks for:

  1. Review the delegated choices above, especially the narrowed link warning (lane L), the export map change (L9-F2), StepFn's new required parameter (L1-01) and the error severity of the reserved-slot finding (L1-03).

The roadmap's order is unchanged: this arc completes no roadmap entry, so the manifest is not edited. The cleanup at place 1 is next, and it can now start from the accepted inventory.

🤖 Generated with Claude Code

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>
@coderabbitai

coderabbitai Bot commented Nov 3, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

CodeRabbit Verify

  • Run CodeRabbit Verify to test the changes in this pull request.

darko-mijic and others added 24 commits November 3, 2026 19:06
…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>
…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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
- GAP9-1: include the extraction root's builder modules when its package
  identity names the Protocol, retaining physical-path trust and lookalike
  refusal. Align the anchors Spec and its oracle with the owner's ruling.
- GAP9-2: compare an untouched Protocol corpus with external and local
  byte-identical engines, and remove the test helper's import rewrite.

Lane X8 on r2/X8, based on c7368f4; scope is the anchor trust and
extraction determinism Specs in pack:self-hosting-v1. Work stays in this
worktree; no push. Both regressions fail with the source fix reverted.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
- D-g-2: require own, defined Conditions before invoking the oracle;
  missing and extra payload diagnostics also distinguish own fields.
- GAP7-1: refuse absent or non-callable own handlers and emit __proto__
  handlers as computed properties so generated bindings remain callable.
- GAP7-2: preserve missing parameter placeholders instead of rendering
  inherited Object.prototype members.
- F-c-1: show unknown action strings and refuse unknown compose controls
  without resolving inherited labels.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
…e resolves a path

- S-M38-3 (round-3 review, named references): the reader decoded five names, so a link to
  kept&lpar;v2&rpar;.md failed the gate although the forge links it to kept(v2).md.
- A new helper carries the HTML standard's static list of names, as cmark-gfm decodes them in a
  Markdown destination before backslash escapes, and the HTML 4 names the forge's sanitizer
  decodes in an `href` or `src` value.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
…e link gate

- S-M38-3 (round-3 review, code examples and comments): the reader scanned indented code and
  HTML comments for links, so an example or a commented-out link failed the gate. It now skips
  indented code and reads raw HTML as an HTML parser does, for `href` and `src` outside comments.
- Same class: Markdown inside an HTML block such as `<pre>` or `<textarea>`, an escaped bracket,
  and a link inside an image's description render no link and are skipped. Brackets pair as
  cmark-gfm pairs them, and footnote definitions continue as cmark-gfm continues them, so a
  footnote's indented paragraph is still read.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
…dings

- L34-c-1: Part 2 said the human experience was unsettled right under the table of the
  five projection roots, and Part 3 called the projections replaceable. Part 2 now names the
  shipped-projections decision (MD-32), which settles Design Review, census, Mermaid and
  Gherkin, and leaves only the Studio and new readings open; Part 3 says regenerable.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
- M38-c-6: the evidence/ exemption's test proved only that the root
  directory is exempt; nothing showed a nested evidence/ (or plans/,
  reviews/, explorations/, docs/lineage/, .omo/ genre, or a nested
  package-lock.json) is still swept. A new case writes a banned token at
  each nested or look-alike path and expects a failure naming every
  file and line. It fails if isExcluded matches anywhere in the path, if
  excludedFiles match by suffix, or if a directory loses its trailing
  slash.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
- M38-c-2: the records gave four closure conditions for #durableContent.
  The inventory, README and not-proposed.md now state one: the cleanup
  arc closes the question when it lands the inventory in its first
  commit. R6, R8 and the prototypes' new location do not hold it open;
  each is settled before the record that holds it goes. proposal.json
  stays as the owner accepted it; the README says change 5's closing
  sentence predates the ruling and that its applied provisional must
  name the acceptance and the closing commit.
- M38-c-3: only inventory.md recorded the owner's rulings. README.md
  gains a rulings table; open-questions.md opens each question with its
  ruling (Q4's reworded trigger included); not-proposed.md, pr-record.md
  and the inventory's U1, U2 and L12 rows record the rulings, keeping the
  verifiers' verdicts and counts as history.
- M38-c-8: the deferred spec-ids union in concept 01 becomes row R12
  (low, awaiting the owner's keep-or-drop ruling), and concept 01 is
  classed C + U + drift [R6, R12].
- M38-c-9: the live-dependency list gains the 21 Markdown links into
  concept documents (17 in jtbd-stories/, one in README.md, three in
  the worked example's README, measured by path), the two exploration
  links into plans, and the prose pointers in AGENTS.md and CONTEXT.md.
- GAP13-1: the 196-link count is qualified as file (blob and raw)
  links in inventory.md, pr-record.md and pr-record.json; the 17 tree
  and commit links (213 in all) were re-measured and all resolve.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
…recorded it

- L34-c-3: Part 4 said PR #32 recorded the gpt-6.1-sol re-run (13 of 13, 23 calls against
  20, one overflow). PR #31's acceptance records it; PR #32 carried the response, the
  task-to-recipe sheet in sdp-agent-surface and the impacted Packs in recipe 4's summary.
  Part 4 now cites each to its own pull request.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
… spec

- L34-c-4: Part 1 introduced three edges as "two edges can point at the same Spec", but
  belongsTo runs from a Spec to its Pack (706 Primitive->Pack edges at the pin). The lead-in
  now says edges that touch the same Spec can carry different claims, and the belongsTo
  bullet names its direction.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
- L34-c-5: Parts 1 and 3 and the playbook gave Vite's and Rolldown's range
  `^20.19.0 || >=22.12.0` as the test toolchain's requirement, but the pinned Vitest 4.1.10
  declares `^20.0.0 || ^22.0.0 || >=24.0.0` and excludes Node 23. All three sites now state
  the intersection `^20.19.0 || ^22.12.0 || >=24.0.0` and name the three packages.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
…ception

- L34-g-2: the Article 08 outline said an authored Then landing on `unspecified` still
  fails, as behavior at the pin. The pinned engine passes a bound example whose Then key is
  itself `unspecified` (PR #38's L1-02). The outline now states the rule as
  spec:extraction.runnable-modules' rule, names that exception at the source baseline, and
  asks the writer to re-check at the article's own pin.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
…t anchor's

- GAP4-1: the annotation context listed `verifies` among anchor bindings as identifying "a
  test or example". Only a test anchor binds `verifies` (anchored); an example states its own
  `verifies` in its carrier (declared). The list now names the test anchor, and a separate
  paragraph says an example's declared relation confers `has-verifier` only when a resolving
  test anchor binds the example, as an enabled verifier.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
…ning pr

- N-c-7: the root README said the articles "are developed in the open in PR #34", which
  names a merged pull request as the venue once #34 lands. It now says the series opened in
  PR #34 and is maintained on main through focused refresh PRs, as the playbook's posture
  and the PR's publication model state.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
Y1 on r2/Y1, based on 2dc6a1a. Keep the article source pinned to
b5e0a8b, work only in this lane, prove each fix by regression and
reversion checks, and do not push. This lane changes no Pack.

- K34-c-1, K34-c-3, S-K34-1: materialize the pin from git, install its
  locked dependencies and build it; keep supplied checkout outputs intact.
- K34-c-2: refuse missing, duplicate, unknown, misplaced, nested and
  fenced evidence markers across the articles before generating evidence.
- GAP12-1, K34-c-5: parse options and forwarded -- strictly, require an
  explicit source repository and document the disposable worktree writes.
- K34-c-4: use one honesty/gaps-only warning policy and test source,
  dependency, build and output isolation instead of trusting metadata.
- K34-c-6: generate both measurement labels inside their evidence blocks.
- S-L34-3, L34-c-6: generate both Part 3 carrier excerpts from the pin.
- L34-c-7: serialize the full drift recipe answer, including its clause.
- L34-c-2: describe build diagnostics separately from validation checks.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
- K34-c-1: read raw pinned blobs with replacement objects disabled so sparse checkout and smudge filters cannot alter evidence.
- K34-c-4: test the CLI isolation call against a repository without the pin; bypassing materialization now fails the test.
- S-L34-3, L34-c-6: test carrier generation with independent fixtures so later carrier edits do not require refreshing pinned articles.
- S-K34-1: document temporary worktree registration and keep generated output in the disposable source.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
K34-c-4 (round 3; also K34-c-1 and K34-c-3): exercise the real CLI with a toy pinned build and a different supplied CLI. The sentinel proves generation reads the materialized root; both bypass mutations now fail.

Check the owner executable bit so the materialization test also passes under umask 077.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
…otes

- VR2-T-1: the handbook's docs/lineage row named only the restored v0 concept set. The
  folder also holds two authored notes with no lineage header: the short annotation context
  and the dated research scout kept under an archive- name. The row now names both, says
  each states its own status, and keeps all of it as evidence, never intended truth.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
- claude-side-T-6: replace polynomial anchor and Mermaid regexes with fixed delimiter searches and bound pin parsing to one line. Add adversarial subprocess tests; all three time out without the fix.

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>
darko-mijic added a commit that referenced this pull request Nov 3, 2026
- claude-side-T-6: remove the remaining quadratic fence suffix match;
  slice the suffix after matching the delimiter run. Cover both fence
  characters with CR and Unicode line separators under child deadlines,
  and recognize CRLF closing fences.

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>
darko-mijic added a commit that referenced this pull request Nov 4, 2026
- F-pr34-claude-1: make cancellation idempotent, tolerate vanished worker
  groups, and remove partial or locked worktrees before pruning. Refuse
  temporary roots inside either checkout and exercise npm signal forwarding.
- F-sweep2-6: spool one git blob batch and copy bounded chunks, preserving
  object, type, size and terminator checks without an aggregate buffer cap
  or a process per blob. Keep the 144 MiB regression.
- F-sweep2-5: label invisible fence tails explicitly in test output.
- F-pr34-claude-2, F-pr34-claude-3: name the Markdown link gate and avoid
  pinning incidental playbook phrasing in its regression tests.

Review fixes for PRs #34, #38 and #39; the diff is reviewed by the other model family.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
darko-mijic added a commit that referenced this pull request Nov 4, 2026
F-pr34-claude-1: replace repository-wide pruning with removal of only the disposable worktree registration, including interrupted and locked entries. Preserve repairable worktrees and their staged contents.

Install interrupt handlers before creating temporary directories or starting the worker. Cover both startup boundaries, clarify detached-worker behavior after SIGKILL, and distinguish forwarding coverage from deterministic signal regression tests.

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>
darko-mijic added a commit that referenced this pull request Nov 4, 2026
- F-sweep1-1: `sdp stamp` staged `stamp.json.tmp` but left it in the page set when the rename
  failed. The failure path now removes it through the same boundary check, and `#stampVerb`
  states the staging file and the refusals for a linked `generated/` or page set.

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>
darko-mijic added a commit that referenced this pull request Nov 4, 2026
…root

- F-pr40-claude-2: the default `generated/obsidian-vault` was refused whenever it was a symbolic
  link, even one to an in-root directory under an excluded prefix that an explicit `--out` may
  name, and no Spec stated the refusal. The run now refuses a default that resolves outside the
  root or through a link that resolves nowhere, and holds an in-root target to the usual
  placement rules. The new rule `#defaultInsideRoot` and its message carry this in
  `spec:consumers.obsidian-vault`, with their 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>
darko-mijic added a commit that referenced this pull request Nov 4, 2026
- F-sweep1-3: a watched directory replaced by another real directory kept its old handle, so
  on Linux, where the handle follows the moved inode, edits in the new directory started no
  run. The watch now records each handle's directory identity; a rename at a watched
  directory's path, or a path that now holds another directory, retires the subtree's handles,
  schedules a run and watches the new directory. The ancestor check does the same when a
  retired descendant reports first. `spec:consumers.validate-watch` states the case, with its
  oracle pin.

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>
darko-mijic added a commit that referenced this pull request Nov 4, 2026
- F-sweep1-16: no test reached `reconcileDirectory`'s non-root branches, because the ancestor
  check catches a replaced or vanished directory first. Two tests make the two reads disagree
  through the injected `lstatWatchPath`: a directory that became a skipped link drops its
  subtree, warns and reruns when the link goes; a directory that vanished drops its subtree
  and reruns.

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>
darko-mijic added a commit that referenced this pull request Nov 4, 2026
…undary

- F-sweep1-17: deleting any one recheck that `#scaffoldWriteBoundary` promises left every
  scaffolder test green, because the overlapping checks covered for each other. A test-only
  `onScaffoldCheckpoint` hook now runs before each recheck, and each recheck names its
  checkpoint in its refusal. Four tests relocate a parent at one checkpoint and fail when that
  recheck is removed: the static check attempts no parent creation, the check before a creation
  creates nothing in a parent that moved out, the check after entering refuses an escaping
  link at once, and the held check refuses before the write is reached.

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>
darko-mijic added a commit that referenced this pull request Nov 4, 2026
- F-sweep1-18: the help said only that PATH is cwd-relative and that parents are created as
  needed, while the command refuses `..` segments and a parent that escapes the working
  directory or cannot be resolved. The scaffolder's help paragraph now states that boundary
  and the exit 1, and the focused-help test checks it.

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>
darko-mijic added a commit that referenced this pull request Nov 4, 2026
…tation

- F-sweep1-22: since the output boundary moved into `guardedOutput`, `BuildHooks.rmSync` and
  `writeFileSync` stand in for every guarded publisher mutation, ordinary staging cleanup
  included, and nothing said so. `BuildHooks` and `guardedOutput` now state that scope, and a
  test pins it: a successful build sends its staging cleanup and staged writes through the
  hooks.

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>
darko-mijic added a commit that referenced this pull request Nov 4, 2026
- F-pr40-claude-2: the vault skill now says that a link at the default vault folder places the
  vault where it resolves inside the root, under the usual placement rules, and that a default
  resolving outside the root is refused, citing `#defaultInsideRoot`.

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>
darko-mijic added a commit that referenced this pull request Nov 4, 2026
- F-sweep1-4: use the shared compiler line map for syntax errors in
  TypeScript carriers and anchor source files. Pin both paths across
  LF, CRLF, CR, U+2028 and U+2029; reverting the fix makes six cases
  report line 1 instead of line 3.

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>
@darko-mijic

Copy link
Copy Markdown
Contributor Author

Note

🤖 Claude Opus 5.5 responding on behalf of darko-mijic

Closing in favour of #40, which was opened on top of this branch at c7368f48, so every commit here is in it unchanged. The description above stays as the execution's record; corrections that needed code are made in #40.

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