Skip to content

プランは値でなく参照を持ち、実行の直前に解決して照合する #2344

Open
1 of 7 issues completed

Description

@takemi-ohama

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

依頼(原文)

この課題の題と本文は、起票者(課題を書いた AI)が 2026-11-01 に大方針 #2335 の組み直しの記録として書いた文で、利用者の指示の原文ではない。この柱の元になった利用者の指示は、#2335 の「依頼(原文)」が引用した次の文である。

異常系処理とログ出力、異常時の回復処理が統一されていないから起こる不具合・課題が多い。1 件ずつ対処してもきりがない

内部データ構造と出力のフォーマットの不統一の影響も大きそう

NDF は Skill の Script 化から発展してきたため、内部データ構造や入出力契約がほぼ整理されていない

出力だけでなく入力もそろえるべき

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

起票時の本文(書き手: 起票者、日付: 2026-11-01):

プランは版・記録の PR・宣言・予算・触るファイル・承認時の先端などを参照で持ち、実行の核がステップの直前に解決して記録する。解決できない・承認した値と食い違うときは流さずに止まる。m26-3 の #2230(記録の PR)と #2164(版数)を最初の事例とし、その形を全体へ広げる。

  1. プランは版・記録の PR・宣言の値を参照で持ち、核が実行の直前に解決する。解決できなければ流さずに止まる
  2. 承認ゲートで見た値(先端・版)と実行時の値の食い違いを核が照合し、食い違えば止まって人へ戻す
  3. 子の課題それぞれを、閉じた(解消を確かめた)か残した(理由つき)かに分けて本文に記録する

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

子の課題の結び付け(書き手: 起票者、日付: 2026-11-01。課題のコメント):

子として #2349・#2354 を結び付けました(スプリント lroot-2 の棚卸し)。

この要求の整理の指示(書き手: AI の起動指示、日付: 2026-11-04):

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

範囲の指示(書き手: 利用者、日付: 2026-11-05。設計の承認ゲート 1 の答え):

