Skip to content

本番のプランの verify が導入の確認だけを流して「リリース後テスト」を通ったと記録し、受け入れ条件ごとの記録が無いためスプリントを閉じる工程で課題が閉じない #2288

Open

Description

@takemi-ohama

何を見つけたか

スプリント m26-1(ndf v10.27.2)の本番のプラン(supervise.py が書く 8-release-prod.json)は、verify ステップ(stage: リリース後テスト)で release-verification-steps.py verify-install --ref main --expect 10.27.2 --runtimes claude,codex,kiro だけを流し、exit 0 で次へ進んだ。プランはこれで「リリース後テスト」を通ったと記録し、conductor も済んだと扱った。

しかし release-verification の手順 2・3(受け入れ条件ごとの確認と、配布の記録の PR への ## リリース後テスト の記録の投稿)は行われていない。その結果、仕上げのフェーズで sprint-close.py --record-pr 2281 --with-verification --dry-run を打つと、スプリント課題 12 件すべてが kept_open(理由「本番の版のリリース後テストの記録が無い」)になり、課題を閉じられなかった。スプリント PR #2268 の本文の「手動確認」が「リリース後テストへ回す」とした 2 件(#2227 の承認資料の検査の結果・#2229 の一時の worktree の片付け)も、誰も実施していなかった。

どこで見つけたか

  • 本番のプラン: /work/ai-plugins/.ndf/tmp/sprint-m26-1/8-release-prod.json の verify ステップ、結果 /work/ai-plugins/.ndf/tmp/sprint-m26-1/8-release-prod-state/11-verify.out
  • 配布の記録の PR Release: ndf v10.27.2 #2281 (## 配布の記録 のコメントはあるが ## リリース後テスト が無い)
  • 仕上げのフェーズ(振り返り → スプリントを閉じる)での sprint-close.py の dry-run

なぜこの変更の範囲外なのか

m26-1 の受け入れ条件は、工程の結果を統一した JSON で返すこと(#2227)と実行をまたぐ状態の寿命と持ち主(#2229)を扱い、本番のプランがリリース後テストのどこまでを流すかはどの条件にも入っていない。根拠: Vision(2 回の承認には未検証のまま残ることがそろって届く)・Value 7(判断の理由を残す)(MVV 版 3)

直さないと何が起きるか

本番のプランで流すスプリントは毎回、受け入れ条件ごとの確認が抜けたまま「リリース後テスト済み」と記録され、スプリントを閉じる工程で課題が閉じない。閉じないことに気づかずに --with-verification を外して閉じると、確かめていない条件が終わったように見える。

由来

PR #2282

依頼の書き手

上の「何を見つけたか」〜「由来」は、起票者(課題を書いた AI)が 2026-10-31 に、配布の Pull Request #2282 の作業の中で範囲外の課題として書いた本文である(書き手: 起票者、日付: 2026-10-31)。利用者の指示の原文は無い。下の要求は、この本文と、本文の末尾の「状況」「リリース後テストの取り直し」の記録(書き手: 起票者、日付: 2026-11-01)から組み立てた。

解釈: 課題の本文の進行で「リリース後テスト」に印が付いているなら、配布の記録の Pull Request に受け入れ条件ごとの記録(## リリース後テスト)がある状態にする。導入の確認だけを流したステップを「リリース後テスト」と記録しないこと(受け入れ条件 1〜4、合格済み)と、印を記録より先に付けないこと(受け入れ条件 5〜7、未達)の 2 つで満たす。

起票者の推定

題・本文のうち、利用者の指示の原文に無く、起票者が推して足した条件。承認ゲート 1 で利用者が確かめるまで、利用者の決定として扱わない。

# 条件 推した出所 この要求での扱い
S1 本番のプランの verify が導入の確認に加え、スプリント PR の「手動確認」とマージ前の「未検証の項目」を受け入れ条件ごとに流して ## リリース後テスト を投稿するか、導入の確認だけのときはプランの stage を「リリース後テスト」と記録せず仕上げのフェーズへ残りを渡す 2026-10-31 の 8-release-prod.json と release-verification の SKILL.md の手順 2・3・出力物 後者を採った。受け入れ条件 1・4(合格済み)
S2 仕上げのフェーズで worker に受け入れ条件ごとの確認を補わせた この起票の場面(m26-1 の仕上げ) 含まない(その場の手当ての記録で、条件ではない)
S3 受け入れ条件 5(印が付いた時点で記録がある)は「文言の書き換えを人の判断に待つ」 本文の「状況(2026-11-01)」 採らない。文言は変えず、印を付ける時点を直して満たす(前提 2)。承認ゲート 1 で利用者が確かめる
S4 記録を投稿する工程は、ステップが ok で終わった後に印を付ける(または印を付ける前に記録の有無を確かめる) #2356 の「起票者の推定」 受け入れ条件 6・7。範囲は「リリース後テスト」の工程に限る(「含まない」の振り返りを参照)

目的

  • 課題の本文の進行の「リリース後テスト」の印を、受け入れ条件ごとに確かめた記録があることの印にする。印を見た人とスプリントを閉じる工程が、確かめていない条件を確かめたものと取り違えない状態にする

前提

対象範囲

含む:

  • 本番のプランと仕上げのフェーズのプランで、stage が「リリース後テスト」のステップの進行の印を付ける時点
  • 受け入れ条件 1〜4 の退行の確認

含まない:

  • 振り返りなど、ほかの記録を投稿する工程の印の時点(同じ型だが、この課題の受け入れ条件に無い。未決 1)
  • release-verification の手順そのもの(受け入れ条件ごとの確認の中身・記録の形)
  • sprint-close.py の判定の変更
  • 進行の印を付けるスクリプト(projects-sync.sh・progress-record.sh)の書式

ドメインイベント

# イベント 引き金 失敗したとき 順序の前提
E1 本番の配布のプランが導入の確認を流した 本番のプランの verify ステップ 失敗は配布のプランの on_fail に従う。進行の印は「配布」のまま 本番の配布が済んでいる
E2 仕上げのフェーズのプランが、stage「リリース後テスト」のステップを始めた 仕上げのフェーズのキュー 起動できなければプランが止まる。印は付かない E1
E3 worker が受け入れ条件ごとに確かめ、配布の記録の Pull Request へ ## リリース後テスト を投稿した E2 のステップの中の worker 投稿できなければステップが ok で終わらない E2
E4 課題の本文の進行の「リリース後テスト」に印が付いた E3 の後、ステップが ok で終わったこと 印の書き込みが落ちても、プランは止めない(今の record_stage と同じ) E3
E5 スプリントを閉じる工程が、記録を読んで課題を閉じるか残した 仕上げのフェーズの close ステップ 記録が無ければ課題は kept_open(受け入れ条件 3) E3(E4 の有無に依らない)

用語

用語 意味
導入の確認 release-verification-steps.py verify-install が配布した版の導入を確かめること。受け入れ条件ごとの確認を含まない

受け入れ条件

各条件の末尾の括弧は、確かめる時期と手段を表す。

  • 1. supervise.py の雛形が書く本番のプラン(release-prod)を組む → 導入の確認(release-verification-steps.py verify-install)だけを流すステップは、stage を「リリース後テスト」として記録しない。stage が「リリース後テスト」のステップは、受け入れ条件ごとの確認と、配布の記録の Pull Request への ## リリース後テスト の投稿を行うステップである(マージ前: プランを組んで各ステップの stage と中身を見るテスト)(2026-11-01 合格、前提 1)
  • 2. 開発版のプラン(release)の verify ステップは、今と同じく stage「配布」で記録される(退行しない。supervise_lib/release_templates.py の _release_verify_steps が dev のとき「配布」を返す今の振る舞いを前提にする)(マージ前: テスト)(2026-11-01 合格、前提 1)
  • 3. 配布の記録の Pull Request に ## リリース後テスト の記録が無い間に sprint-close.py --record-pr <記録のPR> --with-verification --dry-run を打つ → 今と同じく、課題は理由「本番の版のリリース後テストの記録が無い」の kept_open になる(退行しない)(マージ前: 既存のテスト)(2026-11-01 合格、前提 1)
  • 4. 雛形どおりに本番 → 仕上げ(リリース後テスト → スプリントを閉じる)まで流す → sprint-close.py --with-verification を打つ前に、配布の記録の Pull Request に ## リリース後テスト の記録が投稿されており、スプリント Pull Request の「手動確認」でリリース後テストへ回した項目もその記録に行として載る(リリース後: この版の後の最初のスプリントで、配布の記録の Pull Request のコメントを見る)(2026-11-01 合格、m26-3 の Release: ndf v10.27.6 #2351 )
  • 5. 上と同じスプリントで、課題の本文の進行の「リリース後テスト」に印が付いた時点で、配布の記録の Pull Request に ## リリース後テスト の記録がある(印と記録が食い違わない)(リリース後: 課題の進行の時刻とコメントの時刻を比べる)
  • 6. stage が「リリース後テスト」のステップを流し、ステップが ok で終わる → 課題の本文の進行の「リリース後テスト」の印は、ステップが ok で終わった後に付き、ステップを始めた時点では付かない(マージ前: 印を付けるスクリプトを差し替えたテストで、呼ばれた順を見る)
  • 7. 同じステップが ok で終わらない(失敗する・承認ゲートで止まる・利用上限で止まる)→ 進行の「リリース後テスト」に印が付かない。同じプランをやり直してステップが ok で終われば、そのときに 1 回だけ付く(マージ前: テスト)
  • 8. stage が「リリース後テスト」以外のステップの印は、今と同じくステップを始めた時点で付く(退行しない)(マージ前: 既存のテスト)

影響

対象 影響
公開インタフェース 変わらない(プランの JSON の形・supervise.py の引数は変えない)
データ 変わらない(進行の行の書式は同じ。時刻が後ろへずれるだけ)
既存の振る舞い 「リリース後テスト」の印が付く時刻が、ステップの開始から ok の終わりへ移る。ステップが落ちたときは印が付かない

検証手段

項目 手段
テスト uv run --frozen --project . --all-extras pytest . -q -n 4(全体テスト)。受け入れ条件 6〜8 は plugins/ndf/scripts/tests/ のプランの実行のテストに足す
静的解析・構造の検査 python3 scripts/check-script-structure.py
配布物の検証 claude plugin validate .
手動確認 受け入れ条件 5: この変更を含む版の後の最初のスプリントで、各課題の進行の「リリース後テスト」の時刻と、配布の記録の Pull Request の ## リリース後テスト のコメントの時刻を比べる(リリース後テストで確かめる)

前提とする取り決め

項目 参照先 / 決めたこと
プロジェクト構造 変更は plugins/ndf/scripts/supervise_lib/ に置く。既定で働くため実験版(experimental/)に置かない(AGENTS.md の「安定版と実験版」)
コーディング規約 AGENTS.md の「最小限のコード実装」。外部コマンドを書く前に実行して確かめる
テスト戦略 プランの実行の単体テストで印の時点を担保する。.md の文言を照合するテストは書かない(AGENTS.md の DON'T)

境界

区分 内容
常に行う 全体テストと構造の検査を通す
確認してから行う(承認ゲート 1・2 で人が見る) ほかの工程の印の時点も変えること(未決 1)
行わない sprint-close.py の判定を緩める。--with-verification を外して課題を閉じる。受け入れ条件 1〜4 の実装を作り直す

未決

項目 誰が決めるか 期限
1. 振り返りなど、ほかの記録を投稿する工程にも「ok で終わった後に印を付ける」を広げるか。#2338(1 回の実行を識別子 1 つで追える記録とログ)の範囲で扱うか この課題の設計(#2338 の設計と突き合わせる) 設計 Pull Request
2. #2356 をこの課題と同じ Pull Request で閉じるか、この課題へまとめて閉じるか 棚卸し(backlog-refinement) マイルストーン 29 を閉じるまで

進行

モード: — / 進め方: auto

  • 要求と受け入れ条件 — 2026-11-02 07:35
  • 作業場所の用意 — 2026-10-31 13:00
  • 設計 — 2026-11-02 07:37
  • 素材の収集と出典の確定
  • ドキュメント再構成 — 2026-11-02 07:44
  • ドキュメントレビュー
  • 計画 — 2026-10-31 13:00
  • 実装 — 2026-10-31 13:01
  • 構造改善 — 2026-10-31 18:37
  • 実装レビュー — 2026-10-31 22:28
  • 完了判定 — 2026-10-31 13:04
  • Pull Request — 2026-10-31 13:42
  • 確定仕様化 — 2026-11-01 00:29
  • 後片付け — 2026-11-01 00:28
  • 配布 — 2026-11-01 00:00
  • 体裁レビュー
  • リリース後テスト — 2026-11-01 00:28
  • 振り返り — 2026-11-01 01:03
  • 棚卸し — 2026-11-01 01:17

振り返り: #2320 (comment)

状況(2026-11-01、m26-3 / v10.27.6)

  • 条件 1〜3 は合格。m26-3 の本番のプラン(8-release-prod.json)でも verify の進行は「配布」だった
  • 条件 4 は合格。記録の PR Release: ndf v10.27.6 #2351 の ## リリース後テスト は close より前に投稿され、スプリント PR スプリント m26-3 #2348 の手動確認の 2 件を行として載せた
  • 条件 5 は文言どおりには満たせない。進行の印は工程に入った時点の記録(課題を閉じる時点を 1 つにし、最終の工程を通ってから閉じる #2228 の前提 3)であり、m26-3 では「リリース後テスト」の印が release-verify のステップに入った時点、記録の投稿はそのステップの終わりの頃だった。条件 5 の文言の書き換えは人の判断を待つ

リリース後テストの取り直し(2026-11-01 17:39 JST)

記録: #2328 (comment)

Activity

  1. added a commit that references this issue on Oct 31, 2026
  2. added 3 commits that reference this issue on Nov 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions