Posts
- backend · 2026-06-03 The green light was lying — an ERROR right next to succeeded A worker logged the same ERROR every run — yet the next line, the task ended succeeded. A dual-write hid the primary write's failure, and a create-guard never propagated a new schema to an existing collection.
- infra · 2026-06-03 GitHub Actions to GCP without a long-lived key — the hard part wasn't WIF We swapped the SA-key-in-a-Secret path for Workload Identity Federation. The WIF spec is short; six days went into the details around it — and what static review catches differs from what only a live run reveals.
- product · 2026-06-02 Photo clouds solved storage, not finding — why we built Ascendy Fixing a teary birthday photo with AI swapped my child's face. That detour led elsewhere: photo clouds solved storage, not finding. Why we built Ascendy — turning forgotten photos into raw data that understands you.
- meta · 2026-06-01 The benevolent lie — how much hallucination do you allow in an AI-written post? An AI draft slipped in a detail not in the source — '3am, the third OOM.' It reads well, but I don't know if it's true. When human memory is itself a kind of hallucination, where's the line between color and fact?
- meta · 2026-06-01 The bottleneck in writing wasn't the answer — it was the question. Why I built an agent that interviews me I gave topic and writing to agents and the prose went lifeless — not for lack of a human author, but because the source had no first-hand scene. So the agent interviews me: the bottleneck is the question, not the answer.
- meta · 2026-05-31 We paired two AI models and got slower — so we routed work by tier A solo dev's three-stage evolution of an LLM coding-agent harness: single model → cross-model pairing → routing work into tiers. Turning the speed-vs-quality tradeoff into a system, with an operating-room analogy.
- frontend · 2026-05-31 Commenting out a feature doesn't bring it back — the double-trigger race we found restoring it An auto-sync trigger we commented out was never restored, so the feature silently died. Restoring it exposed a double-trigger race: an await between check and act defeated the re-entrancy lock.
- backend · 2026-05-31 ERROR showed, INFO vanished — the two traps that swallowed our Celery logs A Celery worker logged zero INFO lines while ERROR showed fine. Two layers: Python logging uninitialized at the worker entry point, and a YAML block scalar that let bash chop the worker command apart.
- backend · 2026-05-31 Only one model kept 404'ing — a preview-alias time bomb meets branch asymmetry In a multi-provider agent chat, one model path always 404'd. Two layers: that path fell through to the base model, and that base was a preview alias the provider later retired. A CI guard for model lifecycle.
- infra · 2026-05-30 The first question in cost optimization isn't hardware — a self-hosted AI inference war story, part 2 After moving to managed GPU, always-on pods still leaked fixed cost. We split workloads by latency budget: search-path embeddings on always-on pods, async captioning on serverless — moving cold start off the user's path.