Skip to content

Follow-up: deferred review findings from PR #525 #532

Description

@philcunliffe

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    neutral:fixDelegate this issue to neutral for an autonomous fix attempt (reproduce -> fix -> PR)neutral:stuckneutral attempted this but cannot complete it autonomously — needs a human

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions