Building with an LLM
How I run an AI-assisted development cycle.
I set the architecture, make every technical and product decision, and built the
development system that three AI tools work inside. Nothing moves from one stage to the
next until I have read the actual text and said yes. It's the process a good product
team runs — written specs, recorded decisions, tests first, code review, and a check on
the real screen — defined in the repo and directed the way a tech lead directs a team.
Why a system at all: an assistant starts every session with no memory of the
last one. Left alone, that produces work that contradicts last week's decisions and
specs that describe a product you don't have. So the project is run like a team: a
registry of user stories and epics (Clearline has 24 epics and 48 stories in
specs/), a numbered record for each technical decision, and a fixed cycle
every feature goes through.
Three tools, three roles
Each tool has one job and one thing it is never allowed to do. The tool that writes the
code is not the one that judges it.
| Who |
Role |
Does |
Never |
| Me |
Architect, tech lead, product owner |
Set architecture and constraints, design the workflow and its rules, make every
engineering decision, review specs and code, test on the real screen,
merge
|
Approve a summary instead of the actual text |
| Claude Desktop |
Reviewer & planner |
Reads reports against the specs and decision records, recommends a ruling,
drafts the next prompt, runs the design work
|
Touches the repository |
| Claude Code |
Executor |
Runs the repo's commands to write specs, tests, code, commits and pull
requests; uses subagents for review, deviation audits and context
loading
|
Continues past an approval gate on its own |
| Claude Design |
Designer |
Holds the design system and draws every screen state on a design canvas
|
Invents a state no story asks for, or adds a token without approval
|
A typical exchange: Claude Code stops at a gate and reports what it did, found, and
needs decided. I paste that report into Claude Desktop, which checks it against the
records and returns one recommendation and one complete prompt. I approve, change or
reject it, and paste it back. One prompt at a time, because the first result changes
what the second should say. Prompts stay short because the procedure lives in the
repo's own commands, versioned with the code.
The feature cycle
Every feature follows the same path from idea to merged code. Each step is a command in
the repo, so the process is identical in every session.
-
Brief
What the app should do, why now, what's out of scope, what done looks like. Open
product questions are settled first.
-
Spec
/spec-feature turns the brief into an epic and user stories with
acceptance criteria, all draft. /validate-registry checks structure.
-
Approval
I read the full acceptance criteria and run /approve-epic myself. The
build command checks for approval and stops without it.
-
Design
Claude Design draws every state the stories imply.
/validate-design-export checks it against the design system.
-
Load context
/load-spec-context gathers the epic, stories, decisions and designs
once, so every session starts from the same picture.
-
Reconcile decisions
/reconcile-decisions finds every earlier decision that applies and
says whether this work follows, amends or replaces it.
-
Resolve open choices
/assess-tradeoffs lays out any real engineering choice with its
consequences. I decide; the decision is written down.
-
Build
/implement-feature works one story at a time, test first — each test
must fail for the right reason before any code exists.
/apply-design translates designs into components, listing every
state first.
-
Review functionality
I test the built functionality in a real browser against the design, state by state.
-
Code review
/review-code checks the change against the project's binding rules
and quotes any rule it breaks.
-
Deviation audit
/review-deviations compares what was built with what was specified
across the whole epic.
-
Pull request
/create-pull-request writes the description, including manual test
steps and any declared deviations.
-
Merge & close
I merge. Stories are marked implemented only if every criterion is met.
-
Explainer
/explain-implementation writes up how the feature works and what was
learned while it's fresh.
Small fixes skip most of this. Anything touching money, permissions or personal data
gets the full cycle whatever its size.
The design pipeline
One source, one copy
A design system holds tokens, icons, component guidelines and contrast
documentation. The repo holds a read-only copy, updated only by syncing from the
source and never edited by hand. Code reads only that copy.
One canvas per epic
Every state gets its own artboard: empty, loading, error, offline, light and dark.
Every visual value is a token; new tokens are approved into the system as a
separate step.
No open questions
There's no designer to leave questions for, so every product and data question is
settled before the brief is written. An open question produces invented scope.
Differences are recorded
If the app and the design differ, the difference goes in a hand-kept log. Nobody
edits a design file to make it match. After merge, approved artboards replace the
library's.
The rules that keep it trustworthy
Written in the repo's CLAUDE.md as binding constraints. Review commands
check work against them and quote the rule that was broken.
-
Approval means the exact text. Silence, enthusiasm or "sounds good" doesn't
count, and nothing is approved after work has started.
-
The repo beats memory. No tool states what a file contains without reading
it fresh.
-
The spec is the contract. If it's wrong, the assistant stops and the spec
is amended with a reason and history entry first.
-
Decisions are written down — a numbered record with options and the reason.
-
Tests come first and must prove something. Mocks stand in for outside
services, never for the code under test.
-
Deviations are declared. A partly-met criterion is marked partial with a
follow-up story; incidental findings go to an audit file, not a quiet fix.
-
A person checks the functionality before any UI pull request opens.
-
Git stays readable. One branch per epic, one concern per commit, squash
merges, no rewriting shared history, never commit on main.
-
Raise decisions, don't make them quietly — new dependencies, schema shape,
anything with a real alternative.
-
Report accurately, including on its own work and shortcuts.
When a gate or review catches a defect, the fix isn't only the code — I change the rule
and record why, so the same failure costs less next time.
What I learned
The records matter more than the model
Output quality followed the quality of the spec, the decision history and the rules
file, not how cleverly I worded a prompt.
Separate doing from judging
The session that wrote the code carries its own assumptions about what it built. A
separate session doesn't, so it checks the work against the spec and the rules
instead, and catches gaps the builder can't see.
Gates are cheap
Reviewing the acceptance criteria before the build takes minutes. Fixing a
misunderstanding after the code is written means rework.
Put the process in the repo
Commands, templates and rules are versioned and reviewed like code, so the process
improves with each change and survives every new session.
Keep the specs next to the code
Epics and user stories live in the repo as versioned files, not in a separate
tool. The assistant reads the same requirements I do in every session, a change to
a requirement goes through review like any code change, and each commit traces back
to a story.
Honest status beats clean status
A registry that says "implemented" about partial work is confidently wrong, and
every later decision inherits the error.
This works on a team too. Nothing here is specific to solo work. Stories with
acceptance criteria, decision records, pull requests with test steps, and design files
tied to tokens are what teams already use. On a team, a product manager and a designer
would share the product and design decisions, and I'd stay in the technical lead role.
Colleagues could review the assistants' output the same way they review each other's
work.