Learn how to build a practical planning system for agentic workflows by asking a model to generate a step plan, storing it in shared context, and executing steps sequentially.
Quando construí pela primeira vez a camada de orquestração de tarefas do meu framework de orquestração Python, fiz o que parecia natural: passei cada etapa ao modelo com contexto suficiente apenas para aquela etapa fazer sentido por si só. A etapa 1 pesquisaria o problema. A etapa 2 elaboraria uma solução. A etapa 3 escreveria o relatório final.
O modelo era capaz. Cada etapa produzia saída razoável. Mas o relatório final contradizia o esboço, que contradizia a pesquisa. As três etapas estavam navegando por estimativa — cada uma partindo de um mapa interno diferente da tarefa.
A correção não foi um modelo mais inteligente ou um prompt mais elaborado. Foi um plano compartilhado.
Pense em um plano como um mapa compartilhado antes de um grupo de caminhantes partir. Todos estudam a mesma rota, os mesmos pontos de verificação e as mesmas anotações sobre o terreno. Sem o mapa, três caminhantes tomam três caminhos diferentes e acabam em três cumes diferentes. Com ele, cada caminhante constrói sobre o que o anterior explorou. Um plano é um mapa compartilhado — sem ele, cada etapa navega por estimativa.
No agente de orquestração de tarefas que rodo no meu Mac Mini para trabalho com clientes, toda tarefa agora começa com uma chamada de planejamento: o modelo lê a especificação da tarefa e retorna uma lista numerada de etapas. Essa lista vai para um dicionário de contexto compartilhado. Cada etapa subsequente o lê. O problema de contradição desapareceu completamente.
Insight chave: Uma chamada de planejamento custa uma rodada extra de API e compra coerência em cada etapa subsequente. Essa troca quase sempre vale a pena.
A chamada de planejamento é simples. Peço ao modelo que divida uma tarefa em etapas numeradas e retorne cada etapa em sua própria linha. Esse é o sistema de planejamento completo.
Aqui está o primeiro bloco executável — copie-o, defina ANTHROPIC_API_KEY e execute:
Executar isso retorna algo como:
O modelo raciocina sobre a tarefa e produz um plano sequenciado. Esse é o sistema de planejamento. Sem fórmulas STRIPS. Sem busca A*. Sem redes hierárquicas de tarefas. Apenas um modelo, um prompt claro e uma lista numerada de etapas.
Armadilha comum: Pedir um plano e imediatamente descartar sua estrutura. Se você analisa o plano em uma lista e o armazena, cada etapa posterior pode referenciá-lo. Se você apenas o imprime e segue em frente, jogou fora o mapa compartilhado antes mesmo de a caminhada começar.
O plano chega como texto livre. O próximo passo é analisá-lo em uma lista Python para que cada etapa seja endereçável por índice, depois armazenar tudo em um dicionário de contexto que viaja com a tarefa por toda a sua vida útil.
Uma vez analisadas, as etapas vão para um dicionário de contexto junto com tudo mais que a tarefa precisa:
Este dicionário é a única fonte de verdade para toda a execução da tarefa. Cada etapa lê dele antes de agir e escreve seu registro de conclusão de volta nele depois. Nenhuma etapa jamais parte de uma lousa em branco.
Antes de continuar, considere: o que aconteceria se você pulasse o contexto compartilhado e passasse apenas a descrição da etapa atual ao modelo em cada chamada?
O modelo produziria saída que é localmente razoável, mas globalmente incoerente. A etapa 3 pode desfazer o que a etapa 2 configurou porque a etapa 3 nunca a viu. Este é exatamente o modo de falha descrito no início — cada etapa navegando por estimativa a partir de seu próprio mapa interno.
O dicionário de contexto é o que torna o plano um mapa compartilhado, não apenas uma lista de sugestões que cada etapa pode silenciosamente ignorar.
Cada etapa recebe o contexto completo: a tarefa original, o plano ordenado e um resumo de cada etapa que já foi concluída. O modelo não pode acidentalmente desfazer trabalho anterior porque sempre vê o que foi realizado.
Após cada etapa, registre sua conclusão antes de avançar:
O loop de planejamento completo reúne todas essas peças:
Este é o sistema de planejamento completo que rodo no harness do SDLC no meu Mac Mini. Não é STRIPS. Não é A*. É um modelo que gera um plano, um analisador que o estrutura e um loop que executa etapas sequencialmente enquanto mantém cada etapa informada sobre as anteriores.
O que isso lhe compra: Cada etapa vê o registro completo de conclusão. O modelo não pode tomar uma decisão que contradiga trabalho anterior porque sempre sabe o que já foi feito. Coerência é estrutural, não coincidental.
O que aconteceria se você executasse essas etapas em paralelo em vez de sequencialmente?
A etapa 3 — "Aplicar o manifesto Kubernetes atualizado" — depende da etapa 2 ter construído e enviado a imagem Docker. Executar ambas ao mesmo tempo significaria que a etapa 3 aplica um manifesto que aponta para uma imagem que ainda não existe. A implantação falharia.
Esta é a razão mais profunda pela qual o sistema de planejamento e o modelo de execução linear andam juntos. O plano estabelece dependências implicitamente por meio da ordenação. O loop sequencial respeita essas dependências automaticamente. Paralelizar as etapas exigiria que você modelasse explicitamente cada dependência entre elas — o que é o caminho de volta para STRIPS e A*, a complexidade que essa abordagem é projetada para evitar.
O loop de planejamento aqui ainda pede ao modelo que descreva o que faria em cada etapa. No próximo módulo, estendo esse padrão para uma camada de orquestração de ferramentas adequada: em vez de pedir ao modelo que narre uma etapa, dou a ele um pequeno conjunto de ferramentas verificadas — ler arquivo, escrever arquivo, executar comando — e o deixo escolher a correta. O sistema de planejamento que você construiu aqui torna-se a entrada para essa camada de orquestração.
O planejamento e as camadas de ferramentas juntos formam a espinha dorsal do agente de orquestração de tarefas. O módulo 06 então explica por que manter esse agente linear e de thread único — em vez de dividi-lo em sub-agentes paralelos — é o que o torna confiável em produção.
Application-level questions — predict outcomes and spot the failure mode.
1. In the task-orchestration agent, what goes wrong when each step receives only its own description and no prior context?
Correct Answer: B
Without a shared context, each step builds on its own internal map. Later steps do not know what earlier steps decided, so they make conflicting assumptions. The outputs are locally reasonable but globally incoherent.
2. In the planning loop, what does the shared context dictionary contain after the plan is generated but before any step runs?
Correct Answer: B
The context is initialized with the task, the parsed plan list, and an empty completed list. The completed list is populated as steps finish.
3. Which model does the planning loop use in the examples above?
Correct Answer: C
All examples in this module use claude-sonnet-4-6. It is the pinned intermediate model for this learning path — balanced for the kind of agentic task orchestration work being demonstrated.
4. What is the role of parse_plan in the planning loop?
Correct Answer: B
parse_plan takes the model's free-text output and extracts the numbered steps into a Python list. This makes each step addressable by index and suitable for storage in the context dictionary.
5. If the steps 'Build a Docker image' and 'Apply the Kubernetes manifest' run in parallel, what is the most likely failure?
Correct Answer: B
The manifest references the image by tag. If the image has not been built and pushed before the manifest is applied, Kubernetes will try to pull an image that does not exist and the deployment will fail. Ordering the steps sequentially avoids this by design.
6. After step index 0 runs successfully, what does context['completed'] contain?
Correct Answer: C
context['completed'] is appended with a completion record after each step runs. After step 0, it contains one entry — the description of step 0 plus a done marker.
7. What does adding a planning call at the start of a task cost, and what does it buy?
Correct Answer: B
The planning call is one extra API round-trip. The return is a shared plan that every subsequent step reads, which prevents steps from making conflicting decisions. For most multi-step tasks, that trade-off is clearly worth making.