Skip to content

chore(takt): PR chain 宣言規約と chain-aware simplicity review を追加 (ADR-069) - #349

Merged
aloekun merged 5 commits into
masterfrom
feat/adr069-pr-chain-declaration
Aug 2, 2026
Merged

chore(takt): PR chain 宣言規約と chain-aware simplicity review を追加 (ADR-069)#349
aloekun merged 5 commits into
masterfrom
feat/adr069-pr-chain-declaration

Conversation

@aloekun

@aloekun aloekun commented Aug 2, 2026

Copy link
Copy Markdown
Owner

Summary

  • simplicity review に PR chain 宣言の降格ルールを追加。diff 内計画文書が「後続 PR と
    抽出↔呼び手のペアリング」を具体名で宣言している場合のみ、missing-consumer findings
    (dead-on-arrival / premature abstraction) を non-blocking warning へ降格する
  • fail-closed 3 条件 (宣言なし / ペアリング非具体 / 名前不一致 → 従来どおり blocking)。
    未宣言の投機的抽象への検査は一切緩めない
  • fix suggestion 記述規約を追加: 複数 remedy がある finding は最も破壊的でない処置を
    先頭に書く (ADR-068 残課題の引き取り)
  • ADR-069 起票 + dev-conventions に切断点ヒューリスティクス (抽出と最初の呼び手の間で
    切らない / 良い関節が無ければ PR_SIZE_CHECK_OVERRIDE + 明記が正当)
  • todo 順位 364 (ADR-054 scope guard の pre-push 展開) を登録 — ADR-068 が予告した
    残課題の正式登録で、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 push pre-push review: 全 APPROVE (simplicity / security とも指摘ゼロ、186s)
  • cargo test --workspace は quality gate で全 pass、pnpm lint:docs / lint:md 0 error
  • ADR-069 の試験運用判断の初回検証機会は WP-17 再分割チェーン (2a/2b/2c) 自身 —
    再分割時に計画書へ chain 宣言を書き、宣言付き先頭 PR が REJECT されないことを実測する

References

Summary by CodeRabbit

  • ドキュメント
    • PRチェーンの分割・宣言に関する新しい方針を追加しました。
    • 後続PRとの依存関係や対応内容を明示するためのルールを整備しました。
    • 宣言が不十分な場合の検査結果の扱い、分割判断、修正提案の基準を文書化しました。
    • 開発チェックリストと規約を更新し、関連する今後の改善計画を記録しました。

aloekun and others added 3 commits August 3, 2026 05:07
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>
@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: dd815dba-3962-4ee5-9c44-2c9995691847

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

ADR-069を追加し、PRチェーン宣言の要件と分割基準を定義しました。レビュー指示、開発規約、チェックリストに規約を反映しました。関連するscope guardの作業計画もTODOへ追加しました。

Changes

PRチェーン宣言

Layer / File(s) Summary
ADR-069の規約定義
docs/adr/adr-069-pr-chain-declaration.md
PRチェーン宣言の具体的な対応関係、実名一致、missing-consumerの警告降格、分割基準、Fix Suggestionの順序、試験運用を定義しました。
レビュー判定への反映
.takt/facets/instructions/review-simplicity.md
YAGNIの対象を実行コードに限定しました。有効な後続PR宣言に対応する未使用コードを警告とし、無効な宣言や宣言不足はblockingとしました。
開発規約と計画の更新
CLAUDE.md, docs/dev-conventions.md, docs/todo-summary2.md, docs/todo14.md
開発チェックリストとPR分割規約を更新しました。pre-pushのscope guard拡張計画をTODOに追加しました。

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed タイトルは、PRチェーン宣言規約とchain-aware simplicity reviewの追加という主な変更を明確に示しています。
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/adr069-pr-chain-declaration

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

