aaif-goose/goose · error
Planner returned no user-visible content
Error message
Planner returned no user-visible content
What it means
After the planner reply arrives, goose renders user_visible_content() and then asserts the content is non-empty before classifying the response. A planner reply whose user-visible content is empty (no content at all, or all of it hidden) trips this ensure. The render happens before the check, and the classifier error surfaces after rendering.
Source
Thrown at crates/goose-cli/src/session/mod.rs:1337
let plan_prompt = self.agent.get_plan_prompt(&self.session_id).await?;
let provider_messages = planner_provider_messages(&plan_messages);
output::show_thinking();
let (plan_response, _usage) = goose::session_context::with_session_id(
Some(self.session_id.clone()),
reasoner.complete(
&model_config,
&plan_prompt,
provider_messages.messages(),
&[],
),
)
.await?;
let classifier_text = planner_classification_text(&plan_response);
let plan_response = plan_response.user_visible_content();
output::render_message(&plan_response, self.debug);
output::hide_thinking();
let classifier_text = classifier_text?;
anyhow::ensure!(
!plan_response.content.is_empty(),
"Planner returned no user-visible content"
);
let planner_response_type = classify_planner_response(
&self.session_id,
classifier_text,
self.agent.provider().await?,
self.agent
.model_config_for_session(&self.session_id)
.await?,
)
.await?;
match planner_response_type {
PlannerResponseType::Plan => {
println!();
let should_act = match cliclack::confirm(
"Do you want to clear message history & act on this plan?",View on GitHub (pinned to 3810898a74)
Solutions
- Retry the plan request
- Validate GOOSE_PLANNER_MODEL and provider credentials
- Inspect the raw response with --debug to see whether content is empty versus hidden
- Switch to a planner model known to return text
Defensive patterns
Strategy: retry
Try / catch
match plan_flow().await {
Err(e) if e.to_string().contains("no user-visible content") => {
plan_flow().await // empty planner output is usually transient
}
other => other,
} Prevention
- Use a planner model that reliably returns text content
- Retry plan requests once on empty-output errors before surfacing them
- Keep --debug output available when diagnosing planner replies
When it happens
Trigger: Plan-mode requests where the planner model returns an empty completion or a response whose content is entirely user-invisible (e.g. reasoning-only or filtered output).
Common situations: Same class as the agent-visible variant: misconfigured planner model, provider returning empty content, or aggressive response filtering.
Related errors
- Planner returned no agent-visible text to classify
- Job name must start with a letter or number and contain only
- --model must be in provider/model form, e.g. anthropic/claud
- --trials must be at least 1
- --concurrency must be at least 1
AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16).
Data as JSON: /api/errors/6ca1fbb2e440e38d.
Report an issue: GitHub.