Repository navigation
Description
依頼(原文)
この課題には利用者が書いた文が無い。本文と追記はどれも AI が書いた(書き手の判定は各引用の下)。利用者の指示の原文として扱う文は無く、下の受け入れ条件は承認ゲート 1 で利用者が確かめる。
スプリントのプランは、作った時点の版数(開発版
10.23.0-dev.1・本番10.23.0)を配布と本番のプランへ書き込む。プランを作ってから配布するまでの間に、並行する別のスプリントが同じ版数を本番へ出すと、そのプランの配布と本番のプランは使えなくなる。
- スプリント m2087(agy 1.4.2 が NDF のエージェント定義 8 本の model(sonnet / opus)を拒み、agy の利用者に読み込まれず pre-push も落ちる #2087・pace: normal の昇格で、承認ゲート 2 で見た先端と promote-approved がマージする先端を照合しない #2104・merged-steps.py promote の --help が、照合が食い違ったときに承認ゲート 2 へ戻ることを書いていない(#1529 の条件 9) #2142)は 2026-10-25 に
/work/ai-plugins/.ndf/tmp/sprint-m2087/sprint.jsonを作り、7-release.json・9-release-prod.jsonが 10.23.0 を持った- その後、chrome-cdp(PR Add: 利用者の Chrome を開発コンテナから CDP で操作する Skill chrome-cdp を足す #2153)が 10.23.0 として本番へ出た
- 2026-10-29、conductor は 10.23.0 の scripts でプランを作り直した(
/work/ai-plugins/.ndf/tmp/sprint-m2087b/sprint.json、開発版 10.24.0-dev.1)。作り直しの間、キューは進まなかった- 古いプランのまま流したときに、配布の工程が版数の衝突を検出して止まるのか、そのまま進むのかは確かめていない
(「どこで見つけたか」「なぜこの変更の範囲外なのか」「直さないと何が起きるか」「由来: PR #2160」の節は略さず課題の起票時の本文にある)
(書き手: 起票者(スプリント m2087 の振り返りで範囲外の課題として起票した AI)、日付: 2026-10-29 ごろ。根拠: 本文が out-of-scope の節の形で、「由来 PR #2160」を持つ)
再発(2026-10-31、スプリント m26-1)
- 別のスプリント m1426 が並行して develop へ入り、先に v10.27.1 まで本番へ出した。m26-1 のスプリント PR スプリント m26-1 #2268 は版の行で衝突し、conductor が版を 10.27.0 → 10.27.2 へ書き換えて流し直した(本番 PR Release: ndf v10.27.2 #2281 ・ Release: ndf v10.27.2 を main へ #2282 )
- 2 回目の発生。並行スプリントのたびに起きる前提で扱う
(書き手: 起票者(m26-1 の conductor)、日付: 2026-10-31)
受け入れ条件
- スプリントの配布と本番のプランは、版数をプランを作る時点で書き込まない。配布のステップを流す時点に、その時点の develop と main の版から決める
- プランを作ってから配布するまでの間に、並行する別のスプリントがその版を出しても、プランを作り直さずに、次に空いている版で配布が進む
- 本番のプランは、同じスプリントの開発版が使った版の系列(接尾辞を外した版)で出す。決めた版数は配布と本番の結果 JSON に載る
- 版数を明示して作ったプランは、その版がすでに出ていれば配布の前に止まり、別の版で黙って進めない
- 版数を流す時点に決めたプランは、自分の配布がベースブランチへマージされる前に別のスプリントがその版を出しても、流し直しで次に空いている版へ決め直して進む。決め直した前の版と理由は版の記録に残る(2026-11-01 承認ゲート 1 で利用者が案 B を選んだ)
(書き手: 起票者(棚卸しで足した AI)、日付: 2026-10-31 ごろ)
同じ事象を PR #2247 の作業中に確認した。
同じ事象を PR #2298 の作業中に確認した。
(書き手: 起票者(out-of-scope の追記の形)、日付: 2026-10-31)
起票者の推定
題・本文はすべて起票者が書いた。承認ゲート 1 で利用者が確かめるまで、利用者の決定として扱わない。
| # | 条件 | 推した出所 | この要求での扱い |
|---|---|---|---|
| S1 | 版数をプランを作る時点では決めず、配布のステップを流す時点に、その時の本番の版から決めるのがよい | 本文「起票者の推定」(m2087 の作り直しの経緯) | 受け入れ条件 1・2 |
| S2 | 古いプランのまま流すと、配布の工程が既に使われた版数でタグか CHANGELOG を作ろうとして止まる | 本文「起票者の推定」(推測。確かめていない) | 採らない。2026-11-01 に使い捨ての worktree で release-steps.py bump --plugin ndf --to 10.27.5-dev.1 --base develop を打つと、develop・main とも 10.27.5 のところで「10.27.5 → 10.27.5-dev.1 へ上げた」と終了コード 0 で進み、5 ファイルを書き換えた。開発版の配布は止まらず、版を戻したまま develop へ入る。止まるのは本番の release が「タグ ndf--v10.27.5 は既にある」を見たときで、開発版の PR はすでに develop へマージ済みになっている(release-steps.py の cmd_release)。受け入れ条件 5 の根拠 |
| S3 | 受け入れ条件 1〜4 の文(本文の「受け入れ条件」の節) | 棚卸し | 受け入れ条件 1〜4 として引き継ぎ、観測できる形へ書き直した。2 の「配布」は開発版の配布と読む(1 が「配布と本番」を分けて書くため)。本番は 3 と 6 で扱う |
| S4 | 本番の版が、承認資料に書いた版とずれるときの扱い(本文に記述なし。この要求で足した) | 承認ゲート 2 の承認資料は版数を名前と中身に持つ(issues/approval-ndf-v<版>.md)。共通原則の Value 10 の但し書き(承認資料に載せる材料の正しさは効率の順位に当てない) |
受け入れ条件 6。問わずに選んだ案: 本番は承認資料の版で出し、その版がすでに出ていれば本番の前に止まって人へ戻す。別の版へ黙って移すと、人が承認した資料と出したものの版が食い違うため |
| S5 | 同じプランの配布のステップを流し直したとき、一度決めた版を使い続ける(本文に記述なし。この要求で足した) | 配布のステップは失敗後の流し直しがある(bump の「打ち直し」の扱い) |
受け入れ条件 7。流し直すたびに版を決め直すと、自分が出した開発版を「使われた版」と見て次の版へ進んでしまうため |
目的
- 並行する別のスプリントが先に版を出しても、プランを作り直さずに配布まで進める(Vision: 人が手を止めるのは承認の 2 回に寄る。2 回の再発では conductor の作り直しと版の書き換えで止まった)
- 古いプランが既に使われた版より古い版へ戻して配布する事故を、配布の前に止める
前提
- 前提 1: 対象は
supervise.pyが組むスプリントのプランのうち、配布を雛形で組むもの(.ndf/release.jsonのform: package-plugin。版数が要るのはdelivery.needs_versionが真の経路だけ)。雛形で組まない経路は版数を持たないので変えない - 前提 2: 「使われた版」(この要求の中だけの言い方。リリース済み版より広く開発版も含む)は、開発版なら origin のベースブランチ(
.ndf/worktree.jsonのbase_branch。ai-plugins は develop)のplugin.jsonの版、正式版なら origin のリリースタグ(<plugin>--v<版>)と本番のブランチの版で判定する。どちらも配布のステップの開始時にgit fetchした後の値を読む - 前提 3: 開発版の版の決め方は「版と配布の方針」に従う。ベースブランチの版が未リリースの正式版 X の開発版
X-dev.NならX-dev.(N+1)、そうでなければ(ベースブランチの版が正式版、または X のタグがすでにある)最新のリリースタグの版を上げ幅で上げた Y のY-dev.1 - 前提 4: 上げ幅(PATCH / MINOR / MAJOR)はプランを作る時点で指定でき、指定が無ければ PATCH とする(マイルストーンの間は PATCH で出す運用に合わせる)。上げ幅を版の決め方へどう渡すかは設計が決める
- 前提 5: m26-1 でスプリント PR が「版の行で衝突した」仕組み(スプリントの PR が版の行を持った理由)は調べていない。この要求は配布と本番のプランが版を決める時点だけを扱い、スプリント PR の衝突は受け入れ条件 2 が満たされたときに起きなくなるかを設計で確かめる
対象範囲
含む:
supervise.py new sprint/new closeが組む開発版と本番のプラン(MVV 判定で進めるもの・pace: normalの配布を含む)が、版をどの時点に決めるか- 版を名前に持つもの(worktreeのパス・ブランチ名
release/v<版>・承認資料のパス・CHANGELOG の節・タグ)が、決めた版に揃うこと - 配布の
bumpが、既に使われた版以下へ版を戻さないこと - 決めた版を開発版と本番の結果 JSON(
metrics.version)に載せること
含まない:
- 雛形で組まない配布の経路(
deliveryの行ごとの経路) - 上げ幅を中身から自動で決めること(前提 4 のとおり指定か既定の PATCH)
- スプリントでない単独の
supervise.py new releaseの版の決め方(版を明示して作るので、受け入れ条件 4 の止まり方だけが当たる) - 他のプラグインの上げ幅(
bump-others・changed-plugins)の決め方 - 承認ゲート 2 の承認の記録の形(
approved_shaで中身を照合する仕組み)
ドメインイベント
| # | イベント | 引き金 | 失敗したとき | 順序の前提 |
|---|---|---|---|---|
| E1 | スプリントのプランを作った(版数を持たない、または利用者が明示した版を持つ) | conductor の supervise.py new sprint |
宣言が欠ければ今と同じく作らずに止まる | — |
| E2 | 並行する別のスプリントが、ベースブランチか本番のブランチへ版を出した | 別のスプリントの配布 | — | E1 の後、E3 の前(起きないこともある) |
| E3 | 開発版の配布のステップが、ベースブランチ・本番のブランチ・タグを読んで開発版の版を決めた | キューが配布のプランに入った | origin を読めなければ版を推定せず止まる(受け入れ条件 8) | E1 |
| E4 | 明示した版がすでに出ていると分かり、配布の前に止まった | E3 で明示の版を照合した | — | E3 |
| E5 | 開発版をベースブランチへ出し、決めた版を結果 JSON に載せた | E3 | 今の失敗の経路(judge)のまま | E3 |
| E6 | 承認ゲート 2 で利用者が承認した(承認資料は E3 で決めた版の正式版を持つ) | 利用者 | — | E5 |
| E7 | 本番のステップが、承認資料の版がまだ出ていないことを確かめた | キューが本番のプランに入った | すでに出ていれば本番の前に止まり人へ戻す(受け入れ条件 6) | E6 |
| E8 | 本番へ出し、タグを打ち、決めた版を結果 JSON に載せた | E7 | 今の失敗の経路(judge・judge-record)のまま | E7 |
用語
| 用語 | 意味 |
|---|---|
| 開発版 | 次に出す正式版の版数へ接尾辞(-dev.N)を付けた版。ベースブランチへ載る |
| 正式版 | 接尾辞の無い版。本番のブランチへ載り、リリースタグを持つ |
受け入れ条件
- 1. 版数を明示せずに作ったスプリントのプラン(
sprint.jsonと、開発版・本番のプランのファイル)は、具体的な版数(10.27.6-dev.1のような文字列)を持たない。worktreeのパス・ブランチ名・承認資料のパスも、プランを作った時点では版を含まない - 2. 開発版の配布のステップは、流した時点の origin のベースブランチの版と最新のリリースタグから版を決める。例: ベースブランチが
10.27.5・最新のタグがndf--v10.27.5・上げ幅 PATCH なら10.27.6-dev.1。ベースブランチが10.27.6-dev.1でタグndf--v10.27.6が無ければ10.27.6-dev.2 - 3. プランを作った後、配布の前に別のスプリントがベースブランチか本番のブランチへ版を出しても、同じプランをそのまま流すと、2 の規則で次に空いている版に決まり開発版の配布が終わる。conductor がプランを作り直す・版を書き換える操作は要らない(作った時点のベースブランチが
10.27.5、配布の前に別のスプリントが10.27.6を本番へ出したなら10.27.7-dev.1) - 4. 版数を明示して作ったプランは、明示した版がすでに出ていれば(開発版はベースブランチの版と同じかそれより大きい版がある、正式版は同じ版のタグがある)、
bumpより前に止まり、止まった理由と既に出ている版を結果 JSON に載せる。別の版へ移って進まない - 5. 配布の
bumpは、新しい版がベースブランチの版以下(semver の比較で同じか小さい)なら、ファイルを書き換えずに止まる(例: ベースブランチが10.27.5のとき--to 10.27.5-dev.1は止まる)。同じステップの打ち直し(作業場所がすでに新しい版で、ベースブランチの版より大きい)は今と同じく ok で返る - 6. 本番のプランは、同じスプリントの開発版の版の系列(接尾辞を外した版。承認資料が持つ版)で出す。その版のタグがすでにあれば、本番のブランチへ入れる前に止まり、人へ戻す(止まった理由・既に出ている版・次に空いている版を結果 JSON に載せる)。別の版で黙って進めない
- 7. 同じプランの開発版の配布のステップを流し直すと、最初に決めた版を使う(自分が出した開発版を「使われた版」と見て次の版へ進まない)
- 8. 版を決めるときに origin のベースブランチ・本番のブランチ・タグのどれかを読めなければ、版を推定せずに止まり、読めなかったものを結果 JSON に載せる
- 9. 開発版と本番の結果 JSON(
release-steps.py releaseの出力)のmetrics.versionに、決めた版が載る - 10. 版数を明示して作ったプランで、明示の版がまだ出ていなければ、今と同じ版・同じステップで配布が進む(退行しない)
非機能の条件
| 大項目 | 条件 |
|---|---|
| 運用・保守性 | 版を決めた根拠(読んだベースブランチの版・最新のタグ・上げ幅)が配布の結果 JSON か状態のファイルに残り、後から読んで決め方を確かめられる |
| 移行性 | この変更より前に作ったプラン(版数を持つもの)は、明示の版を持つプランとして扱い、受け入れ条件 4・6 の止まり方が当たる。作り直しは求めない |
影響
| 対象 | 影響 |
|---|---|
| 公開インタフェース | 変わる。supervise.py new sprint / new close の --version(close は --prod も)が、雛形の配布で必須から任意になる(明示すれば今と同じ)。上げ幅を受ける手段が加わる。互換の経路あり(今の呼び方はそのまま動く) |
| データ | プランのファイル(sprint.json・開発版と本番のプラン)の版の持ち方が変わる。決めた版の置き場が加わる |
| 既存の振る舞い | release-steps.py bump が版を戻す呼び方を止める。開発版・本番のプランのworktree・ブランチ・承認資料の名前が流した時点で決まる |
検証手段
| 項目 | 手段 |
|---|---|
| テスト | uv run --frozen --project . --all-extras pytest plugins/ndf/scripts/tests -q -n 4(版の決め方・bump の止まり方・プランが版を持たないことを単体で確かめる。受け入れ条件 2〜8 は一時の git リポジトリでベースブランチ・タグを作って確かめる) |
| 静的解析・型検査 | リポジトリの CI と同じ検査(python3 scripts/check-skill-frontmatter.py・python3 plugins/ndf/scripts/instructions-check.py --root .・claude plugin validate .) |
| 手動確認 | 次に並行するスプリントで、プランを作り直さずに開発版と本番が出たか(conductor の手当ての記録に版の書き換えが 0 件か)をリリース後テストで確かめる |
前提とする取り決め
| 項目 | 参照先 / 決めたこと |
|---|---|
| プロジェクト構造 | 版の決め方は plugins/ndf/scripts/ の配布の共通の層に 1 か所で置き、開発版と本番・スプリントと最終の検査で分けない(Value 6)。実験版の置き場は使わない(既定で働くプランと配布を変えるため安定版の経路) |
| コーディング規約 | AGENTS.md のポリシーと、版数の扱いは docs/versioning-and-distribution.md の「版の付け方と開発版の配布」に従う |
| テスト戦略 | 単体テストで版の決め方と止まり方を、プランを組む関数のテストでプランが版を持たないことを確かめる。.md の文言は照合しない |
境界
| 区分 | 内容 |
|---|---|
| 常に行う | 既存のテストの実行、配布のステップの結果 JSON の形を保つ |
| 確認してから行う | --version の必須を外す公開インタフェースの変更(承認ゲート 1・2 で人が見る) |
| 行わない | 版の規則そのもの(接尾辞の形・タグの形・チャネル)の変更(P1 に当たる)、既に作ったプランのファイルの書き換え、他のプラグインの上げ幅の変更 |
未決
| 項目 | 誰が決めるか | 期限 |
|---|---|---|
| 起票者の推定 S4(本番の版がすでに出ていたら止めて人へ戻す)と S5(流し直しで版を保つ)を採るか | 利用者 | 承認ゲート 1 |
| 版を決めて保つ場所(状態のファイルか、プランのプレースホルダをキューが埋めるか)と、上げ幅を渡す手段 | 設計(design) |
設計 PR |
進行
モード: — / 進め方: auto
- 要求と受け入れ条件 — 2026-11-01 01:18
- 作業場所の用意 — 2026-11-01 02:54
- 設計 — 2026-11-01 01:22
- 素材の収集と出典の確定
- ドキュメント再構成
- ドキュメントレビュー
- 計画 — 2026-11-01 02:53
- 実装 — 2026-11-01 03:43
- 構造改善 — 2026-11-01 05:23
- 実装レビュー — 2026-11-01 06:24
- 完了判定 — 2026-11-01 04:16
- Pull Request — 2026-11-01 04:32
- 確定仕様化 — 2026-11-01 07:43
- 後片付け — 2026-11-01 07:42
- 配布 — 2026-11-01 07:24
- 体裁レビュー
- リリース後テスト — 2026-11-01 07:59
- 振り返り — 2026-11-01 08:08
- 棚卸し — 2026-11-01 08:21
振り返り: #2352 (comment)
閉じた理由
直っています。版数を配布のステップを流す時点に決める変更(PR #2345、スプリント PR #2348)がマージされ、ndf v10.27.10 以降に入っています。キューが流す時点に次に空いている版を決めて版の記録に残し、明示の版がすでに出ていれば止まります(supervise_lib/queue_fill.py)。リリース後テストと振り返りも済んでいます。
Activity
takemi-ohama commentedon Oct 31, 2026
同じ事象を PR #2247 の作業中に確認した。
takemi-ohama commentedon Oct 31, 2026
同じ事象を PR #2298 の作業中に確認した。
Docs: #2164 の設計で bump の止まり方の終了コードを明示し、自分の配布の後の打ち直しを ok にする
Docs: #2164 の設計に、配布のマージまで版を決め直す仕組みを足す(承認ゲート 1 の案 B)
Merge pull request #2331 from devbasex/design/issue-2164
Merge pull request #2345 from devbasex/feat/issue-2164-m26-3
Fix: 配布不要の実行の条件を版の照会より先に打つ(#2164)
Fix: まとめへ周回の版を明示の版として渡さない(#2164)