prototype — throwaway exploration
A prototype is throwaway code that answers a question. The question decides
the shape. Cheap exploration before committing to a spec.
OWNERSHIP
Owns: the throwaway prototype code + a captured answer (commit message, ADR, or
NOTES.md next to the prototype).
Reads: CONTEXT.md, the relevant code.
Hands off to: grill / design / spec with the captured answer, if the answer
informs a real plan.
MUST NOT write plan artifacts. A prototype is pre-plan; if a plan exists, route
through spec instead.
WHEN (user-invoked)
- A design question is cheaper answered by building than by talking.
- User says "prototype", "spike", "let's try it", "build a throwaway", "explore
this design", "proof of concept", "POC".
- The state model has too many moving parts to reason about on paper.
- The UI has multiple radically different viable directions.
Skip when the design is already clear — a prototype then is wasted budget.
STEP 0 — PICK A BRANCH
Identify which question is being answered — from the user's prompt, the
surrounding code, or by asking if the user is around:
- "Does this logic / state model feel right?" -> logic branch. Build a tiny
interactive terminal app that pushes the state machine through cases that are
hard to reason about on paper.
- "What should this look like?" -> UI branch. Generate several radically
different UI variations on a single route, switchable via a URL search param and
a floating bottom bar.
The two branches produce very different artifacts — getting this wrong wastes the
whole prototype. If the question is genuinely ambiguous and the user isn't
reachable, default to whichever branch better matches the surrounding code (a
backend module -> logic; a page or component -> UI) and state the assumption at
the top of the prototype.
RULES (both branches)
- Throwaway from day one, clearly marked. Locate the prototype code close to
where it will actually be used (next to the module or page it's prototyping
for) so context is obvious — but name it so a casual reader can see it's a
prototype, not production. For throwaway UI routes, obey whatever routing
convention the project already uses; don't invent a new top-level structure.
- One command to run. Whatever the project's existing task runner supports.
The user must be able to start it without thinking.
- No persistence by default. State lives in memory. Persistence is the thing
the prototype is checking, not something it should depend on. If the question
explicitly involves a database, hit a scratch DB or a local file with a clear
"PROTOTYPE — wipe me" name.
- Skip the polish. No tests, no error handling beyond what makes the
prototype runnable, no abstractions. The point is to learn something fast and
then delete it.
- Surface the state. After every action (logic) or on every variant switch
(UI), print or render the full relevant state so the user can see what changed.
- Delete or absorb when done. When the prototype has answered its question,
either delete it or fold the validated decision into the real code — don't
leave it rotting in the repo.
WHEN DONE
The answer is the only thing worth keeping from a prototype. Capture it
somewhere durable (commit message, ADR, or a NOTES.md next to the prototype)
along with the question it was answering. If the user is around, that capture is
a quick conversation; if not, leave the placeholder so they (or you, on the next
pass) can fill in the verdict before deleting the prototype.
Handoff
If the answer informs a real objective, hand to:
grill — if the prototype revealed requirements that need sharpening.
design — if the prototype revealed a structural decision.
spec — if the prototype produced a snippet that encodes a decision (state
machine, reducer, schema, type shape) more precisely than prose. Trim to the
decision-rich parts — not a working demo, just the important bits.
BOUNDARIES
- MUST mark the prototype as throwaway from day one.
- MUST NOT add tests, error handling, or abstractions beyond runnable.
- MUST NOT persist by default (in-memory; scratch DB only if the question needs it).
- MUST capture the answer before deleting the prototype.
- MUST delete or absorb the prototype when the question is answered.
- MUST use
CONTEXT.md canonical terms in any captured answer.
1---2name: prototype3description: Build a throwaway prototype to flesh out a design — a runnable terminal app for state/business-logic questions, or several radically different UI variations toggleable from one route. Cheap exploration before committing to a spec. Use when a design question is cheaper answered by building than by talking, or when the user says "prototype", "spike", "let's try it", "build a throwaway", "explore this design", "proof of concept", "POC".4---56# prototype — throwaway exploration78A prototype is **throwaway code that answers a question**. The question decides9the shape. Cheap exploration before committing to a spec.1011## OWNERSHIP1213Owns: the throwaway prototype code + a captured answer (commit message, ADR, or14`NOTES.md` next to the prototype).15Reads: `CONTEXT.md`, the relevant code.16Hands off to: `grill` / `design` / `spec` with the captured answer, if the answer17informs a real plan.18MUST NOT write plan artifacts. A prototype is *pre*-plan; if a plan exists, route19through `spec` instead.2021## WHEN (user-invoked)2223- A design question is cheaper answered by building than by talking.24- User says "prototype", "spike", "let's try it", "build a throwaway", "explore25 this design", "proof of concept", "POC".26- The state model has too many moving parts to reason about on paper.27- The UI has multiple radically different viable directions.2829Skip when the design is already clear — a prototype then is wasted budget.3031## STEP 0 — PICK A BRANCH3233Identify which question is being answered — from the user's prompt, the34surrounding code, or by asking if the user is around:3536- **"Does this logic / state model feel right?"** -> **logic branch**. Build a tiny37 interactive terminal app that pushes the state machine through cases that are38 hard to reason about on paper.39- **"What should this look like?"** -> **UI branch**. Generate several radically40 different UI variations on a single route, switchable via a URL search param and41 a floating bottom bar.4243The two branches produce very different artifacts — getting this wrong wastes the44whole prototype. If the question is genuinely ambiguous and the user isn't45reachable, default to whichever branch better matches the surrounding code (a46backend module -> logic; a page or component -> UI) and state the assumption at47the top of the prototype.4849## RULES (both branches)50511. **Throwaway from day one, clearly marked.** Locate the prototype code close to52 where it will actually be used (next to the module or page it's prototyping53 for) so context is obvious — but name it so a casual reader can see it's a54 prototype, not production. For throwaway UI routes, obey whatever routing55 convention the project already uses; don't invent a new top-level structure.562. **One command to run.** Whatever the project's existing task runner supports.57 The user must be able to start it without thinking.583. **No persistence by default.** State lives in memory. Persistence is the thing59 the prototype is *checking*, not something it should depend on. If the question60 explicitly involves a database, hit a scratch DB or a local file with a clear61 "PROTOTYPE — wipe me" name.624. **Skip the polish.** No tests, no error handling beyond what makes the63 prototype *runnable*, no abstractions. The point is to learn something fast and64 then delete it.655. **Surface the state.** After every action (logic) or on every variant switch66 (UI), print or render the full relevant state so the user can see what changed.676. **Delete or absorb when done.** When the prototype has answered its question,68 either delete it or fold the validated decision into the real code — don't69 leave it rotting in the repo.7071## WHEN DONE7273The *answer* is the only thing worth keeping from a prototype. Capture it74somewhere durable (commit message, ADR, or a `NOTES.md` next to the prototype)75along with the question it was answering. If the user is around, that capture is76a quick conversation; if not, leave the placeholder so they (or you, on the next77pass) can fill in the verdict before deleting the prototype.7879### Handoff8081If the answer informs a real objective, hand to:82- `grill` — if the prototype revealed requirements that need sharpening.83- `design` — if the prototype revealed a structural decision.84- `spec` — if the prototype produced a snippet that encodes a decision (state85 machine, reducer, schema, type shape) more precisely than prose. Trim to the86 decision-rich parts — not a working demo, just the important bits.8788## BOUNDARIES8990- MUST mark the prototype as throwaway from day one.91- MUST NOT add tests, error handling, or abstractions beyond runnable.92- MUST NOT persist by default (in-memory; scratch DB only if the question needs it).93- MUST capture the answer before deleting the prototype.94- MUST delete or absorb the prototype when the question is answered.95- MUST use `CONTEXT.md` canonical terms in any captured answer.