Some decisions stall because the knowledge sits with someone else. A meeting costs everyone an hour; "thoughts?" gets a vague reply. A structured questionnaire costs the recipient fifteen minutes and returns comparable, recordable answers.
The agent interviews the sender only about the send (who, what they need back, by when, what happens on silence), never the subject they cannot answer. It writes neutral, one-idea questions with answer formats, gates the draft, and consolidates replies into a decision record.
What most shapes the questionnaire is the gap between what the recipient knows and what the sender needs. Settle the inputs below before producing anything. When one is missing or vague and would change the result, ask about it; when it wouldn't, use a sensible default and say which one you used.
Ask about the two or three inputs that matter most for this request, not the whole list. If the user wants a result straight away, produce it and state your assumptions at the top.
# Gate a draft before sending (exit 1 = not ready)
python3 project-management/execution/decision-questionnaire/scripts/questionnaire_linter.py \
--input project-management/execution/decision-questionnaire/assets/sample_questionnaire_flawed.json \
--today 2026-11-08
# Consolidate replies into a decision-record draft (exit 1 = critical question still blocked)
python3 project-management/execution/decision-questionnaire/scripts/answer_consolidator.py \
--input project-management/execution/decision-questionnaire/assets/sample_questionnaire_clean.json \
--answers project-management/execution/decision-questionnaire/assets/sample_answers_conflict.json \
--today 2026-11-19 --format json
| Tool | Reads | Reports |
|---|---|---|
questionnaire_linter.py | Questionnaire JSON | Missing header fields, past deadline, leading/vague/compound wording, missing formats, units or choices, options without trade-offs, size over budget |
answer_consolidator.py | Questionnaire + responses | Answers per question, "don't know", conflicts, missing respondents, outcome ready-to-record / needs-follow-up / default-applied |
| Code | Linter | Consolidator |
|---|---|---|
| 0 | Ready to send (warnings allowed) | Ready to record, or default applied |
| 1 | At least one error finding | A critical question is unanswered before the deadline or in conflict |
| 2 | Missing file, invalid JSON, bad date | Same |
questionnaire_linter.py; it must pass with zero errors before sending. Then read it once as the recipient and check the hand-review checklist in references/question-design.md (hidden premises, loaded descriptors).answer_consolidator.py, settle critical conflicts, fill assets/decision_record_template.md, and send it to every recipient.python3 project-management/execution/decision-questionnaire/scripts/answer_consolidator.py \
--input project-management/execution/decision-questionnaire/assets/sample_questionnaire_clean.json \
--answers project-management/execution/decision-questionnaire/assets/sample_answers.json --today 2026-11-19
Mistake: "Don't you think Frankfurt is the safest choice?"
Why it happens: The sender has a lean and wants it confirmed.
Instead: State the lean once in the options table, labelled, then ask "Which option would you approve?"
Mistake: A link to a design doc and "Thoughts?"
Why it happens: Writing questions forces the sender to work out what they need.
Instead: Turn each unknown into a formatted question; keep one open question, at the end.
Mistake: A deadline with no stated consequence, so the decision waits indefinitely.
Why it happens: Stating a default feels presumptuous.
Instead: Write the action you will take on silence; anyone who dislikes it now has a reason to reply.
Mistake: Twenty-five questions, half of them nice-to-know.
Why it happens: Every stakeholder adds "while we're asking…".
Instead: Hold to about ten questions and fifteen minutes; defer the rest.
Mistake: Two respondents disagree and the record reports only the majority view.
Why it happens: A clean record looks more decisive.
Instead: Record each conflict and how it was settled; hidden disagreements reopen decisions.
| File | Purpose |
|---|---|
scripts/questionnaire_linter.py | Pre-send gate |
scripts/answer_consolidator.py | Replies to decision-record draft |
assets/questionnaire_template.md, assets/decision_record_template.md | Templates |
assets/sample_questionnaire_clean.json / _flawed.json | Linter exits 0 / 1 |
assets/sample_answers.json / sample_answers_conflict.json | Consolidator exits 0 / 1 |
In Scope: async questionnaires for blocked decisions, multi-recipient variants, pre-send linting, consolidating answers into a decision record.
Out of Scope:
project-management/execution/daci-framework/)project-management/discovery/customer-interview-script/)project-management/execution/stakeholder-map/)Important Caveats: