Leçon 07 · mémoire

L'état est écrit sur le disque et survit à la compression

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

⏱ ~10 min · 📝 3 widgets interactifs · 🧑‍💻 Basé sur shareAI-lab · s07_task_system.py

Quelle est la différence entre TodoWrite et Task ?

Le TodoManager de

s03 peut également lister les tâches - mais il est stocké dans la mémoire. Dès que l'auto_compact mentionné dans s06 est déclenché, les messages[] sont remplacés par un résumé et le statut de TodoManager est disparu (car il est en mémoire).

La Tâche de

s07 est différente : chaque tâche est un fichier .tasks/task_42.json. Que le contexte soit compressé, que le processus soit redémarré ou que l'agent soit remplacé - tant que le fichier disque existe toujours, la tâche existe toujours.

# .tasks/task_12.json
{
  "id" : 12,
  "subject" : "Refactor auth middleware",
  "description" : "Extraire la logique JWT vers le module partagé",
  "statut" : "en attente",
  "blockedBy" : [8, 11], # Doit compléter les numéros 8 et 11
  "propriétaire" : ""
Règles de sélection : Utilisez todo pour les tâches temporaires (oubliez-le une fois que vous l'avez terminé) ; utilisez task pour les tâches persistantes (conservées au fil des sessions et dépendantes).

blockBy · Tempérament du graphique de dépendance

blockedBy est une liste d'identifiants de tâches - ceux-ci doivent être terminés avant que la tâche en cours ne soit "exécutable".

L'implémentation de s07 présente un détail intéressant : Lorsqu'une tâche est terminée, elle se supprime automatiquement de la liste bloquée par de toutes les autres tâches.

def _clear_dependency(self,complete_id : int) :
    # Analyser chaque tâche, supprimercomplete_id de leur bloquéBy
    pour f dans soi.dir.glob("task_*.json") :
        tâche = json.loads(f.read_text())
        ifcomplete_id dans task.get("blockedBy", []) :
            tâche["blockedBy"].remove(completed_id)
            soi._save(tâche)

De cette façon, l'agent n'a pas besoin de maintenir une table séparée "quelles tâches sont débloquées" - il suffit de parcourir .tasks/ et de trouver status=="en attente" et non bloquéBy qui sont maintenant exécutables.

Interaction avec le graphe de dépendance

Le widget ci-dessous vous donne un graphique de dépendances de 5 tâches. Cliquez sur « terminer » pour voir bloquéBy automatiquement mis à jour et quelles tâches deviennent « exécutables » (surlignées en vert).

Peut-il encore survivre après avoir été compressé ?

s06 a mentionné qu'auto_compact remplacerait messages[] par un résumé. Mais la tâche n’est pas affectée car elle se trouve sur le disque. Testez-le : laissez l'agent effectuer 5 tâches. Après avoir compressé le dialogue, il analyse .tasks/ et peut continuer là où il se trouvait.

Interactif

Widget 1 · Graphique des dépendances · Cliquez sur Terminer pour voir les mises à jour des dépendances

Relation topologique de 5 tâches. Cliquez sur le bouton de n'importe quelle tâche en attente pour modifier son statut et observer les changements dans le tableau bloquéBy et la liste « exécutable suivant ».

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

Widget 2 · Survie à la compression · tâche survivre auto_compact

Laissez l'agent créer 3 tâches, puis déclenchez auto_compact (les messages sont effacés), puis restaurez - voyez si les tâches sont toujours là.

.tasks/ 目录
messages[]
Interactif

Widget 3 · Chaîne de dépendance · Vous donne une image pour répondre aux tâches qui peuvent être activées maintenant

Dépendances de 5 tâches. Réponse : Dans une situation donnée, quelles sont les prochaines étapes qui peuvent être effectuées (plusieurs choix possibles).

答对 0 / 4