feat(songwriting): finish Wave A verbatim cleanup and fix the <br> extraction bug - #2189
Conversation
…traction bug Wave A of the Pat Pattison chapter audit: complete the five research files the previous pass left unfinished, settle four unconfirmed leads, and fix an extractor bug that had been silently corrupting every quoted stanza. The extractor bug is the headline and it reaches back into #2183. These are Calibre EPUBs and they write line breaks as `<br class="calibre2"/>`, which a `<br\s*/?>` pattern does not match; the tag-stripper then removed them, so every lyric stanza arrived as one run-together line and restoring agents were inferring the line breaks. Corrected to `<br\b[^>]*>`. This is a correctness bug, not a formatting one — line count is what balance, stability and scansion claims are about, and re-verifying immediately caught the stagnant sheriff Box 3 in Writing Better Lyrics (2009) Chapter 6 as two printed lines, not one. The four spine/image invariants passed cleanly before and after, so they do not detect it. The revoked paraphrase-only rule did not merely omit Pat's text, it replaced it with invented scaffolding — "Use when" lists, bullet tests, checklists and unsourced tables that read like craft guidance and cite nothing. Removed across five files, including a fabricated "five motion controllers" table, a fabricated "Other named division axes" table, five invented "Use when" lists, an invented direct-address fact test, and two invented Pat quotes with zero corpus hits. Each replaced with Pat's printed text, or relabelled unaudited where no book source exists. No quote was invented for a source that cannot be read. All four leads settled: the "six rhyme types" premise was false; the "central emotion" quote is confirmed fabricated; the 1991 consonance claim is confirmed wrong and narrowed rather than deleted; Exercise 8.7 is genuinely absent from print, verified against the page scans. Also recovers figure-only content from 1991 Chapter 6 — the AABA statement/restatement/variation/return table, the S1/S2/S3 bridge diagrams, the ABAB ballad-stanza principle, and the "One More Dollar" box diagram — all of which follow a dangling colon and exist nowhere in the running text. songwriting 0.8.5 -> 0.8.6. No skill bodies changed. `_typos.toml` untouched; the two new exceptions use the inline spellchecker:off/on block form. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
|
Claude finished @kyle-sexton's task in 1m 13s —— View job Security review — no findings
Scope reviewed: all 9 changed files — What I checked for:
Conclusion: This PR is a content-only change (research text restoration + a regex fix description in the changelog prose, not an actual code diff — the extractor script itself isn't part of the changed files). There is no code, configuration, or workflow surface here that introduces a vulnerability. No CRITICAL / IMPORTANT / SUGGESTION findings to report. |
The file header said it names "the song and writers" for every excerpt. Three of the songs Pat works with — "Sentimental Lady", "Digging for the Line" and "As Each Year Ends" — carry no writer credit in his text or on the permissions page, so the claim was false for them. Reworded to "the song, and the writers where Pat names them." Small, but it is the same class of defect this wave exists to remove: a confident statement the source does not support. CHANGELOG bullet added under 0.8.6. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 4m 21s —— View job Review complete
Scope: the single commit What I checked
I did not independently run Findings (posted inline)Two related findings in
Two independent Other observations (non-blocking)
|
|
Claude finished @kyle-sexton's task in 59s —— View job Security review
No security issues found. This PR's diff (
None of the categories in scope for this lane apply here:
This PR is pure content/documentation correctness work (fixing a |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 109c119ad6
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Claude has reviewed this PR 5 times. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
|
Claude finished @kyle-sexton's task in 2m 45s —— View job Code review in progress
|
…ungrammatical PR review flagged "you already knows all this stuff" and "a kind of universal feeling that you seems to add" as subject-verb agreement errors in blockquotes presented as Pat's exact words. Good catch, wrong conclusion: the raw XHTML wraps `you` in an emphasis span in both cases. Pat is referring to the *word* `you` as a mentioned term, which takes a singular verb, so both sentences are correct exactly as printed. Italics restored. This is a second, subtler failure mode of the same extractor. The `<br>` bug destroyed line breaks; stripping emphasis spans destroys the cue that a word is being mentioned rather than used — which makes correct verbatim text look broken and invites a "correction" that would corrupt Pat's actual words. The earlier assessment that stripped italics change no factual claim was wrong, and is corrected in the audit ledger and handoff. Standing rule added: when a restored quote looks ungrammatical, check the raw XHTML for italics before changing anything. Blanket span-to-emphasis conversion is still refused — Essential Guide to Rhyming (2014) is fixed-layout and uses spans for its per-word text layer, so that rule would corrupt every page of it. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 19s —— View job Security review — no findings
Scope reviewed: all 9 changed files — What I checked:
Conclusion: This PR is a content-only change (research-file text restoration, an extractor-bug writeup in prose, and a version bump) with no code, configuration, or workflow surface. No CRITICAL / IMPORTANT / SUGGESTION security findings. (Note: a licensing/redistribution concern about verbatim copyrighted book/lyric text was raised in a separate review comment on this PR — that's a content-provenance/licensing question, not a security vulnerability, and is out of scope for this security-review lane.) Branch: |
|
Claude finished @kyle-sexton's task in 4m 29s —— View job Code review complete
Scope: all 9 files across the full branch diff ( Findings (posted inline)Two complete third-party song lyrics are reproduced verbatim in
What I checked and found consistent
I did not independently run |
…done Delayed idle notifications revealed that two Wave A agents did not finish — they died with "Output blocked by content filtering policy" and their last reports named unfinished work. I had read their files going quiet as completion. It was death, which is exactly the failure mode the handoff warns about, and I misread it. The consequence was real and shipped in 109c119. stable-unstable-meta.md correctly replaced the fabricated "central emotion" quote near the top, but the agent died before reaching the three sections that key off the same invented phrase — the worked diagnostic, the coaching prompts and the anti-patterns. The committed file therefore debunked "central emotion" as fabricated and then went on using it as a diagnostic key three more times. All three now use Pat's actual wording from Writing Better Lyrics (2009) Chapter 18: "central intent, idea, and emotion". Verified in source at corpus/book2/025_c4U6.txt — "The elements all join together to support the central intent, idea, and emotion of the work." Also adds a provenance section naming the two things in that file that are not Pat's: the tone-of-voice axis (non-book, 0 hits across all four books) and the worked diagnostic (the file's own applied example, not a case Pat prints). repetition.md needed no repair. Its remaining task was inserting the full "Strawberry Wine" lyric; the section already carries Pat's box-weight test quoting only short fragments, which is the correct treatment and the one PR review is asking for elsewhere. The agent dying prevented a defect rather than causing one. Both files re-checked for mid-edit damage: code fences balanced, spellchecker guards paired, no placeholders. typos, markdownlint and lychee all clean. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 15s —— View job Security review — no findings
Scope reviewed: all 9 changed files at HEAD What I checked:
Conclusion: This PR remains a content-only change (verbatim-text restoration, an extractor-bug writeup in prose, and a version bump) with no code, configuration, or workflow surface. No CRITICAL / IMPORTANT / SUGGESTION security findings. (Note: a licensing/redistribution concern about verbatim third-party lyric text — "Strawberry Wine" and "One More Dollar" in Branch: |
|
Claude finished @kyle-sexton's task in 2m 1s —— View job Code review complete
Scope: this round was triggered by a new push, commit What the new commit does, and whether it's correct
I verified:
I did not independently run Non-blocking observation (out of scope for this commit, flagging for awareness)The commit message frames "central emotion" as a fabricated phrase that "was carried here for eight handoffs." The exact phrase (without Pat-attribution) also appears as working terminology in several files not touched by this PR — Status of previously-flagged items (unchanged by this commit)Both blocking items raised in earlier review rounds are still open as of
Both are already tracked in open review threads with the author's own acknowledgment that they're pending an owner decision, not something to fix silently inside this cleanup — nothing further to add there. |
…defect Audits audit-checklist.md, bridge.md and every book-attributed block quote in the research files, and measures how far the <br> line-break bug actually reached. audit-checklist.md was nearly half wrong. 192 lines carrying 26 chapter citations and zero reproduced text — pure checkbox scaffolding attributed to specific chapters. All 83 boxes were tallied against those chapters: 42 traceable, 15 distorted, 26 invented. Traceable boxes now quote Pat's actual sentence, distorted ones are corrected, and invented ones are relabelled as the file's own synthesis rather than deleted, so the owner can see which is which. 11 false section attributions fixed. bridge.md opened on a bare uncited "A bridge isn't a verse." The sentence is real but truncated; Pat's full Chapter 23 passage goes on to contrast bridge against verse and chorus. Restored and cited, along with Exercises 49 and 50 which were entirely absent, plus two numbered lists that had been flattened into prose run-ons. Also removed a fabricated alias pair — the file claimed "channel" and "runway" as pre-chorus names; the figure lists only Pre-Chorus, Climb or Lift, Vest, Verse Extension, Ramp and Prime. That one was catchable only by reading the image. Also fixes a fabricated quote in response-filter.md, a quote misattributed to Chapter 1 that is really Chapter 5, and two couplets in cliche.md presented as displayed stanzas when Pat quotes them inline, slash-separated. The line-break damage is narrower than reported. It was flagged as potentially affecting all ~9,000 lines restored in #2183. Measured across 1,109 consecutive line-pairs in every quoted block in all 49 files, 27 candidates surfaced and nearly all were legitimate — 14 are Pat's own deliberate split into eight short phrases in phrasing.md, the rest are dialogue split per speaker, contrasted variants, and a wrapped thesaurus entry. Only cliche.md needed correcting. A proposed fix to hook.md was checked against the raw XHTML and rejected: there is a <br> between every line there, so those are genuinely separate printed lines and joining them would have introduced the corruption being hunted. Two files were completed by a second toolchain after the output content filter killed the agent working on them mid-task. Its output was verified against source rather than trusted — it was wrong once, on the hook.md case above. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 3m 7s —— View job Code review complete
Scope: this round was triggered by the new commit What I checked
No new correctness issues found in this commit. It reads as careful, well-cited work — each edit that reclassifies content as "this file's synthesis" rather than Pat's text is doing real work distinguishing invented scaffolding from sourced material, which is the whole point of this PR. Status of previously-flagged items (unchanged by this commit, not touched here)Both still open per existing threads, not addressed by
I did not independently run |
|
Claude finished @kyle-sexton's task in 1m 35s —— View job Security review — no findings
Scope reviewed: the full PR diff (18 files: What I checked:
Conclusion: This PR remains a content-only change (verbatim-text restoration, citation corrections, and a (Note: the licensing/redistribution concern about verbatim third-party lyric text — "Strawberry Wine" and "One More Dollar" in Branch: |
…mposed lyrics rule The owner has settled the scope question directly: he owns all four books, he is the only user of these plugins, and he wants the lyrics Pat analyses reproduced in full. Two things in the repo contradicted that. README.md's License paragraph claimed the plugin "contains distilled craft guidance and short verified anchor quotes, not book text." That stopped being true at 0.8.5. A false statement in a License section is worse than an unfashionable true one, so it now says what is actually here: MIT covers the plugin's own code, skills and prompts and does not extend to quoted material; the research files reproduce Pat's text and the lyrics he analyses verbatim as a deliberate personal-reference decision; Pat's writing remains his and the lyrics remain their writers'; where Pat quotes a lyric his publisher licensed it and that license is not this repo's; and a reader who is not the owner gets no rights to any of it from the MIT header. It points at the four books. point-of-view.md had invented its own rule — "Complete third-party song lyrics are not reproduced" — and cut lyrics down to fragments. That rule was never the owner's, and it left the file inconsistent with box-model.md, which reproduces the lyrics Pat works with in full. Header corrected, and the "As Each Year Ends" stanza restored to Pat's full six lines. Remaining short excerpts in that file are now recorded there as a known gap rather than presented as policy. Note for the next session: this material cannot be delegated to the codex fallback. Codex declines to reproduce full third-party song lyrics regardless of ownership or personal-use rationale, so the escape hatch that covers filtered book prose does not cover lyrics. Restoring those remains hand work in small increments. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 1m 19s —— View job Security review — no findings
Scope reviewed: all 19 changed files — What's new in this commit, specifically:
What I checked, across the full diff:
Conclusion: This PR remains a content-only change (verbatim-text restoration, a (Note: the licensing/redistribution question about verbatim third-party lyric text in |
…sub-threshold miss (#2905) Closes #2865. ## What this fixes `scripts/silent-revert-incidents.txt` pins a `clean` row that is supposed to be the closest a non-incident got to the 200-line threshold without crossing it — the row that breaks first if a threshold change starts taxing ordinary development. The pinned commit was not that, and its note named a number that is not a pull request. **Defect 1 (the re-pin).** Measured over the file's own 500-commit corpus (`7b47d2253~500..7b47d22`) at the pinned invocations (#2843, `GIT_CONFIG_GLOBAL=/dev/null GIT_CONFIG_NOSYSTEM=1`), the pinned `c8470efd0` scores **136** blamed lines — sixth-closest of the eight commits in the 100–199 band. The true closest miss is **`9a2307c43` (#2189) at 195 lines** from `3584ae1fa` (#2183) — a margin of 5 lines, not the ~71 the old row implied. `9a2307c43` is now the lead `clean` row. **Defect 2 (the wrong PR number).** The old note credited the deleted content to #2679, which is a closed issue in this repository, not a pull request (`gh pr view 2679` cannot resolve it). The blamed lines trace to `6370a44e7`, the squash commit that landed #2715 — `gh api .../commits/6370a44e7/pulls` returns only #2715, and the commit's own body says `Builds on merged #2715 → #2692 → #2690`. The row is kept as a second guard with its note corrected, rather than dropped: it is still a verified-legitimate quiet commit, and keeping it costs a few lines of prose. **Defect 3 (the "once a month" rate)** was already fixed by #2847, which removed the rate claim from `scripts/check-silent-revert.sh` entirely. Nothing in this PR touches it. ## What this does NOT do Neither clean-row figure is CI-asserted, before or after this change. `clean` rows carry no bracketed attribution field (#2879) — their assertion is the absence of findings, which has no per-culprit count to pin — so the 195 and 136 are hand-measured prose, not watched numbers. The old row's recorded 129 drifting to a measured 136 under the pinned invocations without anything going red is exactly that gap, and the section comment now states it so a reader does not mistake the re-pin for an assertion. Both counts are written as floors ("no fewer than") because `attribute_file` drops `git blame`'s stderr (#2880), so any line blame fails on is silently not counted. ## Verification - Spot-checked both figures against PR #2843's pinned invocations before editing: `9a2307c43` reproduces **195** (75 lines `song-forms-examples.md`, 67 `box-model.md`, culprit `3584ae1fa`), `c8470efd0` reproduces **136** (109 lines `persist-findings.md`, culprit `6370a44e7`). - `bash scripts/check-silent-revert.test.sh`: **101 passed, 0 failed** on this branch. - `scripts/check-silent-revert.sh --verify-known-incidents`: exit 0 — all three `fires` rows reproduce their attributions exactly, and both `clean` rows stay quiet. - `scripts/check-silent-revert.sh --verify-restoration`: exit 0 — all 5 markers present. - A fresh-context verifier independently swept all 500 corpus commits twice (complete coverage: 487 `ok` + 2 `acknowledged` + 11 finding commits = 500) and reproduced every figure in the file. Its verdict: **195 at `9a2307c43` is the highest sub-threshold score** — the next highest is 188 (`3d69448cb`) — so the lead `clean` row pins the true closest miss. The two acknowledged commits were re-run with the ack file disabled and score 447 and 323, both above the threshold, so neither could displace it. ## Related - #2843, #2847, #2873 — the three PRs that reshaped the canary and this file ahead of this change; the figures here are measured under #2843's pinned invocations. - #2879 — records that `clean` rows carry no bracketed attribution field, which is why neither figure in this PR is CI-asserted. - #2880 — records that `attribute_file` drops `git blame`'s stderr, which is why both counts are written as floors. - #2831 / #2832 — the same wrong-PR-number defect shape, corrected earlier on the `fires` rows. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01LwdkpWf6bptu3AqTMoeg2H --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

Wave A of the Pat Pattison chapter audit: finish the five research files the
previous pass left incomplete, settle four unconfirmed leads, and fix an
extractor bug that had been silently corrupting every quoted stanza.
songwriting
0.8.5→0.8.6. No skill bodies changed — this is researchcontext, the CHANGELOG and the version bump.
The extractor bug is the headline, and it reaches back into #2183
<br>carries attributes in these EPUBs. They are Calibre-produced andwrite line breaks as
<br class="calibre2"/>, which a<br\s*/?>pattern doesnot match. The tag-stripper then removed them, so every lyric stanza arrived
as one run-together line —
Losing the human raceFalling from heaven's grace…. Agents restoring those stanzas were inferring the line breaks andcalling the result verbatim. Fixed to
<br\b[^>]*>.This is a correctness bug, not a formatting one: line count is what balance,
stability and scansion claims are about. Re-verifying against the corrected
source immediately caught a real error — the stagnant sheriff Box 3 in
Writing Better Lyrics (2009) Chapter 6 is two printed lines, not one.
The four spine/image invariants do not detect it. All four passed cleanly
before and after. Future extractor gates need a stanza spot-check.
Not fixed here, recorded for the verification wave: the ~9,000 lines
restored in 0.8.5 were built with the buggy pattern and have not been
re-verified.
What the sweep found
The paraphrase-only rule that #2183 revoked did not merely omit Pat's text — it
replaced it with invented scaffolding: "Use when" lists, bullet "tests",
checklists, named axes and failure-mode tables that read like craft guidance and
cite nothing. This is the most common fabrication form found and the most
dangerous, because it looks like the useful part.
Concretely, in five files:
stable-unstable-meta.md— 201 lines, seven separate fabrications,including an invented "five motion controllers" table (
melodic rhythmandharmonic rhythmreturn zero hits corpus-wide) and an epigraph falselyattributed to Berklee Online.
box-model.md— a fabricated "Other named division axes" table, inventedtravelogue and same-color "tests", invented POV and tense bullets, and
editorializing Pat never wrote.
point-of-view.md— five invented "Use when" lists, an inventedfour-question "fact test", and a fabricated One walks into the room example.
repetition.md— invented hidden-question/command matrices, a silentlytruncated quote, and a categorical rule softened into a preference.
rhyme-types.md— an invented Pat quote ("Craft prepares you to becreative.") with zero corpus hits.
Everything above was replaced with Pat's actual printed text, or relabelled
unaudited where no book source exists. No quote was invented for a source that
cannot be read —
point-of-view.md's Berklee Online material was deliberatelyleft paraphrased and is now explicitly marked unaudited.
The four leads, all settled
rhyme-types.md"six rhyme types" — premise false. The line already read"six" against a six-item list. Left unchanged. (The invented quote above was
found while checking.)
— Patquote — CONFIRMED FABRICATED, zero hitsacross all four books.
additive and assonance are genuinely absent; Essential Guide to Lyric Form
and Structure (1991) Chapter 4 does name Consonance Rhyme.
(2014) Chapter 8 runs 8.1-8.6, 8.8-8.10, verified against the page scans
because a numbering gap is normally an omission detector. No edit needed.
Figure-only content recovered
Several passages in 1991 Chapter 6 exist only as images, after a dangling
colon in the text — the AABA statement/restatement/variation/return table, the
S1/S2/S3 bridge diagrams, the ABAB ballad-stanza principle, and the
Working/Gambling/Panhandling box diagram for "One More Dollar".
Verification
All green:
typos,markdownlint-cli2(103 files),lychee --offline(770 links),
check-changelog-parity.sh --check-bump,validate-plugins.sh,and the
Books? [1-4]citation regression grep.check-skill.shnot run — noskill body changed.
_typos.tomlwas not edited; the two new exceptions ("Viet Nam" in averbatim lyric, and a scansion strip) use the inline
spellchecker:off/spellchecker:onblock form.Related
No linked issue.