Skip to content

content(writings): allowlist three known forward-refs (PR-3.1.5 floor sweep)#151

Closed
klappy wants to merge 3 commits intomainfrom
canon/link-rot-sweep-3-1-5-allowlist-known-forward-refs
Closed

content(writings): allowlist three known forward-refs (PR-3.1.5 floor sweep)#151
klappy wants to merge 3 commits intomainfrom
canon/link-rot-sweep-3-1-5-allowlist-known-forward-refs

Conversation

@klappy
Copy link
Copy Markdown
Owner

@klappy klappy commented Apr 27, 2026

Floor-clearing sweep ahead of PR-3.2 (hard-block flip). Adds three line-level <!-- audit-allow: dead-reference reason="..." --> directives, paired with paragraph splits in two of the three files so the directive scope correctly lands on the dead link.## Findings dispositionedAll three are book-arc forward references — the surrounding text points at the next chapter (or an appendix) before that chapter is published. Drafted in draft-zeros/, will auto-heal on promote to writings/.| File:Line | Target | Disposition | Notes ||---|---|---|---|| writings/choosing-faith-not-fear.md | klappy://writings/four-questions-that-change-everything | Allowlisted; paragraph split | Was 2nd link on a multi-link line — split into two italic paragraphs so the directive scopes to the dead link. || writings/the-broken-wall-and-the-buried-talent.md | klappy://draft-zeros/appendix-a-the-biblical-roots | Allowlisted; paragraph split | Was 3rd link on a multi-link line — split into two italic paragraphs so the directive scopes to the dead link. || writings/the-voice-came-first.md | klappy://writings/four-questions-that-change-everything | Allowlisted in place | Dead link is already first on the line; directive scopes correctly with no rewording. |## Why these are allowlists, not fixesThe audit-allow directive is the seam where authorial intent enters the audit. These references are intentional forward-pointers in a book-arc that is mid-publication; their dead-state today is a feature of the publication sequence, not a defect. When the chapters they point at promote to writings/, the resolver finds them, the dead-reference finding disappears, and the directive becomes harmless residue (cleanup is a future low-priority sweep, not a deadline).## Why two paragraphs got splitPer spec v2.2:> Scoped to the next markdown link. One rule_id per directive.The directive suppresses the single next markdown link. Two of the affected paragraphs comma-spliced two or three links onto one line, where the dead link was second or third. Without splitting, the directive would suppress a working link and leave the dead one unsuppressed — a silent failure that would still show red. Splitting into two italic paragraphs preserves the prose voice exactly while making the directive grammar work.The alternative options considered:- Hard-wrap inside italics (cosmetic-only, but markdown-rendering-fragile)- Extend the directive to multi-link scope (spec change + worker change + RV-gate dispatch — too much weight for an edge case)Paragraph splits chosen because they're zero-cost on the rendered side, preserve voice, and make the contract explicit. Operator-approved on this approach.## VerificationAfter merge, the canon-quality workflow (PR #149, soft-block) on the next PR touching writings/ should report 0 findings with 3 suppressed_findings. This PR is itself one such PR — its workflow run will be the live test.## Refs- Spec: klappy://docs/oddkit/specs/oddkit-audit v2.2 (allowlist grammar, line-level scope)- Companion: #149 (the canon-quality workflow this is the floor-sweep for)- Campaign: klappy://docs/planning/link-rot-elimination-campaign- Drafts the forward-refs point at: - draft-zeros/ch07-four-questions-that-change-everything.md (referenced from #1 and #3) - draft-zeros/appendix-a-the-biblical-roots.md (referenced from #2)


Note

Low Risk
Low risk, content-only changes that add audit-allow suppressions for intentionally unpublished forward links and adjust paragraph breaks to ensure the suppression scopes to the correct target.

Overview
Adds three line-level <!-- audit-allow: dead-reference ... --> directives to suppress known intentional forward references to unpublished chapters/appendix.

Splits the closing italic “next/previous chapter” blurbs in choosing-faith-not-fear.md and the-broken-wall-and-the-buried-talent.md so the directive applies to the specific dead link, and inserts the directive above the existing forward-ref link in the-voice-came-first.md.

Reviewed by Cursor Bugbot for commit b63d8a3. Bugbot is set up for automated code reviews on this repo. Configure here.

@klappy
Copy link
Copy Markdown
Owner Author

klappy commented Apr 27, 2026

Closing as a duplicate of #152, which the operator authored with the same approach (paragraph splits + line-level audit-allow directives) and clearer voicing of the reason strings. #150 also overlaps but has additional frontmatter cleanup commits from Cursor Agent.

Net delta merged: zero. Net duplicate work surfaced: this PR. Lesson: when the operator has been silent for >2 hours during execution mode, default to assuming they may be doing parallel work themselves rather than continuing to ship into the same workspace.

@klappy klappy closed this Apr 27, 2026
@klappy klappy deleted the canon/link-rot-sweep-3-1-5-allowlist-known-forward-refs branch April 27, 2026 18:05
@klappy
Copy link
Copy Markdown
Owner Author

klappy commented Apr 27, 2026

Correction (posted minutes later): the original close-comment said #152 was "operator-authored." That attribution is unverified. The operator subsequently reported they did not knowingly open #150 or #152, and suspects a Cursor Background Agent or similar automation acting through their GitHub credentials. GitHub records user.login = klappy for the PR creator field on both, which is consistent with either human or token-authenticated agent activity — the API does not distinguish them.

The factual content of the close still stands: #151 modified the same three writings/ files with line-level audit-allow directives + paragraph splits, and #150/#152 do the same. So #151 was redundant with at least one of them regardless of who opened them. But the framing "the operator authored #152" was a leap from API attribution to human authorship that I should not have made.

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