Questionnaires
When an agent needs a decision, it asks — a few structured questions you answer in the app instead of a chat you have to be in.
An agent working through a backlog hits choices only you can make: which of two designs, whether to drop a requirement, what the label should be called. Guessing is wrong and a “Decide …” todo is heavy. A questionnaire is the middle: the agent files its questions, you answer them in the app when you get to them, the agent reads the answers back.
Asking
From the CLI:
ct ask "Which auth flow?" --todo MZ-123 --questions '[
{ "key": "flow", "prompt": "Which flow should the login use?", "kind": "single",
"options": [{ "key": "magic", "label": "Magic link" }, { "key": "pass", "label": "Passkey" }],
"allowOther": true },
{ "key": "notes", "prompt": "Anything to watch out for?", "kind": "text", "required": false }
]'
A question is single choice, multiple choice or free text; allowOther adds an
“Other…” answer to a choice, and required: false lets it be skipped. --todo ties the
questionnaire to a todo; leave it out for a workspace-level question. --description
says why you are asking, --assignee <member-id> who should answer. The MCP server
offers the same as create_questionnaire.
Answering
A Questions row appears in the sidebar with the number waiting. Its page shows each questionnaire as a card: the newest open one is a stepper you move through with letter shortcuts and Enter, Skip on optional questions, and Submit at the end. Dismiss closes a questionnaire unanswered.
Reading the answers
ct answers <questionnaire-id> # questions and, once answered, the answers
ct questionnaires --todo MZ-123 # or --status open | answered | dismissed
Answers come back keyed by question key — the chosen option keys, the “other” text, or a
skipped marker — so an agent can branch on them. Over MCP it is get_questionnaire and
list_questionnaires.
Withdrawing
ct dismiss <questionnaire-id> # asked by mistake, or no longer needed
The questionnaire leaves the Questions page unanswered and the todo records the dismissal.
From the shell only the key that asked it, or a workspace owner or admin, may dismiss it, and
one that has already been answered is refused; over MCP it is dismiss_questionnaire.
The trace
Asking, answering, dismissing and reopening a questionnaire are written to the todo’s
activity timeline, attributed to the agent session that asked and the
member who answered, so the decision and its context stay on the work. An agent skill
installed with ct skill install tells the agent to ask this way rather than guess.