Урок 07 · Память

Состояние на диске — переживёт любое сжатие

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

⏱ ~10 мин · 📝 3 интерактивных компонента · 🧑‍💻 На основе shareAI-lab · s07_task_system.py

Чем Task отличается от TodoWrite?

TodoManager из s03 тоже хранит список задач — но только в памяти. Как только auto_compact из s06 срабатывает и messages[] заменяется summary, состояние TodoManager исчезает вместе с контекстом (потому что оно в памяти).

Task в s07 другой: каждая задача — это файл .tasks/task_42.json. Сожмите контекст, перезапустите процесс, замените агента — пока файлы на диске, задачи живут.

# .tasks/task_12.json
{
  "id": 12,
  "subject": "Refactor auth middleware",
  "description": "Extract JWT logic to shared module",
  "status": "pending",
  "blockedBy": [8, 11],   # задачи #8 и #11 должны быть завершены сначала
  "owner": ""
}
Правило выбора: временные задачи (нужны только сейчас) — используйте todo; постоянные задачи (нужны между сессиями, с зависимостями) — используйте task.

blockedBy · как работает граф зависимостей

blockedBy — список id задач, которые должны быть completed, прежде чем текущая задача станет исполняемой.

Элегантная деталь реализации в s07: при завершении задачи она автоматически убирается из списка blockedBy всех других задач.

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)

Поэтому агенту не нужна отдельная таблица «что разблокировалось» — достаточно пройти по .tasks/ и найти записи с status=="pending" and not blockedBy.

Интерактивный граф зависимостей

Виджет ниже: 5 задач с зависимостями. Нажмите «complete» и наблюдайте, как blockedBy обновляется автоматически, а задачи становятся исполняемыми (зелёная подсветка).

Переживёт ли task сжатие контекста?

В s06 мы видели, как auto_compact заменяет messages[] на summary. Но задачи не пострадают — они на диске. Проверим: создадим 5 задач, сожмём диалог, потом агент снова сканирует .tasks/ и продолжает работу.

Интерактив

Виджет 1 · Dependency Graph · нажмите complete и смотрите, как обновляются зависимости

Топология из 5 задач. Нажмите кнопку на любой pending-задаче, чтобы изменить её статус, и наблюдайте, как меняются массивы blockedBy и список «следующих исполняемых».

Список задач (директория .tasks/)
Сейчас исполняемы (status=pending, blockedBy=[])
Граф зависимостей
Интерактив

Виджет 2 · Compression Survival · задачи переживают auto_compact

Создайте 3 задачи, затем запустите auto_compact (messages очищается) и восстановите — проверьте, остались ли задачи.

Директория .tasks/
messages[]
Интерактив

Виджет 3 · Dependency Chain · какие задачи сейчас можно выполнять

5 задач с зависимостями. Ответьте: при заданном состоянии какие задачи можно начать прямо сейчас (может быть несколько).

Правильно: 0 / 4