Skip to content

入口・受け渡しのファイル・設定・環境変数の契約を 1 か所に宣言し、宣言の外を検査で落とす #2336

Closed
0 of 17 issues completed

Description

@takemi-ohama

大方針 #2335(異常系・ログ・回復とデータ・入出力の形を 1 つの実行の核へ集める)の柱の 1 本(柱の記号 P0)。子の課題 17 件は、この柱の仕組みがそろえば解消する可能性があるものである。

依頼(原文)

大方針 #2335(異常系・ログ・回復とデータ・入出力の形を 1 つの実行の核へ集める)の柱の 1 本。子の課題は、この柱の仕組みがそろえば解消する可能性があるものである。

何をするか

NDF の入口 91 本(plugins/ndf/scripts 直下 52・Skill の scripts 直下 39)と、入口の間で受け渡すファイル(名前 114 種類)・.ndf/ の設定 15 種類・環境変数 56 種類について、受け取るもの・返すもの・書く状態・終了コードを 1 か所の宣言(契約の一覧)に書き出す。今の振る舞いを写すだけで、変えない。あわせて、新しいコードが実行の核と契約を通らなければ構造の検査が落とす(今の外れは許可の一覧に載せ、一覧は減る方向にしか変えられない)。

同じ値を 2 か所が持つ宣言(例 本番のブランチ)、メインディレクトリと worktree のどちらから読むかの不一致、呼ばれない死んだコードもここで片付ける。

受け入れ条件

  1. 入口 91 本と受け渡しのファイル・設定・環境変数すべてについて、入力・出力・書く状態・終了コードが 1 か所の宣言にある
  2. 宣言に無い入口・ファイル・引数・環境変数・設定のキーを構造の検査が落とす。今の外れは許可の一覧にあり、一覧を増やす変更を検査が落とす
  3. 1 つの値を持つ設定ファイルが 1 つだけになり、どこ(メインディレクトリか worktree か)から読むかが宣言に書かれる
  4. 子の課題それぞれを、閉じた(解消を確かめた)か残した(理由つき)かに分けて本文に記録する

進め方

子の課題は 1 件ずつ直さない。柱の仕組みを入れた後に、子の課題の再現の手順を 1 回ずつ通し、解消したものを理由を添えて閉じる。設計は #2335 の設計(マイルストーン「28 根本解決 1: 設計と契約の棚卸し」)の後に、この柱ごとに行う。

(柱の記号: P0。2026-11-01 の組み直しで作った)

