Skip to content

Release: ndf v10.27.15 を main へ - #2470

Merged
takemi-ohama merged 148 commits into
mainfrom
develop
Nov 3, 2026
Merged

takemi-ohama merged 148 commits into
mainfrom
develop

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

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

🤖 Generated with Claude Code

takemi-ohama and others added 30 commits November 2, 2026 12:31
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- ndf-factory-dev-loops.md が行数の上限(500 行)を超えたため、データ・設定と外部連携を ndf-factory-dev-loops-data-and-contracts.md へ分けた
- ndf-factory-contracts-and-progress.md・ndf-factory-runs-state-and-data.md が消した issues/issue-2347-*.md を指していたリンクを、新しい確定仕様へ付け替えた
- 索引に分けた確定仕様の行を足した

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
確定仕様化: スプリント lfactory2-3
確定仕様化: スプリント lflow-1
課題の本文を受け入れ条件 12 件・ドメインイベント 13 件の形に整え、
写しを issues/ に置いた。原文の「オーガナイザーに対する指示書」は、
用語集の「指示書」(規約の文書)と重なるため「並列の計画」と呼ぶ。
用語集へ並列の計画・レーン・オーガナイザー・配布の依頼を足した。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
並列の計画の正本を .ndf/parallel/<計画名>/plan.json に置き、
parallel.py が検査・レーンの起動・待ち・配布のまとめ・停止を担う。
オーガナイザーは --parallel <計画名> で始め、作業ディレクトリの
役割のファイルで同時に動かせる数から外す。レーンはラッパーの名前と
動いている計画の照合で判定し、本番のステージだけを配布の依頼の
プランへ置き換える。決定 11 件は design-decisions に分けた。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
内容は足さずに組み直した。章の順は設計の雛形どおりのため動かしていない。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
統括役に断られたレーンを次の tick で起動し直す手順と、起動対象から外す条件を揃える。
配布に入る依頼は承認ゲート 2 を求める直前の parallel-freeze のステップで確定し、
要求の前提 5(求める時点で届いている依頼をすべて載せる)と揃える。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…を 1 回に限り、既存パッケージの比較を決定の記録に足す(#2436)

- 状態ファイル・依頼と答えのファイル・tick・freeze を外し、耐久ワークフロー parallel-<計画名> と DBOSClient の送受信に置き換えた
- 計画の検査を pydantic と graphlib にした
- 配布の中身を承認資料を作る時点の develop の SHA(main..<SHA>)で決め、範囲のレーンへ依頼の有無によらず結果を返す
- 承認待ちの間に develop が進んだときの出し直しを 1 回に限った(決定 14)
- 決定 12(既存パッケージの比較)・13・14 を足し、決定 3・5・6・7・10・11 を直した
- 要求のコピーを Issue の本文から作り直し、用語「配布の依頼」の意味を直した

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KYHP7y88wz5z7vgf1azE47
- 本番チャネルへの PR を develop に含まれるコミットだけにし、head を承認したコミットから切った release/v<版> にする(決定 15、issue-2436-design-release-rule.md)
- 承認の答えの時点で develop が進んでいれば 1 回だけ出し直し、出し直しで承認したコミットを出す(決定 14 を直した)
- レーンのループは配布の依頼の後に周回を「配布待ち」で締めて次の周回へ進み、周回の境で答えの届いた周回のまとめを流す(issue-2436-design-lane-loop.md)
- 承認ゲート 1・2 の問いはオーガナイザーだけが出し、設計の承認の依頼をまとめて問う(決定 16、issue-2436-design-approvals.md)
- 依頼の答えを待つステップ parallel-await をレーンのプランから外した
- 要求のコピーを Issue の本文から作り直した

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KYHP7y88wz5z7vgf1azE47
- 問いの hook がレーンと一時レーンの区分つきの問いをオーガナイザーへ送り、レーンは保留して別の作業へ進む(決定 18)
- 設計の答えを承認・直して出し直す・やらないの 3 つにし、配布の差し戻しは宛先のレーンが直す(決定 17)
- オーガナイザーは作業を持たず、答えの後の処理は持ち主のレーンが周回の境で、配布のプランの実行は一時レーン(helper、上限を 1 本超えて許す)が行う(決定 19)
- ループに周回の結果「質問待ち」と直しの周回を足した
- 要求のコピーを Issue の本文から作り直した

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KYHP7y88wz5z7vgf1azE47
- 一時レーンの失敗は問いの hook と観測で集め、main へのマージの後は「続きから流す」だけを出す
- 異常系の節を issue-2436-design-failures.md に分け、起きること・検知・扱い・テストの観点を表にした
- run をセッションから切り離す parallel.py start、計画の検査 I19(レーンの間の課題とマイルストーンの重なり)、ループの止まる理由 waiting_only を足した
- 決定 20(異常系の扱い)を足した
- 要求のコピーを Issue の本文から作り直した

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KYHP7y88wz5z7vgf1azE47
Factory のオーガナイザーが同じリポジトリで並行する実行の本番の配布を 1 本にまとめ、
承認と問いをリポジトリごとに 1 か所へ集める要求を、受け入れ条件 16 件・ドメインイベント 11 件・
未決 4 件で書いた。人へ問わずに選んだ条件は起票者の推定の S6〜S11 に理由とともに置いた。

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

- 依頼の id を受け取った数から採番せず、依頼の中身から決める
- 承認ゲート 2 を提示のプランへ置き、本番のプランは確定の後にだけ流して release/v<版> と worktree を確定したコミットから作る
- 版数の衝突を -sync で解いたときも、承認の照合には元の release/v<版> の Pull Request を渡す
- main へのマージ済みを本番の Pull Request の状態で判定する
- request-ask の送り手に、計画が動いている一時レーン(役割 helper)を含める
- 用語集の廃止語(合図・提示物・作業ツリー)を置き換える

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
takemi-ohama and others added 26 commits November 3, 2026 13:55
…_steps.py#STAGES

どこからも読まれていない定数 STAGES を消す。工程の値は _StepShape.stage の Literal が持つ。

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

held_loops と design_held が直書きしていた保留の周回の結果("配布待ち"・"質問待ち")と
ループの記録の置き場(.ndf/loop/<名前>/loop.json)を、正本の sprint_loop_record の
PENDING・LOOP_DIR・RECORD へ置き換えた。import が 1 行増えたため、構造の例外リストの行数を 723 に合わせた。

Item-Id: I-004
Impl-Runtime: claude
Impl-Model: claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
parallel_run が書き手の sprint_loop_record を読み込んだため、契約の検査が parallel.py の入口へ
loop.json・laps.md の書きと NDF_UPKEEP_STATE_DIR の読みを辿って落ちていた。
LOOP_DIR と保留の周回の結果(RELEASE_PENDING・QUESTION_PENDING・PENDING)を副作用の無い
新しいモジュール sprint_loop_names へ移し、sprint_loop_record はそこから読み込んで公開し直す。
parallel_run は sprint_loop_names だけを読み込む。RECORD は契約の検査がモジュールの中の定数しか
解決しないため書き手の sprint_loop_record に残し、parallel_run の読みは元のファイル名のままにした。

Item-Id: I-004
Impl-Runtime: claude
Impl-Model: default
… fca6fe464619 の (a))

