Skip to content

cross-refactoring: 帰属行が別段落に付くと必須トレーラーが読めず、claude 担当の群が落ちる #553

Description

@takemi-ohama

何を見つけたか

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.pycommit_trailers()--format=%(trailers:only,unfold))。

どこで見つけたか

  • 読み取り: plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/gitfacts.pycommit_trailers()
  • 判定: plugins/ndf/skills/cross-refactoring/scripts/refactor_lib/verify.pyverify_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.pycmd_merge_apply(取り込み)。
項目の帰属(Item-Id / Round / Impl-Runtime)の値を割り当てたのは進行側で、公開(push)も進行側だけが
行う(CLAUDE.md:63)。担当に書かせて、git の最終段落の定義で読み返す構造が、ランタイムが後ろへ段落を
足すたびに壊れる。読み取り(gitfacts.py:95commit_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

  • 要求と受け入れ条件 — 2026-09-15 12:46
  • 作業場所の用意 — 2026-09-15 12:45
  • 設計 — 2026-09-15 13:45
  • 素材の収集と出典の確定
  • ドキュメント再構成 — 2026-09-15 13:45
  • ドキュメントレビュー — 2026-09-15 13:46
  • 計画 — 2026-09-21 21:27
  • 実装 — 2026-09-21 21:47
  • 構造改善 — 2026-09-21 22:19
  • 実装レビュー — 2026-09-22 02:28
  • 完了判定 — 2026-09-22 02:44
  • Pull Request — 2026-09-21 22:16
  • 確定仕様化 — 2026-09-22 03:43
  • 後片付け — 2026-09-22 03:31
  • 配布 — 2026-09-22 14:17
  • 体裁レビュー
  • リリース後テスト — 2026-09-22 15:06
  • 振り返り — 2026-09-22 15:38

閉じた理由

PR #796 で直り、ndf 10.16.0(2026-09-22、main / タグ ndf--v10.16.0、PR #810)で配布した。リリース後テスト(#810 (comment) )でこの課題の受け入れ条件はすべて合格した。

振り返り: #810 (comment)

Activity

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

    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