Skip to content

feat(nightly-todo): 夜間ループの停止点を通常 PR へ移し背圧の指標から draft 属性を外す - #376

Merged
aloekun merged 1 commit into
masterfrom
feat/nightly-normal-pr
Aug 9, 2026
Merged

aloekun merged 1 commit into
masterfrom
feat/nightly-normal-pr

Conversation

@aloekun

@aloekun aloekun commented Aug 9, 2026

Copy link
Copy Markdown
Owner

Summary

  • 夜間 todo 消化ループの停止点を draft PR から通常 PR へ変更 (gh pr create --draft 除去)。CodeRabbit の初回自動レビューが夜間 PR にも付くようになる
  • 背圧の計数から .isDraft を除去し、指標を「未マージの claude/ PR 数」へ再定義。この 2 点は分離できない — draft で数え続けると計数が常に 0 になり、deny ではなく allow へ倒れて背圧が無音で無効化される (ADR-052 原則 5 違反)
  • 背圧の語彙を autonomous 系へ統一 (Operation::AutonomousPr / --operation autonomous-pr / --open-autonomous-prs / max_open_autonomous_prs)。旧名は fail-closed 側に倒れることを unit test 2 本で固定
  • ADR-052 原則 2 の分類表を本体改訂 — ゲート必須クラスから「PR の ready 化」「非 draft PR の作成」を削除し、commitment 点をマージ 1 点へ集約
  • ADR-072 決定 11 を撤回として記録、決定 15 (停止点変更) を新設。§ 実走スモークの Phase B 判定訂正と集計の算術誤り修正を含む

Context

Why: 夜間 draft PR は .coderabbit.yamlauto_review.drafts: false と衝突し、レビューが一度も付かない状態だった。回避策として置いた ADR-072 決定 11 (App token で @coderabbitai review を投稿) は、bot 投稿が CodeRabbit に無視されるため不成立と 2026-08-09 に実測確定した。

Trigger: PR #373 での投稿者別対照実験 — 同一 PR・同一文言・同一設定で、nightly-todo-aloekun (App/bot) の投稿は約 10 時間無反応、aloekun (人間) の投稿は 4 秒後に応答し 11 秒後にレビュー開始。決定 11 自身が未検証事項に挙げていた仮説がそのまま実証された形。

判断 (2026-08-09 ユーザー): 発生トリガーがユーザー指示か自動採択かで扱いを区別しない。有効な修正 PR ならプロジェクトに取り入れてよいため、commitment 点はマージ 1 点へ集約してよい。

Scope decision: 1 PR にまとめた。--draft 除去と .isDraft 計数除去を分離すると、中間状態で背圧が完全に無効化される (ADR-052 原則 5 が禁じる状態、しかも allow へ倒れるため検知できない)。ADR-052/071/072 の改訂も同じ commitment の一部。todo 順位 394 は size gate 超過時の 2 分割を想定していたが、実際の diff は 681 行で閾値 (1500 行) 内に収まった。

あわせて修正: ADR-072 § 実走スモークが「Phase B は不成立」と記帳していたのは誤りで、起動契機のコメントが供給されていなかっただけ。#373issue_comment 経路は実際に発火し Phase A が自動起動した。同節の集計も「8 充足 / 1 不成立 / 未確定 2」= 合計 11 件で母数 10 と不整合、充足数も表と 1 件ずれていたため 7 充足 / 3 未確定 に訂正した。

Validation

  • cargo test --workspace: 1,969 pass / 0 fail (21 ignored、50 スイート)
  • cargo clippy --workspace --all-targets -- -D warnings: clean
  • pnpm lint / pnpm lint:md (127 files) / pnpm lint:docs: すべて 0 error
  • pnpm push quality gate: lint / test / build / rust-lint-test 全 PASS (63.7s、cargo test -- --ignored 含む)
  • pnpm push pre-push review: verdict=APPROVE (simplicity / security とも blocking finding なし、1 iteration / 2m17s)
  • exe drill (実バイナリ): --open-autonomous-prs 2 → allow (exit 0) / 3 / 4 → deny (exit 1) / 計数省略 → deny。閾値 >= 境界が改名後も機能することを実測
  • 旧名の fail-closed 実測: --operation draft-pr / --open-draft-prs はいずれも exit 2 (引数不正)、旧キー max_open_draft_prs のみの config は閾値未接続 (deny)。unit test 2 本で固定
  • workflow YAML パース + step 参照検査: 18 steps、dangling な steps.* 参照なし (request-review 撤去の取りこぼしなし)
  • 実走確認は post-merge: 次回の夜間 run で PR に CodeRabbit の初回自動レビューが付くこと。これが採用率 2 週間測定の開始起点になる (計画書 WP-18 / ADR-072 § 実走スモークが追跡)

References

Summary by CodeRabbit

  • 新機能

    • 夜間ループが draft PR ではなく、通常の PR を作成するようになりました。
    • 自律 PR の作成数を管理し、未マージ PR が上限に達すると新規作成を停止します。
    • 設定不備や状態取得失敗時は、安全のため自律 PR の作成を停止します。
    • 通常 PR には自動レビューが適用されます。
  • 変更

    • PR のマージ可否は自動化せず、人間が判断する運用になりました。

@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 40e0ee8d-454b-40ba-a359-64a0dcf2280c

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

夜間ループの停止点を draft PR 作成から通常 PR 作成へ変更しました。背圧対象、設定キー、CLI、判定処理を autonomous-pr 用に統一し、明示的な CodeRabbit レビュー依頼を削除しました。関連する ADR と運用記録も更新しました。

Changes

自律 PR 移行

