Skip to content

sprint-close: 最終工程を通っていない課題を、リリース後テストの前に閉じないようにする #2119

Closed

Description

@takemi-ohama

何を見つけたか

standard のスプリント s2086 で、本番 v10.20.0 の後に conductor が sprint-close.py --record-pr 2109 --prs 2092,2088,2090(--with-verification なし)を打ち、#2086・#2083・#2080・#469 をリリース後テストの前に閉じた。その後のリリース後テストで #2086 の受け入れ条件 10 が不合格になったが、#2086 は閉じたまま残った。

progress-tracking の「スプリントを閉じる」は、振り返りを通る変更では振り返りの記録の後に閉じると定め、release-verification は「不合格・保留の条件を持つ課題は閉じない」と定める。どちらも文書の決まりで、sprint-close.py は呼ばれた時点で止めない。

  • 課題の工程表(本文の進行)には「リリース後テスト」「振り返り」が未通過と出ているのに、--with-verification を付けずに打てば閉じる
  • 先に閉じた原因は、引継ぎ文書(.ndf/handoff/issue-2086.md)の「次にやること」に conductor が「課題を閉じる」を先頭に書いたこと

どこで見つけたか

#2086 の振り返り(2026-10-25)。記録は PR #2109 のリリース後テストのコメントと、#2086 の本文の末尾の行。

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

#2086 は文書系の Skill を変える課題で、スプリントを閉じるスクリプトは受け入れ条件に無い。sprint-close.py に工程の通過を見させるかは契約(引数と終了コード)に関わり、即時修正の条件 2 を満たさない。根拠: NDF の共通原則「判断の範囲は目の前の変更・操作に限る」(MVV 版 3)。

直さないと何が起きるか

会話をまたいで工程を続けるとき、引継ぎ文書の手順の並びを書き違えるだけで、確かめていない課題が閉じる。閉じた課題は棚卸しの対象から外れ、不合格の条件が残ったことが見えなくなる。

起票者の推定

  • 直し方の候補は (a) sprint-close.py が、課題の工程表で振り返り(または最終工程)を通っていないときに止まる、(b) 工程表にリリース後テストを持つモードでは --with-verification を既定にする、(c) 引継ぎ文書の「次にやること」を工程表から機械で書く(推した出所: 今回の経緯)

由来

issue #2086

修正レイヤー

親 #2228(課題を閉じる時点の正本)。sprint-close.py は工程の通過を見ない。雛形の supervise_lib/sprint.py の close_plan は release-verify → close → retro → refine の順で、振り返りの前に課題を閉じる。これは progress-tracking/SKILL.md の「振り返りを通る変更では、retrospective が記録を投稿した後に閉じる」と食い違う。closed_unverified は --with-verification を付けたときだけ働く。

受け入れ条件

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

  • 1. 最終工程(棚卸しの前に最後に通る工程。振り返りを通る変更なら振り返り)をまだ通っていない課題を含めて sprint-close.py --record-pr <記録のPR> --issues <番号> を打つ → --with-verification の有無にかかわらず、その課題は閉じず、結果 JSON の items に kept_open と、通っていない工程が分かる理由で載る(マージ前: gh と工程の通過の記録を差し替えたテスト)
  • 2. 最終工程を通り、リリース後テストの行がすべて合格の課題で、--with-verification を付けて打つ → 今と同じく受け入れ条件へ [x] を付けて閉じる(退行しない)(マージ前: 既存のテストと追加のテスト)
  • 3. 振り返りを通るモードで supervise.py new close が書くまとめのプランを読む → steps の並びが、リリース後テスト(配布の記録があるとき)→ 振り返り → 課題を閉じる → 棚卸しの順で、progress-tracking の「スプリントを閉じる」の表(retrospective は記録を投稿した後に閉じる)と一致する。今の supervise_lib/sprint.py の close_plan は close → retro → refine の順である(マージ前: プランを組んで steps の id を並べるテスト)
  • 4. 同じプランを流す → 課題を閉じるステップの時点で、振り返りの記録(Pull Request のコメント)が投稿済みで、棚卸しのステップがそれより後に始まる(マージ前: プランの next のつながりをたどるテスト)
  • 5. この版の後の最初のスプリントの仕上げで、引継ぎ文書や conductor の手順の並びに関わらず sprint-close.py を先に打っても、振り返りの前の課題が閉じない(リリース後: 実際のスプリントの仕上げの結果 JSON と課題の closedAt を見る)

進行

モード: — / 進め方: auto

  • 要求と受け入れ条件
  • 作業場所の用意 — 2026-10-31 13:00
  • 設計
  • 素材の収集と出典の確定
  • ドキュメント再構成
  • ドキュメントレビュー
  • 計画 — 2026-10-31 13:00
  • 実装 — 2026-10-31 13:01
  • 構造改善 — 2026-10-31 18:37
  • 実装レビュー — 2026-10-31 22:28
  • 完了判定 — 2026-10-31 16:12
  • Pull Request — 2026-10-31 16:25
  • 確定仕様化 — 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、v10.27.6)

受け入れ条件 1〜4 は v10.27.5 のリリース後テスト(#2328 )で合格。条件 5 は v10.27.5 の後の最初のスプリント m26-3 で確かめた。まとめのプランはリリース後テスト → 振り返り → 課題を閉じる → 棚卸しの順で流れ、#2044・#2121 は振り返りの記録(#2352 、09:14:47Z)の後に閉じた(09:20:54Z)。振り返りの行を持たない #2354 へ sprint-close.py --record-pr 2351 --issues 2354 --dry-run を打つと kept_open(最終工程(振り返り)の記録が無い)を返す。関連テスト(test_sprint_close_final_stage.py ほか 7 ファイル)は 158 件合格。

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: ndf-skillNDF の Skill 本体bugSomething isn't workingpriority: high実害・安全機構の欠落など、優先して対応する

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions