Skip to main content
Plan-and-Solve sintetiza um plano estruturado antes do orquestrador começar a despachar. ReWOO (Reasoning Without Observation) estende: o plano usa placeholders #E1, #E2 que são resolvidos em runtime com os outputs dos passos anteriores. Combinados, evitam o padrão caro de “despachar um agente, esperar, pensar de novo, despachar outro”.
Quando ativa: /plan <task> força; CHATCLI_QUALITY_PLAN_FIRST_MODE=always sempre; auto (default) dispara quando ComplexityScore(task) >= 6. Para revisar o plano antes de executar, use /plan preview <task> (dry-run).

Formato do plano

O PlannerAgent, quando recebe a marcação PlannerStructuredOutputDirective no início da task, emite JSON estrito:

Placeholders ReWOO

Qualquer passo pode injetar output de passos anteriores via #E<n>:
Use .head=N para tarefas grandes (ex: “dado este log #E1.head=500, diagnostique”) para bound o contexto que o próximo passo vê.

Heurística de complexidade

A função ComplexityScore(task) → int[0,10] é calibrada para disparar Plan-First só quando paga. O score blends três sinais:

Exemplos

auto não dispara Plan-First. Orquestrador lida direto.

Fluxo de execução

1

Usuário dispara /agent ou /coder

A tarefa vai para AgentMode.Run().
2

runPlanFirstIfApplicable

Checa cli.pendingPlanFirst (one-shot) ou quality.ShouldPlanFirst(cfg, userQuery).
3

Planner dispatch

agentDispatcher.Dispatch([{Agent: planner, Task: PlannerStructuredOutputDirective + userQuery}]).
4

ParsePlan

Tolerante a markdown code fences e trailing prose. Valida: IDs únicos, deps apontam para passos anteriores, placeholders #E<n> apontam para IDs declarados.
5

TopologicalOrder + Execute

Ordem topológica estável (sort lex em ties) garante reprodutibilidade. Cada passo: resolve placeholders → dispatcher.Dispatch → armazena output.
6

Inject report

Dois messages sintéticos vão para cli.history:
  • assistant: o JSON do plano (o modelo vê o que foi tentado)
  • user: FinalReport determinístico com task/agent/status/output por passo + handoff
O segundo message é role=user (não system) desde o fix de abril/2026. Modelos como Claude Sonnet 4.6 recusam completion quando a conversa termina em assistant (“This model does not support assistant message prefill”). O turno de usuário sintético fecha a conversa corretamente e dá ao orquestrador um ponto-âncora explícito para finalizar.
7

ReAct loop continua (ou pula, se dry-run)

Com o report em history, o orquestrador finaliza sem re-executar os passos já concluídos. Em modo dry-run (/plan preview), o loop é pulado via planDryRunHandled — nenhuma chamada ao orquestrador é feita.

Tolerância a falhas

Um passo que falha não aborta a run. O comportamento é “continue downstream with substituted error”:
Isso espelha como o orquestrador já reage a erros per-agent hoje (continua, sumariza, faz o modelo decidir). O flag HadErrors é setado para Reflexion decidir se escala.

/plan — invocação manual

O comando /plan aceita seis formas. Autocomplete (Tab) oferece os subcomandos.

Matriz de comportamento

O flag cli.pendingPlanFirst é consumido e cleared na primeira invocação de /agent ou /coder subsequente. O flag cli.pendingPlanDryRun (exclusivo dos modos preview/dry) é limpo no mesmo ponto e faz AgentMode.Run retornar antes do ReAct loop via planDryRunHandled.
Fluxo recomendado para mudanças grandes: /plan preview <task> primeiro → revise o JSON → se aprovado, rode /plan coder <mesma task>.

Variáveis de ambiente

Override por persona (CHATCLI_AGENT_PLANNER_*)

O PlannerAgent respeita os overrides usuais de agent:

Observabilidade

Cada run emite logs estruturados:
E imprime no terminal um one-liner amigável:

Spinner durante Plan-First

O spinner “planning structured steps…” aparece somente durante a chamada pura do PlannerAgent (step 1). Durante a execução do PlanRunner (step 2), o spinner é intencionalmente desligado e um print estático é emitido:
Isso é crítico para segurança: passos podem disparar approvals interativos (ShellAgent exec, CoderAgent write) via policy engine. Se o spinner ficasse ativo durante a execução, seu repaint \r\033[K sobrescreveria o prompt de aprovação e impediria a resposta. Ctrl+C continua cancelando normalmente — o ctx cancelado propaga para dispatcher e PlanRunner entre passos.

Modo dry-run: o que é renderizado

/plan preview <task> renderiza:
Se o ParsePlan falhar (planner devolveu JSON malformado ou prose), o output bruto é impresso com um aviso — nunca é silencioso.

Quando desligar

Plan-First acrescenta +1 chamada LLM (o planner) por turn disparado. Em ambientes com budget apertado, off ou threshold=8 economizam.

Leia também

#3 Reflexion

Reflexion consome HadErrors do plan runner para gerar lições quando passos falham.

Multi-Agent Orchestration

O dispatcher que Plan-Runner reutiliza é o mesmo do orquestrador padrão.

PlannerAgent (pré-PR)

O agent existia desde antes do pipeline — esse padrão formaliza como invocá-lo de forma determinística.

Configuração completa

Todos os env vars e slashes num lugar só.