chore(takt): PR chain 宣言規約と chain-aware simplicity review を追加 (ADR-069) - #349
Conversation
PR size gate (>1500 行で分割強制)・simplicity review の missing-consumer 検査 (dead-on-arrival / premature abstraction)・Multi-PR chaining 規約の 3 つは、内部 レイヤリングを持つ大型機能で同時充足できない — チェーンの先頭 PR は必ず「消費者の いない何か」を導入するため、宣言の仕組みが無い限り先頭 PR が構造的に REJECT される (2026-08-02 の WP-17 PR 2a incident の根本原因の片側)。 追加した降格ルール: - diff 内の計画文書 (または diff の module doc が明示参照する計画文書 — 既存の limited cross-file lookup の範囲) が「後続 PR と抽出↔呼び手のペアリング」を具体名で 宣言している場合、宣言済み項目への missing-consumer findings は non-blocking warning に降格する。Warnings への記録は残す (後続が land しない場合の監査痕跡) - fail-closed 3 条件: 宣言が無い / ペアリングが具体的でない / 宣言の名前が code と 不一致 → 従来どおり blocking。特に「diff 内計画書が code と矛盾する」ケース (incident で実際に起きた形) は矛盾を cite して blocking のまま - 未宣言の投機的抽象への検査は一切緩めない あわせて ADR-068 残課題の fix suggestion 記述規約を追加: 複数 remedy がある finding は 最も破壊的でない処置を先頭に書く (fix step は先頭候補に従う傾向があり、最破壊処置が 先頭だったことが gut-revert incident の一因)。 whole-tree variant (review-simplicity-whole.md) は push を block しないため対象外 (ADR-069 に記録)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
3 ゲート (size gate / Multi-PR chaining 規約 / simplicity の missing-consumer 検査) の 合成デッドロックと、その解消規約を永続化する。前コミットの reviewer instruction 変更が 実装で、本 ADR がその決定記録。 記録する決定 4 点: 1. PR chain 宣言規約: チェーンの先頭/中間 PR は diff 内の計画文書で「後続 PR と 抽出↔呼び手のペアリング」を具体名で宣言する 2. chain-aware review 降格: 有効な宣言がある項目に限り missing-consumer findings を non-blocking warning へ降格 (fail-closed 3 条件つき)。whole-tree variant は push を block しないため対象外 3. 切断点ヒューリスティクス: 抽出と最初の呼び手の間で切らない / 良い関節が無ければ PR_SIZE_CHECK_OVERRIDE + 明記が正当 (incident の初回 2 分割はこの判断を誤った実例) 4. fix suggestion 記述規約: 最も破壊的でない処置を先頭に書く (ADR-068 残課題の引き取り) 試験運用判断: 宣言付き chain PR 3-5 本で (a) 有効宣言の先頭 PR が REJECT されない (b) 未宣言の投機的抽象は引き続き REJECT (c) 名前不一致は blocking のまま、を確認。 期限 2026-11-03。直近の検証機会は WP-17 再分割チェーン (2a/2b/2c) 自身。 dev-conventions.md に運用向けの要約 4 点 + 由来を追記し、CLAUDE.md の index 2 行 (ADR 一覧 + conventions 概要) を更新した。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ADR-068 が「todo 順位 364」として予告した残課題を正式登録する。 エントリの要点: - ADR-068 の後退検知は削除系 (ファイル脱落 / 追加行削減) のみ検知する 80/20 の暫定。 追加系の injection (finding 対象外ファイルへの書き込み・config 書き換え) は検知不能 - PR #348 security review の non-blocking 注記 (fix step が push-runner-config.toml を 書き換えて backstop を自己弱体化できる経路が instruction 頼み) もこれで閉じる - 判定コアは lib-scope-guard (WP-17 再分割 PR で land 予定) を再利用し、post-pr 経路と 判定の同一性を保つ (ADR-054 の drift 防止)。依存欄にその順序を明記 - 完了基準に「ADR-068 の後退検知では通ってしまう追加系 injection ケースのテスト固定」を 含め、暫定と本命の検知範囲の差を機械的に検証する 登録先: todo14.md (詳細) + todo-summary2.md 末尾 (順位行、ADR-033)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Important Review skippedAuto incremental reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
📝 WalkthroughWalkthroughADR-069を追加し、PRチェーン宣言の要件と分割基準を定義しました。レビュー指示、開発規約、チェックリストに規約を反映しました。関連するscope guardの作業計画もTODOへ追加しました。 ChangesPRチェーン宣言
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🤖 PR Monitor 分析 (GitHub Actions バックストップ)
Applicable Findings (Critical / High / Major)該当なし (findings 0件) Applicable Findings (Medium 以下)該当なし Filtered (not applicable)該当なし 次のアクション
|
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/adr/adr-069-pr-chain-declaration.md`:
- Around line 31-35: 外部の計画文書だけで missing-consumer finding
を降格できないよう、docs/adr/adr-069-pr-chain-declaration.md の宣言配置条件を更新し、参照する計画文書自体が同じ
diff に含まれる場合のみ許可してください。.takt/facets/instructions/review-simplicity.md
の対応する配置条件にも同じ制約を適用し、両サイトで外部文書のみの参照を認めないようにしてください。
- Around line 75-83: ADR-069の「欠点 / 留意点」で、ADR-068 backstop と quality gate が常に
push を保護するという保証を削除または限定してください。pre-push の allowlist
照合が未実装で、追加変更や設定書換えを検出できない現行仕様を明記し、scope guard 実装まで誤降格時に不正な変更が push
され得る残存リスクを記載してください。
- Around line 59-65: 「試験運用判断基準」の decision trigger に、宣言欠落と「将来使う」だけの非具体宣言が warning
に降格されず blocking のまま REJECT
されることを確認する条件を追加してください。既存の有効宣言・未宣言抽象・名前不一致に関する判定は維持してください。
In `@docs/todo14.md`:
- Around line 808-816: 完了基準に、fix step が更新する `.takt/review-diff.txt` は
`ALWAYS_ALLOWED` の中間ファイル例外として許可し、それ以外の finding 対象外ファイルの追加・書換え・削除は block
する条件を追加してください。`lib-scope-guard` の照合と incident 再現テストをこの例外に合わせ、pre-push と post-PR
の契約を一致させてください。
- Around line 806-816: 完了基準に対応する回帰テスト計画へ更新し、finding 対象外ファイルの追加・書き換え・削除がすべて push
時に決定論的に block されるケースを含めてください。さらに、backstop 自己弱体化につながる設定変更もテスト対象へ追加し、ADR-068
の後退検知をすり抜ける追加系 injection を含む各ケースを固定してください。
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: fc9a6c2f-5dc5-4da9-b368-4ccb9f1df696
📒 Files selected for processing (6)
.takt/facets/instructions/review-simplicity.mdCLAUDE.mddocs/adr/adr-069-pr-chain-declaration.mddocs/dev-conventions.mddocs/todo-summary2.mddocs/todo14.md
| | 要件 | 内容 | | ||
| |---|---| | ||
| | 置き場所 | diff 内の計画文書(plan doc / `docs/todoN.md` エントリ)。または diff の module doc が明示参照する計画文書 | | ||
| | 具体性 | 後続 PR と**抽出↔呼び手のペアリング**を具体名で書く(どの crate / exe / 関数を、どの後続変更が消費するか)。「将来使う」だけの宣言は無効 | | ||
| | 名前一致 | 宣言中の名前は diff 内の実名と一致していること。矛盾する宣言は降格根拠にならない(incident の形) | |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
外部計画文書を使った宣言の降格を許可しないでください。
両方の条件が diff 外の計画文書を許可しています。これは PR objective と docs/dev-conventions.md Line 75 の「diff 内の計画文書」という条件と一致しません。古い外部文書だけで missing-consumer finding が warning に降格される可能性があります。
docs/adr/adr-069-pr-chain-declaration.md#L31-L35: 参照先の計画文書自体を同じdiffに要求してください。.takt/facets/instructions/review-simplicity.md#L50-L53: ADR と同じ配置条件を適用してください。
📍 Affects 2 files
docs/adr/adr-069-pr-chain-declaration.md#L31-L35(this comment).takt/facets/instructions/review-simplicity.md#L50-L53
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/adr/adr-069-pr-chain-declaration.md` around lines 31 - 35, 外部の計画文書だけで
missing-consumer finding を降格できないよう、docs/adr/adr-069-pr-chain-declaration.md
の宣言配置条件を更新し、参照する計画文書自体が同じ diff
に含まれる場合のみ許可してください。.takt/facets/instructions/review-simplicity.md
の対応する配置条件にも同じ制約を適用し、両サイトで外部文書のみの参照を認めないようにしてください。
| ## 試験運用判断基準 | ||
|
|
||
| instruction / 規約層のみの変更のため config opt-in は無い(kill-switch は instruction の revert)。次を観測して本採用 / 改訂を判断する: | ||
|
|
||
| - **decision trigger**: 宣言付き chain PR が 3〜5 本流れた時点で、(a) 有効な宣言を持つ先頭 PR が missing-consumer で REJECT されないこと、(b) 未宣言の投機的抽象が引き続き REJECT されること、(c) 名前不一致が blocking のままであること、を確認する。 | ||
| - **期限**: 2026-11-03 までに判定材料が集まらなければ、chain 分割の発生頻度に照らして延長 / 却下を決める。 | ||
| - 直近の検証機会: WP-17 の再分割チェーン(2a / 2b / 2c)が最初の宣言付き chain になる。 |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
欠落・非具体宣言の blocking を試験基準に追加してください。
現在の基準は、有効な宣言、未宣言の抽象化、名前不一致を確認します。宣言なしと「将来使う」だけの非具体宣言を確認しません。この欠落があると、非具体宣言を誤って warning に降格しても試験を通過します。
修正案
- **decision trigger**: 宣言付き chain PR が 3〜5 本流れた時点で、(a) 有効な宣言を持つ先頭 PR が missing-consumer で REJECT されないこと、(b) 未宣言の投機的抽象が引き続き REJECT されること、(c) 名前不一致が blocking のままであること、を確認する。
+ **decision trigger**: 宣言付き chain PR が 3〜5 本流れた時点で、(a) 有効な宣言を持つ先頭 PR が missing-consumer で REJECT されないこと、(b) 未宣言の投機的抽象が引き続き REJECT されること、(c) 名前不一致が blocking のままであること、(d) 宣言なしまたは非具体宣言が blocking のままであること、を確認する。📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| ## 試験運用判断基準 | |
| instruction / 規約層のみの変更のため config opt-in は無い(kill-switch は instruction の revert)。次を観測して本採用 / 改訂を判断する: | |
| - **decision trigger**: 宣言付き chain PR が 3〜5 本流れた時点で、(a) 有効な宣言を持つ先頭 PR が missing-consumer で REJECT されないこと、(b) 未宣言の投機的抽象が引き続き REJECT されること、(c) 名前不一致が blocking のままであること、を確認する。 | |
| - **期限**: 2026-11-03 までに判定材料が集まらなければ、chain 分割の発生頻度に照らして延長 / 却下を決める。 | |
| - 直近の検証機会: WP-17 の再分割チェーン(2a / 2b / 2c)が最初の宣言付き chain になる。 | |
| ## 試験運用判断基準 | |
| instruction / 規約層のみの変更のため config opt-in は無い(kill-switch は instruction の revert)。次を観測して本採用 / 改訂を判断する: | |
| - **decision trigger**: 宣言付き chain PR が 3〜5 本流れた時点で、(a) 有効な宣言を持つ先頭 PR が missing-consumer で REJECT されないこと、(b) 未宣言の投機的抽象が引き続き REJECT されること、(c) 名前不一致が blocking のままであること、(d) 宣言なしまたは非具体宣言が blocking のままであること、を確認する。 | |
| - **期限**: 2026-11-03 までに判定材料が集まらなければ、chain 分割の発生頻度に照らして延長 / 却下を決める。 | |
| - 直近の検証機会: WP-17 の再分割チェーン(2a / 2b / 2c)が最初の宣言付き chain になる。 |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/adr/adr-069-pr-chain-declaration.md` around lines 59 - 65, 「試験運用判断基準」の
decision trigger に、宣言欠落と「将来使う」だけの非具体宣言が warning に降格されず blocking のまま REJECT
されることを確認する条件を追加してください。既存の有効宣言・未宣言抽象・名前不一致に関する判定は維持してください。
| ### 欠点 / 留意点 | ||
|
|
||
| - 宣言の維持コスト: チェーン構成が変わったら宣言も更新が要る。stale な宣言は名前不一致で fail-closed に倒れる(安全側だが手戻り)。 | ||
| - 降格は LLM instruction 層であり決定論的ではない。降格の誤適用(無効な宣言を有効と誤読)は起こりうるが、その場合も「warning に落ちる」だけで push 自体は ADR-068 backstop と quality gate が守る。 | ||
| - 中間 PR(呼び手はあるが自分も次への供給を含む)は宣言を両方向に書く必要がある。 | ||
|
|
||
| ### 残課題 | ||
|
|
||
| - 宣言の機械検証(宣言中の名前が diff の実名と一致するかの決定論チェック)は未実装。降格の誤適用が観測されたら検討する。 |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
pre-push backstop の保護範囲を正確に記述してください。
Line 78 は、無効な宣言を誤って有効と判定しても ADR-068 backstop と quality gate が push を保護すると記載しています。しかし docs/todo14.md Lines 796-816 は、pre-push の allowlist 照合が未実装であり、現行 backstop が追加変更や設定書換えを検出できないと記載しています。この記述は誤った安全保証になります。
scope guard が実装されるまで、誤降格時の残存リスクを明記してください。
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/adr/adr-069-pr-chain-declaration.md` around lines 75 - 83, ADR-069の「欠点 /
留意点」で、ADR-068 backstop と quality gate が常に push を保護するという保証を削除または限定してください。pre-push
の allowlist 照合が未実装で、追加変更や設定書換えを検出できない現行仕様を明記し、scope guard 実装まで誤降格時に不正な変更が push
され得る残存リスクを記載してください。
| #### 作業計画 | ||
|
|
||
| - [ ] findings レポート (.takt/runs/ 最新 run) から Location 列を抽出する parser (fail-closed) | ||
| - [ ] lib-scope-guard で allowlist 照合、violation は loud block + 独立 kill-switch | ||
| - [ ] incident 再現テスト (finding 対象外ファイルへの追加系変更が block されること) | ||
| - [ ] fix.md / fix-supervisor.md の「pre-push は後退検知のみ」記述を更新 | ||
| - [ ] 本エントリ削除 + todo-summary2.md 行削除 | ||
|
|
||
| #### 完了基準 | ||
|
|
||
| - fix step が finding 対象外ファイルを変更 (追加・書き換え・削除いずれも) した push が、決定論的に block されること。ADR-068 の後退検知では通ってしまう「追加系 injection」ケースがテストで固定されていること。 |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
回帰テスト計画を完了基準の全ケースに合わせてください。
Line 810 は追加系変更だけをテスト対象にしています。一方、Lines 798 と 816 は追加・書換え・削除、および backstop 自己弱体化の設定変更を対象にしています。追加系だけでは、完了基準を満たしたことを確認できません。
修正案
-- [ ] incident 再現テスト (finding 対象外ファイルへの追加系変更が block されること)
+- [ ] incident 再現テスト (finding 対象外ファイルへの追加・書換え・削除が block されること)
+- [ ] `push-runner-config.toml` の `max_added_line_shrink_pct` / `enabled` 書換えが block されること📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| #### 作業計画 | |
| - [ ] findings レポート (.takt/runs/ 最新 run) から Location 列を抽出する parser (fail-closed) | |
| - [ ] lib-scope-guard で allowlist 照合、violation は loud block + 独立 kill-switch | |
| - [ ] incident 再現テスト (finding 対象外ファイルへの追加系変更が block されること) | |
| - [ ] fix.md / fix-supervisor.md の「pre-push は後退検知のみ」記述を更新 | |
| - [ ] 本エントリ削除 + todo-summary2.md 行削除 | |
| #### 完了基準 | |
| - fix step が finding 対象外ファイルを変更 (追加・書き換え・削除いずれも) した push が、決定論的に block されること。ADR-068 の後退検知では通ってしまう「追加系 injection」ケースがテストで固定されていること。 | |
| #### 作業計画 | |
| - [ ] findings レポート (.takt/runs/ 最新 run) から Location 列を抽出する parser (fail-closed) | |
| - [ ] lib-scope-guard で allowlist 照合、violation は loud block + 独立 kill-switch | |
| - [ ] incident 再現テスト (finding 対象外ファイルへの追加・書換え・削除が block されること) | |
| - [ ] `push-runner-config.toml` の `max_added_line_shrink_pct` / `enabled` 書換えが block されること | |
| - [ ] fix.md / fix-supervisor.md の「pre-push は後退検知のみ」記述を更新 | |
| - [ ] 本エントリ削除 + todo-summary2.md 行削除 | |
| #### 完了基準 | |
| - fix step が finding 対象外ファイルを変更 (追加・書き換え・削除いずれも) した push が、決定論的に block されること。ADR-068 の後退検知では通ってしまう「追加系 injection」ケースがテストで固定されていること。 |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/todo14.md` around lines 806 - 816, 完了基準に対応する回帰テスト計画へ更新し、finding
対象外ファイルの追加・書き換え・削除がすべて push 時に決定論的に block されるケースを含めてください。さらに、backstop
自己弱体化につながる設定変更もテスト対象へ追加し、ADR-068 の後退検知をすり抜ける追加系 injection を含む各ケースを固定してください。
| - [ ] findings レポート (.takt/runs/ 最新 run) から Location 列を抽出する parser (fail-closed) | ||
| - [ ] lib-scope-guard で allowlist 照合、violation は loud block + 独立 kill-switch | ||
| - [ ] incident 再現テスト (finding 対象外ファイルへの追加系変更が block されること) | ||
| - [ ] fix.md / fix-supervisor.md の「pre-push は後退検知のみ」記述を更新 | ||
| - [ ] 本エントリ削除 + todo-summary2.md 行削除 | ||
|
|
||
| #### 完了基準 | ||
|
|
||
| - fix step が finding 対象外ファイルを変更 (追加・書き換え・削除いずれも) した push が、決定論的に block されること。ADR-068 の後退検知では通ってしまう「追加系 injection」ケースがテストで固定されていること。 |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
ALWAYS_ALLOWED の中間ファイル例外を完了基準に明記してください。
提供された src/cli-pr-monitor/src/stages/scope_guard.rs では、fix step が更新する .takt/review-diff.txt を ALWAYS_ALLOWED として許可しています。この TODO は lib-scope-guard を再利用し、finding 対象外ファイルの変更を追加・書換え・削除のすべてで block すると記載しています。
この条件をそのまま実装すると、正当な中間ファイル更新を block するか、pre-push と post-PR の契約が分岐します。.takt/review-diff.txt は許可し、それ以外の未許可ファイルは block する条件を明記してテストしてください。
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/todo14.md` around lines 808 - 816, 完了基準に、fix step が更新する
`.takt/review-diff.txt` は `ALWAYS_ALLOWED` の中間ファイル例外として許可し、それ以外の finding
対象外ファイルの追加・書換え・削除は block する条件を追加してください。`lib-scope-guard` の照合と incident
再現テストをこの例外に合わせ、pre-push と post-PR の契約を一致させてください。
🤖 PR Monitor 分析 (GitHub Actions バックストップ)
Applicable Findings (Critical / High / Major)
Applicable Findings (Medium 以下)
Filtered (not applicable)該当なし (5件すべて applicable — 対象ファイルは今回の diff で新規追加/変更された文書自体であり、read-only zone 除外や ADR-035 docs-only 除外基準には該当しない) 次のアクション
|
Resolved findings: - [Major] docs/adr/adr-069-pr-chain-declaration.md:35 外部計画文書を使った宣言の降格を許可しないでください。 - [Minor] docs/adr/adr-069-pr-chain-declaration.md:65 欠落・非具体宣言の blocking を試験基準に追加してください。 - [Major] docs/adr/adr-069-pr-chain-declaration.md:83 pre-push backstop の保護範囲を正確に記述してください。 - [Minor] docs/todo14.md:816 回帰テスト計画を完了基準の全ケースに合わせてください。 - [Major] docs/todo14.md:816 `ALWAYS_ALLOWED` の中間ファイル例外を完了基準に明記してください。
takt fix step が editable な todo14.md の 2 件 (#4 部分 / #5) を自動修正・re-push 済み。 本コミットは fix の権限外 (read-only zone) だった 3 件と #4 の残りを driver として適用する。 1. Major (ADR-069 / review-simplicity.md): diff 外計画文書による宣言の降格を廃止。 「diff の module doc が明示参照する計画文書」も不可に変更 — この PR でレビューされて いない文書は stale や自己都合の事前記述でありえ、未レビューのファイルにレビューを 緩和させる穴になる。宣言は同一 PR で更新される diff 内計画文書のみ有効 2. Minor (ADR-069 試験基準): decision trigger に (d)「宣言の欠落・非具体が blocking の まま」を追加し、fail-closed 3 条件すべてを検証対象に 3. Major (ADR-069 帰結): 「push は ADR-068 backstop と quality gate が守る」の過大記述を 訂正。backstop が守るのは fix の後退のみ、gate が守るのはビルド・テストのみで、 どちらも未消費抽象の設計妥当性は検証しない。降格誤適用の残リスク (blocking レビュー なしの land) と、残る防御が Warnings 監査痕跡だけであることを明記 4. Minor 残り (todo14): テスト項目を変更種別 3 種 (追加/書き換え/削除) に拡張し 完了基準と整合 (takt fix は (a) 追加系 + (b) ALWAYS_ALLOWED false-positive を カバー済みで、書き換え/削除の明示が残っていた) takt fix 分の検証: jj diff で +2/-1 (todo14 のみ) を確認、findings の Location 内で scope guard PASS、ALWAYS_ALLOWED の記述 (post-pr 側定義位置・共有要件・drift 防止) も 正確。auto-push 済みのため本コミットはその上に積む。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…350) * docs(harness-plan): WP-17 の実行状況と再分割計画 (2a/2b/2c) を反映 ここまでの実行状況を master 版計画書へ反映し、WP-17 PR 2 の再分割を別セッションの Opus がドキュメントのみで実施できる自己完結記述にする。 反映した実行状況: - PR 1 (ADR-066 / #347): 完了。exe 単体 drill 充足済、観測中への遷移は 2c 後 - PR 2: 実装済・未 land。incident (gut-revert) と事前整備 2 本 (ADR-068 / #348、ADR-069 / #349 = マージ済) の経緯を 3 行で要約 - Actions variable AUTONOMY_ENABLED 設定済みの事実と、2c マージで Phase B が 即 live になる帰結 (マージ前の variable 削除推奨) を明記 再分割計画 (2a/2b/2c) の要点: - 資産表: ローカル jj コミット 8 件を change_id で列挙 (rebase 耐性のため commit_id ではなく change_id を正とする旨を明記)、実在確認コマンド付き - 2a: 計画書 (本コミット) + rename パーサ修正。mxzwmsyp は gut-revert 混入のため rebase 不可 — tests.rs は restore、diff.rs は #348 の pub(crate) 変更と重なるため hunk 単位の手適用、という回収手順を明記 - 2b: lib 抽出 + cli-fix-push-gate を同一 PR (ADR-044 充足 = incident の失敗の裏返し)。 ADR-069 chain 宣言の本文を計画書に事前記載し、2b の diff に載せる手順と 「初回 dogfood の実測結果を ADR-069 へ記帳」まで指示 - 2c: workflow + config 有効化 + ADR-067。マージ後の実走スモーク段 0-2 (ユーザー 操作込み) を順序付きで記載 - jj 運用の注意: describe 適用先事故 (本セッションで 3 回発生) の予防として 「編集前に必ず jj new」を明記。ADR-016 / ADR-028 / VSCode での draft 提示方法も記載 受け入れ基準を再分割構成に合わせて更新 (PR 1 / 2b drill = 充足済、2c = 実走スモーク)。 本コミットは未 push (master の local 子)。再分割 2a の先頭コミットとして次セッションが 流用する (計画書 § 2a 手順 1 に記載)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(cli-push-runner): rename summary の波括弧形式をパースできるよう修正 (WP-17 2a) `jj diff --summary` の rename / copy 行を誤ってパースし、**rename を含む PR が一律 push 不能** になっていた不具合を修正する。WP-17 PR 2a の push が exit 5 で停止して 顕在化した。 ## 実測書式と旧実装のずれ jj (0.42.0 / Windows) は共通 prefix / suffix を括り出した波括弧形式で出す: R src\{cli-autonomy-gate => lib-autonomy-policy}\src\decision.rs 旧実装は `<status> <old> <new>` の 3 トークン空白区切りを前提に rsplit_once(' ') していたため、上の行から `lib-autonomy-policy}\src\decision.rs` という壊れたパスを 取り出していた。これが `--git` 側の `b/src/lib-autonomy-policy/src/decision.rs` と 一致せず、常に「未収録」と判定されていた。 判定は block 側に倒れるので fail-closed ではあるが、正当な push を止める誤検知。 ## 根拠が fixture だった問題 3 トークン形式を前提にした根拠は、コード内コメントが引用していた lib_docs_policy の `"R docs/a.md docs/b.md"` というテスト文字列だった。これは jj の出力を観測したもの ではなく手で作った fixture で、実挙動の証拠になっていない。dev-conventions の 「外部 fixture 参照テストは値まで assert」が想定する失敗そのもの。本コミットの テストは実測値を定数 OBSERVED_RENAME_SUMMARY として持ち、それを assert する。 ## 修正方針 個別ケースを潰すのではなく、rename 行の入力空間を 1 バッチで固定する (dev-conventions: パーサ修正は全 branch を一度に堅牢化): - 波括弧形式: prefix + new + suffix を結合して復元 - 矢印形式 (共通部分なし): `old => new` の new 側 - 上記以外 (旧 3 トークン形式・閉じ括弧欠落・矢印欠落) は None → Err で fail-closed 空白区切りへの fallback は残さない。波括弧のパースに失敗した行が fallback で 「それらしいパス」に化けると書式変化を検知できず gate が沈黙するため (既存方針「未知は明示的に reject」と同じ)。 波括弧の全 branch (中間 rename / 上位移動 `{sub/ => }` / 下位移動 `{ => sub/}` / ファイル名のみ / copy) をテーブル駆動で固定した。 ## 回収経緯 本修正の実装は 2026-08-02 の incident コミット (mxzwmsyp) に lib 抽出の gut-revert と 混在していたため、rebase / duplicate では回収できなかった。tests.rs は master 未変更の ため restore、diff.rs は #348 の `parse_git_diff_paths` pub(crate) 化と衝突するため `summary_line_new_path` の R/C 分岐と `rename_new_path` 追加だけを手で適用している (計画書 § WP-17 2a 手順 2)。`summary_line_new_path` の doc は「末尾トークン」前提の 記述が本修正で stale になるため現状に合わせて更新した。 検証: cargo test -p cli-push-runner 291 件 pass、clippy -D warnings 緑。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(cli-push-runner): rename パーサの空白扱いを両分岐で揃える + 計画書の前提を明記 (WP-17 2a) PR #350 の CodeRabbit 指摘 3 件への対応。 ## 1. rename_new_path の矢印分岐から冗長な trim を削除 指摘: 「パスから空白を除去しないでください」(diff.rs、Minor)。 矢印分岐だけが `new.trim()` していて波括弧分岐 (`format!` で結合、trim なし) と 非対称だった。呼び出し元 `summary_line_new_path` が既に `rest.trim()` 済みの文字列を 渡す唯一の呼び手なので、この trim は冗長でもある。 **これはバグ修正ではなく対称性の回復である**: 現実的な入力では両者の結果は一致し、 削除による挙動変化は観測できない (だからこそ安全に削除できる)。狙いは「同じパスが 分岐によって違う結果になり得る」状態を残さないこと。 なお post-pr-review の分析は本指摘を false positive と判定していたが、根拠が誤り だった (指摘位置を `path.replace('\', "/")` と読み「バックスラッシュ変換であって 空白除去ではない」とした)。CodeRabbit は複数行コメントを範囲末尾に anchor するため 実際の対象は関数全体で、trim は確かに存在した。結論 (非ブロッキング) は一致するが 理由が違うので、指摘の芯を採用して直す。 テストには空白を含むパスのケースを 2 件追加した (波括弧 / 矢印の両分岐)。区切りの `" => "` と紛れる位置に空白があっても内部の空白が保持され、両分岐が同じ結果を返す ことを固定する。 ## 2. tests.rs restore の前提を明記 (docs) 指摘: 「復元前に tests.rs の復元前提を明記してください」(計画書 L164、Minor)。 `jj restore` で丸ごと上書きしてよいのは「master 側が未変更」の間だけ。前提の確認 コマンドと、崩れていた場合の切り替え先 (diff.rs と同じ hunk 単位の手適用) を書いた。 前提を確認せず restore すると master 側の変更を無言で巻き戻すため、確認手順まで含めて 残す。 ## 3. workflow_dispatch の ref 選択を明記 + スモーク段 0.5 を追加 (docs) 指摘: 「workflow_dispatch は PR head branch を受け取ると記載してください」 (計画書 L193、Minor)。 dispatch は起動時に ref を選べ、選んだ ref 版の workflow 定義で走る。これは 2c の 実走スモークの前提として重要で、計画書が「マージ後の実走スモーク」としか書いて いなかったのは記述不足だった。fix job はマージ前に 2c ブランチ ref に対して実走できる。 これを踏まえ段 0.5 (マージ前 dispatch) を追加した。gate と config は master ref から 調達される (ADR-066 決定 3) ため、マージ前は config が `enabled = false` のままで fix job は config 層で停止する = **deny 経路 (kill-switch が効く側) をマージ前に検証でき、 allow 経路だけがマージ後に残る**。`AUTONOMY_ENABLED` が既に true で「2c マージ = 即 live」 の一発勝負になる状況に対する段階化として意味がある。 手順 4 (マージ前に variable を削除して段階を踏む案) は段 0.5 が variable 層を通す必要が あるため順序が矛盾していた。削除するとしても段 0.5 の後、と順序を明記して整合させた。 検証: cargo test -p cli-push-runner 291 件 pass、clippy -D warnings 緑。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Summary
抽出↔呼び手のペアリング」を具体名で宣言している場合のみ、missing-consumer findings
(dead-on-arrival / premature abstraction) を non-blocking warning へ降格する
未宣言の投機的抽象への検査は一切緩めない
先頭に書く (ADR-068 残課題の引き取り)
切らない / 良い関節が無ければ PR_SIZE_CHECK_OVERRIDE + 明記が正当)
残課題の正式登録で、PR feat(harness): takt fix の後退検知 backstop と権限境界を追加 (ADR-068) #348 レビューで観測された一時的 drift もこれで解消
Context
Why: PR size gate (>1500 行で分割強制)・Multi-PR chaining 規約・simplicity review の
missing-consumer 検査は、内部レイヤリングを持つ大型機能で同時充足できない。チェーンの
先頭 PR は必ず「消費者がまだ存在しない何か」を導入するため、宣言の仕組みが無い限り
先頭 PR が構造的に REJECT される。2026-08-02 の WP-17 PR 2a incident はこの合成
デッドロックが起点だった (fix 側の対策 = ADR-068 / PR #348、本 PR はレビュー側の対策)。
Trigger: incident 後の評価で 5 提案を整理し、ユーザー承認のうえ「G1 (ADR-068) →
G2 (ADR-069) を land してから WP-17 再分割に戻る」を決定。本 PR がその 2 本目。
Scope decision: 降格は pre-push の blocking 経路のみ。whole-tree variant (weekly
review) は push を block しないため対象外。宣言の機械検証 (名前一致の決定論チェック) は
誤適用が観測されたら検討 (ADR-069 残課題)。
Validation
pnpm pushpre-push review: 全 APPROVE (simplicity / security とも指摘ゼロ、186s)cargo test --workspaceは quality gate で全 pass、pnpm lint:docs/lint:md0 error再分割時に計画書へ chain 宣言を書き、宣言付き先頭 PR が REJECT されないことを実測する
References
与えるパターンの先行例
ヒューリスティクスの根拠
Summary by CodeRabbit