Skip to content

cross-refactoring: target に行範囲を添えた提案が「path / symbol の無い提案」として捨てられる #684

Closed as not planned

Description

@takemi-ohama

何が起きたか

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行)', ...

捨てた件数は、見送りの一覧にも残らない。 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 が持つ。

関連

やらないと判断した(2026-09-26)

  • 理由: 行範囲を添えた target の提案が黙って捨てられたのは agy だけで、agy は既定の参加者から外してある。既定の参加者(codex・kiro・ホスト)は雛形どおり path と symbol を書く。
  • 実害: --include agy で戻した実行で提案が数件捨てられ、見送りの一覧にも残らない。既定の参加者では観測 0 件
  • 費用の見積り: 2〜3 ファイル(refactor_lib/proposals.py・vocabulary.py とテスト)
  • 再び考える条件: 既定の参加者の提案が同じ警告で捨てられた記録が 1 件出たとき、または agy を既定へ戻すとき

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: ndf-skillNDF の Skill 本体bugSomething isn't workingpriority: medium保守性・設計一貫性など、計画的に対応するwontfixThis will not be worked on

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions