Lektion 07 · Erinnerung

Der Status wird auf die Festplatte geschrieben und übersteht die Komprimierung

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

⏱ ~10 Min · 📝 3 interaktive Widgets · 🧑‍💻 Basiert auf shareAI-lab · s07_task_system.py

Was ist der Unterschied zwischen TodoWrite und Task?

s03s TodoManager kann auch Aufgaben auflisten – diese werden jedoch im Speicher gespeichert. Sobald auto_compact, das in s06 erwähnt wird, ausgelöst wird, wird „messages[]“ durch „summary“ ersetzt und der Status von TodoManager ist verschwunden (da er sich im Speicher befindet).

s07s Aufgabe ist anders: Jede Aufgabe ist eine .tasks/task_42.json-Datei. Unabhängig davon, ob der Kontext komprimiert, der Prozess neu gestartet oder der Agent ersetzt wird – solange die Festplattendatei noch vorhanden ist, existiert die Aufgabe weiterhin.

# .tasks/task_12.json
{
  "id": 12,
  "subject": "Refactor Auth Middleware",
  "description": "JWT-Logik in gemeinsames Modul extrahieren",
  "status": "pending",
  "blockedBy": [8, 11], # Muss #8 und #11 abschließen
  "owner": "
Auswahlregeln: Verwenden Sie todo für temporäre Aufgaben (vergessen Sie es, wenn Sie damit fertig sind); Verwenden Sie task für persistente Aufgaben (die sitzungsübergreifend und abhängig bleiben).

blockiertBy · Abhängigkeitsdiagramm temper

blockedBy ist eine Liste von Aufgaben-IDs – diese müssen abgeschlossen sein, bevor die aktuelle Aufgabe „ausführbar“ ist.

Die Implementierung von s07 hat ein nettes Detail: Wenn eine Aufgabe abgeschlossen ist, wird sie automatisch aus der BlockedBy-Liste aller anderen Aufgaben entfernt.

def _clear_dependency(self, abgeschlossene_id: int):
    # Scannen Sie jede Aufgabe und entfernen Sie die abgeschlossene_ID aus ihrem blockierten By
    for f in self.dir.glob("task_*.json"):
        task = json.loads(f.read_text())
        if abgeschlossene_id in task.get("blockedBy", []):
            task["blockedBy"].remove(completed_id)
            self._save(task)

Auf diese Weise muss der Agent keine separate Tabelle „Welche Aufgaben sind entsperrt“ verwalten – durchsuchen Sie einfach .tasks/ und suchen Sie nach status=="pending" und nicht blockiertBy, die jetzt ausführbar sind.

Interaktion des Abhängigkeitsdiagramms

Das Widget unten zeigt Ihnen ein Abhängigkeitsdiagramm von 5 Aufgaben. Klicken Sie auf „Abschließen“, um zu sehen, dass blockiertBy automatisch aktualisiert wird und welche Aufgaben „ausführbar“ werden (grün hervorgehoben).

Kann es nach der Komprimierung noch überleben?

s06 erwähnte, dass auto_compact Nachrichten[] durch eine Zusammenfassung ersetzen wird. Die Aufgabe ist jedoch nicht betroffen, da sie sich auf der Festplatte befindet. Testen Sie es: Lassen Sie den Agenten 5 Aufgaben erledigen. Nach dem Komprimieren des Dialogs scannt es .tasks/ und kann dort fortfahren, wo es war.

Interaktiv

Widget 1 · Abhängigkeitsdiagramm · Klicken Sie auf „Fertig stellen“, um Abhängigkeitsaktualisierungen anzuzeigen

Topologische Beziehung von 5 Aufgaben. Klicken Sie bei einer ausstehenden Aufgabe auf die Schaltfläche, um deren Status zu ändern und die Änderungen im BlockedBy-Array und in der Liste „Nächste ausführbare Datei“ zu beobachten.

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

Widget 2 · Kompressionsüberleben · Aufgabe überleben auto_compact

Lassen Sie den Agenten drei Aufgaben erstellen, dann auto_compact auslösen (Nachrichten werden gelöscht) und dann wiederherstellen – prüfen Sie, ob die Aufgaben noch vorhanden sind.

.tasks/ 目录
messages[]
Interaktiv

Widget 3 · Abhängigkeitskette · Geben Sie ein Bild, um zu beantworten, welche Aufgaben jetzt aktiviert werden können

Abhängigkeiten von 5 Aufgaben. Antwort: Welche nächsten Schritte können in einer bestimmten Situation durchgeführt werden (Mehrfachauswahl möglich)?

答对 0 / 4