Skip to content

feat: 順位 240 の無人実装 (nightly-todo) - #378

Closed
nightly-todo-aloekun[bot] wants to merge 1 commit into
masterfrom
claude/nightly-240
Closed

feat: 順位 240 の無人実装 (nightly-todo)#378
nightly-todo-aloekun[bot] wants to merge 1 commit into
masterfrom
claude/nightly-240

Conversation

@nightly-todo-aloekun

@nightly-todo-aloekun nightly-todo-aloekun Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

台帳 (docs/claude-code-web-tasks.md) の無人可タスク 順位 240
夜間ループ (nightly-todo workflow) が無人で実装した PR です。

  • 内容: 'takt.rs' の spawn/try_wait 'Err(_)' → 'Err(e)' + 'eprintln!'(原因握り潰し解消、'.failed' marker debug 改善)
  • 事前フィルタ: 夜間 workflow が ubuntu 上で cargo test --workspace +
    cargo clippy --workspace --all-targets -- -D warnings を回して green を確認済み
    (agent の自己申告ではなく workflow が回し直した結果)。これはコストフィルタで
    品質の保証ではありません — 単一 OS で --ignored も hooks smoke も含みません
  • 品質の保証: 本 PR に紐づく ci.yml (windows-latest + ubuntu-latest) のチェックを見てください
  • ゲート: 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 ワークフローの起動に失敗した際、エラーメッセージを表示するよう改善しました。
    • プロセス状態の確認に失敗した場合も、PR番号とエラー内容を出力します。
    • 状態確認に失敗したプロセスは、従来どおりタイムアウトとして終了処理を行います。

@aloekun

aloekun commented Aug 9, 2026

Copy link
Copy Markdown
Owner

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Aug 9, 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: 577f90d8-6b27-422d-b1c1-84c34f122251

📥 Commits

Reviewing files that changed from the base of the PR and between ef09f8a and f2a5a73.

📒 Files selected for processing (1)
  • src/cli-merge-pipeline/src/feedback/takt.rs

📝 Walkthrough

Walkthrough

taktワークフローは、プロセスのspawn失敗とtry_wait失敗でエラー内容を出力する。try_wait失敗時は従来どおりタイムアウト相当としてプロセス終了処理へ進む。

Changes

taktプロセスエラー報告

Layer / File(s) Summary
プロセス失敗処理
src/cli-merge-pipeline/src/feedback/takt.rs
spawn失敗時にエラー内容を出力してfalseを返す。try_wait失敗時もPR番号とエラー内容を出力し、タイムアウトと同じ終了処理へ進む。

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

Possibly related PRs

Suggested reviewers: aloekun

🚥 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 タイトルは無人実装タスクであることを示し、変更内容の一部に関連しますが、spawn と try_wait のエラーログ追加を明示していません。
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 docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/nightly-240

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

Copy link
Copy Markdown
Contributor

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

  • トリガー: issue_comment (created) / 実行 run
  • CI: rust (ubuntu-latest) pass / rust (windows-latest) pass / CodeRabbit review は進行中 (pending, @coderabbitai review コマンドを owner が投稿し再処理中)
  • レビュー状況: 人間レビューなし (reviewDecision 未設定)、CodeRabbit はレビュー未完了 (in-progress の note コメントのみ、findings 未投稿)
  • Verdict: user_decision (CI は通過しているが CodeRabbit レビューが未完了のため、次回チェックでの再確認が必要)

Applicable Findings (Critical / High / Major)

該当なし (レビュー指摘が現時点で存在しない)

Applicable Findings (Medium 以下)

(該当なし)

Filtered (not applicable)

(該当なし)

次のアクション

  • CodeRabbit レビューが完了して findings が投稿された後、次回の analyze run で再評価する (現時点では待機不要、この run では取得できる情報のみで分析済み)。
  • mergeStateStatus が BLOCKED (mergeable 自体は MERGEABLE) — レビュー承認が未付与のため。人間レビュアーによる approve 判断が必要。
  • diff は src/cli-merge-pipeline/src/feedback/takt.rs の1ファイルのみ、+12/-2 行。run_takt_workflow 内の spawn 失敗・try_wait 失敗時に Err(_) => return false / Err(_) => break None だった箇所へ eprintln! によるエラーログ出力を追加する変更で、ロジック自体の変更はなし。

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown

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


@github-actions[bot] src/cli-merge-pipeline/src/feedback/takt.rs を確認しました。

spawntry_wait の失敗時に、PR 番号とエラー原因を出力します。既存の失敗処理、子プロセスの終了処理、および返却値は維持されています。

確認した変更範囲では、指摘事項はありません。

You are interacting with an AI system.

@aloekun aloekun closed this Aug 9, 2026
@aloekun

aloekun commented Aug 9, 2026

Copy link
Copy Markdown
Owner

CodeRabbitの自動レビューがつかなかったため、クローズ

aloekun added a commit that referenced this pull request Aug 10, 2026
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 に攻撃者制御なし
aloekun added a commit that referenced this pull request Aug 10, 2026
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 に攻撃者制御なし
@aloekun
aloekun deleted the claude/nightly-240 branch August 15, 2026 11:40
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