Skip to content

Release: ndf v10.27.6 を main へ - #2352

Merged
takemi-ohama merged 54 commits into
mainfrom
develop
Nov 1, 2026
Merged

takemi-ohama merged 54 commits into
mainfrom
develop

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

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

🤖 Generated with Claude Code

takemi-ohama and others added 30 commits November 1, 2026 00:33
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
確定仕様化: スプリント m26-2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 設計文書 issues/issue-2164-design.md(398 行)
- 用語集へ「版の差し込み」「版の記録」「明示の版」を足し、docs/glossary.md を作り直す

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
持ち越した課題を 2 つのスプリントで閉じる PR を出すと、最新の記録を採る規則では別のスプリントの記録を選び、
sprint-close.py が対象外の課題まで閉じる。まとめの課題すべてを閉じる PR を含む記録に限り、
スプリントの並びが 2 通り以上残れば見つからない扱いで止める。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 閉じる PR を持たない課題が混ざったまとめで毎回止まらないよう、I5・手順 2/5・決定 2 を直す
- 手順 2 で課題ごとの閉じる PR の対応を保つことを明記する
- RecordHit に ambiguous(記録の PR と スプリント: の集合の組)を足す
- テスト設計に 2 行を足す

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
まとめの close: どのリリースの経路でも、まとめを流す時点でリリース記録の PR を見つけて課題を閉じる(#2230)
スプリントの配布: 版数を配布のステップを流す時点に決め、並行するスプリントが先に版を出してもプランを作り直さずに出せる(#2164)
- sprint_close_lib/record_find.py を新設。まとめの課題を閉じる PR とそれを参照する PR から、
  段階が本番か配布なしで、スプリント: が閉じる PR を含むリリース記録の PR を 1 本決める。
  2 つ以上のスプリントにあれば特定できないとして採らない
- queue_fill が {queue_record} を埋め、見つからなければ計画を書き換えずに流さない(unfilled)。
  plan.QUEUE_NAMED に {queue_record} を足し、run でも残れば止まる
- sprint_routes.record_pr_ref は unknown を組まず、merge・手で届ける・検証の環境だけ・
  手動反映の本番系と開発ループのまとめで {queue_record} を返す。雛形と昇格は今のまま
- 開発ループの承認ゲート 2 の後のまとめへ values.pr を渡さない。差し込みを埋められずに
  流さなかった計画のある周回は失敗で締める
- dist_record.released を足し、sprint-close.py と共有する(振る舞いは変えない)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2230 を実装する(スプリント m26-3)
版の判定を lib/release_version.py に置き、bump は書き換える前に origin のベースブランチの版と
タグを読む。ベースブランチの版以下・既にタグのある正式版は終了コード 3、読めなければ 2 で止める。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
new sprint / new close の --version・--prod を任意にし、--level を足す。雛形は版が無ければ
{release_version}・{release_base} を書き、プランへ「版」の欄を置く。bump は 2・3 で judge を通らずに止める。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
開発版は origin から次に空いている版を決め、記録の版が自分の配布の前に別のスプリントに出ていれば
決め直す。本番は開発版の記録の base で出し、タグがあれば止める。埋められなければ項目の version に理由を載せる。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bump は自分の作業場所の位置を渡す。キューの差し込みを通すテストは差し込みを差し替え、
origin を読む bump のテストは bare の origin を用意する。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2164 を実装する(スプリント m26-3)
…_sprint

manifest のステージ配列から queue と pipeline の文字列を組む部分を sprint_pipeline として抽出した。
手で行うステージの有無による 2 つの経路の文字列を現状固定テストで固定した。

Item-Id: I-001
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d_find.py#find_record

閉じる PR の収集(_closers_of)・候補の展開(_candidates)・記録の読み取りと振り分け(_released_records)を
それぞれ抽出し、find_record には順に呼ぶ流れと RecordHit の組み立てだけを残した。

Item-Id: I-002
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
takemi-ohama and others added 20 commits November 1, 2026 05:55
…e2_answer

承認と差し戻しの時系列から最新の答えを選ぶ部分を latest_gate2_answer(gates, rejections, since) として
抽出した。gate2_answer には状態ファイルと差し戻しログを読み、同じ周回・関門 2 の差し戻しに絞る部分だけを残す。
fresh と EPOCH の規則、同じ時刻は承認を採る順序、JsonReadError を空とする扱いはそのまま。

Item-Id: I-004
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ng_blocker

kept_all を段階的に上書きする if/elif 連鎖を、配布の段階から閉じられない理由を返す _stage_blocker と、
リリース後テストの記録から (理由, verdicts) を返す _verify_verdicts に分けた。_closing_blocker は
_stage_blocker → (理由が無く、リリース後テストを見るとき) _verify_verdicts の 2 段だけにした。

Item-Id: I-005
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ue_fill.py#_fill_dev

記録がある開発版の確かめ直し(出ているか → 自分の配布か → 明示か → 決め直し)を
_recheck_dev へ抽出し、早期 return で入れ子を平らにした。_fill_dev は記録の有無で
2 つの経路を選ぶだけになる。振る舞いは変えない。

Item-Id: I-006
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
タグの無い正式版がベースブランチの版以下のときに終了コード 3 で止め、次に空いている版を
ベースブランチの次のパッチとする経路を固定する(既存テストが通っていなかった経路)。

Item-Id: I-007
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…on.py#bump_check

old == new のときの打ち直しの判定を _rerun へ、止めるときの既に出ている版と次に空いている
版の組み立てを _taken_stop へ抽出した。bump_check は形の検査 → 観測 → 打ち直し →
書き換えてよいかの判定 → 止める理由の直線になる。振る舞いは変えない。

Item-Id: I-007
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…_sprint

まとめの queue のコマンドの組み立て(gate2_pipeline・sprint_pipeline・continuation の 3 か所)を
sprint_loop_gate.queue_command へ抽出し、--max 3 を QUEUE_MAX にまとめた。
止まった記録を stops へ移して running に戻す 2 行(resume_stopped と cmd_sprint)を
resume_record へ抽出した。出力の文字列は変わらない。

Item-Id: I-008
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…elease

開発版の PR の使い回し・作成とマージを _merge_release_pr へ、本番の PR の作成と承認した先端を
指定したマージの再試行(HEAD_MOVED_RETRIES・承認ゲートでの停止)を _merge_prod_pr へ抽出した。
cmd_release は前提検査・push・各段階の呼び出し・タグ公開・結果の組み立てを担う。
副作用の順序と出力は変わらない。

Item-Id: I-009
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
抽出でファイルが 1266 行になり、構造検査の例外リストの上限(1252 行)を超えた。振る舞いを変えずに
行数を詰めた: 本番の PR の題・本文を変数へ置いて create_pr の呼び出しを 1 行にし、抽出先の docstring を
短くし、ver の一時変数と cmd_release の空行を外し、マージコミットの補完を `or` にした(git は
merge が空のときだけ呼ばれる点は同じ)。1251 行。

Item-Id: I-009
Impl-Runtime: claude
Impl-Model: default
…#cmd_queue

then からステージの並びとすべてのプランを作る部分を _normalize_stages へ、
宣言の読み取り・done の初期化・知らせ始める位置と前の一覧の読み取りを
_prepare_queue へ抜き出した。cmd_queue は正規化 → 準備 → 起動 → 待ちの流れになる。
durable の import は本体に残す。

Item-Id: I-010
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Item-Id: I-011
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…loop.py#resume_stopped

止まった理由ごとの再開の振る舞いを if-elif の連鎖から、理由ごとの手続き(_resume_mvv_changed /
_resume_user_stop / _resume_budget / _resume_gate2 / _resume_refused)と対応表へ移した。
手続きは (止まったままの結果 or None, 次のコマンド) を返す共通の形にそろえ、budget_* は接頭辞で引く。
resume_stopped は対応表を引いて手続きを呼び、再開の共通の後処理だけを持つ。振る舞いは変えない。

Item-Id: I-011
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
対応表への置き換えで sprint_loop.py が 541 行になり、構造検査(500 行)を超えた。
承認ゲート 2 の答えの読み取りと承認後の続き(EPOCH / gate2_answer / latest_gate2_answer /
gate2_pipeline)を新しいモジュール sprint_loop_gate2.py へ移し、sprint_loop から読み込む。
再開の手続きは sprint_loop の名前空間の gate2_answer / gate2_pipeline を引くままで、振る舞いは変えない。
使われなくなった import を外した。

Item-Id: I-011
Impl-Runtime: claude
Impl-Model: default
「版」と「実行の条件」を持つ配布のプランは、queue の差し込みで版を照会する前に条件を打つ。
配布不要(skip_code)なら版を照会・差し込みせずに流し、engine が条件を打ち直して完了で終える。
明示の版が既出でも unfilled で止まらず、まとめ・課題のクローズへ進む。
条件の実行は engine と queue で共有する run_condition(steps.py)へ寄せた。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
最終の検査で変更があると、出し終えた版が既出として止まり、まとめと周回が失敗で締まっていた。
まとめの配布の版は流す時点に次に空いている版で決める。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@takemi-ohama
takemi-ohama merged commit 99bbac1 into main Nov 1, 2026
39 checks passed
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

振り返り(2026-11-01)

対象: issue #2230 / issue #2044 / issue #2121 / issue #2164 / スプリントの PR #2348 / 本番の PR #2352(配布の記録は PR #2351)

スプリント m26-3 は、まとめの close が読むリリース記録の PR を、プランを組む時点でなく流す時点に解決するようにした(#2230。#2044・#2121 は設計で #2230 へ取り込んだ)。あわせて、配布のプランが作った時点の版数を持たず、流す時点に版を決め、並行するスプリントが先に版を出しても作り直さずに出せるようにした(#2164)。pace: auto で流し、v10.27.6 として本番へ出した。リリース後テストは受け入れ条件 24 件がすべて合格(うち 3 件はテストだけで確認)、保留 7 件は並行するスプリントか別の配布の経路が流れるまで実施できない。

何が起きたか

観点 事実
受け入れ条件 開始前に #2044・#2164 へ受け入れ条件を足し、#2230 の「完了条件」を「受け入れ条件」にした。承認ゲート 1 で #2164 に条件 5(自分の配布のマージまで版を決め直す。利用者が案 B を選んだ)を足した
手戻り 設計 PR 2 本(#2332・#2331)はどちらも承認ゲート 1 で人へ戻った(#2332 はレビューの行き来、#2331 は版の規則の変更 P1 に当たる可能性と委ねた選択)。検査(PR #2348)はレビュー 2 ラウンド・指摘 1 件を直し、構造改善は 11 件採用・0 件差し戻し、時間内に入らなかった 13 件を見送った
見落とし 設計の結果の表に「#2044・#2121 を #2230 へ取り込む」が書かれず、2 本の実装のプランが「直す場所が #2230 と全部重なる」で止まった。conductor がプランへ 取り込み先 と 実行の条件 を手で足した
工程(手当て) 実装の再開(--from impl-2044=impl)が実行の条件を見ずに流れ、完了済みの #2230 のプランまで流し直して 3 本とも差分なしの PR 作成で止まった(約 24 分・$0.89)。--resume も完了したプランを流し直したため、残りのステージを新しいキューで流して回避した(#2349 として起票。#2325 と同じ型の 2 度目)
工程(手当て) まとめのプランの確定仕様化のプロンプトへ、主ディレクトリで作り直した .ndf/project.json を写す指示を手で足した。確定仕様化のステップは、その写しが issues と ndf_policies を null にしていることに気づいて写さなかった。原因は project-decl.py write が答えなしで既存の値を「不明」にすることで、#2355 として起票した。主ディレクトリの .ndf/project.json の差分は未コミットのまま残っている
範囲 リリース後テストが、設計で起こすとしていた課題(開発ループからは流す時点の版を選べない)が起票されていないことに気づき、#2354 として起票した

検査の記録の集計と閾値

check-trigger.py stats --root /work/ai-plugins(10.27.5)の結果:

数 値
トリガーの評価(eval)・立った回数 0 回・0 回
検査(すべて PR を指す検査) 34 回(このスプリントの分は PR #2348 の 1 回)
落ちた検査 23 回(このスプリントの分は 0 回)
PR #2348 の検査の指摘 review: ラウンド 2・指摘 1・直した 1・見送り 0。構造改善: 採用 11・差し戻し 0
検査の後に逃げた不具合 0 件(結び付いた 0)

閾値(.ndf/pace.json の triggers: score 10・common_weight 2・lines 3000・escapes 1・hours 24)は変えない。 このリポジトリのスプリントは pace: auto の PR ごとの検査だけで回り、トリガーの評価が 0 回のため、閾値が効いた実績も外れた実績も無い。逃げた不具合 0 件も、--escape-of 以外で直した不具合を数えない記録の形では「逃げていない」の根拠にならない。測らずに変えない(Value 3)。材料が溜まらない問題は #2300 が持っており、今回の集計を本文へ追記した。

context window の大きさ

conductor の 2 セッション(スプリントの開始〜実装、再開〜本番とまとめ)を束ねた。どちらも同じ会話でマイルストーン 26 の他の作業(m26-2 のまとめ、課題の組み直し)も行っている。

層 フェーズ モデル 件数 固定費の中央値 実作業の中央値 実作業 < 固定費 最大充填の最大 目印
conductor - claude-opus-5-5 2 43282 234140 0 415688 割る候補
supervisor その他 claude-opus-5-5 7 38455 47552 1 107371
層 件数 固定費の合計 実作業の合計 総消費
conductor 2 86565 468280 554845
supervisor 7 270587 373487 644074
合計 9 357152 841767 1198919
フェーズ supervisor supervisor の実作業 worker の件数 supervisor と worker の固定費の合計 目印

用語集の変化

コンテキスト 足した語 廃止した語 意味を変えた語
ndf-workflow 記録の PR・版の差し込み・版の記録・版の決め直し・明示の版 無し 記録の置き場が分からない(まとめのプランは組まず、手で打つ入口と前の版のプランだけが渡す)

承認ゲートの差し戻し

関門 1・関門 2 とも 0 件(gate-rejections.py count --sprint、記録あり)。関門 1 は設計 2 本が人へ戻り、利用者は 2 本とも承認した(差し戻しではない)。関門 2 は MVV 判定「従う」で通った。

MVV を見直すか

project-mvv.py signals(版 3):

兆候 件数 閾値
覆し 6(従うを退けた 0・判定できないを通した 6) 3
判定できない 1(続けて 0 回) 5(続けて 3)
流出不具合 0 3

覆しが閾値を超えたままである。改訂するかは利用者の答えを待つ(この工程は無人で回しているため問えていない)。このスプリントで増えた 1 件は承認ゲート 1(2026-11-01 11:39 JST)で、判定できなかった理由は、設計が利用者に委ねた選択(#2164 の版の決め直しの範囲)と、版の規則の変更 P1 に当たる可能性だった。どちらも人へ戻すのが設計どおりの振る舞いで、MVV の方向の誤りを示さない。m26-2 の振り返りの推奨(#2296 の Mission の改訂を進める、委ねた選択で戻った回を覆しに数えるかを同じ判断で決める)は変わらない。

次に変えること

変えること 落とし先 状態
設計で課題を取り込んだら、設計の結果の表と実装のプランへ取り込み先と実行の条件が自動で入るようにする(今回は conductor の手当て。1 度目なので記録だけ残し、2 度目で雛形への課題を起こす。Value 4) supervise.py の設計の結果(design-results) この記録に残した(1 度目)
キューの再開が、実行の条件と完了したプランを見ずに流し直す supervise.py queue #2349 として起票(#2325 と同じ型の 2 度目)
project-decl.py write が答えなしで既存の宣言を「不明」にする project-decl.py #2355 として起票
検査の記録が閾値を見直す材料を持つようにする check-trigger.py と pace.md #2300 へ追記(既存)
Mission を 2 つのランタイムへの配布に合わせて改訂する プロジェクトの取り決め(.ndf/mvv.md) #2296(既存)。利用者の承認待ち

途中で起票した課題

番号 何を見つけたか 見つけた場面
#2349 キューの再開が取り込み済み・完了済みの実装のプランを流し直し、差分なしの PR 作成で止まる 実装中
#2354 開発ループのスプリントが版を流す時点に決められない(設計が起こすとしていたが起票されていなかった) リリース後テスト
#2355 project-decl.py write を答えなしで打つと既存の issues・ndf_policies が null になる 振り返り

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