Asking User Questions

SkillDev tools

Use when composing an ask_user_question round inside a workflow, or when a workflow skill names it at a question step. Shared norms for the tool — not a workflow, nothing to execute.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Asking User Questions skill

What this skill tells your AI

The instructions your AI receives, as published by jetbrains/thinkrail in packages/pi-thinkrail-workflow/skills/asking-user-questions/SKILL.md and read by ahel’s review.

The workflow family's shared norms for ask_user_question: how to compose rounds, shape options, and degrade when answers don't come. Process skills name this concept at the steps that ask; when to ask — and where the answers get recorded — stays with the referencing skill.

Rounds, not chat turns

  • One call = one round: up to 4 questions, 2–4 options each. Group everything the current step needs into a single round — never chain a second call straight after for a trivial follow-up.
  • The call ends your turn. The questionnaire is shown and your run stops; the answers arrive as the next user message (a structured "User has answered your questions:" message). Don't keep working on the blocked step after calling, and don't assume an answer until it arrives — whether that is seconds later or days later.
  • If the user replies with a free-form message instead of answering the card, that reply supersedes the round — treat it as their answer, and re-ask only what is still genuinely undecided.
  • Resolve the round, act on what you learned, and open a new round only when the answers raised a genuinely new question.

Options

  • Recommended option first, label suffixed "(Recommended)", plus a one-line recommendedReason saying why you recommend it over the alternatives (shown inline under the option as a Why: line).
  • Every option: a concise label (1–5 words, ≤ 60 chars) + a description carrying the trade-off or consequence of choosing it. Tailor options to the work at hand — never generic placeholders.
  • Options must be decidable by the asked user: frame them as observable behavior or outcomes ("collapsing a project stays collapsed after a rename"), never as implementation mechanics ("semantic guard", "activation ref"). If candidate options differ only internally — identical observable behavior — don't ask: decide yourself and record the reasoning in the workflow's artifact.
  • Never author your own "Other", free-text, or escape options — the tool adds a free-text row to every question and an always-available Skip, and reserved labels are rejected. This holds under multiSelect too: the free-text row stays and is additive — a typed answer arrives alongside the checked options, it does not replace them.
  • multiSelect: true when several answers are valid at once (feature checklists); single-select when confirming something or choosing one path.
  • options[].preview (markdown) when a concrete artifact — code, a config, a mockup — is clearer shown than described. Single-select only.
  • header is a short chip, ≤ 16 characters.

Confirming an inference

When you have inferred something and need a yes/adjust rather than an open answer: the inferred statement is the question text, with "Looks right" as the first option (description: "accurate as written") and a genuine rejection option second (e.g. "Off base — ask me directly"). Edits arrive through the tool's automatic free-text row — do not author an edit option. Read the response as:

  • "Looks right" → the inference holds; continue unchanged.
  • Free-text tweak (one fact changes) → update that field only; don't re-derive anything else.
  • Substantial rewrite → re-derive every inference that came from that statement before continuing.
  • Rejection → discard the inference entirely and ask an open-ended question instead.

Degradation

  • Skipped, declined, or unanswered questions are not blockers: proceed on best-guess assumptions, explicitly recorded as unconfirmed in the workflow's artifact (the referencing skill says where).
  • If the host reports no interactive UI (ask_user_question returns "not available"), state your assumptions the same way instead of blocking.
  • "I don't know / help me understand" is a mis-framing signal, not a missing-knowledge one: re-explain from user-visible behavior in plain language, then re-ask with behavior-framed options — don't repeat the same technical options with more detail.

Signals

GitHub stars
459
Forks
36
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
asking-user-questions
Source
github.com/jetbrains/thinkrail