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
13 changes: 12 additions & 1 deletion docs/adr/adr-028-pnpm-create-pr-gate.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## ステータス

承認済み (2026-04-19) / 改訂 (2026-04-22: 原則 5 に軸別境界サブセクション追加 — ADR-022 原則 5 との生成/改変の区分を明示)
承認済み (2026-04-19) / 改訂 (2026-04-22: 原則 5 に軸別境界サブセクション追加 — ADR-022 原則 5 との生成/改変の区分を明示) / 改訂 (2026-05-30: 原則 6 を追加 — PR body 複数行時の `--body-file` 推奨を codify)

## コンテキスト

Expand Down Expand Up @@ -144,6 +144,15 @@ actor 軸 (上記表) とは別の切り口として、**イベント種別軸**
└── no → どちらの射程外 (例: ローカル作業のみ)
```

### 原則 6: PR body が複数行/長文の場合は `--body-file` で渡す (2026-05-30 追記)

実行ゲート (原則 1) を通った後の `pnpm create-pr` / `gh pr edit` 呼び出しで、PR body をシェル引数として直渡しする (`--body "..."`) と、body が途中で切り詰められる silent UX 劣化が PR #134・PR #181 の 2 回で観測された。原則 1 が「**いつ実行するか**」のゲートであるのに対し、本原則は「**どう引数を渡すか**」の codify であり、ゲート通過後の正常系を保護する。

- **why**: 複数行 body をシェル引数で渡すと、シェルおよび `gh` CLI が受け取る argv の段階で改行が delimiter として解釈され、body が最初の改行近辺で partial 化する。truncation はエラーにならず PR が作成されてしまうため、後から body 欠落に気付く検出遅延コスト (= 取り消しコスト) が発生する。
- **how**: PR body は常に scratch file 経由で渡す。(a) PR 作成時は `pnpm create-pr -- --title "..." --body-file <path>`、(b) 既存 PR の body 修正は `gh pr edit <N> --body-file <path>`、(c) scratch file は `__pr-body.md` (gitignore 対象、CLAUDE.md の scratch 命名規約に従う)。一次防衛として Claude auto-memory `feedback_pnpm_create_pr_body` が同 workaround を記録しており、本原則はその構造的予防層 (ADR からの逆引き reference) に当たる。

なお本原則は規範 (how) の codify に閉じ、自動 regression gate (`--body-file` が複数行 body で truncation しないことを担保する unit test) は別途 `cli-pr-monitor` の argv 組み立て層で test 化する (docs 層 = 本原則、test 層 = 別タスクの相補関係)。

## 影響

### 採用される構成要素
Expand Down Expand Up @@ -192,6 +201,8 @@ interactive session での PR 作成フロー:
- ADR-022 原則 5 (PR 包含 changeset の不変性): 本 ADR 原則 5「軸別境界サブセクション」で生成 vs 改変の区分を明示
- ADR-019 (CodeRabbit ハイブリッド): 無料枠 1h 3 回制約が「取り消しコスト」を増幅する根拠
- memory `feedback_bookmark_auto_naming.md`: 一次防衛層
- memory `feedback_pnpm_create_pr_body`: 原則 6 の一次防衛層 (PR body truncation の `--body-file` workaround)
- PR #134 / PR #181: 原則 6 の根拠となった PR body truncation の観測元
- `src/hooks-pre-tool-validate/src/main.rs::preset_gh_pr_create_guard`: traffic cop 層
- セッション 247510ea-3f24-4b87-8f68-3c860e1b1b4e (2026-04-18): 事故発生源
- PR #54 / PR #55: 事故後の水平展開作業
1 change: 0 additions & 1 deletion docs/claude-code-web-tasks.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
| 127 | T3 | extensions 拡張時の test 追加 pattern を Rust ソース内コメントで明文化 (PR #151 T3-#2、順位 124 と同 PR 推奨) | Rust ソース内コメント(test location を正確に参照) | XS |
| 134 | T3 | ADR-035 に docs-only PR 評価の適用外基準リスト追加(mutation / error handling / DRY / YAGNI / function length / test coverage / magic-number 等)(PR #156 T3 #2) | [docs/adr/adr-035-doc-evaluation-policy.md](adr/adr-035-doc-evaluation-policy.md) | S |
| 164 | T3 | ADR-039 kill-switch standard pattern に「診断メッセージは実装の受理値を網羅」原則追記(`CLI_DOCS_LINT_DISABLE` の `=1` 固定 vs 実受理値 `true`/`TRUE`/`True` の spec-impl drift 由来、PR #179 T3-#1)※順位 174 と同 PR 推奨(同一 ADR-039 編集) | [docs/adr/adr-039-experimental-feature-standard-pattern.md](adr/adr-039-experimental-feature-standard-pattern.md) | XS |
| 166 | T3 | ADR-028 に PR body 複数行時の `--body-file` 推奨 + shell argument truncation の why/how 補足追記(PR #181 T3-#1) | [docs/adr/adr-028-pnpm-create-pr-gate.md](adr/adr-028-pnpm-create-pr-gate.md) | XS |
| 174 | T3 | ADR-039 experimental feature lifecycle checklist 拡張 — 新規 feature 追加時の 4 点整合確認(config schema ↔ feature flag default OFF ↔ docs/config example ↔ test coverage、PR #184 T3-#2)※順位 164 と同 PR 推奨(同一 ADR-039 編集) | [docs/adr/adr-039-experimental-feature-standard-pattern.md](adr/adr-039-experimental-feature-standard-pattern.md) | S |

### 着手フロー
Expand Down
1 change: 0 additions & 1 deletion docs/todo-summary.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@
| 163 | 🔧 Tier 2 | **Cross-ref edge case test coverage 追加 — percent-encode / GFM heading slug / relative path normalize (PR #179 T2-#1 採用)** | todo9.md | S | なし (PR #179 で cli-docs-lint の cross_ref validator を新規実装したが、percent-encode (`%20` / `%23`) / heading slug / `../` resolve の edge case が fixture テストで明示的に保護されていない silent regression リスク回避) |
| 164 | 💎 Tier 3 | **ADR-039 kill-switch standard pattern に「診断メッセージは実装の受理値を網羅」原則追記 (PR #179 T3-#1 採用)** | todo9.md | XS | なし (PR #179 で `CLI_DOCS_LINT_DISABLE` の kill-switch message が `=1` 固定で実受理値 `true`/`TRUE`/`True` を反映しなかった spec-impl drift、ADR-039 は全 experimental feature の標準参照のため systemic reach、`docs/adr/adr-039-*.md` 編集) |
| 165 | 🔧 Tier 2 | **`pnpm create-pr` PR body truncation 回避を検証する e2e/integration test 追加 (PR #181 T2-#1 採用)** | todo9.md | S | なし (PR #134 + #181 の 2 回観測で Medium frequency に昇格、memory `feedback_pnpm_create_pr_body` の `--body-file` workaround を自動 regression gate 化、shell argument truncation の境界 (行数/バイト数) を fixture で測定、silent UX 劣化の早期検出、cli-pr-monitor の argv 組み立て層を test 対象、順位 166 と相補 = test 層 vs docs 層) |
| 166 | 💎 Tier 3 | **ADR-028 に PR body 複数行時の `--body-file` 推奨 + shell argument truncation の why/how 補足追記 (PR #181 T3-#1 採用)** | todo9.md | XS | なし (順位 165 の構造的予防策として ADR-028 = pnpm create-pr gate に codify、改行が shell delimiter として処理される why と `--body-file` / `gh pr edit --body-file` の how を 2-3 段落で補足、`docs/adr/adr-028-pnpm-create-pr-gate.md` 編集、memory `feedback_pnpm_create_pr_body` との back-link 整合) |
| 167 | 🚀 Tier 1 | **`check-ci-coderabbit` の `RATE_LIMIT_MARKER` を新フォーマット対応に更新 (PR #182 T1-#1 採用) ★ Bundle CR-RL** | todo9.md | M | なし (`src/check-ci-coderabbit/src/main.rs:251` 旧 marker `Rate limit exceeded` 固定 → multi-variant array `["Rate limit exceeded", "rate limited by coderabbit.ai"]` に変更、現行 CR は HTML マーカー + `## Review limit reached` フォーマットを使用、PR #182 で 30+ 分 polling 観測の root cause、`RateLimitOutcome::Parked` 経路 (ADR-018) が silent regression で無効化されている critical bug、順位 168 + 169 と Bundle CR-RL で同 PR land 推奨) |
| 168 | 🔧 Tier 2 | **CR rate-limit detection integration test — 新旧両フォーマット対応 fixture 追加 (PR #182 T2-#1 採用) ★ Bundle CR-RL** | todo9.md | S | 順位 167 の marker 配列化と pair、`#[cfg(test)]` に新 format fixture 2-3 variant 追加 (HTML マーカー + `## Review limit reached` の minimum reproduction)、既存 6 fixture (旧 format) は維持して backward compat、silent regression を test で検出可能化 |
| 169 | 💎 Tier 3 | **ADR-018 / ADR-034 に CR rate-limit format evolution と検出ロジック同期戦略を codify (PR #182 T3-#1 採用) ★ Bundle CR-RL** | todo9.md | XS | 順位 167 + 168 と同 commit 推奨、ADR-034 に「既知 format 一覧 + 検出 logic 更新手順」を追記、ADR-018 lines 185-186 を multi-variant 参照に更新、CR の format 進化への構造的予防策、永続 layer (ADR) での format drift 防止 |
Expand Down
37 changes: 0 additions & 37 deletions docs/todo9.md
Original file line number Diff line number Diff line change
Expand Up @@ -785,43 +785,6 @@ ADR-039 § 決定 2 (Kill-switch) に以下の原則を追記:

---

### ADR-028 に PR body 複数行時の `--body-file` 推奨 + shell argument truncation の why/how 補足追記 (PR #181 T3-#1 採用)

> **動機**: PR #134 + #181 で 2 回観測された `pnpm create-pr` の PR body 切り詰め問題 (順位 165 と同根)。memory `feedback_pnpm_create_pr_body` で recurring issue として記録されているが、ADR-028 (pnpm create-pr gate) には why (改行が shell delimiter として処理される) / how (`--body-file` または `gh pr edit --body-file` を使う) が codify されていない。順位 165 が test で防御層を作るのに対し、本タスクは ADR で permanent reference 層を作って後発の AI / reviewer が逆引き可能な状態にする構造的予防策。
>
> **本タスクの位置づけ**: PR #181 post-merge-feedback Tier 3 #1 採用 (Severity Medium / Frequency Medium / Effort XS / Adoption Risk None、2026-05-29 ユーザー承認)。順位 165 が test 層、本タスクが docs 層で同根を別レイヤで補強する関係。
>
> **参照**: `.claude/feedback-reports/181.md` Tier 3 #1、memory `feedback_pnpm_create_pr_body`、`docs/adr/adr-028-pnpm-create-pr-gate.md` (補足追記対象)、PR #134 / #181 の create-pr 観測

#### 設計決定 (案)

ADR-028 に以下を補足セクションとして追記:

- **PR body が複数行/長文の場合は `--body-file <path>` を使う**: shell argument 直渡し (`--body "..."`) は OS / シェル / `gh` CLI の引数解釈で改行が delimiter 処理され body が途中で切れるケースが PR #134・#181 で観測されている
- **why**: shell が改行を区切りとして解釈、`gh` CLI が受け取る argv に改行が含まれた時点で body が partial 化
- **how**: (a) PR 作成時は `pnpm create-pr -- --title "..." --body-file <path>` で file 経由、(b) 既存 PR の body 修正は `gh pr edit <N> --body-file <path>`、(c) scratch file は `__pr-body.md` (gitignore 対象、CLAUDE.md scratch 命名規約)
- **配置**: ADR-028 の決定セクションまたは「実装上の注意」セクションに 1-2 段落で追記、メモリ entry `feedback_pnpm_create_pr_body` への back-link

#### 作業計画

- [ ] `docs/adr/adr-028-pnpm-create-pr-gate.md` の適切な section (決定 / 実装注意点) に上記補足を 2-3 段落で追記
- [ ] PR #134 / #181 を実例として inline cite
- [ ] markdownlint clean 確認
- [ ] 本エントリ削除 + todo-summary.md 行削除

#### 完了基準

- ADR-028 に PR body 複数行ケースの why / how が codify される
- 後発の AI / reviewer が ADR から逆引き可能になる
- memory `feedback_pnpm_create_pr_body` との整合 (memory が ADR 参照を持つ or vice versa)
- markdownlint clean

#### 詰まっている箇所

なし。Effort XS、ADR の section 追記のみで副作用最小。

---

### `check-ci-coderabbit` の `RATE_LIMIT_MARKER` を新フォーマット対応に更新 (PR #182 T1-#1 採用) ★ Bundle CR-RL

> **動機**: PR #182 セッションで CR の rate-limit が 30+ 分間検出されず、`cli-pr-monitor` が無効な polling を継続した実観測ベース。`src/check-ci-coderabbit/src/main.rs:251` の `RATE_LIMIT_MARKER = "Rate limit exceeded"` は CR の旧フォーマット時代の固定値で、現行 CR は `<!-- This is an auto-generated comment: rate limited by coderabbit.ai -->` HTML マーカー + `## Review limit reached` heading + `you've reached your PR review rate limit` 本文を使用。format drift により `is_rate_limit_comment()` が常に false を返し、`RateLimitOutcome::Parked` 経路 (ADR-018 設計) が完全に無効化されている silent regression。
Expand Down