Writing & build logs.
Essays on software development, web builds, and AI tooling. Plus build notes from what I'm actually working on right now.
Eight cannibalisation pairs, one prefix strip, one PR
A numeric prefix in every calculator slug had created eight cannibalisation pairs — Google couldn't determine which URL was authoritative, so neither ranked with confidence. The fix required one atomic operation across content, routing, and the internal link graph: universal prefix strip, 23 permanent redirects, every MDX cross-link repointed. Not three PRs. One.
The 4-bit LLM hallucinated my Halifax statement. A band-based parser fixed it.
bb finance's Phase H spike wired a 4-bit quantised Llama 3.2 1B as the primary PDF extraction route. On real Halifax statements it hallucinated at a destructive rate — page 3 has 34 transactions; the model returned something else. PF-002 disabled the LLM path and replaced it with a deterministic band-based parser that lands 54 of 54.
The publishing queue ran at 20% success rate. Fixing it took three changes that only work together.
Four autonomous publishing slots expired before the pattern became clear. Sibling cancellation, slot fallback, and a missed-slot alarm are a set — without all three, the queue degrades silently.
20% in 72 hours: rewriting the slot scheduler's SLA recovery
Twenty percent autonomous success across five scheduled slots in 72 hours. The substitute pool was running but consuming the wrong inventory — draining future windows to cover present failures. Three mechanisms and a first-class slot state machine fixed it.
Four quest types. None of them read your transactions.
An iOS budget app shipped a gamification layer backed by a hardcoded mock array. Phase C replaced it with QuestGenerator — a pure function that derives up to four quests per day from real transaction history. What changed wasn’t the number of quests. It was whether the quests knew anything about the user.