ndf-next を出さずにセッションを終えても対話の claude が入力待ちで残り、ラッパーが running のまま止まらなかった。
終わり方が 3 か所とも「最後に relay.py stop で自分のラッパーを止める」になるようにした。

- 一時レーン: 起動の 1 行(helper_spawn)の「終わり」に relay.py stop <一時レーンの名前> を入れた(配布と保留の周回の両方)
- 問いで保留した 1 スプリントのレーン・一時レーン: 問いの hook が返す保留の手順の最後に停止の 1 行を足した
- 待ちだけで止まったループのレーン: 止まった結果に metrics.stop_self を付けた。並列の計画のレーンのときだけ返し、
  利用者の端末のラッパーは止めない
- 答えの後に持ち主を起こす要否(parallel.py の _owner_restart)を、ラッパーの状態でなくレーンの側の待ちの記録で決める
  (ループは waiting_only で止まった記録、1 スプリントのレーンは引継ぎ文書の依頼の id、一時レーンはラッパーの状態)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KYHP826qdiDahV9gSeoGPK
指定は置き場の pinned.json に持ち、ラッパーが区間の起動のたびに読む。指定が使えれば
閾値や残りの量に依らずそれを使い(理由 pinned)、使えない間は今の選び方で替えて続け、
使えるようになった後の区間の起動で戻る。--clear で外す。account list と relay.py ls が指定を示す。

