cross-refactoring: 担当を外す引数が無く、使える者が 2 者だとレビュー担当が 1 者になる → 使える者だけで始まり、参加者は codex / kiro とホストを既定に足し引きでき、適用の輪番はその参加者の中で回る(実装 P7: cross-refactoring と旧関数の削除 / #664 #736) - #800
Conversation
- 初期化は母集合の既定(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
改修計画 — devbasex/ai-plugins #800
ラウンド 1(実装 codex / レビュー agy / kiro)R1-001 —
|
| 兆候・経路 | 手法・階層 | 重要度 | 提案元 | 状態 | コミット |
|---|---|---|---|---|---|
| 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 件を超えた |
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
left a comment
There was a problem hiding this comment.
🤖 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
left a comment
There was a problem hiding this comment.
🤖 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
left a comment
There was a problem hiding this comment.
🤖 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.pypython3 scripts/check-doc-staleness.py --root .python3 scripts/check-markdown-links.py --root .python3 scripts/check-skill-shell-vars.pypython3 plugins/ndf/scripts/instructions-check.py --root .
レビュー確認事項
- 参加者決定・輪番制御の共通化 (
assignment.py,setup.py):refactor_pool(host)による母集合定義、--include/--exclude/--require-allによる参加者解決、認証確認(probe_auth)のエラーハンドリング、および循環ローテーション(impl_assign)が期待通り実装・テスト固定されていることを確認。- 再開処理(
_resume)における引数反映、予約語noneによるリセット、および旧状態ファイルからの再開互換性(participants未定義時のハンドリング)が正しく実装されていることを確認。
- 多ラウンドリファクタリングの適用と品質 (
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)とレポート生成分割が振る舞いを変えずに安全に適用されていることを確認。
- R1 の現状固定テストの網羅性、R2 の長大メソッド分割(
- ドキュメント・指示書の追随:
SKILL.md,CLAUDE.md, 各種設計書・プロンプトへの記述更新が一貫しており、記述の陳腐化や未更新リンクがないことを確認。
指摘事項はありません。本変更を承認します。
Summary
cross-refactoring の初期化は、参加する CLI が 1 者でも認証を通らないと止まり、担当から特定の CLI を外す手段が無かった。適用の輪番は 4 者の固定の母集合で回り、存在しないレビュー担当の記録と出力が残っていた(#664)。この Pull Request で次が成り立つ。
--require-all)で従来の関門を選べる--exclude)と足す者(--include)を足した。agy は--include agyで戻す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 件」として同じ表を足した。
やらないこと
残るリスク
developの版で回した。この Pull Request の版での参加者の決め方は、実機ではまだ通していないTest plan
受け入れ条件は要求文書の AC7、AC31〜AC43、AC47、AC49〜AC50。
scripts/tests/test_shared_lib_layout.py::test_the_retired_assignment_functions_are_gone(git grep -wが終了コード 1)cross-refactoring/tests/test_init.py(確認を差し替えて初期化)test_start_round_emits_runtimes.py/test_rounds.py/test_assignment.pytest_rounds.pyの報告と状態の表示、test_plan_comment.pytest_init.pyの再開のテスト(上限の反映・知らせ・作り直し・none・失敗で書き換えない)test_skill_terms.py(手順書・docs/01・CLAUDE.mdの語)git grep -n '"--exclude"' -- plugins/ndf/skills/cross-refactoringがrefactor.py:113ほか 5 行uv run --with pytest pytest scripts/tests plugins/ndf -q→ exit=0(4852 passed。構造改善の後の head7f0fe764で 2026-09-22 11:38 に実行)bash scripts/build-runtime-plugins.sh --check→ exit=0claude plugin validate .→ exit=0python3 scripts/check-skill-frontmatter.py→ exit=0python3 scripts/check-doc-staleness.py --root .→ exit=0python3 scripts/check-markdown-links.py --root .→ exit=0python3 scripts/check-skill-shell-vars.py→ exit=0python3 plugins/ndf/scripts/instructions-check.py --root .→ exit=0python3 plugins/ndf/skills/cross-refactoring/scripts/refactor.py init --helpに--exclude/--include/--require-allが出るgh pr checks 800→ head7f0fe764で 15 件すべて pass(4 ランタイムの起動確認を含む)構造改善と実装レビュー
構造改善は収束ループ(cross-refactoring)を、テスト整備 1 ラウンド・提案 2 ラウンドの上限で回した。提案は codex / agy / kiro、適用は輪番。採用 12 件はすべて全体テストを通り、取り消しは 0 件。上限(提案 2 ラウンド)で抜けたため、収束までは回していない。
見送った提案は 4 件。内訳と理由は改修計画にある: #800 (comment)
実装レビューは収束レビュー(cross-review)を 1 ラウンドで終えた。レビュー担当の agy と kiro がどちらも承認し、指摘は 0 件、未解決のスレッドも 0 件(GitHub 側で数え直した)。agy は結果にレビューの URL を書かず、進行側が結果なしとして扱ったため、実在するレビューの URL を補って取り込み直した。この形は範囲外として #802 に起票した。
文書の検査
markdown-writingのセルフチェックの 6 種を、実装計画とこの本文に実行した(本文は構造改善と実装レビューの節を足した後に実行し直した)。🤖 Generated with Claude Code