feat: 順位 240 の無人実装 (nightly-todo) - #378
Conversation
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthrough
Changestaktプロセスエラー報告
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🤖 PR Monitor 分析 (GitHub Actions バックストップ)
Applicable Findings (Critical / High / Major)該当なし (レビュー指摘が現時点で存在しない) Applicable Findings (Medium 以下)(該当なし) Filtered (not applicable)(該当なし) 次のアクション
|
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
file="src/cli-merge-pipeline/src/feedback/takt.rs"
ast-grep outline "$file" --items all --view expanded
printf '\n--- run_takt_workflow ---\n'
rg -n -A120 -B15 'fn\s+run_takt_workflow\b' "$file"
printf '\n--- PR diff ---\n'
git diff --find-renames origin/HEAD...HEAD -- "$file" || git diff --find-renames HEAD^...HEAD -- "$file"Length of output: 5894
確認した変更範囲では、指摘事項はありません。 You are interacting with an AI system. |
|
CodeRabbitの自動レビューがつかなかったため、クローズ |
CodeRabbit は PR の author が bot なら自動レビューをスキップする (公式挙動 "Auto Review Skipped — Bot user detected")。夜間ループ (ADR-072) の PR は App token で作られるためこれに該当し、レビューが一度も付かない状態だった。 2026-08-10 に経路を全て実測し、人間 identity のコメント投稿が唯一の経路だと確定した: | 経路 | 結果 | |---|---| | bot 作成 PR の auto_review | skip (#379 が 10 時間超 無反応) | | bot が @coderabbitai review を投稿 | 無視 (#373 が 10 時間 無反応) | | 人間が @coderabbitai review を投稿 | 動く (#373 は 4 秒、#378 は 5 秒) | | CodeRabbit を reviewer に要求 | GitHub API が 422 (App は collaborator でない) | | PR を reopen | 無効 (状態遷移では skip が解除されない) | | 設定で bot を許可 | schema.v2.json に該当キーが存在しない | これは ADR-072 決定 15 の前提 (draft をやめれば auto_review に乗る) が誤りだった ことも意味する。ブロック要因は draft ではなく author が bot であることだった。 ## 設計 nightly-todo.yml の中には置かない。あの job は未信頼の agent が実装を書き cargo test がそれを実行する job で、決定 5 (Bash 非付与) / 決定 8 § 副次効果 (agent の GITHUB_TOKEN を read-only 化) が守っている面である。さらにスモークで 唯一未解決なのが「cargo サブプロセスへのトークン露出」であり、そこへ人間資格情報を 置くと未解決の露出リスクの対象が広がる。本 workflow は agent を動かさない。 PAT は fine-grained で Pull requests: write のみ (対象リポジトリ 1 つ、期限付き)。 決定 8 が PAT を却下した理由は push が ruleset backstop を bypass する点だったが、 この PAT は push もマージもできない (Contents: write が必要) ため懸念は成立しない。 pull_request_target は public リポジトリでは fork PR からも起動し secrets へ 到達できるため、(a) checkout しない (b) run: へ展開するのは PR 番号 (整数) だけ (c) fork PR を条件で除外する、の 3 点で攻撃面を閉じた。タイトル・本文・ブランチ名は 一切シェルに入れない (cli-stale-branch-scan で塞いだのと同じクラスの脆弱性)。 起動条件は 4 つの AND で fail-closed: author が Bot / fork でない / base が本リポジトリ / AUTONOMY_ENABLED が true。author は login 直書きではなく user.type == 'Bot' で 判定する (App 改名で黙って止まらないため)。kill-switch は ADR-066 の既存 1 拠点に 相乗りし、停止操作を増やしていない。 ## 投稿しただけで成功としない 決定 11 の失敗の本質は「投稿できたか」しか見ておらず、bot 投稿が無視されている事実に 10 時間気づけなかったことにある。本 workflow は投稿後に CodeRabbit の反応を確認し、 無ければ red で落とす。照会の一時失敗は「反応なし」と読み替えず、判定は deadline 到達時のみ行う (API blip で偽の red を出すと本当に反応しない夜と区別できなくなる)。 ## 検証 - YAML パース OK、checkout step 0 件 - run: 内への ${{ }} 直接展開なし (すべて env 経由) - env に攻撃者制御フィールドなし (title/body/head.ref/user.login のいずれも不使用) - markdownlint 0 error / cli-docs-lint OK - 実走検証はマージ後に dispatch で行う (本 PR には含まれない) --- CodeRabbit レビュー対応 (#380、3 件すべて修正) --- 1. kill-switch の config 面が抜けていた (Major) ADR-066 の kill-switch は Actions variable と autonomy-config.toml の 2 面 AND だが、 workflow 式ではリポジトリ内ファイルを読めないため variable 面しか見ておらず、 enabled = false にしても投稿できてしまった。既定ブランチの config を API で読む step を追加 (checkout はしない。PR ブランチ側ではなく既定ブランチから読むのは ADR-072 と 同じ信頼境界 — 自律 actor が自分の停止フラグを書き換える経路を作らない)。 「意図した停止」は green、「読めなかった」は red と分けた (決定 10 と同じ分類)。 2. 投稿が冪等でなかった (Major) opened は PR ごとに 1 回だが、run の手動 re-run や検証失敗後の再実行で二重投稿に なりうる。ADR-019 § 再トリガー抑止ガードのとおり同一 HEAD への再投稿はレート枠を 消費するだけで、無料枠運用では実害がある。既存要求があれば再投稿せず、その id を 起点に検証だけ行う。 3. 反応検証が不正確だった (Major) PR 上の CodeRabbit コメント総数を見ていたため、過去の skip 通知や別要求への反応が 1 件でもあれば成功と誤判定した。また既定 1 ページ (30 件) しか見ていなかった。 要求コメントの id を起点に、それより新しいコメントだけを --paginate で数える形へ。 ## レビュー提案どおりに書かず実測で確定させた点 指摘 3 は `--paginate --slurp` + `--jq` を提案していたが、**gh 2.95.0 では --slurp と --jq は併用できない** (実測でエラー)。提案のまま書いていれば実行時に壊れていた。 --paginate 単体は jq をページごとに適用して出力を連結するため、id をストリームで出し shell 側で畳む形に変えた。全ページを取りこぼさないことを実 PR (#378) で確認済み。 あわせて jq の test("@coderabbitai\s+review") はパースエラーになったため、正規表現を 使わない contains("@coderabbitai review") を採用した (失敗経路を減らす)。 ## 検証 - awk のセクション判定を実 config で確認 ([autonomy] 内の enabled だけを拾い、 他 section の同名キーとコメント行を拾わないことを合成データでも確認) - jq/--paginate の件数判定を実 PR (#378) で確認 (since=0 で 3 件、巨大値で 0 件) - YAML パース OK / checkout 0 件 / run: への直接展開なし / env に攻撃者制御なし
CodeRabbit は PR の author が bot なら自動レビューをスキップする (公式挙動 "Auto Review Skipped — Bot user detected")。夜間ループ (ADR-072) の PR は App token で作られるためこれに該当し、レビューが一度も付かない状態だった。 2026-08-10 に経路を全て実測し、人間 identity のコメント投稿が唯一の経路だと確定した: | 経路 | 結果 | |---|---| | bot 作成 PR の auto_review | skip (#379 が 10 時間超 無反応) | | bot が @coderabbitai review を投稿 | 無視 (#373 が 10 時間 無反応) | | 人間が @coderabbitai review を投稿 | 動く (#373 は 4 秒、#378 は 5 秒) | | CodeRabbit を reviewer に要求 | GitHub API が 422 (App は collaborator でない) | | PR を reopen | 無効 (状態遷移では skip が解除されない) | | 設定で bot を許可 | schema.v2.json に該当キーが存在しない | これは ADR-072 決定 15 の前提 (draft をやめれば auto_review に乗る) が誤りだった ことも意味する。ブロック要因は draft ではなく author が bot であることだった。 ## 設計 nightly-todo.yml の中には置かない。あの job は未信頼の agent が実装を書き cargo test がそれを実行する job で、決定 5 (Bash 非付与) / 決定 8 § 副次効果 (agent の GITHUB_TOKEN を read-only 化) が守っている面である。さらにスモークで 唯一未解決なのが「cargo サブプロセスへのトークン露出」であり、そこへ人間資格情報を 置くと未解決の露出リスクの対象が広がる。本 workflow は agent を動かさない。 PAT は fine-grained で Pull requests: write のみ (対象リポジトリ 1 つ、期限付き)。 決定 8 が PAT を却下した理由は push が ruleset backstop を bypass する点だったが、 この PAT は push もマージもできない (Contents: write が必要) ため懸念は成立しない。 pull_request_target は public リポジトリでは fork PR からも起動し secrets へ 到達できるため、(a) checkout しない (b) run: へ展開するのは PR 番号 (整数) だけ (c) fork PR を条件で除外する、の 3 点で攻撃面を閉じた。タイトル・本文・ブランチ名は 一切シェルに入れない (cli-stale-branch-scan で塞いだのと同じクラスの脆弱性)。 起動条件は 4 つの AND で fail-closed: author が Bot / fork でない / base が本リポジトリ / AUTONOMY_ENABLED が true。author は login 直書きではなく user.type == 'Bot' で 判定する (App 改名で黙って止まらないため)。kill-switch は ADR-066 の既存 1 拠点に 相乗りし、停止操作を増やしていない。 ## 投稿しただけで成功としない 決定 11 の失敗の本質は「投稿できたか」しか見ておらず、bot 投稿が無視されている事実に 10 時間気づけなかったことにある。本 workflow は投稿後に CodeRabbit の反応を確認し、 無ければ red で落とす。照会の一時失敗は「反応なし」と読み替えず、判定は deadline 到達時のみ行う (API blip で偽の red を出すと本当に反応しない夜と区別できなくなる)。 ## 検証 - YAML パース OK、checkout step 0 件 - run: 内への ${{ }} 直接展開なし (すべて env 経由) - env に攻撃者制御フィールドなし (title/body/head.ref/user.login のいずれも不使用) - markdownlint 0 error / cli-docs-lint OK - 実走検証はマージ後に dispatch で行う (本 PR には含まれない) --- CodeRabbit レビュー対応 (#380、3 件すべて修正) --- 1. kill-switch の config 面が抜けていた (Major) ADR-066 の kill-switch は Actions variable と autonomy-config.toml の 2 面 AND だが、 workflow 式ではリポジトリ内ファイルを読めないため variable 面しか見ておらず、 enabled = false にしても投稿できてしまった。既定ブランチの config を API で読む step を追加 (checkout はしない。PR ブランチ側ではなく既定ブランチから読むのは ADR-072 と 同じ信頼境界 — 自律 actor が自分の停止フラグを書き換える経路を作らない)。 「意図した停止」は green、「読めなかった」は red と分けた (決定 10 と同じ分類)。 2. 投稿が冪等でなかった (Major) opened は PR ごとに 1 回だが、run の手動 re-run や検証失敗後の再実行で二重投稿に なりうる。ADR-019 § 再トリガー抑止ガードのとおり同一 HEAD への再投稿はレート枠を 消費するだけで、無料枠運用では実害がある。既存要求があれば再投稿せず、その id を 起点に検証だけ行う。 3. 反応検証が不正確だった (Major) PR 上の CodeRabbit コメント総数を見ていたため、過去の skip 通知や別要求への反応が 1 件でもあれば成功と誤判定した。また既定 1 ページ (30 件) しか見ていなかった。 要求コメントの id を起点に、それより新しいコメントだけを --paginate で数える形へ。 ## レビュー提案どおりに書かず実測で確定させた点 指摘 3 は `--paginate --slurp` + `--jq` を提案していたが、**gh 2.95.0 では --slurp と --jq は併用できない** (実測でエラー)。提案のまま書いていれば実行時に壊れていた。 --paginate 単体は jq をページごとに適用して出力を連結するため、id をストリームで出し shell 側で畳む形に変えた。全ページを取りこぼさないことを実 PR (#378) で確認済み。 あわせて jq の test("@coderabbitai\s+review") はパースエラーになったため、正規表現を 使わない contains("@coderabbitai review") を採用した (失敗経路を減らす)。 ## 検証 - awk のセクション判定を実 config で確認 ([autonomy] 内の enabled だけを拾い、 他 section の同名キーとコメント行を拾わないことを合成データでも確認) - jq/--paginate の件数判定を実 PR (#378) で確認 (since=0 で 3 件、巨大値で 0 件) - YAML パース OK / checkout 0 件 / run: への直接展開なし / env に攻撃者制御なし
台帳 (docs/claude-code-web-tasks.md) の無人可タスク 順位 240 を
夜間ループ (nightly-todo workflow) が無人で実装した PR です。
'takt.rs' の spawn/try_wait 'Err(_)' → 'Err(e)' + 'eprintln!'(原因握り潰し解消、'.failed' marker debug 改善)cargo test --workspace+cargo clippy --workspace --all-targets -- -D warningsを回して green を確認済み(agent の自己申告ではなく workflow が回し直した結果)。これはコストフィルタで
品質の保証ではありません — 単一 OS で
--ignoredも hooks smoke も含みませんcli-autonomy-gate --operation autonomous-pr(kill-switch + 背圧) を通過マージ判断は人間が行います (ADR-052 の commitment 点)。CI が緑で内容が台帳の
意図に沿っていればマージしてください。ずれている場合はクローズを —
採用率は WP-18 の受け入れ基準の測定対象です。
run: https://github.com/aloekun/claude-code-hook-test/actions/runs/31322552557
Summary by CodeRabbit
taktワークフローの起動に失敗した際、エラーメッセージを表示するよう改善しました。