概要
/ndf:cross-review がレビューを収束させるのと同じ発想で、リファクタリングを収束させる Skill /ndf:cross-refactoring を追加する。
claude / codex / gemini / kiro のうちホストを除いた 3 CLI に「どこを・どう直すか」を提案させ、提案ごとに実装ランタイムとレビューランタイムを必ず別にして適用とレビューを回す。個々の提案がレビュー収束したら次の提案へ進み、全提案を消化したら提案フェーズからやり直す。新しい提案が出なくなった時点で完了とする。
実施計画の全文: issues/issue-113-cross-refactoring-loop.md(ブランチ claude/cross-refactoring-loop-skill-zmnhbx)
背景
refactoring Skill は「テストで守りながら 1 手ずつ直す」手順を持つが、次の 2 つを持っていない。
- 何を直すかの発見 — どのスメルに手を付けるかが人間または単一 AI の主観で決まり、見落としが体系的に検出されない
- 直した結果の他者検証 — 実装した本人(同一モデル)の自己レビューでは、手法の妥当性と「振る舞いが本当に変わっていないか」が構造的に検証されない
cross-review は 2 の一部を担うが、対象は人間が作った PR であり、リファクタリング固有の観点(振る舞い不変 / スメルと手法の対応 / 現状固定テストの妥当性 / scope creep)をレビュー観点テンプレートに持たない。
設計の要点
三重ループ
- 外側 = 提案ラウンド — 「指摘がなくなったら完了」の判定単位
- 中間 = 提案 item — 1 件ずつ直列に適用
- 内側 = レビュー収束 — 「指摘がなくなるまで繰り返し」の単位
参加ランタイムはホストを除いた 3 者
ホストセッションはオーケストレータに徹し、どのフェーズにも参加しない。参加者は常に 3 つ揃うので、輪番(実装 1 : レビュー 2)はどのホストでも同じ形になる。
| ホスト | 参加ランタイム(輪番) |
|---|
| Claude Code | codex / gemini / kiro |
| Codex | gemini / kiro / claude |
| Kiro | claude / codex / gemini |
RUNTIMES = ["claude", "codex", "gemini", "kiro"] - [host] # 常に 3 要素
impl = RUNTIMES[(outer_round + item_index) % 3]
reviewers = RUNTIMES から impl を除いた 2 つ
指摘の修正は impl ランタイムが行い、レビューの独立性を保つ。ホスト判定は --host の明示指定を第一とし、推定結果は init 出力と state.json に必ず残す(参加者リストにホストが混ざったら init を失敗させる)。
全参加者が CLI になったことの帰結
claude が参加者になる場合もヘッドレス CLI(claude -p)として起動し、ホストの Agent tool(サブエージェント)は一切使わない。そのため ループ全体を 1 本の bash で駆動でき、cross-review の「state.py + launcher + monitor.py」骨組みと多軸完了判定をそのまま流用できる。Skill もランタイム中立になるため、3 ランタイムすべてに配布する。
worktree はエージェント分用意する
<worktree-base>/<owner>--<repo>/rf<PR>/
├── work/ # 書き込み用。PR head ブランチ(唯一の非 detach)
├── <参加1>/ # 読み取り用。--detach
├── <参加2>/ # 読み取り用。--detach
└── <参加3>/ # 読み取り用。--detach
同一ブランチを 2 つの worktree に checkout できないため読み取り用は --detach にする。読み取り専用でも分けるのは、レビュアーがテストを実行して振る舞い不変を確認するため / 生成物の競合を避けるため / gemini の workspace 制約を回避するため。並列化するのは提案とレビューだけで、適用は work/ 上で直列に行う。各 worktree の .cross_refactoring/refs/ へ refactoring Skill の参照ファイルをコピーし、参加ランタイムに NDF が導入済みであることを前提にしない。
Kiro / Claude CLI の固有対応(要検証)
kiro-cli 2.16.1 の実測(issues/ndf-development-skills/03-runtime-conformance.md)から:
- 非対話実行は
kiro-cli chat --no-interactive - Skill frontmatter の
allowed-tools は事前承認として機能しない(execute_bash が拒否された実測あり)。agent 定義側で許可し、worktree の .kiro/agents/ に専用 agent JSON を生成する - workspace agent は cwd 配下の
.kiro/agents からしか検出されない - 既定エージェントはマシン全体の設定なので
kiro-cli agent set-default は絶対に呼ばず、常に --agent で明示指定する /ndf:* 形式のコマンドは存在しないため、プロンプトは自己完結した平文にする
allowedTools による事前承認が非対話で実際に効くか、および claude -p で編集・シェル実行を通す --permission-mode の値は未検証。Task 3 で最初に実機確認する。Kiro でシェル実行が通らない場合は Kiro を提案・レビュー専任に縮退させ、impl_capable から外す(レビューは 2 者のままなので構造は変わらない)。
終了条件
| ループ | 終了条件 |
|---|
| 内側(レビュー) | reviewer 全員 APPROVE / --max-fix-rounds(既定 3)到達で revert して放棄 |
| 中間(item) | 採用 item を全件消化 |
| 外側(ラウンド) | 採用 item 0 件 / --max-outer-rounds(既定 3)到達 / 提案の重複率が前ラウンド比 70% 以上 |
収束しない item は捨てるのが cross-review との重要な差分。レビュー指摘の修正は必須だが、リファクタリングは任意作業なので、揉める提案は PR に残さない。外側ループ終了後は /ndf:cross-review を PR 全体の最終ゲートとして実行する。
タスク分解
副次的な変更
external-ai に references/cli-kiro.md / references/cli-claude.md を追加し、SKILL.md の CLI 比較表を 4 者へ拡張するcross-review/scripts/_gemini-env.sh を抽出し、両 Skill から共用する
やらないこと(v1 スコープ外)
- PR ローテーション(件数上限で総量を抑える方針を先に検証する)
- 複数 item の並列適用(同一ブランチへの同時コミットは競合とレビュー単位の曖昧化を招く)
- ホストランタイム自身を提案・実装・レビューに参加させること(オーケストレータに徹する)
- リファクタリング以外の変更(機能追加・不具合修正)の取り込み
概要
/ndf:cross-reviewがレビューを収束させるのと同じ発想で、リファクタリングを収束させる Skill/ndf:cross-refactoringを追加する。claude / codex / gemini / kiro のうちホストを除いた 3 CLI に「どこを・どう直すか」を提案させ、提案ごとに実装ランタイムとレビューランタイムを必ず別にして適用とレビューを回す。個々の提案がレビュー収束したら次の提案へ進み、全提案を消化したら提案フェーズからやり直す。新しい提案が出なくなった時点で完了とする。
実施計画の全文:
issues/issue-113-cross-refactoring-loop.md(ブランチclaude/cross-refactoring-loop-skill-zmnhbx)背景
refactoringSkill は「テストで守りながら 1 手ずつ直す」手順を持つが、次の 2 つを持っていない。cross-review は 2 の一部を担うが、対象は人間が作った PR であり、リファクタリング固有の観点(振る舞い不変 / スメルと手法の対応 / 現状固定テストの妥当性 / scope creep)をレビュー観点テンプレートに持たない。
設計の要点
三重ループ
参加ランタイムはホストを除いた 3 者
ホストセッションはオーケストレータに徹し、どのフェーズにも参加しない。参加者は常に 3 つ揃うので、輪番(実装 1 : レビュー 2)はどのホストでも同じ形になる。
指摘の修正は impl ランタイムが行い、レビューの独立性を保つ。ホスト判定は
--hostの明示指定を第一とし、推定結果はinit出力と state.json に必ず残す(参加者リストにホストが混ざったらinitを失敗させる)。全参加者が CLI になったことの帰結
claude が参加者になる場合もヘッドレス CLI(
claude -p)として起動し、ホストの Agent tool(サブエージェント)は一切使わない。そのため ループ全体を 1 本の bash で駆動でき、cross-review の「state.py + launcher + monitor.py」骨組みと多軸完了判定をそのまま流用できる。Skill もランタイム中立になるため、3 ランタイムすべてに配布する。worktree はエージェント分用意する
同一ブランチを 2 つの worktree に checkout できないため読み取り用は
--detachにする。読み取り専用でも分けるのは、レビュアーがテストを実行して振る舞い不変を確認するため / 生成物の競合を避けるため / gemini の workspace 制約を回避するため。並列化するのは提案とレビューだけで、適用はwork/上で直列に行う。各 worktree の.cross_refactoring/refs/へrefactoringSkill の参照ファイルをコピーし、参加ランタイムに NDF が導入済みであることを前提にしない。Kiro / Claude CLI の固有対応(要検証)
kiro-cli 2.16.1 の実測(
issues/ndf-development-skills/03-runtime-conformance.md)から:kiro-cli chat --no-interactiveallowed-toolsは事前承認として機能しない(execute_bashが拒否された実測あり)。agent 定義側で許可し、worktree の.kiro/agents/に専用 agent JSON を生成する.kiro/agentsからしか検出されないkiro-cli agent set-defaultは絶対に呼ばず、常に--agentで明示指定する/ndf:*形式のコマンドは存在しないため、プロンプトは自己完結した平文にするallowedToolsによる事前承認が非対話で実際に効くか、およびclaude -pで編集・シェル実行を通す--permission-modeの値は未検証。Task 3 で最初に実機確認する。Kiro でシェル実行が通らない場合は Kiro を提案・レビュー専任に縮退させ、impl_capableから外す(レビューは 2 者のままなので構造は変わらない)。終了条件
--max-fix-rounds(既定 3)到達で revert して放棄--max-outer-rounds(既定 3)到達 / 提案の重複率が前ラウンド比 70% 以上収束しない item は捨てるのが cross-review との重要な差分。レビュー指摘の修正は必須だが、リファクタリングは任意作業なので、揉める提案は PR に残さない。外側ループ終了後は
/ndf:cross-reviewを PR 全体の最終ゲートとして実行する。タスク分解
refactor.pyのinit/start-round/next-item/advance/status)prepare-worktrees.sh、stale ガード /sync <sha>/ refs コピー / kiro agent JSON 生成)merge-proposalsの重複排除・優先度付け)refactoringSkill 準拠、差分予算・テスト green の機械検証)judge-review)should-abandon/abandon-itemの revert + reply/resolve)monitor.pyの汎用化(--tmp-dir/--agents <csv>/--stem-template/--state-file。既存テスト無変更通過が完了条件)refactor.py全 subcommand。ホスト別の参加者確定 3 ケースを含む。外部プロセスは呼ばない)副次的な変更
external-aiにreferences/cli-kiro.md/references/cli-claude.mdを追加し、SKILL.md の CLI 比較表を 4 者へ拡張するcross-review/scripts/_gemini-env.shを抽出し、両 Skill から共用するやらないこと(v1 スコープ外)