fix(hooks): Replace matcher追加 & deploy時のpermissions保持 - #4
Conversation
- PreToolUse/PostToolUse の matcher に Replace を追加し、ファイル全体置換時もフックが発火するように修正 - deploy-hooks.js で既存 settings.local.json の hooks のみ上書きし、permissions 等を保持するマージ方式に変更 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughウォークスルーClaude の hook マッチャーに 変更内容
シーケンス図sequenceDiagram
participant Deployer as Deployer (deployTo)
participant Renderer as Template Renderer
participant Parser as JSON Parser/Validator
participant FS as File System (target settings.local.json)
participant Logger as Logger
Deployer->>Renderer: render settings.local.json.template -> renderedText
Deployer->>Parser: parse renderedText -> newSettings
Deployer->>FS: check if target file exists
alt target exists
FS->>Deployer: return fileContent
Deployer->>Parser: try parse existing file
alt parse succeeds
Deployer->>Deployer: merge existing (preserve other keys) with newSettings.hooks
Deployer->>FS: write merged JSON (preserve permissions)
Deployer->>Logger: log "updated (hooks merged, permissions preserved)"
else parse fails
Deployer->>FS: write newSettings as full JSON
Deployer->>Logger: log "WARN...regenerated due to invalid existing settings"
end
else target missing
Deployer->>FS: write newSettings as full JSON
Deployer->>Logger: log "generated"
end
コード審査工数🎯 3 (Moderate) | ⏱️ ~20 分 🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
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 |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@scripts/deploy-hooks.js`:
- Around line 98-101: The code reads settingsDest into existing and blindly sets
existing.hooks = newSettings.hooks which breaks when existing is an array (e.g.,
[]) and prevents hooks from persisting; update the logic around the JSON.parse
result (existing) to perform a type guard: if existing is not a plain object,
replace it with an empty object before merging, then safely assign/merge
newSettings.hooks (preserving other properties/permissions) and write the
resulting object back to settingsDest; reference the variables existing,
newSettings.hooks and settingsDest when locating the change.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: ec8b2b28-b3cb-4615-b52a-afe846dd9bd5
📒 Files selected for processing (2)
.claude/settings.local.json.templatescripts/deploy-hooks.js
CodeRabbitレビュー反映: テンプレート・既存ファイル両方でオブジェクト形状を検証し、 配列や不正な型の場合に安全にフォールバックするよう修正 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
PreToolUse の jj-push-guard プリセットで直接の push をブロックし、 hooks-push-pipeline (スタンドアロン Rust exe) で push 前パイプラインを 実行する2段構成で、Claude Code hooks に存在しない push hook を補完する。 - PreToolUse: jj-push-guard プリセット追加 - hooks-push-pipeline: command 型/ai 型ステップの順次実行 + 最終 push - hooks-config.toml: [push_pipeline] セクション追加 - ビルド・配布統合: package.json, .gitignore, deploy-hooks.ts 更新 - ADR-008: 設計判断を記録 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> fix: CodeRabbit レビュー指摘4件を修正 - push_cmd/cmd の空文字バリデーション追加 (#1 Major) - jj-push-guard に環境変数プレフィックスバイパス対策 (#3 Nitpick) - ADR-008 コードブロックに言語指定追加 (#4 Nitpick) - hooks-push-pipeline 全関数に docstring 追加 (#5 Pre-merge)
PR #43 で観測された 2 つの連鎖バグを修正。 ## バグ #1 (誤検出 / monitor.rs:91) jj の working-copy-is-a-commit モデルで `@` が PR の content commit その ものだと、`jj diff --stat` (= @ vs parent) が常に PR 全体の diff を返すため 「takt fix 後の変更」と誤認される問題。 修正: commit id の pre/post 比較と実 diff 確認の二段構え判定 (decide_repush pure function) に置き換え。jj の metadata 更新で ID だけ変化するケースも吸収。 ## バグ #2 (破壊的 describe / push.rs:15-24) `jj describe -m "fix(cli-pr-monitor): ..."` が元 description を無条件上書き。 takt fix が @ を amend する設計と不整合。 修正: jj describe を完全廃止 (P1)。commit message 管理は人間/PR title の責務。 takt はコード修正のみ。 ## 追加改善 - ログを [state] / [decision] / [action] プレフィックスで構造化 - auto_push を should_run_auto_push(setting, has_change) の二段構えに統一 - 退行防止の統合テスト 1 本 (#[ignore]) を追加、push pipeline でのみ実行 (PostToolUse / Stop hook では実行せずイテレーション速度を保護) ## 変更ファイル - src/cli-pr-monitor/src/stages/monitor.rs: decide_repush + execute_repush_flow - src/cli-pr-monitor/src/stages/push.rs: jj describe 削除 - src/cli-pr-monitor/Cargo.toml: tempfile (dev-dep) - push-runner-config.toml: rust-test group を push pipeline に追加 - docs/todo.md: task #4 に実装方針を記録
PR #43 で観測された 2 つの連鎖バグを修正。 ## バグ #1 (誤検出 / monitor.rs:91) jj の working-copy-is-a-commit モデルで `@` が PR の content commit その ものだと、`jj diff --stat` (= @ vs parent) が常に PR 全体の diff を返すため 「takt fix 後の変更」と誤認される問題。 修正: commit id の pre/post 比較と実 diff 確認の二段構え判定 (decide_repush pure function) に置き換え。jj の metadata 更新で ID だけ変化するケースも吸収。 ## バグ #2 (破壊的 describe / push.rs:15-24) `jj describe -m "fix(cli-pr-monitor): ..."` が元 description を無条件上書き。 takt fix が @ を amend する設計と不整合。 修正: jj describe を完全廃止 (P1)。commit message 管理は人間/PR title の責務。 takt はコード修正のみ。 ## 追加改善 - ログを [state] / [decision] / [action] プレフィックスで構造化 - auto_push を should_run_auto_push(setting, has_change) の二段構えに統一 - 退行防止の統合テスト 1 本 (#[ignore]) を追加、push pipeline でのみ実行 (PostToolUse / Stop hook では実行せずイテレーション速度を保護) ## 変更ファイル - src/cli-pr-monitor/src/stages/monitor.rs: decide_repush + execute_repush_flow - src/cli-pr-monitor/src/stages/push.rs: jj describe 削除 - src/cli-pr-monitor/Cargo.toml: tempfile (dev-dep) - push-runner-config.toml: rust-test group を push pipeline に追加 - docs/todo.md: task #4 に実装方針を記録
PR #43 で観測された 2 つの連鎖バグを修正。 ## バグ #1 (誤検出 / monitor.rs:91) jj の working-copy-is-a-commit モデルで `@` が PR の content commit その ものだと、`jj diff --stat` (= @ vs parent) が常に PR 全体の diff を返すため 「takt fix 後の変更」と誤認される問題。 修正: commit id の pre/post 比較と実 diff 確認の二段構え判定 (decide_repush pure function) に置き換え。jj の metadata 更新で ID だけ変化するケースも吸収。 ## バグ #2 (破壊的 describe / push.rs:15-24) `jj describe -m "fix(cli-pr-monitor): ..."` が元 description を無条件上書き。 takt fix が @ を amend する設計と不整合。 修正: jj describe を完全廃止 (P1)。commit message 管理は人間/PR title の責務。 takt はコード修正のみ。 ## 追加改善 - ログを [state] / [decision] / [action] プレフィックスで構造化 - auto_push を should_run_auto_push(setting, has_change) の二段構えに統一 - 退行防止の統合テスト 1 本 (#[ignore]) を追加、push pipeline でのみ実行 (PostToolUse / Stop hook では実行せずイテレーション速度を保護) ## 変更ファイル - src/cli-pr-monitor/src/stages/monitor.rs: decide_repush + execute_repush_flow - src/cli-pr-monitor/src/stages/push.rs: jj describe 削除 - src/cli-pr-monitor/Cargo.toml: tempfile (dev-dep) - push-runner-config.toml: rust-test group を push pipeline に追加 - docs/todo.md: task #4 に実装方針を記録
PR #44 (cli-pr-monitor auto re-push 誤発火修正) セッションで得られた知見を ADR 群として記録。正式採用 2 本 + 試験運用 3 本。 ## 正式採用 - ADR-021: jj 変更検出ロジックの設計原則 - 原則: pre/post commit_id 比較 + jj diff --from/--to による二段構え判定 - アンチパターン: jj diff --stat 単独 (= @ vs parent) を変更検出に使う - ADR-022: 自動化コンポーネントの責務分離原則 - 原則: takt/claude -p/cli-* はコード修正とレポートに限定 - 禁止: commit message / bookmark / tag / PR body への自動介入 - CLAUDE.md に Automated actor boundary セクション追加 ## 試験運用 (2026-07-31 再評価) - ADR-023 (仮): CodeRabbit false positive 対応スキル - 発火頻度を観察、月 3 件以上なら skill 化検討 - ADR-024 (仮): 共通 jj ヘルパーライブラリ - 2 つ目の使用例が出たら src/lib-jj-helpers/ 新設 - ADR-025 (仮): CwdRestore Drop guard パターン - 2 つ目の cwd 依存テストが出たら src/lib-test-helpers/ 新設 ## その他 - CLAUDE.md: ADR index 更新 + Automated actor boundary セクション新設 - docs/todo.md: PR #43 / PR #44 / 本 PR を完了履歴へ移動、 新 task #4 として Cargo workspace 化 + rust-test template 反映 (PR-β) を記載
PR #44 (cli-pr-monitor auto re-push 誤発火修正) セッションで得られた知見を ADR 群として記録。正式採用 2 本 + 試験運用 3 本。 ## 正式採用 - ADR-021: jj 変更検出ロジックの設計原則 - 原則: pre/post commit_id 比較 + jj diff --from/--to による二段構え判定 - アンチパターン: jj diff --stat 単独 (= @ vs parent) を変更検出に使う - ADR-022: 自動化コンポーネントの責務分離原則 - 原則: takt/claude -p/cli-* はコード修正とレポートに限定 - 禁止: commit message / bookmark / tag / PR body への自動介入 - CLAUDE.md に Automated actor boundary セクション追加 ## 試験運用 (2026-07-31 再評価) - ADR-023 (仮): CodeRabbit false positive 対応スキル - 発火頻度を観察、月 3 件以上なら skill 化検討 - ADR-024 (仮): 共通 jj ヘルパーライブラリ - 2 つ目の使用例が出たら src/lib-jj-helpers/ 新設 - ADR-025 (仮): CwdRestore Drop guard パターン - 2 つ目の cwd 依存テストが出たら src/lib-test-helpers/ 新設 ## その他 - CLAUDE.md: ADR index 更新 + Automated actor boundary セクション新設 - docs/todo.md: PR #43 / PR #44 / 本 PR を完了履歴へ移動、 新 task #4 として Cargo workspace 化 + rust-test template 反映 (PR-β) を記載
PR #44 (cli-pr-monitor auto re-push 誤発火修正) セッションで得られた知見を ADR 群として記録。正式採用 2 本 + 試験運用 3 本。 ## 正式採用 - ADR-021: jj 変更検出ロジックの設計原則 - 原則: pre/post commit_id 比較 + jj diff --from/--to による二段構え判定 - アンチパターン: jj diff --stat 単独 (= @ vs parent) を変更検出に使う - ADR-022: 自動化コンポーネントの責務分離原則 - 原則: takt/claude -p/cli-* はコード修正とレポートに限定 - 禁止: commit message / bookmark / tag / PR body への自動介入 - CLAUDE.md に Automated actor boundary セクション追加 ## 試験運用 (2026-07-31 再評価) - ADR-023 (仮): CodeRabbit false positive 対応スキル - 発火頻度を観察、月 3 件以上なら skill 化検討 - ADR-024 (仮): 共通 jj ヘルパーライブラリ - 2 つ目の使用例が出たら src/lib-jj-helpers/ 新設 - ADR-025 (仮): CwdRestore Drop guard パターン - 2 つ目の cwd 依存テストが出たら src/lib-test-helpers/ 新設 ## その他 - CLAUDE.md: ADR index 更新 + Automated actor boundary セクション新設 - docs/todo.md: PR #43 / PR #44 / 本 PR を完了履歴へ移動、 新 task #4 として Cargo workspace 化 + rust-test template 反映 (PR-β) を記載
## 背景 PR #44 で push pipeline に rust-test group を追加したが、本プロジェクトが Cargo workspace ではないため cargo test --manifest-path の個別指定が必要だった。 また各 package に target/ が独立し、compile cache が共有されない問題もあった。 ## 変更内容 ### workspace 化 - ルート Cargo.toml 新規作成 ([workspace] + 10 members + [profile.release]) - 各 member Cargo.toml から重複していた [profile.release] を削除 (workspace 化で ignore される警告の解消) - .gitignore: /target/ (workspace 共有) を追加、src/*/target/ も legacy 互換で維持 ### build スクリプト統一 - package.json の build:* を "cargo build --release -p <name>" 形式に統一 - target path を workspace root (target/release/) 基準に変更 - cd 不要に、cache 共有で再ビルド時間短縮 ### push pipeline 簡素化 - push-runner-config.toml の rust-test command を "cargo test" / "cargo test -- --ignored --test-threads=1" に簡素化 - templates/push-runner-config.toml にコメントアウト済みの rust-test group テンプレート追加 (派生プロジェクトで有効化可能) ### ドキュメント - ADR-026: Cargo workspace による Rust パッケージ統合 (新規) - CLAUDE.md: ADR index 更新 - docs/todo.md: task #4 を実装済みに更新 ## 回帰テスト - cargo test: 10 packages 合計 318 tests passed + 1 integration (ignored) - cargo test -- --ignored --test-threads=1: 1 integration test passed - pnpm build:all: 全 8 exe 警告なしで成功
#46) ## 背景 PR #44 で push pipeline に rust-test group を追加したが、本プロジェクトが Cargo workspace ではないため cargo test --manifest-path の個別指定が必要だった。 また各 package に target/ が独立し、compile cache が共有されない問題もあった。 ## 変更内容 ### workspace 化 - ルート Cargo.toml 新規作成 ([workspace] + 10 members + [profile.release]) - 各 member Cargo.toml から重複していた [profile.release] を削除 (workspace 化で ignore される警告の解消) - .gitignore: /target/ (workspace 共有) を追加、src/*/target/ も legacy 互換で維持 ### build スクリプト統一 - package.json の build:* を "cargo build --release -p <name>" 形式に統一 - target path を workspace root (target/release/) 基準に変更 - cd 不要に、cache 共有で再ビルド時間短縮 ### push pipeline 簡素化 - push-runner-config.toml の rust-test command を "cargo test" / "cargo test -- --ignored --test-threads=1" に簡素化 - templates/push-runner-config.toml にコメントアウト済みの rust-test group テンプレート追加 (派生プロジェクトで有効化可能) ### ドキュメント - ADR-026: Cargo workspace による Rust パッケージ統合 (新規) - CLAUDE.md: ADR index 更新 - docs/todo.md: task #4 を実装済みに更新 ## 回帰テスト - cargo test: 10 packages 合計 318 tests passed + 1 integration (ignored) - cargo test -- --ignored --test-threads=1: 1 integration test passed - pnpm build:all: 全 8 exe 警告なしで成功
* docs(todo): PR #88 post-merge-feedback の Tier 1/2 finding を採用 PR #88 post-merge-feedback (.claude/feedback-reports/88.md) で生成された 7 件の finding のうち、ユーザー判断により #1-5 を採用、#6-7 を見送り。 採用 finding (5 件): - T1 #1 (順位 5): Stop hook の `pnpm lint:md` 統合 — XS、順位 1 完了済の gap closure - T1 #2 (順位 6): AI 生成一時スクリプト pattern の pre-push 検出 — Small、順位 1 と関連 - T2 #3 (順位 13): `vitest` を devDependencies に固定 — Small - T2 #4 (順位 12): `cli-pr-monitor` ポーリング延長 + 重複起動ロック — Medium、★ rate-limit critical - T2 #5 (順位 14): `pnpm create-pr` 必須引数ヘルプ改善 — Small 見送り finding: - T3 #6: hook 統合時の commit 分割基準 → グローバルルール (~/.claude/) 編集は permission denied、要別経路 - T3 #7: jj rebase conflict 解消手順 → 同上 変更: - docs/todo3.md 新設 (todo2.md が 50KB に到達したため、PR #88 以降の新規エントリは todo3.md へ) - docs/todo.md 推奨実行順序サマリーに 5 件を Tier 別に挿入し、20 → 24 タスクへ全 renumber - 戦略テキストと cross-reference を全面更新 - todo2.md / todo3.md 内の 順位 N 参照を新採番へ追従 - 順位 1 (markdownlint hook 統合) は merged 済として削除参照を merged context に書き換え * fix(review): apply CodeRabbit fixes for #89 Resolved findings: - [Minor] docs/todo.md:49 順位参照の文言が現行テーブルと不整合です - [Major] docs/todo3.md:7 見出しリンクのアンカーが壊れる可能性があります
* docs(todo): PR #89 post-merge-feedback の Tier 1/2 finding を採用 PR #89 post-merge-feedback (.claude/feedback-reports/89.md) で生成された 4 件の finding のうち、ユーザー判断により Tier 1/2 (#1, #2) を採用、Tier 3 (#3, #4) を 見送り (お願いベースのため Tier 1 対応で様子見)。 採用 finding (2 件): - T1 #1 (順位 7): Markdown 非 ASCII GFM アンカー検出 lint rule — S、ADR-007 拡張 - T2 #2 (順位 14): post-pr-review に rate-limit 自動検出 + 再トリガーロジック — Medium、★ rate-limit critical 見送り finding: - T3 #3: 可変テキスト見出しに明示アンカー必須ルール → Tier 1 #1 で決定論的に防止できる - T3 #4: 表並び替え後の prose rank 参照 grep ルール → 順位 24 (採番管理 ADR) で構造的に解消予定 変更: - docs/todo3.md に 2 タスク追記 (本ファイルでの新規追加は計 7 タスク) - docs/todo.md 推奨実行順序サマリーを 24 → 26 タスクへ全 renumber - 順位 7 (anchor lint) を Tier 1 末尾に挿入、順位 14 (rate-limit auto-trigger) を Tier 2 内 順位 13 (cli-pr-monitor polling) の隣に挿入 - 戦略テキストに rate-limit 改善の 3 層構造 (順位 4/13/14) を明記 - 順位 7 と順位 20 の二重防衛関係を sub-text に追記 - todo2.md cross-reference を全面更新 (sed bulk + 個別 fix) PR #89 セッション知見: - ADR-030 の soft-fail recovery (.failed marker + UserPromptSubmit hook) が Claude rate-limit interruption からの復旧で機能した実証 - takt 単独実行時の post-processing (report copy + marker 削除) は cli-merge-pipeline 側責務で手動補完が必要 — 復旧手順 marker への追記が将来の改善ポイント * fix(review): apply CodeRabbit fix for #90 Tier 2 #2 finding -> Tier 2 #1 finding に書き換え (case A)。 title "PR #89 T2-1" の Tier-local 番号と body の参照番号を統一。 参照: PR #90 CodeRabbit Minor finding (docs/todo3.md:298)
…158 docs (#175) * docs(todo): PR #174 post-merge-feedback 採用 4 件を todo9.md / summary table に登録 PR #174 (Bundle 1) post-merge-feedback で採用判定された 4 件を docs/todo9.md に 新規エントリとして追加し、docs/todo-summary.md table に行追加。 - 順位 155 (T1 #1): cli-pr-monitor fix chain 末尾に空 commit 検査 + jj abandon step 追加 (PR #174 で観測した kqvluqyv 事例の構造化予防、Effort S) - 順位 156 (T2 #1): effective_patterns() の空 variant test 4 件直交化 (CR Minor finding 起点の 4 filter path 独立検証化、Effort S) - 順位 157 (T2 #2): Bundle 1 dogfood checklist 実行 — __test.ps1 block + override env 確認 (ADR-039 bounded lifetime data point #1、Effort XS) - 順位 158 (T3 #1): ADR-039 に bounded lifetime decision trigger 必須化パターン 追記 (PR #174 の 3-5 PR dogfood 実例を reusable rule に昇格、Effort S) * feat(cli-push-runner): Bundle 2 — 順位 2 bookmark check stage + 順位 156/158 docs 順位 2 (PR #85 T1-3) jj bookmark 未設定 early-exit を実装。jj 環境では新規ブランチ で bookmark を作成し忘れる落とし穴があり、PR #85 で初回 `pnpm push` が `Nothing changed` で終了し 158s かけた quality_gate + takt review が無駄になった 事象の構造的予防。 ## 実装 (順位 2) - src/cli-push-runner/src/stages/bookmark_check.rs (新規): 新 stage - src/cli-push-runner/src/stages/mod.rs: module register - src/cli-push-runner/src/main.rs: - Stage -1 として run_bookmark_check を pipeline 最早期に追加 - EXIT_BOOKMARK_MISSING = 7 を新設 - run_pipeline が 50 行制限を超えたため run_pre_checks を抽出して責務分離 設計: - 配置: scratch_file_warning より前の最早期 stage (push 自体不可能な状態を最優先で fail-fast) - 検出: `jj bookmark list` で非 trunk bookmark の有無を確認 (lib_jj_helpers::is_trunk_bookmark で filter) - 失敗時挙動: error 終了 + 推奨コマンド (`jj bookmark create <name> -r @`) 提示 - fail-open: jj 実行失敗時は warning ログのみで push を続行 (jj 不調で push 自体を止めない) - 設計上の non-config: jj git push が bookmark 必須仕様のため、本 stage をバイパスする 正当な use case なし。`[bookmark_check]` config section は追加せず常に有効 ## Bundled docs - 順位 156: effective_patterns() の空 variant test 4 件直交化。既存 3 test を filter path 直交命名 (all_blank / mixed_blank_and_valid / whitespace_padded) にリネーム + 4 番目 variant (mixed_filter_to_empty) を新規追加。1 path regression で 1 test だけ failed する構造 (memory feedback_test_dry_antipattern.md 適用)。 - 順位 158: ADR-039 § 3 Bounded lifetime に「明示的 decision trigger 必須化」要件を 追記。PR #174 を実例 (Bundle 1 = 3-5 PR dogfood trigger) として cite、formless な 「未来の判定」記述を ADR レベルで禁止する reusable pattern として codify。 ## Tests cargo test --manifest-path src/cli-push-runner/Cargo.toml: 133 passed 新規 test: bookmark_check 6 件 + effective_patterns 1 件 (variant #4) * docs(todo): Bundle 2 完了に伴い 順位 2 / 156 / 158 を削除 * fix(cli-push-runner): Bundle 2 CR Minor 2 件対応 (main.rs message punctuation + todo9.md 順位 155 design clarification)
…+ todo10.md 新設 (#186) PR #185 post-merge-feedback 採用 (2026-05-29 ユーザー承認): - 順位 175 (T1-#1): cargo clippy を stop_quality ステップに追加 (Rust lint structural gap 補填) - 順位 176 (T2-#4): check-ci-coderabbit format extraction 関数への variant fixture 追加 user 追加要望 (2026-05-29): - 順位 177: PostToolUse hook — Edit/Write したファイルのサイズ閾値超過検出 + 分割促進 Phase D dogfood 採用 (2026-05-30 ユーザー承認、週次レビュー 2026-05-30 実行): - 順位 178 (週次レビュー S02): state.rs behavioral invariant test を ADR-041 pattern で追加 - 順位 179 (週次レビュー S03): rate-limit retry decision boundary test を rstest parameterized で追加 - 順位 180 (週次レビュー C01): lib-report-formatter に markdown pipe / newline escape を追加 (prompt injection 防御) - 順位 181 (Phase D dogfood D-A): aggregate-weekly facet の findings.json 出力を raw JSON にする (facet output bug fix) - 順位 182 (Phase D dogfood D-B): /weekly-review skill に重複検出 (簡易 grep + 3 択 AskUserQuestion) を Phase 4 で追加 Phase D dogfood 実行サマリー (handoff doc § 4 e2e 検証): - takt workflow weekly-review 起動 → 22m 52s 完走 → 12 findings 検出 (high 1 / medium 5 / low 6) - Phase C skill flow を実観測: - Phase 0 (pending file + failed marker 検出): clean state - Phase 1 (takt 起動): pre-state 書込 → background 実行 - Phase 2 (成果物 copy): .takt/runs/ → .claude/weekly-reviews/2026-05-30.md + pending JSON 構築 - Phase 3 (採否選択): user 承認経由で 5 件採用 (S02/S03/C01/D-A/D-B) - Phase 4 (todo 展開): 順位 178-182 として docs/todo10.md に追加 (順位 N system pattern 採用、ADR-031 「週次レビュー採用 (date)」section ではなく既存 priority table integration 重視) - Phase 5 (state file 更新): pending JSON consume + last-run timestamp 書込 - 観測した skill 改善点 (= 順位 181 / 182 として codify): - findings.json が フェンス wrap で出力 (facet 出力 bug、skill 内手動 strip workaround) - WR-2026-05-30-S05 が既存 順位 173 と完全重複 (重複検出 MVP 未実装の実証) 不採用 / 様子見 (analyzer 推奨を user 承認、2026-05-30): - 週次レビュー S01 / C02 / C03: 様子見 (large refactor / overflow practical mitigated / future-only risk) - 週次レビュー S04 / S05 / S06 / S07 / S08 / A01: 却下 (YAGNI / 重複 / 既存 comment で intent 明確 / serde idiomatic / docs trivial drift) todo10.md 状態: - 17KB → 34KB (5 entries 追加後)、50KB threshold まで余裕 - 既存 todo.md / todo2.md 〜 todo9.md は引き続き有効、相互独立 メタ評価: 本セッション (#181 → #182 → #183 → #184 → #185) 5 PR chain + Phase D dogfood で計 28 件の todo 採用 (post-merge-feedback 22 件 + user 主導 1 件 + 週次レビュー dogfood 5 件)、Phase B 設計の self-reinforcing detection loop が **full session 単位での dogfood cycle complete** を実証。本 commit は Phase D 完了 + Phase E (試験運用 1-2 週 dogfood + ADR-031 本採用化 + handoff retire) に carry-forward する状態。
…exception codify (PR #203 follow-up) (#204) * docs(todo): 順位 198 を PR #203 T3-1 採用で 3 観測目に昇格 PR #203 post-merge-feedback Tier 3 #1 (ADR-NNN: Timestamp invariant safety) を採用。 analyzer は新規 entry 提案だが、順位 198 が既に同 ADR 提案として登録済 (PR #199 T3-2) のため、新規追加ではなく既存 entry の data point 強化として merge した。 主な変更: - 動機: 2 件観測 (Medium) → 3 件観測 (High) に Frequency 昇格 - 本タスクの位置づけ: PR #203 T3-1 採用情報 + 既存 entry 強化の判断根拠を追記 - 参照: .claude/feedback-reports/203.md Tier 3 #1 + PR #203 を追加 - 設計決定 § 1 コンテキスト: PR #203 hooks-session-start port を観測実例に追加 - 派生プロジェクト適用: "順位 197 で実装予定" → "PR #203 で実装済" に更新 - 作業計画: PR #96 / #199 / #203 の 3 観測すべてを ADR 実装時に inline cite 順位 194 (task 着手前 grep 確認 rule、PR #196 採用) の初実践例となる。 analyzer の重複提案を運用層で吸収する明示的 pattern。 * docs(adr-039): mechanical lint exception を § 1.b として明記 + checklist 上位判定追加 PR #203 post-merge-feedback で「順位 177 file_size_check が ADR-039 機械適用で default OFF にされ、user 期待と乖離した」事象を発見。順位 147 file_length lint (default ON 固定) と順位 177 file_size_check (default OFF) の asymmetry が 標準パターンの over-application を示した。 主な変更: § 1 (Config opt-in) の改訂 - 「適用対象を明示」する section に再構成 - 「behavior の妥当性が不確定な experimental feature」と適用範囲を限定 - 「採否判定 (採用 / 却下 / 継続) のフェーズが必要なもの」を判定基準として追加 § 1.b 新設 (mechanical lint default ON 許容) - 4 条件 (non-blocking / 決定論 / scope 限定 / recovery hint 明確) すべて満たす機能を § 1 対象外として default ON 配布を許容 - 該当する実装例: 順位 147 file_length lint / 順位 177 file_size_check - 該当しない例: post-merge-feedback (ADR-014/030) / weekly-review (ADR-031) / local-llm-finding-classification (ADR-038) - PR #197 順位 177 の誤適用を本 PR (PR #203 由来) で訂正と明記 § 新規 feature 追加時 checklist (4 点 → 5 点に拡張) - § 0 「上位判定」を最初に追加: 「そもそも § 1 適用対象か?」 - § 1.b 4 条件すべて満たす → default ON で配布、4 点 checklist は skip - 1 つでも欠ける → 従来通り 4 点 mechanical checklist 実施 - 判断に迷う場合は conservative default (default OFF) を選択 - 本判定を skip して機械適用すると order-application 発生 (PR #197 で実観測) 由来: PR #203 post-merge-feedback で発見された systemic 問題への対応。 派生プロジェクトへの自動波及はなし (本 ADR は本リポジトリ専用、`~/.claude/rules/` 配下ではないため)。 * docs(adr-007): Layer 0.5 file_size_check 追記を削除 順位 177 file_size_check は ADR-007 で扱う「正規表現層 / AST 層」の判断フロー対象外で あり、metadata-only check (`std::fs::metadata.len()`) という性質上、独立した Layer 区分を設ける積極的理由がない。「Layer 0.5」概念を ADR に codify することで: - 後続の metadata-only check 追加時に Layer 0.5 への配置判断を毎回迫る - ADR-007 本体の Q1/Q2/Q3 判断フロー (regex / AST) との整合性が複雑化 - ADR-039 opt-in pattern 言及が「導入リスク」未定義のまま記載されている という systemic な over-abstraction の温床になっていた。本 PR で「順位 177 は単純な custom linter の一つとして扱う」方針 (ユーザー判断、2026-06-12) に従い、Layer 0.5 追記を削除する。今後 file_size_check 系の linter を追加する場合は ADR-007 の通常 判断フローに従い、必要なら都度 ADR 改訂で対応する。 * fix(hooks-config): file_size_check を default ON 化 + ADR 参照表記修正 ADR-039 § 1.b (mechanical lint 例外、本 PR で同時 codify) に従い、順位 177 file_size_check を default ON で配布する。順位 147 file_length lint と同 pattern。 主な変更: enabled = false → enabled = true - 4 条件 (non-blocking / 決定論的閾値 / scope 限定 / recovery hint 明確) すべて満たすため - additionalContext warning のみで block しない (failure mode が無害) - paths glob で scope 宣言的に限定 - todo*.md / Rust source に明示的 recovery hint コメント修正: - "ADR-039 § 3 opt-in pattern" → "ADR-039 § 1.b mechanical lint 例外" (§ 3 は bounded lifetime、opt-in は § 1。元コメントは誤参照) - "Layer 0.5" → "custom linter" (ADR-007 Layer 0.5 追記削除に追従) - 4 条件 (1.b 適用根拠) を明示 - 順位 147 file_length lint を同類例として cite - bounded lifetime dogfood の記述を削除 (mechanical lint は dogfood phase 不要) 影響: - 既存 grandfather (>50KB 既存ファイル) は touch されるまで warning なし - 触られた >50KB ファイル (例: docs/todo10.md) は次の Edit/Write で warning が出る - 本 PR で todo10.md の split (Commit 5) を同時実施し、初回 dogfood も完了させる * docs(todo): todo10.md を分割して file_size_check 50KB threshold 内に収める 本 PR で順位 177 file_size_check を default ON 化したことにより、touched で 50KB 超のファイル (= 本 PR 着手時の docs/todo10.md = 57KB) に warning が出る状態になった。 本 commit で todo10.md から PR #185 〜 PR #196 era の 8 エントリを新規 docs/todo12.md に分離し、todo10.md を 27KB まで縮小して threshold 内に収める。同時に hook の dogfood としても機能 (順位 177 が想定する recovery flow = 新 todo<N+1>.md 新設 + entry 移管 が実際に機能することを実観測)。 主な変更: docs/todo12.md (新規 158 行) - 順位 176 (PR #185 T2-#4): check-ci-coderabbit format variant fixture 追加 - 順位 178 (週次レビュー S02): state.rs behavioral invariant test - 順位 179 (週次レビュー S03): rate-limit retry decision boundary test - 順位 180 (週次レビュー C01): lib-report-formatter markdown pipe escape - 順位 181 (Phase D D-A): aggregate-weekly findings.json raw JSON - 順位 182 (Phase D D-B): /weekly-review skill 重複検出 (簡易 grep) - 順位 193 (PR #196 T2-1): Companion helper group 署名整合 compile-time test - 順位 194 (PR #196 T3-5): development-workflow.md grep step 追記 - 専用ファイル (新規追加先ではない)、todo11.md と同 role docs/todo10.md (-377 行、57KB → 27KB) - 上記 8 エントリを削除 - preamble に todo12.md 分離の経緯を記述 - 新セッション確認対象を「12 file」→「13 file」に更新 docs/todo-summary.md - preamble に todo12.md の説明を追記 - 8 行の「ファイル」列を todo10.md → todo12.md に変更 (sed 一括置換) 由来: 本 PR (PR #204) の hooks-config.toml 変更 (commit 4) で file_size_check default ON 化に伴う初回 dogfood。順位 177 設計の recovery flow が機能した実証 データとなる。 技術メモ: sed -i '13,390d' で 8 entries 削除、Edit tool で 380 行の old_string 構築は実用的でないため Bash 経路を選択 (ユーザーの「適切な粒度」要件と整合、 独立 commit に集約)。
…derabbit 境界 test (順位 212-215) (#215) * docs(todo): PR #214 post-merge-feedback T3-1 採用 (順位 215) PR #214 (refactor PR B partial) post-merge-feedback report の T3-1 を採用: `~/.claude/rules/common/coding-style.md` に "Defensive State Reset in State Machines" section を追記する todo entry を docs/todo-summary.md + docs/todo10.md に追加。 由来: PR #214 round 2 で CR Major #4 fix として `finalize_initial_review_park` 内 `read_state()` 後の `state.pr`/`state.repo`/`state.started_at` 無条件上書きが land。同型 `head_commit`/`review_recheck_count` reset と合わせて 5 field の確立 された defensive pattern を future reviewer が "redundant" と誤判定して 削除しないよう global rule で防御する。 Severity Medium / Frequency Medium / Effort S / Adoption Risk None で ユーザー承認 (2026-06-20)。pre-push:simplicity + pre-push:security の 独立 2 ソース検出。実装時は `feedback_global_config_backup` 適用必須。 * test(check-ci-coderabbit): API ordering + 境界条件テスト追加 (順位 213, 214) 順位 213 (PR #213 post-merge-feedback T2-1 採用): parse_coderabbit_status の `.first()` semantics を test 名 + doc comment + assert message で explicit 化。GitHub statuses API の reverse-chronological 返却 implicit assumption を test fixture で 固定し、refactor 時の意味喪失を機械的に検出する。 順位 214 (PR #213 post-merge-feedback T2-2 採用): parse_actionable_comments の `submitted_at >= push_time` inclusive 比較を境界で固定する 2 test を追加: - actionable_includes_review_at_exact_push_time: `==` 境界の inclusive 比較を保証 - actionable_excludes_review_before_push_time: 配列 latest 位置に sentinel (Actionable: 99, 11:00) を置き、rfind が time filter で 正しく除外することを確認 (filter 壊れた場合 99 が返り test 落ちる) 既存 rule⑦ `no-time-field-strict-greater` は変数名抽出後を catch 不可なため、test による second defense layer として機能。 memory `feedback_test_dry_antipattern.md` 適用で独立 setup。 検証: - cargo test -p check-ci-coderabbit: 96 passed (= 93 + 3 new) - 既存 actionable_filters_by_time との相補的 boundary 検証 * feat(hooks-pre-tool-validate): PowerShell dispatch + powershell-destructive-write-block preset 追加 (順位 212) PR #213 (refactor PR A) 作業中に発生した PowerShell スクリプトでの `check-ci-coderabbit/src/main.rs` (2369 行) 0 byte 化事故の機械強制 対策。memory `feedback_no_powershell_inplace_edit` の codify と併用する mechanical defense layer として preset と dispatch を追加した。 設計: - 新 preset `powershell-destructive-write-block` (5 BlockedPattern) - `[System.IO.File]::WriteAllText|WriteAllBytes|WriteAllLines` (事故直接因) - `Out-File` (redirect 系 cmdlet) - `Set-Content -Value` (cmdlet 版書込、-Value flag 付きのみ false positive 回避) - すべての pattern に `(?i)` flag を付与 (PowerShell の .NET method 名 + cmdlet 名は case-insensitive) - Exception を path 位置に scope (= command 全体ではなく cmdlet/method 直後の 最初の引数のみ): - WriteAllText/Bytes/Lines: `\(\s*['"]__` で open paren 直後限定 - Out-File: `Out-File\s+(?:-FilePath\s+)?['"]?__` (unquoted も allow) - Set-Content: `Set-Content\s+(?:-(?:Literal)?Path\s+)?['"]?__` - Set-Content main pattern は `[^|]*-Value` で param 順非依存 (`-Value` が `-Path` より先に来る reversed order でも block) - dispatch table に `PowerShell` arm 追加 + `handle_powershell_tool` 関数 (handle_bash_tool と同形で `tool_input.command` を build_blocked_patterns 全 preset で照合) - `default_preset_names` に登録 = Config::default() で default-on 追加 test 19 件 (= 11 base + 8 edge case): base 11 件: - positive (5): WriteAllText / WriteAllBytes / WriteAllLines / Out-File / Set-Content -Value の destructive write block - negative scratch (2): `__*` prefix path への write は allow - negative legit (3): Get-ChildItem / Where-Object / Set-Content 単体 (false positive 回避) - default-on (1) edge case 8 件 (pre-push-review Warning 4 件に対応、ADR-043 fail-closed): - W-002 SEC: lowercase `.NET` method 名 (`writealltext`) でも block - W-001 SEC: `__` 文字列が value 位置にあるとき block (path 位置に scope) - W-001 SEC: ReadAllText で `__` を読んでも WriteAllText 先が prod なら block - W-001 SIMP: Set-Content の reversed parameter order (`-Value` 先) でも block - W-001 SIMP: Set-Content の reversed order でも scratch path なら allow - W-002 SIMP: unquoted scratch path (`Out-File __output.txt`) は allow - value 位置の `__` を path と誤認しない (Set-Content 版) 検証: - cargo test -p hooks-pre-tool-validate: 221 passed (= 202 既存 + 19 new) - cargo clippy -p hooks-pre-tool-validate -- -D warnings: clean - cargo test --workspace: 全テスト pass (regression なし) Note: `src/hooks-pre-tool-validate/src/main.rs` は本 PR 後 2900 行になり file_length lint (800 行ガイドライン) を超過するが、本 PR は順位 212 の mechanical defense 追加に scope を限定し、ファイル分割 refactor は別 PR (PR #213/#214 と同 pattern) で対応する。 * fix(hooks-pre-tool-validate): Set-Content exception を順序非依存に対応 (PR #215 CR Minor #1) PR #215 CR review が指摘した Minor finding を対応: `Set-Content` の exception regex が main pattern と order-independence を共有していなかったため、`Set-Content -Value $x -Path "__file"` のような reversed parameter order での scratch path 指定が false positive で block されていた。 修正: 旧 exception: `(?i)\bSet-Content\b\s+(?:-(?:Literal)?Path\s+)?['"]?__` → `-Path` が Set-Content 直後にある順序のみカバー 新 exception: `(?i)\bSet-Content\b(?:\s+['"]?__|[^|]*\s-(?:Literal)?Path\s+['"]?__)` → 2-alternative: - alt 1: `Set-Content` 直後の positional `__` path - alt 2: `Set-Content` 以降のいずれかの位置の `-Path`/`-LiteralPath` 後の `__` path CR の修正案は `(?=...)` lookahead を使っていたが、Rust 標準 `regex` crate は lookahead 非対応 (compile failure) のため、同 semantics を 2-alt 構成で lookahead なしに実装。main pattern `[^|]*-Value` が既に `-Value` 存在を 保証しているため、exception 側に lookahead-based verification は不要。 test 追加: - `Set-Content -Value $x -Path "__file.txt"` (reversed order) → allow - `Set-Content -Value $x -LiteralPath "__file.txt"` (LiteralPath 変種) → allow - 既存の positional case (`Set-Content "__file.txt" -Value $x`) は維持 検証: - cargo test -p hooks-pre-tool-validate: 221 passed - cargo clippy -p hooks-pre-tool-validate -- -D warnings: clean 由来: PR #215 CR Minor #1 (discussion_r3448719154)、ADR-043 fail-closed 原則による security gate と false-positive 抑制の両立。
…順位 222 採用 (#219) * docs(todo): 順位 222 採用 (PR #218 post-merge-feedback #5) PR #218 (docs PR、ファイルサイズチェックフロー改善計画 + 順位 220/221 採用) の post-merge-feedback で承認された #5 を採用: 順位 222 (💎 Tier 3、Effort XS): `~/.claude/CLAUDE.md` に「複数セッション跨ぎの計画文書作成時は AI が 先走らずユーザー確認後に方針報告し GO/NO-GO を得る」ルール追加 由来: PR #218 session 内で Plan file 作成完了報告後、AI がユーザー承認 なしに PR-W0 着手しようとして `[Request interrupted by user]` で停止 された実観測 (Severity Medium、Frequency Low 初観測、Effort XS、 Adoption Risk None)。memory `feedback_no_unauthorized_reorder` の補強 として「planning doc 作成のような大きな task 完了時は GO/NO-GO 確認待ち」 を明文化、派生プロジェクトへ `~/.claude/CLAUDE.md` 経由で自動波及。 採用しなかった項目: - #1 (weekly audit を feedback entry にも明示): 計画書 PR-W0 で既に管理 - #3 (lib-subprocess stress test): 順位 220 と完全重複 - #4 (Agent template PMF entry): 計画書 Appendix A で既に capture、却下 - #2/#6/#7: 様子見継続 * feat(weekly-review): file_length scan を pre-LLM step として追加 (PR-W0) ADR-031 weekly-review pipeline に deterministic Rust pre-step として 800 行超 file の scan を追加。LLM facet 不要、純機械測定。 順位 147 (file_length lint) は touch-trigger ratchet で「触られた file の 編集時のみ警告」設計のため、未触り state の violation を可視化できない。 本 step は毎週 1 回 master HEAD に対して 800 行超 file を全件列挙し、 aggregate-weekly facet の input に注入して watchlist として report 化する。 PR-3a (PR #217) で 7 件の 800 行超 file が判明した経緯から、Phase 1 (file split work、PR-W1 〜 W4) の進捗 dashboard としても機能する。 全 file ≤ 800 行に到達後も恒久的に監視継続。 由来: docs/file-length-enforcement-plan.md PR-W0 (PR #218 で land)、 severity = warning (block しない、健康診断目的)。
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>
…9) (#349) * chore(takt): simplicity review に PR chain 宣言の降格ルールを追加 (ADR-069) 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> * docs(adr): ADR-069 (PR chain 宣言規約) を起票 + dev-conventions 追記 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> * docs(todo): 順位 364 (scope guard の pre-push 展開) を登録 (ADR-068 残課題) 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> * fix(review): apply CodeRabbit fixes for #349 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` の中間ファイル例外を完了基準に明記してください。 * fix(review): PR #349 CodeRabbit 指摘の read-only zone 分 3 件 + #4 残り対応 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> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
自動 fix 経路 (f698d19) が 1 件 (#4 台帳への非記録ルール追加) を対応済みで、 本コミットはその内容を含んだうえで残りを手で対応した結果である。同一ファイルの 近接行のため path 単位で分離できず 1 コミットに畳み込まれている。 ## 妥当性の判定 severity ラベルではなく、プロジェクトの設計方針に照らして 1 件ずつ判定した。 - #1 adr-072:335 (秘密値を ADR に記録しない) — **妥当**。「実走スモークで実値を 確認し ADR へ追記する」は秘密鍵本文まで書くと読める。ADR-051 が記録を課すのは 結合の存在と期待値の組み合わせであって秘密の実値ではない。設定メタデータに 限定し、鍵本文と token は ADR にも git 履歴にも残さないことを明記した - #2 harness-improvement-plan:223 (受け入れ基準が成功経路だけ) — **妥当**。本 プロジェクトは背圧 12 シナリオ・kill-switch 8 シナリオと停止側を drill で 固めてきたが、夜間ループの停止側は実走未観測。WP-17 の残課題 (明示的 false と config 側 deny が実走未観測) と同じ穴。AUTONOMY_ENABLED の 3 状態を受け入れ 基準へ追加した。指摘本文が名指しした 2 箇所 (計画書 L223 / todo20 L293-304) の 両方に反映している - #3 todo20:480 (prompt injection の回帰 fixture) — **妥当**。順位 382 の payload 例 "; echo PWNED; #" は shell injection であって prompt injection ではない。 台帳テキストが流れ込む先は shell ではなく LLM プロンプトなので、テストが目的と 噛み合っていなかった。自然言語 adversarial payload (本命) と shell/パース形式 payload (堅牢性) の 2 系統へ分離した ## 自動 fix の実測確認 f698d19 は 1 ファイル 2 行追加のみで範囲外の編集ゼロ。内容も妥当だったため そのまま採用した (ADR-068 の後退検知の趣旨に沿って diff を実測で確認済み)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* docs(todo): WP-18 で検出した問題を 4 エントリへ登録 (順位 374-377) WP-18 (夜間 todo 消化ループ、#361 / #362 / #363) の実装中に pre-push review・ CodeRabbit・ユーザー指摘で検出した問題 9 件のうち、todo 登録が要る 8 件を **実装時の PR 粒度**で 4 エントリへまとめる。切り分けは 2026-08-06 にユーザー確認済み。 ## 評価時の #1 を検証し、todo 登録が不要になった #1 は「Bash prefix 許可の悪用可能性検証と全経路への横展開」として登録予定だった。 ユーザー指示により登録前に検証したところ、**前提が誤りだった**。 #363 の security review は「`Bash(cargo test:*)` は前方一致でシェルを解釈しないため `cargo test` に任意コマンドを連結すると通過する」と主張していた。公式ドキュメントは これを明確に否定している: Claude Code is aware of shell operators, so a rule like `Bash(safe-cmd *)` won't give it permission to run the command `safe-cmd && other-cmd`. The recognized command separators are `&&`, `||`, `;`, `|`, `|&`, `&`, and newlines. A rule must match each subcommand independently. `--allowedTools` も同じルール体系に属する (managed settings の deny を --allowedTools で 上書きできない、と明記されている)。 結果: - `pr-monitor.yml` の Phase A 分析 agent に**当該の穴は無く、対処不要**。production の live な穴という当初の見立ては誤りだった - 残作業は `ADR-072` 決定 5 の根拠記述の訂正のみで、#363 が open のうちに同 PR へ直接 反映する。よって todo エントリを立てない 検証結果と経緯はセクション冒頭の対応表に残した。 ## この一件自体を教訓として取り込んだ 「レビュー指摘への対応時チェックリスト」エントリに 4 項目目を追加した — **指摘が技術的 前提 (ツールの挙動・仕様) に依拠しているなら、対処より先にその前提を検証する**。とくに 設計変更や他経路への横展開を伴う場合。 今回は未検証の前提のまま (a) agent から Bash を落とす設計変更を行い、(b) それを ADR の 決定として記録し、(c) さらに「同じ形が production にもある」と横展開の警告まで出していた。 一次情報に当たれば 1 回の WebFetch で否定できた。 ## 内訳 - 順位 374: WP-18 夜間ループの実走スモーク実施 (Tier 1、評価時の #2/#3) - 順位 375: レビュー指摘への対応時チェックリスト (Tier 2、評価時の #4/#5/#6 + 今回の #1) - 順位 376: push-runner の bookmark 自動前進がスタック境界を壊す (Tier 2、評価時の #7) - 順位 377: 夜間ループの防御を検知から防止へ格上げする判断 (Tier 3、評価時の #8/#9) ## まとめ方の方針 リポジトリの既存バッチ登録 (#350〜#357 の 24 件を 8 エントリへ) と同じく実装時の PR 粒度で まとめた。評価時の番号との対応はセクション冒頭に表で残してある。 順位 374 (スモーク) の観測項目は `ADR-072` の実走スモーク節に表があるため、todo 側は スケジューリングの掛かりだけを持ちチェックリストを複製しない。同じ表を 2 箇所で管理すると 必ず drift する (#362 の post-merge feedback が指摘した single source-of-truth 問題と同型)。 ADR-033 (絶対番号は table のみに保持) に従い、エントリ本文には順位番号を書いていない。 todo20.md は 50KB 閾値内。pnpm lint:docs / markdownlint ともに green。 Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> * docs(todo): #363 post-merge feedback の採用 6 件を登録 (順位 378-383) WP-18 最終 PR (#363、ADR-072) のマージ後 feedback が Tier 1 に 4 件・Tier 2 に 2 件を 採用候補として挙げた。ユーザー承認 (2026-08-07) を得て登録する。 ## 6 件は 1 本の根から出ている 台帳 (docs/claude-code-web-tasks.md) の 内容 / 対象ファイル / 注意 は自由記述のまま 無人 agent のプロンプトへ流入する。agent は $GITHUB_WORKSPACE 全体に書き込め、その 出力は draft PR 本文という公開面に出る。ADR-054 の信頼境界そのもの。 - 378 (XS) 台帳を ADR-035 の docs-only 除外パス表へ追加 — 他 3 件の前提。台帳だけを 変える PR が緩い評価経路に乗ると、対策そのものを迂回する台帳 PR が通りうる - 379 (S) tool scope を work/** へ限定 — ADR-072 決定 7 の改ざん検知が必要になって いる根本原因。実装後も検知層は残す (防御を 1 枚に減らす変更ではない) - 380 (M) 台帳フィールドを untrusted data として明示 framing - 381 (S) 台帳由来 SUMMARY の draft PR 本文出力に screening - 382 (M) injection payload の regression test (380 に依存) - 383 (S) is_separator_row のパイプ検証欠落 ## 期限を「定常運用開始前」に固定する 実効リスクは現時点では低い — 悪意ある台帳行を master へマージするのはユーザー自身で、 単独運用では外部からの注入経路が無い。ただし夜間ループが定常運用に入り draft PR の 流量が増えると前提が変わるため、無期限の Tier 積みにしない。 順位 374 (実走スモーク) は dry_run で PR を作らないため本件の実害が無く、待たせない。 ## 383 は実コードで確認済み is_table_row は行頭 | を要求するが、is_separator_row は split_cells の結果しか見ない。 split_cells("---") は ["---"] を返し全セルが '-' のみなので真になる。markdown の 水平線がセパレータ行として通る (todo ファイル自身が --- を使っている)。 ADR-072 決定 2 の fail-closed 設計の coverage hole。 ## 併せて 順位 374 のスモーク観測項目数を 4 → 8 へ修正した (ADR-072 側の実測と不一致だった)。 Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> * docs(harness-plan): WP-18 を 3 PR マージ済へ更新し残作業 2 系統を明示する #363 のマージ (2026-08-07) で WP-18 の実装 3 本がすべて land した。 ## 「実装完了 = WP 完了」ではないことを表で残す コードは全部 master にあるが、**夜間ループはまだ 1 度も走っていない**。この状態を 「実装済」の一語で片付けると、次のセッションが受け入れ基準を満たしたものと誤読する。 残作業を 2 系統に分けて表にした: 1. 実走スモーク (順位 374) — 受け入れ基準の中核 2. prompt injection 対策 4 件 (順位 378-381) — 定常運用開始前に必須 ## スモークの前提が充足したことを記録 受け入れ基準の表は「(a) workflow が master にある (b) 台帳に無人可マークがある」を 未充足として書いていたが、**両方ともマージで解消した**。残る操作は GitHub UI 側の AUTONOMY_ENABLED 設定のみなので、その 1 点へ書き換えた。 ## 依存関係を明示する 378-381 は 1 本の根 (台帳の自由記述が無検証で agent プロンプトへ流入) から出ている。 一方スモークは dry_run で PR を作らないため本件の実害が無い。したがって **スモークは 378-381 を待たずに着手してよい**と明記した。次セッションが順序で 迷わないようにするため。 ## 未 push の改善 3 点の所在を残す #363 の最終 push が security REJECT で止まったため、改ざん検知の red 化 / 決定 10 の 色分け表 / 決定 6 の列挙基準が master に載っていない。ローカル bookmark wp18/unpushed-improvements (fc22403c) に保持していることを記録した。いずれも 可観測性と文書の改善で、fail-closed 自体は master 版でも成立している。 Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> * docs(todo): 外部設定 (GitHub App / variables / secrets) の実体記録を登録 (順位 384) 新セッションでの指摘 (2026-08-07): workflow は vars.NIGHTLY_APP_ID / secrets.NIGHTLY_APP_PRIVATE_KEY を参照するが、App の作成・インストール・登録を 記録した文書がリポジトリ内に無い。 ## 欠けているのは設計根拠ではなく運用実体 ADR-072 決定 8 は「なぜ App token か」「なぜ PAT ではないか (オーナー PAT は Repository admin として ADR-067 の ruleset backstop を素通りする)」「どの権限を 付けるか (Workflows は付けない)」「なぜ publish 直前に発行するか (token 寿命 1 時間)」を厚く残している。 記録が無いのは以下: - App を実際に作成した事実・日付・名称・インストール範囲 - NIGHTLY_APP_ID = variable / NIGHTLY_APP_PRIVATE_KEY = secret という登録先の別 - 既存の Claude GitHub App との区別 (あちらは Workflows を含む広い権限を持つ別物) - 再構築手順 (鍵ローテーション・派生プロジェクト展開) NIGHTLY_APP の文字列はリポジトリ全体で workflow の 2 行と ADR 残課題の 1 行にしか 現れない。 ## これは ADR-051 違反 ADR-051 (クロスシステム設定 coupling) は内部設定と外部 SaaS 設定が論理結合する場合に (1) 両設定ファイルへの相互参照コメント (2) 期待値の組み合わせ表の ADR 必須記載 (3) 変更は両側を同一 PR、の 3 点を規律として定めている。workflow ↔ GitHub App + repository variables/secrets はこの型で、3 点とも未実施。 前例として ADR-067 段 0 は repository ruleset を ruleset 名つきで「設定済み」と 記録している。ADR-072 は同じ扱いをしていない。同型の欠落が AUTONOMY_ENABLED にも あり (ADR-066 は「Actions variable を使う」とは書くが現状値を記録していない)、 本エントリで一緒に扱う。 ## 順位 374 と同時実施にする理由 スモークでは AUTONOMY_ENABLED の設定と App token の実動確認のため GitHub UI を 触るので、その過程で実値がすべて揃う。先行して記録しようとすると値が確定せず 二度手間になる。 ## 教訓を残す App の作成手順・Expire user authorization tokens の扱い・既存 App との違いは 2026-08-07 のセッションでユーザーへ提示したが、リポジトリへ残さなかった。会話は 次のセッションに残らないが workflow は残る。参照だけが残って由来が消える状態を 作った。順位 375 と同じクラスの失敗としてエントリ本文に記録した。 Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(review): CodeRabbit Major 4 件を妥当性判定のうえ 3 件へ対応する (#364) 自動 fix 経路 (f698d19) が 1 件 (#4 台帳への非記録ルール追加) を対応済みで、 本コミットはその内容を含んだうえで残りを手で対応した結果である。同一ファイルの 近接行のため path 単位で分離できず 1 コミットに畳み込まれている。 ## 妥当性の判定 severity ラベルではなく、プロジェクトの設計方針に照らして 1 件ずつ判定した。 - #1 adr-072:335 (秘密値を ADR に記録しない) — **妥当**。「実走スモークで実値を 確認し ADR へ追記する」は秘密鍵本文まで書くと読める。ADR-051 が記録を課すのは 結合の存在と期待値の組み合わせであって秘密の実値ではない。設定メタデータに 限定し、鍵本文と token は ADR にも git 履歴にも残さないことを明記した - #2 harness-improvement-plan:223 (受け入れ基準が成功経路だけ) — **妥当**。本 プロジェクトは背圧 12 シナリオ・kill-switch 8 シナリオと停止側を drill で 固めてきたが、夜間ループの停止側は実走未観測。WP-17 の残課題 (明示的 false と config 側 deny が実走未観測) と同じ穴。AUTONOMY_ENABLED の 3 状態を受け入れ 基準へ追加した。指摘本文が名指しした 2 箇所 (計画書 L223 / todo20 L293-304) の 両方に反映している - #3 todo20:480 (prompt injection の回帰 fixture) — **妥当**。順位 382 の payload 例 "; echo PWNED; #" は shell injection であって prompt injection ではない。 台帳テキストが流れ込む先は shell ではなく LLM プロンプトなので、テストが目的と 噛み合っていなかった。自然言語 adversarial payload (本命) と shell/パース形式 payload (堅牢性) の 2 系統へ分離した ## 自動 fix の実測確認 f698d19 は 1 ファイル 2 行追加のみで範囲外の編集ゼロ。内容も妥当だったため そのまま採用した (ADR-068 の後退検知の趣旨に沿って diff を実測で確認済み)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
いずれも「実コードを確認せず断定していた」箇所で、実装を verify して直した。 ## #1 (harness-plan) WP-11 の「誤検知」→「設計どおりの保守的 deny」 evaluate_scope_guard の allowlist は allowlist_from_paths(findings.map(f.file)) = finding の anchor 位置だけで、remedy が別ファイルなら含まない (ADR-054 も欠点として 明記)。#366 の BLOCK は誤検知ではなく設計どおりの保守的 deny。本採用の判定基準を 「この保守的 deny を誤検知に数えない」よう明確化する、と修正。 ## #2 (todo.md/todo3-7) breadcrumb の todo20/todo2-20 残存 docs バッチで更新し漏れた参照を補完。todo.md 冒頭の使い分けを todo21 + summary2 まで、 todo3-7 の「todo2-20」を todo2-21 へ。全 docs で todo2-20 残存ゼロを確認。 ## #3 (todo21:58) heads(::@ & bookmarks()) の複数返り @ に複数 bookmark が付くと複数コミットを返し clone --head / PR 選択が多対象になる。 trunk 除外 + 単一 bookmark へ絞る (現行 is_trunk_bookmark 除外と同規律) 必要を追記。 ## #4 (todo21:102) 388 の「race」断定を撤回 reconcile_takt_output → copy_feedback_report は find_latest_run_dir で run dir を 選ぶ (mod.rs:147 / takt.rs:84)。単純な write race と断定せず、latest 特定のずれ / パス不一致 / 前後関係を「まず特定する」形へ。#367 では実体が run dir に存在した。 ## 検証 pnpm lint:docs OK / markdownlint 0 error。scope guard・feedback reconcile の実装を 実際に読んで記述と一致させた。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* docs(todo): WP-18 セッションの観測を順位 385-388 へ登録し todo21.md を新設 (Phase 2) WP-18 の PR 作業 (#364〜#370) で実測した自動化経路の運用問題を todo へ登録し、 384 完了削除・todo ローテーション・WP-11 記録を 1 バッチにまとめる。 ## todo21.md 新設 (todo20.md が 56KB = 50KB 閾値超過) 新規追加先を todo20.md → todo21.md へ移行。breadcrumb を持つ 5 ファイル (todo.md / todo8 / todo10 / todo13 / todo14) の「現在の追加先」ポインタと、 数詞「22つ/todo2-20」を持つ 8 ファイル (todo3-11) を 23つ/todo2-21 へ更新。 ## 順位 385-388 (2026-08-08 実測、todo21.md) - 385 (T3): cli-pr-monitor lock の liveness check 欠落 (復帰窓 30 分) - 386 (T2): 監視・自動 fix 経路の空コミットで bookmark ずれ → merge/push 失敗。 **本セッションで 7 回観測**、生成元確定、深さ非依存 revset が本命の対処 - 387 (T2): 自動 fix は push が BLOCK されてもローカル作業コピーを書き換える - 388 (T3): post-merge-feedback の完了判定が書き込みと race し誤 failed marker いずれも post-merge feedback には構造的に入らない (feedback の入力は PR diff と レビュー指摘で、ツール自身の運用中の事象は拾わない)。 ## 順位 384 完了・削除 外部設定の実体は ADR-072 § 外部設定の実体 に記録済み (#369/#370)。todo20.md の full エントリと summary2 の行を削除し、完了記録の 1 行に置換。 ## WP-11 記録 (harness-improvement-plan) #366 で enforce 下の scope guard 誤検知を 1 件観測。anchor と remedy が別ファイルの 指摘は構造的に必ず BLOCK される。本採用判定の前に判定基準の再定義が要ることを記録。 ## 検証 pnpm lint:docs OK (preamble + cross-ref + priority-inversion — 数詞 23 整合を含む) / markdownlint 127 files 0 error。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * docs: CodeRabbit 指摘 4 件に対応 — 実装確認のうえ断定を訂正 (#371) いずれも「実コードを確認せず断定していた」箇所で、実装を verify して直した。 ## #1 (harness-plan) WP-11 の「誤検知」→「設計どおりの保守的 deny」 evaluate_scope_guard の allowlist は allowlist_from_paths(findings.map(f.file)) = finding の anchor 位置だけで、remedy が別ファイルなら含まない (ADR-054 も欠点として 明記)。#366 の BLOCK は誤検知ではなく設計どおりの保守的 deny。本採用の判定基準を 「この保守的 deny を誤検知に数えない」よう明確化する、と修正。 ## #2 (todo.md/todo3-7) breadcrumb の todo20/todo2-20 残存 docs バッチで更新し漏れた参照を補完。todo.md 冒頭の使い分けを todo21 + summary2 まで、 todo3-7 の「todo2-20」を todo2-21 へ。全 docs で todo2-20 残存ゼロを確認。 ## #3 (todo21:58) heads(::@ & bookmarks()) の複数返り @ に複数 bookmark が付くと複数コミットを返し clone --head / PR 選択が多対象になる。 trunk 除外 + 単一 bookmark へ絞る (現行 is_trunk_bookmark 除外と同規律) 必要を追記。 ## #4 (todo21:102) 388 の「race」断定を撤回 reconcile_takt_output → copy_feedback_report は find_latest_run_dir で run dir を 選ぶ (mod.rs:147 / takt.rs:84)。単純な write race と断定せず、latest 特定のずれ / パス不一致 / 前後関係を「まず特定する」形へ。#367 では実体が run dir に存在した。 ## 検証 pnpm lint:docs OK / markdownlint 0 error。scope guard・feedback reconcile の実装を 実際に読んで記述と一致させた。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Summary
Replaceを追加し、ファイル全体置換ツール使用時もフックが発火するように修正deploy-hooks.jsで既存settings.local.jsonのhooksキーのみ上書きし、permissions等の既存設定を保持するマージ方式に変更Background
他プロジェクトへの hooks 配布・運用で判明した2つの課題を修正:
Replaceがなく、拡張子が一致しないファイルを作成後にReplaceで書き換えると linter フックをバイパスできたpnpm deploy:hooks実行時にsettings.local.jsonを丸ごと再生成していたため、ユーザーが許可したコマンド (permissions) が毎回消えていたChanges
.claude/settings.local.json.templateBash|Write|Edit→Bash|Write|Edit|ReplacePostToolUse matcher:
Write|Edit→Write|Edit|Replacescripts/deploy-hooks.jshooksキーのみ上書き、なければ新規生成Test plan
settings.local.json.templateの matcher にReplaceが含まれていることpnpm deploy:hooksを実行し、permissions が保持されることsettings.local.jsonがない対象には従来通り新規生成されること🤖 Generated with Claude Code
Summary by CodeRabbit
リリースノート
新機能
改善