Skip to content

[Bug] reviewer の run_review_engine.sh 同期実行必須化 (#200) が Bash デフォルトタイムアウト 120 秒と衝突し完了済み codex レビューが破棄される #207

Description

@BlueEventHorizon

背景 / コンテキスト

/forge:review の reviewer 動作が著しく遅い(「レビュー結果を書き終わっているのに agent が終了しない」ように見える)という報告を受けた調査(2026-07-15)で発見した。Issue #200 の修正(PR #206 / b950364)は forge:reviewer Agent に run_review_engine.sh の同期フォアグラウンド実行を義務付けたが、この修正が Claude Code Bash ツールのデフォルトタイムアウトと衝突している。

現象(実際の動作)

plugins/forge/agents/reviewer.md の「同期実行必須 [MANDATORY](Issue #200)」節は run_review_engine.sh を Bash ツールで run_in_background なしのフォアグラウンド実行し exit code 受領まで待つことを要求するが、Bash ツールの timeout パラメータ指定の指示がない

Claude Code Bash ツールのタイムアウトは公式仕様でデフォルト 120 秒timeout パラメータで最大 600 秒まで延長可、BASH_DEFAULT_TIMEOUT_MS / BASH_MAX_TIMEOUT_MS でオーバーライド可。根拠: https://code.claude.com/docs/en/tools-reference )。本プロジェクトでは BASH_DEFAULT_TIMEOUT_MS は未設定。

一方 codex exec によるレビューは数分かかる場合がある(Issue #200 本文にも明記)。その結果、レビューが 120 秒を超えると:

  1. Bash ツールが run_review_engine.sh をプロセスごと kill する
  2. codex はレビュー本文を {output}.stdout にストリーム済み(=結果は「書き終わっている」ように見える)だが、run_review_engine.sh 内の救済コード(rc != 0 でも extract_codex_output.py で部分出力を抽出する経路)はスクリプト自体が kill されるため実行されず、完了済みレビューが丸ごと破棄される
  3. reviewer(sonnet)はエラーを受けて codex を再実行、または Claude エンジンへフォールバックし、同じレビューをもう一周する

これにより所要時間が倍々に増え、「書き終わっているのに終了しない/無駄に待っている」という体感遅延になる。

期待動作

codex exec のレビューが数分かかっても Bash ツールのタイムアウトで kill されず、完了後に extract_codex_output.pyconvert_codex_findings.py の後工程へ進むこと。仮にタイムアウトが発生しても、ストリーム済みの部分出力(.stdout)が破棄されず救済されること。

再現手順

  1. BASH_DEFAULT_TIMEOUT_MS 未設定の環境で /forge:review code --files <レビューに 2 分超かかる規模の対象> を実行する(engine=codex がデフォルト)
  2. Phase 4 で forge:reviewer Agent が run_review_engine.sh をフォアグラウンド実行する(reviewer.md の MANDATORY 指示通り、timeout パラメータ未指定)
  3. codex exec のレビューが 120 秒を超える
  4. Bash ツールがタイムアウトでスクリプトを kill し、{session_dir}/review_<種別>.md が生成されないまま reviewer がエラー処理(再実行 / フォールバック)に入ることを確認する

環境情報

  • macOS (Darwin 25.5.0) / Claude Code(Bash ツール default timeout 120000ms・max 600000ms、公式ドキュメントで確認済み)
  • codex-cli 0.144.4(codex exec --sandbox read-only
  • forge:reviewer agent 定義: model: sonnet
  • 参考実測: 最小プロンプトでの codex exec 実行は約 4.2 秒で完了(起動・終了オーバーヘッドは小さく、遅延の本体はレビュー推論時間)

重大度

機能に支障あり

証跡

なし(codex exec 最小実行の time 計測は調査セッション内でのみ実施)

原因

Issue #200 の修正で追加された reviewer.md の同期実行必須節に、Bash ツールの timeout パラメータ(最大 600000ms)を指定する指示がなく、デフォルト 120 秒が適用されるため。また run_review_engine.sh の部分出力救済コードはスクリプト内部にあり、ツールレベルの kill(スクリプトごと停止)では到達できない構造になっているため。

実装計画

関連ドキュメント

参考 PR(実装パターン)

PR 参考ポイント
#206 [Fix] forge:reviewer Agent が run_review_engine.sh を同期実行するよう明記 reviewer.md の MANDATORY 節への指示追記パターン

実装スコープ

レイヤー 実装内容 ファイルパス
Agent 定義 同期実行必須節に Bash ツールの timeout: 600000 明示指定を追記 plugins/forge/agents/reviewer.md
テスト timeout 記載の静的回帰テストを追加 tests/forge/review/test_codex_launch_path.py

スコープ外

項目 理由 担当
タイムアウト発生時の部分出力(.stdout)救済機構 SIGTERM/SIGKILL 挙動の技術的不確実性があり別スコープと判断(triage判定) 別 Issue

TODO

着手前確認

実装する

  • reviewer.md の同期実行必須節に timeout パラメータ指示を追記する
  • test_codex_launch_path.py に timeout 記載の検証を追加する

テストを書く

  • test_codex_launch_path.py: reviewer.md の Bash 起動コードブロックに timeout パラメータの明示指定があることを検証する

確認・レビュー準備を行う

  • テストを実行する(python3 -m unittest tests.forge.review.test_codex_launch_path -v

完了する

  • PR を作成する
  • レビューに対応する

Metadata

Metadata

Assignees

No one assigned

    Labels

    BUGSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions