Follow-up from the TRIAGE rung (LLP 0017) on PR #525 (repo-wide em-dash sweep,
fix/issue-472, head 6021713). Two review rounds are exhausted; every
residual below was judged non-blocking (a production-defect risk was not
found for any of them), so the PR is being carried through to ready-hold
rather than parked on neutral:stuck. Filed so the deferred items stay
tracked instead of silently dropped.
Backlink: PR #525.
Why non-blocking as a set: this PR touches no runtime code at all — every
changed line is a comment, JSDoc, or doc-prose line (confirmed independently
in review round 2: src/ has zero executable-line changes). The
letters-unchanged proof (2504 aligned substitution pairs, 0 word changes) and
the anchor-repointing check (all 90 moved heading slugs, all 34 call sites)
both held under adversarial review across two rounds. Nothing here can
propagate into a runtime defect.
Residuals
-
test/core/house-style-em-dash.test.js scans git ls-files, so an
untracked file is invisible to the gate. (test/core/house-style-em-dash.test.js:47)
By design CI only ever sees committed trees, so this does not let an
em dash reach a merged PR, but it is a real blind spot for an em dash
introduced in a file staged-but-not-yet-tracked during local dev. Consider
whether the gate should also check git status --porcelain for untracked
non-ignored files, or whether that's overkill for a style lint.
Preference / non-blocking.
-
CLAUDE.md is a symlink to AGENTS.md, so the gate's fs.readFileSync
reads the same bytes twice (once as AGENTS.md, once by following the
CLAUDE.md symlink). Purely cosmetic double-work in the scan; content is
byte-identical by construction of the symlink, so it cannot produce a false
pass or false fail. Preference / non-blocking, not worth fixing unless the
scan's runtime becomes a problem.
-
notes-archive/ (2 files, 38 em-dash-bearing lines) is excluded from the
sweep and the gate, on the grounds that the two files
(notes-archive/llp-reviews/remote-config-join-flow.spec.round-1.claude.md,
notes-archive/llp-reviews/login-auto-provision-forward-sink.decision.round-1.claude.md)
are dated, signed review transcripts (**Date:** 2026-06-12 /
**Date:** 2026-07-04, **Reviewer:** Claude (Fable 5)) — records of what
a reviewer wrote on a given day, not maintained project prose. Verified: the
dates and signatures are real, the exclusion is a visible, commented prefix
list in the gate (test/core/house-style-em-dash.test.js:31-44), and the
line count matches (grep -c em dash across both files = 21 + 17 = 38).
Judged correct, not merely non-blocking — repunctuating a signed transcript
would falsify the record it exists to preserve. No action needed.
-
The LLP-immutability scope call: the sweep repunctuates llp/ including
llp/tombstones/. This is the residual most likely to be wrong, so it
deserves a human's eye even though it is being classified non-blocking.
AGENTS.md:29-34 (the source convention, mirrored in the
<!-- neutral:llp-conventions --> block later in the same file) reads:
"Once an LLP is Accepted or Active, do not edit what it settled...
Mechanical edits are still fine: typos, broken links, status changes, and
renumbering that does not change meaning (LLP 0156)." The operative
test is "does not change meaning," and the sweep's own proof is exactly
that: 2504 aligned substitution pairs across the whole corpus (including
llp/tombstones/) with zero word changes, verified independently in both
review rounds, plus all 90 moved heading anchors repointed at all 34 call
sites (spot-checked again during triage; no stale slug references remain).
Judged within the convention's actual text. If the maintainer reads
"Accepted/Active is a record" more strictly than "meaning-preserving
mechanical edits are fine," this is the one clause to push back on — but as
written it does not block.
-
Two interruptive spans deliberately kept their commas rather than
taking the round-2 parenthesization fix:
llp/0063-login-auto-provision-forward-sink.decision.md:86
(The product intent, "log in, logs flow", is served by neither — a
quoted appositive, correctly left alone) and
llp/0041-central-config-client-actions.design.md:8 (already inside
parentheses, so nesting was unavailable; took a colon instead of a comma
pair). Spot-checked against the current head; both read correctly as-is.
No action needed.
Merge-ordering note (restated, not re-derived)
The orchestrator already posted a merge-ordering note on PR #525: this branch
overlaps 10 of the 11 other open branches and repunctuates headings, moving 90
anchor slugs. A sibling branch that adds a new @ref to an old slug would
merge cleanly at the text level (git cannot see the conflict) and then fail
ref-check — a semantic conflict, not a textual one. Recommendation stands:
land PR #525 last, after the in-flight fix PRs settle, so no sibling branch
pays a rebase plus an @ref re-audit.
Follow-up from the TRIAGE rung (LLP 0017) on PR #525 (repo-wide em-dash sweep,
fix/issue-472, head6021713). Two review rounds are exhausted; everyresidual below was judged non-blocking (a production-defect risk was not
found for any of them), so the PR is being carried through to
ready-holdrather than parked on
neutral:stuck. Filed so the deferred items staytracked instead of silently dropped.
Backlink: PR #525.
Why non-blocking as a set: this PR touches no runtime code at all — every
changed line is a comment, JSDoc, or doc-prose line (confirmed independently
in review round 2:
src/has zero executable-line changes). Theletters-unchanged proof (2504 aligned substitution pairs, 0 word changes) and
the anchor-repointing check (all 90 moved heading slugs, all 34 call sites)
both held under adversarial review across two rounds. Nothing here can
propagate into a runtime defect.
Residuals
test/core/house-style-em-dash.test.jsscansgit ls-files, so anuntracked file is invisible to the gate. (
test/core/house-style-em-dash.test.js:47)By design CI only ever sees committed trees, so this does not let an
em dash reach a merged PR, but it is a real blind spot for an em dash
introduced in a file staged-but-not-yet-tracked during local dev. Consider
whether the gate should also check
git status --porcelainfor untrackednon-ignored files, or whether that's overkill for a style lint.
Preference / non-blocking.
CLAUDE.mdis a symlink toAGENTS.md, so the gate'sfs.readFileSyncreads the same bytes twice (once as
AGENTS.md, once by following theCLAUDE.mdsymlink). Purely cosmetic double-work in the scan; content isbyte-identical by construction of the symlink, so it cannot produce a false
pass or false fail. Preference / non-blocking, not worth fixing unless the
scan's runtime becomes a problem.
notes-archive/(2 files, 38 em-dash-bearing lines) is excluded from thesweep and the gate, on the grounds that the two files
(
notes-archive/llp-reviews/remote-config-join-flow.spec.round-1.claude.md,notes-archive/llp-reviews/login-auto-provision-forward-sink.decision.round-1.claude.md)are dated, signed review transcripts (
**Date:** 2026-06-12/**Date:** 2026-07-04,**Reviewer:** Claude (Fable 5)) — records of whata reviewer wrote on a given day, not maintained project prose. Verified: the
dates and signatures are real, the exclusion is a visible, commented prefix
list in the gate (
test/core/house-style-em-dash.test.js:31-44), and theline count matches (
grep -cem dash across both files = 21 + 17 = 38).Judged correct, not merely non-blocking — repunctuating a signed transcript
would falsify the record it exists to preserve. No action needed.
The LLP-immutability scope call: the sweep repunctuates
llp/includingllp/tombstones/. This is the residual most likely to be wrong, so itdeserves a human's eye even though it is being classified non-blocking.
AGENTS.md:29-34(the source convention, mirrored in the<!-- neutral:llp-conventions -->block later in the same file) reads:"Once an LLP is
AcceptedorActive, do not edit what it settled...Mechanical edits are still fine: typos, broken links, status changes, and
renumbering that does not change meaning (LLP 0156)." The operative
test is "does not change meaning," and the sweep's own proof is exactly
that: 2504 aligned substitution pairs across the whole corpus (including
llp/tombstones/) with zero word changes, verified independently in bothreview rounds, plus all 90 moved heading anchors repointed at all 34 call
sites (spot-checked again during triage; no stale slug references remain).
Judged within the convention's actual text. If the maintainer reads
"Accepted/Active is a record" more strictly than "meaning-preserving
mechanical edits are fine," this is the one clause to push back on — but as
written it does not block.
Two interruptive spans deliberately kept their commas rather than
taking the round-2 parenthesization fix:
llp/0063-login-auto-provision-forward-sink.decision.md:86(
The product intent, "log in, logs flow", is served by neither— aquoted appositive, correctly left alone) and
llp/0041-central-config-client-actions.design.md:8(already insideparentheses, so nesting was unavailable; took a colon instead of a comma
pair). Spot-checked against the current head; both read correctly as-is.
No action needed.
Merge-ordering note (restated, not re-derived)
The orchestrator already posted a merge-ordering note on PR #525: this branch
overlaps 10 of the 11 other open branches and repunctuates headings, moving 90
anchor slugs. A sibling branch that adds a new
@refto an old slug wouldmerge cleanly at the text level (git cannot see the conflict) and then fail
ref-check — a semantic conflict, not a textual one. Recommendation stands:
land PR #525 last, after the in-flight fix PRs settle, so no sibling branch
pays a rebase plus an
@refre-audit.