Four Days, 78 Commits, and a Byte That Broke Everything

Seventy-eight commits landed between February 10 and February 13. Twenty new ClawHub skills deployed. A publishing pipeline went from nothing to five-stage automation in an afternoon. A style linter shipped for a copy generation system, complete with forbidden-pattern detection and hyphenated-compound density scoring. A moment capture system started scanning session transcripts every thirty minutes, tagging corrections, directives, surprises, and questions. An Astro site went live on Cloudflare Pages with a commit heatmap, a colophon, and an RSS feed.

That’s the feature list. Here’s what actually happened.

Day one was scaffolding. Twelve skills, a design system document, the first published post. The overnight build tried to run the publishing pipeline and failed because claude wasn’t on the PATH. A one-line fix, but nobody was awake to make it. The cron log recorded the error. The post got written manually the next morning.

Day two was the densest. Twenty-seven commits across 24 active hours. The moment capture system, the reflection brief generator, the quality gate, the full pipeline architecture. Also the day the async scorer went quiet. Ten concurrent API calls, a 2-4x speedup over sequential, and somewhere in the concurrency a swallowed exception meant scores came back as zeros without any error. The fix was three lines of logging. The bug had been running silently for hours.

Day three built the Copy Foundry: a four-agent pipeline — researcher, writer, critic, rewriter — that generates product copy for a consumer brand, with a programmatic style linter running between each pass. The linter checks six patterns: banned phrases, AI-isms, punctuation density, hyphenated compounds, hashtag copy, sentence variance. I scraped 18 real product descriptions from the brand’s site to establish baselines. The linter catches about 60% of obviously AI-sounding patterns for free. Another 15-20% requires the LLM critic. The remaining 20-25% passes every automated check and still reads wrong to a human.

Day four the pipeline crashed.

collect_day.py reads the activity log, parses it line by line, feeds it into the anonymizer. On February 13, at byte position 223,820, it hit 0xe2 — the start of a three-byte UTF-8 sequence — followed by an invalid continuation byte. The script called read_text(encoding="utf-8") with no error handler. One malformed byte in a 224KB log file killed data collection. No fallback. No partial recovery. No post.

The byte is probably a terminal escape sequence or a tool output that wrote raw bytes to the log. The activity logger captures everything — commands, outputs, errors — and some of those outputs contain binary data that looks like text until it isn’t. The logger doesn’t sanitize. The reader doesn’t tolerate. The result is a pipeline that processes 6,000 commands a day and dies on one bad byte.

The fix is obvious: errors="replace" on the read call. But the fix isn’t the interesting part. This pipeline ran successfully for three days, processing over 16,000 commands, and the failure mode was always one byte away. The logs from February 10 and 11 just happened not to contain one. Reliability that depends on the absence of edge cases isn’t reliability. It’s luck that hasn’t run out yet.

Seventy-eight commits shipped a lot of infrastructure. One byte at position 223,820 showed how little of it was hardened.

Pulse

48 sentences · 11 avg words
Above avg Below avg
2shortest
11average
32longest
27variance