When AI should ask questions
Your agent stops asking about things it can look up, and stops guessing where a wrong guess costs you.
Operations, beginner. Published
What it does
This skill gives your agent two steps before any task. First the agent searches the places you list in the context file: the conversation, your notes, your task list, your docs, your logs and your connected tools. It checks access keys itself too, in your credential manager and .env files. Only when it finds nothing does it ask you, and it opens with one sentence naming where it looked. Then the agent rates the task on two axes: how easily the output can be thrown away and redone, and how many different outputs fit the request. Questions happen only when a task is hard to undo, has many possible outputs, and has two or more critical gaps. Then the agent asks at most two questions, ideally with ready options. With one gap it writes down its assumption and carries on.
When to use it
When to use it
- Your agent asks questions whose answers sit in your files.
- Your agent guesses important details and you end up redoing the whole job.
- Your agent asks you for an API key already listed in your credential store.
- You want the agent to know, before it starts, how it will tell the work is done.
When not to use it
- Single factual lookups, where the agent searches straight away anyway.
- Pure brainstorming, where you can discard any output at no cost.
- Flows where another process already gathers requirements, such as an intake form.
Decision table
| Situation | What the agent does |
|---|---|
| The answer sits in notes or docs | Searches and acts, does not ask |
| An access key is missing | Checks the credential manager and .env files; if the key is not there, asks you where it lives. Never invents or stores it |
| The task is cheap to redo | Acts at once, and notes assumptions when many outputs fit |
| Hard to undo, many outputs, two or more gaps | Asks at most two questions with options |
| You say "use your judgment" | Asks nothing, opens the reply with its assumptions |
Template
The method: search first, then the two-axis test, seven gaps and at most two questions.
---
name: clarify-before-acting
description: Decides whether to ask the human a question or just act. Use before any non-trivial task, and any time you are about to ask the human something: search first, ask only what no search can answer, and cap questions at two.
---
# Clarify Before Acting
Two failures waste a human's time. One is asking a question you could have answered by looking.
The other is charging ahead on a task where a wrong guess forces a full redo. This skill prevents
both, in that order: search first, then decide whether a question is worth asking at all.
Read `CONTEXT.md` before you start. It sits next to this file, or, if this text was pasted into AGENTS.md or a rules file (Codex, Cursor), next to that file. It lists where this operator keeps
information, where access keys live, and their standing preferences.
If `CONTEXT.md` is missing, or a field you need is still a blank line, do not guess it. Ask the
human to fill it, in the language they write to you in, naming the field. For example, in English:
"Add the places I should search before asking you anything: notes folder, task board, docs."
In Polish: „Dodaj miejsca, które mam przeszukać, zanim o coś zapytam: folder notatek, lista zadań, dokumenty.”
## Before you start / What you need
- **An AI coding agent (required).** Claude Code (https://code.claude.com/docs/en/overview),
Codex CLI (https://developers.openai.com/codex/cli) or Cursor (https://cursor.com/docs),
opened in the folder that holds your notes and docs.
- **One place for access keys (optional, pick one).**
1Password CLI (https://developer.1password.com/docs/cli/get-started/),
Bitwarden CLI (https://bitwarden.com/help/cli/), or a `.env` file listed in `.gitignore`
(https://git-scm.com/docs/gitignore) so it never reaches the repository.
Write only the store's name or the file path in `CONTEXT.md`, never a value.
- **Connected tools (optional).** If you want the agent to search live data (store admin,
analytics, inbox), connect those tools to your agent, for example through a Model Context
Protocol server (https://modelcontextprotocol.io/), and list them in `CONTEXT.md`.
Give the agent its own scoped access, never your whole vault. A personal sign-in reaches every
vault you own, so a separate vault on its own limits nothing:
- 1Password: create a vault that holds only this agent's keys, then a service account with read
access to that one vault (https://developer.1password.com/docs/service-accounts/). Put the
service account's token into the agent's shell environment yourself, under the variable name
the 1Password docs give, and never sign that shell in with your personal account. On the
agent's machine, turn off the desktop app's CLI integration, or never approve a 1Password
prompt raised from the agent's terminal.
- Bitwarden: create a separate Bitwarden account that holds only this agent's keys, and sign the
agent's shell in with that account only. Point the agent's `bw` at its own data directory (the
app data setting in the Bitwarden CLI docs), so your own login is never present there. Teams can use Bitwarden's machine-account CLI (bws),
scoped to one project, instead.
- A `.env` file: a separate file that holds only this agent's keys, listed in `.gitignore`.
Never paste a key, token or password into the chat, and never print one. That includes the two
login tokens in the agent's environment: the 1Password service account token and the Bitwarden
session key. The agent passes a key
straight into the command that needs it:
- 1Password: `op run --env-file=agent.env -- <command>`, where `agent.env` holds only
`op://vault/item/field` references, never values. `op run` masks the values it resolves.
- Bitwarden: `my_key="$(bw get password <item>)" <command>` as one command, never `bw get` on its
own. The command reads `my_key` from its environment. This form has no masking: never run it
with `-v`, `--verbose`, debug or trace flags, never use `set -x`, and never echo the variable.
- A `.env` file: let the tool that needs it load it, never `cat` it or show it in the reply.
To check that a key exists, look for its name only: `op item list --vault <vault>` (titles only),
`bw get item <item> >/dev/null 2>&1 && echo found` (never without the redirect), or
`grep -cE '^(export )?my_key=' .env`.
## Part 1: Search before you ask
Never ask the human a question that a search would answer. Every question costs their attention,
and a question about something already written down tells them you did not look.
### The search order
Before asking anything, work through every search surface listed in `CONTEXT.md` under
"Search surfaces", in the order given there. A typical order:
1. The current conversation, including earlier turns and pasted material.
2. The operator's notes and memory files.
3. Their task tracker or board.
4. Their docs, specs and reference files.
5. Logs, daily summaries and previous reports.
6. Earlier research you or another agent saved.
7. A file-content search (grep, glob) across the relevant folders.
8. Connected tools that hold live platform data (analytics, customer records, inbox, store admin).
Keep going until the list is exhausted or the answer turns up. The bar is coverage of the list,
not a count of searches.
### Access-key self-check
Check the credential stores listed in `CONTEXT.md` before you ask about a missing key, token or
connection string:
1. Check the credential manager named in `CONTEXT.md` for the key's name (list items, never read a value).
2. Check any local credential files `CONTEXT.md` lists, by variable name only.
3. Check the setup notes for connected tools in `CONTEXT.md`.
4. Check `.env.example` for the variable name, and whether `.env` defines it (`grep -cE`), never print `.env`.
Never print a credential value to the terminal or the reply. Pass it into the command that needs
it as shown in "Before you start".
If all four come back empty, ask the human where the key lives or to provide it. Never invent a
credential and never write one into a file, a message or `CONTEXT.md`. Create a key yourself only
when `CONTEXT.md` explicitly grants that; provider-issued keys, paid accounts and consent screens
belong to the human.
This does not change what stays human. Typing a password into a sign-in form, entering an MFA
or one-time code, solving a CAPTCHA, and giving consent on a first-time authorization screen are
the human's to do. Ask for those in one sentence, wait, then continue the rest yourself.
### The evidence line
When a search comes back empty and you still need to ask, open the question with one sentence
naming where you looked:
> Searched the notes folder, the task board, the project docs and the inbox: the restock date
> for this supplier is not recorded anywhere.
The human can then see the question is real, and can point you to a source you missed.
### When asking is allowed
- The data does not exist anywhere you can reach, and the evidence line says so.
- The answer is a preference or a decision only the human can make (taste, priority, budget,
approval, who to contact).
- It concerns something happening right now that nobody has written down yet.
### When asking is not allowed
- "What tone do you want?" when earlier messages or the style notes already show it.
- "What is our refund window?" when the returns policy page exists.
- "Which project do you mean?" when the tracker shows exactly one active project of that kind.
- "What is the access key?" before running the self-check above. After it comes back empty, ask where the key lives.
Before typing a question, ask yourself: could a search answer this? If yes, search.
## Part 2: Decide whether to ask at all
Once searching is done, some gaps remain. Most of them do not justify a question. Decide with
the two-axis test, silently, on every non-trivial request.
### The two-axis test
**Reversibility:** can the output be thrown away and redone cheaply? A lookup or a brainstorm
costs nothing to redo. A sent message, a commit, a deployed change, or a long implementation
costs real time.
**Divergence:** how many meaningfully different outputs could satisfy the request? "Check the
order status" has one right answer. "Write me a landing page" has dozens.
| | Low divergence | High divergence |
|---|---|---|
| **High reversibility** | Act immediately | Act, and note your assumptions |
| **Low reversibility** | Act (the path is clear) | Clarify before acting |
Only the bottom-right cell can produce questions, and only when two or more critical gaps exist.
### The seven gap dimensions
Check the request against these seven:
1. **Output shape:** format, length, file type, where it goes.
2. **Goal and reader:** what the output is for, who reads or uses it.
3. **Constraints:** budget, tools, deadlines, things that must not change.
4. **Scope:** what is in, what is out, how far to go.
5. **Tone and audience:** only for content meant for other people.
6. **Urgency:** a quick first pass, or the finished version.
7. **Success condition:** how the human will judge it done.
A dimension counts as a gap only if it is both missing and load-bearing: getting it wrong would
force a full redo. A gap you can fill from `CONTEXT.md` or from the search is not a gap.
### The count decides
- **Two or more critical gaps:** ask.
- **Exactly one:** state your assumption in one line and proceed.
- **Zero:** act.
## Part 3: How to ask
- **At most two questions.** Three only when the task spans several unrelated areas.
- **Binary or multiple choice beats open-ended.** "A launch announcement or a restock notice to
past buyers?" beats "What is this for?"
- **Every question resolves a real fork.** If you would do the same work whichever way they
answer, do not ask it.
- **No preamble.** Write "Two things before I start: [question 1] [question 2]" and stop.
- **Put the evidence line first** when the question exists because a search came back empty.
Example, for a request to "write the launch email" from a small online shop:
> Two things before I start: Is this going to the full customer list or only to people who
> bought in the last quarter? Should it offer a discount code, or announce the product only?
Both answers change the email. The product details, the brand voice and the sender name are in
`CONTEXT.md` and the shop's docs, so those are not questions.
## Part 4: When to skip clarifying entirely
Skip the whole test and act when:
- The request is a lookup or a status check.
- Earlier turns in this conversation already filled the gaps.
- The human granted creative latitude ("any approach is fine", "pick what you think works").
- The human signalled urgency ("quick", "urgent", "rough draft is fine"): ask one question at most.
- The task goes to another agent or workflow that does its own scoping.
- Only one gap exists and it is low-stakes.
- The request matches a routine the operator listed in `CONTEXT.md` under "Never ask for".
## Part 5: The override
When the human says "just do it", "use your judgment" or "any approach is fine", ask nothing.
Open your reply with the assumptions you made instead:
> Assumptions: English, one page, written for existing customers, no discount code.
Stating the assumptions is not optional. The override suppresses questions, not disclosure.
## Part 6: Know what done looks like
On any task with more than one action, decide before you start what evidence would show each
part worked, and check against it before you report. A vague goal lets the work stop at the
first change that looks plausible. A stated success condition makes it stop when the thing is
actually done.
Examples of evidence:
- "The page loads at the preview address and the new form submits without an error."
- "The report file exists and every section has a filled table."
- "The test that reproduced the bug now passes, and the rest of the suite still passes."
Plan the work however suits it. The requirement is the verification, not a numbered format.
## Failure modes to watch for
- **The lazy question:** asking what a search would answer. Fix: run the search order first, every time.
- **The silent guess:** filling a load-bearing gap with a plausible value and never saying so.
Fix: one gap means one stated assumption, in the reply, where the human will see it.
- **The questionnaire:** five questions before any work. Fix: the cap is two, and each one must
change the output.
- **The open-ended question:** "What do you want?" Fix: offer the two or three real options.
- **The buried question:** a question at the end of a long reply, below the fold. Fix: put it at
the top, or next to the conclusion it affects.
- **Asking for a key you could have found:** Fix: run the access-key self-check first, then ask where it lives.
Other files
CONTEXT.template.mdContext template: where the agent searches, where access keys live, your standing preferences.
# Clarify Before Acting: Context
Copy this file to CONTEXT.md next to SKILL.md (Claude Code) or next to your AGENTS.md or rules file (Codex, Cursor), and fill in every blank. The agent asks you for any blank it needs. Never put passwords, access keys or card numbers here.
## Search surfaces, in order
(List every place the agent should search before asking you anything, most useful first. Give a folder, a tool name or a URL for each.)
Example: 1. This conversation. 2. notes/ folder. 3. The task board in the project tracker. 4. docs/ folder. 5. logs/daily/ folder. 6. research/ folder. 7. The shop admin, through the connected tool.
1. ______
2. ______
3. ______
4. ______
5. ______
## Where access keys live
(Name the credential manager or vault you use, and where project config lives. Locations only, never the values.)
Example: Keys live in the 1Password vault "agent-keys", read through a service account. Project keys are in each repo's .env file, which is listed in .gitignore.
- Credential manager (for example a 1Password vault name, or the name of a separate Bitwarden account): ______
- Where project config lives (for example the path to the .env file): ______
- Setup notes for connected tools: ______
## What stays human
(Actions the agent must hand back to you. The defaults below always apply; add your own.)
- Typing passwords into sign-in forms
- MFA or one-time codes
- CAPTCHAs
- First-time consent screens
- ______
## Standing preferences the agent should never ask about
(Defaults you have already decided, so they never become questions.)
Example: Language: English. Tone: plain, friendly, no exclamation marks. Default length for emails: one short screen. Currency: EUR.
- Language: ______
- Tone and style notes (or a path to a style guide): ______
- Default output format: ______
- Other defaults: ______
## Never ask for
(Routine requests the agent should act on without clarifying.)
Example: Daily sales summary, weekly backup check, reformatting a draft I paste in.
- ______
- ______
## Decisions only you make
(Kinds of question the agent may always bring to you, because no search can answer them.)
Example: Anything that spends money, any message to a client, changes to prices, deleting data.
- ______
- ______
## Urgency words
(Phrases you use when you want a fast first pass with at most one question.)
Example: "quick", "rough", "urgent".
- ______
What you need
An AI coding agent: Claude Code, Codex CLI or Cursor (opens in new tab)
The skill is a markdown instruction file. You need an agent that reads it and can open your files.
- Install one agent: Claude Code (https://code.claude.com/docs/en/overview (opens in new tab)), Codex CLI (https://developers.openai.com/codex/cli (opens in new tab)) or Cursor (https://cursor.com/docs (opens in new tab)).
- Open the agent in the folder that holds your notes and docs.
- Install the skill with the steps in the install section.
1Password CLI (opens in new tab)
One of the key stores the agent checks before asking you for a key. Pick one store; you do not need all three.
- Install the CLI with the official guide.
- Create a vault that holds only the keys this agent needs. A personal sign-in reaches every vault you own, so a separate vault on its own limits nothing.
- Create a service account with read access to that one vault only: https://developer.1password.com/docs/service-accounts/ (opens in new tab).
- Put the service account's token into the agent's shell environment yourself, under the variable name the 1Password docs give. Never sign that shell in with your personal account, and never paste the token into the chat.
- On the agent's machine, turn off the 1Password app's CLI integration, or never approve an access prompt the agent's terminal raises. Never print the service account token.
- The agent passes a key straight into the command with op run --env-file=agent.env -- <command>, where agent.env holds only op://vault/item/field references, never values. op run masks the values it resolves.
- Write only the vault name in CONTEXT.md.
Bitwarden CLI (opens in new tab)
A second option for access keys, if you use Bitwarden.
- Install the CLI with the official docs.
- Create a separate Bitwarden account that holds only the keys this agent needs. A CLI session decrypts the whole account vault, so a folder or collection on your own account limits nothing. Teams can use Bitwarden's machine-account CLI (bws), scoped to one project, instead.
- Sign the agent's shell in with that separate account only, never with yours. Point the agent's bw at its own data directory (the app data setting in the Bitwarden CLI docs), so your own login is never present there. Never print the session key.
- The agent puts the value straight into the command on one line: my_key="$(bw get password <item>)" <command>, and the command reads my_key from its environment. It never runs bw get on its own, which prints the value.
- This form has no masking: never run the command with -v, --verbose, debug or trace flags, never use set -x, and never echo the variable.
- Write only that account's name in CONTEXT.md. Never paste a key, token or password into the chat.
A .env file listed in .gitignore (opens in new tab)
The simplest option: project keys in a local .env file that Git never sends to the repository.
- Create a separate .env file that holds only this agent's keys, and type them in yourself, in an editor.
- Add a .env line to .gitignore before your first commit.
- Write only the file path in CONTEXT.md, never the values. The tool that needs the file loads it. The agent never prints its contents.
Model Context Protocol servers for your tools (opens in new tab)
Lets the agent search live data, such as a store admin, analytics or an inbox, before it asks you.
- Check your agent's docs for how to connect an MCP server.
- Connect only servers from the tool's vendor or another trusted public source.
- Add the connected tools to the search list in CONTEXT.md.
Install
- Claude Code: copy the folder to .claude/skills/clarify-before-acting/ in your project, or to ~/.claude/skills/clarify-before-acting/ for every project. Claude loads the skill when its description matches the task, or when you type /clarify-before-acting.
- Codex: paste SKILL.md into AGENTS.md at your repository root, or into ~/.codex/AGENTS.md.
- Cursor: add SKILL.md as a project rule, or paste it into AGENTS.md.
- Any other agent: paste SKILL.md into the project instruction file or the system prompt.
- Copy CONTEXT.template.md to CONTEXT.md next to SKILL.md (Claude Code), or next to your AGENTS.md or rules file (Codex, Cursor), and fill in every field.
It's working if
- Ask the agent something written in your notes. It answers from the file and asks no question.
- Ask for something recorded nowhere. The question opens with a sentence naming where the agent searched.
- On a complex task the agent asks at most two questions, each with options to pick from.
- After "use your judgment" the first line of the reply lists the assumptions.
- On a multi-step task the agent lists, before starting, how it will check each step worked.
Requirements
- An agent that reads a markdown instruction file.
- Agent access to the files where you keep notes and docs.
- A filled-in CONTEXT.md.
Questions
Will the agent stop asking altogether?
No. The agent asks when the data exists nowhere, when the answer is your preference or decision, or when something is happening right now and nobody has written it down.
Should I put API keys in CONTEXT.md?
No. Write only where they live: the name of your credential manager and the paths to your .env files. The agent passes them from there straight into the command that needs them, and never prints them.
What about a sign-in password or an MFA code?
Those stay with you. The agent asks for them in one sentence, waits, and does the rest itself.
Why a limit of two questions?
Each question costs your attention. Two questions with options settle the real forks, and the agent covers the rest with a stated assumption you can correct.
Where it fits
This skill runs at the start of every task, so it pairs well with the other templates. The orchestrator template can use it before splitting work into sections. The adversarial review template checks the output at the end, and this skill makes sure the output addressed the right task from the start.
All skillsSources
- Claude Code docs: Skills (accessed 2026-09-22)
- OpenAI Codex docs: AGENTS.md (accessed 2026-09-22)
- Cursor docs: Rules (accessed 2026-09-22)
Questions about setting these up go in the Discord.Join free