Skip to content

cross-refactoring: 戦略の宣言をメインディレクトリから読み、Pull Request が変えた宣言(足した静的解析の suite)が検証に入らない #1709

Closed

Description

@takemi-ohama

何を見つけたか

cross-refactoring の init は、テストの戦略を解く宣言(.ndf/project.json)を、Pull Request のブランチの作業ツリー(work/)ではなく、clone したディレクトリ(メインディレクトリ)の宣言から先に読む。このため、Pull Request が宣言を変えていても、その変更が戦略に入らない。

実行 rf1673(スプリント m1649・PR #1673、NDF 10.17.56)で起きた。

  1. 着手の地点 f85a64fe(sprint/m1649)の宣言には、cross-refactoring: 構造検査が項目の範囲テストに入らず、全体テストで初めて落ちて無関係な項目まで取り消される #1668 が足した静的解析の suite script-structure がある
  2. 状態ファイル(cross-refactoring-rf1673-state.json)の strategy.suites は pytest の 1 本だけで、静的解析の suite を持たない
  3. 同じ時刻(2026-10-03 02:46 UTC)のメインディレクトリは develop(4ed8982d)で、その宣言に静的解析の suite は 0 本だった
  4. 原因の箇所: plugins/ndf/scripts/lib/project_decl.py の read_project_decl_checked が repo.main_dir(root) を root より先に探す。cross-refactoring の init(refactor_lib/commands/setup.py の project_decl.read_project_decl(str(work)))はこれを呼ぶ

この結果、項目の検証で静的解析の範囲テスト(targets.lint_runs)が組まれず、gate.py を 509 行にした I-014 が自分の検証で落ちなかった(#1693 の設計の未決 1 で確かめた)。

どこで見つけたか

なぜこの変更の範囲外なのか

#1693 の受け入れ条件は、宣言から解いた静的解析の suite を項目と最終ゲート修正の検証に当てる経路を扱う。宣言をどのディレクトリから読むかは、cross-refactoring だけでなく project_decl を使うすべての Skill(supervise・cross-review ほか)の契約に関わり、#1693 の対象範囲の外にある。現象の場所(cross-refactoring の戦略)と原因の場所(共通の層の宣言の読み込み)が違うため、共通の層で直す。根拠: Value 6(MVV 版 2)。

修正レイヤー

  • 現象レイヤー: cross-refactoring の状態ファイルの strategy に、Pull Request の宣言の suite が入らない
  • 修正レイヤー: plugins/ndf/scripts/lib/project_decl.py の読む順序、または呼ぶ側が読む場所を指定する契約
  • 修正方針: Pull Request のブランチを検証する工程(cross-refactoring の work/)では、その作業ツリーの宣言を先に読む。メインディレクトリを先に読む理由(worktree に宣言が無い場合の補い)を残すかは設計で決める

直さないと何が起きるか

由来

#1693 の設計(未決 1 の確認)で見つけた。

再発(2026-10-30)

閉じた理由

直っています。設定の読み順を lib/decl.py に集めた変更(#2336、コミット f4cdad0)で、.ndf/project.json は呼ばれた作業ツリーの宣言を先に読み、無いときだけメインディレクトリへ戻るようになりました。一時の git worktree で、メインに suite 1 本、作業ツリーに pytest と script-structure の 2 本を置いて project_decl.read_project_decl_checked を作業ツリーから呼ぶと、作業ツリー側の 2 本が返ることを確かめました。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions