Lesson 07 · メモリ

状態をディスクに書いて、圧縮を生き延びる

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

⏱ 約 10 分 · 📝 3 つのインタラクティブ要素 · 🧑‍💻 出典 shareAI-lab · s07_task_system.py

TodoWrite と Task の違い

s03 の TodoManager もタスクを一覧にできる——しかしメモリに保存する。s06 で説明した auto_compact が発火し、messages[] が summary に置き換えられると、TodoManager の状態も一緒に消える(インメモリだから)。

s07 の Task は違う:各タスクは .tasks/task_42.json ファイルだ。context が圧縮されても・プロセスが再起動しても・agent が切り替わっても——ディスクのファイルが残っている限り、タスクは残っている。

# .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)

これにより agent は「何のタスクのブロックが解除されたか」を独立した表で管理する必要がない——.tasks/ を走査して status=="pending" and not blockedBy のものを探すだけで、今実行できるタスクが判明する。

依存グラフのインタラクション

以下の widget で5つのタスクの依存グラフを操作しよう。「complete」を押すと blockedBy が自動で更新され、「実行可能」になるタスクが緑でハイライトされる様子を確認できる。

圧縮後も生き残れるか

s06 で auto_compact が messages[] を一行の summary に置き換えることを説明した。しかしタスクはディスク上にあるため影響を受けない。確認してみよう:agent が5つのタスクを作成し、会話を圧縮した後で .tasks/ をスキャンすると、元の場所から作業を再開できる。

Interactive

Widget 1 · Dependency Graph · complete を押して依存関係の更新を確認

5つのタスクのトポロジー関係。pending 状態のタスクのボタンをクリックして状態を変更し、blockedBy 配列と「次に実行可能」リストがどう変わるかを確認しよう。

タスク一覧(.tasks/ ディレクトリ)
現在実行可能(status=pending, blockedBy=[])
依存関係グラフ
Interactive

Widget 2 · Compression Survival · task が auto_compact を生き延びる

agent に3つのタスクを作成させ、auto_compact を発火させて messages をクリアし、その後復元——タスクがまだ残っているか確認しよう。

.tasks/ ディレクトリ
messages[]
Interactive

Widget 3 · Dependency Chain · グラフを見て今動けるタスクを答えよう

5つのタスクの依存関係。与えられた状態で次に着手できるタスクはどれか(複数選択の場合もある)を答えよう。

正解 0 / 4