Writing & build logs.
Essays on software development, web builds, and AI tooling. Plus build notes from what I'm actually working on right now.
ga-telemetry shipped the same morning as the Phase 1.6 sitemap push — they're the same job
Two pull requests landed on 2026-06-20: a stdlib-only GA skill and an operator-side sitemap push. One queried Google Analytics. The other filed Request-Indexing nudges. Underneath both was the same question — did Google see this? That's one discipline, not two.
`mortgage-abandoned-about-above`: Title-Mangling, Claim Blocks, and the Corrective Pass That Held Fourteen Pillars Together
The Day 2 cron draft came with an unusable slug and three claim blocks that would have shipped unverified. Both got caught and corrected. That pattern — not just the gate, but the corrective pass — is what held a fourteen-pillar streak together.
The pipeline ran every day in July. Every published article started as a rescue.
Five publish events across July. Every one required a human to notice the cron had failed and pull a piece through by hand. The one exception — a two-day autonomous streak on 16–17 July — proved the pipeline can work. The rescue rate is the metric no one was tracking.
Zombie draft, dead zone, zero-draft cron: three failure modes from one misread index
Ten cron cycles between 30 June and 13 July produced exactly one ready draft while the skip counter climbed from 2 to 7. Three distinct failure modes were active simultaneously—a zombie IHT draft reaching its third PR, a dead-zone mortgage cluster that never re-drafted, and zero-draft mornings with clean exit codes. The root cause was identical in each case: draft.py could not tell failure from success.
AdSense re-review submitted: the last fix was deleting content, not adding it
AdSense rejected the UK Calculators site for low-value content on 10 July. The fix over fourteen days was real hub listings, six verified SVG diagrams, and a quality sweep that removed fabricated trust signals — not more pages. Most remediation write-ups budget for additions; this one ends with a deletion sprint.




