Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions .claude/settings.local.json.template
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"hooks": [
{
"type": "command",
"command": "\"{{PROJECT_DIR}}\\.claude\\hooks-session-start.exe\"",
"command": "\"{{PROJECT_DIR}}/.claude/hooks-session-start{{EXE_SUFFIX}}\"",
"timeout": 5
}
]
Expand All @@ -24,7 +24,7 @@
"hooks": [
{
"type": "command",
"command": "\"{{PROJECT_DIR}}\\.claude\\hooks-user-prompt-feedback-recovery.exe\"",
"command": "\"{{PROJECT_DIR}}/.claude/hooks-user-prompt-feedback-recovery{{EXE_SUFFIX}}\"",
"timeout": 5
}
]
Expand All @@ -36,7 +36,7 @@
"hooks": [
{
"type": "command",
"command": "\"{{PROJECT_DIR}}\\.claude\\hooks-pre-tool-validate.exe\"",
"command": "\"{{PROJECT_DIR}}/.claude/hooks-pre-tool-validate{{EXE_SUFFIX}}\"",
"timeout": 5
}
]
Expand All @@ -48,7 +48,7 @@
"hooks": [
{
"type": "command",
"command": "\"{{PROJECT_DIR}}\\.claude\\hooks-post-tool-linter.exe\"",
"command": "\"{{PROJECT_DIR}}/.claude/hooks-post-tool-linter{{EXE_SUFFIX}}\"",
"timeout": 30
}
]
Expand All @@ -58,7 +58,7 @@
"hooks": [
{
"type": "command",
"command": "\"{{PROJECT_DIR}}\\.claude\\hooks-post-tool-comment-lint-rust.exe\"",
"command": "\"{{PROJECT_DIR}}/.claude/hooks-post-tool-comment-lint-rust{{EXE_SUFFIX}}\"",
"timeout": 10
}
]
Expand All @@ -68,7 +68,7 @@
"hooks": [
{
"type": "command",
"command": "\"{{PROJECT_DIR}}\\.claude\\hooks-post-tool-jj-op-verify.exe\"",
"command": "\"{{PROJECT_DIR}}/.claude/hooks-post-tool-jj-op-verify{{EXE_SUFFIX}}\"",
"timeout": 10
}
]
Expand All @@ -79,17 +79,17 @@
"hooks": [
{
"type": "command",
"command": "\"{{PROJECT_DIR}}\\.claude\\hooks-stop-tool-call-leak.exe\"",
"command": "\"{{PROJECT_DIR}}/.claude/hooks-stop-tool-call-leak{{EXE_SUFFIX}}\"",
"timeout": 5
},
{
"type": "command",
"command": "\"{{PROJECT_DIR}}\\.claude\\hooks-stop-quality.exe\"",
"command": "\"{{PROJECT_DIR}}/.claude/hooks-stop-quality{{EXE_SUFFIX}}\"",
"timeout": 300
},
{
"type": "command",
"command": "\"{{PROJECT_DIR}}\\.claude\\hooks-stop-feedback-dispatch.exe\"",
"command": "\"{{PROJECT_DIR}}/.claude/hooks-stop-feedback-dispatch{{EXE_SUFFIX}}\"",
"timeout": 10
}
]
Expand Down
31 changes: 30 additions & 1 deletion docs/adr/adr-005-hooks-path-resolution-with-template.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,37 @@ ADR-003 の以下の記述はこの ADR により supersede される:
- 「`settings.local.json` での参照: `"%CLAUDE_PROJECT_DIR%\\.claude\\<機能名>.exe"`」→ テンプレートの `{{PROJECT_DIR}}` に変更
- 「バージョン管理するもの: `settings.local.json`」→ テンプレートを管理し、生成物は `.gitignore`

### 追記: `{{EXE_SUFFIX}}` 変数 + パス区切り `/` 統一 (2026-07-20、WP-13)

`harness-improvement-plan.md` WP-13「EXE_SUFFIX 抽象化」(全クラウド対応の土台) の一環として、
本 ADR のテンプレート機構を OS 非依存化した。

**変更点:**

