Listas de tarefas agora aninham: o todo do Hermes ganha subtarefas


Você já reparou que, quando pede algo genuinamente complexo ao Hermes — “refatore este módulo e adicione testes” — ele mantém uma todo list na sessão, marcando os itens conforme avança, e ainda lembra onde estava mesmo depois da compressão de contexto? Essa lista tinha um teto duro: ela era plana. Cada tarefa ficava em uma única coluna, e a ordem significava prioridade. Expressar “primeiro faça A, e dentro de A há os passos 1, 2, 3” exigia uma prosa estranha, era mais difícil para o agente ler e mais difícil para você escanear. A PR #97921 (mesclada em 29 de agosto) remove esse teto: os itens de todo agora podem se aninhar — as subtarefas penduram num item pai por meio de um campo parent opcional, e toda superfície renderiza a árvore com indentação.

O que é a tool todo

Primeiro, o contexto. todo é uma tool nativa do Hermes: o agente a usa automaticamente para montar uma lista de acompanhamento para tarefas complexas (a documentação oficial da tool sugere 3+ passos) ou quando você entrega várias coisas de uma vez. O design é deliberadamente enxuto:

  • Uma única tool todo — passe um parâmetro todos para escrever, omita para ler a lista atual;
  • Toda chamada retorna a lista completa atual, para o agente sempre saber onde está;
  • Apenas quatro status: pending, in_progress, completed, cancelled;
  • Após a compressão de contexto, a lista é reinjetada com um cabeçalho estável (“[Your active task list was preserved across context compression]”), para tarefas longas não perderem memória.

O agente mantém a lista sozinho — você não precisa decorar nenhum comando. Basta pedir “faça um plano primeiro” ou “quebre isso em uma lista de tarefas” no seu prompt e ele segue a partir daí.

Como as subtarefas ficam

A mudança é uma coisa só: cada item de todo ganha um campo parent opcional apontando para o id de outro item.

1. Refactor parser module         (id: t1)
   ├─ Split parse_line function   (id: t2, parent: t1)
   └─ Add unit tests              (id: t3, parent: t1)
2. Update docs                    (id: t4)

O efeito: toda superfície — texto da CLI, painel de tarefas do app desktop, o adaptador ACP — renderiza as subárvores indentadas. A referência oficial da tool diz de forma direta: o campo parent opcional de um item aponta para o id de outro item, tornando-o uma subtarefa, e as superfícies renderizam a árvore indentada.

A implementação também se defende contra o agente se enrolando sozinho:

  • Autorreferências são descartadas — um parent apontando para si mesmo é ignorado;
  • Referências soltas e cíclicas são sanitizadas — um parent que não existe, ou um loop A→B→A, é limpo após a escrita;
  • Um pai concluído permanece visível enquanto algum descendente estiver ativo — após a reinjeção da compressão, um pai cujos filhos ainda estão em andamento não é escondido;
  • A reordenação pula listas aninhadas — mover uma posição plana arrancaria uma subtarefa dos seus irmãos, então a árvore fica intacta;
  • O adaptador ACP indenta até no máximo 4 níveis — para a árvore nunca ficar ilegível.

O controle de custo também merece nota: o recurso inteiro adiciona uma propriedade de string e uma frase de comportamento ao schema de tool em cache — cerca de 45 tokens. Nenhuma tool nova, nenhum parâmetro novo além de parent, nenhuma mudança no system prompt.

Como usar: linguagem simples basta

Você nunca toca em JSON — o todo é a tool do agente, e você só precisa expressar a intenção “quero camadas”:

"Break this release down into a task list: code freeze first, then tests, build, and packaging as subtasks under it"

O agente faz o resto, produzindo uma lista aninhada com links parent; você pode perguntar “onde estamos agora?” a qualquer momento e ele lê a lista para te contar. Para estruturas que naturalmente rodam em paralelo — como uma “fase de pesquisa” com “comparar opção A” e “comparar opção B” penduradas embaixo — o aninhamento lê muito mais claro que uma lista plana.

Quando mais ajuda

  • Tarefas de múltiplas etapas: releases, migrações, refatorações — naturalmente hierárquicas (“fase grande → passos pequenos”), e o aninhamento torna o progresso visível de relance.
  • Sessões longas: após a compressão, a árvore é reinjetada intacta, então o agente nunca confunde subtarefas com pais.
  • Múltiplas superfícies: o painel de tarefas do app desktop renderiza uma árvore de verdade, e as mensagens no gateway mostram a estrutura indentada também.

Essa mudança chegou em 29 de agosto (PR #97921) e está atualmente apenas na main — nenhuma release tag a inclui ainda (a v0.20.6 foi marcada em 27 de agosto). Para testar agora, rode hermes update para o código mais recente.

Resumo

Sair de uma lista plana para uma árvore de tarefas aninhável é um campo pequeno, mas melhora de verdade a experiência de tarefas longas: a estrutura fica certa, o acompanhamento de progresso do agente e a sua leitura ficam mais fáceis — tudo por 45 tokens. Da próxima vez que você entregar algo complexo ao Hermes, diga a ele para “quebrar a tarefa em uma lista com subtarefas” e veja a diferença.

Para mais mecânicas de tarefas longas (limites de turnos, orçamentos de execução, interromper sem parar), veja nosso guia de turnos ilimitados e guia de otimização de tokens de contexto.