🤖 PR Monitor 分析 (GitHub Actions バックストップ)

  • トリガー: issue_comment (created) / 実行 run
  • CI: 実行中 (rust ubuntu-latest / rust windows-latest: pending, トリガーから約1分経過)。CodeRabbit: レビュー未着 (in progress, ✨定型 processing コメントのみ)
  • レビュー状況: 人間レビューなし (reviewDecision 空)、インライン指摘 0件、CodeRabbit レビュー未着
  • Verdict: approved (現時点で applicable findings 0件のため。ただし CI/CodeRabbit が未完了であり、マージ判断はそれらの完了を待つ必要がある)

Applicable Findings (Critical / High / Major)

該当なし (findings 0件)

Applicable Findings (Medium 以下)

該当なし

Filtered (not applicable)

該当なし

次のアクション

  • CI (rust ubuntu-latest / windows-latest) と CodeRabbit レビューの完了を待つ (本監視は待機・ポーリングを行わないため、次回イベントで再評価する)
  • diff は .takt/facets/instructions/review-simplicity.mdCLAUDE.md・新規 docs/adr/adr-069-pr-chain-declaration.md (92行)・docs/dev-conventions.mddocs/todo-summary2.mddocs/todo14.md の6ファイルで、docs / review instruction 層のみの変更 (実行コード変更なし)。ADR-069 は ADR-068 incident を踏まえた PR chain 宣言規約の追加であり、内容は既存 ADR-056/050/044/035 と整合

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between cc28c4d and a9b428b.

📒 Files selected for processing (6)
  • .takt/facets/instructions/review-simplicity.md
  • CLAUDE.md
  • docs/adr/adr-069-pr-chain-declaration.md
  • docs/dev-conventions.md
  • docs/todo-summary2.md
  • docs/todo14.md

Comment on lines +31 to +35
| 要件 | 内容 |
|---|---|
| 置き場所 | diff 内の計画文書(plan doc / `docs/todoN.md` エントリ)。または diff の module doc が明示参照する計画文書 |
| 具体性 | 後続 PR と**抽出↔呼び手のペアリング**を具体名で書く(どの crate / exe / 関数を、どの後続変更が消費するか)。「将来使う」だけの宣言は無効 |
| 名前一致 | 宣言中の名前は diff 内の実名と一致していること。矛盾する宣言は降格根拠にならない(incident の形) |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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
の対応する配置条件にも同じ制約を適用し、両サイトで外部文書のみの参照を認めないようにしてください。

Comment on lines +59 to +65
## 試験運用判断基準

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 になる。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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.

Suggested change
## 試験運用判断基準
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
されることを確認する条件を追加してください。既存の有効宣言・未宣言抽象・名前不一致に関する判定は維持してください。

Comment on lines +75 to +83
### 欠点 / 留意点

- 宣言の維持コスト: チェーン構成が変わったら宣言も更新が要る。stale な宣言は名前不一致で fail-closed に倒れる(安全側だが手戻り)。
- 降格は LLM instruction 層であり決定論的ではない。降格の誤適用(無効な宣言を有効と誤読)は起こりうるが、その場合も「warning に落ちる」だけで push 自体は ADR-068 backstop と quality gate が守る。
- 中間 PR(呼び手はあるが自分も次への供給を含む)は宣言を両方向に書く必要がある。

### 残課題

- 宣言の機械検証(宣言中の名前が diff の実名と一致するかの決定論チェック)は未実装。降格の誤適用が観測されたら検討する。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 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
され得る残存リスクを記載してください。

Comment thread docs/todo14.md
Comment on lines +806 to +816
#### 作業計画

- [ ] 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」ケースがテストで固定されていること。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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.

Suggested change
#### 作業計画
- [ ] 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 を含む各ケースを固定してください。

Comment thread docs/todo14.md
Comment on lines +808 to +816
- [ ] 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」ケースがテストで固定されていること。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

ALWAYS_ALLOWED の中間ファイル例外を完了基準に明記してください。

提供された src/cli-pr-monitor/src/stages/scope_guard.rs では、fix step が更新する .takt/review-diff.txtALWAYS_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 の契約を一致させてください。

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

