Skip to content

fix(pr-monitor): findings ファイルをワークスペース内へ移し fix agent から読めるようにする (ADR-067) - #358

Merged
aloekun merged 1 commit into
masterfrom
fix/wp17-phase-b-findings-path
Aug 4, 2026
Merged

fix(pr-monitor): findings ファイルをワークスペース内へ移し fix agent から読めるようにする (ADR-067)#358
aloekun merged 1 commit into
masterfrom
fix/wp17-phase-b-findings-path

Conversation

@aloekun

@aloekun aloekun commented Aug 4, 2026

Copy link
Copy Markdown
Owner

問題

Phase B 実走スモーク段 2 の 3 回目 (2026-08-04) で Apply fixes が 1 ファイルも編集せず空 diff になり、4 軸ゲートが reason=empty-fix-diff で deny した。

原因は findings ファイルの置き場所である。fix agent の参照先が $RUNNER_TEMP/findings.json = /home/runner/work/_temp/findings.json で、agent の作業ディレクトリ (ワークスペース直下) の外にある。Claude Code は既定で作業ディレクトリ外のファイルアクセスを制限するため、--allowedTools に絶対パスを列挙してもディレクトリサンドボックスが別レイヤで遮る。

根拠は同一 run 内の対照であり、仮説ではない:

