Rohan Kartik All build notes

#AI collaboration #process #engineering patterns

The agent designs. The script ships.

The about-page bundle was produced across two distinct activities. In the conversation, Claude and I went back and forth on what the page should be. The cursor cross-fade idea, the choice of ten frames, the white card framing, the aurora behind it, the hint text, the prefers-reduced-motion fallback. All of that came out of dialogue, prototypes, and choices. The agent helped me think.

Then there’s the ship script. ship.sh has zero design judgement. It copies files. It runs regex substitutions with exact expected matches. It runs npm build. It commits and pushes. If the input bundle is wrong, it fails. If anything ambiguous appears, it exits with a message and stops. The script is a piece of plumbing, written once, deterministic forever.

The separation is the point. The agent operates at the level where ambiguity is useful: should the photo float or sit in a card, should the noise be 14% or 8%, should the hint say “Move cursor” or “Try moving.” Those are decisions where I want a thinking partner. The script operates at the level where ambiguity is dangerous: it should write the exact bytes I told it to write, in the exact order, and stop if anything looks wrong.

When I conflated the two in early versions, things broke. An early ship script tried to do the nav patch with fuzzy heuristics that “felt right,” and it patched the wrong file because it was being clever. The fix was to make the script dumber: try exactly these two patterns, and if neither matches, refuse to guess.

What I get out of this split is repeatability. The agent can change its mind about the design fifteen times. The script doesn’t care. As long as the agent finalises the bundle into a known shape, the script runs and produces the same result every time.

The principle: keep judgement at one end of the pipeline and mechanics at the other. Don’t let them leak into each other.