A routine pass through the project’s outstanding-actions register turned up four open items against this site: traffic, indexing, content, measurement. Search Console had sampled two pages with malformed structured data and asked that they be fixed. Pulling that thread found nine.
An event that had never fired
All nine broken blocks were the same bug in nine places: a Frequently Asked Questions schema whose answer text quoted a song title in straight double quotes—“text”:““I Feel Fine” was written by John Lennon…”—which is invalid JSON the moment the parser hits the second quote. Dizzy Miss Lizzy, Honey Don’t, I Call Your Name, I Feel Fine, I’m Happy Just to Dance with You, Matchbox, Mr. Moonlight, Tell Me Why, and Yes It Is had all been serving an FAQ rich-result block that no crawler could ever parse. A quote-escaping pass across all 1,162 JSON-LD blocks in the corpus found and fixed the nine; all 1,162 now parse.
The more interesting find was underneath the measurement action. This site’s only custom analytics event—a GA4 search event meant to log what people typed into the internal search box—was wired to listen for submissions on form.header-search. That selector exists on zero pages. Site search here has always been a Google Programmable Search element, not a native form; the listener was copied forward from an earlier template and never once matched anything. Two hundred and eighty-three pages were carrying working, well-formed JavaScript whose entire purpose was to do nothing. It is one explanation, though far from the only one, for why the analytics property has been reporting zero key events despite real page-view traffic.
The dead listener came out everywhere, replaced by a single privacy-conscious event, research_engagement, that fires at most once per page when a reader’s scroll reaches the Recording, Mix Variants, or Sources section, or after forty-five seconds of active time on the page—whichever comes first. The internal-search event survives, but it now reports a query-length band (“1–10 characters,” “11–20,” and so on) instead of the words someone typed. No identifier, name, or free text leaves the browser in either case, and the privacy policy was rewritten in the same session to say so—a privacy claim that isn’t written down anywhere the reader can check isn’t much of a claim.
One more correction, smaller but worth naming: an early pass flagged two song pages as internal-link orphans with only two and three inbound links each. The flag was wrong. It was a bug in the auditing script—a scheme filter that rejected any link starting with tel, which happens to be how Tell Me Why and Tell Me What You See both start. Corrected, the real distribution runs from four inbound links at the low end to seventy-two at the high end across all 215 song pages, which is healthy. The one genuine gap it did catch, Yes It Is, had simply never been added to the songs index after it was written from scratch three sessions ago—now fixed. Worth remembering: a script auditing the site is also a script that can be wrong, and it gets checked like anything else before it changes a page.
A homepage that forgot to invalidate its cache
Further back, the homepage hero picked up two auto-generated link cards—latest articles, latest build-log posts—pulled at build time from the headline and datePublished already sitting in every post’s own JSON-LD. A new script, gen_hero.py, reads that corpus and rewrites two marker blocks in the homepage; the output is plain crawlable HTML, no client-side fetch, and the script refuses to run silently out of date (a --check flag exits non-zero on drift). The first deploy looked broken in the browser anyway: the new grid rendered with the old CSS, because the stylesheet had been edited without bumping its cache-busting ?v= token, so returning visitors kept being served the cached file. Nothing in the source was wrong; screenshotting the live page and diffing the actual served stylesheet against the edited one was what caught it. The token now moves with every CSS edit as a standing rule, not a reminder.
Two more clusters through Help!
Enrichment kept its two-page rhythm through the back half of the Help! sessions: Tell Me What You See paired with I Need You, then Another Girl with Yes It Is—the latter a from-scratch page built around a genuine source disagreement, Lewisohn calling George Harrison’s pedal a “tone pedal” where Kehew and Ryan’s track sheet reads “volume pedal;” the page records both rather than picking a winner. You’re Going to Lose That Girl took the one-page floor on its own session, and the most recent pair, Help! and Dizzy Miss Lizzy, corrected a Help! take count of 25 down to 12 and untangled a Dizzy Miss Lizzy session log that had folded two different songs’ takes into one number. Enrichment now stands at 92 of 214 songs, metadata tagging at 39, and the re-verify streak—pages checked a session later against the printed sources and found to need no correction—is unbroken at twenty-five. A new /articles/ essay on single-versus-album mix variants shipped in the same stretch, and its comparison table became a shared CSS component used across the site rather than a one-off.
None of the measurement or schema work touched a single documented fact. The register itself, read but not rewritten this session—its embedded chart uses a value the usual spreadsheet library refuses to load—still has two items that need Search Console and GA4 access this project doesn’t have. The next session returns to the regular queue.