Skip to content

Release: ndf v10.22.0 を main へ - #2139

Merged
takemi-ohama merged 52 commits into
mainfrom
develop
Oct 25, 2026
Merged

takemi-ohama merged 52 commits into
mainfrom
develop

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

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

🤖 Generated with Claude Code

takemi-ohama and others added 30 commits October 25, 2026 01:24
雛形の経路で本番のブランチがあれば、配布の後に「関門 2」(gate)と「本番」(release-prod、
then_of なし)を置く。本番のプランは plan_sprint_release にチャネルと版を渡して組み、
出す PR は {queue_pr:check}、MVV 判定は置かない。承認ゲート 2 の文は関門 2 の gate へ移し、
本番のブランチが無いときは今のまま配布で終えて next に理由を書く。
sprint.py の 500 行の上限のため、利用者の承認の文の関数を sprint_waves.py へ移した。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
waiting.md の手順 8・9、agent-layers.md の仕上げ・リリースの行、relay.md の例を、
new sprint が書き出す「関門 2」と「本番」のステージに合わせた。本番のプランを
new release --channel prod で手で作る記述は、単発のリリースの説明だけに残す。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
merged-steps.py promote に --expect-head-from <導入の確認の承認資料> を足し、資料の確かめたコミットを
merge-when-green の --expect-head と同じ照合に使う。読めなければ gh を呼ばずに 2 で止まる。
昇格のプランの fast / auto の promote は、mvv と同じ VERIFY_MATERIAL を渡し、落ちたら handoff で承認ゲート 2 へ戻る。
確かめたコミットの行の形と読み取りは lib/approved_commit.py の verified_line / verified_sha に置き、verify_markdown もそれで書く。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
着手前のテストの後に、scope_command を持つテストの suite ごとにテストのファイルを最大 2 本入れて
1 回走らせる。判定が ok でなければ、当たった suite・今のテンプレート・入れたパス・直す箇所を出し、
状態ファイルを作らずに終了コード 4 で止まる。記録は <tmp_dir>/template-check.json と状態ファイルの
template_checks に残す。

