Skip to content

Release: ndf v10.27.2 を main へ - #2282

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

takemi-ohama merged 91 commits into
mainfrom
develop

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

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

🤖 Generated with Claude Code

takemi-ohama and others added 30 commits October 31, 2026 04:01
- validate_result が ok と gaps の同居、gaps の無い終了コード 6 を誤りとして返す
- step_result.py emit の CLI でシェルから同じ形を出せるようにする
- step_read.py に pick_ok_attempt / open_place / place_stop を置く

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
最終スイープを終えても final が approved 以外(max_rounds・oscillation・error)なら、
駆動は status: stopped を返す(drive_pause.unconverged)。報告と件数(metrics.final を含む)は
ok と同じ形で残す。呼び出し側(supervise の DriveStep)は status だけを見る形のまま、
review(on_fail: abort)が失敗になり後続へ進まない。

回答ファイル(--result-file)は収束せずに終わったときも書き、cross-refactoring の
最終ゲートが単独起動で最終ステータスを読めるようにする(#1656)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…欠けとして載せる(#2227)

- lib/step-result.sh に sr_gh / sr_emit / sr_absorb ほかを置き、JSON は step_result.py emit が組む
- 書けなかったときは stopped / 6 と gaps、gh が無ければ 3、何も書けなければ 1
- 配布の記録の無い工程の案内は items の stage-missing へ移す

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 欠け・過程・判断の項目、ok の条件、終了コード 6・75、読む側の規則を README に書く
- progress-tracking の書けなかったときの返し方と結果の読み方を結果 JSON に合わせる

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- fill_queue_pr: 名前の一致する計画の完了した報告・状態ディレクトリが無ければ埋めずに理由を返す。
  完了して PR が無い・飛ばされた計画は従来どおり 0
- fill_stage が埋められないプランに unfilled を付け、queue は ok で返さない
- Engine: コマンドに {queue_pr:…}・{queue_state:…} が残ったステップは打たずに止まり、理由に残った差し込みを出す

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
置き場はあるが結果 JSON が無いときは従来どおり無い材料として書き、置き場が無いときと区別する。

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

- step_read に result_line / not_ok_reason / process_if_not_ok を置き、state.py と sprint-close.py が同じ規則で読む
- 呼び出しの誤りの返し方を step-result.sh の sr_bad_args の 1 つにする
- state.py の snapshot / replay のオブジェクトの列を DICT_LISTS でまとめ、500 行に収める

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nc のテストを結果 JSON へ合わせる(#2227)

- mapfile を read -d '' のループへ、多バイト文字の直前の素の変数を ${} へ
- stage-completeness.md から Skill をまたぐリンクを外す

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2079 を実装する(スプリント m26-1)
利用者の承認(関門 1・関門 2)も答えの記録へ outcome: approved で 1 行書き、count は差し戻しの行だけを数える。
範囲に答えの行が無く、状態ファイルにも承認ゲートの記録が無ければ status: stopped・件数 null・終了コード 3。
outcome の無い既存の行は差し戻しとして数える(今と同じ件数)。

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

設計(fast・auto の MVV 判定と normal の助言)・承認ゲート 2(gate-2・昇格・本番の MVV 判定)のプランに reject を足す。
直してから run <計画> --from reject で流すと、sprint-state.py gate --outcome rejected を打ってから再提示のステップへ進む。
reject は from_only で、並びの次としては通らない(limits.default_next が飛ばす)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
project-mvv.py approve / check・project-decl.py write・glossary.py init は、宣言が
.gitignore の対象なら、除外している行(<ファイル>:<行> とパターン)と対象のファイルを
items(kind note・key gitignore・result ignored)と要約に出す。status は ok のまま。
検出は lib/ndf_tracking.py に寄せ、project-decl の _gitignore_note と
supervise_lib の _ignored の重複を除いた。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
project-analysis.md に「.ndf/ の追跡」を置き、外すのは個人の値(.ndf/.gitignore)と
実行時の出力(handoff/ など)だけとした。除外を検出したときの出力の形もそこに書く。
project-mvv.md の策定の 8 と handoff.md はそこを指す。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…振り返りで読み分ける(#2183)

pace.md・approval-request.md・conductor-entrypoints.md・retrospective の手順を、承認の行も差し戻しの記録へ書くことと、
reject のステップと、count の終了コード 3(未記録)に合わせる。新しい語は足さず、既存の「差し戻しの記録」を使う。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…y と sprint_loop.py を行数の上限に収める(#2183)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2157 を実装する(スプリント m26-1)
#2227 を実装する(スプリント m26-1)
- レビューとリファクタリングは、status: ok の試行のうち番号の最も大きいものを読む。ok の試行が無ければ件数を載せず、ok で終わっていないと書く
- 全体テストは status が合否そのものなので、今と同じく最後の試行を読む
- cross-review の見送りは path と summary が同じなら、line の有無・値が違っても 1 件に畳む

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
takemi-ohama and others added 14 commits October 31, 2026 08:45
…eue_for

queue_for と _resolve_fix_inputs に同じ式で書かれていた一時の置き場の規則を
_tmp_base へ抽出し、両方をその呼び出しへ置き換えた。

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

_sweep_session と _sweep_deps が別々に書いていた 3 分岐(持ち主の記録が無い → 寿命の窓、
持ち主のプロセスが居る → kept、居ない → 消して removed)を _owned_item へ抽出した。
最終更新時刻は従来どおり記録が無いときだけ読むよう、呼び出しで渡す。

Item-Id: I-011
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
抽出した _owned_item のシグネチャと _sweep_session の呼び出しを ruff format の形へ整え、
check-lint の ruff format --check 違反を解消する。振る舞いは変えていない。

Item-Id: I-011
Impl-Runtime: claude
Impl-Model: default
…ove_review_worktree

remove_review_worktree・remove_run_dir・remove_pr_dir の本体で使われない引数 pr を外し、
_sweep_one_review と merged-steps._remove_pr_tmp_worktrees の呼び出しを合わせた。

Item-Id: I-012
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- queue_fill: {queue_pr:<名>} は「関門」で終えた設計プランの PR も埋める(design-merge が止まらない)
- approved_commit: 配布物の変更パスを -z と --no-renames で読み、日本語のパスと配布物から外への移動を見落とさない
- merged-steps: own と swept を値でなく印で分け、処理済みの pr<n>/rf<n> を sweep_states の skip へ渡す

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- cross-review の未収束(final が approved 以外)を stopped・終了コード 6・gaps(kind: review)で返す。
  drive のステップでも on_exit を読み、検査のプランの review は 6 を base-sync へ回す(#2227 の決定 1)
- 承認の外のコミットを通す判定を、配布物の拒否リストから許可リスト(docs/・issues/)へ反転する。
  scripts/・.github/ など秘密を渡す CI が実行する未承認の変更を承認ゲート 2 で止める(C1)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- cross-review の終わりが final=error(レビューが成立していない)なら終了コード 1 の中断で返し、
  終了コード 6(gaps)は max_rounds・oscillation だけにする。検査の review の on_exit["6"] でマージへ進まない
- 未収束で ok の試行が無いレビューでも、見送った指摘の件数と本文・位置を承認資料へ載せる

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

takemi-ohama commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor Author

振り返り(2026-10-31)

対象: スプリント m26-1(v10.27.2)。親 issue #2227(全工程の結果を統一した JSON レポートにし、失敗・未収束・未記録を ok で返さない)と子 #2143 #2079 #2183 #2157 #2129 #671 #1849、親 issue #2229(実行をまたいで残る状態に寿命と持ち主を持たせる)と子 #2084 #2085 #2221 / 設計 PR #2242・PR #2244 / スプリント PR #2268 / 配布 PR #2281・PR #2282

工程の結果を「失敗・収束しない・記録できない」まで含めて 1 つの JSON の形で返し、それを ok と読み違えないようにした(cross-review の未収束、置き換わらない差し込み、承認ゲートの差し戻しの記録漏れ、.ndf/ の追跡の食い違い、承認資料の検査の読み違い、進行の記録の黙った失敗、棚卸しの apply の 2 回打ち)。あわせて、待ち行列と一時の worktree に持ち主と寿命を持たせ、並行する実行が互いを塞がないようにした。

何が起きたか

観点 事実
工程 設計 2 本 → 承認ゲート 1 → 実装 12 本(並行 3)→ 検査 → 開発版 → 本番(承認ゲート 2 は MVV 判定「従う」で自動)→ リリース後テスト。飛ばした工程は無い。#2084・#2085 は #2229 の実装に含めて実装のプランは 0 秒で終わった
手戻り(検査の構造改善) 着手前のテストが上限 180 秒 → 540 秒で 2 回打ち切られ、3 回目(上限 1,620 秒)でテストは 652 秒で通ったが予算 30 分に収まらず init が止まった。予算 75 分・timeout 4,800 秒に書き直して流し直した。#2047 の 5 回目の発生(本文に追記)。初回の上限が実測の test_duration を読まず 3 倍ずつしか上がらない
手戻り(版の衝突) 並行の別スプリント m1426 が先に v10.27.1 まで出し、スプリント PR が版の行で衝突。版を 10.27.0 → 10.27.2 へ書き換えた。#2164 の 2 回目の発生(本文に追記)
見落とし(リリース後テスト) 本番のプランの verify は導入の確認(verify-install)だけを流し、受け入れ条件ごとの確認と記録が抜けたまま「リリース後テスト」を通ったと記録した。スプリントを閉じる工程で全件が閉じられず、仕上げのフェーズで worker 3 本に受け入れ条件 66 件を配布物 10.27.2 で確かめさせた(記録: #2281 (comment) )。不合格 2 件: #2143 の条件 2(検査のプランの review が終了コード 6 を base-sync へ回し、未収束でも後続へ進む。PR #2268 のレビューの修正 round 2 が足した行)と、それを受けた #2227 の条件 7。保留 2 行: #2229 の AC3〜AC5・#2085 の条件 3 の手動確認(残骸が寿命の窓 24 時間の中)。閉じたのは 8 件、#2143・#2227・#2229・#2085 は開いたまま
見落とし(未収束を ok と読む) 設計 #2229(PR #2244)の cross-review が final: error・review_status: error で終わったのに駆動は exit 0 で、MVV 判定 → approve → merge へ進んだ。検査の review も final oscillation のまま exit 0 で進んだ。どちらも修正前の駆動(検査は 10.26.1 のキャッシュ)で動いており、このスプリントで直した #2143 の対象そのもの。指摘 6 件は修正済み・未解決 0
検査の規模 構造改善: 提案 12・採用 10・取り消し 2・見送り 14。レビュー: 3 ラウンド・指摘 6・修正 6。レビューの費用 $4.25(claude 16 回・codex 6 回・kiro 6 回)
範囲 範囲外として起票したのは #2243(#2229 の対象外の一時の置き場)の 1 件。品質判定・レビューの指摘・プランに、番号の無い範囲外の項目は無かった(取りこぼし 0)

context window の大きさ

測定は会話側(conductor と、その中で起動した supervisor・worker)だけを数える。設計・実装・検査・配布は supervise.py の待ち行列(別プロセスの claude -p)で流れたため、この表には載らない。

層 フェーズ モデル 件数 固定費の中央値 実作業の中央値 実作業 < 固定費 最大充填の最大 目印
conductor - claude-opus-5-5 2 44446 118168 0 210137 割る候補
supervisor 取り込み claude-opus-5-5 1 48517 70981 0 119498
supervisor 仕上げ claude-opus-5-5 1 48561 26154 1 74715 束ねる候補
supervisor その他 claude-opus-5-5 3 37901 21623 3 61092 束ねる候補
worker その他 claude-opus-5-5 1 38817 58335 0 97152
層 件数 固定費の合計 実作業の合計 総消費
conductor 2 88893 236335 325228
supervisor 5 210819 158946 369765
worker 2 38817 58335 97152
合計 9 338529 453616 792145
フェーズ supervisor supervisor の実作業 worker の件数 supervisor と worker の固定費の合計 目印
取り込み 1 70981 2 87334 worker を使いすぎ
  • conductor(割る候補): そのまま。543 分の 1 本の会話で最大充填 21 万に届いたが、工程の実体は待ち行列へ出しており、会話を割る切れ目は配布の後の再起動で既に取っている
  • supervisor 仕上げ・その他(束ねる候補): そのまま。その他の 3 件は待ち行列の監視の短い起動、仕上げは本番の後の別フェーズ(振り返り・棚卸し)で、束ねる先の会話が既に終わっていた
  • 取り込み(worker を使いすぎ): そのまま。2 件のうち 1 件は応答 0 で終わった起動で、実質 1 件

用語集の変化

コンテキスト 足した語 廃止した語 意味を変えた語
ndf-release - - 承認の外のコミット(配布物に触れるものがあるときだけ承認ゲートで止まる。#2221)
ndf-worktree - - 片付け(処理の名前を run_state.sweep_states へ)

承認ゲートの差し戻し

関門 1 が 0 件・関門 2 が 0 件(gate-rejections.py count --sprint .ndf/tmp/sprint-m26-1/state.json、recorded: true)。承認ゲート 1 は利用者の承認、承認ゲート 2 は MVV 判定「従う」で自動に通った。

MVV を見直すか

見直さない。project-mvv.py signals(版 3): 覆し 2 件(閾値 3)・判定できない 1 件(閾値 5、続けて 0 回・閾値 3)・流出不具合 0 件(閾値 3)。閾値を超えた兆候が無いため、AI が判断して記録した(ask.py decide)。

次に変えること

変えること 落とし先 状態
検査の構造改善の着手前テストの上限を、初回から実測(test_duration・直前の全体テスト)で決める 次の変更で試すこと #2047 として起票済み(5 回目の発生を追記)。次のスプリントへ入れる候補
版数をプランを作る時点でなく配布のステップを流す時点に決め、並行スプリントで衝突しないようにする 次の変更で試すこと #2164 として起票済み(2 回目の発生を追記)。D(リリース記録の PR を実行時に解決)と同じ「実行時に解決する」の形で組む候補
本番のプランの verify に受け入れ条件ごとの確認と記録を含める(導入の確認だけで「リリース後テスト」と記録しない) 次の変更で試すこと #2288 として起票
検査のプランの review の終了コード 6 の行き先を judge か abort にし、未収束で後続へ進まないようにする 次の変更で試すこと #2143 に残した(開いたまま)

途中で起票した課題

番号 何を見つけたか 見つけた場面
#2288 本番のプランの verify が導入の確認だけを流し、受け入れ条件ごとの記録が無いまま「リリース後テスト」を通ったと記録する 仕上げ(スプリントを閉じる)
#2243 一時の置き場の残る状態のうち #2229 の対象外の種類(Skill の置き場・ndf-stages・ndf-guards・ndf-checks・ndf-usage)に持ち主と寿命が無い 設計中

This was referenced Oct 31, 2026
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