Engineering notes
Tips, patterns and practice from building software with AI agents.
Uncommitted changes are part of the build
24 October 2026 · Guardrails & fail-closed
A fingerprint built from the commit at HEAD ignores edits in the working tree. We added a hash of the diff and the untracked source files, and a test that edits, adds and reverts.
When git cannot answer, rebuild
22 October 2026 · Guardrails & fail-closed
A fingerprint that falls back to a plain string when git fails can match a stored release. We made an unknown fingerprint read stale and force a rebuild, and wrote tests for both outcomes.
Hand the designer what ships
20 October 2026 · AI-built UI
When a design tool needs to show your pages, export the build's own resolved output, not your templates and content. A versioned, deterministic directory of exactly what ships is the only preview that cannot drift from the site.
Preview with the gate's own code
16 October 2026 · Testing & verification
A preview that estimates what the gate will do is a second implementation of the gate, and it will drift. Make the preview call the gate's own function, so a clean preview is the build passing.
The default that failed open
16 October 2026 · Guardrails & fail-closed
An optional argument with a safe-looking default is a guard that a forgetful caller can skip. For anything that protects a boundary, make the argument required and let the compiler refuse the caller.
Two seats per task
15 October 2026 · Agentic workflows
One agent builds each task and a fresh one reviews it before the next task starts; one scoped re-review per fix; one whole-branch review at the end. The shape matters more than the model.
A plan the next session can run
13 October 2026 · Specs & planning
An implementation plan written for an agent with no memory of the design conversation needs exact code in every step, a brief per task and a ledger that outlives the session.
Refuse, don't warn
8 October 2026 · Guardrails & fail-closed
A build that warns about a leak will ship the leak. Make every check a refusal with a name, prove each one with a red case first, and let the build fail closed.