🤖 PR Monitor 分析 (GitHub Actions バックストップ)

  • トリガー: pull_request_review (submitted) / 実行 run
  • CI: analyze pending (本ワークフロー自身、実行中)、CodeRabbit pass (レビュー完了)、rust (ubuntu-latest) pass、rust (windows-latest) pass
  • レビュー状況: CodeRabbit が新規レビューを submitted (actionable comments 5件、Major 3 / Minor 2)。人間レビューなし (reviewDecision 空)
  • Verdict: needs_fix (Major の applicable findings が存在するため)

Applicable Findings (Critical / High / Major)

# File (Line) Reviewer Issue Recommended Action
1 docs/adr/adr-069-pr-chain-declaration.md (L31-35) / .takt/facets/instructions/review-simplicity.md (L50-53) CodeRabbit 宣言の「置き場所」条件が diff 外の計画文書だけでの降格を許容してしまう (dev-conventions.md の「diff 内の計画文書」という記述と不整合)。古い外部文書のみで missing-consumer finding が warning に降格されうる 両ファイルの配置条件を「参照する計画文書自体が同じ diff に含まれる場合のみ」に限定する
2 docs/adr/adr-069-pr-chain-declaration.md (L75-83) CodeRabbit 「欠点/留意点」で ADR-068 backstop + quality gate が push を常に保護すると記載しているが、同一 diff 内の docs/todo14.md (L796-816) は pre-push の allowlist 照合が未実装で追加系 injection/設定書換えを検知できないと記す — 自己矛盾した安全保証 scope guard 実装までの残存リスク (誤降格時に不正な追加系変更が push されうる) を明記するよう記述を修正
3 docs/todo14.md (L808-816) CodeRabbit 完了基準は「追加・書換え・削除いずれも block」だが、scope_guard.rs の先行実装は .takt/review-diff.txtALWAYS_ALLOWED として許可しており、この中間ファイル例外が完了基準/作業計画に明記されていない。そのまま実装すると正当な中間ファイル更新を block するか pre-push/post-PR の契約が分岐する .takt/review-diff.txt の ALWAYS_ALLOWED 例外を完了基準・lib-scope-guard 照合・再現テストに明記する

Applicable Findings (Medium 以下)

# File (Line) Reviewer Issue Recommended Action
4 docs/adr/adr-069-pr-chain-declaration.md (L59-65) CodeRabbit 「試験運用判断基準」の decision trigger が有効宣言・未宣言抽象・名前不一致は確認するが、「宣言なし」「非具体宣言」が blocking のまま REJECT されることを確認する条件が抜けている decision trigger に (d) 宣言なし/非具体宣言が blocking のままであることの確認項目を追加
5 docs/todo14.md (L806-816) CodeRabbit 回帰テスト計画 (作業計画) が追加系変更のみを対象にしているが、完了基準 (L816) は追加・書換え・削除全てと backstop 自己弱体化の設定変更を対象にしており不整合 作業計画のテスト項目を完了基準の全ケース (追加・書換え・削除 + push-runner-config.toml 書換え) に合わせる

Filtered (not applicable)

該当なし (5件すべて applicable — 対象ファイルは今回の diff で新規追加/変更された文書自体であり、read-only zone 除外や ADR-035 docs-only 除外基準には該当しない)

次のアクション

  • Major 3件 (宣言配置条件の diff 内限定化、欠点セクションの安全保証の訂正、ALWAYS_ALLOWED 例外の完了基準明記) を次回ローカルセッションで反映
  • Minor 2件 (試験運用判断基準への欠落条件追加、回帰テスト計画の網羅性修正) も併せて反映
  • CI は rust/CodeRabbit とも pass 済み、analyze (本分析) の完了を待つのみ

aloekun and others added 2 commits August 3, 2026 05:22
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>
@aloekun
aloekun merged commit 3af6556 into master Aug 2, 2026
3 checks passed
@aloekun
aloekun deleted the feat/adr069-pr-chain-declaration branch August 2, 2026 20:36
aloekun added a commit that referenced this pull request Aug 3, 2026
…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>
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