Skip to content

Fix: cross-refactoring の収束ループが終わらない不具合を直す(v8.5.1) - #130

Merged
takemi-ohama merged 1 commit into
mainfrom
fix/cross-refactoring-convergence-abort
Aug 21, 2026
Merged

Fix: cross-refactoring の収束ループが終わらない不具合を直す(v8.5.1)#130
takemi-ohama merged 1 commit into
mainfrom
fix/cross-refactoring-convergence-abort

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

目的

4 回目の実機試行(Draft PR #128)で見つけた 2 件を直す。どちらも v8.5.0 で入ったもの
ではなく、v8.3.0 にも同じ構造がある。試行の記録は #129 にある。

直したこと

1. 収束ループが終わらない

進行が止まらない。 レビュー結果が 2 回続けて欠けた後、修正フェーズと再レビューを
無限に往復する。実測ではラウンド 2 で 3 巡し、手で止めるまで終わらなかった。

cmd_judge_review には変更要求を返す出口が 2 つあり、起点の記録が片方にしか無かった。

出口直す前の fix_base_sha
通常の変更要求記録する
差し戻しの上限に達したため変更要求として扱う記録しない

起点が無いと cmd_merge_fixcommits_in_range() から None を受け取り、修正の範囲を
確定できずに終了コード 2 で弾かれる。このとき fix_rounds が増えないため、
cmd_should_abandon が見送りへ移る条件(fix_rounds が上限に達する)を永久に満たさない。

修正ラウンド 0 / 3 — まだ修正します
❌ 修正の範囲を確定できませんでした(起点 None / HEAD 0b45dc9...)。検証できない修正は採りません
===== レビュー =====
(以降くり返し)

直し方: 起点と試行番号の記録を _prepare_fix_phase() へ集め、両方の出口から呼ぶ。
あわせて cmd_merge_fix が範囲を確定できずに終わるときも fix_rounds を進め、
見送りへ必ず到達させる(二重の歯止め)。

2. レビュー結果の欠落が実装担当へ回る

結果の欠落は、対象の改善項目を持たない指摘として記録されていた。

{"reviewer": "cross-refactoring", "item_id": null,
"summary": "レビュー結果の形式が 2 回続けて不正だった: codex のレビュー結果がありません",
"resolved": false}

どこを直せば解決するのか書かれておらず、実装担当は受け取っても何もできない。

直し方: judge() が返す invalid のうち、結果ファイルが無いケースと
形が違うケースを分ける。上限に達したとき、結果を残さなかったレビュー担当がいれば
変更要求にせず中断する(終了コード 4)。結果を残さなかったのはレビュー担当のプロセスが
動かなかったということで、実装担当への指摘ではない。状態は残るので、原因を直して
同じコマンド列を叩き直せば再開できる。

❌ レビュー担当 codex が結果を残しませんでした。実装担当への指摘ではないため、
進行を中断します。原因を直して同じコマンド列を叩き直せば再開できます

変更内容

対象内容
scripts/refactor.py_prepare_fix_phase() を新設。欠落と形式不正を分けて中断。merge-fix が範囲不定でも fix_rounds を進める
docs/02-apply-and-review.md判定表に終了コード 4 を追加し、分ける理由を明記
SKILL.md終了コード 4 の説明に「レビュー結果が無いまま差し戻し上限に達した」を追加
tests/回帰テスト 3 件を追加
バージョン8.5.0 → 8.5.1(README / CLAUDE.md / AGENTS.md / plugin.json / VERSION / marketplace.json)

配布物 3 系統は scripts/build-runtime-plugins.sh で同期済み。

テスト

先に落ちるテストを書き、修正で通した。追加した 3 件はいずれも修正前に失敗する。

テスト何を守るか
test_missing_result_at_the_limit_aborts結果が欠けたまま上限に達したら中断し、修正ラウンドを進めない
test_invalid_format_at_the_limit_records_the_fix_base形式不正で上限に達しても起点を記録する
test_merge_fix_advances_when_the_range_is_undeterminable範囲を確定できなくても修正ラウンドは進む

共通編集元と配布物 3 系統で 466 passed(修正前は 463)。

uv run --with pytest python -m pytest \
plugins/ndf-shared/skills/cross-refactoring/tests \
plugins/ndf-shared/skills/cross-review/tests -q

claude plugin validate . / check-skill-frontmatter.py / check-markdown-links.py も通した。

4 回目の実機試行(PR #128)で見つけた 2 件を直した。
- 収束ループが終わらない
`judge-review` の変更要求の出口は 2 つあり、差し戻し上限から落ちる側だけが
修正フェーズの起点(`fix_base_sha`)を記録していなかった。起点が無いと
`merge-fix` が範囲を確定できずに弾かれ、`fix_rounds` が進まないため
`should-abandon` の上限へ永久に到達しない。起点の記録を `_prepare_fix_phase`
へ集め、範囲を確定できないときも修正ラウンドを進める
- レビュー結果の欠落が実装担当へ回る
結果ファイルを残さなかったレビュー担当がいるときは、変更要求ではなく
進行の中断(終了コード 4)として扱う。結果を残さなかったのはレビュー担当の
プロセスが動かなかったということで、実装担当が直せる指摘ではない
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xTBtHVcCLsYnLdwfgW4xx

@takemi-ohamatakemi-ohama left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | APPROVE

修正が必要な指摘はありません。

@takemi-ohamatakemi-ohama left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | gemini | APPROVE

修正フェーズの起点(fix_base_sha)の記録漏れによる無限ループと、結果ファイルの欠落時に適切に中断(ABORT)する修正が正しく実装されていることを確認しました。

@takemi-ohama
takemi-ohama merged commit 1e744aa into mainAug 21, 2026
7 checks passed
@takemi-ohama
takemi-ohama deleted the fix/cross-refactoring-convergence-abort branch August 21, 2026 03:08
Sign up for freeto 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

@takemi-ohama