1. **`{{EXE_SUFFIX}}` プレースホルダーを追加**: テンプレートの exe パス末尾を
`hooks-session-start.exe` から `hooks-session-start{{EXE_SUFFIX}}` に変更し、生成時に OS 依存の
実行ファイル拡張子 (Windows: `.exe` / それ以外: 空文字) へ置換する。`{{PROJECT_DIR}}` と同じ
ビルド時置換の枠組みに乗せた。
2. **パス区切りを `/` に統一**: テンプレートの `\\.claude\\` を `/.claude/` に変更し、
`{{PROJECT_DIR}}` も forward-slash 正規化した値で置換する。**forward-slash の絶対パス exe は
Windows でも実行可能**であることを実測で確認済み (`& "C:/…/x.exe"` / `cmd /c "C:/…/x.exe"` の
双方が exit 0。加えて配布後の session で forward-slash パスの PreToolUse hook が実発火を確認)。
これにより JSON エスケープ (`\\`) が不要になり、Linux でもそのまま通る。
3. **生成ロジックを `scripts/build-hooks-settings.mjs` へ切り出し**: 従来 `package.json` に
インラインで書いていた `node -e "…"` を独立スクリプト化し、`{{EXE_SUFFIX}}` 置換と
**生成物の JSON 妥当性検証 (fail-closed)** を追加した (壊れた settings で hooks が無言で
無効化される本 ADR 冒頭の事故を防ぐため)。
4. **`deploy-hooks.ts` も同一解決に追従**: 派生プロジェクト配布時の template 解決も
forward-slash + `{{EXE_SUFFIX}}` に揃え、コピー対象 exe リストも crate 名 + `EXE_SUFFIX` で
組み立てるよう変更した。

**スコープ外 (WP-15 の Linux config 生成に委ねる)**: `hooks-config.toml` の quality_gate `cmd`
(cmd.exe 経由 + `.\.claude\….exe`) や `push-runner-config.toml` の `exe_path` 明示指定は、
ソースの hardcode ではなくデプロイ時 config であり、cmd.exe 依存の解消を含むため本 WP では変更しない。

## References

