Skip to content

project-decl.py write を答えなしで打つと、既存の宣言の issues・ndf_policies が不明(null)に置き換わる #2355

Closed

Description

@takemi-ohama

何を見つけたか

project-decl.py write を --answers なしで打つと、既存の .ndf/project.json に値がある項目のうち、測定が question(候補が複数)を返した項目を unknown(null)へ置き換える。

再現(2026-11-01、ndf 10.27.6):

  1. python3 <scripts>/project-decl.py measure --root /work/ai-plugins --out /tmp/pdm/m.json → issues(P8)と ndf_policies(P9)が status: question
  2. develop の .ndf/project.json(issues: {"primary": "github", "others": ["markdown"]}、ndf_policies: {"doc_lint": true, "reject_md_wording_tests": true})だけを置いた作業場所へ write --measure /tmp/pdm/m.json --dry-run --root <その場所> を打つ
  3. 結果は「更新した(.ndf/project.json。不明 P8・P9)」で、items は kept test に対し unknown issues・unknown ndf_policies。既存の値を残さない

どこで見つけたか

スプリント m26-3 の振り返り。2026-11-01 10:40 JST に conductor が主ディレクトリで measure → write を打ち(10.27.5)、.ndf/project.json の issues と ndf_policies が null になった(未コミットで主ディレクトリに残っている)。確定仕様化のステップ(.ndf/tmp/sprint-m26-3/close/1-close-state/01-spec.out)が写す前にこれに気づき、写さなかった。コードは plugins/ndf/scripts/project-decl.py の write(P8・P9 の扱い)

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

スプリント m26-3(#2230 #2044 #2121 #2164)はリリース記録の PR と版数を流す時点に解決する変更で、プロジェクトの宣言の測定と書き出しは受け入れ条件に含まない。即時修正の 4 条件のうち「既存の約束事を壊さない」(答えが無いときの write の契約をどう変えるか)が決まっていないため、その場で直さない。根拠: Value 6・C7(MVV 版 3)

直さないと何が起きるか

宣言を解析し直すたびに、前に答えた課題の置き場とドキュメントの方針が消える。気づかずにコミットすると、issues を読む工程(起票先の決定など)と ndf_policies を読む検査(doc_lint・md の文言テストの拒否)が既定へ戻る。利用者の設定(.ndf/)を黙って書き換えることになる(C7)

起票者の推定

  • --answers が無い question の項目は、既存の宣言の値を残す(kept)のが正しい振る舞いである(推した出所: 同じ write が test を kept にしていること、project-decl.py の docstring の「答え(conductor が書く)」)

由来

PR #2352

確かめた結果(develop d2fd9ff・ndf 10.27.7、2026-11-01)

本文の再現の手順を今の develop で通すと、既存の値が残る。

  1. project-decl.py measure --root <worktree> --out /tmp/pdm/m.json → issues(P8)・ndf_policies(P9)は status: question
  2. develop の .ndf/project.json だけを置いた一時のリポジトリへ write --measure /tmp/pdm/m.json(--answers なし)を打つ
  3. 結果の items は {"kind": "unknown", "key": "issues", "reason": "答えが無い", "kept_previous": true}(ndf_policies も同じ)。書き出した .ndf/project.json は issues: {"primary": "github", "others": ["markdown"]}・ndf_policies: {"doc_lint": true, "reject_md_wording_tests": true} のまま

導入した ndf 10.27.7 の project-decl.py でも同じ結果になる。前の値を残す処理は plugins/ndf/scripts/project_lib/merge.py の merge_item(解析の値が不明で前の値があれば前の値を書く)にある。要約の「不明 P8・P9」は、答えが無かった項目を示す表示で、値を消したことを示さない。

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions