Lesson 14 of 32
Letting Claude Interview You
For a feature too big to describe in a paragraph, invert the direction — have Claude question you until the decisions are made, then write the spec down.
The last lesson had you asking the questions. This one turns that around, and the reason has nothing to do with cleverness. It is that you do not yet know what you want.
Not because you are careless. Because a feature of any size is a pile of decisions, and most of them stay invisible until something forces them into the open. What happens when the list is empty. Whether this is per-user or per-team. Whether the old rows get migrated or left alone. You will answer every one of these eventually. The only question is whether you answer them now, in a conversation, or in three days, after Claude has built something around a guess.
The prompt
You start deliberately small — one line about what you want — and then hand control of the conversation over.
You typed: I want to build saved searches: a user can save a set of filters and come back to them later. Interview me in detail using the AskUserQuestion tool. Ask about technical implementation, UI/UX, edge cases, concerns and tradeoffs. Don't ask obvious questions, dig into the hard parts I might not have considered. Keep interviewing until we've covered everything, then write a complete spec to SPEC.md.
Claude ran: Read src/search/filters.ts
Claude ran: Read src/db/schema.ts
WhyIt reads first. The questions are better for it — instead of asking where saved searches should live, it can ask whether they belong next to the existing user preferences table it just found.
Claude ran: AskUserQuestion: Where should a saved search be stored?
Output: 1. New saved_searches table, one row per search 2. JSON column on the existing user_preferences row 3. Client-side only, in local storageWhyThis is what the AskUserQuestion tool does: it puts a multiple-choice question to you rather than burying it in a paragraph. Read the options even when you already know your answer — they are a free summary of the decision you are making.
You typed: 1 — we'll want to share searches between users later.
Claude ran: AskUserQuestion: A saved search references a filter that no longer exists — a deleted tag, say. What should happen?
Output: 1. Drop the dead filter silently and run the rest 2. Show the search but flag it as broken and refuse to run it 3. Delete the saved search when its filter is deletedWhyHere is the whole point of the exercise. You had not thought about deleted tags. Answering it now costs you fifteen seconds; finding it in a bug report costs you an afternoon and a migration.
You typed: 2, but let them edit it — being told why it broke matters more than convenience.
Claude ran: AskUserQuestion: Should saved searches appear in the existing search UI or somewhere new?
Output: 1. A dropdown next to the search box 2. A dedicated page under /searches 3. Both — dropdown for recent, page for allYou typed: I don't know. What does the rest of this app do for lists like this?
WhyYou do not have to pick one. Typing your own answer is always allowed, including saying you are unsure and asking it to explain or recommend first. An honest 'I don't know' produces a better spec than a confident guess.
Claude replied: Every other collection in this app is a page with a table — tags, exports, API keys — and none of them have a dropdown shortcut. Option 2 is the consistent choice. I'd suggest a page now and a shortcut later if people ask for it.
You typed: Agreed, page only.
Claude ran: Write SPEC.md
Claude replied: Written. It covers the schema change, the two new routes, the broken-filter behaviour, what is out of scope, and a verification script. Start a fresh session and point it at SPEC.md to build it.
A few things in that prompt are doing real work and are worth keeping.
Naming AskUserQuestion asks for structured multiple-choice questions rather than a wall of prose you have to read and answer point by point. You answer by choosing an option, or by typing something else entirely.
Saying do not ask obvious questions is what stops the interview being a customer-service script. Without it you get asked whether you would like tests.
Saying keep interviewing until we have covered everything stops it after two questions, which is otherwise the default instinct.
And ending with write a complete spec to a file is the part that makes the whole thing worth doing.
The spec is the product
The interview is not the output. The file is.
It names things
Actual file paths, actual function and table names, actual routes. A spec that says 'add a persistence layer' is a wish. One that says 'add saved_searches to src/db/schema.ts with columns id, user_id, name, filters' can be built by someone who was not in the room.
It says what it is not
Out of scope is as valuable as in scope. 'No sharing between users, no scheduled runs, no changes to the existing filter UI' is what stops a two-file change becoming a nine-file change nobody asked for.
It ends with a check
A final step that proves the feature works end to end: a script to run, a flow to walk through, a test that must pass. Without it the spec has no finish line, and 'done' goes back to being a judgement call.
Time spent making the spec precise pays back more than the same time spent watching the implementation. Read it properly. This is the cheapest moment in the whole task to disagree with something — the file is a hundred lines and nothing has been built on top of it yet.
It also being a file, rather than a conversation, has quiet advantages. It survives your session ending. It can be committed and reviewed by a colleague. It can be handed to a second session, or three sessions working in parallel. And when the implementation drifts, you have something to compare against rather than a memory of what you agreed.
Then start again
When the spec is written, do not carry on. Start a fresh session and tell it to implement the spec.
This feels wasteful and is not. Your interview session is now full of things that did not happen: two storage designs you rejected, a UI you decided against, a tangent about migrations. Every one of those is still in the context window, competing for attention with the plan that survived. A new session begins with an empty context window, reads a hundred-line file that contains all the conclusions and none of the deliberation, and starts work.
You can reference the file directly in the new session with @SPEC.md, which
puts its contents into the conversation without waiting for Claude to go looking
for it.
Where it goes wrong
Two honest failure modes.
Using it for small things. The interview costs several minutes and a real slice of context. For a change you could describe in one sentence, that is overhead with nothing on the other side of it. This technique earns its keep in proportion to how expensive a wrong assumption would be.
Answering carelessly. The spec is built from your answers, so a shrug becomes a design decision. If you genuinely do not know, say so and ask for a recommendation, as in the transcript above. What you must not do is pick option one to move things along, because you will meet that choice again later wearing a different hat.
One more thing worth knowing: by default these questions sit and wait for you rather than timing out, so you can leave one open while you go and check something. If you would rather an unanswered question eventually close and let Claude proceed on its own judgement, there is a setting for that, and it applies only to these multiple-choice questions — permission prompts never resolve themselves.
What to take away
For anything large, the bottleneck is not Claude's ability to write the code but your ability to say what you want, and you cannot say it because half the decisions have not surfaced yet. Asking Claude to interview you with the AskUserQuestion tool drags them into the open at the point where they are cheap, and reading the options it offers is often as useful as answering them. The output is a spec on disk, and a good one names the files and interfaces involved, states plainly what is out of scope, and ends with a verification step that decides when the work is finished. Then start a fresh session to build it, so implementation gets the conclusions without the debate.
Next: sessions themselves — how to resume one, when to fork instead, and why naming them turns them into something like branches.
Check yourself
5 questions · pass 4/5 to unlock Managing Sessions
1.What problem does letting Claude interview you actually solve?
2.What is the AskUserQuestion tool?
3.Why start a fresh session to implement the spec rather than continuing the interview session?
4.Which of these most clearly makes a spec worse?
5.When is this technique the wrong choice?
5 left to answer