## 何を見つけたか `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 d2fd9ffb6・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」は、答えが無かった項目を示す表示で、値を消したことを示さない。
Activity