Options, tools and generators
intermediate·8 min·Markdown for agents
What this lesson teaches
When nobody has decided yet, get three real directions behind a picker; when prompting keeps missing, build the tool that makes the thing; when all you have is a vibe, build a generator.
You ask for a project card. You get one. You aren't sure it's right, so you ask for "a few more options". You get three cards that are the same card in three shades of grey.
That is not exploring. It is waiting.
Keys 1–3 or arrows switch while the demo has focus.
Three directions behind a picker
When the decision hasn't been made, the fastest way to make it is to see the answers side by side, working. The skill calls this the , from Emil Kowalski's practice.
If you have decided, skip it. A picker holding three answers to a settled question wastes the run.
Never touch production code
The variants live on a throwaway page (/proto/project-card) that nothing imports.Real materials, worst content
Your real fonts, tokens and components, filled with the content that breaks things: the longest real name, 1,284 members, the empty state. Pretty placeholders make every variant look fine.A named axis each
Density, personality, layout, motion, interaction model. Name them "Quiet", "Editorial", "Dense", never "Option A". If you can't name the axis, it's one idea in three tints.Every variant fully works
Real hover, real motion, real states. No "imagine this part".The picker is chrome
A small dark pill at the bottom, never styled like your product. Number keys switch,?v=2in the address keeps the choice.
Numbers go on sliders
Any number you would hardcode in a prototype is a decision not made yet. Duration, easing, blur, radius: put each on a slider, with a range wide enough to be wrong on both sides, and its value printed beside it.
Then the conversation changes. Instead of "a bit faster?", a teammate opens your link with ?v=2&dur=180 already in it and drags the slider themselves.
The output is a decision
The only thing that survives a prototype run is the decision, written down. Including what you rejected and why, which is the part everyone skips and the part that saves the next meeting.
Project card — decided from /proto/project-card
- Dense: density high; 13.5px name, 12px meta
- Rejected: Editorial (long names wrap to three lines); Quiet (fewer per screen)Then the winner gets built properly and the prototype page is deleted. A picker that outlives the run is exactly the dead code rule one was there to prevent.
I haven't decided how the empty inbox should look. Build three directions on a throwaway route, each on a named axis. Use our real components and the worst real content (long subject lines, 0 and 1 messages). Put any timing or size on a slider. Add the dark picker pill, keys 1–3. Then stop and let me pick. Don't choose a favourite.
When prompting keeps missing: build a tool
Some things you can describe but can't get by asking: a chart's density, a shadow that has to match a reference, a texture that feels right. Each prompt lands "close". You rewrite. It lands close again.
That loop is a slot machine. The fix is to stop pulling the lever and that makes the thing, with every judgment on a knob you turn by eye.
First, diagnose why prompting misses:
| The gap | The tool |
|---|---|
| A judgment only your eye can make (density, balance) | a dial-in tool: every taste value on a control |
| It must match something that exists | a matching tool: the target shown beside the output, at real size |
| Right pixels, wrong format | a converter |
| It can only be judged in a state that's slow to reach | a stage: a route that jumps straight to that state |
Then pitch it in four lines before any code: the gap, the tool, the controls, the export. That is the cheapest moment to be corrected.
The same move works for checking. If you keep checking one thing by hand (nested radii, the tab order), build a small inspector you can drop onto any page. A one-off check stays a checklist row.
After one round of "closer, but not quite", the diagnosis is done. Propose the tool.When all you have is a vibe: a generator
"Warm. Kind of old-timey. Hand-done." There is no target here, only a mood. Prompting for finished pictures will circle the nearest cliché forever.
The way out has two halves. Research turns the vibe into rules: what process made this look (a printing method, a tool, an era), what that process did to colour and texture, and what its recurring patterns are called. Compress that into 5 to 10 rules you can strike or keep before any code exists.
Then build a : the picture is a pure function of its settings, a click gives a new variation, every taste decision is a knob, and save writes the settings so the keeper can be made again forever.
I want card backgrounds that feel like old risograph prints. I can't describe it better than that. First research the process: what made that look, what it does to colour and texture, what the patterns are called. Give me 5–10 rules as constraints and let me edit them. Then build a seeded generator on a /lab route: click for a new seed, a knob for every taste value, save writes the JSON.
| You have | Reach for |
|---|---|
| A few nameable directions, undecided | the picker |
| A clear target the prompt keeps missing | a tool |
| Only a mood | research, then a generator |
Quick check
You've rejected two rounds of prompted variants of the same illustration idea. What does the skill say to do next?
In the skill
The nodes your agent reads when it does this work.
- Prototype behind a pickerWhen the decision hasn't been made, build three to five genuinely different versions behind a live picker — real materials, worst content, a named axis each, every uncertain number on a control — then write the decision down, promote the winner, and delete the harness.
meta/prototype-picker - Build a tool to build the thingWhen prompting for an artifact keeps landing on "closer, but not quite", stop iterating on the output and build the small tool that produces it — diagnose the gap, pitch the tool, put every judgment on a live control, save writes a file, harvest the config.
meta/build-a-tool - From vibe to generatorWhen the user has a mood, not a spec, don't prompt for finished outputs. Research the visual language until it has names, compress it into rules, then build a seeded generator — pure render(config), click to regenerate, every taste decision a knob, save writes the winning config.
meta/vibe-to-generator
Connected lessons
What this lesson builds on and leads to, across every course.