Skip to content

cross-refactoring: 採用上限を超えた提案が次のラウンドで対象外になり、ラウンドを重ねても処理できる量が増えない #754

Description

@takemi-ohama

何を見つけたか

上限を超えて見送った提案は後回しにならず、そのまま捨てられる。 ラウンドを重ねても、1 回の実行で処理できる量は増えない。

具体例は rf751(PR #751)の 2 回目のテスト整備ラウンドである。統合後の 10 件のうち 5 件が「1 ラウンドの採用上限 5 件を超えた」で見送られた。見送った中には plugins/ndf/scripts/lib/models.pymodel_flag / observed_model / parse_model_args の 3 つが入っている。この 3 件は次のラウンドで再提案されても「過去のラウンドで見送った項目のため対象外」として落ちる。

仕組みは次のとおりである。

  1. 上限を超えた分は deferred_items へ入る(plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/proposals.py:187refactor_lib/commands/apply.py:178
  2. 次のラウンドは deferred_items の全件を対象外として採否へ渡す(apply.py:227proposals.py:176
  3. 提案担当へも「対象外」として渡る(scripts/launch-cli.shcollect_excluded_items

見送りには理由の違う 2 種類が混ざっている。 「重要度がしきい値未満」「適用で失敗した」は見送ってよい。「枠が足りなかった」は内容を判断した結果ではないのに、同じように扱われている。

テスト整備では、どれを切り捨てるかがほぼ名前の順で決まる。 テスト項目の並べ方は「合意したランタイムの数 → targetcase 」(proposals.py:290 )である。実測で上限を超えた 19 件はすべて 1 者だけの提案だったので、どれが残るかは target の辞書順で決まった。

実測(2026-09-18)

状態ファイルが残っている 3 実行(rf677 / rf751 / rf752)を集計した。

実行 ラウンド 種類 統合後 採用 上限超過で見送り
rf677 R1 テスト 11 5 6
R2 テスト 4 4 0
R3 構造 5 5 0
R4 構造 6 5 1
R5 構造 7 5 1
rf751 R1 テスト 11 5 6
R2 テスト 10 5 5
R3 構造 4 4 0
R4 構造 6 5 1
R5 構造 5 5 0
rf752 R1 テスト 7 3 2
種類 統合後 上限超過で見送り 見送りの割合 上限に達したラウンド
テスト整備 43 19 44% 5 回中 4 回
構造改善 33 3 9% 6 回中 5 回

所要時間は実行の要約(~/.local/state/ndf/metrics/devbasex--ai-plugins/ )から集計した。完了した 6 実行(rf683 / rf717 / rf746 / rf747 / rf749 / rf752)が対象である。

実行 終わり方 ラウンド数(テスト+構造) 所要 最終ゲート(cross-review)
rf683 上限で終了 2+3 140 分 42 分
rf747 上限で終了 2+4 133 分 69 分
rf717 上限で終了 2+3 69 分 15 分
rf746 上限で終了 1+2 45 分 56 分
rf749 上限で終了 1+1 21 分 5 分
rf752 収束 1+1 15 分
  • 1 ラウンドの所要は中央値 16 分前後(テスト整備 15 分、構造改善 17 分)で、所要はほぼラウンドの数で決まる
  • 6 実行のうち 5 実行が、提案が尽きる前に提案ラウンドの上限で終わっている。1 ラウンドの件数の上限と回数の上限が合わさって、「新しい提案が出なくなるまで回す」目的に届いていない
  • 1 ラウンドの内訳は、提案が 33%(3 者を同時に動かし最も遅い者を待つ)、適用が 54%(1 者ずつ順番に動く)、テストと進行の処理が 13%
  • 最終ゲートの cross-review が 5〜69 分を別に足しているが、この所要を見積もる記述はどこにも無い

方針(利用者の指示)

ラウンドを減らし、1 ラウンドで処理する件数を増やす。

  1. 枠が足りずに見送った提案は、捨てずに次のラウンドへ持ち越す。 見送りの記録を「理由があって見送ったもの」と「枠が足りなかったもの」に分け、対象外として渡すのは前者だけにする。持ち越した分は、次のラウンドの新しい提案より先に採否へ入れる
  2. 1 ラウンドの採用上限を上げ、テスト整備と構造改善で別の値にする。 案として構造改善 10 件、テスト整備 10 件を挙げる。実測で統合後の最大はテスト整備 11 件、構造改善 7 件で、上限 10 件ならほぼすべてを 1 ラウンドで扱える
  3. ラウンドの上限を下げる。 案として --max-test-rounds を 2 から 1、--max-outer-rounds を 3 から 2 にする。持ち越しがあるので、回数を減らしても提案は失われない
  4. 最終ゲートの所要を目安として SKILL.md に書く。 本体とは別に 5〜69 分かかることを、実行前に読めるようにする

具体的な値は設計で決める。そのときは下の「上げると困ること」との釣り合いを見る。

指針: 全ラウンドを 60 分以内に収める(利用者の指示)

1 回の cross-refactoring は、全ラウンドを合わせて最大 60 分以内に収める。 範囲はテスト整備ラウンドの開始から、最後の提案ラウンドの適用と検証が終わるまでである。最終ゲート(cross-review、または --workflow-step の全体テスト)はこの 60 分に含めず、SKILL.md に別の目安として書く(方針 4)。

いまはこの指針を満たしていない。完了した 6 実行のうち 60 分以内に収まったのは 3 実行だけである。

実行 ラウンド数 全ラウンドの所要 60 分以内か
rf752 2 15 分 収まる
rf749 2 21 分 収まる
rf746 3 45 分 収まる
rf717 5 69 分 超える
rf747 6 133 分 超える
rf683 5 140 分 超える

1 ラウンドの所要は中央値 16 分前後、90 パーセンタイル 25〜27 分、最大 35 分だった。ラウンドの数を減らすだけでは足りない。 3 ラウンドでも、90 パーセンタイルの長さが続けば 75〜80 分になる。そこで次の 2 つで 60 分を守る。

  • ラウンドの数の既定を、60 分に収まる数から決める。 方針 3 の案(テスト整備 1 回+提案 2 回の 3 ラウンド)なら、1 ラウンドあたり 20 分が目安になる
  • 経過時間で次のラウンドを始めるか決める。 残り時間が 1 ラウンドの見込み(例: 20 分)より短ければ、次のラウンドを始めずに最終ゲートへ進む。終わり方は max_outer_rounds と区別して報告に残す(例: time_budget )。持ち越した提案は改修計画に残り、次の実行で拾える

1 ラウンドの件数を増やすと適用が伸びるため、#755 で適用を並べて動かし、1 ラウンドを 20 分に収める。60 分の値を引数で変えられるようにするか(例: --time-budget-min )は設計で決める。

上げると困ること

直さないと何が起きるか

  • テスト整備で 4 割強の提案が、内容ではなく名前の順で捨てられる。現状固定テストが足りないまま構造改善へ進む
  • 提案が残っていても、回数の上限で打ち切られる。1 回の実行は 1〜2 時間(最終ゲートを含めると最大 3 時間強)かかるのに、改善が終わらない

関連

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: ndf-skillNDF の Skill 本体enhancementNew feature or requestpriority: medium保守性・設計一貫性など、計画的に対応する

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions