Aula 07 · memória

O estado é gravado no disco, sobrevivendo à compactaçã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 Tarefa?

O TodoManager do

s03 também pode listar tarefas - mas é armazenado na memória. Assim que o auto_compact mencionado em s06 é acionado, as mensagens[] são substituídas por resumo e o status do TodoManager é desaparecido (porque está na memória).

A Tarefa de

s07 é diferente: cada tarefa é um arquivo .tasks/task_42.json. Quer o contexto seja compactado, o processo seja reiniciado ou o agente seja substituído - enquanto o arquivo em disco ainda existir, a tarefa ainda existirá.

#.tasks/task_12.json
{
  "id": 12,
  "subject": "Refatorar middleware de autenticação",
  "descrição": "Extrair lógica JWT para módulo compartilhado",
  "status": "pendente",
  "blockedBy": [8, 11], # Deve completar #8 e #11
  "proprietário": ""
}

      
Regras de seleção: Use todo para tarefas temporárias (esqueça quando terminar); use task para tarefas persistentes (mantidas entre sessões e dependentes).

bloqueadoBy · Temperamento do gráfico de dependência

blockedBy é uma lista de IDs de tarefas - elas devem ser concluídas antes que a tarefa atual seja "executável".

A implementação do s07 tem um detalhe interessante: Quando uma tarefa é concluída, ela será automaticamente removida da lista BlockedBy de todas as outras tarefas.

def _clear_dependency(self, complete_id: int):
    # Verifique todas as tarefas, remova o complete_id do bloqueadoBy
    para f em self.dir.glob("task_*.json"):
        tarefa = json.loads(f.read_text())
        se complete_id em task.get("blockedBy", []):
            tarefa["blockedBy"].remove(completed_id)
            self._save(task)

Dessa forma, o agente não precisa manter uma tabela separada "quais tarefas estão desbloqueadas" - basta percorrer .tasks/ e encontrar status=="pending" e notblockBy que agora são executáveis.

Interação do gráfico de dependência

O widget abaixo fornece um gráfico de dependência de 5 tarefas. Clique em “concluir” para ver o BlockBy atualizado automaticamente e quais tarefas se tornam “executáveis” (destacadas em verde).

Ele ainda pode sobreviver depois de ser compactado?

s06 mencionou que auto_compact substituirá messages[] por um resumo. Mas a tarefa não é afetada porque está no disco. Teste: deixe o agente realizar 5 tarefas. Depois de compactar o diálogo, ele verifica .tasks/ e pode continuar onde estava.

Interativo

Widget 1 · Gráfico de Dependências · Clique em completo para ver atualizações de dependências

Relação topológica de 5 tarefas. Clique no botão em qualquer tarefa pendente para alterar seu status e observar as alterações na matriz blockBy e na lista de "próximo executável".

Task 列表(.tasks/ 目录)
当前可执行(status=pending, blockedBy=[])
依赖关系图
Interativo

Widget 2 · Sobrevivência de compressão · tarefa sobreviver auto_compact

Deixe o agente criar 3 tarefas, acione o auto_compact (as mensagens são apagadas) e depois restaure - veja se as tarefas ainda estão lá.

.tasks/ 目录
messages[]
Interativo

Widget 3 · Cadeia de Dependência · Fornece uma imagem para responder quais tarefas podem ser ativadas agora

Dependências de 5 tarefas. Resposta: Em uma determinada situação, quais são os próximos passos que podem ser executados (múltiplas escolhas possíveis).

答对 0 / 4