Layer / File(s) Summary
背圧ポリシーと入力契約
src/lib-autonomy-policy/..., src/cli-autonomy-gate/..., src/cli-fix-push-gate/...
DraftPr と draft PR 用フィールドを AutonomousPr と自律 PR 用フィールドへ変更しました。新しい設定キーと CLI 引数を追加し、旧名を拒否する判定およびテストへ更新しました。
夜間ループの計数と PR 作成
.github/workflows/nightly-todo.yml, autonomy-config.toml
claude/ の未マージ PR 全体を計数し、autonomous-pr ゲートへ渡すよう変更しました。gh pr create の draft 指定、ready 化、明示的な CodeRabbit レビュー依頼を削除しました。
ADR と運用記録の整合
CLAUDE.md, docs/adr/*, docs/harness-improvement-plan.md, docs/todo21.md
通常 PR 作成、マージ時の人間判断、自律 PR の背圧、CodeRabbit の初回自動レビューに関する記録を更新しました。

Estimated code review effort: 3 (Moderate) | ~25 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 タイトルは、夜間ループの停止点を通常PRへ変更し、背圧指標からdraft属性を除外する主要変更を明確に要約しています。
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
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 feat/nightly-normal-pr

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: pending (CodeRabbit レビュー進行中、rust (ubuntu-latest) / rust (windows-latest) ともに pending。失敗 check なし)
  • レビュー状況: CodeRabbit はレビュー進行中の定型通知のみ (findings 未着)。人間レビューなし。インライン指摘なし。
  • Verdict: user_decision (CI・レビューとも未確定のため判定材料なし。CodeRabbit の実質的なレビュー到着とCI完了を待って再評価が必要)

Applicable Findings (Critical / High / Major)

(該当なし — レビュー指摘未着)

Applicable Findings (Medium 以下)

(該当なし)

Filtered (not applicable)

(該当なし)

次のアクション

  • CodeRabbit の実レビュー到着と CI (rust ubuntu-latest / windows-latest) の完了を待つ (本バックストップはポーリングしないため、次のイベントで再評価する)。
  • diff 概要: 16 ファイル変更 (+351/-320)。主に .github/workflows/nightly-todo.yml の停止点変更 (draft PR → 通常 PR)、関連 ADR (052/066/067/071/072) の追補、src/lib-autonomy-policy / src/cli-autonomy-gate / src/cli-fix-push-gate の実装反映、docs/todo21.md 等の台帳更新で構成されており、設計文書とコードの整合が取れているかは CI (Rust ビルド/テスト) の結果待ち。
  • mergeStateStatus: BLOCKED は CI 未完了・レビュー未確定によるものと見られ、追加対応は不要 (完了後に自然解消する見込み)。

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/nightly-todo.yml (1)

96-133: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

権威ゲートに最新の背圧値を渡してください。

.github/workflows/nightly-todo.yml の権威ゲートは、agent 実行・検証・guard 後の時点で初期 inflight output を使っています。この間に claude/ PR が作成されると実数が閾値へ達していても open >= limit にならないため、PR 作成が許可されます。権威ゲートの手前でPR数を再計数し、その値を --open-autonomous-prs に渡してください。複数の PR 作成者が並行する場合、同じ観測値を使い続けて複数 run が通過しない直列化または排他機構も追加してください。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/nightly-todo.yml around lines 96 - 133, Update the
workflow’s authoritative gate after agent execution, validation, and guard steps
to recount currently open `claude/` PRs immediately before passing
`--open-autonomous-prs`, rather than reusing the initial `inflight` output.
Preserve fail-closed handling when the listing reaches its limit. Also add
serialization or an equivalent lock around the final count-and-PR-creation
decision so concurrent runs cannot all proceed using the same observation.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/adr/adr-067-phase-b-unattended-fix-push.md`:
- Around line 145-146:
実走スモークの受け入れ状態を、夜間PRの初回自動レビュー確認だけを未完了対象とする現行方針へ統一してください。docs/adr/adr-067-phase-b-unattended-fix-push.md
の該当箇所では Phase B と bot allowlist
を歴史的観測または完了条件外として明示し、docs/harness-improvement-plan.md の156-157行では WP-17
の残課題を更新、163-165行では「7充足 /
3未確定」を現行対象と意図的保留に分離してください。docs/adr/adr-072-nightly-todo-loop.md
の435-445行では実走スモーク表と母数を、512-516行では Phase B と allowlist の扱いを同じ方針へ更新してください。

In `@docs/adr/adr-071-draft-pr-backpressure.md`:
- Around line 136-138: 修正対象は網羅走査の組合せ数記述です。実際のテスト列挙を確認し、repo
config・外部フラグ・背圧・操作の各因数と合計が一致するよう、`216 組合せ`
または誤っている因数を更新してください。文書内の算術結果とテスト実数を整合させてください。

In `@docs/adr/adr-072-nightly-todo-loop.md`:
- Line 68: The backpressure contract should use autonomous-pr and the count of
unmerged claude/ PRs, not draft PRs. In docs/adr/adr-072-nightly-todo-loop.md
lines 68-68, update the adjacent snapshot description to define
open_autonomous_prs accordingly; in docs/adr/adr-071-draft-pr-backpressure.md
lines 158-159, state that the nightly workflow caller is connected and retain
only verification that the operational threshold is reached if observations are
unavailable.

In `@src/cli-autonomy-gate/src/main.rs`:
- Around line 201-213: Extend the test coverage around parse_args in
non_numeric_open_autonomous_pr_counts_are_usage_errors, or add a focused test,
to pass --open-draft-prs 0 and assert that parsing returns an error. Keep this
assertion specifically validating rejection of the deprecated flag without
treating it as an alias for --open-autonomous-prs.

---

Outside diff comments:
In @.github/workflows/nightly-todo.yml:
- Around line 96-133: Update the workflow’s authoritative gate after agent
execution, validation, and guard steps to recount currently open `claude/` PRs
immediately before passing `--open-autonomous-prs`, rather than reusing the
initial `inflight` output. Preserve fail-closed handling when the listing
reaches its limit. Also add serialization or an equivalent lock around the final
count-and-PR-creation decision so concurrent runs cannot all proceed using the
same observation.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: f8d34ada-a145-4d81-ac22-64457b6b5fbc

📥 Commits

Reviewing files that changed from the base of the PR and between c415814 and cc8c84d.

📒 Files selected for processing (16)
  • .github/workflows/nightly-todo.yml
  • CLAUDE.md
  • autonomy-config.toml
  • docs/adr/adr-019-coderabbit-review-hybrid-policy.md
  • docs/adr/adr-052-autonomy-execution-boundary-classes.md
  • docs/adr/adr-066-autonomy-global-kill-switch.md
  • docs/adr/adr-067-phase-b-unattended-fix-push.md
  • docs/adr/adr-071-draft-pr-backpressure.md
  • docs/adr/adr-072-nightly-todo-loop.md
  • docs/harness-improvement-plan.md
  • docs/todo-summary2.md
  • docs/todo21.md
  • src/cli-autonomy-gate/src/main.rs
  • src/cli-fix-push-gate/src/main.rs
  • src/lib-autonomy-policy/src/decision.rs
  • src/lib-autonomy-policy/src/sources.rs
💤 Files with no reviewable changes (1)
  • docs/todo-summary2.md

Comment thread docs/adr/adr-067-phase-b-unattended-fix-push.md
Comment thread docs/adr/adr-071-draft-pr-backpressure.md Outdated
Comment thread docs/adr/adr-072-nightly-todo-loop.md
Comment thread src/cli-autonomy-gate/src/main.rs
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

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

  • トリガー: pull_request_review (submitted) / 実行 run
  • CI: rust (ubuntu-latest) fail (Run hooks smoke testsmalformed_stdin_does_not_blockOs { code: 26, ExecutableFileBusy } で panic — 本 PR の diff は hooks-pre-tool-validate を一切変更しておらず、並行ビルドによる CI infra flake の可能性が高い)。rust (windows-latest) pass。CodeRabbit check pass (レビュー投稿完了)。analyze (本 run) pending。
  • レビュー状況: CodeRabbit が COMMENTED レビューを1件提出 (submitted_at 2026-08-09T08:38:09Z)、actionable comments 4件 (posted) + outside-diff-range 1件 = 計5件。人間レビューはまだ無し。直前の本 workflow 分析コメント (08:35:42、issue_comment トリガー) は CI/レビュー未着時点のプレースホルダで、その後に新規レビューが到着したため再分析対象。
  • Verdict: needs_fix (Major の applicable finding が1件存在)

Applicable Findings (Critical / High / Major)

# File (Line) Reviewer Issue Recommended Action
1 .github/workflows/nightly-todo.yml (L96-133, outside diff) CodeRabbit (Major) 権威ゲート (Gate PR creation) が agent 実行・検証・guard 後も pre-flight 時点の inflight (open_autonomous_prs) を再利用しており、その間に claude/ PR が増えても検知できない (TOCTOU)。並行 run を直列化/排他する機構も無い 権威ゲート直前に claude/ 未マージ PR 数を再カウントし、その値を --open-autonomous-prs に渡す。複数 run 並走時の直列化/排他も検討

Applicable Findings (Medium 以下)

# File (Line) Reviewer Issue Recommended Action
2 src/cli-autonomy-gate/src/main.rs (L201-213) CodeRabbit (Minor) 旧 CLI フラグ --open-draft-prs が未知引数として拒否されることを直接検証するテストが無い non_numeric_open_autonomous_pr_counts_are_usage_errors 等に --open-draft-prs 0parse_args がエラーになるケースを追加

Filtered (not applicable)

# File (Line) Issue Filter Reason
3 docs/adr/adr-067-phase-b-unattended-fix-push.md (L145-146) 実走スモークの受け入れ状態表記を複数 ADR 間で統一 Scope mismatch: docs/adr/ は fitness filter の read-only zone
4 docs/adr/adr-071-draft-pr-backpressure.md (L136-138) 網羅走査の組合せ数算術不一致 (216 vs 3×15×4×2=360) Scope mismatch: docs/adr/ は read-only zone
5 docs/adr/adr-072-nightly-todo-loop.md (L68、関連 adr-071 L158-159) 背圧契約記述から draft 前提を除去 Scope mismatch: docs/adr/ は read-only zone

次のアクション

夜間 draft PR は .coderabbit.yaml の auto_review.drafts: false と衝突し、レビューが
一度も付かない状態だった。回避策として置いた ADR-072 決定 11 (App token で
@coderabbitai review を投稿) は、bot 投稿が CodeRabbit に無視されるため不成立と
2026-08-09 に実測確定した (#373 の投稿者別対照: bot は 10 時間無反応 / 人間は 4 秒)。

構造側を是正し、停止点を draft PR から通常 PR へ移す。commitment 点はマージ 1 点に
集約する (ユーザー判断: トリガーがユーザー指示か自動採択かで扱いを区別しない)。

背圧の計数から .isDraft を外すことは本変更と分離できない。draft で数え続けると計数が
常に 0 になり、deny ではなく allow へ倒れて背圧が無音で無効化される (ADR-052 原則 5
違反)。指標を「未マージの claude/ PR 数」へ改め、命名も autonomous 系へ揃えた。

- workflow: --draft 除去 / .isDraft 計数除去 / 決定 11 step 撤去 / Report outcome 整理
- Rust: Operation::AutonomousPr / --operation autonomous-pr / --open-autonomous-prs /
  requires_autonomous_pr_backpressure() / open_autonomous_prs
- config: max_open_autonomous_prs (値 3 は据え置き)
- ADR-052: 原則 2 分類表の本体改訂 (ゲート必須から「ready 化」「非 draft PR 作成」を削除)
- ADR-071: 指標の再定義 (ファイル名と ADR 番号は歴史的識別子なので不変)
- ADR-072: 決定 11 を撤回として記録 / 決定 15 を新設 / 実走スモークの Phase B 判定を訂正
- ADR-019 / ADR-066 / ADR-067 / CLAUDE.md / 計画書 / todo を同期

旧名は黙って通さない。--operation draft-pr と --open-draft-prs は exit 2、旧キー
max_open_draft_prs のみの config は閾値未接続 (deny) になることを unit test 2 本と
exe drill で固定した。閾値 deny も実測 (open=2 allow / 3・4 deny / 計数省略 deny)。

実走スモークの集計誤りも訂正した (合計 11 件で母数 10 と不整合、充足数も表と 1 件ずれ)。
表が正で 7 充足 / 3 未確定。

todo 順位 393 / 394 完了。残るは実走確認 (夜間 PR に CodeRabbit の初回自動レビューが
付くこと) のみで、計画書 WP-18 と ADR-072 § 実走スモークが追跡する。

--- CodeRabbit レビュー対応 (#376) ---

- ADR-072 決定 4 / 残課題と ADR-071 残課題に残っていた draft 用語を修正。背圧の
  スナップショット説明を open_autonomous_prs の意味へ、ADR-071 の「呼び手が 1 つも
  無い」は WP-18 PR 3 で接続済みとして更新
- 計画書の自己矛盾を解消。サマリの「7 充足 / 3 未確定」と表の「スモーク残 1 項目」が
  食い違っていたため、未確定 3 件を (a) Phase B 到達 / (b) allowlist / (c) トークン露出
  として表へ分解し、完走条件に含める / 含めないを明示
- ADR-071 の網羅走査の組合せ数を訂正。216 (3 × 15 × 4 × 2) は積も因数も誤りで、
  外部フラグは None + TRUTHY 7 + NOT_TRUTHY 8 = 16 通り、総数は 384
- CLI 層の旧フラグ拒否テストを追加 (--open-draft-prs を未知引数として弾く)。
  判定コア側は固定済みだったが引数層だけ素通りする形が最も危うい

authority gate の直前で背圧を再計数する指摘は入れない。ADR-072 決定 4 と § 残課題が
「閾値を 1 件超えて push されうる」「実運用で観測されたら入れる」と既に記録している
意図的なトレードオフで、本 PR が作った問題ではない。同一 workflow の並行 run は
concurrency: group で直列化済み。却下理由を ADR 側へ明記した。

CI の ubuntu 失敗は本変更と無関係な flake (hooks-pre-tool-validate の smoke suite が
並列実行時に ETXTBSY)。同一コミットの再実行で両 OS success を確認し、根本修正は
順位 396 として登録した。
@aloekun
aloekun force-pushed the feat/nightly-normal-pr branch from cc8c84d to 30288f5 Compare August 9, 2026 09:00
@aloekun

aloekun commented Aug 9, 2026

Copy link
Copy Markdown
Owner Author

CodeRabbit レビュー対応 (5 件)

実物と突き合わせて検証しました。4 件は妥当なので修正1 件は既知の設計判断のため却下します。

修正した 4 件

# 指摘 対応
1 現行の背圧契約から draft 前提を除去 (🟠 Major) 修正。ADR-072 決定 4 のスナップショット説明を open_autonomous_prs の意味へ、§ 残課題の「draft 数を再計数するか」を「自律 PR 数」へ。ADR-071 § 残課題の「呼び手が 1 つも無いため常に deny」は WP-18 PR 3 で接続済みのため現状へ更新
2 実走スモークの残課題を一つの受け入れ状態へ統一 (🟠 Major) 修正。計画書がサマリ「7 充足 / 3 未確定」と表「スモーク残 1 項目」で自己矛盾していたため、未確定 3 件を (a) Phase B 本体の到達 / (b) coderabbitai[bot] allowlist / (c) トークン露出 に分解して表へ載せ、完走条件に含める・含めないを明示
3 組合せ数の算術を修正 (🟡 Minor) 修正、かつ指摘より深い誤りでした。216 と因数 3 × 15 × 4 × 2 (= 360) の両方が誤り。外部フラグは None + TRUTHY 7 + NOT_TRUTHY 8 = 16 通りで、未設定の 1 通りを数え落としていました。正しくは 3 × 16 × 4 × 2 = 384
4 旧 CLI フラグの拒否をテストで固定 (🟡 Minor) 修正the_pre_rename_cli_flag_is_rejected_as_unknown を追加。判定コア側 (Operation::parse / 旧 config キー) は固定済みでしたが、引数層だけ素通りする形が最も危ういため塞ぎました

却下する 1 件

「権威ゲートに最新の背圧値を渡してください」(🟠 Major、diff 範囲外)

観測自体は正しいのですが、本 PR が作った問題ではなく、ADR-072 に記録済みの意図的なトレードオフです。

  • docs/adr/adr-072-nightly-todo-loop.md 決定 4 が「実装 step は最大 60 ターン走るため…閾値を 1 件超えた状態で push が通りうる」と明記
  • 同 § 残課題が「実運用で観測されたら入れる」と条件付きで保留

併記された「複数 run が同じ観測値で通過しない直列化」は、nightly-todo.yml が既に concurrency: group: nightly-todo / cancel-in-progress: false を持っており対処済みです。超過は最大 1 件で、背圧は「積み過ぎを止める」ためのものであって厳密な上限ではありません。

ただしこの保留が意図であると読み取れるようにするのは妥当なので、ADR-072 § 残課題へ却下理由 (超過は最大 1 件 / 並行 run は directive で直列化済み / 増分の出所は別経路に限られる) を明記し、ADR-071 § 残課題にも同じトレードオフを相互参照として追記しました。

CI の ubuntu 失敗について

本変更とは無関係な Linux 固有の flake です。hooks-pre-tool-validate は 1 ファイルも触っていません。

test malformed_stdin_does_not_block ... FAILED
spawn hooks-pre-tool-validate: Os { code: 26, kind: ExecutableFileBusy, message: "Text file busy" }

smoke suite の 2 テストが並列実行され、片方の fs::copy が書き込み用 fd を開いている最中にもう片方の Command::spawn() が fork すると、子がその fd を継承するため copy 側の exec が ETXTBSY で落ちます。同一コミットで job を再実行したところ両 OS とも success となり flake を確認しました。根本修正は docs/todo21.md 順位 396 として登録しています。

検証

  • cargo test --workspace: pass (引数解析は 7 → 8 件)
  • cargo clippy --workspace --all-targets -- -D warnings: clean
  • pnpm lint:md (127 files) / pnpm lint:docs: 0 error
  • pnpm push pre-push review: verdict=APPROVE (simplicity / security とも)

@aloekun
aloekun merged commit 499befc into master Aug 9, 2026
3 checks passed
@aloekun
aloekun deleted the feat/nightly-normal-pr branch August 9, 2026 10:20
aloekun added a commit that referenced this pull request Aug 10, 2026
あわせて post-merge feedback (#376/#377/#380/#381/#382) の採用分 10 件を順位 402-411 へ
登録した。2026-08-10 に採用候補を系統別へ分類し、ユーザーが採否を決定したもの。

採用: 系統 A (観測の完全性) 3 件 / 系統 B (重複実装の予防) 3 件 /
      系統 C (shell・config パースの安全性) 3 件
却下: 系統 D (workflow セキュリティ標準化) / 系統 E (PAT 失効監視) — 様子見
形を変えて採用: 系統 F — 「CLAUDE.md に rustfmt 非適用の方針を書く」ではなく
      「cargo fmt を PreToolUse でブロックする」(順位 411)

系統 F の変更理由 (ユーザー判断): 規約は CLAUDE.md に書いた時点で毎セッション読まれ
コンテキストを圧迫するが、PreToolUse hook は発火するまでコストがゼロで、ブロックと
同時に正しいコマンドをフィードバックできる。読み手は規約を覚えていなくても正しい経路へ
到達する。ADR-042 の mechanizable 判定を満たすため機構側が正しい。

**この非対称は現行 ADR-042 に無い**。同 ADR の判断基準は「機械判定できるか」「投資対効果」
が中心で、「規約は常時コンテキストを消費し hook は発火時のみ」という観点が明示されて
いない。ルール追加を検討するたびに効く一般則なので、順位 411 の作業範囲に ADR-042 への
追記を含めた。
aloekun added a commit that referenced this pull request Aug 10, 2026
あわせて post-merge feedback (#376/#377/#380/#381/#382) の採用分 10 件を順位 402-411 へ
登録した。2026-08-10 に採用候補を系統別へ分類し、ユーザーが採否を決定したもの。

採用: 系統 A (観測の完全性) 3 件 / 系統 B (重複実装の予防) 3 件 /
      系統 C (shell・config パースの安全性) 3 件
却下: 系統 D (workflow セキュリティ標準化) / 系統 E (PAT 失効監視) — 様子見
形を変えて採用: 系統 F — 「CLAUDE.md に rustfmt 非適用の方針を書く」ではなく
      「cargo fmt を PreToolUse でブロックする」(順位 411)

系統 F の変更理由 (ユーザー判断): 規約は CLAUDE.md に書いた時点で毎セッション読まれ
コンテキストを圧迫するが、PreToolUse hook は発火するまでコストがゼロで、ブロックと
同時に正しいコマンドをフィードバックできる。読み手は規約を覚えていなくても正しい経路へ
到達する。ADR-042 の mechanizable 判定を満たすため機構側が正しい。

**この非対称は現行 ADR-042 に無い**。同 ADR の判断基準は「機械判定できるか」「投資対効果」
が中心で、「規約は常時コンテキストを消費し hook は発火時のみ」という観点が明示されて
いない。ルール追加を検討するたびに効く一般則なので、順位 411 の作業範囲に ADR-042 への
追記を含めた。

## 計画書 (harness-improvement-plan.md) の WP-18 節を再編成

**WP-18 で生んだ問題と、WP-18 の運用で日常的に踏む問題を WP-18 の外へ押し出さない**
(2026-08-10 ユーザー方針) ため、残作業を 3 区分へ分けて完了条件を明示した。

従来は観測と派生タスクが 1 表に混在し、WP-18 の完了に何が要るのかが読み取れなかった。

- (1) 観測待ち — 機構は整備済みで事象か期限を待つもの
- (2) 運用問題の対処 — WP-18 が生んだ (基準 1) / WP-18 の運用で踏む潜在バグ (基準 2)。
      順位 397 / 398-400 / 401 / 410。**完了条件に含める**
- (3) WP-18 外の派生 — 順位 396 / 411 / 402-409 等。完了条件に含めない

(3) を完了条件から外すのは、§ 7 の退役条件が「全 WP が完了または見送り」である以上、
リポジトリ全体の一般則を WP-18 に紐づけると計画書が永久に退役できなくなるため。
ただし**優先度が低いという意味ではない** — 順位 396 (flaky テスト) と 411 (cargo fmt
ブロック) はいずれも高優先度で、WP-18 とは独立に早期着手する旨を明記した。

あわせて古い記述を実測に合わせた:

- 見出しの「実装・スモークは 2026-08-08 までにほぼ完了」→ 決定 16 という新規実装が
  2026-08-10 に入ったため「観測中 + 運用問題の対処中」へ
- 「前 2 者は順位 394 後の run で判定できる」→ 順位 394 は完了済みで実際の前提は決定 16。
  同一ファイル内の自己矛盾だった
- WP-17 残課題節にも同じ「順位 394 後の run」が残っていたため同期。あわせて
  「代替解は draft 廃止」が誤りだったことも記録した

## todo 側

- 順位 396 を Tier 2 → **Tier 1** へ格上げ (ユーザー判断)。単発の Severity では Tier 2
  相当だが、flaky テストは「また flake だろう」という読み替えを生み実バグの見落とし
  経路になるため。両 OS matrix (ADR-065) の信号品質を守る意味で早期に潰す
- 順位 411 に早期着手の根拠を追記 (cargo fmt は反射的に実行されやすい)
- **却下を negative result として記録**: 系統 D / E は様子見。trunk 保護の drift 対処
  2 件は却下 (予防側は順位 405 で押さえた / 共有 lib 化は network isolation 設計と
  抵触しうる)。**再採用条件は「同型の drift が今後も再発する場合」**と明記した
aloekun added a commit that referenced this pull request Aug 10, 2026
あわせて post-merge feedback (#376/#377/#380/#381/#382) の採用分 10 件を順位 402-411 へ
登録した。2026-08-10 に採用候補を系統別へ分類し、ユーザーが採否を決定したもの。

採用: 系統 A (観測の完全性) 3 件 / 系統 B (重複実装の予防) 3 件 /
      系統 C (shell・config パースの安全性) 3 件
却下: 系統 D (workflow セキュリティ標準化) / 系統 E (PAT 失効監視) — 様子見
形を変えて採用: 系統 F — 「CLAUDE.md に rustfmt 非適用の方針を書く」ではなく
      「cargo fmt を PreToolUse でブロックする」(順位 411)

系統 F の変更理由 (ユーザー判断): 規約は CLAUDE.md に書いた時点で毎セッション読まれ
コンテキストを圧迫するが、PreToolUse hook は発火するまでコストがゼロで、ブロックと
同時に正しいコマンドをフィードバックできる。読み手は規約を覚えていなくても正しい経路へ
到達する。ADR-042 の mechanizable 判定を満たすため機構側が正しい。

**この非対称は現行 ADR-042 に無い**。同 ADR の判断基準は「機械判定できるか」「投資対効果」
が中心で、「規約は常時コンテキストを消費し hook は発火時のみ」という観点が明示されて
いない。ルール追加を検討するたびに効く一般則なので、順位 411 の作業範囲に ADR-042 への
追記を含めた。

## 計画書 (harness-improvement-plan.md) の WP-18 節を再編成

**WP-18 で生んだ問題と、WP-18 の運用で日常的に踏む問題を WP-18 の外へ押し出さない**
(2026-08-10 ユーザー方針) ため、残作業を 3 区分へ分けて完了条件を明示した。

従来は観測と派生タスクが 1 表に混在し、WP-18 の完了に何が要るのかが読み取れなかった。

- (1) 観測待ち — 機構は整備済みで事象か期限を待つもの
- (2) 運用問題の対処 — WP-18 が生んだ (基準 1) / WP-18 の運用で踏む潜在バグ (基準 2)。
      順位 397 / 398-400 / 401 / 410。**完了条件に含める**
- (3) WP-18 外の派生 — 順位 396 / 411 / 402-409 等。完了条件に含めない

(3) を完了条件から外すのは、§ 7 の退役条件が「全 WP が完了または見送り」である以上、
リポジトリ全体の一般則を WP-18 に紐づけると計画書が永久に退役できなくなるため。
ただし**優先度が低いという意味ではない** — 順位 396 (flaky テスト) と 411 (cargo fmt
ブロック) はいずれも高優先度で、WP-18 とは独立に早期着手する旨を明記した。

あわせて古い記述を実測に合わせた:

- 見出しの「実装・スモークは 2026-08-08 までにほぼ完了」→ 決定 16 という新規実装が
  2026-08-10 に入ったため「観測中 + 運用問題の対処中」へ
- 「前 2 者は順位 394 後の run で判定できる」→ 順位 394 は完了済みで実際の前提は決定 16。
  同一ファイル内の自己矛盾だった
- WP-17 残課題節にも同じ「順位 394 後の run」が残っていたため同期。あわせて
  「代替解は draft 廃止」が誤りだったことも記録した

## todo 側

- 順位 396 を Tier 2 → **Tier 1** へ格上げ (ユーザー判断)。単発の Severity では Tier 2
  相当だが、flaky テストは「また flake だろう」という読み替えを生み実バグの見落とし
  経路になるため。両 OS matrix (ADR-065) の信号品質を守る意味で早期に潰す
- 順位 411 に早期着手の根拠を追記 (cargo fmt は反射的に実行されやすい)
- **却下を negative result として記録**: 系統 D / E は様子見。trunk 保護の drift 対処
  2 件は却下 (予防側は順位 405 で押さえた / 共有 lib 化は network isolation 設計と
  抵触しうる)。**再採用条件は「同型の drift が今後も再発する場合」**と明記した

--- CodeRabbit レビュー対応 (#384、5 件すべて修正) ---

1. WP-18 完了条件でスモーク未確定の扱いが不明確 (Major)
   (c) だけを非必須と書き (a)(b) の扱いが無かった。(a)(b) は事象待ちで**自力で発生させ
   られない**ため、条件に含めると WP を閉じられない。3 件すべてを非ブロッカーとし、
   理由と移管先・期限を表で明記した。(a)(b) は 2026-11-06 時点で未観測なら
   「機会が来なかった」として見送り ADR-067 の bounded lifetime へ委ねる。

2. 順位 411 の要約が詳細計画と不一致 (Minor)
   summary は「正しいコマンドを提示」だが、cargo fmt に**代替コマンドは存在しない**
   (手で直すのが正)。「正しい対処を提示」へ変更し、詳細側にもその旨を明記した。

3. 順位 398 の完了判定を対象 PR に束縛すべき (Major)
   「report 生成を完了根拠にする」案が不十分だった。copy_feedback_report は
   find_latest_run_dir で最新 run を選ぶだけで **pr_number と照合していない**ため、
   別 PR の report を現在の PR の {pr_number}.md へコピーし得る。また takt の終了は
   timeout や失敗でも起こるので終了した事実は report 完成を証明しない。実装を読んで
   裏付けたうえで、完了判定には「成功終了」と「対象 PR のものであること」の両方が
   要る旨を追記した。本セッションで実際に context.json が別 PR を指していた事象とも
   同型である。

4. 旧語彙 lint の extensions から yaml が漏れている (Minor)
   拡張子は eq_ignore_ascii_case の文字列一致で **yml と yaml は別物**。本リポジトリは
   .github/workflows/*.yml と .coderabbit.yaml の両方を持つため、yaml を落とすと
   後者が未検査になる。両方を対象に加え、理由も併記した。

5. cargo fmt の検出対象が未定義 (Major)
   完全一致だけでは cargo fmt --all / cargo +stable fmt / rustup run stable cargo fmt /
   cargo-fmt が素通りする。作業計画の先頭に「検出範囲を先に決める」を追加し、完了基準に
   「完全一致に限定する場合は素通りする形態を明記する」ことを求める形にした。

いずれも実物 (takt.rs の実装 / linter の拡張子判定 / リポジトリ内の .yml と .yaml の
共存) を確認したうえで妥当と判断している。
aloekun added a commit that referenced this pull request Aug 10, 2026
あわせて post-merge feedback (#376/#377/#380/#381/#382) の採用分 10 件を順位 402-411 へ
登録した。2026-08-10 に採用候補を系統別へ分類し、ユーザーが採否を決定したもの。

採用: 系統 A (観測の完全性) 3 件 / 系統 B (重複実装の予防) 3 件 /
      系統 C (shell・config パースの安全性) 3 件
却下: 系統 D (workflow セキュリティ標準化) / 系統 E (PAT 失効監視) — 様子見
形を変えて採用: 系統 F — 「CLAUDE.md に rustfmt 非適用の方針を書く」ではなく
      「cargo fmt を PreToolUse でブロックする」(順位 411)

系統 F の変更理由 (ユーザー判断): 規約は CLAUDE.md に書いた時点で毎セッション読まれ
コンテキストを圧迫するが、PreToolUse hook は発火するまでコストがゼロで、ブロックと
同時に正しいコマンドをフィードバックできる。読み手は規約を覚えていなくても正しい経路へ
到達する。ADR-042 の mechanizable 判定を満たすため機構側が正しい。

**この非対称は現行 ADR-042 に無い**。同 ADR の判断基準は「機械判定できるか」「投資対効果」
が中心で、「規約は常時コンテキストを消費し hook は発火時のみ」という観点が明示されて
いない。ルール追加を検討するたびに効く一般則なので、順位 411 の作業範囲に ADR-042 への
追記を含めた。

## 計画書 (harness-improvement-plan.md) の WP-18 節を再編成

**WP-18 で生んだ問題と、WP-18 の運用で日常的に踏む問題を WP-18 の外へ押し出さない**
(2026-08-10 ユーザー方針) ため、残作業を 3 区分へ分けて完了条件を明示した。

従来は観測と派生タスクが 1 表に混在し、WP-18 の完了に何が要るのかが読み取れなかった。

- (1) 観測待ち — 機構は整備済みで事象か期限を待つもの
- (2) 運用問題の対処 — WP-18 が生んだ (基準 1) / WP-18 の運用で踏む潜在バグ (基準 2)。
      順位 397 / 398-400 / 401 / 410。**完了条件に含める**
- (3) WP-18 外の派生 — 順位 396 / 411 / 402-409 等。完了条件に含めない

(3) を完了条件から外すのは、§ 7 の退役条件が「全 WP が完了または見送り」である以上、
リポジトリ全体の一般則を WP-18 に紐づけると計画書が永久に退役できなくなるため。
ただし**優先度が低いという意味ではない** — 順位 396 (flaky テスト) と 411 (cargo fmt
ブロック) はいずれも高優先度で、WP-18 とは独立に早期着手する旨を明記した。

あわせて古い記述を実測に合わせた:

- 見出しの「実装・スモークは 2026-08-08 までにほぼ完了」→ 決定 16 という新規実装が
  2026-08-10 に入ったため「観測中 + 運用問題の対処中」へ
- 「前 2 者は順位 394 後の run で判定できる」→ 順位 394 は完了済みで実際の前提は決定 16。
  同一ファイル内の自己矛盾だった
- WP-17 残課題節にも同じ「順位 394 後の run」が残っていたため同期。あわせて
  「代替解は draft 廃止」が誤りだったことも記録した

## todo 側

- 順位 396 を Tier 2 → **Tier 1** へ格上げ (ユーザー判断)。単発の Severity では Tier 2
  相当だが、flaky テストは「また flake だろう」という読み替えを生み実バグの見落とし
  経路になるため。両 OS matrix (ADR-065) の信号品質を守る意味で早期に潰す
- 順位 411 に早期着手の根拠を追記 (cargo fmt は反射的に実行されやすい)
- **却下を negative result として記録**: 系統 D / E は様子見。trunk 保護の drift 対処
  2 件は却下 (予防側は順位 405 で押さえた / 共有 lib 化は network isolation 設計と
  抵触しうる)。**再採用条件は「同型の drift が今後も再発する場合」**と明記した

--- CodeRabbit レビュー対応 (#384、5 件すべて修正) ---

1. WP-18 完了条件でスモーク未確定の扱いが不明確 (Major)
   (c) だけを非必須と書き (a)(b) の扱いが無かった。(a)(b) は事象待ちで**自力で発生させ
   られない**ため、条件に含めると WP を閉じられない。3 件すべてを非ブロッカーとし、
   理由と移管先・期限を表で明記した。(a)(b) は 2026-11-06 時点で未観測なら
   「機会が来なかった」として見送り ADR-067 の bounded lifetime へ委ねる。

2. 順位 411 の要約が詳細計画と不一致 (Minor)
   summary は「正しいコマンドを提示」だが、cargo fmt に**代替コマンドは存在しない**
   (手で直すのが正)。「正しい対処を提示」へ変更し、詳細側にもその旨を明記した。

3. 順位 398 の完了判定を対象 PR に束縛すべき (Major)
   「report 生成を完了根拠にする」案が不十分だった。copy_feedback_report は
   find_latest_run_dir で最新 run を選ぶだけで **pr_number と照合していない**ため、
   別 PR の report を現在の PR の {pr_number}.md へコピーし得る。また takt の終了は
   timeout や失敗でも起こるので終了した事実は report 完成を証明しない。実装を読んで
   裏付けたうえで、完了判定には「成功終了」と「対象 PR のものであること」の両方が
   要る旨を追記した。本セッションで実際に context.json が別 PR を指していた事象とも
   同型である。

4. 旧語彙 lint の extensions から yaml が漏れている (Minor)
   拡張子は eq_ignore_ascii_case の文字列一致で **yml と yaml は別物**。本リポジトリは
   .github/workflows/*.yml と .coderabbit.yaml の両方を持つため、yaml を落とすと
   後者が未検査になる。両方を対象に加え、理由も併記した。

5. cargo fmt の検出対象が未定義 (Major)
   完全一致だけでは cargo fmt --all / cargo +stable fmt / rustup run stable cargo fmt /
   cargo-fmt が素通りする。作業計画の先頭に「検出範囲を先に決める」を追加し、完了基準に
   「完全一致に限定する場合は素通りする形態を明記する」ことを求める形にした。

いずれも実物 (takt.rs の実装 / linter の拡張子判定 / リポジトリ内の .yml と .yaml の
共存) を確認したうえで妥当と判断している。
aloekun added a commit that referenced this pull request Aug 18, 2026
hooks-pre-tool-validate の smoke テスト 2 本が並列に exe を tempdir へ copy →
spawn するため、Linux で copy 側の書き込み fd を並列 spawn が fork した子が継承し、
exec が ETXTBSY (Text file busy) で落ちる。PR #376 の CI (ubuntu-latest) で実観測。

WSL Ubuntu-24.04 の ext4 上で再現させ (200 run 中 43 回)、対処案 3 つを実測比較した
うえで、copy と spawn (fork〜exec) を static Mutex で相互排除する形を採った。
テストごとの tempdir 分離と後始末を保ったまま、fd 継承の窓を構造的に閉じる。

同型パターンの棚卸しで hooks-stop-quality の t7_cwd_independence (5 テスト全部が
copy→spawn) が見つかったため、同じガードを入れた。現状 cfg(windows) で POSIX 経路は
踏まないが、cfg を外した瞬間に同じ flake が出る箇所。

回帰 seal として #[ignore] のストレステストを追加した。ロックを外すと Linux で
10/10 落ち、戻すと 0/10 (ADR-049)。CI の --ignored --test-threads=1 leg で走る。

順位 396 のエントリ (todo21.md / todo-summary2.md) を削除し、計画書と
harness-improvement-plan.md の該当行を更新した。
aloekun added a commit that referenced this pull request Aug 19, 2026
hooks-pre-tool-validate の smoke テスト 2 本が並列に exe を tempdir へ copy →
spawn するため、Linux で copy 側の書き込み fd を並列 spawn が fork した子が継承し、
exec が ETXTBSY (Text file busy) で落ちる。PR #376 の CI (ubuntu-latest) で実観測。

WSL Ubuntu-24.04 の ext4 上で再現させ (200 run 中 43 回)、対処案 3 つを実測比較した
うえで、copy と spawn (fork〜exec) を static Mutex で相互排除する形を採った。
テストごとの tempdir 分離と後始末を保ったまま、fd 継承の窓を構造的に閉じる。

同型パターンの棚卸しで hooks-stop-quality の t7_cwd_independence (5 テスト全部が
copy→spawn) が見つかったため、同じガードを入れた。現状 cfg(windows) で POSIX 経路は
踏まないが、cfg を外した瞬間に同じ flake が出る箇所。

回帰 seal として #[ignore] のストレステストを追加した。ロックを外すと Linux で
10/10 落ち、戻すと 0/10 (ADR-049)。CI の --ignored --test-threads=1 leg で走る。

順位 396 のエントリ (todo21.md / todo-summary2.md) を削除し、計画書と
harness-improvement-plan.md の該当行を更新した。
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