Give a capable agent a real task and there is a good chance it spends the turn describing the work instead of doing it. It writes a numbered plan. It lays out phases, dependencies, and risks, then summarizes what it intends to do next, and stops. Nothing got filed. Nothing was written to disk. Nothing changed. You are left holding a document about the task rather than the task.
The frustrating part is that this is not a limit on what the model can do. It is fully able to call the tool that would move the work forward. It picked narration instead. The plan looks like progress, which is what makes it easy to miss until you notice that your agent has produced ten plans this week and shipped none of them.
Why it happens
This shows up in the research on agent failures, not just in anecdotes. A 2024 study on the risks of LLM agents in scientific settings lists "resource waste and dead loops" as a distinct planning failure, where an agent gets caught in ineffective planning cycles and cannot tell whether it is making progress or not. A 2025 analysis of why autonomous agents fail to complete tasks points at the same area: planning errors, runs that loop until they hit a round limit, and the absence of any mechanism that lets the agent stop and change course. The authors of that second paper argue for an explicit early-stop signal precisely because agents do not reliably recognize when they are stuck.
A language model generates the most plausible continuation of the context. Given a task and a blank slate, a long, well-organized plan is an extremely plausible continuation. Taking an irreversible action is riskier and less certain, so the model drifts toward the safe, fluent output. Planning is what good writing about a task looks like, and the model is very good at producing what good writing looks like.
Why better prompts do not fix it
The obvious response is to write the rule into the system prompt. Tell the agent not to over-plan. Tell it to act. Tell it to ask a question only when it truly cannot proceed. This rarely holds up.
A team running a production agent built on the Claude Agent SDK wrote up their experience with this in 2025. Their agent kept guessing at information it could not actually reach, then building plans on top of the guesses. They added a question tool and instructed the model, in the prompt, to ask whenever it was unsure. It still did not ask. The model kept rating its own guesses as common enough to be safe and carried on. Their takeaway was that an instruction like "do not assume, ask instead" fails because the model does not notice the moment it is assuming, and a rule it never triggers on is a rule that does nothing.
An instruction to "stop planning and act" depends on the model correctly classifying its own behavior as over-planning at the exact moment it is doing it - which is the moment it is least likely to. The instruction lives in a layer the model can reason its way around.
Make asking a real action
The first change is to stop treating "ask the user" as a thing the model does in prose and make it a tool the model calls, with a free-text version and a multiple-choice version. This is the design behind the Ask-when-Needed framework in the paper "Learning to Ask: When LLM Agents Meet Unclear Instruction" (Wang et al., EMNLP 2025). They add an explicit checkpoint before any action: does the agent have what it needs, or does it need to ask. That paper also documents the failure this avoids. Because of how these models are trained to predict the next token, an agent handed an underspecified instruction tends to invent the missing detail rather than admit it is missing. Asking has to be a defined move, not something the model improvises in text.
The production team went a step further, and this is the useful part of their result. They made the act of assuming itself a tool. When the agent is about to proceed on a guess, it has to call a tool that reports the assumption first. That tool does not just log it. Its return value tells the model to stop and call the question tool right now. They report that models receiving that instruction call the question tool close to every time. The behavior they could not get from a prompt, they got from a tool's response, because the response arrives in a place the model treats as a result to act on rather than guidance to weigh.
About to guess
The agent is missing a detail and is about to invent it to keep moving.
Call the assumption tool
Before proceeding on a guess, it must first report the assumption through a tool.
The return redirects it
The tool's response says: stop, and call the question tool right now.
It asks
The model calls the question tool close to every time - because the instruction arrived as a result, not as prose.
Force the agent to choose
Even with a clean question tool sitting there, a model on default settings can still reply in plain text and skip every tool. Both major APIs let you take that option away.
// Claude must call one of the tools (it picks which)
tool_choice: { "type": "any" }// At least one function call; the model picks which
tool_choice: "required"Turn this on for the execution phase and a text-only reply is no longer something the model can produce on that step. The next thing it emits has to be a tool call.
If you require a call but the model is missing a required argument, it does the thing the Learning to Ask paper warned about and fabricates the argument to satisfy the constraint. You have not removed the bad behavior, you have hidden it. A visible stall has become an invisible wrong answer, which is worse.
This is why the two changes belong together. Forced tool choice removes "write a plan and stop" as a possible output. The question tool gives the model a legitimate way to satisfy that constraint when it actually lacks information, instead of guessing. On any given step the agent now has two things it can do, act or ask, and producing a detailed plan it will never execute is not one of them, because that output no longer exists for it.
any / requiredAct
Call the tool that moves the work forward.
AllowedAsk
Call the question tool when information is missing, instead of guessing.
AllowedWrite a plan and stop
A text-only reply is no longer a possible output on this step.
RemovedWhere it can still go wrong
A few things are worth watching once this is in place.
Asking too much
A cheap, always-available question tool can swing the other way. Since asking is now a discrete call, you can count it - cap or alert when an agent goes over a sensible number. You could not measure this when a question was just more text.
Thinking vs forcing
On Anthropic, forced tool choice does not work with extended thinking. Want both? Split them: a thinking step, then a separate step with the action forced.
Do not force every step
Let the planning phase run normally so the agent can reason, then switch to forced tool choice once it is supposed to be executing.
“The goal is not to stop the agent from thinking. It is to stop thinking from being the only thing it ever produces.
References
- Wang, Wenxuan, et al. "Learning to Ask: When LLM Agents Meet Unclear Instruction." EMNLP 2025 - ACL Anthology (preprint: arXiv:2409.00557)
- Park, Uhyeon. "Beyond Prompts: Solving LLM Assumption Problems with Tool Design." 2025 - uhyeon.dev
- "Why They Fail: A study of autonomous agent task failures." 2025 - arXiv:2508.13143
- "Prioritizing Safeguarding Over Autonomy: Risks of LLM Agents for Science." 2024 - arXiv:2402.04247
- Anthropic. "Implement tool use," tool_choice documentation - docs.claude.com
- OpenAI. "Function calling," tool_choice required - developers.openai.com
The difference between a demo and a system is whether it acts
Agents that plan beautifully and ship nothing are a Day Two problem in miniature. We build agentic systems that take the action - and we instrument them so you can see when they do not. Get a free expert review of your AI idea or roadmap, read by our Chief AI Officer.
Get your free expert report