- ADR-003 — hooks の配置規則とビルド戦略(本 ADR で部分的に supersede)
- `.claude/settings.local.json.template` — テンプレートの実体
- `package.json` の `build:hooks-settings` — 生成スクリプト
- `scripts/build-hooks-settings.mjs` — 生成スクリプト (`package.json` の `build:hooks-settings` が起動)
- `scripts/deploy-hooks.ts` — 派生プロジェクト配布時の同一 template 解決
6 changes: 4 additions & 2 deletions docs/harness-improvement-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ Anthropic 公式のハーネスエンジニアリング指針(決定論的基
- **ADR-028**: `pnpm create-pr` / `pnpm merge-pr` は permissions.ask ゲート対象。自動実行しない。
- **PreToolUse hook が `gh` の直呼びを block する**。GitHub 操作は既存の pnpm scripts / cli-* 経由で行うこと(hook のフィードバックに従う)。
- **ADR-043**: fail-closed はゲート関数のみに適用。助言層(本計画の local_review 等)は fail-open(graceful skip)が正しい。この線引きを新規 ADR に明記すること。
- **Windows ビルドの既知の罠**: `pnpm build:all` は Git for Windows の `usr/bin`(`cp` 等) PATH に必要。WP-13 完了でこの依存自体が解消される
- **Windows ビルドの既知の罠(WP-13 で解消済み)**: 従来 `pnpm build:all` は Git for Windows の `usr/bin`(`cp` 等) PATH に要求していたが、WP-13 で `cp` を Node 製 `scripts/deploy-artifacts.mjs` に置換したため、この PATH 依存は解消された
- **本ファイルを含む md 編集時に発火するカスタムルール**: 個人ユーザーパスの記載禁止(rule②・error)、`](../docs/` 形式のバックリンク禁止(rule⑧・error)、非 ASCII 見出しへのアンカーリンク警告(rule⑤)。markdownlint は MD028 / MD040(コードフェンスに言語必須)/ MD058(table 前後に空行)のみ有効。
- **takt はバージョン固定**(ADR-017)。Linux 対応時も同一バージョンの Linux バイナリを取得する。
- 派生プロジェクト(techbook-ledger / auto-review-fix-vc)への配布(`pnpm deploy:hooks`)を壊さないこと(WP-13 で特に注意)。
Expand All @@ -72,7 +72,7 @@ Anthropic 公式のハーネスエンジニアリング指針(決定論的基
| WP-10 | 1-C | 自律境界ポリシー ADR(ADR-028 の 2 段化) | S | なし | 実装済(ADR-052 起票: 自律 actor 限定の 2 クラス分類〔自動実行可: docs-only / Tier3 cleanup / `claude/` push / draft PR 作成、ゲート必須: ready 化 / マージ / master push〕+ 分類不能は fail-closed〔ADR-043〕。ADR-028 のゲートを commitment 点へ移設するのが 2 段化の本質。試験運用。Rust 分類関数は呼び手〔自律実行経路〕不在で今回見送り= WP-17/18 着手時に gate.rs の docs-only 判定を lib 切り出しで実装) |
| WP-11 | 2 | prompt injection 信頼境界の 3 層防御 | M-L | WP-08 | 実装済([ADR-054](adr/adr-054-prompt-injection-trust-boundary-defense.md): 分類/指示/決定論の 3 層 + security facet + fixture。決定論層は default OFF opt-in、本リポジトリは observe で dogfood 開始。誤検知ゼロ確認後 enforce 昇格が採否判定〔3-5 PR〕) |
| WP-12 | 2 | 発火テレメトリ + ハーネス ROI 棚卸し | M | なし | 実装済(step1 収集層のみ: ADR-055 + lib-telemetry + 6 hook 計装。step2-3〔集計 pre-step / 卒業判定機械化〕は 28 日 warm-up 後着手のため todo 順位 307/308 へ移管) |
| WP-13 | 3 | EXE_SUFFIX 抽象化 | M | なし | 未着手 |
| WP-13 | 3 | EXE_SUFFIX 抽象化 | M | なし | 実装済(build/実行 scripts を deploy-artifacts.mjs / run-artifact.mjs 経由に、settings を `/` 区切り + `{{EXE_SUFFIX}}` 化、Rust の機能的 exe 解決を EXE_SUFFIX 化。ADR-005 amendment。cargo test 全 pass・build:all/deploy:hooks/lint:docs 退行なし実測。config TOML の cmd.exe 依存は WP-15 へ。`完了` は初回 push/PR で launcher 経路の実走確認後) |
| WP-14 | 3 | PowerShell 3 本の Rust 化 | S-M ×2 | なし | 未着手 |
| WP-15 | 3 | Linux バイナリビルド + クラウド setup script | M | WP-13, 14 | 未着手 |
| WP-16 | 3 | CI matrix(移植退行防止) | S | WP-13, 14 | 未着手 |
Expand Down Expand Up @@ -232,6 +232,8 @@ Anthropic 公式のハーネスエンジニアリング指針(決定論的基

### WP-13: EXE_SUFFIX 抽象化

> **実装済 (2026-07-20)**: `.exe` ハードコードを OS 非依存化する 5 コミットで実装。① build コピー `cp target/release/*.exe .claude/` を Node 製 `scripts/deploy-artifacts.mjs` に置換(`cp` の PATH 依存も構造解消)。② 実行系 pnpm scripts(push / create-pr / mark-notified / merge-pr / check-ci / lint:docs)を `scripts/run-artifact.mjs` ランチャー経由に(suffix 解決 + 引数忠実転送で cli-pr-monitor の `--body` 再結合も透過)。③ `settings.local.json.template` を `/` 区切り + `{{EXE_SUFFIX}}` に統一(forward-slash 絶対パス exe が Windows でも実行可能なことを実測、配布後 session の PreToolUse hook 実発火も確認)、生成を `scripts/build-hooks-settings.mjs` へ切り出し + JSON 妥当性検証(fail-closed)、`deploy-hooks.ts` も同一解決に追従([ADR-005](adr/adr-005-hooks-path-resolution-with-template.md) amendment)。④ Rust の機能的 exe 解決を `std::env::consts::EXE_SUFFIX` 化。**スコープ補正**: プラン策定(2026-07-04)後のコード進化で当初想定の「hooks-pre-tool-validate の protected_files / polling_exe」は stale(protected_files に `.exe` 無し)となっており、実際の機能的 `.exe`(cli-pr-monitor の classifier/checker exe 解決・wakeup fallback 3 箇所、cli-push-runner の lint_screen デフォルト、hooks-pre-tool-validate の exe-help-block regex を `.exe` optional 化して Linux バイナリも block)を精査して置換した。**スコープ外(WP-15 の Linux config 生成へ委譲)**: `hooks-config.toml` の quality_gate `cmd`(cmd.exe 経由 + `.\.claude\….exe`)と `push-runner-config.toml` の `exe_path` 明示指定はソース hardcode ではなくデプロイ時 config であり、cmd.exe 依存の解消を含むため本 WP では変更しない。**受け入れ基準の実測**: cargo test 全 pass(248/256/232)・clippy clean・`pnpm build:all` / `deploy:hooks`(一時ターゲットで smoke)/ `lint:docs` 退行なし。**`完了` 条件**: 本変更を含む初回 push/PR サイクルで push / create-pr 経路の launcher 実走に退行が無いことを確認したら `完了`(create-pr / merge-pr は副作用のため本セッションでは launcher の引数透過性を設計で担保するに留めた)。以下は当初ステップ(記録用)。

Comment thread
coderabbitai[bot] marked this conversation as resolved.
- **目的**: `.exe` ハードコード(package.json の build/実行 scripts 15 箇所以上 + Rust コード 2 箇所)の解消。全クラウド対応の土台。
- **ステップ**:
1. `scripts/deploy-artifacts.mjs`(Node 製・クロスプラットフォーム)を新設し、package.json の全 `cp target/release/*.exe .claude/` を置換(`process.platform` で suffix 判定)。**副次効果: Git usr/bin の `cp` PATH 依存(既知の罠)が構造的に解消される。**
Expand Down
2 changes: 2 additions & 0 deletions docs/todo-summary.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@
| 331 | 🔧 Tier 2 | **hooks-session-start に systemMessage を含む JSON 出力の exe-spawn E2E テスト追加 (#299 post-merge feedback 採用)** | todo13.md | S | なし (現状 pure function レベルのみ、実 config パース込み exe 駆動の検証なし。ADR-049 exe-spawn E2E 先例流用。UI 実描画確認は別途 dogfood) |
| 332 | 🔧 Tier 2 | **`pnpm build:all` 前に git usr/bin (cp.exe) PATH 未設定を自動検出・追加 (#301 post-merge feedback 採用)** | todo13.md | S | なし (Windows で pnpm が cmd.exe 経由実行のため `cp` 解決失敗。memory 既記録だが再発2回目。Windows 限定 additive 分岐、他OS非影響) |
| 333 | 🔧 Tier 2 | **VSCode 拡張が hook `systemMessage` を UI 描画するかの調査 (ADR-059 dogfood / 削除条件 2、2026-07-19 週次レビュー観測)** | todo14.md | S | なし (2026-07-19 dogfood で VSCode UI での systemMessage 独立描画が未確認 = additionalContext 経由のみ観測。ターミナル CLI との挙動差を切り分け。ADR-059 bounded-lifetime 判定 期限 2026-08-16 の blocker。描画なしでも defense-in-depth backstop あり revert 不要) |
| 334 | 🚀 Tier 1 | **docs/todo*.md 本文の順位番号表記を検出する custom lint rule (ADR-033 使用禁止の仕組み化、#303 post-merge feedback 採用)** | todo14.md | S | なし (ADR-033 が禁止規定 + 将来の展望で lint 検討済みだが未実装 約3ヶ月。検証 grep 実証済み、literal-ban rule⑥/⑪ と同型) |
| 335 | 🔧 Tier 2 | **post-merge-feedback の transcript 分析を cli-merge-pipeline 生成 summary index に置換 (#303 post-merge feedback 採用)** | todo14.md | M | なし (session-analysis facet が約 1.5MB transcript で 25K token limit 衝突・避難措置を自己観測。既存 filter の自然な拡張、Frequency High) |

**戦略**: Tier 1 を 2〜3 セッションで片付け → Tier 2 で ADR-032 の前提 + rate-limit + convergence cost 削減を進める → Tier 3 で ADR-032 を land + ドキュメント整備。Tier 4-5 は cleanup / 外部展開で daily efficiency への直接効果は小さい。

Expand Down
44 changes: 44 additions & 0 deletions docs/todo14.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,47 @@
#### 完了基準

- VSCode 拡張 (と CLI) で hook `systemMessage` が描画されるかが切り分けられ、ADR-059 削除条件 2 の判定 (計画書 `docs/weekly-review-notification-plan.md` の削除可否) が下せること。

---

### docs/todo*.md 本文の順位番号表記を検出する custom lint rule (ADR-033 使用禁止の仕組み化)

> **動機**: [ADR-033](adr/adr-033-todo-numbering-simplification.md) (2026-04-29 試験運用) が「絶対番号は table のみに保持し、本文中の順位番号表記は使用禁止」と規定し、「将来の展望」節で pre-push hook の custom_lint_rule 追加を検討済みと明記したが、未実装のまま約 3 ヶ月経過。#303 の CodeRabbit 対応でも本文参照の drift が問題化した文脈。#303 post-merge feedback で採用。
>
> **対処案**: `.claude/custom-lint-rules.toml` に regex rule を追加し、`docs/todo*.md` の本文 (table 行を除く) に残る順位番号の literal 表記を検出する。ADR-033 の検証用 grep が既に動作実証済みのため rule 化の Effort は S。既存の literal-ban 系 custom rule (rule⑥/⑪) と同型。
>
> **参照**: `.claude/feedback-reports/303.md` Tier1 #2、[ADR-033](adr/adr-033-todo-numbering-simplification.md) (§ 将来の展望)、`.claude/custom-lint-rules.toml`。
>
> **実行優先度**: 🚀 Tier 1 — Severity Medium / Frequency Medium / Effort S / Adoption Risk None (ADR-033 で既に禁止規定 + 検証 grep 実証済み)。

#### 作業計画

- [ ] `.claude/custom-lint-rules.toml` に `docs/todo*.md` 本文の順位番号表記を検出する regex rule を追加 (table 行を除外)
- [ ] 既存本文の違反を洗い出し修正 (ADR-033 の grep を流用)
- [ ] 本エントリ削除 + todo-summary.md 行削除

#### 完了基準

- `docs/todo*.md` 本文に順位番号表記が混入した場合、pre-push / PostToolUse で決定論的に検出されること (ADR-033 の規定が仕組みで強制される)。

---

### post-merge-feedback の transcript 分析を cli-merge-pipeline 生成の summary index に置換

> **動機**: post-merge-feedback の session-analysis facet が、大きな transcript (#303 マージ時は約 1.5MB / 427 行) で 25K token limit に衝突し、Grep + 手動パースの避難措置を要した (aggregate 工程の自己観測)。cli-merge-pipeline は既に transcript filter を実施済みのため、index 出力の追加は自然な拡張。#303 post-merge feedback で採用。
>
> **対処案**: cli-merge-pipeline の Phase 0 (transcript filter) で summary index (timestamp / message_type / tool_name / outcome) を事前生成し、session-analysis facet の入力を raw transcript からこの index に置換する。token limit 衝突を構造的に回避。
>
> **参照**: `.claude/feedback-reports/303.md` Tier2 #1、`src/cli-merge-pipeline` (Phase 0 transcript filter 出力)、`.takt/facets/instructions/analyze-session.md` (消費側 facet)。
>
> **実行優先度**: 🔧 Tier 2 — Severity Medium / Frequency High (毎回のマージ feedback で発生し得る) / Effort M / Adoption Risk None (既存 filter の自然な拡張)。

#### 作業計画

- [ ] cli-merge-pipeline の Phase 0 で transcript summary index を生成 (timestamp / message_type / tool_name / outcome)
- [ ] session-analysis facet の入力を index に切替 + token 消費が threshold 内に収まることを確認
- [ ] 本エントリ削除 + todo-summary.md 行削除

#### 完了基準

- 大きな transcript の PR でも session-analysis facet が token limit に衝突せず、Grep 避難措置なしで分析が完了すること。
Loading
Loading