実装計画を作成しました(コードは未着手です)。計画ファイルは `<計画ファイル置き場>/add-piped-kazoo.md` にあります。

## 計画の要点

**models.py**
- `Task` に `depends_on: list[int]` を追加します。
- `from_dict` は `d.get("depends_on", [])` で読み、既存の JSON と互換にします。

**store.py**
- `add(..., depends_on=...)` は、全IDを先に検証します。存在しないIDがあれば `KeyError` を送出し、タスクは作らず保存もしません。重複IDは除去します。
- `add_dependency(task_id, on_id)` を新設します。IDの存在確認をし、自己依存と循環は拒否します。
- `blockers(task_id)` は未完了の依存先を返します。
- `complete()` は blocker があれば `DependencyError` を送出し、状態も保存も変えません。

**cli.py**
- `add --after ID`(複数指定可)を追加します。
- `depend ID --on ID2` を新設します。
- 存在しないID、未完了の依存先がある `done`、循環依存は、メッセージを出して終了コード1にします。出力先は既存の `done` と同じく `out` です。

**tests / README**
- 以下をテストに追加します。
  - 保存と再読込
  - `--after` の複数指定
  - 存在しないIDの拒否(タスクが増えないこと)
  - blocker がある `done` の失敗と状態不変
  - 依存先完了後の `done` 成功
  - 循環・自己依存の拒否
  - 旧形式 JSON の読み込み
- README に使用例を追記します。

## 私の想定(異論があればお知らせください)
- 自己依存・循環依存は要件に明記がありませんが、完了不能なタスクができるため拒否します。
- `list` の表示は、依存ありのタスクだけ末尾に ` (after: 1,2)` を付ける案です。必須ではないので見送ることもできます。既存テストが完全一致なので、依存なしの出力は変えません。

この方針で実装に進んでよいか、ご確認ください。