agent 読み取り先 permission_denials_count ターン数 結果
Collect findings findings-input/** (ワークスペース内) 0 3 成功・3 件検出
Apply fixes /home/runner/work/_temp/findings.json (外) 2 3 無編集

変更

  • Extract findings JSON の出力先を findings-input/findings.json へ移す (raw ファイルは agent が読まないので $RUNNER_TEMP のまま)
  • Apply fixes--allowedToolsRead(findings-input/findings.json) を与える
  • プロンプトに findings が作業ディレクトリ直下にあることを明記
  • Gate fix push--findings-file は step output 経由で同じ相対パスになる。run: の cwd が $GITHUB_WORKSPACE であるという前提を gate step のコメントに明記した

findings-input/ はワークスペースルート直下で pr/ にも master-ref/ にも含まれない素のディレクトリなので、git -C pr add -A には混入しない。ディレクトリの存在は step の if 連鎖 (Extract → findings → cr_input) が保証するため mkdir を重ねていない。

allowedTools を単一ファイルに絞る理由 (pre-push security review の指摘を反映)

ADR-067 § 残課題 1 の当初方針は Read(findings-input/**) だったが、これは誤りである。同ディレクトリには comments.json / reviews.json = 著者フィルタ済みだが未要約の raw な CodeRabbit テキストがあり、glob を与えると write 権限を持つ fix agent がそれを直接読める。

これは findings agent (read-only) と fix agent (write 可) を別プロセスに分けた ADR-054 の設計目的そのものを崩す。4 軸ゲートは path ベースの検査しか行わず (lib-docs-policy の拡張子判定と lib-scope-guard の allowlist 突き合わせ)、in-scope な docs ファイルへ何が書かれたかは検査しないため、injection が成立しても下流では捕まらない。よって単一ファイル指定に絞る。ADR-067 の方針記述は後続の docs バッチで訂正する。

検証

  • js-yaml で 13 step 構成が維持されていることを確認
  • $RUNNER_TEMP/findings.json の実参照が残っていないことを確認 (残る 1 件は根拠を書いたコメント文中の記述)
  • 実走検証は本ブランチ ref に対する workflow_dispatch で行う (ADR-067 § 残課題 2 に従いマージ前に確認する)。単一ファイル指定の Read(...) が fix agent に効くことはこの実走で初めて確認できる。万一効かなければ findings.json を専用ディレクトリへ分離し Read(<dir>/**) を与える (raw テキストを含まないので security の指摘とも両立する)

Push fix の先回り監査 (ADR-067 § 残課題 3)

一度も実走していない Push fix step を静的に監査した。コードを変える必要のある欠陥は見つからなかったため本 PR では変更していない。

  • git -C pr config user.name/email: リポジトリローカル config への書き込みで pr/.git が存在するため有効
  • add -A → commit のステージ維持: 間に挟まる Gate fix pushmaster-ref/ の exe を実行するだけで pr/ に触れないため index は維持される。commit 直前に add -A を再実行しないことで「gate が評価した内容そのものを commit する」保証を保つ
  • persist-credentials: false + token URL push: ref: <branch> 指定の checkout はローカルブランチを作るので HEAD:refs/heads/<branch> は fast-forward になる。ただし fetch-depth: 1 の shallow clone からの push は実走未検証で、ここが残る最大の不確実性

マージ方針

この PR はすぐにマージしない。 workflow_dispatch は ref を選べるため、本ブランチ ref に対して直接 dispatch し Push fix まで通ることを確認してから 1 回だけマージする (ADR-067 § 残課題 2)。段 2 の過去 3 サイクルは毎回マージしており、これは不要な手戻りだった。

🤖 Generated with Claude Code

Summary by CodeRabbit

  • 改善
    • 自動レビュー結果の保存場所を統一しました。
    • 後続の自動修正処理がレビュー結果を安定して読み取れるようになりました。
    • 判定処理で使用するファイルパスの扱いを明確化しました。

…067)

## 問題

Phase B 実走スモーク段 2 の 3 回目 (2026-08-04) で `Apply fixes` が 1 ファイルも編集せず
空 diff になり、4 軸ゲートが `reason=empty-fix-diff` で deny した。

原因は findings ファイルの置き場所である。fix agent の参照先が
`$RUNNER_TEMP/findings.json` = `/home/runner/work/_temp/findings.json` で、agent の作業
ディレクトリ (ワークスペース直下) の外にある。Claude Code は既定で作業ディレクトリ外の
ファイルアクセスを制限するため、`--allowedTools` に絶対パスを列挙してもディレクトリ
サンドボックスが別レイヤで遮る。

根拠は同一 run 内の対照であり、仮説ではない:

| agent | 読み取り先 | permission_denials_count | ターン数 | 結果 |
|---|---|---|---|---|
| Collect findings | `findings-input/**` (ワークスペース内) | 0 | 3 | 成功・3 件検出 |
| Apply fixes | `/home/runner/work/_temp/findings.json` (外) | 2 | 3 | 無編集 |

## 変更

- `Extract findings JSON` の出力先を `findings-input/findings.json` へ移す (raw ファイルは
  agent が読まないので `$RUNNER_TEMP` のまま)
- `Apply fixes` の `--allowedTools` へ `Read(findings-input/findings.json)` を与える
- プロンプトに findings が作業ディレクトリ直下にあることを明記
- `Gate fix push` の `--findings-file` は step output 経由で同じ相対パスになる。run: の cwd
  が $GITHUB_WORKSPACE であるという前提を gate step のコメントに明記した

`findings-input/` はワークスペースルート直下で `pr/` にも `master-ref/` にも含まれない素の
ディレクトリなので、`git -C pr add -A` には混入しない。ディレクトリの存在は step の if 連鎖
(Extract → findings → cr_input) が保証するため mkdir を重ねていない。

## allowedTools を単一ファイルに絞る理由 (pre-push security review の指摘を反映)

ADR-067 § 残課題 1 の当初方針は `Read(findings-input/**)` だったが、これは**誤り**である。
同ディレクトリには `comments.json` / `reviews.json` = 著者フィルタ済みだが未要約の raw な
CodeRabbit テキストがあり、glob を与えると write 権限を持つ fix agent がそれを直接読める。

これは findings agent (read-only) と fix agent (write 可) を別プロセスに分けた ADR-054 の
設計目的そのものを崩す。4 軸ゲートは path ベースの検査しか行わず (`lib-docs-policy` の
拡張子判定と `lib-scope-guard` の allowlist 突き合わせ)、in-scope な docs ファイルへ**何が
書かれたか**は検査しないため、injection が成立しても下流では捕まらない。よって単一ファイル
指定に絞る。ADR-067 の方針記述は docs バッチで訂正する。

## 検証

- js-yaml で 13 step 構成が維持されていることを確認
- `$RUNNER_TEMP/findings.json` の実参照が残っていないことを確認 (残る 1 件は根拠を書いた
  コメント文中の記述)
- 実走検証は本ブランチ ref に対する workflow_dispatch で行う (ADR-067 § 残課題 2 に従い
  マージ前に確認する)。単一ファイル指定の `Read(...)` が fix agent に効くことはこの実走で
  初めて確認できる。万一効かなければ findings.json を専用ディレクトリへ分離し
  `Read(<dir>/**)` を与える (raw テキストを含まないので security の指摘とも両立する)

## `Push fix` の先回り監査 (ADR-067 § 残課題 3)

一度も実走していない `Push fix` step を静的に監査した。コードを変える必要のある欠陥は
見つからなかったため本 PR では変更していない。

- `git -C pr config user.name/email`: リポジトリローカル config への書き込みで `pr/.git` が
  存在するため有効
- `add -A` → commit のステージ維持: 間に挟まる `Gate fix push` は `master-ref/` の exe を
  実行するだけで `pr/` に触れないため index は維持される。commit 直前に `add -A` を再実行
  しないことで「gate が評価した内容そのものを commit する」保証を保つ
- `persist-credentials: false` + token URL push: `ref: <branch>` 指定の checkout はローカル
  ブランチを作るので `HEAD:refs/heads/<branch>` は fast-forward になる。ただし
  `fetch-depth: 1` の shallow clone からの push は実走未検証で、ここが残る最大の不確実性

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 5c8b185c-8eca-4af2-ae6c-cce1b07dda10

📥 Commits

Reviewing files that changed from the base of the PR and between 5f61892 and b2e1748.

📒 Files selected for processing (1)
  • .github/workflows/pr-monitor.yml

📝 Walkthrough

Walkthrough

Findings JSONの保存先をfindings-input/findings.jsonへ変更しました。fix agentの入力案内と読み取り許可、および決定論ゲートの指定も同じワークスペース相対パスへ更新しました。

Changes

Findingsファイル連携

Layer / File(s) Summary
Findingsファイルの生成と後続処理
.github/workflows/pr-monitor.yml
Findings JSONをワークスペース内のfindings-input/findings.jsonへ保存します。fix agentの入力案内と--allowedToolsを同じパスへ更新します。決定論ゲートがワークスペース相対パスを使用することを明記します。

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 タイトルは、findingsファイルをワークスペース内へ移動し、fix agentから読み取れるようにする主要変更を明確に示しています。
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 fix/wp17-phase-b-findings-path

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 4, 2026

Copy link
Copy Markdown
Contributor

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

  • トリガー: issue_comment (created) / 実行 run
  • CI: pending (rust ubuntu-latest / rust windows-latest とも実行中、失敗なし)
  • レビュー状況: CodeRabbit はレビュー実行中 (処理中コメントのみ、指摘未着)。人間レビュー・インラインコメントとも 0 件
  • Verdict: approved (暫定 — 現時点で findings 0 件。CI・CodeRabbit レビューが未完了のため、後続トリガーでの再評価が前提)

Applicable Findings (Critical / High / Major)

該当なし (findings 未着)

Applicable Findings (Medium 以下)

該当なし

Filtered (not applicable)

該当なし

次のアクション

  • CodeRabbit のレビュー完了と rust (ubuntu-latest / windows-latest) CI の完了を待ち、指摘・CI 結果が出た時点で本 workflow の後続トリガーによる再分析に委ねる (本セッションでは待機・ポーリングは行わない)。
  • 変更内容 (.github/workflows/pr-monitor.yml, +21/-15, 1 ファイル): findings ファイルの配置を $RUNNER_TEMP/findings.json からワークスペース内 findings-input/findings.json に変更し、fix agent の --allowedTools 参照パスおよび決定論ゲートの --findings-file 参照パスも追随修正。ADR-067 (Phase B 無人 fix push の 4 軸ゲート) に沿った、fix agent がディレクトリサンドボックスの外にあるファイルを読めなかった問題への対処であり、意図的設計変更として妥当。
  • 人間側は特段のアクション不要。CI・レビューの結果が出揃った段階で改めて確認を推奨。

@aloekun
aloekun merged commit cc3839f into master Aug 4, 2026
5 checks passed
@aloekun
aloekun deleted the fix/wp17-phase-b-findings-path branch August 4, 2026 17:31
aloekun added a commit that referenced this pull request Aug 4, 2026
WP-17 (イベント駆動バックボーン完成) で唯一残っていた受け入れ基準 — 実走スモーク段 2
= Phase B allow 経路の完走 — が 2026-08-04 に充足したことを記帳し、#350#357 の
post-merge feedback 採否とセッション発案のハーネス改善 1 件を todo へ確定する。
コード変更は含まない。

## 段 2 の結果 (ADR-067 § 検証記録)

`workflow_dispatch` を 4 回実行し、4 回目で 13 step 完走に至った。

| 回 | 検出した欠陥 | 対処 |
|---|---|---|
| 1 | `gh api` は `--slurp` と `--jq` を併用できない | PR #356 |
| 2 | findings agent の出力がコードフェンスで囲まれ `jq` が失敗 | PR #357 |
| 3 | `Apply fixes` が findings ファイルを読めず空 diff | PR #358 |
| 4 | なし (完走) | — |

4 回目の実測: findings 3 件 / `Apply fixes` は `permission_denials_count=0`・`num_turns=6` /
`Gate fix push` が `[FIX_PUSH_ALLOW] autonomy=allowed branch=isolated content=docs-only
scope=in-scope(1 files)` / `Push fix` が `ee9557a..86f424c` を push / `Report degrade to
Phase A` は skip (= degrade しなかった証拠)。

無人 fix が書いた内容も実測検証し、仕込んだ不整合 3 点を過不足なく修正・範囲外の編集
ゼロ (1 ファイル / 3 insertions / 3 deletions) であることを確認した。

`AUTONOMY_ENABLED` を削除した状態での dispatch では fix job 自体が skip され、ADR-066 の
「欠損 → 安全状態」が実 Actions ランタイムで機能することも確認した。

## ADR-067 § 残課題 1 の方針を訂正

同節に書いていた修正方針「`allowedTools` を `Read(findings-input/**)` にする」は**誤り**
だった。同ディレクトリには未要約の raw な CodeRabbit テキスト (`comments.json` /
`reviews.json`) があり、glob を与えると write 権限を持つ fix agent がそれを直接読める。
findings agent と fix agent を分離した § 決定 2 / ADR-054 の設計目的が崩れる。実装時の
pre-push security review が REJECT で指摘し、単一ファイル指定に改めて land した (#358)。

**静的検査を通らないのはコードだけではない — ADR に書かれた修正方針そのものが誤って
いることがある**。この一般化を dev-conventions へ convention として追加した。

## 主な変更

- `docs/adr/adr-067-*.md`: 段 2 完走の検証記録、残課題 1〜4 を「段 2 で閉じた課題」へ移し
  方針訂正を明記、ruleset の実体 (`~ALL` 対象 / `claude/**` 除外 / admin bypass) を残課題へ、
  `coderabbitai[bot]` allowlist の follow-up 判断 (追加しない = WP-18 で再判断) を追記
- `docs/adr/adr-066-*.md`: bounded lifetime の実走観測 1 run 目を記録 (trigger (a)(c) 充足、
  (b) は variable 側のみ充足で config 側の実走観測は未実施)
- `docs/adr/adr-068-*.md`: Phase B 1 run 目で docs-only fix の事実性誤りが観測されなかった
  ことを記録 (追加機構の再検討条件は未充足のまま)
- `docs/harness-improvement-plan.md`: 引き継ぎ節を実施記録へ書き換え、WP-17 受け入れ基準の
  段 0〜2 を充足済みへ更新
- `docs/dev-conventions.md` + `CLAUDE.md`: convention「LLM を含む自動化経路は実走でしか
  検証できない」を追加
- `docs/todo20.md` (新規) + `docs/todo-summary2.md`: 順位 365-373 の 9 エントリを登録。
  内訳は post-merge feedback 採用 19 件を実装時の PR 粒度で 8 エントリへまとめたもの (365-372)
  と、Rust exe の自動再ビルド 2 層案 (373)。却下 5 件も理由付きで記録
- `docs/todo.md` / `docs/todo14.md` / `docs/todo3-11.md`: todo14.md が約 70KB に達したため
  新規追加先を todo20.md へ。preamble 数詞を 22 へ更新 (cli-docs-lint の検出に追従)

## 順位 373 の実測データ (Rust exe の自動再ビルド)

`.claude/*.exe` は gitignore された生成物で、`pnpm build:all` を明示実行しない限り古い
バイナリが使われ続ける。2026-08-04 時点で `cli-fix-push-gate` (3/3 ファイル)・
`cli-autonomy-gate` (1/1)・`hooks-session-start` (1/8) の 3 パッケージが古い状態だった。

| 操作 | 小パッケージ | 大パッケージ (30 ファイル) |
|---|---|---|
| `cargo build --release` (変更あり) | 4.3 秒 | 9.9 秒 |
| `cargo check` | 0.39 秒 | 0.70 秒 |

この差から、PostToolUse には `cargo check` を、Stop hook には `build --release` + deploy を
割り当てる 2 層構成を採る。PostToolUse で build しない理由 (編集ごとの 4〜10 秒、中間状態の
compile error がノイズになる、deploy が毎回走る) も todo エントリに記録した。

## 自動起動経路への懸念 (新規記録)

段 1 で `coderabbitai[bot]` の permission が `none` と実測され `pull_request_review` 経路が
恒久 deny になるため、Phase B の起動は `issue_comment` (walkthrough) 経路だけになる。この
経路は初回 1 回きりで、その時点では CodeRabbit の実レビューがまだ無いことが多い。「findings
がある状態で Phase B が自動起動する窓」が実質的に無い可能性がある。段 2 は
`workflow_dispatch` による手動起動だったため**自動起動経路は未検証**である。WP-18 着手時に
bot allowlist の要否と併せて実測する (ADR-067 § 検証記録に記録)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
aloekun added a commit that referenced this pull request Aug 5, 2026
WP-17 (イベント駆動バックボーン完成) で唯一残っていた受け入れ基準 — 実走スモーク段 2
= Phase B allow 経路の完走 — が 2026-08-04 に充足したことを記帳し、#350#357 の
post-merge feedback 採否とセッション発案のハーネス改善 1 件を todo へ確定する。
コード変更は含まない。

## 段 2 の結果 (ADR-067 § 検証記録)

`workflow_dispatch` を 4 回実行し、4 回目で 13 step 完走に至った。

| 回 | 検出した欠陥 | 対処 |
|---|---|---|
| 1 | `gh api` は `--slurp` と `--jq` を併用できない | PR #356 |
| 2 | findings agent の出力がコードフェンスで囲まれ `jq` が失敗 | PR #357 |
| 3 | `Apply fixes` が findings ファイルを読めず空 diff | PR #358 |
| 4 | なし (完走) | — |

4 回目の実測: findings 3 件 / `Apply fixes` は `permission_denials_count=0`・`num_turns=6` /
`Gate fix push` が `[FIX_PUSH_ALLOW] autonomy=allowed branch=isolated content=docs-only
scope=in-scope(1 files)` / `Push fix` が `ee9557a..86f424c` を push / `Report degrade to
Phase A` は skip (= degrade しなかった証拠)。

無人 fix が書いた内容も実測検証し、仕込んだ不整合 3 点を過不足なく修正・範囲外の編集
ゼロ (1 ファイル / 3 insertions / 3 deletions) であることを確認した。

`AUTONOMY_ENABLED` を削除した状態での dispatch では fix job 自体が skip され、ADR-066 の
「欠損 → 安全状態」が実 Actions ランタイムで機能することも確認した。

## ADR-067 § 残課題 1 の方針を訂正

同節に書いていた修正方針「`allowedTools` を `Read(findings-input/**)` にする」は**誤り**
だった。同ディレクトリには未要約の raw な CodeRabbit テキスト (`comments.json` /
`reviews.json`) があり、glob を与えると write 権限を持つ fix agent がそれを直接読める。
findings agent と fix agent を分離した § 決定 2 / ADR-054 の設計目的が崩れる。実装時の
pre-push security review が REJECT で指摘し、単一ファイル指定に改めて land した (#358)。

**静的検査を通らないのはコードだけではない — ADR に書かれた修正方針そのものが誤って
いることがある**。この一般化を dev-conventions へ convention として追加した。

## 主な変更

- `docs/adr/adr-067-*.md`: 段 2 完走の検証記録、残課題 1〜4 を「段 2 で閉じた課題」へ移し
  方針訂正を明記、ruleset の実体 (`~ALL` 対象 / `claude/**` 除外 / admin bypass) を残課題へ、
  `coderabbitai[bot]` allowlist の follow-up 判断 (追加しない = WP-18 で再判断) を追記
- `docs/adr/adr-066-*.md`: bounded lifetime の実走観測 1 run 目を記録 (trigger (a)(c) 充足、
  (b) は variable 側のみ充足で config 側の実走観測は未実施)
- `docs/adr/adr-068-*.md`: Phase B 1 run 目で docs-only fix の事実性誤りが観測されなかった
  ことを記録 (追加機構の再検討条件は未充足のまま)
- `docs/harness-improvement-plan.md`: 引き継ぎ節を実施記録へ書き換え、WP-17 受け入れ基準の
  段 0〜2 を充足済みへ更新
- `docs/dev-conventions.md` + `CLAUDE.md`: convention「LLM を含む自動化経路は実走でしか
  検証できない」を追加
- `docs/todo20.md` (新規) + `docs/todo-summary2.md`: 順位 365-373 の 9 エントリを登録。
  内訳は post-merge feedback 採用 19 件を実装時の PR 粒度で 8 エントリへまとめたもの (365-372)
  と、Rust exe の自動再ビルド 2 層案 (373)。却下 5 件も理由付きで記録
- `docs/todo.md` / `docs/todo14.md` / `docs/todo3-11.md`: todo14.md が約 70KB に達したため
  新規追加先を todo20.md へ。preamble 数詞を 22 へ更新 (cli-docs-lint の検出に追従)

## 順位 373 の実測データ (Rust exe の自動再ビルド)

`.claude/*.exe` は gitignore された生成物で、`pnpm build:all` を明示実行しない限り古い
バイナリが使われ続ける。2026-08-04 時点で `cli-fix-push-gate` (3/3 ファイル)・
`cli-autonomy-gate` (1/1)・`hooks-session-start` (1/8) の 3 パッケージが古い状態だった。

| 操作 | 小パッケージ | 大パッケージ (30 ファイル) |
|---|---|---|
| `cargo build --release` (変更あり) | 4.3 秒 | 9.9 秒 |
| `cargo check` | 0.39 秒 | 0.70 秒 |

この差から、PostToolUse には `cargo check` を、Stop hook には `build --release` + deploy を
割り当てる 2 層構成を採る。PostToolUse で build しない理由 (編集ごとの 4〜10 秒、中間状態の
compile error がノイズになる、deploy が毎回走る) も todo エントリに記録した。

## 自動起動経路への懸念 (新規記録)

段 1 で `coderabbitai[bot]` の permission が `none` と実測され `pull_request_review` 経路が
恒久 deny になるため、Phase B の起動は `issue_comment` (walkthrough) 経路だけになる。この
経路は初回 1 回きりで、その時点では CodeRabbit の実レビューがまだ無いことが多い。「findings
がある状態で Phase B が自動起動する窓」が実質的に無い可能性がある。段 2 は
`workflow_dispatch` による手動起動だったため**自動起動経路は未検証**である。WP-18 着手時に
bot allowlist の要否と併せて実測する (ADR-067 § 検証記録に記録)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
aloekun added a commit that referenced this pull request Aug 5, 2026
WP-17 (イベント駆動バックボーン完成) で唯一残っていた受け入れ基準 — 実走スモーク段 2
= Phase B allow 経路の完走 — が 2026-08-04 に充足したことを記帳し、#350#357 の
post-merge feedback 採否とセッション発案のハーネス改善 1 件を todo へ確定する。
コード変更は含まない。

## 段 2 の結果 (ADR-067 § 検証記録)

`workflow_dispatch` を 4 回実行し、4 回目で 13 step 完走に至った。

| 回 | 検出した欠陥 | 対処 |
|---|---|---|
| 1 | `gh api` は `--slurp` と `--jq` を併用できない | PR #356 |
| 2 | findings agent の出力がコードフェンスで囲まれ `jq` が失敗 | PR #357 |
| 3 | `Apply fixes` が findings ファイルを読めず空 diff | PR #358 |
| 4 | なし (完走) | — |

4 回目の実測: findings 3 件 / `Apply fixes` は `permission_denials_count=0`・`num_turns=6` /
`Gate fix push` が `[FIX_PUSH_ALLOW] autonomy=allowed branch=isolated content=docs-only
scope=in-scope(1 files)` / `Push fix` が `ee9557a..86f424c` を push / `Report degrade to
Phase A` は skip (= degrade しなかった証拠)。

無人 fix が書いた内容も実測検証し、仕込んだ不整合 3 点を過不足なく修正・範囲外の編集
ゼロ (1 ファイル / 3 insertions / 3 deletions) であることを確認した。

`AUTONOMY_ENABLED` を削除した状態での dispatch では fix job 自体が skip され、ADR-066 の
「欠損 → 安全状態」が実 Actions ランタイムで機能することも確認した。

## ADR-067 § 残課題 1 の方針を訂正

同節に書いていた修正方針「`allowedTools` を `Read(findings-input/**)` にする」は**誤り**
だった。同ディレクトリには未要約の raw な CodeRabbit テキスト (`comments.json` /
`reviews.json`) があり、glob を与えると write 権限を持つ fix agent がそれを直接読める。
findings agent と fix agent を分離した § 決定 2 / ADR-054 の設計目的が崩れる。実装時の
pre-push security review が REJECT で指摘し、単一ファイル指定に改めて land した (#358)。

**静的検査を通らないのはコードだけではない — ADR に書かれた修正方針そのものが誤って
いることがある**。この一般化を dev-conventions へ convention として追加した。

## 主な変更

- `docs/adr/adr-067-*.md`: 段 2 完走の検証記録、残課題 1〜4 を「段 2 で閉じた課題」へ移し
  方針訂正を明記、ruleset の実体 (`~ALL` 対象 / `claude/**` 除外 / admin bypass) を残課題へ、
  `coderabbitai[bot]` allowlist の follow-up 判断 (追加しない = WP-18 で再判断) を追記
- `docs/adr/adr-066-*.md`: bounded lifetime の実走観測 1 run 目を記録 (trigger (a)(c) 充足、
  (b) は variable 側のみ充足で config 側の実走観測は未実施)
- `docs/adr/adr-068-*.md`: Phase B 1 run 目で docs-only fix の事実性誤りが観測されなかった
  ことを記録 (追加機構の再検討条件は未充足のまま)
- `docs/harness-improvement-plan.md`: 引き継ぎ節を実施記録へ書き換え、WP-17 受け入れ基準の
  段 0〜2 を充足済みへ更新
- `docs/dev-conventions.md` + `CLAUDE.md`: convention「LLM を含む自動化経路は実走でしか
  検証できない」を追加
- `docs/todo20.md` (新規) + `docs/todo-summary2.md`: 順位 365-373 の 9 エントリを登録。
  内訳は post-merge feedback 採用 19 件を実装時の PR 粒度で 8 エントリへまとめたもの (365-372)
  と、Rust exe の自動再ビルド 2 層案 (373)。却下 5 件も理由付きで記録
- `docs/todo.md` / `docs/todo14.md` / `docs/todo3-11.md`: todo14.md が約 70KB に達したため
  新規追加先を todo20.md へ。preamble 数詞を 22 へ更新 (cli-docs-lint の検出に追従)

## 順位 373 の実測データ (Rust exe の自動再ビルド)

`.claude/*.exe` は gitignore された生成物で、`pnpm build:all` を明示実行しない限り古い
バイナリが使われ続ける。2026-08-04 時点で `cli-fix-push-gate` (3/3 ファイル)・
`cli-autonomy-gate` (1/1)・`hooks-session-start` (1/8) の 3 パッケージが古い状態だった。

| 操作 | 小パッケージ | 大パッケージ (30 ファイル) |
|---|---|---|
| `cargo build --release` (変更あり) | 4.3 秒 | 9.9 秒 |
| `cargo check` | 0.39 秒 | 0.70 秒 |

この差から、PostToolUse には `cargo check` を、Stop hook には `build --release` + deploy を
割り当てる 2 層構成を採る。PostToolUse で build しない理由 (編集ごとの 4〜10 秒、中間状態の
compile error がノイズになる、deploy が毎回走る) も todo エントリに記録した。

## 自動起動経路への懸念 (新規記録)

段 1 で `coderabbitai[bot]` の permission が `none` と実測され `pull_request_review` 経路が
恒久 deny になるため、Phase B の起動は `issue_comment` (walkthrough) 経路だけになる。この
経路は初回 1 回きりで、その時点では CodeRabbit の実レビューがまだ無いことが多い。「findings
がある状態で Phase B が自動起動する窓」が実質的に無い可能性がある。段 2 は
`workflow_dispatch` による手動起動だったため**自動起動経路は未検証**である。WP-18 着手時に
bot allowlist の要否と併せて実測する (ADR-067 § 検証記録に記録)。

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