範囲を、起きた不具合に根拠のあるものに絞る: 版数・リリース記録の PR の直前の解決(#2164)・実行条件を先に評価(#2349)・流し直しの判定(#2349)・開発ループの版(#2354)。
外すもの: 設定 11 キーと予算を同じ参照の仕組みに載せる部分と、形を決めた設定のハッシュ照合(受け入れ条件 1・11 も合わせて縮める)。

解釈: 利用者が求めているのは、プランを作った時点の値が流す時点で古くなって止まる型の不具合(大方針の原因の型 E「解決の時点」)のうち、起きた不具合に根拠のあるもの(版数・記録の PR・実行条件の評価・完了したプランの流し直し・開発ループの版)を、1 件ずつではなく仕組みで無くすことである。今は #2164 の版の差し込み({release_version})と #2230 の記録の PR の差し込み({queue_record})が、キューの中でそれぞれ別の手当てとして解決している。この柱は、その 2 つを実行の核の参照の部品(#2335 の設計の lib/refs.py)へ寄せ、同じキューの中で解決している前のプランの結果の差し込みと承認したコミットの照合も同じ形に載せる。設定の値と予算は参照にしない(利用者の範囲の指示)。

起票者の推定

題・本文のうち、上の利用者の原文に無く、起票者が推して足した条件。承認ゲート 1 で利用者が確かめるまで、利用者の決定として扱わない。S6〜S8 はこの要求の整理で足した。

# 条件 推した出所 この要求での扱い
S1 プランは版・記録の PR・宣言の値を、値でなく参照で持つ 起票時の本文の受け入れ条件 1・#2335 の受け入れ条件 6 受け入れ条件 1。版と記録の PR だけを参照にし、宣言の値は含まない(利用者の範囲の指示、2026-11-05)
S2 実行の核がステップの直前(持ち主の記録を取った後)に参照を解決し、解決した値を記録する。解決できなければ流さずに止まる 起票時の本文・#2335 の設計の不変条件 I14・ドメインイベント E5 受け入れ条件 2・3
S3 承認ゲートで見た値(先端・版)と実行時の値の食い違いを核が照合し、食い違えば止まって人へ戻す 起票時の本文の受け入れ条件 2 受け入れ条件 4
S4 予算も参照で持つ 起票時の本文「何をするか」・#2335 の原因の型 E の説明 含まない(利用者の範囲の指示、2026-11-05)。予算は今と同じく、プランを組む時点の秒で持つ
S5 触るファイルも参照で持つ 起票時の本文「何をするか」 含まない。触るファイルは、プランを書いた側が宣言する「触る予定の範囲」で、プランの外の状態が変わって古くなる値ではない。触るファイルが絡む課題(#1811・#2037・#2165)は重なりの判定の粒度の問題で、柱 P3(#2342)が残す見込みとしている
S6 解決した値はプランのファイルへ書き戻さず、実行の記録にだけ残す(今のキューは差し込みを埋めたプランでファイルを上書きする) #2349 の「完了の後にプランの JSON が変わったら流し直す」事象。プランを上書きすると、プランが変わったのが人の編集か解決かを区別できない 受け入れ条件 2。誤ると、解決の記録と流し直しの判定(受け入れ条件 7)を作り直すことになるため、問わずにこの案を選んだ
S7 実行条件(プランの 実行の条件)も、ステップの直前に評価する値として参照と同じ段で扱い、--from で始めても先に評価する #2349 の「直したいこと」1 受け入れ条件 6
S8 開発ループ(sprint-state.py loop sprint)が組むスプリントも、版を参照で持つ #2354 の「起票者の推定」1 点目 受け入れ条件 8

目的

前提

対象範囲

含む:

含まない:

ドメインイベント

1 回のプランの実行のうち、参照の解決と照合に関わる部分を時間の順に並べる。右端の列は #2335 のドメインイベントの番号である。

# イベント 引き金 失敗したとき 順序の前提 #2335
E1 プランを参照つきで作った supervise.py new sprint / new close・sprint-state.py loop sprint 参照の形がプランの型に合わない → 作らずに stopped(入力違い、終了コード 2) — —
E2 承認ゲートで人が見た値(承認したコミット・版)を承認の証跡に記録した 承認ゲート 1・2 の承認 記録できない → 承認を成立させない(今の approved_commit.record と同じ) E1 —
E3 ステップの起動で持ち主の記録を取った キュー・supervise.py run・再開の入口 柱 P3 の扱い E2(承認ゲートの後のステップ) E4
E4 実行条件を評価した E3 条件のコマンドが判定できない → stopped。飛ばす条件に当たる → 参照を解決せずに完了 E3。--from の有無によらない E5
E5 参照を解決した E4 で流すと決まった 解決できない(記録の PR が無い・版を読めない・前のプランの結果が無い)→ ステップを流さず stopped E3(並行する実行と同じ版を取り合わない) E5
E6 解決した値を承認ゲートで見た値と照らした E5 で、E2 の記録がある参照 食い違う → gate(人へ戻す) E2・E5 E5
E7 解決した値と出所を実行の記録へ書いた E5・E6 書けない → stopped(#2335 の I3) E6 E5
E8 ステップを流した E7 柱 P1 の扱い E7 E7
E9 同じプランを流し直し・再開した 再開の入口・キューの --resume プランの中身が前の実行の記録と違う、かつ前の実行が完了 → 流さずに gate 前の実行の記録がある E13

洗い出しで移したもの: E1 で参照の形を決める型はプランの型(柱 P6)に置いた(前提 2)。E5 の「流し直しで前に解決した値を使い続けるか」は受け入れ条件 5 に置いた。E6 の「食い違いとみなさない差」は前提 4 に置いた。E9 の「プランの中身の同一性を何で測るか」は未決に置いた。

用語

用語 意味
プランの参照 プランが値の代わりに持つ、値の取り先の名前(例: 次に空いている開発版・この課題のリリース記録を置いた PR・前のプランが出した PR・承認したコミットと照らすブランチの先端)。流す直前に実行の核が値へ解決する。この文書で単に「参照」と書くときはこの意味である
解決の記録 1 回の実行が解決した参照ごとの値と出所。実行の記録(#2335 の P2)の行として残る
承認時の値 承認ゲートで人(か MVV 判定)が承認資料で見た値。承認したコミットと版を含む
版の差し込み 配布のプランが具体的な版の代わりに持つ {release_version}・{release_base}。この柱で参照の 1 種類になる
版の記録 配布のプランの状態ディレクトリの version.json。この柱で解決の記録の 1 種類になる
記録の PR リリース記録(## 配布の記録)を置いた Pull Request
承認したコミット 承認ゲート 2 の承認資料が対象にした、ベースブランチの先端のコミットの SHA
実行条件 プランを流す前に打つコマンド(プランの 実行の条件)。skip_code を返せば完了とする
実行の核 入口・ステップが必ず通る共通の実行の仕組み(#2335 の lib/run_core.py)

受け入れ条件

子の課題

受け入れ条件 11 で、柱の仕組みを入れた後に 1 件ずつ再現の手順を通す。「見込み」は要求の整理(2026-11-04)での見立てで、結論ではない。

課題 何が起きるか(要約) 当たる受け入れ条件 見込み
#2230 まとめのプランを組む時点でリリース記録の PR が決まらない 2・3・9 解消(実装は 10.27.6 で入っている。寄せた後に受け入れ条件を通して閉じる)
#2164 作った時点の版数を持つプランが、並行するスプリントの配布の後に使えなくなる 1・4・5・9 解消(同上)
#2349 --from が実行条件を見ず、--resume が完了したプランを流し直し、差分の無い PR で止まる 6・7 1 つ目と 2 つ目は解消。3 つ目(差分なしの pr)は残す見込み(対象範囲の「含まない」)
#2354 開発ループのスプリントが版を明示の版で持ち、並行するスプリントと版がぶつかると止まる 8 解消

非機能の条件

大項目 条件
性能・拡張性 参照を持たない入口の起動に足す時間は、#2335 の上限 150 ms(核全体)の内側に収まる。GitHub と origin を読む参照は、その参照を持つステップだけが読む(今と同じ)
可用性 解決できないときと食い違うときは、待ち続けずに stopped か gate で返る(受け入れ条件 3・4)
運用・保守性 解決した・解決できなかった・照合した・食い違ったを、実行の記録の行に実行の識別子つきで書く(受け入れ条件 2)
移行性 移す対象: 前提 3 の差し込みと、プランを組む入口が書き込む版と記録の PR の番号。並走: 旧い形のプランは値のまま流す(受け入れ条件 10)。版の記録(version.json)は解決の記録として読む。切り戻し: 参照の段の Pull Request と入口を移す Pull Request を、それぞれ revert すれば前の形へ戻る
セキュリティ 参照が解決する値は版・PR の番号・コミットの SHA・状態ディレクトリのパスで、秘密を含まない。認証・認可(C2)と秘密の扱い(C1)は変えない
システム環境 版の比較は今と同じ versions(optional extras)を使う。extras が無い環境では、核が stopped(終了コード 69)と足りない extras の名前を返す(#2335 の受け入れ条件 15)

影響

対象 影響
公開インタフェース 変わる。sprint-state.py loop sprint の --dev が任意になる(渡せば今と同じ)。承認ゲートの後の食い違いは gate で返る。差し込みの書き方({queue_record} など)は旧い形のプランを読むために次の正式版まで受ける
データ 変わる。プランのファイルは解決で書き換わらなくなり、解決した値は実行の記録に残る。版の記録(version.json)の置き場と形は設計で決める(未決)。利用者の .ndf/ は変えない
既存の振る舞い 変わる。完了の後に変わったプランを --resume すると流さずに止まる。--from でも実行条件を先に評価する

検証手段

項目 手段
テスト uv run --frozen --project . --all-extras pytest . -q -n 4(全体テスト)。参照の種類ごとの解決・解決できない・承認時の値との食い違い・流し直し・旧い形のプランのテスト。#2164・#2230 の既存のテスト
静的解析・構造の検査 python3 scripts/check-script-structure.py
配布物の検証 claude plugin validate .
手動確認(マージ前) #2349 の再現の手順(実行条件を持つプランを --from で始める・完了したプランを含む done を --resume する)を、直した版のスクリプトで 1 回ずつ通し、結果を Pull Request に書く
手動確認 子の課題 4 件の再現の手順を、本番へ出した版で通し、受け入れ条件 11 の表を埋める(リリース後テスト)

前提とする取り決め

項目 参照先 / 決めたこと
プロジェクト構造 参照の部品は plugins/ndf/scripts/lib/ に置く。既定で働くため experimental/ に置かない(AGENTS.md の「安定版と実験版」)。factory/ を参照しない
コーディング規約 AGENTS.md の「最小限のコード実装」と、外部コマンド(git fetch・gh)の挙動を書く前に実行して確かめる決まり
テスト戦略 参照の部品は単体テストで解決・失敗・照合を担保し、プランを組む入口はプランのファイルを読むテストで担保する。子の課題は再現の手順で確かめる。.md の文言を照合するテストは書かない

境界

区分 内容
常に行う #2335 の設計を正として変更する。全体テストと構造の検査を通す。参照の部品へ寄せた差し込みの関数をキューから消す
確認してから行う(承認ゲート 1・2 で人が見る) loop sprint の --dev を任意にする変更(公開インタフェース)。承認ゲート 2 の後の食い違いを gate で返す変更
行わない 子の課題を 1 件ずつ直す Pull Request(「含まない」の例外を除く)。版の規則を変える。利用者の .ndf/ を書き換える。承認時の値との食い違いを AI の判断で見逃す(共通原則の承認の扱い)

未決

項目 誰が決めるか 期限
参照の書き方(今の {queue_record} のような文字列の差し込みを続けるか、プランの型の欄にするか) この柱の設計(柱 P6 のプランの型に従う) 設計 Pull Request
流し直しの判定(受け入れ条件 7)で、プランの中身の同一性を何で測るか(ファイルの sha256・型で正規化した中身) この柱の設計 設計 Pull Request
版の記録(version.json)を実行の記録へ移すか、状態ディレクトリに残して解決の記録から指すか この柱の設計 設計 Pull Request
柱 P3・P6・P8 のマージの前にこの柱の設計を承認したとき、それらの設計が変わった場合の読み直し この柱の設計の担当(前提 2) 実装の開始時

進行

モード: — / 進め方: auto

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

設計の承認ゲート 1 での利用者の指摘(直して出し直す)

(書き手: 利用者の答えをオーガナイザーが写した、日付: 2026-11-05。出し直しの設計はこの節を満たすように直す。満たせない項目は理由を設計に書く。この節は上書きしない)

範囲を、起きた不具合に根拠のあるものに絞る: 版数・リリース記録の PR の直前の解決(#2164)・実行条件を先に評価(#2349)・流し直しの判定(#2349)・開発ループの版(#2354)。
外すもの: 設定 11 キーと予算を同じ参照の仕組みに載せる部分と、形を決めた設定のハッシュ照合(受け入れ条件 1・11 も合わせて縮める)。
あわせて: PR 本文の検査の記述を最新の結果(再検査 exit 0)に直す。
前回の指摘(.ndf/parallel/p3/notes/g2482.md)が反映されていない。同じ指摘で直す。直す箇所を名指しする:

  1. 要求の「予算も参照で持つ」と、宣言の値・予算の秒を参照で持つ部分を消す。受け入れ条件 1 と 11 を、版数・リリース記録の PR の直前の解決(スプリントのプランが作った時点の版数を配布と本番のプランへ書き込み、並行する別のスプリントがその版を先に出すとプランを作り直すまで止まる #2164)・実行条件を先に評価(queue の再開が、取り込み済み・完了済みの実装のプランを流し直し、差分なしの PR 作成で止まる #2349)・流し直しの判定(queue の再開が、取り込み済み・完了済みの実装のプランを流し直し、差分なしの PR 作成で止まる #2349)・開発ループの版(開発ループのスプリントが版を流す時点に決められず、並行するスプリントと版がぶつかると止まる #2354)だけに縮める
  2. 決定 4(設定 11 キーと予算を参照の仕組みに載せる)を「採らない」にする
  3. 設計の不変条件 I3・I7(形を決めた設定のハッシュ照合で止める)と、それを前提に足した手当て(「設定の照合の後に置く」)を消す
  4. PR 本文の検査の欄を最新の結果(要求の再検査 exit 0、ドキュメントレビューの結果)に、行数を今の値に直す

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

Activity

  1. takemi-ohama commented on Nov 1, 2026

    @takemi-ohama
    ContributorAuthor

    子として #2349・#2354 を結び付けました(スプリント lroot-2 の棚卸し)。

  2. added 11 commits that reference this issue on Nov 4, 2026
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