何を見つけたか
cross-refactoring の適用ラウンドで、claude が実装担当のときだけ必須トレーラー
(Item-Id / Round / Impl-Runtime / Impl-Model)が読めず、群が丸ごと取り消される。
原因はトレーラーの書き落としではない。 コミットメッセージには 4 つとも書かれている。
Claude Code のセッションが帰属行(Co-Authored-By: / Claude-Session:)を空行を挟んだ
別の段落として後ろに足すため、git が最終段落だけをトレーラーブロックとして読む。
$ git log -1 --format='%B' 26a0fff | tail -8
Item-Id: R4-004
Round: 4
Impl-Runtime: claude
Impl-Model: default
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
$ git log -1 --format='%(trailers:only,unfold)' 26a0fff
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
同じラウンドの kiro 担当のコミット(84be466)は最終段落が必須トレーラーであるため読める。
$ git log -1 --format='%(trailers:key=Item-Id)' 84be466
Item-Id: R4-003
読み取りは refactor_lib/gitfacts.py の commit_trailers()(--format=%(trailers:only,unfold))。
どこで見つけたか
- 読み取り:
plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/gitfacts.py の commit_trailers()
- 判定:
plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/verify.py の verify_commit_trailers()
- 指示: 適用プロンプトの「コミットの規約」節(
Item-Id などを本文末尾に書くとだけ書いてある)
実測は PR #549 の rf549。提案ラウンド 4 の適用ラウンド 4(実装 claude / 項目 R4-004、
コミット 26a0fff)が
コミット 26a0fff... にトレーラーが欠けています: Item-Id, Round, Impl-Runtime, Impl-Model
で取り消された。同じ形のコミットを rf549 でもう 1 件(4be6fbf)確認している。
PR #529 でも 1 件起きたことが引継ぎメモに残っている。
なぜこの変更の範囲外なのか
#156 の受け入れ条件 14 件は cross-review の指摘の統合・実行検証・反証・区分だけを扱う。
cross-refactoring の適用結果の検証は対象に入っていない。
直さないと何が起きるか
- claude が適用担当に当たったラウンドは、正しく適用してもほぼ確実に落ちる。 輪番は
4 者で回るため、提案ラウンドごとに 1 群が無駄になる
- 失敗が実装担当からは見えない。 結果ファイルの
trailers は 4 つとも揃った形で
書かれ、進行側だけが git を読んで落とす
- 取り消しの単位は適用ラウンドであるため、同じ群に複数の項目が入っていれば全件が巻き込まれる
修正レイヤー
plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/commands/apply.py の cmd_merge_apply(取り込み)。
項目の帰属(Item-Id / Round / Impl-Runtime)の値を割り当てたのは進行側で、公開(push)も進行側だけが
行う(CLAUDE.md:63)。担当に書かせて、git の最終段落の定義で読み返す構造が、ランタイムが後ろへ段落を
足すたびに壊れる。読み取り(gitfacts.py:95 の commit_trailers)を段落単位にする直し(issues/issue-647-592-553-design.md:117
の決定 11)は現れている場所の直しで、次に別の書式の署名を足すランタイムが現れれば同じ形が起きうる。
進行側が知っている値を進行側が取り込みで書けば、担当のランタイムの帰属行の書式に左右されない。
採る手
移動(move_responsibility)。帰属のトレーラーを付ける責務を、実装担当(prompts/apply.md の「コミットの規約」)から
進行側の取り込み(cmd_merge_apply)へ移す。
直し方の候補
修正レイヤーに当たるのは D である。
| 案 |
中身 |
気になる点 |
| A |
commit_trailers() を git interpret-trailers --parse へ変える |
同じく最終段落しか読まない。効かない |
| B |
メッセージ全文から ^<Key>: を正規表現で拾う |
git のトレーラー定義から外れる。本文中の同名の行を拾いうる |
| C |
プロンプトへ「必須トレーラーを最後の段落に置く(帰属行より後ろ)」と書く |
実装担当の従い方に依存する |
| D |
進行側が取り込みの直前に git commit --amend でトレーラーを足し直す |
実装担当のコミットを進行側が書き換える。ただし対象は公開前のコミットで、push は進行側だけが行う(CLAUDE.md:63)ため、書き換えたコミットが公開済みの履歴と食い違うことはない。Impl-Model(実際に使ったモデル名、prompts/apply.md:65)は担当しか知らない値で、進行側が付けるには結果ファイルから受け取る |
由来
PR #549
進行
モード: standard / 作業ツリー: .worktrees/feat/issue-728-apply-intake / 計画: issues/issue-728-647-592-553-plan.md
閉じた理由
PR #796 で直り、ndf 10.16.0(2026-09-22、main / タグ ndf--v10.16.0、PR #810)で配布した。リリース後テスト(#810 (comment) )でこの課題の受け入れ条件はすべて合格した。
振り返り: #810 (comment)
何を見つけたか
cross-refactoringの適用ラウンドで、claude が実装担当のときだけ必須トレーラー(
Item-Id/Round/Impl-Runtime/Impl-Model)が読めず、群が丸ごと取り消される。原因はトレーラーの書き落としではない。 コミットメッセージには 4 つとも書かれている。
Claude Code のセッションが帰属行(
Co-Authored-By:/Claude-Session:)を空行を挟んだ別の段落として後ろに足すため、git が最終段落だけをトレーラーブロックとして読む。
同じラウンドの kiro 担当のコミット(
84be466)は最終段落が必須トレーラーであるため読める。読み取りは
refactor_lib/gitfacts.pyのcommit_trailers()(--format=%(trailers:only,unfold))。どこで見つけたか
plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/gitfacts.pyのcommit_trailers()plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/verify.pyのverify_commit_trailers()Item-Idなどを本文末尾に書くとだけ書いてある)実測は PR #549 の rf549。提案ラウンド 4 の適用ラウンド 4(実装 claude / 項目 R4-004、
コミット
26a0fff)がコミット 26a0fff... にトレーラーが欠けています: Item-Id, Round, Impl-Runtime, Impl-Modelで取り消された。同じ形のコミットを rf549 でもう 1 件(
4be6fbf)確認している。PR #529 でも 1 件起きたことが引継ぎメモに残っている。
なぜこの変更の範囲外なのか
#156 の受け入れ条件 14 件は
cross-reviewの指摘の統合・実行検証・反証・区分だけを扱う。cross-refactoringの適用結果の検証は対象に入っていない。直さないと何が起きるか
4 者で回るため、提案ラウンドごとに 1 群が無駄になる
trailersは 4 つとも揃った形で書かれ、進行側だけが git を読んで落とす
修正レイヤー
plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/commands/apply.pyのcmd_merge_apply(取り込み)。項目の帰属(
Item-Id/Round/Impl-Runtime)の値を割り当てたのは進行側で、公開(push)も進行側だけが行う(
CLAUDE.md:63)。担当に書かせて、git の最終段落の定義で読み返す構造が、ランタイムが後ろへ段落を足すたびに壊れる。読み取り(
gitfacts.py:95のcommit_trailers)を段落単位にする直し(issues/issue-647-592-553-design.md:117の決定 11)は現れている場所の直しで、次に別の書式の署名を足すランタイムが現れれば同じ形が起きうる。
進行側が知っている値を進行側が取り込みで書けば、担当のランタイムの帰属行の書式に左右されない。
採る手
移動(
move_responsibility)。帰属のトレーラーを付ける責務を、実装担当(prompts/apply.mdの「コミットの規約」)から進行側の取り込み(
cmd_merge_apply)へ移す。直し方の候補
修正レイヤーに当たるのは D である。
commit_trailers()をgit interpret-trailers --parseへ変える^<Key>:を正規表現で拾うgit commit --amendでトレーラーを足し直すCLAUDE.md:63)ため、書き換えたコミットが公開済みの履歴と食い違うことはない。Impl-Model(実際に使ったモデル名、prompts/apply.md:65)は担当しか知らない値で、進行側が付けるには結果ファイルから受け取る由来
PR #549
進行
モード: standard / 作業ツリー:
.worktrees/feat/issue-728-apply-intake/ 計画:issues/issue-728-647-592-553-plan.md閉じた理由
PR #796 で直り、ndf 10.16.0(2026-09-22、
main/ タグndf--v10.16.0、PR #810)で配布した。リリース後テスト(#810 (comment) )でこの課題の受け入れ条件はすべて合格した。振り返り: #810 (comment)