Repository navigation
Description
何が起きたか
devbasex/devbase#184 の cross-refactoring(2026-09-15)で、agy の提案 3 件がすべて捨てられた。
⚠ agy: path / symbol の無い提案を無視しました: {'id': 'R2-001', 'target': 'lib/devbase/commands/env.py#_target_env(764-868行)', 'smell': 'duplication', ...
⚠ agy: path / symbol の無い提案を無視しました: {'id': 'R2-002', 'target': 'lib/devbase/env/backend_config.py#OpenBaoSettings.path_of(226-250行)', ...
⚠ agy: path / symbol の無い提案を無視しました: {'id': 'R2-003', 'target': 'lib/devbase/commands/env_backend.py#cmd_env_backend_migrate(477-591行)', ...
targetは<ファイル>#<シンボル>の後ろに全角括弧で行範囲を足しただけで、ファイルとシンボルは読み取れる- 3 件ともその PR の差分に関係の深い箇所だった。同じ内容は後の cross-review で指摘として出直し、2 件を修正した
- 採用されたのは、PR で変えていない関数の 1 件だけだった(cross-refactoring の --scope がファイル単位のため、issue と関係の無い既存の関数まで整理し、変わった範囲が issue から読めない #622 と同じ形)
捨てた件数は、見送りの一覧にも残らない。 1 件目の提案をそのまま build_candidates へ渡すと、同じ警告を出して ([], [])(候補 0 件・見送り 0 件)を返す。提案が出なかった場合と見分けが付かない。
$ python3 -c 'from refactor_lib.proposals import build_candidates; print(build_candidates({"agy":[{"target":"lib/devbase/commands/env.py#_target_env(764-868行)","smell":"duplication","technique":"consolidate_duplication","severity":"major"}]}))'
⚠ agy: path / symbol の無い提案を無視しました: {'id': 'R2-001', 'target': ...
([], [])(plugins/ndf/skills/cross-refactoring/scripts で実行。2026-09-26 の develop)
何が原因か
提案は path と symbol を別の項目として求める。 正規化(plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/proposals.py の _normalize_proposal、:48-59)は raw.get("path") と raw.get("symbol") を見て、どちらかが空なら :58 で警告を出して None を返す。呼び出し元の _merge_by_key(:121-136)は None を読み飛ばすだけで、件数も理由も build_candidates の見送り(deferred)へ渡さない。
提案の雛形は target を定義していない。 雛形(prompts/propose.md:60-85)は path(リポジトリ相対)と symbol(関数・メソッド・クラスの名前)を別々に求める。担当が <ファイル>#<シンボル> の 1 項目で書くと、その提案を解釈する経路は無い。
捨てられた直接の原因は path / symbol の欠落である。 target の末尾の全角括弧(行範囲)は、target を解釈する形を入れる場合に落とす対象になるが、それ自体が原因ではない。
期待すること
黙って捨てない。 直し方の候補は次のどちらかである。
| 候補 | 中身 |
|---|---|
target を受ける |
target を <ファイル>#<シンボル> として path + symbol へ分解し、末尾の括弧書き(行範囲など)を落としてから解釈する |
| 書式違反を見送りに残す | 必須項目を欠く提案を、理由つきで見送りの一覧へ入れる。見送りの理由の語彙(refactor_lib/vocabulary.py:119-127)に、読めない提案の理由を足す |
修正レイヤー
提案の対象を解釈する入口(#726)。現れているのは _normalize_proposal で、直す場所も同じ関数である。鍵(refactor_lib/items.py の item_key / group_key)をその解釈の結果から作る形は #726 が持つ。
関連
- cross-refactoring の提案の対象を 1 つの入口で解釈し、提案が捨てられる・統合されない形を根本原因の場所で直す #726(親) — 提案の対象を 1 つの入口で解釈する
- cross-refactoring: シンボルの列挙の書き方が違う同じ提案が統合されず、2 件目が「申告なし」で取り消しとして記録される #642 — シンボルの列挙の書き方が違う同じ提案が、別の組になる。書式の揺れという点で近いが、こちらは提案そのものが捨てられる
- cross-refactoring の --scope がファイル単位のため、issue と関係の無い既存の関数まで整理し、変わった範囲が issue から読めない #622
やらないと判断した(2026-09-26)
- 理由: 行範囲を添えた target の提案が黙って捨てられたのは agy だけで、agy は既定の参加者から外してある。既定の参加者(codex・kiro・ホスト)は雛形どおり path と symbol を書く。
- 実害: --include agy で戻した実行で提案が数件捨てられ、見送りの一覧にも残らない。既定の参加者では観測 0 件
- 費用の見積り: 2〜3 ファイル(refactor_lib/proposals.py・vocabulary.py とテスト)
- 再び考える条件: 既定の参加者の提案が同じ警告で捨てられた記録が 1 件出たとき、または agy を既定へ戻すとき
Activity