Aula 07 · Memória

Estado em disco — sobrevive à compressão

"State that survives compression — because it's outside the conversation."

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

Qual a diferença entre TodoWrite e Task?

O TodoManager do s03 também lista tarefas — mas armazena tudo em memória. Quando o auto_compact do s06 é acionado e o messages[] é substituído por um summary, o estado do TodoManager some junto (por estar em memória).

O Task do s07 funciona diferente: cada task é um arquivo .tasks/task_42.json. Seja compressão de contexto, reinício do processo ou troca de agent — enquanto os arquivos em disco existirem, as tasks existem.

# .tasks/task_12.json
{
  "id": 12,
  "subject": "Refactor auth middleware",
  "description": "Extract JWT logic to shared module",
  "status": "pending",
  "blockedBy": [8, 11],   # precisa que #8 e #11 estejam concluídos
  "owner": ""
}
Regra de escolha: tarefas temporárias (esqueça quando acabar) usam todo; tarefas persistentes (que precisam sobreviver entre sessões ou têm dependências) usam task.

blockedBy · como o grafo de dependências funciona

blockedBy é uma lista de IDs de tasks — todas precisam estar completed para que a task atual seja "executável".

O s07 tem um detalhe elegante: ao concluir uma task, ela automaticamente se remove da lista blockedBy de todas as outras tasks.

def _clear_dependency(self, completed_id: int):
    # Scan every task, remove completed_id from their blockedBy
    for f in self.dir.glob("task_*.json"):
        task = json.loads(f.read_text())
        if completed_id in task.get("blockedBy", []):
            task["blockedBy"].remove(completed_id)
            self._save(task)

Assim o agent não precisa manter uma tabela separada de "o que foi desbloqueado" — basta varrer .tasks/ e buscar as que tenham status=="pending" and not blockedBy. Esse é o conjunto executável agora.

Interaja com o grafo de dependências

O widget abaixo tem 5 tasks com dependências. Clique em "complete" e veja o blockedBy atualizar automaticamente, revelando quais tasks ficam disponíveis (destaque verde).

Sobrevive à compressão?

O s06 mostrou que o auto_compact substitui o messages[] por um único summary. Mas as tasks não são afetadas, pois estão no disco. Teste: crie 5 tasks, comprima o contexto, depois varra o .tasks/ — o agent pode continuar de onde parou.

Interativo

Widget 1 · Dependency Graph · clique em complete e veja as dependências atualizar

Topologia de 5 tasks. Clique no botão de qualquer task pending para mudar seu status e observe como o array blockedBy e a lista "executáveis agora" se atualizam.

Lista de tasks (diretório .tasks/)
Executáveis agora (status=pending, blockedBy=[])
Mapa de dependências
Interativo

Widget 2 · Compression Survival · task sobrevive ao auto_compact

Crie 3 tasks, acione o auto_compact (limpa o messages) e depois restaure — veja se as tasks ainda existem.

Diretório .tasks/
messages[]
Interativo

Widget 3 · Dependency Chain · quais tasks estão executáveis no estado dado

5 tasks com dependências. Responda quais estão prontas para começar no estado apresentado (pode haver mais de uma).

Acertos: 0 / 4