yoi/tickets/max-turns.md
2026-04-11 03:23:48 +09:00

1.5 KiB
Raw Blame History

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 として通知(TurnEndresultLimitReached を追加)
  • 省略時は制限なし。長時間実行 Pod は意図的に省略する
  • max_turns = 0 はエラー0ターンの Pod に意味はない)

TurnResult の拡張

pub enum TurnResult {
    Finished,
    Paused,
    LimitReached,  // 追加
}

実装場所

  • WorkerManifestmax_turns: Option<u32> を追加
  • apply_worker_manifest で Worker に設定を反映
  • Worker の turn loop でカウント・判定