コードは書かず、実装計画だけを作成しました。計画ファイルは `<計画ファイル置き場>/add-mutable-wave.md` にあります。

## 計画の要点

**データモデル（`models.py`）**
- `Task` に `depends_on: list[int]` を追加します。
- `from_dict` では `d.get("depends_on", [])` で読み、既存の JSON をそのまま読めるようにします。

**ストア（`store.py`）**
- `add(..., depends_on=...)` は、タスクを作る前に ID の存在を検証します。未存在の ID があれば何も保存しません。
- `add_dependency(task_id, on_id)` を新設します。ID の存在、自己依存、循環を検証し、冪等にします。
- `blockers(task_id)` を新設し、未完了の依存先を返します。
- `complete()` は未完了の依存先があると専用例外を送出します。`done` の変更も保存も行いません。

**CLI（`cli.py`）**
- `add --after ID` は `action="append"` で複数指定できます。
- `depend ID --on ID2` を新設します。
- エラーは既存の `done` と同じ流儀で、メッセージを `out` に出して `return 1` します。`done` がブロックされた場合は、未完了の依存先 ID を表示します。

**テスト・ドキュメント**
- `tests/test_basic.py` に、Store と CLI の正常系・異常系を追加します。旧形式 JSON の読込と、失敗時に状態が変わらないことも確認します。
- README に使用例を追記します。

## 判断が必要な点
- **循環検出**: 要件には書かれていませんが入れる方針です。循環すると永遠に `done` できなくなるためです。不要なら外せます。
- **`list` の表示**: 依存の表示は今回見送ります。既存の `test_format` の完全一致を壊さないためです。必要なら別途追加できます。
- **完了済みタスクの扱い**: 完了済みタスクを依存先にすることも、完了済みタスクに `depend` することも許可します（ブロックはされません）。

この方針でよければ実装に進みます。