Aula 12 · Colaboração

Agents diferentes não podem brigar pela mesma árvore

"Isolate by directory, coordinate by task ID." Dois planos, sem interferência.

⏱ ~10 min · 📝 3 componentes interativos · 🧑‍💻 Baseado em shareAI-lab · s12_worktree_task_isolation.py

O problema oculto dos agents paralelos

O s09-s11 permite rodar múltiplos teammates ao mesmo tempo, mas há uma armadilha: todos trabalham no mesmo diretório. Alice modifica auth.py, bob também modifica auth.py simultaneamente — conflitos de git, arquivos corrompidos, testes se contaminando mutuamente.

A solução do s12 é o git worktree: o mesmo repositório, com git worktree add, pode ter checkouts em branches diferentes em diretórios diferentes. Cada agent recebe seu próprio worktree, trabalha no seu diretório e não enxerga o outro.

my-repo/                           # workspace principal (usado pelo lead)
.worktrees/
  alice-auth/                      # diretório isolado de alice
    (branch: wt/alice-auth)
  bob-api/                         # diretório isolado de bob
    (branch: wt/bob-api)
  index.json                       # registro de worktrees
  events.jsonl                     # log de eventos do ciclo de vida

Divisão em dois planos

O s12 divide explicitamente o sistema em dois planos:

  • Plano de controle (control plane): arquivos JSON em .tasks/. A task é a unidade abstrata de "o que fazer", com dependências, owner e status.
  • Plano de execução (execution plane): diretórios em .worktrees/. O worktree é o contêiner físico do "onde fazer" — um diretório + um branch.

Os dois são vinculados bidirecionalmente via task.worktree e worktree.task_id.

Esse desacoplamento permite: reutilizar o mecanismo de gestão de tasks trocando o ambiente de execução (por exemplo, containers Docker em vez de git worktree). Ou trocar o mecanismo de tasks mantendo o worktree (por exemplo, banco de dados em vez de arquivos JSON).

Demonstração do ciclo de vida

Percorra o fluxo completo: create task → create worktree → run commands → keep ou remove. Cada passo gera um registro no log de eventos (events.jsonl), que em produção serve para observabilidade.

keep vs remove

Quando o worktree cumpre sua missão, há dois desfechos possíveis:

  • remove: git worktree remove --force — o diretório é excluído, e o branch geralmente também é limpo. Equivale a "essa exploração não presta".
  • keep: apenas marca status: kept no .worktrees/index.json; o diretório físico é preservado. Equivale a "esse resultado vai ser aproveitado, espera eu fazer o merge".

Padrão comum: subagent roda um refactor experimental → resultado bom → keep → humano revisa → merge na branch principal → remove manual. Resultado ruim? Remove direto.

Interativo

Widget 1 · Lifecycle · de create task até keep/remove

Acione 5 eventos passo a passo. Esquerda: estado do disco (.tasks/ + .worktrees/). Direita: log de eventos (events.jsonl).

Estado do disco
events.jsonl (append-only)
Interativo

Widget 2 · Parallel Lanes · 3 agents em 3 worktrees ao mesmo tempo

Alice, bob e charlie modificam o mesmo arquivo em worktrees diferentes simultaneamente. Eles se veem? Haverá conflito?

📂 .worktrees/alice/
📂 .worktrees/bob/
📂 .worktrees/charlie/
Interativo

Widget 3 · Decision Flow · keep ou remove ao concluir o trabalho

Em produção, quando um agent termina o trabalho no worktree, o que deve fazer — keep ou remove? 5 cenários.

Acertos: 0 / 5