#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
OPlannerAgent, 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>:
Heurística de complexidade
A funçãoComplexityScore(task) → int[0,10] é calibrada para disparar Plan-First só quando paga. O score blends três sinais:
Exemplos
- Trivial (score 1)
- Multi-action (score 6+)
- PT-BR (score 6+)
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:
FinalReportdeterminí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”: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.
Variáveis de ambiente
Override por persona (CHATCLI_AGENT_PLANNER_*)
OPlannerAgent respeita os overrides usuais de agent:
Observabilidade
Cada run emite logs estruturados:Spinner durante Plan-First
O spinner “planning structured steps…” aparece somente durante a chamada pura doPlannerAgent (step 1). Durante a execução do PlanRunner (step 2), o spinner é intencionalmente desligado e um print estático é emitido:
Modo dry-run: o que é renderizado
/plan preview <task> renderiza:
ParsePlan falhar (planner devolveu JSON malformado ou prose), o output bruto é impresso com um aviso — nunca é silencioso.
Quando desligar
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ó.