(書き手: 起票者、日付: 2026-11-01。大方針 #2335 の組み直しで AI が書いた本文で、利用者の指示の原文としては扱わない)

利用者の指示の原文は #2335 の「調べ方」に引用された次の 4 文である。

「異常系処理とログ出力、異常時の回復処理が統一されていないから起こる不具合・課題が多い。1 件ずつ対処してもきりがない」「内部データ構造と出力のフォーマットの不統一の影響も大きそう」「NDF は Skill の Script 化から発展してきたため、内部データ構造や入出力契約がほぼ整理されていない」「出力だけでなく入力もそろえるべき」

(書き手: 利用者、日付: 2026-11-01。#2335 の本文が引用したもの)

人へ問わずに進め、決められない点は前提か未決として課題の本文へ書く。

(書き手: AI の起動指示、日付: 2026-11-01。この要求の工程の進め方の指示で、要求の中身ではない)

起票者の推定

題・本文のうち、利用者の指示の原文(上の 4 文)に無く、起票者が推して足した条件。承認ゲート 1 で利用者が確かめるまで、利用者の決定として扱わない。

# 条件 推した出所 この要求での扱い
S1 対象の数(エントリポイント 91 本・受け渡しのファイル 114 種類・.ndf/ の設定 15 種類・環境変数 56 種類) #2335 の「何を見つけたか」(2026-11-01 の grep の集計) 前提 1。数は 2026-11-01 の参考値で、受け入れ条件は「数え上げの規則が拾うすべて」で判定する(受け入れ条件 1・2)
S2 入力・出力・書く状態・終了コードを 1 か所の宣言(契約の一覧)に書く #2335 の進め方 0 受け入れ条件 1
S3 今の振る舞いを写すだけで、変えない #2336 の本文「何をするか」 受け入れ条件 9。例外は S6〜S8 の片付けだけ(前提 3)
S4 新しいコードが実行の核を通らなければ構造チェックが落とす #2336 の本文「何をするか」・#2335 の進め方 1 含まない。実行の核はマイルストーン 29 で作るため、この課題の時点では通る先が無い。核を通ることの検査は #2335 の受け入れ条件 1 が持つ(前提 4)
S5 今の外れは例外リストに載せ、リストは減る方向にしか変えられない(ラチェット) #2336 の本文・#2335 の進め方 1 受け入れ条件 3・4
S6 同じ値を 2 か所が持つ設定を片付ける(例 本番のブランチ: worktree.json の production_branch と project.json の delivery) #2336 の本文・#2097 受け入れ条件 5・6
S7 メインディレクトリと worktree のどちらから読むかの不一致を片付ける #2336 の本文・#2317・#1709 受け入れ条件 7
S8 呼ばれない死んだコードを片付ける #2336 の本文 受け入れ条件 8
S9 子の課題は 1 件ずつ直さず、仕組みを入れた後に再現の手順を 1 回ずつ通して閉じる #2336 の本文「進め方」・#2335 の進め方 4 受け入れ条件 10
S10 設計は #2335 の設計の後に行う #2336 の本文「進め方」 前提 5

目的

前提

  • 前提 1: 「エントリポイント」は、plugins/ndf/scripts 直下と plugins/ndf/skills/*/scripts 直下にあり、テストと実験版(experimental/)を除くファイルのうち、if __name__ == "__main__": を最上位に持つ .py と、実行される .sh を指す。数え上げの規則は設計で 1 つに決め、検査とテストが同じ規則を使う。2026-11-01 の 91 本は参考値で、規則が拾った本数と食い違えば規則の本数を正とし、差を設計に記録する
  • 前提 2: 「受け渡しのファイル」は、あるエントリポイントが書き、別のエントリポイントか Skill の手順が読むファイル(状態・記録・結果)を指す。1 つのエントリポイントの中だけで作って消す一時ファイルは含まない
  • 前提 3: 振る舞いを変えてよいのは、受け入れ条件 5〜8 の片付け(同じ値を持つ設定の 1 か所化・読む場所の不一致の解消・死んだコードの削除)だけである。それ以外は今の振る舞いを契約の一覧へ写す
  • 前提 4: 実行の核はまだ無い(マイルストーン 29 で作る)。この課題の構造チェックは「契約の一覧の外」を落とし、「核を通らない」ことは見ない
  • 前提 5: 設計は 異常系・ログ・回復とデータ・入出力の形を 1 つの実行の核へ集め、異常系の課題 103 件を型ごとにまとめて解く #2335 の設計(データの型の書き方・実行の核の形)の後に行う。異常系・ログ・回復とデータ・入出力の形を 1 つの実行の核へ集め、異常系の課題 103 件を型ごとにまとめて解く #2335 の設計が契約の一覧の書き方(JSON・JSON Schema・Python の型など)を決めていれば従い、決めていなければこの課題の設計が決める
  • 前提 6: 既存の利用者のリポジトリにある .ndf/ の設定は、利用者に書き換えを求めない。1 か所へ寄せた値の古い置き場は、読み込みの側で新しい置き場へ読み替えて受ける(古い置き場の値があり新しい置き場に無いとき、古い値を使う)。古い置き場を読むことは契約の一覧に「移行のための読み」として書く
  • 前提 7: 構造チェックは既存の scripts/check-script-structure.py(CI のジョブとして走る)へ規則を足すか、同じ形(結果の 1 行 JSON・例外リストは 1 項目 1 ファイル)の別のチェックとして足す。どちらにするかは設計が決める
  • 前提 8: 外部から呼ばれる形(エントリポイントのパス・副命令・引数の名前)は変えない。引数の名前をそろえる(--root への統一など)のは柱 P8(入口の引数・環境変数・設定の受け取り方を 1 つの読み込み部品にそろえる #2341)の範囲である

対象範囲

含む:

含まない:

ドメインイベント

# イベント 引き金 失敗したとき 順序の前提
E1 エントリポイントと受け渡しのファイル・設定・環境変数を数え上げた 実装者が数え上げの規則を走らせる 規則で読めないファイル(構文の誤り・動的な引数)があれば、数えられなかったものとして一覧へ載せ、例外リストへ回す —
E2 契約の一覧へ今の契約を書き写した E1 の結果 今の振る舞いが読み取れない契約(終了コードの意味が分からないなど)は「不明」と書き、例外リストへ載せる E1
E3 同じ値を持つ設定を 1 か所へ寄せた E2 で 2 か所が同じ値を持つと分かった 寄せた後に古い置き場だけを持つリポジトリで値が読めなければ、受け入れ条件 6 のテストが落ちる E2
E4 読む場所の不一致を解消した E2 で同じファイルを別の場所から読むエントリポイントが分かった 解消できない(呼ぶ側の事情で場所が決まらない)ものは理由を添えて例外リストへ載せる E2
E5 呼び手の無いエントリポイント・関数を消した E2 で呼び手(Skill の本文・プランの雛形・hook・ほかのスクリプト・CI・テストの外の参照)が 0 と分かった 消した後に呼び手が見つかれば、全体テストか参照切れのチェックが落ちる E2
E6 今の外れを例外リストへ載せた E2〜E5 の後に残った外れ — E2〜E5
E7 構造チェックが変更を見て、契約の一覧の外か例外リストの増加を落とした 手元か CI で構造チェックが走る 落ちた理由(どのファイル・どのキーが一覧の外か)を結果の items に出す E6
E8 子の課題の再現の手順を通し、閉じたか残したかを記録した E7 までを入れた後 再現の手順が課題に無いものは、手順を起こしてから通す。起こせなければ理由を添えて残す E7

用語

用語 意味
エントリポイント 前提 1 の数え上げの規則が拾う、直に起動されるスクリプト。課題の原文の「入口」に当たる
契約の一覧 エントリポイントごとの入力・出力・書く状態・終了コードと、受け渡しのファイル・設定・環境変数の書き手と読み手と置き場を持つ、リポジトリで 1 つの宣言
受け渡しのファイル あるエントリポイントが書き、別のエントリポイントか Skill の手順が読むファイル(状態・記録・結果)。1 つのエントリポイントの中で作って消す一時ファイルは含まない
構造チェック 課題の原文の「構造の検査」に当たる。用語集の語を使う
例外リスト 構造チェックが違反として数えない今の外れを、1 項目 1 ファイルで持つ置き場。項目を足す変更を構造チェックが落とす

受け入れ条件

非機能の条件

大項目 条件
性能・拡張性 契約の一覧の検査を足した後の構造チェックの所要が、手元で 18 秒以内(2026-11-01 の実測 8.8 秒の 2 倍)
運用・保守性 新しいエントリポイントを足す人は、契約の一覧の 1 項目を足すだけで構造チェックを通せる。何を書けばよいかを構造チェックの落ちた理由(items)が示す
移行性 既存の利用者のリポジトリの .ndf/ は書き換えなしで動く(前提 6・受け入れ条件 6)

影響

対象 影響
公開インタフェース エントリポイントのパス・副命令・引数は変わらない。.ndf/ の設定は、1 か所へ寄せた値の置き場が変わる。古い置き場も読み替えで受けるため互換を保つ
データ 契約の一覧(新しい宣言のファイル)が増える。.ndf/ の設定のキーの置き場が変わる(受け入れ条件 5)。利用者のデータの移行は無い
既存の振る舞い 受け入れ条件 5〜8 の片付けの箇所だけ。読む場所を worktree へそろえたエントリポイントは、Pull Request が変えた宣言を読むようになる

検証手段

項目 手段
テスト uv run --frozen --project . --all-extras pytest . -q -n 4
静的解析・構造 python3 scripts/check-script-structure.py・python3 scripts/check-skill-frontmatter.py・python3 scripts/check-markdown-links.py・python3 scripts/check-cross-skill-refs.py
構造チェックの落とし方 契約の一覧に無いエントリポイント・引数・環境変数・設定のキー・受け渡しのファイル、例外リストの項目の追加をそれぞれ 1 つずつ足した木で、構造チェックが落ちることをテストで確かめる
子の課題の判定 子の課題ごとに本文の再現の手順を 1 回通し、結果を受け入れ条件 10 の節へ書く
手動確認 無し(どの受け入れ条件もコマンドで確かめる)

前提とする取り決め

項目 参照先 / 決めたこと
プロジェクト構造 AGENTS.md の「マーケットプレイスの構造」。契約の一覧と構造チェックはリポジトリの検査の置き場(scripts/)か plugins/ndf/ の中に置き、factory/ を参照しない(scripts/check-service-boundary.py)。置き場は設計が決める
コーディング規約 plugins/ndf/scripts/lib/README.md の共通部品と、scripts/check-script-structure.py の不変条件(500 行・同じ本体・同じ名前)。.md の文言を照合するテストは書かない(AGENTS.md)
テスト戦略 構造チェックの規則ごとに、違反を 1 つ入れた木で落ち、外すと通ることを単体テストで確かめる。片付け(受け入れ条件 5〜8)は、エントリポイントを起動するテストで値の読み替えと読む場所を確かめる

境界

区分 内容
常に行う 全体テストと構造チェックを通す。契約の一覧と例外リストを同じ変更でそろえる
確認してから行う .ndf/ の設定の置き場の変更(共通原則 C7。承認ゲート 2 で人が見る)。エントリポイントの削除(承認ゲート 2 で人が見る)
行わない 引数の名前をそろえる・結果の形を変える・核を作る(柱 P1〜P8 の範囲)。子の課題を 1 件ずつ直す Pull Request を作る。plugins/ndf の外のスクリプトに触る

未決

項目 誰が決めるか 期限
契約の一覧の書き方(JSON・JSON Schema・Python の型)と置き場 この課題の設計(#2335 の設計が決めていれば従う) 設計の承認(承認ゲート 1)
構造チェックの規則を既存の check-script-structure.py へ足すか、別のチェックにするか この課題の設計 設計の承認
本番のブランチを worktree.json と project.json のどちらへ寄せるか この課題の設計 設計の承認
引数・環境変数・設定のキーの読みを静的に拾えない箇所(動的なキー・os.environ の走査)の扱い この課題の設計 設計の承認
1 つの Pull Request で入れるか、棚卸し・検査・片付けで分けるか implementation-plan 計画

子の課題の判定

(受け入れ条件 10 の記録の置き場。仕組みを入れた後に埋める)

課題 再現の手順の結果 判定 理由

進行

モード: — / 進め方: auto

  • 要求と受け入れ条件 — 2026-11-01 09:09
  • 作業場所の用意 — 2026-11-01 10:24
  • 設計 — 2026-11-01 09:13
  • 素材の収集と出典の確定
  • ドキュメント再構成
  • ドキュメントレビュー
  • 計画 — 2026-11-01 10:20
  • 実装 — 2026-11-01 10:24
  • 構造改善 — 2026-11-01 11:33
  • 実装レビュー — 2026-11-01 12:12
  • 完了判定 — 2026-11-01 11:02
  • Pull Request — 2026-11-01 11:17
  • 確定仕様化 — 2026-11-01 17:08
  • 後片付け — 2026-11-01 17:07
  • 配布 — 2026-11-01 15:27
  • 体裁レビュー
  • リリース後テスト — 2026-11-01 17:24
  • 振り返り — 2026-11-01 17:44
  • 棚卸し — 2026-11-01 17:49

人の判断待ち(開発ループ lroot)

振り返り: #2367 (comment)

Activity

  1. added 7 commits that reference this issue on Nov 1, 2026
  2. takemi-ohama commented on Nov 1, 2026

    @takemi-ohama
    ContributorAuthor

    リリース後テスト(#2366 (comment) )で不合格だった受け入れ条件 8・10 の残りは #2369 へ移しました。配布した 10.27.7 の不具合ではなく、Pull Request #2362 が範囲外とした残りです。

  3. takemi-ohama commented on Nov 1, 2026

    @takemi-ohama
    ContributorAuthor

    ndf v10.27.7 で配布しました。リリース後テスト(#2366 (comment) )で不合格だった受け入れ条件 8・10 の残りは #2369 へ移したため、この課題は閉じます。

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

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions