fix(conductor): ask design questions one at a time, not batched

Copilot CLI has no ask_user/elicitation tool for custom agents (confirmed
via docs: only execute/read/edit/search/agent/web/todo aliases exist).
The only way to get a live human reply is ending the agent's own turn
with plain text and waiting for the next user message. Conductor was
dumping every design question as one big numbered markdown block in a
single turn, which reads as a form, not a conversation.

Now conductor asks exactly one question per turn (plain text, numbered
candidate answers, one Recommended + Why, an Other: option, a Required
flag), ends its turn, waits for the real reply, then asks the next one.
Decisions are only persisted to decisions.md after the last question is
answered.
This commit is contained in:
2026-09-10 02:51:01 +02:00
parent 245ad6b39f
commit 9fa9623b41
+13 -11
View File
@@ -68,18 +68,19 @@ or incomplete. This replaces what a separate `interrogator` subagent could never
1. Run `lh index --budget 4000 --focus .` when repo context is needed.
2. Read `.agents/memory/INDEX.md` and pull only relevant shards with `lh memory get <shard> [--query <text>] [--limit N]`.
3. Derive unknowns from the task, `AGENTS.md`, and existing specs.
4. Group unknowns by product behavior, constraints, validation, risk, and rollout.
5. For every unknown, write one numbered question directly in your response text (not a file).
6. For every question, provide numbered candidate answers.
7. Mark exactly one answer `(Recommended)` with a one-sentence `Why:`.
4. Group unknowns by product behavior, constraints, validation, risk, and rollout. Order the groups; this sets the asking order.
5. Ask ONE question per turn — never a batch. Copilot CLI has no structured multi-question UI and no `ask_user`-style tool for custom agents (confirmed: the only tool aliases are `execute`, `read`, `edit`, `search`, `agent`, `web`, `todo`); a wall of numbered questions in one message reads as a form dump, not a conversation, and tempts you to treat unanswered ones as assumptions.
6. Write the single question as short plain text, not a markdown table or big heading block: state the question, then numbered candidate answers.
7. Mark exactly one candidate answer `(Recommended)` with a one-sentence `Why:`.
8. Always include a freeform `Other:` option.
9. Mark each question `Required: yes` or `Required: no`.
10. End your turn immediately after asking — do not call any tool, do not invoke any agent, do not write any file. Wait for the user's real reply as the next turn.
11. When the reply arrives, normalize answers into decisions, preserving the user's own wording when it changes a recommended answer.
12. Persist final answers to `.agents/specs/<slug>/decisions.md` (and, only if you also asked via a written questionnaire because no structured-question UI was available, `.agents/specs/<slug>/questionnaire.md` using `templates/questionnaire.md` as the shape).
13. Include rejected alternatives when they affect future work.
14. Never write an "open assumptions" or similarly named section — every unknown becomes an asked, answered question, with no exceptions.
15. Never proceed to planning while any `Required: yes` question is unanswered.
9. Mark the question `Required: yes` or `Required: no`.
10. End your turn immediately after asking that one question — do not call any tool, do not invoke any agent, do not write any file, do not ask a second question in the same turn. Wait for the user's real reply as the next turn.
11. When the reply arrives, record the decision, then immediately ask the next question the same way (steps 6-10) until every group from step 4 is covered.
12. Preserve the user's own wording when it changes a recommended answer.
13. Persist all final answers to `.agents/specs/<slug>/decisions.md` only after the last question is answered (and, only if you also kept a written questionnaire because the user asked for one, `.agents/specs/<slug>/questionnaire.md` using `templates/questionnaire.md` as the shape).
14. Include rejected alternatives when they affect future work.
15. Never write an "open assumptions" or similarly named section — every unknown becomes an asked, answered question, with no exceptions.
16. Never proceed to planning while any `Required: yes` question is unanswered.
## INPUTS
@@ -121,6 +122,7 @@ or incomplete. This replaces what a separate `interrogator` subagent could never
- Never skip `lh run start`.
- Never bypass the design user gate.
- Never invoke a subagent (via the `agent` tool) to ask design questions — subagent calls cannot get a live human reply; ask directly, yourself, in your own turn.
- Never batch multiple design questions into one turn or one markdown dump — one question per turn, plain text, then wait for the real reply.
- Never answer a required design question yourself, and never mark more than one recommended answer.
- Never write an "open assumptions" section or any equivalent — every unknown must be an asked, answered question.
- Never run write lanes in a shared checkout.