Skip to content

fix(worker): resume the impl session when it exits without a pull request - #128

Merged
nonz250 merged 10 commits into
mainfrom
fix/impl-session-resume
Aug 11, 2026
Merged

nonz250 merged 10 commits into
mainfrom
fix/impl-session-resume

Conversation

@nonz250

@nonz250 nonz250 commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Summary

impl フェーズが exit 0 で終了したのに Pull Request が作られておらず、ai/impl/failed に落ちてしまう問題を修正します。GitHub Issue は起票していません(運用中のワーカーのログと失敗コメントから直接特定した不具合です)。

原因は claude -p の終了タイミングです。非対話モードの CLI はモデルが最終メッセージを返した時点で終了するため、モデルがバックグラウンドのテストや CI の完了を待つつもりでターンを終えると、そこでプロセスが正常終了して PR 作成まで到達しません。:failed は trigger ラベルを剥がすため自動リトライされず、worktree も破棄されるので、それまでの実装がまるごと失われて人手でのやり直しが必要になっていました。

既存の対策はどちらも効いていませんでした。impl テンプレートの「実行環境」節は対象リポジトリの CLAUDE.md にある「長時間ジョブはバックグラウンドで起動して完了通知を待つ」という指示と競合して負けます。CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS は CLI 側の実装上、実行中のバックグラウンドタスクが 1 件以上ある分岐でしか参照されず、モデルが「待ちます」と述べただけのケースには到達しません。

Changes

ワーカー

exit code だけでは完了を判定できないので、PR の紐づけという確定的なシグナルを見て、足りていなければ Claude 自身にセッションを終わらせてもらう方針にしました。

  • impl で紐づく PR が 0 件だった場合、worktree を保持したまま claude -p --continue でセッションを 1 回だけ再開し、PR を再照会するようにしました
  • 再開は execution.timeout_minutes の残予算内で行います。この値は初回実行と再開を合わせた壁時計予算として扱い、初回実行の直前に deadline を確定させます
  • 残予算が 5 分を下回る場合は再開しません。完走するより先にタイムアウトする公算が高く、claude の起動を 1 回無駄にするだけになるためです
  • 再開が失敗した場合の診断を分けました。タイムアウトは CLI_TIMEOUT、それ以外の例外は CLI_EXECUTION_ERROR として、実際の原因と異なるカテゴリで報告されないようにしています
  • 再開後も PR が無い場合は、初回と再開の両方の出力を失敗コメントに載せます

「変更不要」と判断されたケースの切り分け

Claude が「Issue は既に解消済み」と結論して意図的に PR を作らないケースも、これまで同じ No Linked Pull Request に落ちていました。再開機構を入れると毎回無駄な再開を 1 回消費してしまうので、停止シグナルを用意しています。

  • 再開プロンプトでのみ no-change マーカーを提示し、検出時は IMPL_NO_CHANGE_REQUIRED として診断を分けます
  • マーカーはユーザーが書いた Issue 本文が混ざったモデル出力なので信頼境界としては扱いません。分けるのは診断カテゴリだけで、終端ラベルは :failed(人間が確認するゲート)のまま変えていません
  • 同じ理由で、マーカーは初回プロンプトには入れていません。作業を始める前に「変更不要と宣言すれば終われる」経路を教えると、早々に降りやすくなるためです

プロンプトテンプレート

  • impl テンプレートの「実行環境」節に優先順位を明示しました。対象リポジトリの CLAUDE.md がバックグラウンド実行を指示していても、応答を終えるタイミングについてはこちらを優先します。優先するのはそのタイミングの判断だけで、それ以外はリポジトリ側の規約に従うよう限定しています

これは多層防御の 1 枚で、修正の本体ではありません。~/.sabori-flow/prompts/ にコピー済みのユーザーには届かないため、再発率を下げるだけの位置づけです。

Checklist

  • npm run build が通ること
  • npm test が全件通ること(830 → 863 件)
  • claude -p --continue の挙動を実機で確認(会話の永続化、stdin からのプロンプト読み取り、cwd スコープでの解決、会話が無い場合は exit 0 で新規開始)
  • 設計レビュー(テスト / コード / セキュリティ観点)
  • コードレビュー(コード / セキュリティ観点)

その他

再開しても直らないケースは残ります。モデルが同じ理由で再びターンを終える場合や、本当に行き詰まっている場合は結局 :failed になります。この変更は発生頻度を下げるもので、ゼロにするものではありません。

また、初回セッションの終了時点でバックグラウンドの検証結果は失われているため、検証コストの高いリポジトリでは再開に必要な時間が初回とほぼ同等になりえます。その場合は残予算に収まらず CLI_TIMEOUT に落ちるので、運用としては timeout_minutes を上げて対応します。

🤖 Generated with Claude Code

nonz250 and others added 10 commits August 11, 2026 01:50
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
…uest

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
…late

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@nonz250
nonz250 marked this pull request as ready for review August 11, 2026 05:02
@nonz250
nonz250 merged commit ce08990 into main Aug 11, 2026
2 checks passed
@nonz250
nonz250 deleted the fix/impl-session-resume branch August 11, 2026 05:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant