Skip to content

Release: ndf v10.27.18 - #2521

Merged
takemi-ohama merged 2 commits into
developfrom
release/v10.27.18
Nov 5, 2026
Merged

takemi-ohama merged 2 commits into
developfrom
release/v10.27.18

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

ndf v10.27.18 のリリース(prod)。対象の plugin: ndf

含む PR

チェックの結果

  • check-doc-staleness: pass(documented skill counts and versions are up to date)
  • validate-runtime-plugins: pass(runtime plugin validation passed)

🤖 Generated with Claude Code

@takemi-ohama
takemi-ohama merged commit 3390b27 into develop Nov 5, 2026
23 checks passed
@takemi-ohama
takemi-ohama deleted the release/v10.27.18 branch November 5, 2026 01:08
@takemi-ohama
takemi-ohama restored the release/v10.27.18 branch November 5, 2026 01:08
@takemi-ohama
takemi-ohama deleted the release/v10.27.18 branch November 5, 2026 01:12
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

配布の記録

段階: 本番(承認ゲート 2 の承認の後、2026-11-05 10:12 に ndf--v10.27.18 を出した)
版: 10.27.16 → 10.27.18(タグ ndf--v10.27.18。直前はタグ ndf--v10.27.16)
スプリント: PR #2478 / #2479 / #2480 / #2481 / #2493 / #2495 / #2496 / #2498 / #2499 / #2500 / #2502 / #2506 / #2508 / #2511 / #2513

@takemi-ohama

Copy link
Copy Markdown
Contributor Author

リリース後テスト

対象の版: 10.27.18(2026-11-05 10:12 JST、タグ ndf--v10.27.18。本番(main))
導入経路: 利用者と同じ手順。隔離した HOME で claude plugin marketplace add devbasex/ai-plugins → claude plugin install ndf@ai-plugins、Codex は codex plugin marketplace add → codex plugin add ndf@ai-plugins(release-verification-steps.py verify-install --ref main --expect 10.27.18 --plugins ndf)
対象のスプリント: lflow2-5(#2422 見送ったリファクタリングの提案 24 件。実装 PR #2511 → スプリント PR #2513。タグ ndf--v10.27.18 が #2513 のマージのコミット cb626eb3b を含むことを git tag --contains で確かめた)

受け入れ条件 2〜10 は、タグの中身を切り出した作業ツリー(git worktree add --detach … ndf--v10.27.18)で確かめた。「改修の前」は #2511 のマージの直前(600c4bb16)である。
手動確認の項目: 無し。#2422 の「検証手段」が手動確認を「無し(振る舞いを変えないため、リリース後テストは自動テストの結果で足りる)」とし、スプリント PR #2513 の本文にも手動確認の節が無い。

課題 受け入れ条件 実行したこと 実行時刻 結果
— 導入の確認: 利用者と同じ手順で入れ直し、導入された版と変わったファイルの中身を確かめる release-verification-steps.py verify-install --ref main --expect 10.27.18 --plugins ndf --root . 2026-11-05 11:21 合格 / exit=0、status=ok。claude・codex とも ndf 10.27.18
#2422 1. Pull Request の本文に 24 行の表があり、各行に「改修した」か「採らない」と、採らない行には理由が 1 つ書いてある gh pr view 2511 / gh pr view 2513 / gh pr view 2499 の本文とコメントを読んだ 2026-11-05 11:23 不合格(理由: 実装 PR #2511・スプリント PR #2513・設計 PR #2499 のどの本文にも 24 行の表が無い。判定は設計文書 issues/issue-2422-design.md の「24 行の判定表」にだけある(改修する 17 行・採らない 7 行。採らない 7 行すべてに理由が 1 つある)。判定の中身はそろっているが、条件の求める置き場(PR の本文)に無い)
#2422 2. 「改修した」の行の関数には、その関数を通るテストがあり、改修の前のコミットと後のコミットの両方で通る 対象のテスト 13 か所(test_context_policy_hook.py・test_context_policy.py・test_hook_deadline.py・test_token_guard.py・test_lib_clock.py・test_sprint_loop.py・棚卸しの 3 本・skill-stats/tests・scripts/tests/test_token_usage*.py 3 本)を uv run --frozen --project . --all-extras pytest <13 か所> -q -n 4 で、後(タグ)と前(600c4bb16)で流した。さらに、#2511 で足した現状固定テスト(test_context_policy_hook.py・test_sprint_loop.py・test_agents_report.py・test_skill_stats_wrappers.py)を前のコードへ写して流した 2026-11-05 11:23〜11:27 合格 / 後: 513 passed(exit=0)。前: 501 passed(exit=0)。足した現状固定テストを前のコードで流すと 172 passed。test_context_policy_hook.py の import context_calibrate は、前のコードでは分割前の context_decisions へ読み替えた(context_calibrate は #2513 の cross-refactoring 88af7c3db が切り出したモジュール)。test_lib_clock.py の epoch_seconds のテスト 5 件は前のコードで落ちる。改修で新しく作った関数のテストで、行 6(parse_ts)の振る舞いは前後で通るほかのテストが縛っている
#2422 3. 重複(duplication)を「改修した」の行では、同じ処理の本体が plugins/ の中で 1 か所だけに定義されている タグの中身で grep -rn を打った(def usage_call・epoch_seconds・show-toplevel・is_positive_int・_is_ran/_last_ran・record_row) 2026-11-05 11:29 合格 / 行 1・15: usage_call は lib/context_decisions.py:262 の 1 か所で、ledger_calls もそれを呼ぶ。行 6: 本体は lib/clock.py:76 の epoch_seconds だけ(context_decisions.parse_ts は別名、upkeep_research.py も呼ぶ)。行 10: show-toplevel は context_decisions.py:73 の 1 か所(token_guard.py から消えた)。行 11: 判定は upkeep_depth.py の _is_ran・_last_ran の 1 か所。行 17: context_policy.py:133 の is_positive_int を read_window も呼ぶ。行 21: 再起動の行は cmd_record と record_restart が同じ record_row を呼ぶ
#2422 4. 長い関数(long_method)と深い入れ子(deep_nesting)を「改修した」の行では、行数か深さが改修の前より小さい(数値を本文の表に書く) Python の構文木(ast)で、設計文書と同じ測り方(定義の行から本体の最後まで・elif を if と同じ段に数える)で前後を測った 2026-11-05 11:23 不合格(理由: 行数と深さはすべて前より小さい(下の「改修の前後の数値」)。ただし数値が PR の本文の表に無い。条件 1 と同じく本文に表が無いため)
#2422 5. 名前の無い値(magic_value)を「改修した」の行では、その値が名前の付いた定数を通して参照されている grep -n "def _trial_cause" -A12 plugins/ndf/scripts/hook_lib/token_guard.py 2026-11-05 11:29 合格 / 行 5: cp.TRIAL・cp.REASON_CAPACITY・cp.REASON_COST で比べ、生の文字列 "trial"・"容量"・"費用" での比較は残っていない
#2422 6. uv run --frozen --project . --all-extras pytest . -q -n 4 が通る 1 回で流すと手元の待ちの上限(590 秒)に当たったため、pytest plugins/ndf/scripts -q -n 4 と pytest . --ignore=plugins/ndf/scripts -q -n 4 に分けて全体を流した 2026-11-05 11:37〜11:51 合格 / 5780 passed・4 skipped(exit=0、480.7 秒)と 5591 passed(exit=0、265.9 秒)
#2422 7. check-script-structure.py・check-ndf-contracts.py・check-lint.sh が 0 で終わる python3 scripts/check-script-structure.py / python3 scripts/check-ndf-contracts.py / bash scripts/check-lint.sh 2026-11-05 11:27 合格 / 3 本とも exit=0(違反なし)
#2422 8. plugins/ndf/contracts/ に差分が無い git diff <スプリントの起点 d90d65268> <スプリントの先頭 fc2a0bf05> -- plugins/ndf/contracts/ 2026-11-05 11:51 合格 / 差分 0 行
#2422 9. plugins/ の Python が scripts/ のモジュールを新たに import していない 同じ範囲の git diff -- 'plugins/*.py' の追加行から scripts の import を探した 2026-11-05 11:51 合格 / 該当 0 行
#2422 10. plugins/ndf/.claude-plugin/plugin.json の version が変わっていない 同じ範囲の git diff -- plugins/ndf/.claude-plugin/plugin.json 2026-11-05 11:51 合格 / 差分 0 行(版はスプリントの後のリリースで上げた)
— マージ前の未検証(#2511 の残リスク): 設計文書に名前の出るテストの照合が exit 1 で止まり、どのテストか未確認 python3 plugins/ndf/scripts/design-match.py tests --issue 2422 --root . 2026-11-05 11:51 合格(特定した: 設計文書 issues/issue-2422-design.md 334 行目の tests/test_hook_deadline.py。実体は plugins/ndf/scripts/tests/test_hook_deadline.py にあり、条件 2 の実行で通った。照合はパスの書き方の違いで今も exit 1 を返す)
— マージ前の未検証(#2511 の「設計と違う点」): 追加した現状固定テスト 3 件が、既存のテストと同じ振る舞いを二重に縛っているか — — 保留(理由: 重なりの有無はテストの保守の判断で、リリースした成果物の振る舞いでは決まらない。3 件が前後で通ることは条件 2 で確かめた。振り返りで扱う)
— マージ前の未検証(設計 PR #2499): 要求文書の検査(requirements-check)が exit 2 で止まった python3 plugins/ndf/scripts/spec-copy.py check 2422 issues/issue-2422-requirements.md 2026-11-05 11:51 合格 / exit=0(写しは #2422 の本文と一致する)

改修の前後の数値(条件 4)

前は 600c4bb16、後はタグ ndf--v10.27.18。後の値は #2513 の cross-refactoring の改修も含む。

行 関数 兆候 前の行数 / 深さ 後の行数 / 深さ
2 context-policy.py#report_work long_method 59 / 3 23 / 0
3 context-policy.py#session_parts long_method 55 / 3 34 / 1
4 skill-stats.py#aggregate_by_project deep_nesting 38 / 5 28 / 3
7 upkeep_research.py#run_research long_method 84 / 4 67 / 4
12 scripts/token-usage.py#read_codex long_method 58 / 4 24 / 2
16 context_decisions.py#read_calls long_method 59 / 2 33 / 2
18 sprint_loop_select.py#run_selection long_method 70 / 2 27 / 1
19 upkeep_overhaul.py#count_types divergent_change 37 / 2 22 / 1
14 skill-stats.py#emit_json data_clump 53 行・引数 12 個 48 行・引数 7 個

合否: 不合格(14 行のうち 11 行が合格・2 行が不合格・1 行が保留)。不合格の 2 件(条件 1・4)は、判定の表と前後の数値が PR の本文に無いことである。判定の中身は設計文書にそろい、数値はこのコメントにある。振る舞いの条件(2・3・5〜10)はすべて合格した
起票したもの: なし(理由: 不合格の 2 件は記録の置き場の食い違いで、利用者へ届いた不具合ではない。起票するか、設計文書とこのコメントで条件を満たしたとみなすかは人が決める。Value 3)

@takemi-ohama

Copy link
Copy Markdown
Contributor Author

リリース後テスト

対象の版: 10.27.18(2026-11-05 10:12 JST、タグ ndf--v10.27.18。本番(main))
導入経路: 利用者と同じ手順。隔離した HOME で claude plugin marketplace add devbasex/ai-plugins → claude plugin install ndf@ai-plugins、Codex は codex plugin marketplace add → codex plugin add ndf@ai-plugins(release-verification-steps.py verify-install --ref main)
対象のスプリント: lflow2-5(#2422 見送ったリファクタリングの提案 24 件。実装 PR #2511 → スプリント PR #2513)

この記録は、前の記録(#2521 (comment) 、11:52 JST)を置き換える。 前の記録で不合格だった条件 1・4(判定の表と前後の数値が Pull Request の本文に無い)は、その後 11:54 JST にスプリント PR #2513 の本文へ「24 行の判定と改修の前後」の節が足された。今回はその本文を読み直し、数値をタグの中身で測り直した。

本番の main は、この確認の時点で 10.27.19(11:35 JST に配布。配布の記録は #2531)へ進んでいた。 利用者が今受け取るのは 10.27.19 である。10.27.19 はスプリントのマージのコミット cb626eb3b を含み(git tag --contains)、スプリントが変えたファイル(plugins/ndf/scripts・skills/skill-stats・skills/backlog-refinement/scripts・scripts/token-usage.py)は 10.27.18 と 10.27.19 の間で差分 0 行である(git diff --stat ndf--v10.27.18 ndf--v10.27.19 -- …)。このため、10.27.18 のタグで前の記録が得た結果(条件 3・5・6・8〜10)は 10.27.19 でもそのまま成り立つ。これらの行は前の記録の実行時刻のまま載せた。

手動確認の項目: 無し。#2422 の「検証手段」が手動確認を「無し(振る舞いを変えないため、リリース後テストは自動テストの結果で足りる)」とする。

課題 受け入れ条件 実行したこと 実行時刻 結果
— 導入の確認: 利用者と同じ手順で入れ直し、導入された版と変わったファイルの中身を確かめる release-verification-steps.py verify-install --ref main --expect 10.27.19 --plugins ndf --root .(先に --expect 10.27.18 で打つと、main が 10.27.19 へ進んでいたため exit=1・version_mismatch) 2026-11-05 11:55 合格 / exit=0、status=ok。main(b2ee756c)から claude・codex とも ndf 10.27.19、中身の不一致 0 件、利用者の HOME は変わらない
#2422 1. Pull Request の本文に 24 行の表があり、各行に「改修した」か「採らない」と、採らない行には理由が 1 つ書いてある gh pr view 2513 --json body の本文の表の行を数えた 2026-11-05 11:55 合格 / #2513 の本文「24 行の判定と改修の前後」に 24 行。改修する 17 行・採らない 7 行(行 8・9・13・20・22・23・24)で、採らない 7 行すべてに理由が 1 つある
#2422 2. 「改修した」の行の関数には、その関数を通るテストがあり、改修の前のコミットと後のコミットの両方で通る 後: 10.27.19 のタグの作業ツリーで uv run --frozen --project . --all-extras pytest <対象のテスト。backlog-refinement は Skill の全体> -q -n 4。前(600c4bb16)は前の記録の結果 2026-11-05 11:56〜11:57(前は 11:23〜11:27) 合格 / 後: 616 passed(exit=0、44 秒)。前: 501 passed(exit=0)。#2511 で足した現状固定テストを前のコードで流すと 172 passed(前の記録)
#2422 3. 重複(duplication)を「改修した」の行では、同じ処理の本体が plugins/ の中で 1 か所だけに定義されている 前の記録の grep -rn(10.27.18 のタグ。対象のファイルは 10.27.19 と差分 0) 2026-11-05 11:29 合格 / 行 1・15 usage_call、行 6 epoch_seconds、行 10 show-toplevel、行 11 _is_ran/_last_ran、行 17 is_positive_int、行 21 record_row がそれぞれ 1 か所
#2422 4. 長い関数(long_method)と深い入れ子(deep_nesting)を「改修した」の行では、行数か深さが改修の前より小さい(数値を本文の表に書く) 前(600c4bb16)と後(10.27.19 のタグ)を git archive で切り出し、ast で定義の行から本体の最後までの行数と入れ子の深さ(elif は if と同じ段)を測り、#2513 の本文の表と突き合わせた 2026-11-05 11:55〜11:56 合格 / 本文の表に前後の数値があり、測った値と 9 行すべて一致する。行 2: 59/3→23/0、行 3: 55/3→34/1、行 4: 38/5→28/3、行 7: 84/4→67/4(行数が小さい)、行 12: 58/4→24/2、行 16: 59/2→33/2(行数が小さい)、行 18: 70/2→27/1。採らない行 9 は対象外
#2422 5. 名前の無い値(magic_value)を「改修した」の行では、その値が名前の付いた定数を通して参照されている 前の記録の grep -n "def _trial_cause" -A12 plugins/ndf/scripts/hook_lib/token_guard.py 2026-11-05 11:29 合格 / 行 5: cp.TRIAL・cp.REASON_CAPACITY・cp.REASON_COST で比べ、生の文字列の比較は残っていない
#2422 6. uv run --frozen --project . --all-extras pytest . -q -n 4 が通る 前の記録(10.27.18 のタグ)。手元の待ちの上限(590 秒)のため pytest plugins/ndf/scripts と pytest . --ignore=plugins/ndf/scripts に分けた 2026-11-05 11:37〜11:51 合格 / 5780 passed・4 skipped(exit=0)と 5591 passed(exit=0)
#2422 7. check-script-structure.py・check-ndf-contracts.py・check-lint.sh が 0 で終わる 10.27.19 のタグの作業ツリー(git worktree add --detach)で 3 本を打った 2026-11-05 11:56 合格 / 3 本とも exit=0(構造 484 ファイル・違反 0、契約 エントリポイント 79 本・違反 0、lint Python 1030 本・sh 66 本 違反なし)
#2422 8. plugins/ndf/contracts/ に差分が無い 前の記録の git diff d90d65268 fc2a0bf05 -- plugins/ndf/contracts/ 2026-11-05 11:51 合格 / 差分 0 行
#2422 9. plugins/ の Python が scripts/ のモジュールを新たに import していない 前の記録の、同じ範囲の git diff -- 'plugins/*.py' の追加行の検索 2026-11-05 11:51 合格 / 該当 0 行
#2422 10. plugins/ndf/.claude-plugin/plugin.json の version が変わっていない 前の記録の、同じ範囲の git diff -- plugins/ndf/.claude-plugin/plugin.json 2026-11-05 11:51 合格 / 差分 0 行
— マージ前の未検証(#2511 の残リスク): 設計文書に名前の出るテストの照合が exit 1 で止まり、どのテストか未確認 前の記録の design-match.py tests --issue 2422 2026-11-05 11:51 合格(特定した: tests/test_hook_deadline.py の書き方の違い。実体 plugins/ndf/scripts/tests/test_hook_deadline.py は条件 2 で通った)
— マージ前の未検証(#2511 の「設計と違う点」): 追加した現状固定テスト 3 件が、既存のテストと同じ振る舞いを二重に縛っているか — — 保留(理由: 重なりの有無はテストの保守の判断で、リリースした成果物の振る舞いでは決まらない。前後で通ることは条件 2 で確かめた。振り返りで扱う)
— マージ前の未検証(設計 PR #2499): 要求文書の検査(requirements-check)が exit 2 で止まった 前の記録の spec-copy.py check 2422 issues/issue-2422-requirements.md 2026-11-05 11:51 合格 / exit=0

合否: 合格(#2422 の受け入れ条件 10 件すべて合格。表の 14 行のうち 13 行が合格、1 行が保留。保留はスプリントの未検証のうちテストの保守の判断で、受け入れ条件ではない)
起票したもの: なし

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