Repository navigation
review: the whole repository, its fixes, and the durable-content inventory - #40
Merged
Merged
Conversation
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
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>
- 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>
This was referenced Nov 4, 2026
darko-mijic
marked this pull request as ready for review
November 4, 2026 07:27
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A whole-repository review, its execution, and a second review of both
This pull request is the one record of three arcs on
mainb5e0a8be(PR #36):plans/,reviews/and the concept documents, a seven-change proposal, and six questions for the owner.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.
main, a TypeScript carrier could authorhasVerifier, or hidedeliveryFactsin a section; now every carrier refuses every delivery-fact name, at every level, in any case.main,sdp buildandsdp stampwrote 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.main, an engine installed outside this checkout derived this corpus without 105 of its anchors, silently; now it derives the same graph.b5e0a8be...3dedfaa4, merged in by12246171b5e0a8be...c7368f484e7e9f95tobcd2815f, one merge commit per laneThe 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 stampwrote through a planted or escaping link (A-c-1), and a watch that refused an escapinggenerated/link then deleted the Studio's page set through it (A-c-2). Now every writer, from the build and the publishers' recovery tosdp new spec,projection-suite.mjsand package-artifact generation, rechecks the output parent before each write, rename or delete. A linkedgenerated/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, sodesign.deliveryFactsreached the graph, as didclaim,satisfiesand 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, whilehas_verifierstays 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.tsandsrc/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,
kindandunspecified. A Then slot namedkindcollided with the generated Outcome's discriminant (L1-03); a Then keyedunspecifiedcould never be bound, silently (D-c-2). The owner ruled to reserve both. Validation reportsconformance/reserved-then-slotorconformance/reserved-then-keyas an error, and generation withholds the contract with a warning naming the word. An oracle that selectsunspecifiedfails 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 SpecfloorNotEvaluated, recipes reportnot evaluated, the Studio showsfloor not evaluatedwith no divergence banner, and the Design Review, census and vault showfloor not evaluated (unratified descriptor)(XG-T-1). A kind namedconstructorno 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
requireentry loads two ES-module-only dependencies, so it threwERR_REQUIRE_ESMon Node 20.0–20.18 and 22.0–22.11, whichengines: >=20admitted (GAP5-1). As the owner ruled,engines.nodeis 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 cannotrequire()one; the docs state the range. Subpath types sit underimport, so TypeScript refuses arequirethat 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 indocs/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
@sdptag 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 testrunstest/cli.test.tsin its own process. pnpm's forwarded--hid every filter (E-c-3),relatedandfile:linefilters 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, andvitest --merge-reportswrites 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 atideaby#durableContent: what inplans/,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 memoshows the memo before it is copied (Q6b). Compare the panel's page in the Studio preview ofmain(PR #36's preview) with this pull request's. Each preview's stamp names a merge commit whose tree is exactlymain's and this head's. These are live previews that track each push, not pinned images.How the work ran
main(A-c-1, C-g-1); the third came with the execution's own refusal path (A-c-2).Working record
fix/second-review-pass; basemainb5e0a8be. It opened on PR fix: execute the whole-repository review's findings #39's branch atc7368f48, and a merge commit brings in PR review: the whole repository, and the durable-content inventory #38's branch.main.evidence/pr38/,evidence/pr39/andevidence/pr40/are arc evidence, removed before merge; the links are pinned to commits the merge keeps reachable. The full per-id record, with each finding's verdict, where it was handled and the commits that name it:evidence/pr40/findings.md.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.cli-write-boundariesgenerated/is refused; a case collision refuses publicationcli-new-spec,cli--helpsays where PATH must resolvecli-write-boundaries,studio-s4cli-write-boundariesexclude-diagnostics,validate-watchvalidate-watchvalidators,extract,markdown-reifier,gherkin-reifier@deliveryFactsrefused; refusal wordingmarkdown-reifier, oracle pinsgherkin-reifier,anchor-forms,extractmarkdown-ascii-trim,linear-text-scans,codegencodegen,self-hosting-graphkindreserved; two suites bound as verifierscodegen,runner,testing,studio-s5unspecifiedreserved; runtime imports aliased; no inherited name stands in for a handler, Condition, parameter or labelreader,recipes,studio-floor-not-evaluated,projections-floor-not-evaluatedfloorNotEvaluated, labelled everywhere a floor is shown; own-key lookups and talliesanchor-trust,cli,package-smokecli-q,studio-s3,package-smoke,bootstrap,check-temporalDECISIONS.mdself-hosting-duplicate-ids, with real Vitest runspackage-smoke,cli,integration-review,vault-probe; budgets have no deterministic proofself-hosting-graph,recipes,skills,checkout-v1; job stories have no testcarrierat both levels;#durableContent's provisionalmarkdown-linksstudio-s5,studio-sliceideacaptures; JS-F1's job; labelled intents;#memoPreview;#exportOmitsSlicecheck-temporal; the rest is evidence proserunner,recipes, oracle pins#handlerDispatch; recipes 5, 21 and 31 tally foreign readiness exactlymarkdown-reifier,import-round-trip,gherkin-view,gherkin-reifierself-hosting-duplicate-ids,validate-watch@vitest/uichecked first; configuration read as Vitest reads it; fewer watcher rebuildsbcd2815fadds the later rounds and the ledger to the evidenceWhere 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
maingraph, built bymain'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:ideacaptures, each with a blocking deferral, inpack:self-hosting-v1: AI-assisted reading, bound-file freshness and combination coverage.#lineRecordedand design entrylineBound; the slice page gains#exportOmitsSlice; the intent panel gains#memoPreview. The cleanup gains#inventoryFirstand keeps#durableContentblocking, its provisional naming the acceptance and the closing commit.#entryAddressResolution(reader),#reservedThenSlotand#reservedThenKey(slot notation, executable contracts, runnable modules),#notEvaluatedand#floorNotEvaluated(the floor and the answer shapes),#writeBoundaryand#exclusiveStaging(build pipeline),#defaultInsideRoot(vault),#scaffoldWriteBoundary(authoring on-ramp),#physicalLines(Gherkin authoring),#lineEndings(Markdown authoring),#handlerDispatch(example runner).#portablePublicationand#safeCleanupon 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.test/cli-write-boundaries.test.tsverifies six Specs, and three regression suites became verifiers (the Markdown body grammar's, the structural anchors' and the scaffolder's).#lineEndings, the one line-ending law for every carrier, with matching rules on the envelope contract and the Gherkin view;#handlerDispatch, which executable contracts'planDispatchnow points at; and clearer#blockShapesand#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
#noSecondGraphevidence/exemption among them; one supersededcheck-temporal.mjs#durableContentspec:carrier.typescript-authoring; R2 goes to the cleanup's pull-request record, never a Spec;DECISIONS.mdstays; the plan-reading gate checks retire with the folders;measure.mjsmoves beside its testkindin Then slots (L1-03)unspecifiedas a Then key (D-c-2)kind, with its own coverage-gap diagnosticb5e0a8be(L34-c-9, L34-g-3)^20.19.0 || >=22.12.0, a CommonJS load gate, and the docspackage.jsoncarrierat both levels (S-H-1, H-c-4)CONTEXT.mdvitest-test.mjsDelegated choices awaiting the owner's review
#portablePublicationand#safeCleanupon Specs the shipped projections stay frozen (MD-32) protects, with no refining decision; pages are unchanged, but a case collision exits 1generated/is refused even inside the root (A-g-1)#stampVerbsaid the stamp touches no other filefloorNotEvaluatedlists the descriptors; every recipe reporting a floor saysnot evaluated, beyond the four ruledMap,Array,Promise); any realm'sObject.prototypeandFunction.prototype, and an inheritedconstructor, are refused#handlerDispatch#lineEndingslist,initandbenchrun in one spawn;relatedalways splits; afile:linefilter 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/uiis missingvitest-test.mjsplans/,reviews/,examples/,explorations/,evidence/or the v0 concept set; fragments match leniently; line anchors stay uncheckedmarkdown-links.test.ts35539a0d, the last commit holding bothdocs/lineage/studio-preview.ymltest/proposal.jsonsrc/cli/#canonicalDiscoveryintent-panel.tsStepFngains a required third parameter (L1-01)./runner: code that calls, wraps or retypes aStepFnmust pass the steprunner/index.tsrequirecondition gains types (L9-F2); the delivery-fact spellings stay internal (L3-01)package.jsoncheck-temporal.mjs,DECISIONS.mdrefinesthe projections model;dependsOnthree SpecsLater 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
52262422here, andefc5f7d9and8fc1802bon PR docs(articles): publish the product and projection narrative #34, carry working notes that point at nothing durable (F-sweep2-17, F-sweep2-9). They stay, since rewording would rewrite pushed history; their change descriptions and finding ids are the record.29810f11and78e9e706leavenpm run lintred untilf3bf5f64repairs it (F-sweep1-27); a bisect that lints should skip them. On PR docs(articles): publish the product and projection narrative #34,43d63901,4c614845and5efd7312leaveformat:checkred until0389c560(F-sweep3-13).4e7e9f95failedtest/cli.test.ts"views the self-hosting corpus from the default repository root" at 15.1 s against its 15 s budget.a9f94171raises it to 120 s, with six other budgets of the same class (S-N-1).ENOENTon a.sdp-tmpfile;a51bf5c6fixes it (S-J-1).main; the opening commit's message still names the earlier base.Out of scope, and left open
#durableContentopen; each is settled before the record that holds it is removed. Nothing inplans/orreviews/is deleted here.registerEntryandinputForm, blocking, andtextLinks), for its design pass at roadmap place 3;designColumnsSufficiencyon the design-maturity Spec, which waits for the first adopter's design passes.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 tov0-design/, exempt the scout by name and reword the two dated lines; either way a test pins the boundary.donein 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
maininto its own branch and merges once CI passes there. Before this merge, the combined tree (this head93cf4194with PR #34's head22c49262merged on top) passednpm run check(135 files and 4,137 tests, plus 102 in the CLI pass) andnpm run check:articles(11 blocks atb5e0a8be). 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## Carrierssection 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:## Read the product story, without its Carrier rule: paragraph;Check:
grep -c 'default to Markdown' README.mdprints 1 (N-c-1), andprettier --check README.mdpasses. 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-leveldeliveryFactsrefusal (S-L34-2).Try it
The quoted outputs were re-measured at
bcd2815f, whose engine matchesf5f7fd5b's build (bcd2815fchanges onlyevidence/). The link gate ran insidenpm run check. The JUnit command, re-run atbcd2815f, 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: underrule.memoPreview, "Propose new text", "Gather", then open "Preview memo" in "Composing (1)".Feedback wanted
#portablePublicationand#safeCleanupchange 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?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?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 ofb5e0a8be; both columns use the corpus exclusions.b5e0a8besdp validatehonesty/gaps)spec:consumers.edit-model,spec:consumers.intent-compositionnpm run checkf5f7fd5b(the head less its evidence commit): every step throughcheck:examplepassed, 134 files and 4,010 tests plus 102 in the CLI pass; the last step,preflight, flagged the then-uncommitted evidence filesbcd2815fcommitsnpm run check:git-installf5f7fd5b: npm and pnpm clones, npm archivebcd2815f: push and pull-request runsmainevidence/, 201 files, +12,884 / −1,040Next
The next work, from the roadmap (recipe 55, rendered at the head)
Roadmap: The Protocol's roadmap
pack:roadmapTo 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
spec:protocol.delivery-record-cleanupidea→scoped, nothing holds it; blocked byspec:protocol.delivery-record-cleanup#question.durableContentplans/,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.spec:consumers.spec-studio.register-inputscoped→defined, held by no-blocking-open-questions; blocked byspec:consumers.spec-studio.register-input#question.registerEntry,spec:consumers.spec-studio.register-input#question.inputFormTo state
spec:consumers.spec-studio.cited-line-textTo build
spec:consumers.edit-modelWaiting on the owner
spec:protocol.delivery-record-cleanup#question.durableContent(blocking), place 1: Which content inplans/,reviews/and the concept documents does no Spec, test, decision or recipe carry yet, and where does each piece belong?spec:consumers.spec-studio.cited-line-text: it statesscopedand its floor allowsready; place 2spec:protocol.delivery-record-cleanup: it statesideaand its floor allowsscoped; place 1Deferred, 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.featurecorpus into the Protocolspec: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 exercisesspec: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 taskspec: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 givespec: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 releasespec: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 projectionspec: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 refinesspec:decisions.shipped-projections-frozenfor the affected Mermaid rendering or supersedes that ruling wholespec: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 sincespec:observation.runtime-overlay#question.observationIdentity: Which external observation identity and freshness boundary is small enough for the graph while still supporting an honestobserveddelivery 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):
spec:protocol.delivery-record-cleanupplans/andreviews/once PR #36's precedent has landedspec:consumers.spec-studio.cited-line-textspec:consumers.spec-studio.register-inputspec:consumers.edit-modelRe-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:
StepFn's required parameter and the export-map change.docs/lineage/(F-sweep3-7).This pull request completes no roadmap entry, so the manifest is not edited.
🤖 Generated with Claude Code


Confidence 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.
kindandunspecifiedfor clear contract outcomes.No actionable defect was established. Tests and builds were not run during this review.
Acknowledged choices from
darko-mijicwere not reported again: path checks do not promise race-free confinement; inherited built-in methods remain eligible handlers;StepFngains its third argument; subpaths remain ES-module-only;relatedalways splits; blob reports and coverage remain refused.darko-mijicalso explicitly leaves the temporal guard overdocs/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]Reviews (1) · Last reviewed commit: "fix: preserve cmark comment and referenc..." · Reviewed by Greptile