Skip to content

Release: ndf v10.27.1 を main へ - #2267

Merged
takemi-ohama merged 107 commits into
mainfrom
develop
Oct 31, 2026
Merged

takemi-ohama merged 107 commits into
mainfrom
develop

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

ndf v10.27.1 を main へ出す(開発版の PR #2266)。

🤖 Generated with Claude Code

takemi-ohama and others added 30 commits October 30, 2026 22:19
承認の証跡を読む lib/gate_answer.py を足した。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
release-steps.py approve に --facts-from / --answer-from を足し、開発版の facts の出力の SHA と
承認ゲート 2 の利用者の承認の記録を照らしてから書く。new release に --dev-state と --state を足した。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
queue が <done>.plans.json へステージの並び・--max・開始のステップを書き、--resume がそれを読む。
{queue_pr:<名>} は関門で終えたプランの Pull Request からも埋める。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 設計 PR のマージのステージ(design-merge-<N>。approved → merge-gate → merge)を置き、設計の結果から配布までを
  その command の --then でつなぐ。承認の証跡は supervise.py design-approved が確かめる
- 目録の command に --done を書き、resume を queue --resume <done> の 1 つにそろえる
- new sprint --absorb <課題>:<取り込み先> を足し、組み立ての後に 1 か所で当てる。design-results は書き出しの取り込みを保つ
- 承認ゲート 1・2 の文を承認の証跡の記録とキューの形に書き直す

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1426 を実装する(スプリント m1426)
- WEB_TOOLS(WebFetch・WebSearch)を WORK_TOOLS と FULL_TOOLS の両方へ足す
- 取得できなかったら URL と理由を書いて「判断が要る」で終える取り決め(EXTERNAL_DOC_RULE)を WORK_SYSTEM と FULL_SYSTEM へ入れる
- full のステップの起こし直しは、報告が「判断が要る / できなかった」なら行わずに失敗にする

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Docs: #2171 の契約と進捗の受け口を確定仕様にする
容量の宣言が無いとき、candidates_of は先頭から max_issues 件を候補にしていた。
棚卸しの順位の上位が人の判断待ちだと、その後ろの課題が候補に上がらず
outside_mvv で止まっていた(ループ l20261031 の 1 周目)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KYHP7yNPSvFoLre7peyGvL
#1698 を実装する(スプリント m1426)
…意し、psutil の無い python3 でも進む(#1455)

call_llm_json が supervise_lib.claude を読む前に require を呼ぶ。decl_models も pydantic を読む前に schema を宣言する。
psutil の無い python(-S)で propose / vet が起動し直して LLM を呼び、check / collect は起動し直さないことをテストで縛る。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fix: 開発ループの選定で判断待ちの行が枠を埋めない
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
承認ゲートの外の AskUserQuestion を hook で止める課題の受け入れ条件(AC1〜AC15)を課題の本文へ書き、
写しを issues/ に置く。共通原則の C1〜C8・P1 に当たる問いは宣言で外せない区分にする(起票者の推定 S4 の一部を採らない)。
用語集へ「問い合わせの区分」「問い合わせの宣言」「代わりの判断」を足す。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
広げた require-groups が落とす 18 本は、既に require を呼ぶ位置へグループを並べて直す(設計の決定 4 の形 1)。
引数・出力・終了コードは変わらない。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…1455)

require の覆う範囲(最上位・関数の中・main の先頭)と任意の依存(except ImportError・find_spec / importable の枝)を見る。
hook の経路は hook-deps に任せる。require を呼ばない 11 本・21 件は理由つきで例外リストへ載せる。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AskUserQuestion の metadata.source を区分として hook が判定し、区分の無い問いを止めて AI に決めさせる設計を issues/ に置く。
判定は lib/ask_policy.py の純粋な関数にして relay の question open と共有し、記録は状態の置き場の ask.jsonl 1 本にする。
レッドラインは ndf-ask:redline:<番号> の外せない区分にし、hook で止めるのは Claude Code だけにする(Codex・agy は未確認)。
Skill とエージェントの問い合わせの書き換えの一覧(43 行)は別のファイルに分けた。用語集の 2 語の意味を直し「問い合わせの記録」を足す。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 設計文書を 3 本に分けた(本体・入出力の契約とテスト設計・決定の記録。計 680 行前後)
- #2216 の照合は実行ジョブの token に repo を載せて受け口で照らす形にした
- AI が代わりに判断した問いと答えは新しい種類 decision.delegated で送る
- 打ち切りの時間は過去 7 本のスプリントの実測(最大 18,031 秒)から 8 時間、token の期限は 9 時間
- 用語集へ 4 語(実行の枠・見回り・代わりの判断・候補の証明)を足した

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
takemi-ohama and others added 25 commits October 31, 2026 03:48
…wer.py#GATE_1

承認ゲートの記録の名前「関門 1」「関門 2」を gate_answer.GATE_1 / GATE_2 に置き、
release_lib/approval.py・supervise_lib/design_merge.py・sprint.py・release_templates.py・
sprint_waves.py・sprint_routes.py・mvv-gate.py の文字列をこの定数へ置き換える。
design_merge.py の GATE_1 の定義は消し、gate_answer から読み込む。値は変えない。

Item-Id: I-003
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2186 を実装する(スプリント l20261031-2)
#2206 を実装する(スプリント l20261031-2)
…y#main

main の副命令ごとの if 連鎖を、副命令 → 処理の対応表(COMMANDS)へ寄せた。
引数の定義は build_parser(sub) へ切り出し、表に乗らない前処理を持つ new・queue・wait・example は
個別のハンドラ(_cmd_*)へ抽出した。振る舞いは変えていない。

Item-Id: I-004
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
手順のスクリプトの結果: 欠け・未収束・未記録を ok と読ませず、過程と判断を同じ形で残す(#2227)
- design_merge: gh のラベルを JSON の配列として読み、design-approved と完全一致する要素だけを承認の証跡にする
- queue_resume: done がある場合も前の起動の starts を保ち、完了済みプランが元の関門の結果を拾わないようにする

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
--dev-state を省いた単発の new release --channel prod では {queue_state:release} が開発版のプランに
一致せず、queue は --facts-from '' で exit 2、run は置き換わらない文字列のまま必ず止まっていた。
空の --facts-from も facts の経路で扱い、資料に一致する承認の記録が既にあれば書かずに通す(#1426 の決定 7)。
無ければ --dev-state を渡す手を next に示して承認ゲート(10)で返す。空の置き場は作業場所を読まない。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- NDF の導入名を取得元の marketplace.json の name から決め、導入コマンドの失敗で止める。スクリプトは版を固定した写しから読む
- 子の環境から INGEST_TOKEN を外す
- AWS ロールの資格を credential_process のファイルで渡し、動いている間 30 分ごとに引き受け直す
- 代わりの判断を ask_ledger.py の ask.jsonl(kind: decision)から読む
- resume では復元したログの末尾から読み、前のジョブの行を送り直さない
- supervise のステップの行にモデルごとの使用量を足し、usage.recorded へ取り込む
- 棚卸しの順位の表を upkeep_rank_table.py の形で読み、題を GitHub から引く
- 導入とリポジトリの一覧を最後のページまで読む
- チームの月の token を席の利用者の分だけ数え、開始 1 回に 1 度だけ数える
- ECS の STOPPING / DEPROVISIONING を停止完了と扱わない

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 続ける対象(前の結果か --from)は、同じ開始のステップでも関門で終えた記録を終わりとせず流し直す
- --absorb の取り込み先が --issue に無ければ(実装のプランが無い)計画を書かない

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
script-structure-check の失敗(502 行)を直す。step_line の任意のキー(pr・out・models)を 1 行へまとめた。出力は変わらない。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ランナーが読む GET /run-jobs/approval-requests/{id}/answer を runs.yaml と確定仕様に書き、sprint.json は復元した状態から求める
- リポジトリの画面は実行の一覧を 1 回だけ取り、リポジトリごとに分ける
- GitHub の読み取りは登録の repositoryId に絞った導入の token を使い回し、全リポジトリへ届く token を作らない
- decision.delegated の category を ref の判定の行の source から埋める
- 順位の表から作る候補も MAX_ISSUES で切る

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- release_lib: 再開で NN が 01 に戻るため、最後に書かれた出力を last_out で 1 つ選び、
  approve_from_facts は SHA と時刻をその出力から読む
- design_stage.rewrite: --absorb 由来の取り込み先が設計の結果で閉じる・取り込まれるなら書き換え前に止める

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 承認の答えはスプリント状態ファイル(目録の sprint.json と形で見分ける)へ「関門 1 / 関門 2」の名前で書き、差し戻しは理由とともに conductor の再開の指示へ渡す
- step 行の pr から Pull Request の参照を取る
- local では利用者が手元で設定したモデルの資格を子へ渡す
- ジョブの確定は実行と枠を先に移し、ジョブを終わりにするのを最後にして、途中で止まっても見回りがやり直せるようにする

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- StateRejectedError の parameter property を通常のフィールドへ変え、Node 24 で直接動かせるようにする。tsconfig に erasableSyntaxOnly を足す
- conductor の claude -p に supervise_lib/claude.py と同じ Tool の許可を付ける
- gh と git の認証をジョブ専用の置き場(GH_CONFIG_DIR・GIT_CONFIG_GLOBAL)へ分け、利用者の設定を書き換えない
- NDF の worktree をジョブの作業場所の下へ置き、代わりの判断はこのジョブの cwd の行だけを送る
- managed の月間上限は managed の実行だけを数える
- conductor の使用量の送信と実行中の poll を待ってから返す

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	plugins/ndf/skills/development-workflow/references/waiting.md
@takemi-ohama
takemi-ohama merged commit 584b6d6 into main Oct 31, 2026
44 checks passed
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

振り返り(2026-10-31)

対象: スプリント l20261031-2(周回 2)。issue #2206 / issue #2186 / issue #2216。スプリントの PR は PR #2250、正式版への配布は PR #2267(ndf v10.27.1。m1426 の分と一緒に出した)、確定仕様化は PR #2271。

ここでは 3 つを作った。承認ゲートの外の問い合わせを hook で止めて AI に判断させる仕組み(#2206)、NDF Factory のスプリントの実行の制御とランナー(#2186)、ランナーが申告する Pull Request を実行のリポジトリと照合する仕組み(#2216 の決定 1〜5)である。進め方は pace: auto、モードは standard。周回 1 は承認ゲート 1 の判断待ち 3 件(outside_mvv)で人へ戻した。利用者が承認した後、周回 2 で実装からまとめまでを通した。

何が起きたか

観点 事実
見落とし #2216 の決定 6〜12(受け入れ条件 11〜20)が実装されないまま、検査・承認ゲート 2・本番の配布を通った。 設計の結果は #2216 を 取り込む(取り込み先 #2186)とし、doc に #2186 の設計を入れた。一方で unread: [2216] も残っていた。#2216 の実装のフェーズは「実行の条件に当たらない」で 完了 を返した。欠けに気づいたのは、まとめの確定仕様化の worker である。#2216 は閉じずに残し、確定仕様は照合の部分の下書き(コミットしない)で止めた → #2274
手戻り PR #2250 の cross-review は上限の 4 ラウンドで終わった(final=max_rounds)。指摘 39 件のうち 27 件を直した。残る 12 件はラウンドをまたいで繰り返された設計判断 4 件で、#2258 へ持ち越した
手戻り 検査(PR #2250)の refactor が 3 回落ちた。原因は、着手前のテストに 663.8 秒かかって想定最大時間 30 分に収まらなかったことである。4 回目で通った
手戻り まとめの PR #2271 のマージが、衝突(DIRTY)と doc-line-limit-check の失敗で 2 回止まった。確定仕様の文書を分けて通した(3480a260)
受け入れ条件 周回 1 で #2206 の本文が要求を ### で入れ子にしており、new sprint が止まった。本文を平らにし、写しを直した(#2245)。原因は #2246
受け入れ条件 承認ゲート 1 の MVV 判定 3 件のすべてが、requirements-check の exit 2(要求の文書を書く前に打った)を「材料の欠け」と読んだ → #2237
範囲 #2216 を #2186 へ取り込んだ。#2186 の設計の未決を #2216 の決定 1 が先に決めた
工程 リリース後テストは「配布の記録の PR が #0」として何も確かめずに 完了 を返した。本番への配布は PR #2267 として別に行われている

検査の記録と閾値

check-trigger.py stats の出力(リポジトリ全体の検査の記録。2026-10-25〜10-31)は次のとおりである。

項目 値
トリガーの評価(eval) 0 回(立った 0)
検査 20 回(すべて PR を指す検査)
うち落ちた 14 回(refactor で 10・場所が不明 4)
検査の後に逃げた不具合 0 件(結び付いた 0)

PR ごとの指摘の件数(マージに至った回)は次のとおりである。

PR ラウンド 指摘 直した 見送り 構造改善の採用 / 取り消し
#2152 1 0 0 0 14 / 0
#2192 4 5 5 0 3 / 0
#2209 2 2 1 1 0 / 3
#2247 4 7 7 0 4 / 0
#2250(このスプリント) 4 39 27 12 記録なし

トリガーの閾値(.ndf/pace.json の triggers: score 10・lines 3000・escapes 1・hours 24)は見直さない。 eval が 0 回で、閾値で判定した検査が 1 回も無いためである。このリポジトリは pace: auto で回しており、検査をスプリントの PR ごとに通している。逃げた不具合も 0 件で、閾値が緩すぎる兆しも無い。閾値は pace: fast で eval が記録されてから測って決める(Value 3)。

見直しが要るのは、トリガーの閾値ではなく構造改善の予算である。 落ちた 14 回のうち 10 回は refactor が予算に収まらなかったもので、同じ形の失敗が 4 本の PR(#2152・#2192・#2247・#2250)で繰り返されている。#2250 では着手前のテストだけで 663.8 秒かかった。既存の #2202(予算を「実装に使える時間」で指定し、固定でかかる時間を実測から足す)と #2047 がこれを扱う。繰り返しの回数を根拠に、棚卸しで順位を上げる(Value 10)。

逃げた不具合 0 件は、検査が見逃さなかった証拠にならない。 #2216 の決定 6〜12 の欠けは検査の後で見つかった。しかし「不具合」ではなく「実装されなかった受け入れ条件」なので、escape には記録されていない。

context window の大きさ

測定は conductor のセッション 1 つ。supervise.py が起動した claude -p の worker は、このトランスクリプトに入らないため数えていない。

層 フェーズ モデル 件数 固定費の中央値 実作業の中央値 実作業 < 固定費 最大充填の最大 目印
conductor - claude-opus-5-5 1 42442 166483 0 208925 割る候補
supervisor その他 claude-opus-5-5 1 39353 143513 0 182866
層 件数 固定費の合計 実作業の合計 総消費
conductor 1 42442 166483 208925
supervisor 1 39353 143513 182866
合計 2 81795 309996 391791
フェーズ supervisor supervisor の実作業 worker の件数 supervisor と worker の固定費の合計 目印
(記録なし)

承認ゲートの差し戻し

gate-rejections.py count(周回 1・周回 2 の状態ファイル、PR #2233・#2234・#2236、issue #2216)の結果は、関門 1 が 0 件、関門 2 が 0 件である。

ただし記録が欠けている。 引き継ぎ文書には「#2233 は差し戻しの後に書き直した」とあるが、どの状態ファイルにも差し戻しの記録が無い。実際の件数は関門 1 で少なくとも 1 件(#2233 の設計)である。既存の #2183(差し戻しの記録し忘れに気づけず、振り返りの件数が 0 になる)と同じ形で、このスプリントを由来として 1 行足した。

MVV を見直すか

project-mvv.py signals(版 3)の結果は次のとおりである。

  • 覆し 2 件(閾値 3)
  • 判定できない 1 件(閾値 5)、続けて 1 回(閾値 3)
  • 流出不具合 0 件(閾値 3)

閾値を超えた兆候が無いため、見直さないと AI が決め、ask.py decide で記録した(id 67c3064d354c)。

次に変えること

変えること 落とし先 状態
取り込み(absorb)の後に、取り込み先の実装プランが、取り込まれた課題の受け入れ条件をすべて持つかを機械で突き合わせる。unread が残る設計の結果は実装へ進めない development-workflow の設計の結果と new sprint --absorb の手順 #2274 として起票
構造改善の予算を、着手前のテストの実測を足した形にする(refactor の落ち 10 回の主因) cross-refactoring の手順 既存の #2202・#2047。棚卸しで順位を上げる
承認ゲートの差し戻しを、会話の外でも状態ファイルへ残す development-workflow の承認ゲートの手順 既存の #2183 へ由来を追記
トリガーの閾値 .ndf/pace.json 変えない(eval 0 回で材料が無い)

途中で起票した課題

番号 何を見つけたか 見つけた場面
#2237 承認ゲート 1 の MVV 判定が、要求の文書を書く前の requirements-check の exit 2 を材料の欠けと読む 承認ゲート 1
#2246 要求の工程が ## 受け入れ条件 の節を持たない本文を通す 周回 1 の new sprint
#2239 起票先のリポジトリの流儀に従って起票する(#2233 から分けた) 設計の差し戻し
#2251 周回 l20261031-2 の範囲に構造改善を通す(持ち越し) 検査
#2258 PR #2250 のレビューで、設計の判断が要る指摘 4 件の持ち越し レビュー中
#2270 確定仕様化で見つけた文書と実装の食い違い 8 件(用語集の未実装の語 4 つを含む) 確定仕様化
#2274 #2216 の決定 6〜12 が取り込み先の実装から落ちたまま完了になった 振り返り

issue-file.py by-origin が拾ったのは #2237・#2258 だけである。#2246・#2239・#2251・#2270 は引き継ぎ文書・課題の本文から突き合わせて足した。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant