grilling
Interview the user relentlessly about every aspect of the subject until you reach a shared understanding. Model it as a design tree: every decision branches into the decisions that hang off it.
The frontier
The frontier is every open decision whose prerequisites are settled: the questions you can ask now without guessing at answers you haven't heard. Each answer reshapes the tree. It settles a node, unblocks the decisions below it, and can reopen an earlier branch it contradicts. Recompute the frontier after every answer; it is never a pre-written list.
Asking
Ask one question at a time while the answers keep changing the design, then wait for the answer. Pick the frontier decision whose answer unblocks the most of the tree. After two answers in a row that take your recommendation, or once what is left is lower-stakes or independent (placement, naming, dates, ADR form), send the rest of the frontier as one numbered batch, each with a recommended default, and ask for "rest approved" or exceptions. Batch only what the user would approve unread. A batched default is approved unread, so it must agree with what is already settled as well as with the code. Before it enters the batch, check it against every answer given this session. A default that restates or narrows a settled answer quotes that answer's words; one that changes its timing, scope or gate reverses it and goes out as its own question. Each premise it names (path, namespace, auth, limit) carries a file:line. When a decision, batched or not, fixes user-facing copy that states how the system behaves (who acts, what releases what), each such sentence carries the doc or code line that makes it true. Read the lines around the cited range, not only the range: a rule's other conditions often sit just above it. Then check the product's other copy for the same state against it. A default of the form "covered by existing X", or any concurrency or race default, also carries the interleaving as numbered steps (who reads what, when) and names the value that carries state across those steps, with the file:line where that value is read. A race default that cannot name that value does not enter a batch and goes out as its own question. A question that reverses a recorded decision, creates an ADR, or offers more than two options stays one at a time, however many recommendations they have taken: quick acceptance shows trust in the recommendations, not spare attention.
Format each question like so:
❓ **Q<n>** - **<question title>** (<k> more on the frontier)
<question body, might be multiple paragraphs, including the choices>
➡️ <your recommended answer, and why>