Closes #2460

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KYHP826qdiDahV9gSeoGPK
Fix: ndf-next を出さずに終えるレーンが自分のラッパーを止める(#2436 の保留 2 件)
- relay.py --help / -h / help で副命令の一覧を標準出力へ出し、終了コード 0
- <副命令> --help / -h(run を除く)はその副命令の書式と役割だけを出す。stop --help が名前無しの stop(全部に停止の合図)になっていた
- 一覧は relay_lib/__init__.py の docstring の表から作る(記号を外す)。引数無しの usage とランチャーの docstring の写しを外す
- help は runtime.enter より前に返す(環境の無い素の python3 でも出る)
- 未知の副命令に --help の案内を添える

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KYHP826qdiDahV9gSeoGPK
1 秒の確認間隔では、上限の直後の区間の起動が保存した上限の残量を読み直さずに使い、
指定のアカウントへ戻らないことがあった(PR 2463 の CI の pytest (1/2))。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KYHP826qdiDahV9gSeoGPK
Fix: relay.py に --help を足し、副命令の --help で副命令を実行しないようにする
上限の観測と残量の取得の時刻は秒で残り、同じ秒の取得は「観測の後」と読まれない。
CI の速い環境では上限の観測と次の区間の起動が同じ秒に入り、指定へ戻らなかった。
前のコミットの確認間隔 0 は原因でなかったので戻す。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KYHP826qdiDahV9gSeoGPK
…た計画を飛ばして問いを送る(#2436 の cross-review round 9)

- _spawn_ready: 答えていない問いを持つレーン・答えを当てていない revive・waiting_only で答えを待つループは止まったと数えない(I8)。答えた時点で止まった持ち主を起こす 1 行を添える
- _ask_helper: 一時レーンが送った答えていない問い(ask も含む)があれば「配布の途中で止まった」を問わない(6g)
- _owner_restart: 同じ原因としてまとめた問いは merged の全持ち主をそれぞれの依頼の id で調べて起こす(異常系 5)
- ask_guard: 同じレーン名を持つ計画を順に試し、送り手でない(4)なら次の候補へ

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
usage の 1 行は develop で docstring の表から出す help に置き換わったので、develop 側を採る(account use は表の行にある)。
relay.md が 502 行になったため、account use の段落を 2 行詰めて上限の 500 行に収める。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KYHP826qdiDahV9gSeoGPK
答えを当ててすぐ止まるレーンは観測の間隔の中で stopped → running → stopped と動き、
状態の変化として見えないため revive が残り、計画が finished へ進まなかった。
relay.py ls の at が答えたときの観測の時刻より後へ進んだら revive から外す。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add: relay.py account use <名前> で次の区間から使うアカウントを指定する
… cross-review round 12)

- queue の本数の判定を parallel_lane.queue_max へ寄せ、supervise.py queue の既定・スプリントのステージの 1 行・周回のまとめの 1 行・待ち時間の調査が同じ値を使う
- 並列の計画の検査で、handoff_name() の保存先が重なるレーンを I1 で拒む

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
衝突 3 件を両方の変更を残して解いた: relay_lib/__init__.py は develop の _help への置き換えを採り(role は docstring の表から出る)、hub_client.cmd_ls の metrics は hub・tmux・pinned_account をすべて残し、test_relay_hub の期待値もそれに合わせた。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…parallel_run.py と sprint_loop_gate.py の例外の行数を今の行数へ)(#2436)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@takemi-ohama
takemi-ohama merged commit 101cd0e into main Nov 3, 2026
42 checks passed
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

振り返り(2026-11-04)

対象: issue #2436 / PR #2452(スプリント p2436 の develop 宛て) / PR #2470(本番 v10.27.15 を main へ)

並列開発の仕組みを作った。並列の計画を 1 度書けば、1 行の起動で tmux の複数のレーン(ループ・スプリント)を立ち上げ、オーガナイザーが監視して本番の配布を 1 本にまとめる(parallel.py・parallel_run.py・parallel-request.json、手順は development-workflow の parallel.md)。v10.27.15 で本番へ配布した。

並列の計画を通しで動かしたことは、まだ一度も無い。 3 本のループを並列で回すのは、無駄な作業の根本原因の対策を利用者と詰めてからにした。

何が起きたか

観点 事実
量 develop 宛ての PR #2452 は +7,233 / −704 行・コミット 77 件。設計 PR #2437 は +1,613 行・コミット 26 件(設計文書 8 本・1,585 行)。スプリントの PR は 6 本(設計 1・実装 3・直し 2)
手戻り 最初の実装(PR #2451)の後、完了判定のレビューが収束せず、承認済みの設計の実装漏れ 3 件が見つかった。実装を 2 本(PR #2454 配布の規則・#2455 レーンの周回)足した。原因は、設計の結果の「触るファイル」が分割した設計文書へのリンクを辿らず、実装のプランから変更対象が抜けたこと(#2453)
レビューの往復 完了判定の cross-review は 1 回目 4 ラウンド(指摘 32・修正 19・見送り 9・却下 4)で上限、2 回目は 8 ラウンド目に振動で中断、3 回目は通算 12 ラウンドで上限(最終ラウンドは指摘 0)。PR #2452 のレビューは 86 件。範囲外の重い指摘は #2466 に起票
止まった回数 キューの出力が 22 本ある(止まるたびに再開した)。原因は、レビューの非収束・CI の別件(Serena の言語検出のしきい値、PR #2456)・持ち主の記録の残り・develop との衝突・セッションの終了
範囲 Factory 側のオーガナイザー(#2439)はスプリントから外し、マイルストーン 25 へ回した(利用者の指示)
工程 飛ばした工程は無い。承認ゲート 2 では、利用者が最初の問いを退け「ルールを足すのでなく根本原因を考えて」と指示した。そのうえで「本番へ出してから詰める」と承認した
リリース後テスト v10.27.15 の導入と、同じ版に入った #2460(relay.py account use)の受け入れ条件 5・8 を確かめた。並列の計画の通しは対策が決まるまで行わない

context window の大きさ

測れなかった。スプリントは 2026-11-02〜04 の多数のセッション(ラッパーの区間と supervise.py の子)にまたがり、skill-stats.py --agents --from 2026-11-02 --to 2026-11-04 --project ai-plugins が 300 秒で終わらなかった。セッション ID を集めて --session で絞る手段が今は無い。

用語集の変化

develop の 2026-11-02 から v10.27.15 までの差分(このスプリント以外の変更を含む): 足した語 13・意味を変えた語 5・廃止 0・消した語 2。このスプリントに関わるのは ndf-release の「比べた先端」(本番では release/v<版> の先端を指すように変えた)。

承認ゲートの差し戻し

関門 1 が 0 件・関門 2 が 0 件(gate-rejections.py count)。ただし関門 2 では、利用者が最初の承認の問いを退け、根本原因を考えるよう指示した。記録の上では差し戻しに数えられていない。

MVV を見直すか

project-mvv.py signals(版 4): 覆し 4 件(閾値 3。4 件とも、MVV の判定が「反する疑い」か「判定できない」を返したものを人が通した。関門 1 が 2 件・関門 2 が 2 件、2026-11-01〜02 のループ)・判定できない 2 件(閾値 5)・流出不具合 0 件。閾値を超えた。改訂するかは、無駄な作業の根本原因の対策と合わせて利用者に問う。

次に変えること

変えること 落とし先 状態
設計の結果の「触るファイル」が分割した設計文書を辿る design の設計の結果の作り方 #2453 として起票済み
量と要否を人が判断できる範囲に収める(作る前の要否・一度に作る量の上限・「やめる」を既定に) プロジェクトの取り決め(AGENTS.md)か Skill の手順 利用者と詰める(本番前の承認ゲート 2 で指示を受けた)。決まりを 1 つ足すのでなく、根本原因の対策として決める

途中で起票した課題

番号 何を見つけたか 見つけた場面
#2439 Factory 側のオーガナイザー 設計中(スプリントから外した)
#2440 cross-review が修正中の別の push で止まる 設計のレビュー中
#2441 外の本番の PR が開いている間は配布を組まずに待つ 設計中
#2443 引継ぎ文書と人へ示す資料を型を持つ YAML にそろえる 運用中
#2444 組み直しの読み手役の「足すべき内容」がレビューへ渡らない 設計中
#2445 Factory の確定仕様の不変条件の番号の重なり 設計中
#2453 触るファイルが分割した設計文書を辿らない 完了判定の後
#2457 cross-refactoring の予算は選定だけに使う 完了判定中
#2458 テストの実行・失敗の見分けの共通部品化 完了判定中
#2459 共通部品の一覧と使う形への統一 完了判定中
#2461 install-wrapper が ndf-relay を置く 運用中
#2464 account use の指定を claude -p の子が読まない #2460 のレビュー中
#2466 問いの答えで再開するとき答えの中身を読まない 完了判定のレビュー中
#2468 cross-review がラウンドを回しすぎる 完了判定の後

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