背景 / コンテキスト
/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 秒を超えると:
- Bash ツールが
run_review_engine.sh をプロセスごと kill する
- codex はレビュー本文を
{output}.stdout にストリーム済み(=結果は「書き終わっている」ように見える)だが、run_review_engine.sh 内の救済コード(rc != 0 でも extract_codex_output.py で部分出力を抽出する経路)はスクリプト自体が kill されるため実行されず、完了済みレビューが丸ごと破棄される
- reviewer(sonnet)はエラーを受けて codex を再実行、または Claude エンジンへフォールバックし、同じレビューをもう一周する
これにより所要時間が倍々に増え、「書き終わっているのに終了しない/無駄に待っている」という体感遅延になる。
期待動作
codex exec のレビューが数分かかっても Bash ツールのタイムアウトで kill されず、完了後に extract_codex_output.py → convert_codex_findings.py の後工程へ進むこと。仮にタイムアウトが発生しても、ストリーム済みの部分出力(.stdout)が破棄されず救済されること。
再現手順
BASH_DEFAULT_TIMEOUT_MS 未設定の環境で /forge:review code --files <レビューに 2 分超かかる規模の対象> を実行する(engine=codex がデフォルト)
- Phase 4 で
forge:reviewer Agent が run_review_engine.sh をフォアグラウンド実行する(reviewer.md の MANDATORY 指示通り、timeout パラメータ未指定)
codex exec のレビューが 120 秒を超える
- 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(実装パターン)
実装スコープ
スコープ外
| 項目 |
理由 |
担当 |
| タイムアウト発生時の部分出力(.stdout)救済機構 |
SIGTERM/SIGKILL 挙動の技術的不確実性があり別スコープと判断(triage判定) |
別 Issue |
TODO
着手前確認
実装する
テストを書く
確認・レビュー準備を行う
完了する
背景 / コンテキスト
/forge:reviewの reviewer 動作が著しく遅い(「レビュー結果を書き終わっているのに agent が終了しない」ように見える)という報告を受けた調査(2026-07-15)で発見した。Issue #200 の修正(PR #206 / b950364)はforge:reviewerAgent に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 秒を超えると:run_review_engine.shをプロセスごと kill する{output}.stdoutにストリーム済み(=結果は「書き終わっている」ように見える)だが、run_review_engine.sh内の救済コード(rc != 0 でもextract_codex_output.pyで部分出力を抽出する経路)はスクリプト自体が kill されるため実行されず、完了済みレビューが丸ごと破棄されるこれにより所要時間が倍々に増え、「書き終わっているのに終了しない/無駄に待っている」という体感遅延になる。
期待動作
codex execのレビューが数分かかっても Bash ツールのタイムアウトで kill されず、完了後にextract_codex_output.py→convert_codex_findings.pyの後工程へ進むこと。仮にタイムアウトが発生しても、ストリーム済みの部分出力(.stdout)が破棄されず救済されること。再現手順
BASH_DEFAULT_TIMEOUT_MS未設定の環境で/forge:review code --files <レビューに 2 分超かかる規模の対象>を実行する(engine=codex がデフォルト)forge:reviewerAgent がrun_review_engine.shをフォアグラウンド実行する(reviewer.md の MANDATORY 指示通り、timeoutパラメータ未指定)codex execのレビューが 120 秒を超える{session_dir}/review_<種別>.mdが生成されないまま reviewer がエラー処理(再実行 / フォールバック)に入ることを確認する環境情報
codex exec --sandbox read-only)forge:revieweragent 定義:model: sonnetcodex exec実行は約 4.2 秒で完了(起動・終了オーバーヘッドは小さく、遅延の本体はレビュー推論時間)重大度
機能に支障あり
証跡
なし(
codex exec最小実行の time 計測は調査セッション内でのみ実施)原因
Issue #200 の修正で追加された
reviewer.mdの同期実行必須節に、Bash ツールのtimeoutパラメータ(最大 600000ms)を指定する指示がなく、デフォルト 120 秒が適用されるため。またrun_review_engine.shの部分出力救済コードはスクリプト内部にあり、ツールレベルの kill(スクリプトごと停止)では到達できない構造になっているため。実装計画
関連ドキュメント
参考 PR(実装パターン)
実装スコープ
timeout: 600000明示指定を追記スコープ外
TODO
着手前確認
実装する
テストを書く
timeoutパラメータの明示指定があることを検証する確認・レビュー準備を行う
python3 -m unittest tests.forge.review.test_codex_launch_path -v)完了する