Lección 07 · memoria

El estado se escribe en el disco y sobrevive a la compresión.

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

⏱ ~10 min · 📝 3 widgets interactivos · 🧑‍💻 Basado en shareAI-lab · s07_task_system.py

¿Cuál es la diferencia entre TodoWrite y Task?

El TodoManager de

s03 también puede enumerar tareas, pero se almacena en la memoria. Tan pronto como se activa auto_compact mencionado en s06, los mensajes [] se reemplazan por un resumen y el estado de TodoManager desaparece (porque está en la memoria).

La Task de

s07 es diferente: cada tarea es un archivo .tasks/task_42.json. Ya sea que se comprima el contexto, se reinicie el proceso o se reemplace el agente: mientras el archivo del disco aún exista, la tarea seguirá existiendo.

# .tasks/task_12.json
{
  "id": 12,
  "subject": "Refactor middleware de autenticación",
  "descripción": "Extraer lógica JWT al módulo compartido",
  "estado": "pendiente",
  "blockedBy": [8, 11], # Debe completar #8 y #11
  "propietario": ""
}
Reglas de selección: Utilice todo para tareas pendientes temporales (olvídelo una vez que lo termine); utilice task para tareas persistentes (retenidas entre sesiones y dependientes).

bloqueadoPor · Temperamento del gráfico de dependencia

blockedBy es una lista de identificadores de tareas; estos deben completarse antes de que la tarea actual sea "ejecutable".

La implementación de s07 tiene un detalle interesante: Cuando se completa una tarea, se eliminará automáticamente de la lista de bloqueados por de todas las demás tareas.

def _clear_dependency(self, complete_id: int):
    # Escanea cada tarea, elimina el id_completado de su bloqueadoPor
    para f en self.dir.glob("task_*.json"):
        tarea = json.loads(f.read_text())
        if complete_id en task.get("blockedBy", []):
            tarea["blockedBy"].remove(completed_id)
            self._save(tarea)

De esta manera, el agente no necesita mantener una tabla separada sobre "qué tareas están desbloqueadas"; simplemente recorra .tasks/ y busque status=="pending" y no bloqueadoBy, que ahora son ejecutables.

Interacción del gráfico de dependencia

El siguiente widget le ofrece un gráfico de dependencia de 5 tareas. Haga clic en "completar" para ver las tareas bloqueadas por actualizadas automáticamente y qué tareas se vuelven "ejecutables" (resaltadas en verde).

¿Podrá sobrevivir después de ser comprimido?

s06 mencionó que auto_compact reemplazará mensajes[] con un resumen. Pero la tarea no se ve afectada porque está en el disco. Pruébelo: deje que el agente realice 5 tareas. Después de comprimir el diálogo, escanea .tasks/ y puede continuar donde estaba.

Interactivo

Widget 1 · Gráfico de dependencia · Haga clic en completar para ver las actualizaciones de dependencia

Relación topológica de 5 tareas. Haga clic en el botón de cualquier tarea pendiente para cambiar su estado y observar los cambios en la matriz bloqueado por y la lista del "siguiente ejecutable".

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

Widget 2 · Supervivencia de compresión · tarea de supervivencia auto_compact

Deje que el agente cree 3 tareas, luego active auto_compact (los mensajes se borran) y luego restaure; vea si las tareas aún están allí.

.tasks/ 目录
messages[]
Interactivo

Widget 3 · Cadena de dependencia · Te da una imagen para responder qué tareas se pueden activar ahora

Dependencias de 5 tareas. Respuesta: En una situación determinada, ¿cuáles son los próximos pasos que se pueden realizar (hay múltiples opciones posibles)?

答对 0 / 4