04

Chapter four · Days 16–33 · Mar 10–27, 2026

The Build Loop

Eighteen evenings of actual construction. The rhythm that emerged - small prompts, instant previews, commit like a coward - is the difference between a project that compounds and a chat log that rots.

Prompts this chapter: 112 Git commits: 164 Walking skeleton → feature complete: 18 days Sessions burned down & restarted: 7

Week one: the ugly skeleton

The spec said it plainly: build the thinnest end-to-end version first. Days 16–19 produced a walking skeleton - add a glaze, add a firing, link them, see a list - with default styling and zero charm. It looked like a form generator had sneezed. It was also the project’s psychological turning point: by day 19 there was an app on my phone called Kilnfolk, and everything after felt like improving something real rather than conjuring something imaginary.

Build the skeleton first. Do not polish it. Its job is to prove the data model survives contact with reality, and to give you a place to stand.

The loop itself

Every evening followed the same four-beat rhythm. It looks banal written down. It is also the entire discipline of vibe coding, and skipping any beat is how projects quietly die:

Beat 1 · Re-anchor (2 min)

Paste the spec back in

Every session starts with SPEC.md and a one-line goal: “Tonight: defect tags on the results screen.” The AI has no memory. The spec is the memory.

Beat 2 · One feature, small prompt (10–30 min)

Ask for a slice, not a system

“Add a DefectTag enum and chips on FiringDetailView, using Kiln tokens” - never “build the results system.” Small prompts fail small, and small failures are cheap.

Beat 3 · Preview verdict (5 min)

Judge in the canvas, not the chat

The AI’s description of what it built is marketing. The Xcode preview is the truth. If it’s wrong, I say what’s wrong about the rendered thing, not the code.

Beat 4 · Commit the working state (1 min)

Commit like a coward

164 commits in 18 days. Every time it builds and behaves, commit. AI agents occasionally detonate a working file at 23:40; a fresh commit turns catastrophe into a shrug.

prompt-097 · a representative build prompt
 [SPEC.md pasted] Tonight: defect tagging.
  Add DefectTag as a Swift enum (pinholing, crawling, running,
  blistering, dunting) with a display name and Kiln token colour.
  On FiringDetailView, render selected tags as chips under the
  verdict section; tapping a chip in edit mode toggles it.
  Do not touch any other file. Show me the diff before writing.

⏺ Diff: 2 files, +61/−4. Preview renders correctly in light/dark.
  Note: I placed the chips above the verdict per HIG scanning order -
  flagging in case SPEC §4.3's ordering was intentional.

# It caught a spec conflict I hadn't noticed. This happens about
# once every fifteen prompts and is worth the entire subscription.

The 40-minute rule

Twice in this chapter the loop stalled: the AI and I went six, seven, eight rounds on a problem, each fix breaking something adjacent, the chat filling with apologies and increasingly baroque patches. Both times I eventually noticed the same smell - we were negotiating with a bad architecture instead of fixing it.

So the rule was born: if a single problem survives 40 minutes of iterating, stop prompting and start asking “what assumption is wrong?” In both cases the answer was structural (once a view model doing three jobs, once a SwiftData fetch in the wrong layer), and the fix was a refactor prompt, not another patch prompt. Forty minutes of flailing, twenty minutes of refactoring, problem gone. The rule saved the schedule twice.

A long chat is not persistence; it’s often two parties politely agreeing to avoid the real fix.
Ledger note · 21 Mar 2026, after the second stall

When to burn the session down

Seven times in eighteen days I closed a session mid-conversation and started a fresh one - spec pasted, one-line goal, clean slate. The trigger is always the same: context poisoning. Once a chat accumulates three or more abandoned approaches, the model keeps smelling the corpse of the old plan and hedging toward it. Fresh sessions are free. Contaminated sessions are expensive. Burn early, burn often.

SignalKeep iteratingBurn it down
Failures per prompt≤ 2, each smaller than the last≥ 3, or growing
AI toneProposes, commits, explainsHedges, lists options, asks you to choose
DiffsTouching 1–3 filesQuietly touching 8+ files
Your moodDirectingNegotiating
Elapsed on one problem< 40 min≥ 40 min → refactor question first
Practice · steal this

The four-beat loop: re-anchor (paste spec, one-line goal) → small prompt, one feature → judge the preview, not the prose → commit the working state. Add the 40-minute rule for stalls and the burn-down reflex for poisoned sessions. Run it for 18 days and you’ll have an app.