3 minutes
Agentic Engineering in Practice, Part 4: Working With an Agent
This is Part 4 of Agentic Engineering in Practice. Part 1 covered the setup and deploy loop, Part 2 the instrumentation and measurement, and Part 3 the testability. This one is the honest part: what it’s actually like to work this closely with an AI agent.
The honest part: the agent is a co-engineer with three hard deficiencies, no eyes, no sustained taste, and no memory across sessions.
No eyes
It cannot look at the screen. When a change looks wrong, a smeared scanline, an asymmetric blur, a band that reads as a hard stripe, I describe it, it proposes a root cause, and we iterate. A couple of times we measured pixels in a headless browser to quantify exactly how asymmetric a blur edge was. Eye-plus-measurement works where either alone stalls.
No sustained taste
“Soft” decisions are mine. The amber-gold ghost trail it cleverly added to the cursor halo? Removed, by me, because it competed with the aurora’s palette. The final aesthetic calls are a human hammer.
You can’t encode taste into a checklist, and you shouldn’t try. You can encode it into git history. Every rejected idea, the gold trail, the jitter experiments, the flirtations with dithering, is recorded as a commit that was tried and reverted, often with the reason attached. The next session doesn’t have to rediscover why amber is banned.
No memory across sessions
This is the part worth stealing even without an agent. The docs, docs/ts-migration-plan.md, docs/crt-aurora-animation.md, CLAUDE.md, survive the context-window reset. When a session ends, the rationale goes into a markdown file. The crt-aurora-animation.md note carries a hard-won warning that both ordered Bayer and Floyd-Steinberg dithering were tried and removed for visual artifacts, so no future session has to rediscover that.
That last point is that the git history and the docs make the collaboration durable. A decision made in May survives a June window reset because its rationale is committed next to the code.
The loop, summarized
A few weeks, roughly, from first commit to the version you’re reading on. The pattern that kept recurring:
- Instrument the thing (
FrameMeter,window.__auroraMeter). - Microbenchmark the hot path (
node --expose-gc bench.mjs). - Unit-test the pure logic (49 tests on
src/lib/). - Expose every knob as a URL param, then let numbers and eyes argue.
- Commit small; revert without ego; write down why.
The agent accelerates the iteration; the loop closes on two things it never had on its own: numbers it generated itself, and taste it can’t replicate.
If you want to poke at the controls, load any page on this site with ?perfhud=1 to watch the live frame timers, or flip back to the old scanline strategy with ?scanlines=rows and see whether your cursor disagrees with mine about the halo.
That’s the series. The theme repo, the docs, and the 600 commits in its history are all still there, and together they’re a better map of how this blog got its aurora than any single post could be.