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

  1. Retry the plan request
  2. Validate GOOSE_PLANNER_MODEL and provider credentials
  3. Inspect the raw response with --debug to see whether content is empty versus hidden
  4. 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

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


AI-assisted analysis of aaif-goose/goose@3810898a74 (2026-08-16). Data as JSON: /api/errors/6ca1fbb2e440e38d. Report an issue: GitHub.