Re: Spawner仕様レビュー
Summary
ownerのメモ(19c66af7608)に記載されたspawner仕様を、完全性・エッジケース・セキュリティ・実装可能性・既存システムとの整合性の観点からレビューした。
Results
全体評価: CHANGES REQUESTED
仕様は全体として明確でよく構成されているが、実装前に解決すべき曖昧な点とエッジケースが複数ある。以下に詳細を記す。
1. 完全性: 未定義の動作・曖昧な点
[ISSUE-1] project-master は project-manager のtypo
仕様中に「project-masterのプロンプトファイルだけはこの値を記述しない」という記述がある。これは project-manager のtypoと思われる。実装時に混乱を避けるため、ownerに確認すべき。
[ISSUE-2] 同一ロール・複数エージェント起動時の $INPUT_MEMO_FILES の割り当てルール 例: plannerのinboxに3通のメモがある場合、planner を3つ起動する。各プロセスにどのメモファイルを割り当てるかの順序・選択ルールが未定義。
- 提案: inboxの各メモを1つずつ、先着(ファイル名ソートまたはcreated_at順)で割り当てる方式を明文化する。
[ISSUE-3] リトライの間隔が未定義 「間隔を開けて3回だけリトライする」とあるが、具体的な間隔が不明。
- 提案: 指数バックオフ(例: 5秒、15秒、45秒)を明記する。
[ISSUE-4] spawner自身のログファイル名のdatetime形式が未定義
ログファイル名 /agents/logs/${datetime}_${agent-name}.log のdatetimeのフォーマットが未規定。ファイル名にコロンを含めるとWindowsやscp等で問題になる。
- 提案:
YYYYMMDD-HHmmssのようなファイル名安全な形式を明記する。
[ISSUE-5] エージェント起動時にinboxのメモが既にactive/に移動済みの場合の扱い spawnerはinboxを監視してエージェントを起動するが、エージェントは起動後にメモをactive/に移動する(トリアージ)。その間に別のメモがinboxに到着した場合、spawnerはまた新しいエージェントを起動する。しかし、エージェント起動のトリガーとなったメモが、spawnerがコマンドを実行する前にactive/に移動されていた場合(レースコンディション)はどうなるか。
- 提案: spawnerは起動トリガーとなったメモファイルのパスを記録し、起動時にファイルの存在チェックを行わない(エージェント自身がトリアージの一環として処理する)。
2. エッジケース
[EDGE-1] メモの同時到着(複数ロール宛) 同一タイミングで複数ロールのinboxに一斉にメモが到着した場合、大量のプロセスが同時起動される可能性がある。
- 提案: ロールごとの最大同時プロセス数を設定可能にする。少なくともproject-manager以外のロールにもデフォルト上限(例: 3)を設けることを推奨。
[EDGE-2] エージェントがクラッシュした場合のメモ処理状態 エージェントが処理途中でクラッシュした場合、メモがinboxに残る(active/に移動される前にクラッシュ)かactive/に残る(処理完了前にクラッシュ)可能性がある。
- inboxに残った場合: spawnerはメモを再検出して新しいエージェントを起動するか? 仕様上は新しいファイルの作成のみ監視するので、既存ファイルは再検出されない。ただしproject-managerの場合は停止後にinboxを再チェックするので救済される。
- active/に残った場合: 永久に処理されない「孤立メモ」になる。
- 提案: エージェント異常終了時(exit code != 0)の処理方針を明記する。最低限ログに警告を出力すべき。
[EDGE-3] ディスク容量不足 ログファイルの書き込みやメモファイルの監視がディスクフルで失敗した場合の動作が未定義。
- 提案: ログ書き込み失敗時はstderrにフォールバックし、致命的なファイルシステムエラーは終了モードに移行する。
[EDGE-4] spawner起動時に既にactive/にあるメモの扱い 仕様は起動時にinbox/のみチェックする。前回のspawner停止時にactive/に残されたメモ(前述のクラッシュケース等)は処理されない。
- 提案: 起動時にactive/のメモも検出し、少なくとも警告ログを出力する。
[EDGE-5] 「すべてのエージェントが停止した場合はproject-managerを起動」のループリスク project-managerが即座にクラッシュ→全エージェント停止→再起動→即クラッシュ...の無限ループが起こりうる。リトライ3回で終了モードに入る仕様は「起動失敗」のみ対象であり、起動後に即終了するケースはカバーされていない。
- 提案: project-managerが短時間(例: 10秒以内)に終了した場合もリトライカウントに含めるか、クールダウン期間を設ける。
3. セキュリティ
[SEC-1] SPAWNER_SPAWN_CMD の安全性 環境変数をシェルコマンドとして実行するため、インジェクションリスクがある。ただし、この環境変数はownerが手動で設定するものであり、外部入力ではないため、実質的なリスクは低い。
- 注意事項: プロンプトファイルの内容がコマンド引数として渡されるため、プロンプトに特殊文字(シェルメタキャラクタ)が含まれる場合に意図しないコマンド実行が起きうる。
- 提案: コマンド実行時にはプロンプトをファイルパスとして渡す(
--file引数等)か、spawn時にシェル経由ではなく直接execvで起動する(Node.jsのchild_process.spawnでshell: false)。
[SEC-2] ログファイルに機密情報が含まれる可能性
仕様に「機密情報が含まれる可能性がある」と記載されており、gitignore対象とする点は適切。ただし現状の .gitignore にはこのディレクトリが含まれていない。
- 提案: 実装時に
/agents/logs/を.gitignoreに追加することを忘れずに。
4. 実装可能性
実装可能性は高い。 Node.jsのみで実装可能。
- ファイル監視:
fs.watchまたはchokidar(npm パッケージ)で実現可能。fs.watchはプラットフォーム依存の挙動があるためchokidarを推奨。 - プロセス管理:
child_process.spawnで十分。 - SIGINTハンドリング:
process.on('SIGINT', ...)で実現可能。ただし1秒以内に3回の検出にはタイムスタンプ管理が必要。 - 外部依存:
chokidarのみ追加が望ましい。それ以外は標準ライブラリで賄える。 - 言語: TypeScriptで記述し、
tsxで実行可能(既にdevDependenciesにある)。
5. 既存システムとの整合性
[COMPAT-1] エージェントプロンプトの移動
.claude/agents/*.md から /agents/prompt/*.md への移動は、既存のClaude Code カスタムエージェント機能との断絶を意味する。これは意図的(spawnerで置き換える)であり、仕様通り。
[COMPAT-2] メモのトリアージ権限との整合性
docs/workflow.md に「各ロールのinbox/のメモをトリアージできるのはそのロール自身のみ」とある。spawnerはinboxの内容を読み取るが移動はしないので、この権限ルールとは矛盾しない。
[COMPAT-3] project-managerの "NO direct implementation" ルールとの整合性 spawnerはproject-managerの代わりにエージェント管理を行うが、project-manager自体はメモ処理のみを行うので、既存ルールと整合する。
[COMPAT-4] npm run spawner スクリプトの追加
package.json にスクリプトを追加する必要がある。既存の npm run memo と同様のパターンで実装可能。
6. 改善提案
[SUGGEST-1] ヘルスチェック/ステータス表示機能 USR1シグナル等で現在の稼働状況(起動中のエージェント一覧、処理中のメモ)をログに出力する機能があると運用時に便利。
[SUGGEST-2] ログローテーション 長時間運転時にログファイルが肥大化する。spawner起動ごとにログファイルが分かれる設計は良いが、古いログの自動削除や圧縮の仕組みも検討すべき(ただし初期実装では不要、将来課題として記録)。
[SUGGEST-3] エージェント終了時のexit codeログ エージェント終了ログに exit code を含めると、異常終了の検知が容易になる。
- 現仕様:
${datetime} [${agent}] end - 提案:
${datetime} [${agent}] end (exit=0)のようにexit codeを付加。
[SUGGEST-4] Ctrl-C 2回目の扱い 現仕様では1回で終了モード、3回(1秒以内)で強制終了。2回押した場合の動作が暗黙的に「終了モード継続」だが、明示的に記述した方がよい。
特に確認すべきポイントへの回答
プロセスマネージャーとしての信頼性: EDGE-5(即クラッシュループ)の対策が必要。それ以外は基本的に堅実。
ログのフォーマットと内容の十分性: exit codeの欠如(SUGGEST-3)とdatetime形式の未定義(ISSUE-4)を除けば十分。
終了モードの挙動の明確性: 1回 vs 3回(1秒以内)は明確。2回目の扱いを明示すると更によい(SUGGEST-4)。
エラーリカバリの妥当性: 起動失敗の3回リトライ→終了モードは合理的。ただし起動後即終了のケース(EDGE-5)と、処理途中クラッシュ時のメモ救済(EDGE-2)が未カバー。
Constitution準拠チェック
本仕様はspawner(内部インフラ)であり、サイトコンテンツや訪問者体験に直接影響しない。Constitution違反は確認されなかった。
Next actions
- ownerに
project-masterのtypo確認(ISSUE-1) - 本レビューの指摘事項(特にISSUE-2,3,4,5とEDGE-2,5)について、plannerに渡す前に仕様の補足・明確化を行う
- SEC-1のコマンド実行方式について方針を決定する
- 上記が解決された後、plannerに実装計画を依頼する