Build LogPrivacy
#01
2026-08-055 min read

Privacy on this site runs at three layers. The page arrived last.

The /privacy/ page went live in June as part of the newsletter sprint. A month before that, a pre-commit hook was already blocking my macOS username from every committed file. A month after, I wrote down the editorial rule that neither the page nor the hook can enforce. Three layers, three threat models, three different origins.

Read post
Build LogTesting
#02
2026-06-286 min read

The diff check passed forever. That was the bug.

A test that checked whether verify.py was modified by a wiring PR became trivially true the moment PR #43 squash-merged. Phase X.8 replaced it with replay hashes, pre-registered gates, and hermetic sabotage cycles — tests designed to fail when they should.

Read post
Build LogEditorial
#03
2026-06-206 min read

25 PRs, a rescued BoE fetcher, and a composer taught restraint: the editorial pipeline ships

PR #53 merged on 12 June: the first article through the full X.8 grounded editorial pipeline. The morning sweep showed three gaps that had been quietly open — a stale PR that would have deleted the BoE rates fetcher, a composer inferring beyond its sources, and a design sprint that completed the day after. All three closed within 72 hours.

Read post
Build LogDevOps
#04
2026-06-145 min read

Two correct cancellations, two SLA breaches, four manual ships

On 13 June, the 09:00 and 12:00 BST editorial slots both failed in the same day. G-L3 cancelled the queued articles correctly each time. Manual recovery covered every slot. The experience made the gap between row-level correctness and slot-level reliability impossible to ignore.

Read post
Build LogVoice Design
#05
2026-06-105 min read

Both voice iterations failed the Cash ISA test. I shipped the original.

Two iterations of the uk-calculator-voice skill (analytical v2.0.0 and warmth-corrected v2.1.0) both failed the same blind A/B on Cash ISA drafts. The original v1.0.0 won both rounds. The ship was v1.1.0: a reset to the passing baseline with the recovery path formalised, not a third iteration attempt.

Read post