1.5 KiB
1.5 KiB
max_turns: マニフェストによるターン数制限
背景
Pod は長時間自律実行を前提としているが、暴走防止のガードレールがない。
OpenCode は Agent 定義に steps(最大ツール呼び出し回数)を持ち、
サブエージェントが無限ループに陥ることを構造的に防いでいる。
Insomnia では Worker の OnTurnEnd 相当の制御ポイントで同様の保護が可能だが、
マニフェストに宣言がないため「設定忘れ」が暴走を許す。
方針
[worker] セクションに max_turns を追加し、Worker の実行ループで強制する。
[worker]
system_prompt = "You are a code reviewer."
max_tokens = 4096
max_turns = 50 # 省略時: 制限なし(明示的な無制限)
設計ポイント
- Worker の turn loop 内でカウントし、超過時は
PodRunResult::Finishedで正常終了 - 「制限に達した」ことを Event として通知(
TurnEndのresultにLimitReachedを追加) - 省略時は制限なし。長時間実行 Pod は意図的に省略する
max_turns = 0はエラー(0ターンの Pod に意味はない)
TurnResult の拡張
pub enum TurnResult {
Finished,
Paused,
LimitReached, // 追加
}
実装場所
WorkerManifestにmax_turns: Option<u32>を追加apply_worker_manifestで Worker に設定を反映- Worker の turn loop でカウント・判定