Claude Skill

asking-user-questions

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.

LLM Mart · 0 points · 10 views 27 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download JetBrains-thinkrail-packages_pi-thinkrail-workflow_skills_asking-user-questions-282f5a1.zip · 2 KB
Part of jetbrains/thinkrail — 11 skills

Install

skills CLI npx skills add https://github.com/JetBrains/thinkrail/tree/main/packages/pi-thinkrail-workflow/skills/asking-user-questions
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install jetbrains-thinkrail@llmmart
Git git clone https://github.com/JetBrains/thinkrail.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole jetbrains/thinkrail collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Asking User Questions

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: one or more questions with no fixed per-round maximum, 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 blocks the current run. The questionnaire is shown and the answers arrive as this tool's result. Don't keep working on the blocked step or assume an answer until it arrives — whether that is seconds later or days later.
  • The user answers or skips through the card. Composer messages sent while it is open queue behind the blocking tool; they neither answer nor supersede the round.
  • 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.
Files (thinkrail)
  • SKILL.md 4.1 KB
    ---
    name: asking-user-questions
    description: "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."
    ---
    
    # Asking User Questions
    
    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**: one or more questions with no fixed per-round maximum, 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 blocks the current run.** The questionnaire is shown and the answers arrive as this tool's
      result. Don't keep working on the blocked step or assume an answer until it arrives — whether that is
      seconds later or days later.
    - The user answers or skips through the card. Composer messages sent while it is open queue behind the
      blocking tool; they neither answer nor supersede the round.
    - 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.
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related