Skip to content

cross-refactoring: 担当を外す引数が無く、使える者が 2 者だとレビュー担当が 1 者になる → 使える者だけで始まり、参加者は codex / kiro とホストを既定に足し引きでき、適用の輪番はその参加者の中で回る(実装 P7: cross-refactoring と旧関数の削除 / #664 #736) - #800

Merged
takemi-ohama merged 9 commits into
developfrom
feat/issue-664-refactor-participants
Sep 22, 2026

Conversation

@takemi-ohama

@takemi-ohama takemi-ohama commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Summary

cross-refactoring の初期化は、参加する CLI が 1 者でも認証を通らないと止まり、担当から特定の CLI を外す手段が無かった。適用の輪番は 4 者の固定の母集合で回り、存在しないレビュー担当の記録と出力が残っていた(#664)。この Pull Request で次が成り立つ。

  • 使える者だけで始まる。 確認を通らない者は担当から外し、外した者と理由を状態ファイルと完了報告に残す。全員が揃わないなら止めたいときは全員を要する指定(--require-all)で従来の関門を選べる
  • 参加者は codex / kiro とホストが既定で、名指しで足し引きできる。 外す者(--exclude)と足す者(--include)を足した。agy は --include agy で戻す
  • 提案と適用は同じ参加者で回る。 適用の輪番は参加者の数のラウンドで 1 周し、ラウンド 1 はホストから始まらない。レビュー担当の記録(状態ファイルのラウンド)と出力(ラウンドの開始の 2 変数)、適用専用の母集合(状態ファイルの項目と初期化の出力)を消した
  • 再開で渡した引数は反映されるか知らされる。 上限は反映し、状態に載る他の引数は状態と違えば「反映しない」と 1 行出す。担当に関わる引数を渡した再開でだけ参加者を作り直す
  • 共通層の旧関数 4 つを消した。 従来の確認・適用専用の母集合・従来の席と適用の割り当てで、呼び手が 0 件になったことをテストで固定した(親 参加する CLI の可否を確かめて担当を割り当てる共通層を直し、担当が揃わないと止まる形を根本原因の場所で直す #727 の完了条件「片方にだけ古い形が残らない」)
  • 指示書(CLAUDE.md)の cross-refactoring の節を新しい参加者と輪番に直し、上限の既定を 3 と書いた(CLAUDE.md が cross-refactoring の --max-outer-rounds の既定を 4 と書き、3 へ下げた後の理由と食い違う #736)。cross-review の節も席の規則に直した

詳細は実装計画 issues/issue-664-p7-refactor-participants-plan.md にある。設計は issues/issue-727-687-478-664-648-design.md(PR #782)、1 本目の実装は PR #793。

Closes #664
Closes #736
Refs #727

実装で決めたこと

設計文書の「未確認のまま残ること」に「P7 の実装で決めた 6 件」として同じ表を足した。

項目 決めたこと
状態ファイルの確認の結果の項目 新規の状態に書かない。確認を通らなかった者と理由は参加者の記録が持つ
確認を行う位置 新規の経路で、作業ディレクトリの用意の後・着手前のテストの前。再開では担当に関わる引数を渡したときだけ
反映の表 「反映する」は上限 4 つとテストの制限時間、「知らせる」は残りの 10 個
引数の型の置き場所 cross-refactoring の初期化の部品。共通層へ移すと cross-review の状態の部品に触り、並行する束(G5)と重なる
完了報告 参加者の節を足す。ラウンド表からレビュー担当・そのモデル・初回承認の列を消す
モデルの警告 参加者だけが対象

やらないこと

残るリスク

  • ホストが提案に入ったときの所要は測っていない(設計の「未確認のまま残ること」のまま運用へ渡す)
  • 実機の CLI で cross-refactoring を 1 周回していない。確認の差し替えと状態ファイルの読み書きはテストで確かめた
  • 構造改善の収束ループは develop の版で回した。この Pull Request の版での参加者の決め方は、実機ではまだ通していない

Test plan

受け入れ条件は要求文書の AC7、AC31〜AC43、AC47、AC49〜AC50。

受け入れ条件 確かめ方 結果
AC7 scripts/tests/test_shared_lib_layout.py::test_the_retired_assignment_functions_are_gone(git grep -w が終了コード 1) 合格
AC31〜AC33、AC35、AC36 cross-refactoring/tests/test_init.py(確認を差し替えて初期化) 合格
AC34、AC41 test_start_round_emits_runtimes.py / test_rounds.py / test_assignment.py 合格
AC37 test_rounds.py の報告と状態の表示、test_plan_comment.py 合格
AC38〜AC40 test_init.py の再開のテスト(上限の反映・知らせ・作り直し・none・失敗で書き換えない) 合格
AC42、AC43 test_skill_terms.py(手順書・docs/01・CLAUDE.md の語) 合格
AC47 git grep -n '"--exclude"' -- plugins/ndf/skills/cross-refactoring が refactor.py:113 ほか 5 行 合格
AC49、AC50 下のコマンド 合格
  • uv run --with pytest pytest scripts/tests plugins/ndf -q → exit=0(4852 passed。構造改善の後の head 7f0fe764 で 2026-09-22 11:38 に実行)
  • bash scripts/build-runtime-plugins.sh --check → exit=0
  • claude plugin validate . → exit=0
  • python3 scripts/check-skill-frontmatter.py → exit=0
  • python3 scripts/check-doc-staleness.py --root . → exit=0
  • python3 scripts/check-markdown-links.py --root . → exit=0
  • python3 scripts/check-skill-shell-vars.py → exit=0
  • python3 plugins/ndf/scripts/instructions-check.py --root . → exit=0
  • python3 plugins/ndf/skills/cross-refactoring/scripts/refactor.py init --help に --exclude / --include / --require-all が出る
  • gh pr checks 800 → head 7f0fe764 で 15 件すべて pass(4 ランタイムの起動確認を含む)

構造改善と実装レビュー

構造改善は収束ループ(cross-refactoring)を、テスト整備 1 ラウンド・提案 2 ラウンドの上限で回した。提案は codex / agy / kiro、適用は輪番。採用 12 件はすべて全体テストを通り、取り消しは 0 件。上限(提案 2 ラウンド)で抜けたため、収束までは回していない。

種類 件数 中身
現状固定テストの追加 5 件 / 3 コミット 初期化の分岐と失敗の経路、適用の輪番の境界、引数の解析、次のラウンドへの切り替え
長い関数の分割 4 件 / 3 コミット 適用ラウンドの割り当て、適用結果の検証、テスト整備の採否の取り込み、最終の修正の取り込み
深い入れ子の平坦化 1 件 / 1 コミット 提案の読み込み
重複の統合 2 件 / 1 コミット 提案の統合、計測の報告の整形

見送った提案は 4 件。内訳と理由は改修計画にある: #800 (comment)

実装レビューは収束レビュー(cross-review)を 1 ラウンドで終えた。レビュー担当の agy と kiro がどちらも承認し、指摘は 0 件、未解決のスレッドも 0 件(GitHub 側で数え直した)。agy は結果にレビューの URL を書かず、進行側が結果なしとして扱ったため、実在するレビューの URL を補って取り込み直した。この形は範囲外として #802 に起票した。

文書の検査

markdown-writing のセルフチェックの 6 種を、実装計画とこの本文に実行した(本文は構造改善と実装レビューの節を足した後に実行し直した)。

検査 実装計画 本文 扱い
識別子と略語 17 件(修正対象の一覧・タスクの対象ファイル・業務用語の括弧書き) 6 件(Test plan の表のテストファイル) 識別子の当たりはファイルの指し示しと括弧書きだけで、説明文の主語・目的語には無い
検討痕跡・変更履歴 0 件 0 件
強い否定語 0 件 0 件
過剰な装飾語 0 件 0 件
根拠の曖昧な断定 0 件 0 件
多義語(5 回以上) モデル 5 回(すべて言語モデルの意味。1 つの意味だけで使う) 0 件

🤖 Generated with Claude Code

takemi-ohama and others added 3 commits September 22, 2026 09:41
- 初期化は母集合の既定(codex / kiro とホスト)と使える者の解決を止めない確認で呼び、
  確認を通らない者を外して続ける。足す者・外す者・全員を要する指定の引数を足す
- 適用専用の母集合(状態の項目と初期化の出力)とラウンドのレビュー担当を消し、
  適用の輪番を参加者の一覧から決める
- 再開で上限を反映し、状態に載る他の引数は違えば知らせる。担当に関わる引数を
  渡した再開でだけ参加者を作り直す
- 報告と改修計画の表示を 1 つの母集合に揃え、参加者の節を足す
- 呼び手の無くなった旧関数 4 つを共通層から消し、残らないことをテストで固定する

Refs #664 #727

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- 手順書の担当の決め方を 1 つの表にし、足す者・外す者・全員を要する指定を
  引数の表と argument-hint に足す。前提の「すべてログイン済み」を外す
- init が返す変数の表から適用専用の母集合を消す
- CLAUDE.md の cross-refactoring の節を codex / kiro とホストの既定と、参加者の数で
  1 周する輪番に直し、--max-outer-rounds の既定を 3 と書く(#736)。
  cross-review の節を席の規則に直す
- 実装計画を足し、設計文書の「未確認のまま残ること」に P7 で決めた 6 件を足す

Refs #664 #736 #727

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
再開時の参加者追加、少人数での適用担当輪番、空ラウンドの進行判定を固定する。

Item-Id: R1-001
Round: 1
Impl-Runtime: codex
Impl-Model: default
@takemi-ohama

takemi-ohama commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor Author

改修計画 — devbasex/ai-plugins #800

/ndf:cross-refactoring が提案し、適用した改善項目の記録である。
理由と手順は提案の時点でしか残らないため、公開の直前に書き出している。

  • 対象範囲: plugins/ndf/skills/cross-refactoring/scripts, plugins/ndf/scripts/lib, plugins/ndf/skills/cross-refactoring/tests, plugins/ndf/scripts/tests
  • 着手前のテスト: uv run --with pytest pytest scripts/tests plugins/ndf -q

ラウンド 1(実装 codex / レビュー agy / kiro)

R1-001 — plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/commands/setup.py#cmd_init

兆候・経路 手法・階層 重要度 提案元 状態 コミット
branch unit — codex / agy 採用 1

なぜ: cmd_init の再開処理(_resume)において、--include で新しい参加者を追加した際、参加者一覧(runtimes)が再構成されるとともに state["worktrees"] に追加されたランタイムの作業ツリーパスが補充される分岐があるが、既存テストは exclude による除外のみを扱っており、include による追加・作業ツリー辞書更新の分岐が固定されていない。

手順: 1. 既定参加者で一度 cmd_init を実行して状態ファイルを作成する
2. --include agy を指定して再度 cmd_init(再開)を実行する
3. state["runtimes"] に agy が含まれ、state["worktrees"]["agy"] にパスが設定されていること、および resume_changes に参加者変更が記録されていることを検証する

R1-002 — plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/commands/setup.py#cmd_init

兆候・経路 手法・階層 重要度 提案元 状態 コミット
error unit — codex / agy 採用 1

なぜ: cmd_init の引数解析において、--exclude や --include に予約語 none と通常のランタイム名が同時に指定された場合(例: --exclude none,kiro)、die により終了コード 4 で処理を中断するガードがあるが、このエラー経路がテストで固定されていない。

手順: 1. --exclude none,kiro または --include none,agy を引数に指定して cmd_init を呼び出す
2. SystemExit(4) が送出されて処理が中断されることを検証する
3. 状態ファイルが作成されないことを確認する

R1-003 — plugins/ndf/scripts/lib/assignment.py#impl_assign

兆候・経路 手法・階層 重要度 提案元 状態 コミット
boundary unit — agy 採用 1

なぜ: impl_assign(round_no, participants) は参加者数で剰余を取って担当者を決める。既存テスト test_lib_assignment.py では 3 者の正常系と空リスト等の異常系のみがテストされており、参加者が 1 者(最小構成)および 2 者の境界値において、複数ラウンドで正しく循環することが直接固定されていない。

手順: 1. 参加者が 1 者(["codex"])のリストでラウンド 1 および 2 を呼び出し、常にその 1 者が返ることを検証する
2. 参加者が 2 者(["codex", "kiro"])のリストでラウンド 1(2番目の要素)およびラウンド 2(1番目の要素)が返ることを検証する

R1-004 — plugins/ndf/skills/cross-refactoring/scripts/refactor.py#main

兆候・経路 手法・階層 重要度 提案元 状態 コミット
error unit — codex 採用 1

なぜ: --include / --exclude の通常値・none・未知名は固定されているが、空値と none と実行者名の混在を拒む経路は固定されていない

手順: 1. 公開 CLI 入口へ空の --include を渡す
2. 終了コード 2 となり初期化処理へ進まないことを記録する
3. none と実行者名を混在させた --exclude を渡す
4. 中断し状態ファイルを作らないことを記録する

R1-005 — plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/commands/report.py#cmd_advance

兆候・経路 手法・階層 重要度 提案元 状態 コミット
branch unit — codex 採用 1

なぜ: 採用あり・採用なし・上限・重複・テスト整備の各分岐は固定されているが、ラウンドがまだ 0 件のとき何も更新せず戻る分岐は固定されていない

手順: 1. rounds が空で final が未設定の状態を保存する
2. 公開の advance 入口を呼ぶ
3. 正常に戻ることと、保存済み状態が変わらないことを比較する

ラウンド 2(実装 agy / レビュー codex / kiro)

R2-001 — plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/commands/apply.py#cmd_next_apply_round

兆候・経路 手法・階層 重要度 提案元 状態 コミット
long_method extract_method major codex / kiro 採用 1

なぜ: 群の選択ループと、開いた群の状態に応じて entry の apply 状態を組み立てる 3 分岐(新規 open / 試行の再開 / 取り込み済みの開き直し)が 1 関数に同居する。選択と状態組み立てで変更理由が分かれる。test_apply_rounds.py / test_apply_attempts.py が入口から通す。

手順: 1. 開く群を選ぶ処理を _select_next_apply_group(groups) -> tuple[Optional[group], str] として抽出(reopening を含めて返す)
2. 開いた群の状態組み立て(pending/open・pending/再開・applied)を _prepare_apply_entry(state, entry, opened, reopening) として抽出
3. cmd_next_apply_round は選択→終了判定→組み立て→emit の並びにする
4. 既存テストで emit 値と状態遷移が不変であることを確認

R2-002 — plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/commands/apply.py#_load_runtime_proposals

兆候・経路 手法・階層 重要度 提案元 状態 コミット
deep_nesting flatten_conditional major kiro 採用 1

なぜ: ランタイムごとのループ内に存在判定・JSON 解析の try/except・dict 型判定・items のリスト判定が入れ子で並び、正常系(提案の取り込み)が末尾に埋もれる。1 者の不調で全体を止めない分岐が読みづらい。test_merge_apply.py が挙動を通す。

手順: 1. 1 者分の読み取りを _read_runtime_proposal(result: Path) -> Optional[list[dict]] として抽出(存在しない・JSON 不正・非オブジェクトは None、items 非リストは空リスト)
2. _load_runtime_proposals はループ内で早期 continue により正常系を平坦化し、entry['proposed'][runtime] の設定を 1 箇所へ寄せる
3. 既存の警告文言と proposals/entry への反映が不変であることをテストで確認

R2-003 — plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/verify.py#verify_apply_round

兆候・経路 手法・階層 重要度 提案元 状態 コミット
long_method extract_method major kiro 採用 1

なぜ: 1 関数が独立した検証段(コミット空判定・各コミットの基本検証・test_gap 時の現状固定テスト有無・テスト期待値の変更・差分予算・粒度)を通しで持つ。段ごとに名前が付き、部分だけを検証しづらい。テストは test_merge_apply.py / test_commit_granularity.py / test_assert_changes.py が入口から通す。

手順: 1. test_gap 検査を _verify_test_gap_present(items, facts) -> Optional[str] として抽出
2. 差分予算検査を _verify_diff_budget(items, facts) -> Optional[str] として抽出(estimated/factor/budget/actual の算出を内包)
3. 粒度検査を _verify_apply_commit_count(facts) -> Optional[str] として抽出
4. verify_apply_round は各抽出関数を順に呼び最初の非 None を返す形にする
5. 既存テストを実行し戻り値が不変であることを確認

R2-004 — plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/commands/apply.py#cmd_merge_test_judgements

兆候・経路 手法・階層 重要度 提案元 状態 コミット
long_method extract_method major codex 採用 1

なぜ: 保留レコードの特定、担当者の JSON 結果読み込み、判定の統合、問題時の項目放棄と取り消し、正常時の保留更新が一続きになっている。入力取得と破棄を伴う状態遷移が混在し、判定結果を状態へ反映する境界が読み取りにくい。

手順: 1. 現在群の番号、担当者、保留レコードを取得する処理を抽出する
2. 担当者の結果ファイルを読み、dict の verdict だけを返す処理を抽出する
3. problem がある場合に項目を abandoned にして群を取り消す処理を抽出する
4. 正常時に当該群だけへ判定を適用して通知する処理を抽出する
5. test_assert_changes.py の既存テストで changed、undecidable、欠落、不正 JSON、群の分離を確認する

R2-005 — plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/commands/gate.py#cmd_merge_final_fix

兆候・経路 手法・階層 重要度 提案元 状態 コミット
long_method extract_method major codex 採用 1

なぜ: 最終修正の事前状態確認、結果とコミット範囲の収集、コミット検証、採否反映、所要時間記録と push が 1 関数に直列で同居している。各段階は既に IntakeScope や commit facts という明確な境界を持つが、失敗時の終了経路を含む全体を追わないと個々の責務を確認できない。

手順: 1. 結果 payload、HEAD、ordered_range を確定する処理を名前付き関数へ抽出する
2. claimed_shas から unassigned と problems を作る検証処理を別関数へ抽出する
3. 検証結果に応じて discard または gate の fix 記録を更新する処理を抽出する
4. cmd_merge_final_fix は段階を順に呼び、既存の終了コード、保存、push の順序を維持する
5. test_final_fix.py の既存テストで結果なし、範囲不明、不正コミット、正常取り込み、push 再試行を確認する

ラウンド 3(実装 kiro / レビュー codex / agy)

R3-001 — plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/proposals.py#merge_proposals

兆候・経路 手法・階層 重要度 提案元 状態 コミット
duplication consolidate_duplication minor agy / kiro 検証中 1

なぜ: merge_proposals と merge_test_proposals が「merged 辞書を作り、proposals を二重ループして正規化・None 破棄・item_key で重複排除・既存があればマージ、無ければ挿入」という骨格を逐語的に共有する。違うのは正規化関数(_normalize_proposal / _normalize_test_proposal)とマージ関数(_merge_one / _merge_test_one)だけで、片方だけ直すと重複排除の基準が食い違う。

手順: 1. proposals, normalize_fn, merge_one_fn を受け取り集約後の辞書を構築するヘルパー関数 _build_merged を抽出する
2. merge_proposals 内の辞書構築二重ループを _build_merged(proposals, _normalize_proposal, _merge_one) の呼び出しに置き換える
3. merge_test_proposals 内の辞書構築二重ループを _build_merged(proposals, _normalize_test_proposal, _merge_test_one) の呼び出しに置き換える
4. test_merge_proposals.py および test_test_rounds.py を実行し、採用・見送りの結果が変わらないことを確認する

R3-002 — plugins/ndf/scripts/lib/metrics.py#format_report

兆候・経路 手法・階層 重要度 提案元 状態 コミット
duplication extract_method minor agy / kiro 検証中 1

なぜ: format_report 内で実装担当テーブル(impl_rows)とレビュー担当テーブル(reviewer_rows)の各行を組み立てる内包表記が、辞書要素の走査・列フォーマット・Markdown テーブル行生成という同一の処理パターンを重複して記述している。各行の f-string レイアウトが関数内に直書きされており、行生成の責務を分離することで関数の見通しを改善できる。

手順: 1. 実装担当の行を組む内包表記を _impl_rows(metrics) として抽出し、行文字列の list を返す
2. レビュー担当の行を組む内包表記を _reviewer_rows(metrics) として抽出する
3. format_report は 2 つのヘッダ定義と _emit_table 呼び出しだけを残し、行の組み立てを各ヘルパへ委ねる
4. test_models_and_metrics.py の format_report のテストを実行し出力が不変であることを確認する

見送った項目

ラウンド 対象 兆候・経路 理由
1 plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/commands/report.py#cmd_report branch 1 ラウンドの採用上限 5 件を超えた
1 plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/commands/setup.py#cmd_start_round normal 1 ラウンドの採用上限 5 件を超えた
1 plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/gitfacts.py#record_observed_model normal 1 ラウンドの採用上限 5 件を超えた
2 plugins/ndf/scripts/lib/assignment.py#resolve_participants long_method 1 ラウンドの採用上限 5 件を超えた

takemi-ohama and others added 6 commits September 22, 2026 10:12
cmd_init において --exclude や --include に none と通常のランタイム名が同時に指定された場合に終了コード 4 で処理が中断され、状態ファイルが作成されない振る舞いを固定する。

Item-Id: R1-002
Round: 1
Impl-Runtime: agy
Impl-Model: default
空の --include が argparse の型で終了コード 2 になり初期化へ進まないこと、
none と実行者名を混在させた --exclude が終了コード 4 で中断し状態ファイルを
作らないことを現状固定テストとして追加する。対象コードは変更しない。

Item-Id: R1-004
Round: 1
Impl-Runtime: kiro
Impl-Model: default
…ts/refactor_lib/commands/apply.py#cmd_next_apply_round

適用ラウンド 1 の 3 項目を、振る舞いを変えずに関数の抽出で分割する。

- R2-001: cmd_next_apply_round から、開く群の選択(_select_next_apply_group)と
  開いた群の状態に応じた適用の状態の組み立て(_prepare_apply_entry)を抽出
- R2-003: verify_apply_round から、現状固定テストの有無(_verify_test_gap_present)・
  差分予算(_verify_diff_budget)・粒度(_verify_apply_commit_count)の検査を抽出
- R2-005: cmd_merge_final_fix から、結果と範囲の確定(_collect_final_fix_range)・
  申告コミットの検証(_verify_final_fix_commits)・採否の反映(_apply_final_fix_verdict)を抽出

Item-Id: R2-001
Round: 2
Impl-Runtime: claude
Impl-Model: claude-opus-5
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ランタイムごとの提案読み取りを抽出し、提案統合のループを早期 continue で平坦化する。

Item-Id: R2-002
Round: 2
Impl-Runtime: codex
Impl-Model: default
…ts/refactor_lib/commands/apply.py#cmd_merge_test_judgements

保留の特定・担当の結果読み込み・changed時の項目放棄と群の取り消し・正常時の
群への判定適用と通知を、それぞれ独立した関数へ抽出した。入力取得と破棄を伴う
状態遷移が混ざっていた本体を、境界の見える 4 段に分けた。振る舞いは不変。

Item-Id: R2-004
Round: 2
Impl-Runtime: kiro
Impl-Model: default
…ing/scripts/refactor_lib/proposals.py#merge_proposals

- R3-001: merge_proposals と merge_test_proposals が共有していた提案の正規化・重複排除・統合の二重ループを _build_merged へ集約した
- R3-002: format_report の実装担当・レビュー担当の行組み立てを _impl_rows / _reviewer_rows へ抽出した

Item-Id: R3-001
Round: 3
Impl-Runtime: claude
Impl-Model: default
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

🤖 cross-review | round 1 | kiro | APPROVE

参加者の解決(resolve_participants / _names_arg / _resume)と旧関数 4 つの削除、apply.py / gate.py / report.py / metrics.py の抽出は振る舞いを保っており、修正を要する点は見つからなかった。record_observed_model の引数削減は唯一の呼び出し(apply.py:673)が更新済み、_switch_apply_impl の range(len(state["runtimes"])) は available が 0 者なら init が終了コード 4 で止まる前提と整合、再開時の none/include・exclude・require-all の分岐と worktree 補充も新規テストで固定されている。ドキュメント(CLAUDE.md・propose プロンプト)も参加者モデルと --max-outer-rounds 既定 3 に一致している。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

🤖 cross-review | round 1 | agy | APPROVE

判定

APPROVE

PR #800 の変更(P7: cross-refactoring の参加者共通層載せ替え・旧関数削除、および R1〜R3 の現状固定テストとリファクタリング)を精査しました。

検証内容

  • 参加者解決と輪番の共通化 (P7):
    • assignment.refactor_pool / resolve_participants への統一、--include / --exclude / --require-all の反映、未認証 CLI の除外記録と継続処理が設計どおりに実装されていることを確認。
    • auth.check_auth, assignment.assign, assignment.impl_pool, assignment.review_assign の削除と、それに伴う呼び出し箇所の完全な移行を確認(scripts/tests/test_shared_lib_layout.py 等で担保)。
    • レビュー担当項目の削除に伴う状態ファイル・完了報告・改修計画の出力整合性を確認。
  • リファクタリング (R1〜R3):
    • refactor_lib/commands/apply.py(群選択・状態準備・判定反映)、gate.py(最終ゲート修正検証)、verify.py(差分予算・テスト有無・コミット数検証)、proposals.py(重複統合 _build_merged)、metrics.py(表行生成抽出)の各段抽出・平坦化が既存挙動を損なわずに整理されていることを確認。
  • テスト・静的検証:
    • uv run --with pytest pytest scripts/tests plugins/ndf -q(4852 件全パス)
    • bash scripts/build-runtime-plugins.sh --check(整合確認)
    • claude plugin validate .(終了コード 0)
    • scripts/check-skill-frontmatter.py, scripts/check-doc-staleness.py, scripts/check-markdown-links.py, scripts/check-skill-shell-vars.py, instructions-check.py(すべてエラー 0 件)

設計文書 issue-727-687-478-664-648-design.md および実装計画 issue-664-p7-refactor-participants-plan.md の受け入れ条件を満たしており、指摘すべき修正事項はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

🤖 cross-review | round 1 | agy | APPROVE

PR #800 の変更内容(差分 34 ファイル、コミット bee79b43 〜 7f0fe764)および改修計画(R1-001〜R1-005, R2-001〜R2-005, R3-001〜R3-002)を精査しました。

検証結果

  • 全テストスイート通過: uv run --with pytest pytest scripts/tests plugins/ndf -q (4852 passed)
  • プラグイン生成物・同期確認通過: bash scripts/build-runtime-plugins.sh --check
  • 各種リント・ドキュメント整合性確認通過:
    • python3 scripts/check-skill-frontmatter.py
    • python3 scripts/check-doc-staleness.py --root .
    • python3 scripts/check-markdown-links.py --root .
    • python3 scripts/check-skill-shell-vars.py
    • python3 plugins/ndf/scripts/instructions-check.py --root .

レビュー確認事項

  1. 参加者決定・輪番制御の共通化 (assignment.py, setup.py):
    • refactor_pool(host) による母集合定義、--include / --exclude / --require-all による参加者解決、認証確認(probe_auth)のエラーハンドリング、および循環ローテーション(impl_assign)が期待通り実装・テスト固定されていることを確認。
    • 再開処理(_resume)における引数反映、予約語 none によるリセット、および旧状態ファイルからの再開互換性(participants 未定義時のハンドリング)が正しく実装されていることを確認。
  2. 多ラウンドリファクタリングの適用と品質 (apply.py, gate.py, verify.py, proposals.py, metrics.py):
    • R1 の現状固定テストの網羅性、R2 の長大メソッド分割(cmd_next_apply_round, cmd_merge_test_judgements, cmd_merge_final_fix, verify_apply_round)および早期リターンによる平坦化(_load_runtime_proposals)、R3 の重複統合(_build_merged)とレポート生成分割が振る舞いを変えずに安全に適用されていることを確認。
  3. ドキュメント・指示書の追随:
    • SKILL.md, CLAUDE.md, 各種設計書・プロンプトへの記述更新が一貫しており、記述の陳腐化や未更新リンクがないことを確認。

指摘事項はありません。本変更を承認します。

@takemi-ohama
takemi-ohama marked this pull request as ready for review September 22, 2026 11:40
@takemi-ohama
takemi-ohama merged commit 8efc1d9 into develop Sep 22, 2026
16 checks passed
@takemi-ohama
takemi-ohama deleted the feat/issue-664-refactor-participants branch September 22, 2026 11:49
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