Skip to content

Fix: cross-refactoring の進行が止まる不具合と cross-review の投稿確認を直す(v8.5.0) - #127

Merged
takemi-ohama merged 1 commit into
mainfrom
fix/cross-refactoring-sync-and-sync-timing
Aug 18, 2026
Merged

Fix: cross-refactoring の進行が止まる不具合と cross-review の投稿確認を直す(v8.5.0)#127
takemi-ohama merged 1 commit into
mainfrom
fix/cross-refactoring-sync-and-sync-timing

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

概要

再々検証(#126 のレポート)で見つかった不具合 4 件と、cross-review に残っていた投稿確認の課題を直します。

#不具合影響
12生成物の同期コミットが必ず失敗する進行が止まる
13同期の後段で落ちると差分が作業ツリーに残る次の実行も止まる
14実装担当がコミットを作れない条件が生じる修正フェーズが 0 コミットで終わる
15見送りの後に読み取り用を同期していない存在しないコードへの提案が採用される
cross-review が投稿の成否を突き合わせていない届いていない指摘を取りこぼす

直した内容

12. 固定幅で読む出力に strip を適用しない

_git_out は標準出力を strip() して返しますが、_worktree_changes
git status --porcelain を固定幅(状態 2 文字 + 空白 + パス)として line[3:] で切り出します。
未 stage の変更は状態コードが M と先頭が空白になるため、出力の 1 行目だけパスが 1 文字欠けていました。

fatal: pathspec 'lugins/ndf-claude/.../refactor.py' did not match any files

strip しない選択肢を設け、固定幅で読む箇所だけそれを使います。

13. 後段で落ちても差分を残さない

同期コマンド自身の失敗では作業ツリーを戻していましたが、git add / git commit の失敗では戻していませんでした。残ると次の実行が清浄性の検査で必ず止まり、保留中の push を再試行できません。

14. 実装担当のコミットとフックの関係を定める

生成物の同期を pre-commit で検査するリポジトリでは、「同期しない」「--no-verify を使わない」「同期しないとコミット拒否」が同時に成立しません。実測では同じ実装担当が適用フェーズでは core.hooksPath=/dev/null で迂回し、修正フェーズでは迂回せず 0 コミットで終えました。

公開は進行側が検証を通してから行うため、実装担当のコミット時点で生成物が古いのは設計どおりです。それを手順書へ明示し、迂回の手段を 1 つに定めました。あわせて、コミットされなかった変更は検証を受けていないため、取り込みの前に捨てます。

15. 提案の直前に読み取り用を同期する

同期が要るのは HEAD が進んだときであって、特定のフェーズの後ではありません。取り消しで進んだ HEAD が読み取り用へ届かず、取り消しで消えた関数への提案が 2 件返っていました。

あわせて、提案とレビューの打ち切り時間を明示しました(実測 90〜285 秒に対し既定 420 秒で、混雑時に超えました)。

cross-review: 申告を GitHub 側と突き合わせる

投稿は AI 自身が gh api で行うため、失敗しても結果ファイルの申告だけは残ります。申告のまま進むと、修正担当が読むべき指摘が存在しないまま収束判定まで走ります。

申告GitHub 側扱い
0 件見に行かない突き合わせる相手がいない
n 件n 件以上採用する
n 件n 件未満中断する
n 件取得できない申告を採用する

「取得できなかった」と「0 件」を区別します。取得の失敗で止めると、GitHub 側の一時的な不調でループが進まなくなるためです。

テスト

先にテストを書いて落ちることを確認し、実装後に通しています。新規 19 件を含め 463 件が通ります

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

追加したテスト:

  • cross-refactoring/tests/test_sync_generated.py(9 件)— 実際の git で、パスの欠落・同期コミット・後段失敗時の破棄・置き土産の扱いを確認
  • cross-review/tests/test_state_posted_comments.py(10 件)— 申告と GitHub 側の突き合わせ

既存テストのうち、_git_out をモックしている箇所のシグネチャと、作業ツリーの状態を段階的に返すヘルパを実態に合わせて更新しました。

検証:

claude plugin validate plugins/ndf-claude # ✔ Validation passed
claude plugin validate plugins/ndf-codex # ✔ Validation passed
python3 scripts/check-skill-frontmatter.py # frontmatter 合計: 11112 / 11200 文字
bash scripts/build-runtime-plugins.sh # 生成物を同期済み

🤖 Generated with Claude Code

https://claude.ai/code/session_01WxxF27RXyg3QMjayii5dp1

再々検証(PR #125)で見つかった 4 件と、投稿の成否を突き合わせない課題を直した。
- 生成物の同期コミットが必ず失敗する
固定幅で読む `git status --porcelain` の出力を `strip()` していたため、
変更パスの先頭 1 文字が欠けて `git add` が落ちていた。固定幅で読む出力には
`strip` を適用しない
- 同期の後段で落ちると差分が作業ツリーに残る
`git add` / `git commit` の失敗でも、同期が作った差分を捨ててから中断する
- 実装担当がコミットを作れない条件が生じる
生成物の検査を通す必要がないことを手順書へ明示し、迂回の手段を 1 つに定めた。
取り込みの前に、コミットされなかった変更を捨てる
- 見送りの後に読み取り用の作業ディレクトリを同期していない
提案の直前に毎回同期する。あわせて提案とレビューの打ち切り時間を明示した
- cross-review が投稿の成否を突き合わせていない
申告されたコメント数を GitHub 側の実数と照合し、届いていなければ中断する。
取得できなかった場合は申告を採用する
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WxxF27RXyg3QMjayii5dp1

@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

修正要求はありません。重点確認した同期失敗時のクリーンアップ、未コミット差分の破棄、GitHub投稿数の突き合わせはPR目的と整合しています。

@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

変更内容を確認しました。指摘事項はありません。

@takemi-ohama
takemi-ohama merged commit 6759622 into mainAug 18, 2026
7 checks passed
@takemi-ohama
takemi-ohama deleted the fix/cross-refactoring-sync-and-sync-timing branch August 18, 2026 22:30
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