- test_strategy: probe_paths / template_verdict / ProbeVerdict(選び方と判定の純粋な関数)
- refactor_lib/template_check.py: 候補の収集・実行・記録(新設)
- commands/setup.py: _verify_init から呼び、記録を状態へそのまま置く
- 既存の init のテストは試走を対象なしとして通し、試走は test_template_check.py で見る

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…に書く(#1630)

- project_lib/model.py の Suite の説明に、改修の範囲テスト・CI に任せる戦略の着手前のテスト・静的解析ごとの
  {paths} に入るパスと、init の試走で止まることを書き、project.schema.json を作り直した
- project-analysis.md の test の行に、unittest を例にファイルを受ける scope_command の書き方と、手元で確かめた終了コードを書いた
- cross-refactoring の SKILL.md の終了コード 4 の理由に、テンプレートの試走で止まる場合を足した

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- verify_commands は種別・雛形の誤りを先に当て、strategy を書かずどの suite も command と
  scope_command を持たない宣言({"suites": []} を含む)では None を返す
- 最終スイープの指示を組めないときの Stop の理由文に止めた所を名指しする
- 駆動の件数へ最後のラウンドの継続的統合の判定 ci と理由 ci_reason を足す

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
結果 JSON が stopped で metrics.exit が整数のとき、止まった理由の要約の後ろへ
「(元の終了コード N)」を添える。abort へ回したときの直前のステップの要約にも当てる。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
drive.py の先頭で review_lib を読むと、scripts/ を sys.path に持たない呼び出し元
(supervise のテストなど)で読み込みが失敗する。review_paths と同じく counts の中で読む。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
check-script-structure の same-name 違反(_candidates / run / summary)を解く。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
promote の --expect-head-from の説明を詰め、script-structure の行数の上限を超えないようにする。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1914 を実装する(スプリント m1914)
#1630 を実装する(スプリント m1914)
#1529 を実装する(スプリント m1914)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Docs: 開発ループ(--loop)の確定仕様を docs/specifications へ置く(#2089)
#1593 を実装する(スプリント m1914)
手順 0 の check が「古い」(解析器の版 1 < 2・ワークフローと指示書の変更)を返したため、
measure → 答え → write を通した。手の値(test・delivery・issues・ndf_policies)は引き継いだ。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MVV 版 3 の Value 10 を棚卸しの順位で効かせるため、quality 節を既定の値
(label quality・ratio 0.2・min 1)で置く。ラベル quality は作成済みで #2121 に付けた。

Closes #2131

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Uxj56bKEJGJk8GS7BwYXp2
supervise の中で全体テストを走らせると、NDF_USAGE_SOURCE / NDF_USAGE_KIND が入ったまま
test_runtime_specific_usage_shapes が「名乗りが無い」ことを確かめて落ちる。fixture の
fake_clis で 4 つの NDF_USAGE_* を外す。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Update: 棚卸しの品質の枠を宣言する(#2131)
Fix: test_usage_capture の偽の CLI に呼び出し元の環境変数を持ち込まない
…#compare_approved

段 3(配布の PR の外のコミット I3)を _outside_of_prs、段 4(先端までの外のコミット I9)を
_outside_to_tip として抽出した。読めないときは None を返し、compare_approved は undecidable を返す。

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

マージの実行部(pin の組み立て・gh pr merge・競合の判定・失敗の emit・merged の記録)を
_merge_pr として抽出し、merge_when_green から呼ぶ形にした。

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 22 commits October 25, 2026 04:49
…ts/refactor_lib/template_check.py#_check_one

試走の起動部(残り時間の判定・run_within・launch.stop)を _run_probe として抽出し、
(結果, 走らせなかった理由) を返す形にした。記録の辞書の組み立ては _check_one の末尾に残した。

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

確かめたコミットの行の前後の文言を _VERIFIED_HEAD / _VERIFIED_MID / _VERIFIED_TAIL に置き、
書く側の verified_line と読む側の _VERIFIED_RE をこの定数から組み立てるようにした。

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

本番のブランチの有無の判定を has_prod_branch として抽出し、sprint_plans の分岐と
no_prod_stage の両方から呼ぶ形にした(評価の順序は変えていない)。

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

sprint_state_path を sprint.py から sprint_waves.py へ移し、sprint_waves.py の
str(Path(a.state).resolve()) の 4 か所をこれに置き換えた。sprint.py は sprint_waves から読み込む。

Item-Id: I-006
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ring/scripts/refactor_lib/template_check.py#_reference

試走の基準の値を test_strategy.py の REFERENCE_GREEN / REFERENCE_RED / REFERENCE_NONE に置き、
template_verdict の比較と _reference の戻り値・比較をこの定数へ置き換えた。値は変えていない。

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

paths の要素の正規化を _root_of、全体を指すかの判定を _is_whole_root として抽出し、
_declares_whole と probe_roots の両方から使う形にした。

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

metrics を先に 1 度だけ読み、isinstance の判定と重なっていた `or {}` を外した。

Item-Id: I-009
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…toring/scripts/refactor_lib/template_check.py#check_templates

check_templates が _check_one へ渡す文字列キーの dict を、frozen の dataclass _ProbeContext に
置き換え、_check_one の ctx["..."] を属性参照にした。

Item-Id: I-010
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
_VERIFIED_RE の組み立てを ruff format の形(1 行)へ整えた。中身の式は変えていない。

Item-Id: I-004
Impl-Runtime: claude
Impl-Model: default
…proved

lint の違反は approved_commit.py の _VERIFIED_RE(I-004 の行)の整形だけで、I-004 の修正で解消した。
compare_approved の抽出(I-001)には直す箇所が無いため、変更の無いコミットで記録する。

Item-Id: I-001
Impl-Runtime: claude
Impl-Model: default
…r_gate_cmd

sprint_state_path を足した sprint_waves.py が 503 行になり、行数の上限(500 行)を超えた。
sprint_state_path を新しいモジュール supervise_lib/state_path.py へ移し、sprint_waves.py と
sprint.py はそこから読み込む。本体は変えていない(500 行に収まる)。

Item-Id: I-006
Impl-Runtime: claude
Impl-Model: default
…r_gate_cmd

前回の修正で足した supervise_lib/state_path.py が、パッケージのモジュール一覧の設計
(test_supervise_layout の test_package_has_the_designed_modules)に無いため落ちた。
sprint_state_path を既存の supervise_lib/plan.py(supervise_lib を何も import しないので
循環しない)へ移し、state_path.py を消す。sprint.py と sprint_waves.py は plan から読み込む。
本体は変えていない。

Item-Id: I-006
Impl-Runtime: claude
Impl-Model: default
本番のプランの release --channel prod --approval は承認資料に承認の記録が無いと gate(10)で止まるため、
承認されたら approve で記録してから「本番」のステージの command を打つ形にする(PR #2133 のレビュー指摘)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
develop の design_read で sprint_waves.py が 505 行になり(上限 500)、sprint.py の HERE が使われなくなった。
関門の文の関数(user_gate_cmd・normal_gate_1・normal_gate_2・normal_gate_2_stage)を sprint_routes.py へ移し、
sprint.py の使われない import を外す。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
normal_gate_2_stage が承認資料を相対パスで approve へ渡していたため、worktree で打つと
作業場所の git の根から解かれ、開発版の配布が書いた資料を見つけられなかった。
本番の release と同じ material_path で絶対パスにする。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

振り返り(2026-10-25)

対象: issue #1914 / issue #1529 / issue #1630 / issue #1593 / スプリント PR #2133 / リリース PR #2138・PR #2139

スプリント m1914 では、マイルストーン「23 汎用性の回復」の 4 課題を ndf v10.22.0 として出した。#1914 で pace: normal の new sprint が承認ゲート 2 と本番のステージを目録に書き出すようにした。#1529 で fast・auto の昇格が、導入の確認で確かめたコミットとだけ照合してマージするようにした。#1630 で cross-refactoring の init が範囲テストのテンプレートを試走するようにした。#1593 で cross-review の最終スイープが、テストの無い宣言でも止まらないようにした。

何が起きたか

観点 事実
手戻り cross-review は 3 ラウンドで承認に至り、指摘 3 件をすべて修正した。cross-refactoring は 10 件を採用し、修正のラウンドは 4 回。検査の経路を戻った後の 2 回目の refactor は、着手前のテストに 594 秒かかって予算を超え、init が終了コード 4 で止まった
見落とし リリース後テストは 31 件中 30 件が合格した。#1529 の条件 9 が不合格で、promote --help が承認ゲート 2 へ戻ることを書いていない(#2142)。#1593 の条件 6 は退行なしで合格としたが、前提の「収束しなければ止まる」が変更前から成り立っていなかった(#2143)。どちらもマージ前に確かめられた
承認資料 「リファクタリング: 採用 0 件」は実績の 10 件と食い違っていた。原因は、release_lib/materials.py の last_result が番号の最も大きい 04-refactor.out(止まったやり直し)を読んだこと(#2129 に再発として追記した)。「未実施のリリース後テスト」には受け入れ条件 31 件がすべて並び、マージ前に確かめた条件と区別されていなかった
工程 develop を fast-forward できない問題(#2140)でメインディレクトリが main に残り、仕上げは origin/develop の worktree から行った。CI で test_external_ai_run の不安定さが再発した(#1735)。手元の agy 1.4.7 が validate で落ちる(#2087)ため、プランは agy を外した PATH で流した。codex・kiro が未ログインで、レビューとリファクタリングは claude だけで回った
範囲 #1914 から #2097、#1529 から #2104、#1630 から #2095・#2096 を範囲外として起票した。#2108 は閉じた
リリース後テストの環境 #1593 の条件 1〜3 のため、利用者の決定に沿って CI を持たない private の一時リポジトリを作り、確かめた後に削除した

context window の大きさ

層 フェーズ モデル 件数 固定費の中央値 実作業の中央値 実作業 < 固定費 最大充填の最大 目印
conductor - claude-opus-5-5 1 40719 81630 0 122349
supervisor 取り込み claude-opus-5-5 1 43599 28016 1 71615 束ねる候補
supervisor 仕上げ claude-opus-5-5 1 44169 97087 0 141256
worker 修正 claude-opus-5-5 1 35146 257933 0 293079 割る候補
worker その他 claude-opus-5-5 4 34097 70796 0 131331
層 件数 固定費の合計 実作業の合計 総消費
conductor 1 40719 81630 122349
supervisor 2 87768 125103 212871
worker 5 171587 552616 724203
合計 8 300074 759349 1059423
フェーズ supervisor supervisor の実作業 worker の件数 supervisor と worker の固定費の合計 目印
取り込み 1 28016 1 78745 worker を使いすぎ
仕上げ 1 97087 4 180610 worker を使いすぎ

測ったのは最後の conductor のセッション 1 本だけで、スプリントの前半のセッションは含まない。

  • supervisor 取り込み(束ねる候補・worker を使いすぎ): 束ねる。実作業が固定費を下回った。次のスプリントでは、確定仕様化を仕上げのフェーズへ寄せて 1 つの supervisor で通す
  • worker 修正(割る候補): そのままにする。実作業が 258k と大きいが 1 件だけで、修正の範囲を割る境目が見えていない
  • 仕上げ(worker を使いすぎ): そのままにする。課題ごとのリリース後テストは独立していて、4 本を並べて所要時間を縮めた(最長 13 分)。1 本にまとめると、CI の無いリポジトリで、スプリントの検査のプランが cross-review の unverified(exit 2)と on_fail: abort で毎回止まる #1593 の一時リポジトリの実行を待つ間に他の条件が進まない

承認ゲートの差し戻し

gate-rejections.py count --issue 1914 --issue 1529 --issue 1630 --issue 1593 --pr 2133 の結果、関門 1 は 0 件、関門 2 は 0 件だった。

MVV を見直すか

project-mvv.py signals で集計した MVV 版 3 の兆候は、どれも閾値を下回った。

兆候 件数 閾値
覆し 0 件 3
判定できない 0 件(続けて 0 回) 5(続けて 3)
流出不具合 0 件 3

改訂の提案は無い。supervisor からは「改訂しない」を推す(兆候が 0 件のため)。利用者の答えは conductor が取る。

用語集の変化

glossary.py diff --base 5d5595c1 --head 66ff4504 の結果、変化は無かった。

次に変えること

変えること 落とし先 状態
「退行しない」条件を書くときは、今の振る舞いを実行して前提を確かめる。受け入れ条件ごとに、マージ前に確かめたか、リリースの後でしか確かめられないかを分ける requirements-design・quality-gates の手順(次の変更で試す) #2144 として起票
承認資料の検査の結果を、止まったやり直しの結果ではなく、通った実行の値から書く release_lib/materials.py #2129(既存)へ再発を追記
確定仕様化を仕上げの supervisor へ寄せ、取り込みの supervisor を 1 本減らす conductor の手順(次のスプリントで試す) 次のスプリントで試す(起票しない。結果を次の振り返りで見る)

途中で起票した課題

番号 何を見つけたか 見つけた場面
#2097 release の雛形が、production_branch の無いリポジトリで本番のプランを組めない 設計中(#1914)
#2104 normal の昇格で、承認ゲート 2 で見た先端と promote-approved がマージする先端を照合しない 設計中(#1529)
#2095 cross-refactoring で、コード起因の失敗なしでも修正のラウンドを繰り返す 設計中(#1630)
#2096 CI に任せる戦略の着手前のテストが、ディレクトリを {paths} へ入れる 設計中(#1630)
#2108 test_waiting_plans_do_not_hold_the_only_slot が不定期に落ちる(閉じた) 実装中
#2140 verify が、メインディレクトリが本番ブランチにいると develop を fast-forward できない 配布中
#2142 promote --help が承認ゲート 2 へ戻ることを書いていない リリース後テスト
#2143 cross-review が収束しなくても駆動が ok を返し、review が止まらない リリース後テスト
#2144 受け入れ条件の前提と文言の確認がリリース後テストまで遅れる 振り返り

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