From 7ac7f81d660e89d2c76df94a4ad77bd8e08cae1f Mon Sep 17 00:00:00 2001 From: "osushi0404-claude[bot]" <352511081+osushi0404-claude[bot]@users.noreply.github.com> Date: Sat, 7 Nov 2026 22:12:33 +0900 Subject: [PATCH 01/11] docs: create issue I224 Co-Authored-By: Claude Opus 5.5 --- docs/issues/open/I224.md | 77 +++++++++++++++++++ .../I224_issue_review_20261105_0325.md | 25 ++++++ 2 files changed, 102 insertions(+) create mode 100644 docs/issues/open/I224.md create mode 100644 docs/reviews/I224_issue_review_20261105_0325.md diff --git a/docs/issues/open/I224.md b/docs/issues/open/I224.md new file mode 100644 index 00000000..9b273910 --- /dev/null +++ b/docs/issues/open/I224.md @@ -0,0 +1,77 @@ +# I224: GitHub への書き込み(イシューの書き換え・コメント・push)の回数を絞り、短い間に集中しないようにする + +## 関連資料 +- GitHub Issue: #413 +- 起点: I220(retro からの起票・2026-11-05) +- 関連: I223(GitHub App への移行の記録) +- GitHub サポートへの補足で約束した再発防止(イシューの書き換え・コメントの回数を絞る、push をまとめる、同時に複数のセッションで動かさない) + +## 設計確認メモ(/grill-me) +- ユーザーの指示(2026-11-07): 「ループエンジニアリング、ハーネスエンジニアリングのベストプラクティスと開発をサクサク進めるという観点で問題ないやり方を選択して」→ 以下はすべて Claude の推奨案で確定 +- 前提(grill-me で実測・2026-11-07): I226(PR #418)の push は 21:23〜22:27 の約 1 時間に 10 回(`git reflog show refs/remotes/origin/feature/I226-revoke-check-and-g10-scope`)。最も詰まった所は 3 分半に 4 回。ほかにイシュー本文の書き換え・PR の作成/更新/Ready・起票などが 5 回前後。GitHub が公開している、作る操作の上限(1 分 80 回・1 時間 500 回ほど。grill-me の時点では調べ直していない・計画で確かめる)よりずっと少なく、停止の原因は量より「人でない新しいアカウントの自動の書き込み」の可能性もある。その対策の本筋(GitHub App への移行)は I223 で済んでいる +- Q: どこまでやるか → A: **(a) 回数をまとめるだけ**。GitHub に送る(push する)のは、要る 3 時点に絞る: ① 下書き PR を作るとき(plan-issue)② review-gate の CI 待ちの前(fix-loop の後のやり直しのたびを含む)③ close の最後の確認(`pr-base-sync.sh final`)の前。ほかの段階の記録(STAGE_DONE・自律判断の記録・テスト結果など)は手元でコミットだけし、次に送るときにまとめて送る。イシュー本文の書き換え(`gh issue edit --body-file`)は grill-me の終わりの 1 回だけにする(plan-issue での同期は、Draft PR の番号などを足す必要があるときも close のときにまとめる・詳細は計画)。書き込みの間隔を空ける仕組み(`gh` の入口で待つなど)は入れない +- Q: 目標の数字 → A: 1 本のイシューで push は **4 回以内**(fix-loop の後の review-gate のやり直し 1 回ごとに +1 を許す)。測り方はブランチへの push の履歴(`git reflog show refs/remotes/origin/<ブランチ>` の `update by push` の行数)。I224 の次に進めるイシュー 1 本で実測して達成を確かめる(I224 自身でも測って記録する) +- Q: 同時に複数のセッションで書き込まない件 → A: **決まりとして書くだけ**(仕組みで止めない)。テスト用に起こすセッションは I223 で読み取りだけの鍵なので書き込めない。残るのは、ユーザーが複数の作業フォルダ(worktree)で同時に進める場合だけ。手元の安全装置を作り込まない方針(最後の守りは GitHub)に合わせる + +## 背景/目的 + +**背景**: 2026-10-30 に、Claude が GitHub の操作に使っていた bot アカウントが停止された。GitHub からの理由の説明は未着だが、短い間にイシューの書き換え・コメント・push が集中したことがきっかけと見ている(I193 以降、Claude が段階を自分で進めるようになり、書き込みの回数が大きく増えた)。GitHub App に移っても、同じ量と集中のしかたなら、また止められるおそれがある。 +**目的**: 1 つのイシューを進めるときの GitHub への書き込みの回数を減らし、短い間に集中しないようにする。 + +### 現状の問題(証拠・再現手順) +- 段階ごとに「記録をコミットして push」があり、1 つのイシューで push が 10 回を超えることがある(各段階のスキルの結線・`docs/runbooks/workflow.md`。回数は見立てで未実測) +- grill-me・計画の段階で、GitHub のイシュー本文を何度も書き換える(`gh issue edit --body-file`) +- retro で既存イシューへのコメントを続けて付ける +- テスト用の `claude -p` を同時に流すと、書き込みが重なる(I220 の M-03・M-04) +- 実測の例(I220・2026-11-05・review-gate から close まで): push 10 回。内訳は App の確かめ 2・隠れた PR のせいで無駄になった 1・改名したブランチ 1・段階ごとの記録 5(PR の作り直し・review-gate・test-gate・retro・STAGE_DONE close)・close の前の 1。GitHub に送っておく必要があるのは「review-gate の CI 待ちの前」と「close の最後の確認の前」だけで、段階ごとの 5 回は 1〜2 回にまとめられた +- ほかのイシューでの回数の実測は未特定・grill-me で確認 + +### 根本原因 +(停止の原因が書き込みの集中だというのは推定。GitHub の説明は未着)各段階のスキルが、その段階の終わりごとに GitHub へ書き込む作りで、イシュー全体での回数と間隔を見る仕組みが無い。そうなっているのは、記録をコミットすることと GitHub へ送ることが分かれておらず(各段階の結線が「commit/push」を 1 組で書く)、review-gate が「PR の最新のコミット=手元の HEAD」を前提に CI を待つため、と見ている。 + +### 解決方針 +- 確定(設計確認メモ参照): + - push を段階ごとでなく、要る 3 時点(下書き PR の作成・review-gate の CI 待ちの前・close の最後の確認の前)にまとめる。ほかの段階は手元でコミットだけ + - イシュー本文の同期は grill-me の終わりの 1 回だけにする + - 書き込みの間隔を空ける仕組みは入れない + - 同時に複数のセッションで書き込まない決まりを `docs/runbooks/workflow.md`(または `docs/runbooks/worktree.md`)に書く(仕組みでは止めない) + +## 実装対象(既知のもの) +| ファイル | 変更内容 | +|---------|---------| +| `.claude/skills/`(各段階のスキルの結線・plan-issue・grill-me・retro・close など) | push の時点を 3 つにまとめる・イシュー本文の同期を grill-me の終わりだけにする | +| `docs/runbooks/workflow.md`・`docs/runbooks/worktree.md` | 書き込みの時点の決まり・同時に複数のセッションで書き込まない決まり | +| `scripts/claude/`(push を前提にする確認があれば。例: `flow-stage.sh`・`gate-check.sh`) | 手元だけのコミットでも段階の判定・確認が壊れないことを計画で確かめる(直すかは計画で決める) | + +## スコープ +### 含む +- GitHub への書き込みの回数と時点の見直し(push を 3 時点に・イシュー本文の同期を grill-me の終わりだけに) +- 同時に複数のセッションで書き込まない決まり(決まりだけ。テスト用の `claude -p` は I223 で読み取りだけなので対象外) +- 測り方(ブランチへの push の履歴の行数)と目安(1 本で 4 回以内・やり直し 1 回ごとに +1) +### 含まない +- GitHub App への移行そのもの(I223) +- 書き込みの間隔を空ける仕組み(grill-me で入れないと確定) + +## 関連する品質基準 +- 該当なし(ハーネスの運用の仕組み) + +## 受け入れ条件(Acceptance Criteria) +- [ ] 各段階のスキルが、push を 3 時点(下書き PR の作成・review-gate の CI 待ちの前・close の最後の確認の前)だけで行い、ほかの段階は手元のコミットだけにしている +- [ ] イシュー本文の書き換え(`gh issue edit --body-file`)が grill-me の終わりの 1 回だけになっている +- [ ] 1 本のイシューの push が 4 回以内(fix-loop の後の review-gate のやり直し 1 回ごとに +1)であることを、I224 の次のイシュー 1 本で実測して示す(`git reflog show refs/remotes/origin/<ブランチ>` の `update by push` の行数。I226 の実測は 10 回) +- [ ] 同時に複数のセッションで書き込まない決まりが手順書にある +- [ ] review-gate の CI 待ち(PR の最新のコミットと手元の HEAD が同じこと)など、push を前提にしている確認が壊れていない +- [ ] 既存のハーネステスト・CI がすべて pass する + +## 影響範囲(想定) +- Backend: なし +- Frontend: なし +- DB: なし +- Config/Infra: `.claude/skills/`・`docs/runbooks/workflow.md`・`docs/runbooks/worktree.md`・(必要なら)`scripts/claude/`(`flow-stage.sh`・`gate-check.sh` など push を前提にする確認) + +## 制約・引き継ぎ情報 +- GitHub の公開の上限(API の回数の上限)とは別に、自動の監視が「人らしくない操作」をどう見ているかは公開されていない。数字の目安は未定・grill-me で確認 +- review-gate は PR の最新のコミットが手元の HEAD と同じであることを確かめるので、push を減らすと待ちの手順に影響する + +## Danger Ops(有/無) +- 無 diff --git a/docs/reviews/I224_issue_review_20261105_0325.md b/docs/reviews/I224_issue_review_20261105_0325.md new file mode 100644 index 00000000..8f545907 --- /dev/null +++ b/docs/reviews/I224_issue_review_20261105_0325.md @@ -0,0 +1,25 @@ +# イシュー自己完結度レビュー [I224] + +## 判定: 要補足 +(未記入の空欄はなく、未確定箇所は「未定・grill-me で確認」と明示されています。ただし、根本原因と受け入れ条件に補足すべき点があります。) + +## 未記入の重要セクション +なし + +## 指摘一覧(助言) +| 重大度 | 観点 | 指摘内容 | 該当箇所 | +|--------|------|---------|---------| +| Warning | 根本原因 | 根本原因は「各段階が終わりごとに書き込む作りで、全体の回数と間隔を見る仕組みが無い」という内容です。これは現状の問題(段階ごとに push する、本文を何度も書き換える)の言い換えに近いです。「なぜ段階ごとに書き込む設計になったか」には触れていません。たとえば、記録の永続化と GitHub への同期が分離されていない、push が review-gate の前提になっている、といった構造的な原因です。また、停止の原因が書き込みの集中だというのは、背景に書かれているとおり推測です。根本原因の節でも「推定」と明示すると、原因の確度が分かりやすくなります。 | 根本原因 / 背景 | +| Warning | 自己完結度 | 現状の問題の数値が根拠なしです。「push が 10 回以上」とありますが、実測値や出典がありません。他の項目(本文の書き換え、コメント)には回数がまったくありません。ベースラインが無いので、受け入れ条件の「今より減った」を検証できません。 | 現状の問題 / AC1 | +| Warning | スコープ・受け入れ条件 | AC1 の測り方が未定で、AC2 の「集中しない」にも基準がありません(たとえば N 分に M 回まで)。どちらも検証可能な形になっていません。「未定」の明示はありますが、計画着手前に少なくとも測定方法(ログ集計、`gh` ラッパーの記録など)の案が必要です。 | 受け入れ条件 AC1・AC2 / 制約 | +| Info | 解決方針 | 候補が 4 つ並んでいるだけで、優先順位や採否の基準がありません。push をまとめる案は、review-gate の CI 待ち(制約に記載)と衝突しうるので、トレードオフを事前に書いておくと計画しやすくなります。「同時に複数のセッションで書き込まない決まり」は、強制するのか運用ルールだけなのかも不明です。 | 解決方針 / 制約 | +| Info | 実装対象 | `.claude/skills/` は対象スキルが特定されていません。`scripts/claude/` も「未特定」と明示されています。どの段階のスキルが push やイシュー編集をしているかは、grep で洗い出せる既知の範囲です。計画時に一覧化すると具体的になります。review-gate の確認を含む変更範囲も列挙に入っていません。 | 実装対象 | +| Info | スコープ | 「同時に複数セッションで動かさない」は、サポートへ約束した再発防止なのに、スコープの「含む」に明示されていません。また、`claude -p` のテストの並列実行(I220 M-03・M-04)の扱いが、含む・含まないのどちらにも書かれていません。 | スコープ / 関連資料 | + +## 次のアクションの推奨 +未確定箇所(回数の実測、集中の基準、採用する方針)を埋めるため、`/grill-me` を推奨します。特に先に決めたいのは次の 3 点です。 +1. 現状の書き込み回数の測り方(ベースライン) +2. 「集中しない」の数値の目安 +3. 4 つの候補のうち採用するもの + +根本原因は、設計上の理由まで書き足しておくと、計画の精度が上がります。 From 61e1969a53dc4988e142b7542d2d696b3dc51ce7 Mon Sep 17 00:00:00 2001 From: "osushi0404-claude[bot]" <352511081+osushi0404-claude[bot]@users.noreply.github.com> Date: Sat, 7 Nov 2026 22:15:01 +0900 Subject: [PATCH 02/11] =?UTF-8?q?docs(I224):=20plan/tests/review=20?= =?UTF-8?q?=E4=BD=9C=E6=88=90=E3=83=BBSTAGE=5FDONE=20plan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/issues/open/I224.md | 1 + docs/plans/open/plan_I224.md | 141 ++++++++++++++++++++++++++++ docs/reviews/open/I224_review.md | 32 +++++++ docs/tests/open/I224_auto_test.md | 40 ++++++++ docs/tests/open/I224_manual_test.md | 14 +++ 5 files changed, 228 insertions(+) create mode 100644 docs/plans/open/plan_I224.md create mode 100644 docs/reviews/open/I224_review.md create mode 100644 docs/tests/open/I224_auto_test.md create mode 100644 docs/tests/open/I224_manual_test.md diff --git a/docs/issues/open/I224.md b/docs/issues/open/I224.md index 9b273910..de6654dd 100644 --- a/docs/issues/open/I224.md +++ b/docs/issues/open/I224.md @@ -2,6 +2,7 @@ ## 関連資料 - GitHub Issue: #413 +- Draft PR: #420 - 起点: I220(retro からの起票・2026-11-05) - 関連: I223(GitHub App への移行の記録) - GitHub サポートへの補足で約束した再発防止(イシューの書き換え・コメントの回数を絞る、push をまとめる、同時に複数のセッションで動かさない) diff --git a/docs/plans/open/plan_I224.md b/docs/plans/open/plan_I224.md new file mode 100644 index 00000000..f3155ffd --- /dev/null +++ b/docs/plans/open/plan_I224.md @@ -0,0 +1,141 @@ +# I224 計画書: GitHub への書き込み(イシューの書き換え・コメント・push)の回数を絞り、短い間に集中しないようにする + +## 基本情報 +- **計画書ID**: plan_I224 +- **関連イシュー**: #413 +- **Draft PR**: #420 +- **作成根拠資料**: docs/issues/open/I224.md(設計確認メモあり) +- **実装後評価**: docs/reviews/open/I224_review.md +- **作成日**: 2026-11-07 + +## 1. 背景/目的 +- 2026-10-30 に GitHub の操作に使っていた bot が停止された。きっかけは短い間の書き込みの集中と見ている(GitHub の説明は未着)。GitHub App(I223)に移っても、同じ量と集中のしかたなら、また止められるおそれがある +- 各段階のスキルが、段階の終わりごとに「commit/push」する作りで、1 本のイシューで push が 10 回前後になる +- 目的: push を要る 3 時点にまとめ、イシュー本文の同期を grill-me の終わりの 1 回にし、同時に複数のセッションで書き込まない決まりを書く(grill-me で確定) + +### 調査結果 +- **原因の概要**: 「手元に記録を残す(commit)」と「GitHub に送る(push)」が、どの段階の手順でも 1 組で書かれている。送る必要があるのは GitHub が中身を見る時点(PR を作る・CI を回す・マージの前の確認)だけなのに、段階の数だけ送っている +- **実測(2026-11-07)**: I226 のブランチへの push は 21:23〜22:27 の約 1 時間に 10 回(`git reflog show refs/remotes/origin/feature/I226-revoke-check-and-g10-scope` の `update by push` の行)。最も詰まった所は 3 分半に 4 回 +- **push の指示がある場所(grep `commit/push|commit・push|コミット・push|git push`・宣言と消費の全件)**: + - スキル: `plan-issue`(54・61・66・189・190 行)・`plan-review`(14・28・35)・`design-security-review`(141)・`implement`(93・96・97)・`review-gate`(27・98)・`fix-loop`(64)・`test-gate`(63)・`retro`(168・178)・`close`(125・144・165・168)・`proceed`(15) + - 手順書: `docs/runbooks/workflow.md`(25・50)・`docs/runbooks/plan-writing-rules.md`(230)・`docs/runbooks/worktree.md`(82・251) + - スクリプト: `scripts/claude/pr-base-sync.sh`(final で BEHIND のときだけ merge→push。残す)。`code-review.sh`・`plan-issue-review.sh`・`fix-review-lib.sh` は記録を commit するだけで push しない + - 対象外: `danger-ops.md:37`・`review-rules.md:180`・`plan-reviewer.md:103`・`onboarding.md:139`(push の指示ではない) +- **push を前提にしている確認**: + - `code-review.sh` の CI 待ち(`wait_ci`)は「PR の最新のコミット=手元の HEAD」でなければ `CI_WAIT: NOT_PUSHED` で止まる → review-gate の CI 待ちの前に push が要る(時点 ②)。push し忘れても決定論で止まる + - `gate-check.sh`・`flow-stage.sh`・implement の 3.5(`git diff origin/develop...HEAD`)は手元の記録・コミットだけを見る → 手元のコミットだけでも壊れない + - `pr-base-sync.sh sync`(close の step 0)は PR の状態(base が進んだか)を見るだけで、手元の未 push のコミットに関係しない +- **GitHub の上限(grill-me で「計画で確かめる」とした件)**: 公開の上限の数字は確かめていない(調べるための外部への問い合わせを足さない)。今の量(1 時間に 15 回ほど)は、記憶の上の上限(作る操作は 1 分 80 回・1 時間 500 回ほど)より 2 桁少ない。今回は数字に頼らず「要る時点だけ送る」で減らすので、計画は上限の正確な値に依存しない +- **PR へのコメント**: `plan-issue-review.sh`・`code-review.sh`・`post-review-comment.sh` が、レビューのたびに記録を PR にコメントする(1 本で 2〜5 回)。grill-me で決めた範囲(push・イシュー本文)の外で、あなたが PR でレビューを読む導線なので、今回は変えない(§9) +- **環境前提**: 新しいツールは使わない +- **既存テスト**: `scripts/claude/tests/run-all.sh` は CI(Harness Tests)が流す。新しいテストのファイル `test_*.sh` は自動で拾われる(`run-all.sh:2`) + +## 2. 受け入れ条件 +- [ ] 各段階のスキルが、push を 3 時点(① plan-issue の下書き PR の作成・② review-gate の CI 待ちの前・③ close の最後の確認の前)だけで行い、ほかの段階は手元のコミットだけにしている → TC-02 +- [ ] イシュー本文の書き換え(`gh issue edit --body-file`)が grill-me の終わりの 1 回だけになっている → TC-02 +- [ ] 1 本のイシューの push が 4 回以内(fix-loop の後の review-gate のやり直し 1 回ごとに +1)であることを実測で示す → M-01(I224 自身の implement より後)・retro での記録(次のイシュー 1 本の実測は、次のイシューの retro で行う。§9) +- [ ] 同時に複数のセッションで書き込まない決まりが手順書にある → TC-03 +- [ ] review-gate の CI 待ち(PR の最新のコミット=手元の HEAD)など、push を前提にしている確認が壊れていない → TC-01・M-01 +- [ ] 既存のハーネステスト・CI がすべて pass する → TC-01・CI + +## 3. 影響範囲 +- Backend/Frontend/DB: なし +- Config/Infra: `.claude/skills/{plan-issue,plan-review,design-security-review,implement,review-gate,fix-loop,test-gate,retro,close,proceed}/SKILL.md`・`docs/runbooks/workflow.md`・`docs/runbooks/worktree.md`・`docs/runbooks/plan-writing-rules.md`・`scripts/claude/tests/test_i224_push_points.sh`(新規)・`docs/reviews/backlog/I226.md` + +## 4. 変更点一覧(具体) + +### 修正アプローチ +送る時点の決まりを `workflow.md` の 1 か所(正)に書き、各スキルの「commit/push」を「commit する(push しない)」に直して正を参照させる。push を残すのは 3 時点のスキルだけ。押し戻し(決まりを知らずに「commit/push」を書き足す事故)は決定論のテストで止める。 + +### 4-1. `docs/runbooks/workflow.md`(正) +新しい節「## GitHub への書き込みの時点(I224)」を「## 記録とつなぎ(決定論)」の前に足す: +- push するのは 3 時点だけ: ① plan-issue の下書き PR の作成(イシューファイルのコミット)② review-gate の CI 待ちの前(`code-review.sh` を流す直前。fix-loop の後のやり直しのたびを含む)③ close の最後の確認の前(記録を closed へ移すコミット。`STAGE_DONE: close NEXT: merge` もこのコミットに入れる)。ほかに `pr-base-sync.sh final` が base を取り込んだとき(BEHIND のときだけ) +- それ以外の段階の記録(STAGE_DONE・自律判断の記録・テスト結果・レビュー記録)は手元でコミットだけし、次の時点でまとめて送る。push し忘れても、review-gate の CI 待ちは `CI_WAIT: NOT_PUSHED` で止まる(決定論) +- イシュー本文の書き換え(`gh issue edit --body-file`)は grill-me の終わりの 1 回だけ。plan-issue で足す Draft PR の番号などは手元のファイルにだけ書く +- 目安: 1 本のイシューの push は 4 回以内(fix-loop の後のやり直し 1 回ごとに +1)。測り方: `git reflog show refs/remotes/origin/<ブランチ>` の `update by push` の行数 +- 同時に複数のセッションで GitHub に書き込まない: 書き込む段階(plan-issue・review-gate・retro の起票・close)を、別の作業フォルダ(worktree)のセッションと重ねない。テスト用に起こすセッションは読み取りだけの鍵(I223)なので対象外。仕組みでは止めない(最後の守りは GitHub) +- 理由(1 行): bot の停止(2026-10-30)の再発防止。量より「要る時点だけ送る」で減らす +- 同じファイルの 25 行目「implement: … → push」を「→ commit(push は review-gate の最初)」に、50 行目の「commit/push する」を「commit する(push は上の節の時点だけ)」に直す + +### 4-2. スキル(「commit/push」→「commit」・push の 3 時点) +- `plan-issue`: 手順 2 の issue の `git push -u` は残す(①)。189・190 行の「commit/push」を「commit」に。66 行(既コミット経路の docs の commit・push)は ① なので残す。GitHub のイシュー本文は同期しない旨を 1 行足す +- `plan-review`: 14・28・35 行の「commit/push」を「commit」に(レビューのスクリプトは手元のファイルを読む) +- `design-security-review`: 141 行を「commit」に +- `implement`: 93 行「commit/push して PR を更新」→「commit する(push は review-gate の最初・workflow.md の時点 ②)」。96 行の「commit/push し直して」→「commit し直して」(3.5 は `origin/develop...HEAD` を手元で見る)。97 行を「commit」に +- `review-gate`: 「## 1.」の最初に「`git push` してから」を足す(②。fix-loop の後のやり直しも同じ)。27 行の NOT_PUSHED の扱いは残す。98 行の結線を「commit」に +- `fix-loop`: 64 行を「commit」に(次の review-gate が送る) +- `test-gate`: 63 行を「commit」に +- `retro`: 168・178 行を「commit」に(起票・既存イシューへのコメントはそのまま) +- `close`: 手順 3 の commit の前に `STAGE_DONE: close NEXT: merge` を足して、このコミットで送る(③)。手順 6 は「結線は手順 3 で済み。マージ依頼だけ」に。165 行の CI 失敗の戻し(open へ戻す)は「commit/push」→「commit」(次の review-gate が送る)。このとき最後の行が `STAGE_DONE: close NEXT: fix-loop` になるので、手順 3 の `close NEXT: merge` より後の行が勝つ(`flow-stage.sh` は最後の行を読む) +- `proceed`: 15 行の「commit/push」を「commit」に + +### 4-3. `docs/runbooks/worktree.md`・`docs/runbooks/plan-writing-rules.md` +- `worktree.md:82`「コミット・push する」→「コミットする」 +- `worktree.md:251`「こまめに commit・push する(失うのは push していない手元の変更だけにする)」→「こまめに commit する(push は workflow.md「GitHub への書き込みの時点」の時点だけ。手元のコミットはワークツリーを消さない限り残る)」 +- `plan-writing-rules.md:230`「commit/push し」→「commit し」 +- 同梱(一覧 I226 F2): `plan-writing-rules.md:90` の「付け忘れは … G6 が止める。」と後ろの「付け忘れは … G6・G7 が止める。」の重複を、後ろの 1 つにまとめる + +### 4-4. `scripts/claude/tests/test_i224_push_points.sh`(新規・決定論) +決まりを知らずに「commit/push」を書き足す事故(ふつうの書き方の事故で、CI でも画面でも気づけず、停止の再発につながる)を止める。 +- P1: `.claude/skills/*/SKILL.md` のうち `plan-issue`・`review-gate`・`close` 以外に、`commit/push`・`commit・push`・`コミット・push`・`git push` が無い +- P2: `plan-issue`・`review-gate`・`close` の、行の先頭(空白の後)の `git push` のコマンドの行が、ちょうど決めた数ある(`plan-issue` 2〔通常・既コミット経路〕・`review-gate` 1・`close` 1)。増えたら落ちる(実装前の数: 2・0・1) +- P3: `.claude/skills/*/SKILL.md` で `gh issue edit` を書いてよいのは `grill-me` だけ +- P4: `docs/runbooks/workflow.md` に「## GitHub への書き込みの時点」の節がある(P1〜P3 の決まりの正) +- FG: 一時フォルダの写しに `commit/push` を足す・`review-gate` の `git push` を 2 つにする・`retro` に `gh issue edit` を足す・節の見出しを消す → それぞれ落ちる(テストの中で確かめる) +- 引数でルートを渡せる形にする(写しで FG を流すため) + +### 4-5. `docs/reviews/backlog/I226.md` +- 同梱した F2 の行を消す + +## 5. 実装手順(ステップ) +1. 4-4 のテストを先に書き、今の版で P1〜P4 が落ちることを確かめる → TC-02 参照 +2. 4-1 の正の節 → 4-2 のスキル → 4-3 の手順書(ステップ 1 の後)→ TC-02・TC-03 参照 +3. 4-5 → TC-01 参照 +- ステップ 2 の後、この I224 の review-gate から close までは新しいスキルで動くので、I224 自身の push の回数を M-01 で数える + +## 6. テスト計画 +### 自動 +- テストレベル: シェルの静的な検査(手順書の文字)と既存のハーネステスト。詳細は `docs/tests/open/I224_auto_test.md` +- 再発防止: P1〜P3 の FG +### 手動 +- `docs/tests/open/I224_manual_test.md`(すべて Claude。I224 自身の push の回数・review-gate の CI 待ちが壊れていないこと) + +## 7. ロールバック +- PR を revert する(手順書とテストだけ。データ・設定の変更なし) + +## 8. Risk & 回避策 +- **review-gate の前に push し忘れる**: `code-review.sh` が `CI_WAIT: NOT_PUSHED` で止まり、スキルの手順どおり push して 1 回だけやり直す(決定論の守りが既にある) +- **手元だけのコミットが失われる**: ワークツリーを消したときだけ。`wt-remove.sh` は未 push のコミットがあると止まる(`worktree.md:106`) +- **close の最後の確認で CI が落ちる**: 記録を open に戻し `STAGE_DONE: close NEXT: fix-loop`(最後の行が勝つ)。次の review-gate が送る +- **テストが説明の文の「push」まで落とす**: P1 は `commit/push`・`commit・push`・`コミット・push`・`git push` の 4 つの書き方だけを見る(「push していない変更」のような説明の文は見ない)。今のスキルの説明の文(implement 87 行・review-gate 27 行)で誤検知しないことを TC-02 の実走で確かめる +- **人に見える変化**: PR の中身が段階ごとでなく、review-gate と close の前にまとめて更新される。マージの判断に使う最終の状態は変わらない + +## 9. 確定事項と自律判断 +イシューに明記されている(設計確認メモ): +- push は 3 時点だけ・ほかは手元のコミットだけ・イシュー本文の同期は grill-me の終わりの 1 回・間隔を空ける仕組みは入れない・目安は 4 回以内(やり直し 1 回ごとに +1)・測り方は push の履歴の行数・同時書き込みは決まりだけ + +Claude が決めた(技術的な選択と理由): +- **決まりの正は `workflow.md` の 1 節、スキルは参照だけ**(仮定・技術的): 写しを増やさない(I195 の方針) +- **`STAGE_DONE: close NEXT: merge` を close の手順 3 のコミットに入れる**(仮定・技術的): 手順 6 の結線のためだけの push(4 回目)を無くす。失敗時は後の行が勝つ +- **決定論のテスト P1〜P3 を足す**(仮定・技術的): `plan-writing-rules.md`「決定論テストの対象の選び方」の 2 問 — 普通の書き方(他のスキルの写し)で気づかずに壊しうる/壊れても CI・画面・すぐ後の作業で気づけない(push が増えるだけ)、被害は停止の再発で大きい → 作る。P4(節の有無)は意図的な変更でしか消えないが、P1〜P3 の決まりの正を指すため 1 行だけ置く +- **受け入れ条件 3 の「次のイシュー 1 本の実測」は、マージの後に次のイシューの retro で行う**(イシューに明記・grill-me): この PR の中では I224 自身の review-gate〜close の回数(3 回以内の見込み)で代わりに示す。次のイシューの retro で測ることをメモリと I224 の close の報告に書く +- **PR へのコメント(レビューの記録)は変えない**(仮定・技術的〜範囲): grill-me で決めた範囲(push・イシュー本文)の外で、PR でレビューを読む導線を変えるのは別の判断。1 本で 2〜5 回・push の直後に続くことは記録に残す +- **GitHub の上限の正確な数字は確かめない**(仮定・技術的): 計画は数字に依存しない +- 要件・基本設計・UI/UX の仮定: なし + +台帳の残りの一覧: +- 一覧 I226 F2(`docs/runbooks/plan-writing-rules.md`): 同梱 — 触るファイルの 1 行の重複で、直しは 1 文 +- 一覧 I209 F1(`plan-writing-rules.md`): 残す — 読み取りの API のテストの決まりで、今回の変更と関係しない +- 一覧 I209 F2・F9(`grill-me`)・F3(`implement`)・F5(`fix-loop`)・F7(`issue-bootstrap`): 残す — どれも書き込みの時点と関係しない文言の指摘(Low・再現なし) +- 一覧 I220 F1・F3(`issue-bootstrap`)・F2・F6・F7・F8(`workflow.md`): 残す — 起票・同梱の手順と言い回しの指摘で、今回の節と関係しない +- 一覧 I219 F1(`worktree.md`): 残す — primary の早送りの打ち切りの記述で、今回の 82・251 行と関係しない +- 一覧 I223 B1〜B4(`FILE=-`): 残す — bot の停止が解けるまで手を付けられない + +要件適合性: 受け入れ条件の範囲を超える仕様の追加なし。エッジケース: fix-loop のやり直し(②が増える)・close の最後の確認で BEHIND(`pr-base-sync.sh final` が送る)・CI の失敗(open に戻して commit だけ)・既コミット経路の plan-issue(docs のコミットで ①) + +セキュリティ影響なし(コードを変えない。手順書とテストだけ。秘密情報・認証の扱いを変えない。push を減らすだけで、push の宛先・保護ブランチの扱いは変えない)。P3/P5/P8 影響なし。P6 影響なし。P9 影響なし。 + +設計品質: 正を 1 か所にし、スキルは参照する。テストは合格=exit 0、FG つき。 + +Danger Ops(有無/手順/ロールバック): +- 無 diff --git a/docs/reviews/open/I224_review.md b/docs/reviews/open/I224_review.md new file mode 100644 index 00000000..106be6a2 --- /dev/null +++ b/docs/reviews/open/I224_review.md @@ -0,0 +1,32 @@ +# I224 レビュー: GitHub への書き込み(イシューの書き換え・コメント・push)の回数を絞り、短い間に集中しないようにする + +## 変更概要 +- push を要る 3 時点(下書き PR の作成・review-gate の CI 待ちの前・close の最後の確認の前)にまとめ、ほかの段階は手元のコミットだけにする +- イシュー本文の同期を grill-me の終わりの 1 回だけにする +- 同時に複数のセッションで書き込まない決まりを `workflow.md` に書く +- 押し戻しを決定論のテスト(`test_i224_push_points.sh`)で止める + +## 変更点 +- (実装後に記入) + +## 影響範囲 +- Backend/Frontend/DB: なし +- Config: `.claude/skills/` の 10 本・`docs/runbooks/workflow.md`・`docs/runbooks/worktree.md`・`docs/runbooks/plan-writing-rules.md`・`scripts/claude/tests/test_i224_push_points.sh`・`docs/reviews/backlog/I226.md` + +## テスト結果 +- 自動: (test-gate で記入) +- 手動: (test-gate で記入) + +## 計画との差分 +- (実装後に記入) + +## ロールバック +- PR を revert する + +## 自律判断の記録 +- [plan] 決まりの正を `workflow.md` の 1 節にし、スキルは参照だけにした — 写しを増やさない(I195) +- [plan] `STAGE_DONE: close NEXT: merge` を close の手順 3 のコミットに入れる — 結線のためだけの 4 回目の push を無くす +- [plan] PR へのレビューの記録のコメントは変えない — grill-me で決めた範囲(push・イシュー本文)の外で、PR でレビューを読む導線を変えるのは別の判断 +- [plan] この I224 の plan-issue〜implement は古いスキルのまま進め、push は手順が許す範囲でまとめる(docs と STAGE_DONE を 1 回で送る)— 計画レビューを通す前に新しい決まりで動かない + +STAGE_DONE: plan NEXT: plan-review diff --git a/docs/tests/open/I224_auto_test.md b/docs/tests/open/I224_auto_test.md new file mode 100644 index 00000000..cbec5892 --- /dev/null +++ b/docs/tests/open/I224_auto_test.md @@ -0,0 +1,40 @@ + + +# I224 自動テスト: GitHub への書き込み(イシューの書き換え・コメント・push)の回数を絞り、短い間に集中しないようにする + +実行コマンド(例): 下の「決定論ゲート(自動実走)」のコマンド(pytest・Jest・E2E は対象外。アプリのコードを変えない) + +結果: +- backend: 対象外 +- frontend: 対象外 + +## テストケース + +| TC | 対象 | 中身と期待値(合格=exit 0) | 失敗の注入(FG) | +|---|---|---|---| +| TC-01 | 既存のハーネステスト | CI の Harness Tests(`run-all.sh`)が全 PASS。手元では流し直さない(CI が正) | 既存のテストの FG のまま | +| TC-02 | 書き込みの時点(`test_i224_push_points.sh`) | P1: `plan-issue`・`review-gate`・`close` 以外のスキルに `commit/push`・`commit・push`・`コミット・push`・`git push` が無い。P2: 行の先頭の `git push` が `plan-issue` 2・`review-gate` 1・`close` 1。P3: `gh issue edit` は `grill-me` だけ。P4: `workflow.md` に「## GitHub への書き込みの時点」がある。スクリプト全体が `fail=0` で exit 0 | テストの中で一時フォルダの写しを壊す: `retro` に `commit/push` を足す(P1 NG)・`review-gate` の `git push` を 2 行にする(P2 NG)・`retro` に `gh issue edit` を足す(P3 NG)・節の見出しを消す(P4 NG) | +| TC-03 | 同時書き込みの決まり | `workflow.md` に「同時に複数のセッションで」の語がある(下の `grep -q` が exit 0) | 実装前は exit 1(下の記録) | +| TC-04 | 構文 | `test_i224_push_points.sh` の `bash -n` が exit 0 | — | + +## 実行記録 + +| 日時 | TC | 結果 | メモ | +|---|---|---|---| +| 2026-11-07 | TC-03(実装前) | 期待どおり NG | `workflow.md` に「GitHub への書き込みの時点」「同時に複数のセッションで」が無い(どちらも exit 1) | +| 2026-11-07 | TC-02(実装前の数え) | — | 行の先頭の `git push`: `plan-issue` 2・`review-gate` 0・`close` 1。`gh issue edit` は `grill-me` だけ。テストは実装前のため未作成 | +| 2026-11-07 | TC-01・TC-02・TC-04 | 実装前のため未実行 | | + +## 決定論ゲート(自動実走) +```bash +bash scripts/claude/tests/test_i224_push_points.sh +grep -q 同時に複数のセッションで docs/runbooks/workflow.md +bash -n scripts/claude/tests/test_i224_push_points.sh +``` diff --git a/docs/tests/open/I224_manual_test.md b/docs/tests/open/I224_manual_test.md new file mode 100644 index 00000000..4ed22f01 --- /dev/null +++ b/docs/tests/open/I224_manual_test.md @@ -0,0 +1,14 @@ + + +# I224 手動テスト: GitHub への書き込み(イシューの書き換え・コメント・push)の回数を絞り、短い間に集中しないようにする + +| No | 手順 | 期待結果 | 実施者 | 実結果 | 備考 | +|---:|------|----------|--------|--------|------| +| M-01 | I224 自身のブランチへの push の回数を数える: `git reflog show --date=iso refs/remotes/origin/feature/I224-batch-github-writes`(test-gate で数え、close の後にもう一度数えて retro・close の報告に書く) | implement の後(新しいスキルで動く review-gate〜close)の `update by push` が 3 回以内(review-gate の前 1・fix-loop のやり直しごとに +1・close 1・BEHIND のときの取り込み +1)。review-gate の CI 待ちが `CI_WAIT: OK` で通っている(push を前提にする確認が壊れていない) | Claude | | plan-issue〜implement は古いスキルで動くので数に入れない(区切りは implement の結線のコミット) | +| M-02 | 新しいスキルを読み、段階の終わりの指示を確かめる: `review-gate` の「## 1.」の最初に `git push`、`test-gate`・`retro` の結線に push が無い、`close` の手順 3 のコミットに `STAGE_DONE: close NEXT: merge` が入る | 3 点とも計画 4-2 のとおり | Claude | | TC-02 の P1・P2 で数は機械的に確かめる。ここは流れとして読めるか | + +結論: OK / NG From 9516e1f6ce28d0ffdeccc28b1a0e39d4a3196e73 Mon Sep 17 00:00:00 2001 From: "osushi0404-claude[bot]" <352511081+osushi0404-claude[bot]@users.noreply.github.com> Date: Sat, 7 Nov 2026 22:15:55 +0900 Subject: [PATCH 03/11] =?UTF-8?q?docs(I224):=20plan-review=20=E8=A8=98?= =?UTF-8?q?=E9=8C=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reviews/I224_plan_review_20261107_2215.md | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 docs/reviews/I224_plan_review_20261107_2215.md diff --git a/docs/reviews/I224_plan_review_20261107_2215.md b/docs/reviews/I224_plan_review_20261107_2215.md new file mode 100644 index 00000000..ee346069 --- /dev/null +++ b/docs/reviews/I224_plan_review_20261107_2215.md @@ -0,0 +1,29 @@ +# 計画書レビュー [I224] ── [2026-11-07 12:00] + +## 判定: ✅ 完了 + +## レビュー指摘一覧 +| 重大度 | 観点 | 指摘内容 | 該当箇所 | 対応 | +|--------|------|---------|---------|------| +| Warning | P1 | 受け入れ条件3の実測が、イシューの書き方と食い違う。イシューは「I224 の次のイシュー1本で実測して示す」とする。計画書はその実測をマージ後の retro に送り、この PR では I224 自身の review-gate〜close の回数で代える。イシューの条件が、この PR のクローズ時点では未達のまま残る。次の retro で測るという記録は、メモリと close の報告にしか無い。 | plan §2 条件3・§9 | 次のイシューの実測を、追跡できるものに残す。例は `docs/reviews/backlog/I224.md` への追記や、既存イシューへの同梱。 | +| Warning | P5・P1 | 計画書は `STAGE_DONE: close NEXT: merge` を、close の手順3のコミットに前倒しする。手順3は CI 確認(`pr-base-sync.sh final`・CI 待ち)より前にあたる。close が途中で中断すると、`/proceed` は「merge 待ち」と読んで確認を飛ばすおそれがある。CI 失敗時は後の行が勝つ設計で救えるが、中断のケースは §8 に無い。 | plan 4-2 close・§8 | 中断時の扱いを §8 に1行足す。例は「`flow-stage.sh` は merge でも `pr-base-sync.sh final` の合格記録を見る」など。または、結線の位置を確認の直後に置く案も検討する。 | +| Warning | P4 | P2 は行頭の `git push` の本数を固定する。通常の手順の書き換えで本数が変わるときは、テストも一緒に直す必要がある。「ふつうの書き方の事故」を止める目的には合う。ただし、意図的な変更でも落ちるので、落ちたときの直し方(正は workflow.md の節)をテストの失敗メッセージに書いておくとよい。 | plan 4-4 P2 | 失敗時のメッセージに workflow.md の節を指す1行を入れる。 | +| Info | P1 | イシューの現状の問題には「plan-issue での同期」とある。しかし実際には `gh issue edit` は `grill-me/SKILL.md:62` にしか無い。plan-issue 側の変更は「同期しない旨を1行足す」だけで足りる。計画書の扱いは妥当。 | plan 4-2 plan-issue | 対応は任意。 | +| Info | P5 | PR へのレビューコメント(1本で2〜5回)は変えない、と §9 に理由つきで記録されている。ただし GitHub への書き込みという目的に対しては、残る書き込みの量になる。retro で push 回数と並べてコメント回数も測れば、次の判断の材料になる。 | plan §9 | M-01 の記録にコメント回数も添える。 | + +観点ごとの確認結果: +- **P1(要件適合性)**: 要件の範囲は設計確認メモと一致している。エッジケース(fix-loop のやり直し・BEHIND・CI 失敗・既コミット経路)も触れられている。 +- **ベストプラクティス**: 正を `workflow.md` の1か所に置き、各スキルは参照にする設計で、写しを増やさない。消費箇所は grep で全件列挙されている。実際に `close` の 125・144・165・168 行を確認し、計画書の行番号と一致した。検証コマンドは単体形で、複合化の問題は無い。破壊的な取り消しも無い。 +- **外部挙動依存**: `CI_WAIT: NOT_PUSHED` は既存の決定論の守りに依存している。GitHub の上限の数字は計画が依存しないと明記しており、問題なし。 +- **セキュリティ・P3・P9**: 対象外。コードを変えず、手順書とテストだけを変更する。 +- **Claude Code ベストプラクティス**: スキルの変更は「commit/push」から「commit」への書き換えが中心。条件分岐の追加は close の失敗時の戻しだけで、最後の行が勝つ規則と整合している(P2 の消費箇所も `close` 165 行で対応済み)。 +- **P4(テスト妥当性)**: 合否は exit 0 基準。FG(失敗の注入)が一時フォルダの写しでテストの中にあり、false-green を避けている。TC-03 は実装前に exit 1 を確認済み。決定論テストの対象選びは §9 で2問に照らして説明されている。 +- **P8**: 新しい安全装置の追加ではなく、書き込みを減らす変更。最後の守りは GitHub。ローカルでの精密な文字列判定は P1〜P3 の単純な規則のみで、問題なし。 +- **「必ず確かめる項目」の節**: 高リスクではないので不要。 + +## 高リスク判定 +判定: No +該当条件: なし(変更対象は `.claude/skills/`・runbook・`scripts/claude/tests/` のみ。GitHub から復旧できない例外のファイルは含まない。ハーネスだけの変更なので、アプリの条件では Yes にしない) +推奨: 実装(implement 段階)へ。 + +VERDICT: OK From 2af0dd68f2df324c8d31b43e168eacf3c7330553 Mon Sep 17 00:00:00 2001 From: "osushi0404-claude[bot]" <352511081+osushi0404-claude[bot]@users.noreply.github.com> Date: Sat, 7 Nov 2026 22:16:46 +0900 Subject: [PATCH 04/11] =?UTF-8?q?docs(I224):=20plan-review=20OK=E3=83=BB?= =?UTF-8?q?=E6=8C=87=E6=91=98=E3=82=92=E5=8F=8D=E6=98=A0=E3=83=BBSTAGE=5FD?= =?UTF-8?q?ONE=20plan-review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/plans/open/plan_I224.md | 11 +++++++++-- docs/reviews/open/I224_review.md | 2 ++ docs/tests/open/I224_manual_test.md | 4 ++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/docs/plans/open/plan_I224.md b/docs/plans/open/plan_I224.md index f3155ffd..389b7d51 100644 --- a/docs/plans/open/plan_I224.md +++ b/docs/plans/open/plan_I224.md @@ -67,7 +67,7 @@ - `test-gate`: 63 行を「commit」に - `retro`: 168・178 行を「commit」に(起票・既存イシューへのコメントはそのまま) - `close`: 手順 3 の commit の前に `STAGE_DONE: close NEXT: merge` を足して、このコミットで送る(③)。手順 6 は「結線は手順 3 で済み。マージ依頼だけ」に。165 行の CI 失敗の戻し(open へ戻す)は「commit/push」→「commit」(次の review-gate が送る)。このとき最後の行が `STAGE_DONE: close NEXT: fix-loop` になるので、手順 3 の `close NEXT: merge` より後の行が勝つ(`flow-stage.sh` は最後の行を読む) -- `proceed`: 15 行の「commit/push」を「commit」に +- `proceed`: 15 行の「commit/push」を「commit」に。表の `merge` の行(close がマージを依頼済み)に「依頼を伝える前に `bash scripts/claude/pr-base-sync.sh final` を流し、exit 0 のときだけ依頼する(0 以外は close の手順 5.5 と同じに扱う)」を足す(計画レビューの Warning 2: `close NEXT: merge` を手順 3 に前倒しするので、close が最後の確認の前に中断しても、再開で確認を飛ばさない) ### 4-3. `docs/runbooks/worktree.md`・`docs/runbooks/plan-writing-rules.md` - `worktree.md:82`「コミット・push する」→「コミットする」 @@ -83,6 +83,7 @@ - P4: `docs/runbooks/workflow.md` に「## GitHub への書き込みの時点」の節がある(P1〜P3 の決まりの正) - FG: 一時フォルダの写しに `commit/push` を足す・`review-gate` の `git push` を 2 つにする・`retro` に `gh issue edit` を足す・節の見出しを消す → それぞれ落ちる(テストの中で確かめる) - 引数でルートを渡せる形にする(写しで FG を流すため) +- 不合格のときは、どの決まりか(P1〜P4)・ファイル・行と、「決まりの正は `docs/runbooks/workflow.md`「GitHub への書き込みの時点」。push の時点を意図して変えるなら、その節とこのテストの数を一緒に直す」を出す(計画レビューの Warning 3) ### 4-5. `docs/reviews/backlog/I226.md` - 同梱した F2 の行を消す @@ -118,7 +119,7 @@ Claude が決めた(技術的な選択と理由): - **決まりの正は `workflow.md` の 1 節、スキルは参照だけ**(仮定・技術的): 写しを増やさない(I195 の方針) - **`STAGE_DONE: close NEXT: merge` を close の手順 3 のコミットに入れる**(仮定・技術的): 手順 6 の結線のためだけの push(4 回目)を無くす。失敗時は後の行が勝つ - **決定論のテスト P1〜P3 を足す**(仮定・技術的): `plan-writing-rules.md`「決定論テストの対象の選び方」の 2 問 — 普通の書き方(他のスキルの写し)で気づかずに壊しうる/壊れても CI・画面・すぐ後の作業で気づけない(push が増えるだけ)、被害は停止の再発で大きい → 作る。P4(節の有無)は意図的な変更でしか消えないが、P1〜P3 の決まりの正を指すため 1 行だけ置く -- **受け入れ条件 3 の「次のイシュー 1 本の実測」は、マージの後に次のイシューの retro で行う**(イシューに明記・grill-me): この PR の中では I224 自身の review-gate〜close の回数(3 回以内の見込み)で代わりに示す。次のイシューの retro で測ることをメモリと I224 の close の報告に書く +- **受け入れ条件 3 の「次のイシュー 1 本の実測」は、マージの後に次のイシューの retro で行う**(イシューに明記・grill-me): grill-me で「I224 の次に進めるイシュー 1 本で実測して達成を確かめる(I224 自身でも測って記録する)」と決めたので、この PR の close の時点では、受け入れ条件 3 のうち I224 自身の分(implement より後の review-gate〜close の回数・3 回以内の見込み)だけを満たし、次のイシューの分は未達のまま残る(計画レビューの Warning 1)。取りこぼさないよう、次のイシューの計画(`/plan-issue`)の「確定事項と自律判断」に測ることを書くよう、I224 の close の報告とメモリに残す。M-01 では push の回数に加え、PR へのコメントの回数(`gh pr view --json comments,reviews` の件数)も並べて記録する(Info 2・次の判断の材料) - **PR へのコメント(レビューの記録)は変えない**(仮定・技術的〜範囲): grill-me で決めた範囲(push・イシュー本文)の外で、PR でレビューを読む導線を変えるのは別の判断。1 本で 2〜5 回・push の直後に続くことは記録に残す - **GitHub の上限の正確な数字は確かめない**(仮定・技術的): 計画は数字に依存しない - 要件・基本設計・UI/UX の仮定: なし @@ -139,3 +140,9 @@ Claude が決めた(技術的な選択と理由): Danger Ops(有無/手順/ロールバック): - 無 + +## 計画変更記録 +1. 計画レビュー(20261107_2215・OK)への対応: Warning 1(受け入れ条件 3 の次のイシュー分はこの PR の close の時点で未達と明記し、次の計画で測るよう報告とメモリに残す)・Warning 2(`proceed` の `merge` で依頼の前に `pr-base-sync.sh final` を流す)・Warning 3(テストの失敗の文に正の節と直し方を出す)・Info 2(M-01 で PR へのコメントの回数も並べる)を反映。計画レビューのやり直し: 不要(方式・範囲・受け入れ条件は変えない。Warning 2 の `proceed` の 1 行は、前倒しの安全網で範囲の中) + +## レビュー結果 +- [20261107_2215 判定: ✅ 完了](../../reviews/I224_plan_review_20261107_2215.md) diff --git a/docs/reviews/open/I224_review.md b/docs/reviews/open/I224_review.md index 106be6a2..23c57dbe 100644 --- a/docs/reviews/open/I224_review.md +++ b/docs/reviews/open/I224_review.md @@ -28,5 +28,7 @@ - [plan] `STAGE_DONE: close NEXT: merge` を close の手順 3 のコミットに入れる — 結線のためだけの 4 回目の push を無くす - [plan] PR へのレビューの記録のコメントは変えない — grill-me で決めた範囲(push・イシュー本文)の外で、PR でレビューを読む導線を変えるのは別の判断 - [plan] この I224 の plan-issue〜implement は古いスキルのまま進め、push は手順が許す範囲でまとめる(docs と STAGE_DONE を 1 回で送る)— 計画レビューを通す前に新しい決まりで動かない +- [plan-review] PLAN_VERDICT: OK(20261107_2215)。Warning 3 件・Info 1 件を計画書・テスト文書に反映し、再レビューはしない — 方式・範囲・受け入れ条件を変えない追記だけ(計画変更記録 1) STAGE_DONE: plan NEXT: plan-review +STAGE_DONE: plan-review NEXT: implement diff --git a/docs/tests/open/I224_manual_test.md b/docs/tests/open/I224_manual_test.md index 4ed22f01..79ae45a0 100644 --- a/docs/tests/open/I224_manual_test.md +++ b/docs/tests/open/I224_manual_test.md @@ -8,7 +8,7 @@ | No | 手順 | 期待結果 | 実施者 | 実結果 | 備考 | |---:|------|----------|--------|--------|------| -| M-01 | I224 自身のブランチへの push の回数を数える: `git reflog show --date=iso refs/remotes/origin/feature/I224-batch-github-writes`(test-gate で数え、close の後にもう一度数えて retro・close の報告に書く) | implement の後(新しいスキルで動く review-gate〜close)の `update by push` が 3 回以内(review-gate の前 1・fix-loop のやり直しごとに +1・close 1・BEHIND のときの取り込み +1)。review-gate の CI 待ちが `CI_WAIT: OK` で通っている(push を前提にする確認が壊れていない) | Claude | | plan-issue〜implement は古いスキルで動くので数に入れない(区切りは implement の結線のコミット) | -| M-02 | 新しいスキルを読み、段階の終わりの指示を確かめる: `review-gate` の「## 1.」の最初に `git push`、`test-gate`・`retro` の結線に push が無い、`close` の手順 3 のコミットに `STAGE_DONE: close NEXT: merge` が入る | 3 点とも計画 4-2 のとおり | Claude | | TC-02 の P1・P2 で数は機械的に確かめる。ここは流れとして読めるか | +| M-01 | I224 自身のブランチへの push の回数を数える: `git reflog show --date=iso refs/remotes/origin/feature/I224-batch-github-writes`(test-gate で数え、close の後にもう一度数えて retro・close の報告に書く) | implement の後(新しいスキルで動く review-gate〜close)の `update by push` が 3 回以内(review-gate の前 1・fix-loop のやり直しごとに +1・close 1・BEHIND のときの取り込み +1)。review-gate の CI 待ちが `CI_WAIT: OK` で通っている(push を前提にする確認が壊れていない)。PR へのコメントの回数(`gh pr view 420 --json comments,reviews` の件数)も並べて記録する | Claude | | plan-issue〜implement は古いスキルで動くので数に入れない(区切りは implement の結線のコミット) | +| M-02 | 新しいスキルを読み、段階の終わりの指示を確かめる: `review-gate` の「## 1.」の最初に `git push`、`test-gate`・`retro` の結線に push が無い、`close` の手順 3 のコミットに `STAGE_DONE: close NEXT: merge` が入る、`proceed` の `merge` の行が依頼の前に `pr-base-sync.sh final` を流す | 4 点とも計画 4-2 のとおり | Claude | | TC-02 の P1・P2 で数は機械的に確かめる。ここは流れとして読めるか | 結論: OK / NG From f22d4d23b30e7d629f7223278c54b0dff3b081a0 Mon Sep 17 00:00:00 2001 From: "osushi0404-claude[bot]" <352511081+osushi0404-claude[bot]@users.noreply.github.com> Date: Sat, 7 Nov 2026 22:27:58 +0900 Subject: [PATCH 05/11] =?UTF-8?q?feat(I224):=20push=20=E3=82=92=203=20?= =?UTF-8?q?=E6=99=82=E7=82=B9=E3=81=AB=E3=81=BE=E3=81=A8=E3=82=81=E3=80=81?= =?UTF-8?q?=E3=81=BB=E3=81=8B=E3=81=AE=E6=AE=B5=E9=9A=8E=E3=81=AF=E3=82=B3?= =?UTF-8?q?=E3=83=9F=E3=83=83=E3=83=88=E3=81=A0=E3=81=91=E3=81=AB=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=83=BB=E6=B1=BA=E3=81=BE=E3=82=8A=E3=81=AE=E6=8A=BC?= =?UTF-8?q?=E3=81=97=E6=88=BB=E3=81=97=E3=82=92=E6=B1=BA=E5=AE=9A=E8=AB=96?= =?UTF-8?q?=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E3=81=A7=E6=AD=A2=E3=82=81?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .claude/skills/close/SKILL.md | 9 +- .../skills/design-security-review/SKILL.md | 2 +- .claude/skills/fix-loop/SKILL.md | 2 +- .claude/skills/implement/SKILL.md | 8 +- .claude/skills/plan-issue/SKILL.md | 6 +- .claude/skills/plan-review/SKILL.md | 6 +- .claude/skills/proceed/SKILL.md | 4 +- .claude/skills/retro/SKILL.md | 6 +- .claude/skills/review-gate/SKILL.md | 14 +++- .claude/skills/test-gate/SKILL.md | 2 +- docs/plans/open/plan_I224.md | 3 +- docs/reviews/backlog/I226.md | 1 - docs/reviews/open/I224_review.md | 15 +++- docs/runbooks/plan-writing-rules.md | 4 +- docs/runbooks/workflow.md | 17 +++- docs/runbooks/worktree.md | 4 +- docs/tests/open/I224_auto_test.md | 5 +- .../tests/fixtures/i185/fix_loop_return.txt | 2 +- .../i185/plan_issue_continue_section.txt | 4 +- scripts/claude/tests/test_i224_push_points.sh | 82 +++++++++++++++++++ 20 files changed, 155 insertions(+), 41 deletions(-) create mode 100644 scripts/claude/tests/test_i224_push_points.sh diff --git a/.claude/skills/close/SKILL.md b/.claude/skills/close/SKILL.md index da5f07d5..3d4de381 100644 --- a/.claude/skills/close/SKILL.md +++ b/.claude/skills/close/SKILL.md @@ -122,7 +122,8 @@ user-invocable: false )" ``` テンプレートが存在しない場合は「目的/変更点/テスト/ロールバック/参照パス」を手動で記載する。 -3) commit/push して PR を更新する。 +3) commit して送り、PR を更新する(`docs/runbooks/workflow.md`「GitHub への書き込みの時点」の 3)。 + commit の前に、`docs/reviews/closed/I###_review.md` の「## 自律判断の記録」に close の分を書き、末尾に `STAGE_DONE: close NEXT: merge` を足す。 **staging は close 対象の I### 関連ファイルに限定する**(step 1 の `git mv` で移動した issue/plan/tests/reviews と、完了情報追記などで編集した追跡済みファイルのみ)。 ```bash # 追跡済みファイルの変更(git mv 済みの move・完了情報追記)だけを staging する。 @@ -162,10 +163,10 @@ user-invocable: false `oshui0404` だけの設定のため(main には CODEOWNERS が無い・`docs/runbooks/branch-protection-setup.md`)、 承認前の正常な最終状態は BLOCKED=CI 全緑・承認待ちのみ)。 - exit 0 → step 6 のマージ依頼へ進む - - exit 1 → 原因を見て直す。マージコンフリクトは step 0 と同じ扱い。DRAFT 残留は step 5 をやり直す。CI fail は、記録を 1 か所に保つため、step 1 で closed へ移したこのイシューの記録(`docs/issues/closed/I###.md`・`docs/plans/closed/plan_I###*.md`・`docs/tests/closed/I###_*.md`・`docs/reviews/closed/I###_review.md`)を `git mv` で open へ戻し(計画書のレビュー結果のリンクも step 1 の逆に戻す)、commit/push してから、`docs/reviews/open/I###_review.md` の末尾に `STAGE_DONE: close NEXT: fix-loop` を書いて終わる(後の段階は open の記録を読み書きする) + - exit 1 → 原因を見て直す。マージコンフリクトは step 0 と同じ扱い。DRAFT 残留は step 5 をやり直す。CI fail は、記録を 1 か所に保つため、step 1 で closed へ移したこのイシューの記録(`docs/issues/closed/I###.md`・`docs/plans/closed/plan_I###*.md`・`docs/tests/closed/I###_*.md`・`docs/reviews/closed/I###_review.md`)を `git mv` で open へ戻し(計画書のレビュー結果のリンクも step 1 の逆に戻す)、`docs/reviews/open/I###_review.md` の末尾に `STAGE_DONE: close NEXT: fix-loop` を足して commit して終わる(push しない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」) - exit 2 → mergeStateStatus=UNKNOWN が継続。1 回だけ実行し直し、続けば報告に書いて step 6 へ進む -6) 結線とマージ依頼(必須): - - `docs/reviews/closed/I###_review.md` の末尾に `STAGE_DONE: close NEXT: merge` を足して commit/push する +6) マージ依頼(必須。ここではコミット・push しない): + - 手順 3 の後に分かったこと(最後の確認の結果など)は、記録に足さず依頼の報告に書く - ユーザーへ GitHub 上で Approve & Merge を依頼する(承認とマージはユーザー `oshui0404` だけが行える。 承認の後に develop への追従などでコミットが入ると承認は取り消されるため、その場合は再承認を依頼する)。 手動テスト文書に、承認の後・マージの前に行う確認がある場合は、まず承認だけを依頼し、その確認を終えてからマージを依頼する。そのような確認がない場合は、承認とマージを一度に依頼する。 diff --git a/.claude/skills/design-security-review/SKILL.md b/.claude/skills/design-security-review/SKILL.md index 06c37338..b88ff0ef 100644 --- a/.claude/skills/design-security-review/SKILL.md +++ b/.claude/skills/design-security-review/SKILL.md @@ -138,7 +138,7 @@ disallowed-tools: Write, NotebookEdit 2. 直すには要件・基本設計・UI/UX を変える必要があるとき、または直し方が無いときだけ止める(止める条件 1・3)。`STAGE_DONE:` は書かない **Blocker がない場合**: -`docs/reviews/open/$ARGUMENTS_review.md` の末尾に次の 1 行を足して commit/push する(Write は使えないので Edit で足す): +`docs/reviews/open/$ARGUMENTS_review.md` の末尾に次の 1 行を足して commit する(Write は使えないので Edit で足す。push はしない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」): ``` STAGE_DONE: design-security-review NEXT: implement ``` diff --git a/.claude/skills/fix-loop/SKILL.md b/.claude/skills/fix-loop/SKILL.md index f722be4f..0c73da8d 100644 --- a/.claude/skills/fix-loop/SKILL.md +++ b/.claude/skills/fix-loop/SKILL.md @@ -61,7 +61,7 @@ user-invocable: false - 次回どう防ぐか - 確かめた結果(手順6 で流したテストと結果) -8) 結線(必須・戻り先は 1 か所): commit/push してから、`docs/reviews/open/$ARGUMENTS_review.md` の末尾に次の 1 行を足して commit/push する。どの NG(レビュー・CI・テスト・人の手動テスト)から来たときも同じで、直した後は必ず review-gate が差分のレビューで見直す +8) 結線(必須・戻り先は 1 か所): commit してから、`docs/reviews/open/$ARGUMENTS_review.md` の末尾に次の 1 行を足して commit する(push しない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」)。どの NG(レビュー・CI・テスト・人の手動テスト)から来たときも同じで、直した後は必ず review-gate が差分のレビューで見直す ``` STAGE_DONE: fix-loop NEXT: review-gate ``` diff --git a/.claude/skills/implement/SKILL.md b/.claude/skills/implement/SKILL.md index e0275bff..3f8fb1cf 100644 --- a/.claude/skills/implement/SKILL.md +++ b/.claude/skills/implement/SKILL.md @@ -90,11 +90,11 @@ DB変更なし・外部API/非同期処理なし・フロントエンド変更 - ビルド確認: react-scripts build(型エラーが出た場合は修正してから次のステップへ) - 修正対象の警告・エラーがある場合は修正してから次のステップへ - **例外 — 新規 pre-commit フックを `.pre-commit-config.yaml` に追加した場合**: `pre-commit run --all-files` を実行し、スコープ内の既存ファイル全体が hook を PASS することを確認してからコミットする(commit 時の自動実行はステージ済みファイルのみを対象とするため、既存ファイルの違反は自動では検出されない) -3) commit/push して PR を更新 +3) commit する(push しない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」) 3.5) **完了前の反映検証(必須)**: - - 結線の**前に** `git diff origin/develop...HEAD --name-only` を確認し、計画書の実装対象に対応する**意図した変更ファイルがブランチに反映されている**ことを検証する。 - - 意図した変更ファイルが現れない場合(作業ツリーにあるだけで未コミット、または未 push の可能性)は、commit/push し直してから確かめ直す。それでも現れないときは原因を記録して止める(止める条件 3)。空 diff のまま review-gate に渡すと「未実装/Blocker」誤判定になるため、この安全ゲートを必ず通す。 -4) 結線(必須): `docs/reviews/open/$ARGUMENTS_review.md` の末尾に次の 1 行を足して commit/push する(修正の後のレビューのやり直しは、fix-loop が必ず review-gate に戻すことで行う) + - 結線の**前に** `git diff origin/develop...HEAD --name-only` を確認し、計画書の実装対象に対応する**意図した変更ファイルがブランチ(手元のコミット)に反映されている**ことを検証する。 + - 意図した変更ファイルが現れない場合(作業ツリーにあるだけで未コミットの可能性)は、commit し直してから確かめ直す。それでも現れないときは原因を記録して止める(止める条件 3)。空 diff のまま review-gate に渡すと「未実装/Blocker」誤判定になるため、この安全ゲートを必ず通す。 +4) 結線(必須): `docs/reviews/open/$ARGUMENTS_review.md` の末尾に次の 1 行を足して commit する(修正の後のレビューのやり直しは、fix-loop が必ず review-gate に戻すことで行う) ``` STAGE_DONE: implement NEXT: review-gate ``` diff --git a/.claude/skills/plan-issue/SKILL.md b/.claude/skills/plan-issue/SKILL.md index d6ee342b..dc66e8cd 100644 --- a/.claude/skills/plan-issue/SKILL.md +++ b/.claude/skills/plan-issue/SKILL.md @@ -79,7 +79,7 @@ EOF --base develop ``` -Draft PR 番号をイシューファイルの「## 関連資料」セクションに追記する: +Draft PR 番号をイシューファイルの「## 関連資料」セクションに追記する(手元のファイルだけ。GitHub のイシュー本文は同期しない。push は上の 2 の 1 回だけで、この後の段階は手元でコミットだけ・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」): ``` - Draft PR: #XX ``` @@ -186,8 +186,8 @@ grep -rnF -e "FILE=<実装対象のパス1> |" -e "FILE=<実装対象のパス2> **この先へ続ける(必須・止まらない)** 上の文書品質ゲートを満たしたら、ユーザーの入力を待たずに先へ進む(計画の承認は待たない。計画は plan-review 段階のレビューで確かめる)。 -1. 計画書・テスト文書・レビュー文書を commit/push する。 -2. `docs/reviews/open/$ARGUMENTS_review.md` の末尾に次の 1 行を足して commit/push する: +1. 計画書・テスト文書・レビュー文書を commit する(push しない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」)。 +2. `docs/reviews/open/$ARGUMENTS_review.md` の末尾に次の 1 行を足して commit する: ``` STAGE_DONE: plan NEXT: plan-review ``` diff --git a/.claude/skills/plan-review/SKILL.md b/.claude/skills/plan-review/SKILL.md index eeb3c254..86586821 100644 --- a/.claude/skills/plan-review/SKILL.md +++ b/.claude/skills/plan-review/SKILL.md @@ -11,7 +11,7 @@ user-invocable: false ## 1. レビュー -計画書・テスト文書・レビュー文書を commit/push してから、Bash ツールの `run_in_background: true` で実行し、完了の通知で結果を受け取る(レビュー役に最大 900 秒〔`REVIEW_TIMEOUT`〕を許すので、前面の実行の上限 10 分を超えうる): +計画書・テスト文書・レビュー文書を commit してから(レビュー役は手元のファイルを読む。push はしない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」)、Bash ツールの `run_in_background: true` で実行し、完了の通知で結果を受け取る(レビュー役に最大 900 秒〔`REVIEW_TIMEOUT`〕を許すので、前面の実行の上限 10 分を超えうる): ```bash bash scripts/claude/plan-issue-review.sh "$ARGUMENTS" @@ -25,14 +25,14 @@ bash scripts/claude/plan-issue-review.sh "$ARGUMENTS" 1. `PLAN_VERDICT: OK` → 3. で `NEXT: implement` 2. `PLAN_VERDICT: HIGHRISK` → 3. で `NEXT: design-security-review` -3. `PLAN_VERDICT: BLOCKER` → 指摘を計画書・テスト文書に Edit で直し、commit/push して 1. を実行し直し、その結果で 1〜3 を判定し直す +3. `PLAN_VERDICT: BLOCKER` → 指摘を計画書・テスト文書に Edit で直し、commit して 1. を実行し直し、その結果で 1〜3 を判定し直す - 同じゲートで 2 回続けて BLOCKER なら、止める条件 3 に当たるかを判定する。範囲を狭める・別イシューに切り出すなど安全側の選択肢が取れれば、それを選んで計画書を直し、記録に書いてもう一度 1. を実行する。取れなければ止める - 直すのに要件・基本設計・UI/UX の判断が要る指摘は、選択肢をつけてユーザーに聞いて止める(止める条件 1) - Warning・Info は、直せるものは直す。直した内容が方式・範囲・受け入れ条件を変えないなら、計画変更記録に 1 行書いて再レビューはしない ## 3. 結線(必須) -スクリプトが計画書に追記したレビュー記録へのリンクを含めて commit/push し、`docs/reviews/open/$ARGUMENTS_review.md` の末尾に 1 行足して commit/push する: +スクリプトが計画書に追記したレビュー記録へのリンクを含めて commit し、`docs/reviews/open/$ARGUMENTS_review.md` の末尾に 1 行足して commit する(push しない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」): - `STAGE_DONE: plan-review NEXT: implement`(OK) - `STAGE_DONE: plan-review NEXT: design-security-review`(HIGHRISK) - 止める条件に当たって止まるときは `STAGE_DONE:` を書かない diff --git a/.claude/skills/proceed/SKILL.md b/.claude/skills/proceed/SKILL.md index 33bb20fd..4ae2f9b1 100644 --- a/.claude/skills/proceed/SKILL.md +++ b/.claude/skills/proceed/SKILL.md @@ -12,7 +12,7 @@ argument-hint: "I###" 1. 最後の `STAGE_DONE:` が `NEXT: human-test` であることを `flow-stage.sh` で確かめる(違えば、返信を結果として扱わず、1. へ進む) 2. 返信の結果を `docs/tests/open/$ARGUMENTS_manual_test.md` の Human の行の「実結果」に書く -3. 全部 OK なら `STAGE_DONE: human-test NEXT: retro`、NG が 1 つでもあれば NG の内容を記録して `STAGE_DONE: human-test NEXT: fix-loop` を `docs/reviews/open/$ARGUMENTS_review.md` の末尾に足して commit/push する +3. 全部 OK なら `STAGE_DONE: human-test NEXT: retro`、NG が 1 つでもあれば NG の内容を記録して `STAGE_DONE: human-test NEXT: fix-loop` を `docs/reviews/open/$ARGUMENTS_review.md` の末尾に足して commit する(push しない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」) (NG の後は fix-loop → review-gate → test-gate と進み、人の手動テストをもう一度依頼して止まる) ## 1. 次の段階を決める @@ -32,6 +32,6 @@ bash scripts/claude/flow-stage.sh "$ARGUMENTS" |---|---| | `plan-review`・`design-security-review`・`implement`・`review-gate`・`fix-loop`・`test-gate`・`retro`・`close` | Skill ツールで同じ名前のスキルを呼ぶ(引数 `$ARGUMENTS`) | | `human-test` | `docs/tests/open/$ARGUMENTS_manual_test.md` の Human の項目と、ここまでの「## 自律判断の記録」の要点を平易に提示し、「結果(OK、または NG と内容)を返信してください」と伝えて止まる | -| `merge` | close 段階がマージを依頼済み。「GitHub で Approve & Merge をお願いします」と伝えて止まる | +| `merge` | `bash scripts/claude/pr-base-sync.sh final` を流し、exit 0 のときだけ「GitHub で Approve & Merge をお願いします」と伝えて止まる。0 以外は close の手順 5.5 と同じに扱う | 段階のスキルが `STAGE_DONE:` を書かずに終わった(止める条件に当たって止まった)ときは、1. に戻らずにそのまま止まる(同じ段階を繰り返し呼ばない)。見分け方: 段階を呼ぶ前と後で `flow-stage.sh` の出力の `STAGE_COUNT:`(`STAGE_DONE:` 行の数)が増えていなければ、書かれていない(`LAST_LINE:` の行番号は、自律判断の記録に行を足すだけでずれるので見分けに使わない)。 diff --git a/.claude/skills/retro/SKILL.md b/.claude/skills/retro/SKILL.md index 3da83879..2d1557de 100644 --- a/.claude/skills/retro/SKILL.md +++ b/.claude/skills/retro/SKILL.md @@ -155,7 +155,7 @@ user-invocable: false ```bash bash scripts/claude/code-review.sh --route issue $ARGUMENTS ``` - - **一覧**: それ以外(Low、または再現なし)。イシューにせず、出力の行をそのまま `docs/reviews/backlog/$ARGUMENTS.md`(起点のイシューごとに 1 ファイル。無ければ作り、見出しは `docs/reviews/backlog/I206.md` と同じ形で「記録:」に標準エラーの記録のパスを書く)に貼り、手順 4 の「このイシューで直す」と同じく commit/push する: + - **一覧**: それ以外(Low、または再現なし)。イシューにせず、出力の行をそのまま `docs/reviews/backlog/$ARGUMENTS.md`(起点のイシューごとに 1 ファイル。無ければ作り、見出しは `docs/reviews/backlog/I206.md` と同じ形で「記録:」に標準エラーの記録のパスを書く)に貼り、手順 4 の「このイシューで直す」と同じく commit する: ```bash bash scripts/claude/code-review.sh --route backlog $ARGUMENTS ``` @@ -165,7 +165,7 @@ user-invocable: false - 手順 2.7 の 4 問による見送りは、この台帳の残りには使わない(判定は後続のイシューの計画、または一覧を見る計画で行う)。 4) 振り分けに従って対応する(ユーザーの判断は待たない): - - **このイシューで直す**: 記録の場所(`docs/reviews/`・`docs/tests/`・`docs/issues/`・`docs/plans/`)だけで済むものは、その場で直して commit/push する + - **このイシューで直す**: 記録の場所(`docs/reviews/`・`docs/tests/`・`docs/issues/`・`docs/plans/`)だけで済むものは、その場で直して commit する(push しない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」) - **既存イシューに同梱**: 同梱先のイシュー(未着手のものを含む)に、改善案の要約・根本原因・予防策・対象ファイルをコメントする。本文は一時ファイルに書いて `gh issue comment <番号> --body-file <ファイル>` で付ける - **採用(新規起票)**: Skill ツールで `issue-bootstrap` を呼ぶ(引数はタイトル。呼ぶときに「retro からの起票」であること・根本原因・予防策・対象ファイル・起点のイシュー番号を伝える。issue-bootstrap はこのとき質問せず、未確定は「未定・grill-me で確認」と書く) - **見送り**: 何もしない(理由は記録に残す) @@ -175,7 +175,7 @@ user-invocable: false 5) 記録: `docs/reviews/open/$ARGUMENTS_review.md` の「## 自律判断の記録」に、改善案ごとの振り分け(直した/同梱先 #番号/起票 I###・#番号/見送り)と理由を書く。手順 3 の平易版・詳細版の振り返りも同じファイルの「## 振り返り」に残す(close 段階のマージ依頼で、平易版をまとめて報告する) -6) 結線(必須): commit/push してから、`docs/reviews/open/$ARGUMENTS_review.md` の末尾に次の 1 行を足して commit/push する +6) 結線(必須): commit してから、`docs/reviews/open/$ARGUMENTS_review.md` の末尾に次の 1 行を足して commit する(push しない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」) ``` STAGE_DONE: retro NEXT: close ``` diff --git a/.claude/skills/review-gate/SKILL.md b/.claude/skills/review-gate/SKILL.md index 80abbf95..247b0cc7 100644 --- a/.claude/skills/review-gate/SKILL.md +++ b/.claude/skills/review-gate/SKILL.md @@ -13,7 +13,13 @@ user-invocable: false **全体のレビューと差分のレビュー(台帳・I197)**: 1 回目はブランチ全体を見て、指摘を台帳(番号・重大度・状態)にする。やり直し(fix-loop の後)は、前の記録の `REVIEWED_COMMIT` からの直した差分と、台帳の止める指摘が直ったかだけを見る(全体を探し直さない)。合否はスクリプトが台帳の FINDING 行の欄(FILE・LINE・STOP・再現)から決定論で出す(I205。code-reviewer の VERDICT 行は合否に使わない): アプリ本体はブランチで変えた行(と前後 3 行)または受け入れ条件の未達の、再現のある Blocker・High・Medium で止める。ハーネスは止める条件の一覧(流れが動かなくなる・秘密情報や個人情報が外に出る・develop/main や GitHub から戻せない設定を壊す・受け入れ条件の未達)に当たる、再現のある指摘だけで止める。GitHub から復旧できない例外(`path_risk_trigger()` の集合)は Blocker・High で止める。差分の外でも、セキュリティの Blocker は止める。止めない指摘は台帳に残り、retro が後続のイシューか軽い指摘の一覧へ回す(正は `docs/runbooks/review-rules.md`「検証の全体設計」)。どちらにするか・範囲・台帳はスクリプト(`scripts/claude/code-review.sh`)が決める(台帳のある最新の記録の `REVIEWED_COMMIT` が HEAD の祖先なら差分のレビュー)。高リスクかどうか(3. を走らせるか)は、計画レビューの判定・パスの判定・台帳の目印(code-reviewer が計画の見立てを超えた高リスクの変更に付ける `RISK=up`・I202)で決まる。一度 YES になったら戻らない。 -Bash ツールの `run_in_background: true` で実行し、完了の通知で結果を受け取る(CI 待ちと組み込みのレビューで、前面の実行の上限 10 分を超えうるため。背景の実行が 10 分を超えても止まらないことは 2026-10-25 に 700 秒で実測した。それより長い上限があっても、下の「判定行が無いとき」の扱いで止まる側に倒れる): +まず、ここまで手元でコミットだけしてきたもの(implement・fix-loop・記録)をまとめて送る(`docs/runbooks/workflow.md`「GitHub への書き込みの時点」の 2。CI は送ったコミットで動き、スクリプトは「PR の最新のコミット=手元の HEAD」を確かめる): + +```bash +git push +``` + +続けて、スクリプトを Bash ツールの `run_in_background: true` で実行し、完了の通知で結果を受け取る(CI 待ちと組み込みのレビューで、前面の実行の上限 10 分を超えうるため。背景の実行が 10 分を超えても止まらないことは 2026-10-25 に 700 秒で実測した。それより長い上限があっても、下の「判定行が無いとき」の扱いで止まる側に倒れる): ```bash bash scripts/claude/code-review.sh "$ARGUMENTS" @@ -24,7 +30,7 @@ bash scripts/claude/code-review.sh "$ARGUMENTS" - exit 0: 2. へ - exit 3(CI 待ちの時間切れ): 1 回だけ実行し直す。2 回続けば止める(止める条件 3: 安全側の選択肢が無い) - exit 1 で出力に `CI_WAIT: FAIL` がある: CI の失敗を直すため `STAGE_DONE: review-gate NEXT: fix-loop` を書いて終わる -- exit 1 で出力に `CI_WAIT: NOT_PUSHED` がある(PR の最新のコミットが手元の HEAD と違う): push してから 1 回だけ実行し直す。それでも同じなら止める(止める条件 3) +- exit 1 で出力に `CI_WAIT: NOT_PUSHED` がある(PR の最新のコミットが手元の HEAD と違う。上の送り忘れ・送った後のコミット): 上の送る手順をやり直してから 1 回だけ実行し直す。それでも同じなら止める(止める条件 3) - exit 1 で出力に `CI_WAIT: NO_JOBS` がある(ワークフローのジョブ名を読めない。python3 の PyYAML が無いなど): 原因を直して 1 回だけ実行し直す。直せなければ止める(止める条件 3) - exit 1 で出力に `CI_WAIT: NO_PR` がある(PR を調べられない・開いている PR が無い): 原因(gh の認証・ネットワーク・PR が閉じている)を直して 1 回だけ実行し直す。直せなければ止める(止める条件 3)。CI を確かめないまま先へ進まない - 出力に `OFFICIAL_SECURITY: FAILED` がある(高リスクの変更で組み込みの `/security-review` が動かず、HIGH になった): 直すものが無い基盤の失敗なので fix-loop に回さず、1 回だけ実行し直す。2 回続けば止める(止める条件 3) @@ -63,7 +69,7 @@ bash scripts/claude/adversarial-review.sh "$ARGUMENTS" - 出力に `ADVERSARIAL_VERDICT:` 行が無い(途中で止まった・背景の実行が打ち切られた): 1 回だけ実行し直す。2 回続けば止める(止める条件 3) - exit 0(`ADVERSARIAL_VERDICT: OK`): ステージ通過。最終判定 OK -- exit 1(HIGH・BLOCKER。3 観点とも報告した): 記録の「確かめる項目の結果」と findings を読み、3-3 で直す。直した後、`bash scripts/claude/code-review.sh "$ARGUMENTS"` を 1. と同じく背景で実行し直し(直した差分を基本レビューに通す)、OK なら 3-1 で次の周を起動する(スクリプトが前の周の `REVIEWED_COMMIT` からの差分だけを見る。修正の妥当性も反証対象) +- exit 1(HIGH・BLOCKER。3 観点とも報告した): 記録の「確かめる項目の結果」と findings を読み、3-3 で直す。直した後、`bash scripts/claude/code-review.sh "$ARGUMENTS"` を 1. と同じく(直したコミットを先に送ってから)背景で実行し直し(直した差分を基本レビューに通す)、OK なら 3-1 で次の周を起動する(スクリプトが前の周の `REVIEWED_COMMIT` からの差分だけを見る。修正の妥当性も反証対象) - exit 3(報告の無い観点がある。記録は `ROUNDS: 0` で周に数えない): **報告の無い観点を合格に数えない**(その観点の項目はすべて未検証。VERDICT は HIGH)。記録の「観点ごとの実行」の終わり方・最後のツール呼び出しを自律判断の記録に書き、1 回だけ実行し直す。2 回続けば止める(止める条件 3。時間切れ・失敗が続くのは仕組みの見直しが要る兆し) - exit 4(`ADVERSARIAL_VERDICT: LIMIT`): 下の「上限到達」へ - exit 2(`ADVERSARIAL_ERROR:`。一覧が無い・形が違う・作業ツリーに記録の場所の外の変更がある・引数の誤り): 原因が記録の場所で直せる(計画書に一覧を足す・形を直す)なら直してコミットし、1 回だけ実行し直す。一覧を足すのは計画の範囲を変えないので計画変更記録に 1 行書き、計画レビューは通り直さない。直せない・2 回続くときは止める(止める条件 3) @@ -95,7 +101,7 @@ bash scripts/claude/adversarial-review.sh "$ARGUMENTS" ## 4. 結線(必須) -`docs/reviews/open/$ARGUMENTS_review.md` の末尾に 1 行足して commit/push する: +`docs/reviews/open/$ARGUMENTS_review.md` の末尾に 1 行足して commit する(push しない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」): - 最終判定 OK: `STAGE_DONE: review-gate NEXT: test-gate` - 最終判定 HIGH / BLOCKER(上限到達で止める場合を除く): `STAGE_DONE: review-gate NEXT: fix-loop` - 止める条件に当たって止まるときは `STAGE_DONE:` を書かない(`/proceed` で再開すると、この段階からやり直す) diff --git a/.claude/skills/test-gate/SKILL.md b/.claude/skills/test-gate/SKILL.md index db3bb57f..cb168825 100644 --- a/.claude/skills/test-gate/SKILL.md +++ b/.claude/skills/test-gate/SKILL.md @@ -60,7 +60,7 @@ bash scripts/claude/check-manual-test-executor.sh $ARGUMENTS ## 5. 結線(必須) -commit/push してから、`docs/reviews/open/$ARGUMENTS_review.md` の末尾に 1 行足して commit/push する: +commit してから、`docs/reviews/open/$ARGUMENTS_review.md` の末尾に 1 行足して commit する(push しない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」): - Human の項目がある: `STAGE_DONE: test-gate NEXT: human-test` を書き、次の形で提示して止まる ``` ## 手動テスト確認項目(Human 実施分) diff --git a/docs/plans/open/plan_I224.md b/docs/plans/open/plan_I224.md index 389b7d51..e6beeecf 100644 --- a/docs/plans/open/plan_I224.md +++ b/docs/plans/open/plan_I224.md @@ -40,7 +40,7 @@ ## 3. 影響範囲 - Backend/Frontend/DB: なし -- Config/Infra: `.claude/skills/{plan-issue,plan-review,design-security-review,implement,review-gate,fix-loop,test-gate,retro,close,proceed}/SKILL.md`・`docs/runbooks/workflow.md`・`docs/runbooks/worktree.md`・`docs/runbooks/plan-writing-rules.md`・`scripts/claude/tests/test_i224_push_points.sh`(新規)・`docs/reviews/backlog/I226.md` +- Config/Infra: `.claude/skills/{plan-issue,plan-review,design-security-review,implement,review-gate,fix-loop,test-gate,retro,close,proceed}/SKILL.md`・`docs/runbooks/workflow.md`・`docs/runbooks/worktree.md`・`docs/runbooks/plan-writing-rules.md`・`scripts/claude/tests/test_i224_push_points.sh`(新規)・`scripts/claude/tests/fixtures/i185/{plan_issue_continue_section,fix_loop_return}.txt`(固定ファイルの作り直し・計画変更記録 2)・`docs/reviews/backlog/I226.md` ## 4. 変更点一覧(具体) @@ -143,6 +143,7 @@ Danger Ops(有無/手順/ロールバック): ## 計画変更記録 1. 計画レビュー(20261107_2215・OK)への対応: Warning 1(受け入れ条件 3 の次のイシュー分はこの PR の close の時点で未達と明記し、次の計画で測るよう報告とメモリに残す)・Warning 2(`proceed` の `merge` で依頼の前に `pr-base-sync.sh final` を流す)・Warning 3(テストの失敗の文に正の節と直し方を出す)・Info 2(M-01 で PR へのコメントの回数も並べる)を反映。計画レビューのやり直し: 不要(方式・範囲・受け入れ条件は変えない。Warning 2 の `proceed` の 1 行は、前倒しの安全網で範囲の中) +2. 実装の途中と /simplify での調整(方式・範囲は変えない): (a) `workflow.md` の新しい節の置き場所を「## 記録とつなぎ」の後ろ(「## ゲート」の前)にした — 「## 止めて聞く条件」〜「## 記録とつなぎ」は `test_i185_harness_docs.sh` が写しで固定している範囲で、その中に入れないため (b) `plan-issue` の「この先へ続ける」と `fix-loop` の手順 8 は同じテストが固定しているので、`--update` で固定ファイル(`scripts/claude/tests/fixtures/i185/plan_issue_continue_section.txt`・`fix_loop_return.txt`)を作り直した(このテストの決まりどおり。差分はレビューで見る) (c) 各スキルの「push しない。次に送るのは…」の言い直しを、正への参照「(push しない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」)」にそろえた(写しを持たない) (d) close の手順 3・6 と proceed の `merge` の行の経緯の説明を短くした (e) テストはルートの引数をやめ、FG は `.claude/skills` だけを写す・不合格と「その決まりとして出たか」を分けて確かめる形にした。見送り: `code-review.sh` に自分で push させる案(スクリプトの作りを変える範囲の変更。今の形でも送り忘れは `CI_WAIT: NOT_PUSHED` で決定論で止まる)・P4 を消す案(§9 で決めたとおり、P1〜P3 の決まりの正を指すため 1 行残す)。計画レビューのやり直し: 不要 ## レビュー結果 - [20261107_2215 判定: ✅ 完了](../../reviews/I224_plan_review_20261107_2215.md) diff --git a/docs/reviews/backlog/I226.md b/docs/reviews/backlog/I226.md index 42b6953a..68675c5d 100644 --- a/docs/reviews/backlog/I226.md +++ b/docs/reviews/backlog/I226.md @@ -4,7 +4,6 @@ - 一覧に回した決まり: `.claude/skills/retro/SKILL.md` 4-0(Low、または再現なし。後続イシューにしない) - 見る場所: `.claude/skills/plan-issue/SKILL.md`「台帳の残りの一覧」(実装対象のファイルに当たる行を、同梱するか残すか決める。同梱して直した行は消し、行が無くなったらこのファイルを消す) -- F2 SEV=Low REPRO=no KIND=harness FILE=docs/runbooks/plan-writing-rules.md | 同じ括弧の中に「付け忘れは G6 が止める」と「付け忘れは G6・G7 が止める」が重複して書かれている。次に直すときに片方だけ更新されてずれやすい | 一覧に回した理由: Low/再現なし - F3 SEV=Low REPRO=yes KIND=harness FILE=scripts/claude/tests/test_i223_gh_app.sh | 行末の `\` のつなぎが LF だけを見ている。CRLF の文書では続きの行が切り離される | 一覧に回した理由: Low - F4 SEV=Low REPRO=no KIND=harness FILE=scripts/claude/hooks/posttooluse_check.py | `code-review.sh` の返り値が 1 以外(2 や途中で落ちた場合)だと黙って通すので、検査が壊れても気づけない。意図した設計(流せないときは review-gate が最後に見る)の範囲内 | 一覧に回した理由: Low/再現なし - F5 SEV=Low REPRO=no KIND=harness FILE=CLAUDE.md | CLAUDE.md の §3 に、フックの新しい検査の説明を 1 文足している。ルールを増やさないという方針とは緊張するが、既存の 1 行の説明を合わせただけで、新しい決まりは足していない | 一覧に回した理由: Low/再現なし diff --git a/docs/reviews/open/I224_review.md b/docs/reviews/open/I224_review.md index 23c57dbe..9237be02 100644 --- a/docs/reviews/open/I224_review.md +++ b/docs/reviews/open/I224_review.md @@ -7,18 +7,22 @@ - 押し戻しを決定論のテスト(`test_i224_push_points.sh`)で止める ## 変更点 -- (実装後に記入) +- `docs/runbooks/workflow.md`: 新しい節「## GitHub への書き込みの時点(I224)」(push の 3 時点・ほかはコミットだけ・イシュー本文の書き換えは grill-me だけ・目安 4 回以内と測り方・同時に複数のセッションで書き込まない)。25・50 行目を合わせた +- スキル 10 本: 「commit/push」を「commit(push しない・正への参照)」に。`review-gate` の最初に `git push`。`close` は手順 3 のコミットに `STAGE_DONE: close NEXT: merge` を入れ、手順 6 はコミット・push しない。`proceed` の `merge` は依頼の前に `pr-base-sync.sh final` を流す +- `docs/runbooks/worktree.md`(82・251 行)・`docs/runbooks/plan-writing-rules.md`(230 行・同梱で 90 行の重複を整理) +- `scripts/claude/tests/test_i224_push_points.sh`(新規・P1〜P4 と FG)・`scripts/claude/tests/fixtures/i185/` の固定ファイル 2 つを作り直し +- `docs/reviews/backlog/I226.md`: 同梱した F2 の行を消した ## 影響範囲 - Backend/Frontend/DB: なし -- Config: `.claude/skills/` の 10 本・`docs/runbooks/workflow.md`・`docs/runbooks/worktree.md`・`docs/runbooks/plan-writing-rules.md`・`scripts/claude/tests/test_i224_push_points.sh`・`docs/reviews/backlog/I226.md` +- Config: `.claude/skills/` の 10 本・`docs/runbooks/workflow.md`・`docs/runbooks/worktree.md`・`docs/runbooks/plan-writing-rules.md`・`scripts/claude/tests/test_i224_push_points.sh`・`scripts/claude/tests/fixtures/i185/`・`docs/reviews/backlog/I226.md` ## テスト結果 - 自動: (test-gate で記入) - 手動: (test-gate で記入) ## 計画との差分 -- (実装後に記入) +- 振る舞いの差分なし。節の置き場所・固定ファイルの作り直し・言い回しの整理は計画変更記録 2 のとおり ## ロールバック - PR を revert する @@ -29,6 +33,11 @@ - [plan] PR へのレビューの記録のコメントは変えない — grill-me で決めた範囲(push・イシュー本文)の外で、PR でレビューを読む導線を変えるのは別の判断 - [plan] この I224 の plan-issue〜implement は古いスキルのまま進め、push は手順が許す範囲でまとめる(docs と STAGE_DONE を 1 回で送る)— 計画レビューを通す前に新しい決まりで動かない - [plan-review] PLAN_VERDICT: OK(20261107_2215)。Warning 3 件・Info 1 件を計画書・テスト文書に反映し、再レビューはしない — 方式・範囲・受け入れ条件を変えない追記だけ(計画変更記録 1) +- [plan-review] 結線は commit だけで送らなかった(古いスキルは commit/push だが、次の review-gate の前に送ればよく、計画レビューを通った新しい決まりの先取り。中身の変更は無い) +- [implement] テストを先に書き、本体を直す前に落ちることを確かめてから直した — 新しいテストが false-green でないことを示すため +- [implement] `workflow.md` の新しい節を、`test_i185_harness_docs.sh` の固定範囲の外に置いた。固定している `plan-issue`・`fix-loop` の 2 か所はこのテストの決まりどおり `--update` で固定ファイルを作り直した — 意図した変更で、差分はレビューで見る +- [implement] /simplify の指摘のうち、スキルの言い直しの統一・close と proceed の説明の短縮・テストの写す範囲(primary で全ワークツリーを写さない)・テストの引数と判定の整理は直した。`code-review.sh` に自分で push させる案(範囲の外・今も決定論で止まる)・P4 を消す案(計画で残すと決めた)・同梱の重複の整理を外す案(計画の同梱)は見送った +- [implement] 手元では、変えたスキル・手順書を読むテスト 17 本だけを流した(全体は CI) STAGE_DONE: plan NEXT: plan-review STAGE_DONE: plan-review NEXT: implement diff --git a/docs/runbooks/plan-writing-rules.md b/docs/runbooks/plan-writing-rules.md index 3385451c..b4696942 100644 --- a/docs/runbooks/plan-writing-rules.md +++ b/docs/runbooks/plan-writing-rules.md @@ -87,7 +87,7 @@ 計画の正しさが、不確実な外部(ハーネス/フレームワーク/ツール)の挙動に依存し、計画自身がそれを「未知リスク/最大の未知リスク」と認識する場合は、その前提を**スパイク(最小実証)で検証**してから計画を確定する。これは実装手順の「未知リスク先行原則」を計画確定前の実証まで**前倒しで拡張**したものであり(重複定義はせず同原則を参照する)、スパイク可否で次の二分岐に従う。 - **(1) 稼働中セッションで実証可能な挙動**(CLI フラグの効果・フレームワークの戻り値・設定ファイルのパース結果 等): **計画確定前にスパイクで実証**し、結果(成立/不成立)を計画書「調査結果」に記録する。不成立の場合は設計をやり直してから計画レビューに進む。 -- **(2) 稼働中セッションでは実証不能な挙動**(権限モード・フックのロードに依存するハーネス挙動 等): まず `claude -p` で新しいセッションを起動して確かめられないかを試す(手で起こすときは `bash scripts/claude/test-session.sh <引数>`。GitHub へは読み取りだけの鍵になり、書き込みは GitHub が拒否する・I223。`scripts/claude/` のスクリプトが Claude を起こす行〔`check-permission-prompt.sh`・`tui-capture.sh`・検証役の起動〕もすべて同じで、付け忘れは `test_i223_gh_app.sh` の G6 が止める。同じ行には `--strict-mcp-config` も付け(MCP は `--mcp-config` で渡したものだけ。手元の設定の MCP が読み取りだけの鍵を迂回しないように)、tmux の中の `claude` には入口のある `PATH`(`~/.local/bin` が先頭)も渡す(I225)。付け忘れは `test_i223_gh_app.sh` の G6・G7 が止める。承認画面が出るかは `scripts/claude/check-permission-prompt.sh`。設定・フックは `--settings`・`--permission-mode` を付けた `claude -p` の出力で観測できる。対話画面にだけ出る表示は `scripts/claude/tui-capture.sh`)。それでも確かめられない場合だけ、「未実証」であることを計画書「調査結果」に明記し、指定実施環境(プレーン default の新規セッション)での実証を**実装ステップ1に前倒し**する。ステップ1の結果は後続ステップを止めるゲートとして扱い、不成立なら計画をやり直す。 +- **(2) 稼働中セッションでは実証不能な挙動**(権限モード・フックのロードに依存するハーネス挙動 等): まず `claude -p` で新しいセッションを起動して確かめられないかを試す(手で起こすときは `bash scripts/claude/test-session.sh <引数>`。GitHub へは読み取りだけの鍵になり、書き込みは GitHub が拒否する・I223。`scripts/claude/` のスクリプトが Claude を起こす行〔`check-permission-prompt.sh`・`tui-capture.sh`・検証役の起動〕もすべて同じ。同じ行には `--strict-mcp-config` も付け(MCP は `--mcp-config` で渡したものだけ。手元の設定の MCP が読み取りだけの鍵を迂回しないように)、tmux の中の `claude` には入口のある `PATH`(`~/.local/bin` が先頭)も渡す(I225)。付け忘れは `test_i223_gh_app.sh` の G6・G7 が止める。承認画面が出るかは `scripts/claude/check-permission-prompt.sh`。設定・フックは `--settings`・`--permission-mode` を付けた `claude -p` の出力で観測できる。対話画面にだけ出る表示は `scripts/claude/tui-capture.sh`)。それでも確かめられない場合だけ、「未実証」であることを計画書「調査結果」に明記し、指定実施環境(プレーン default の新規セッション)での実証を**実装ステップ1に前倒し**する。ステップ1の結果は後続ステップを止めるゲートとして扱い、不成立なら計画をやり直す。 **スパイク完了基準**: 想定挙動を**実行可能な確認(コマンド出力・Read による観測・CI ログ 等)で再現**し、その結果(成立/不成立)を計画書「調査結果」に記録した時点で実証完了とする(計画者の解釈ゆれ防止)。 @@ -227,7 +227,7 @@ pip-audit・npm audit・mypy・semgrep 等の**既存コードを検査するツ PLAN_FILE="docs/plans/open/plan_${ARGUMENTS}_${COUNTER}.md" fi ``` -- **計画書作成後**: 計画書・テスト文書・レビュー文書を commit/push し、計画レビュー(plan-review 段階)へ進む。ユーザーの承認は待たない(I193。止めるのは `docs/runbooks/workflow.md`「止めて聞く条件」に当たるときだけ) +- **計画書作成後**: 計画書・テスト文書・レビュー文書を commit し(push は `docs/runbooks/workflow.md`「GitHub への書き込みの時点」の時点だけ)、計画レビュー(plan-review 段階)へ進む。ユーザーの承認は待たない(I193。止めるのは `docs/runbooks/workflow.md`「止めて聞く条件」に当たるときだけ) ### 計画書ヘッダー(文書間の関係性) ```markdown diff --git a/docs/runbooks/workflow.md b/docs/runbooks/workflow.md index 21c4e8dc..b29737a0 100644 --- a/docs/runbooks/workflow.md +++ b/docs/runbooks/workflow.md @@ -22,7 +22,7 @@ 2. /plan-issue I### → 計画書・テスト文書・レビュー文書 → 以下を Claude が順に進める(`proceed` が `scripts/claude/flow-stage.sh` で次の段階を決める) 1. plan-review: 自作の計画レビュー(`plan-issue-review.sh`・`.claude/agents/plan-reviewer.md`)。Blocker は自分で直して再レビュー。高リスク判定 Yes → design-security-review、No → implement 2. design-security-review(高リスクのときだけ): 実装前の設計レビュー+攻撃シナリオ。Blocker は計画を直して plan-review からやり直す - 3. implement: 実装・TDD → 組み込みの `/simplify` で整理 → push + 3. implement: 実装・TDD → 組み込みの `/simplify` で整理 → commit(push は review-gate の最初・下の「GitHub への書き込みの時点」) 4. review-gate: CI 待ち(失敗・時間切れで止まる)+組み込みの `/code-review`(パスの判定が YES のときは `/security-review` も。どちらも読み取り専用の plan モード)+自作のレビュー役(受け入れ条件・計画・文書の照合)+決定論ゲートの実走。高リスクなら敵対的レビュー(別プロセス・読むだけ・1 周 10 分・確かめる項目の一覧で判定。`scripts/claude/adversarial-review.sh`)。NG → fix-loop 5. fix-loop: 診断レビューを通した案で直し、実装・テストのレビューを通して、**必ず review-gate に戻る**(戻り先は 1 か所) 6. test-gate: `gate-check.sh`(最新のレビューが今の HEAD を見て OK か)→ 計画書が指定した重いテスト・Claude 担当の手動テスト(pytest・Jest・E2E は CI が正で、手元では流し直さない)→ 人の手動テストがあれば**ここで止まる** @@ -47,11 +47,24 @@ それ以外(技術的な設計の選択・直せる指摘の直し方・CI の失敗の直し方・develop との食い違いの解決など)は Claude が決め、`docs/reviews/open/I###_review.md` の「## 自律判断の記録」に `- [段階] 決めたこと — 理由` で書く。止まったとき(人の手動テストの手前・マージ依頼)に、その要点を平易にまとめて報告する。 ## 記録とつなぎ(決定論) -- 各段階は、終わりに `docs/reviews/open/I###_review.md`(close の後は closed)の末尾へ `STAGE_DONE: <段階> NEXT: <次の段階>` を 1 行足して commit/push する。止める条件で止まるときは書かない +- 各段階は、終わりに `docs/reviews/open/I###_review.md`(close の後は closed)の末尾へ `STAGE_DONE: <段階> NEXT: <次の段階>` を 1 行足して commit する(push は下の「GitHub への書き込みの時点」だけ)。止める条件で止まるときは書かない - `scripts/claude/flow-stage.sh I###` が最後の `STAGE_DONE:` 行から次の段階を返す(`STAGE_DONE:` が無い・読めないときは exit 2 で止める) - `scripts/claude/gate-check.sh I###` が、test-gate・close の最初に「最新のコードレビュー記録(高リスク時は敵対的レビュー記録も)が VERDICT OK で、その `REVIEWED_COMMIT` から HEAD まで・作業ツリーに、記録の場所(`docs/reviews/`・`docs/tests/`・`docs/issues/`・`docs/plans/`)の外の変更が無い」ことを確かめる。直した後は必ずレビューを通り直す - 段階のスキルのうち test-gate・retro・close が書いてよいのは記録の場所だけ。それ以外を直す必要が出たら fix-loop・review-gate を通す +## GitHub への書き込みの時点(I224) +bot の停止(2026-10-30・短い間の書き込みの集中がきっかけと見ている)の再発防止。量の上限に頼らず、GitHub が中身を見る時点だけ送る。各スキルはこの節を参照する(写しを持たない)。 +- **push するのは 3 時点だけ**: + 1. plan-issue の下書き PR の作成(イシューファイルのコミット。既コミット経路では計画の文書のコミット) + 2. review-gate の CI 待ちの前(`code-review.sh` を流す直前。fix-loop の後のやり直しのたびを含む) + 3. close の最後の確認の前(記録を closed へ移すコミット。`STAGE_DONE: close NEXT: merge` もこのコミットに入れる) + - ほかに `pr-base-sync.sh final` が base を取り込んだとき(BEHIND のときだけ・スクリプトが送る) +- **それ以外の段階は手元でコミットだけ**(STAGE_DONE・自律判断の記録・テスト結果・レビュー記録)。次の時点でまとめて送る。送り忘れても、review-gate の CI 待ちが `CI_WAIT: NOT_PUSHED` で止まる(決定論) +- **イシュー本文の書き換え(`gh issue edit --body-file`)は grill-me の終わりの 1 回だけ**。plan-issue で足す Draft PR の番号などは手元のファイルにだけ書く。起票(issue-bootstrap)・retro の既存イシューへのコメントはそのまま +- **目安**: 1 本のイシューの push は 4 回以内(fix-loop の後のやり直し 1 回ごとに +1)。測り方: `git reflog show refs/remotes/origin/<ブランチ>` の `update by push` の行数 +- **同時に複数のセッションで GitHub に書き込まない**: 書き込む段階(plan-issue・review-gate・retro の起票・close)を、別の作業フォルダ(worktree)のセッションと重ねない。テスト用に起こすセッションは読み取りだけの鍵(I223)なので対象外。仕組みでは止めない(最後の守りは GitHub) +- 決まりの押し戻し(スキルに「commit/push」を書き足すなど)は `scripts/claude/tests/test_i224_push_points.sh` が CI で止める + ## ゲート - 計画レビュー(plan-review)を通す前にコード変更を開始しない - Danger Ops は明示承認(danger-approved + DANGER_OK=1)なしに実行しない(止める条件 2) diff --git a/docs/runbooks/worktree.md b/docs/runbooks/worktree.md index 8f5e7087..d0c8df52 100644 --- a/docs/runbooks/worktree.md +++ b/docs/runbooks/worktree.md @@ -79,7 +79,7 @@ cp /e2e/.env.e2e e2e/.env.e2e # E2E を行う 1 つのワークツリーで、複数のイシューを順番に扱ってよい。 -1. いまのイシューの未コミット変更を片付ける(コミット・push する。不要なら捨てる)。新しいイシューのイシューファイル(untracked)は残してよい。 +1. いまのイシューの未コミット変更を片付ける(コミットする。不要なら捨てる。push は `docs/runbooks/workflow.md`「GitHub への書き込みの時点」の時点だけ)。新しいイシューのイシューファイル(untracked)は残してよい。 2. `/plan-issue I<番号>` を実行する。`origin/develop` から直接 feature ブランチを作るため、develop をチェックアウトしない(別のワークツリーが develop を使っていても失敗しない)。未コミットのイシューファイルはそのまま新ブランチへ持ち越される。 --- @@ -248,7 +248,7 @@ docker compose config | grep -A1 published - ツールの呼び出しではなくフックなので、見張りと Claude Code 本体の隔離の判定の外で動く(例外はこの早送りだけ) - **技術強制済み(I095)**: この「他のワークツリーを直接編集しない」ルールは、PreToolUse フック(`scripts/claude/hooks/pretooluse_guard.py`)で技術強制されている。別ワークツリーのルート配下への **Edit/Write/MultiEdit/NotebookEdit・Bash 書込(`>`/`>>`/`>|`・`tee`・`cp`/`mv` の宛先・`sed -i`)を `exit 2` でブロック**する(`.claude/settings.json` は commit 共有のため全ワークツリーに自動適用)。**読み取りは許可**(参照・調査は可)。判定は `git worktree list` のルートとの realpath 境界一致で行い、**入れ子では、パスを含む最も内側のワークツリーを所有者として判定**する(I179。入れ子ワークツリーは自分のファイルに書け、親→入れ子・入れ子→親・兄弟間はブロック)。**fail-safe**(ワークツリー境界を確定できない場合=git 失敗時はブロック)・**エスケープ無し**(`DANGER_OK=1` でも解除されない)。未カバー経路(変数展開越しの `cd`・`eval`/変数展開越しの宛先)は検査できないという限界を stderr に明示する。 - **削除・破棄は技術的には止めない(I179 計画変更記録 6)**: 公式配置では別のワークツリーが primary の中(`.claude/worktrees/`)にあるため、primary での相対パスや全体への操作で他のワークツリーの未コミット作業を消せる。ただしコマンドの文字列からシェルの動きを読み取って止める方式は、どこまで足しても抜け道と止めすぎが出続けた(I179 の敵対的レビュー第 1〜11 周・`docs/reviews/closed/I179_adversarial_review_*.md`)。develop/main は GitHub 側で保護され(bot は PR を出すだけ)、ローカルが壊れても GitHub から復旧できるため(例外は秘密情報の push とワークフローの変更など。`docs/runbooks/danger-ops.md`「GitHub から復旧できる範囲」)、守りは次に任せる。 - - **こまめに commit・push する**(失うのは push していない手元の変更だけにする)。 + - **こまめに commit する**(push は `docs/runbooks/workflow.md`「GitHub への書き込みの時点」の時点だけ。手元のコミットはワークツリーを消さない限り残り、`wt-remove.sh` は未 push のコミットがあると止まる)。 - **別のワークツリーの中身を消さない**: primary のセッションで `.claude/worktrees/` 配下を `rm`・`mv`・`git -C <入れ子> reset/checkout/clean/stash` しない。撤去は `bash scripts/claude/wt-remove.sh <パス>`(未コミット・中の入れ子があると止まる)。`git worktree remove` は使わない(中の入れ子は gitignore 済みで、`--force` なしでも作業ごと消える)。 - **別ワークツリー専用の判定は持たない**: 中の入れ子ワークツリーまで未コミットの作業ごと消す `git clean -ff`(`f` を 2 つ以上)を含め、`git clean -f`・`rm -r`・`git reset --hard` などは、見張り(I174)が危険操作として場所によらず止める(`docs/runbooks/danger-ops.md`)。 - **既知の限界(入れ子)**: 「どれが現ワークツリーか」はフックを実行したときの作業フォルダ(`git rev-parse --show-toplevel`)で決まる。入れ子ワークツリーは primary のフォルダの中にあるため、primary のセッションで `cd .claude/worktrees/` すると作業フォルダがそのまま残り、それ以降はそのセッションが入れ子のワークツリーとして扱われる(入れ子への書込が通る)。primary のセッションから入れ子へ `cd` しない。入れ子で作業するときは、そのワークツリーのセッションを使う(§2「セッションを開く」)。サブエージェントのフックは primary の設定で動くため、作業フォルダ以外(`CLAUDE_PROJECT_DIR` 等)で判定すると、サブエージェントが自分の入れ子に書けなくなる。このため作業フォルダでの判定を維持している。 diff --git a/docs/tests/open/I224_auto_test.md b/docs/tests/open/I224_auto_test.md index cbec5892..2dd035d7 100644 --- a/docs/tests/open/I224_auto_test.md +++ b/docs/tests/open/I224_auto_test.md @@ -30,11 +30,14 @@ |---|---|---|---| | 2026-11-07 | TC-03(実装前) | 期待どおり NG | `workflow.md` に「GitHub への書き込みの時点」「同時に複数のセッションで」が無い(どちらも exit 1) | | 2026-11-07 | TC-02(実装前の数え) | — | 行の先頭の `git push`: `plan-issue` 2・`review-gate` 0・`close` 1。`gh issue edit` は `grill-me` だけ。テストは実装前のため未作成 | -| 2026-11-07 | TC-01・TC-02・TC-04 | 実装前のため未実行 | | +| 2026-11-07 | TC-02(テストを先に書き、本体を直す前) | 期待どおり NG | P1 が 13 か所・P2(`review-gate` 0 行)・P4(節なし)で不合格 | +| 2026-11-07 | TC-02・TC-03・TC-04(実装と /simplify の後) | OK | `test_i224_push_points.sh` pass=9 fail=0(FG 4 つとも、その決まりで不合格になることを含む)・`grep -q` exit 0・`bash -n` exit 0 | +| 2026-11-07 | TC-01(変えたスキル・手順書を読むテスト 17 本だけ手元で) | OK | `test_i185_harness_docs.sh`(固定ファイルを `--update` で作り直した後)・`test_i193_official_flow.sh` ほか 17 本がすべて exit 0。全体は CI | ## 決定論ゲート(自動実走) ```bash bash scripts/claude/tests/test_i224_push_points.sh +bash scripts/claude/tests/test_i185_harness_docs.sh grep -q 同時に複数のセッションで docs/runbooks/workflow.md bash -n scripts/claude/tests/test_i224_push_points.sh ``` diff --git a/scripts/claude/tests/fixtures/i185/fix_loop_return.txt b/scripts/claude/tests/fixtures/i185/fix_loop_return.txt index a9145bd1..f9fa7aea 100644 --- a/scripts/claude/tests/fixtures/i185/fix_loop_return.txt +++ b/scripts/claude/tests/fixtures/i185/fix_loop_return.txt @@ -1,4 +1,4 @@ -8) 結線(必須・戻り先は 1 か所): commit/push してから、`docs/reviews/open/$ARGUMENTS_review.md` の末尾に次の 1 行を足して commit/push する。どの NG(レビュー・CI・テスト・人の手動テスト)から来たときも同じで、直した後は必ず review-gate が差分のレビューで見直す +8) 結線(必須・戻り先は 1 か所): commit してから、`docs/reviews/open/$ARGUMENTS_review.md` の末尾に次の 1 行を足して commit する(push しない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」)。どの NG(レビュー・CI・テスト・人の手動テスト)から来たときも同じで、直した後は必ず review-gate が差分のレビューで見直す ``` STAGE_DONE: fix-loop NEXT: review-gate ``` diff --git a/scripts/claude/tests/fixtures/i185/plan_issue_continue_section.txt b/scripts/claude/tests/fixtures/i185/plan_issue_continue_section.txt index 37832d66..ca4b8dfe 100644 --- a/scripts/claude/tests/fixtures/i185/plan_issue_continue_section.txt +++ b/scripts/claude/tests/fixtures/i185/plan_issue_continue_section.txt @@ -1,7 +1,7 @@ **この先へ続ける(必須・止まらない)** 上の文書品質ゲートを満たしたら、ユーザーの入力を待たずに先へ進む(計画の承認は待たない。計画は plan-review 段階のレビューで確かめる)。 -1. 計画書・テスト文書・レビュー文書を commit/push する。 -2. `docs/reviews/open/$ARGUMENTS_review.md` の末尾に次の 1 行を足して commit/push する: +1. 計画書・テスト文書・レビュー文書を commit する(push しない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」)。 +2. `docs/reviews/open/$ARGUMENTS_review.md` の末尾に次の 1 行を足して commit する: ``` STAGE_DONE: plan NEXT: plan-review ``` diff --git a/scripts/claude/tests/test_i224_push_points.sh b/scripts/claude/tests/test_i224_push_points.sh new file mode 100644 index 00000000..146617d6 --- /dev/null +++ b/scripts/claude/tests/test_i224_push_points.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash +# I224: GitHub への書き込みの時点(push は 3 時点だけ・イシュー本文の書き換えは grill-me だけ)を、 +# スキルの手順の文字で確かめる。決まりを知らずに「commit/push」を書き足す事故を止めるためのもの。 +# 決まりの正: docs/runbooks/workflow.md「GitHub への書き込みの時点」 +# 実行: bash scripts/claude/tests/test_i224_push_points.sh +# FG: このスクリプトの中で、一時フォルダの写しを壊して各決まりが不合格になることを確かめる。 +set -uo pipefail +REPO_ROOT="$(git rev-parse --show-toplevel)" +pass=0; fail=0 +ck() { # ck <名前> <期待> <実際> + if [ "$2" = "$3" ]; then echo "PASS $1"; pass=$((pass + 1)) + else echo "FAIL $1(期待: $2 / 実際: $3)"; fail=$((fail + 1)); fi +} + +# check <ルート>: P1〜P4 を見て、不合格の決まりを 1 行ずつ出す(無ければ何も出さない)。合格=exit 0 +check() { + python3 -I - "$1" <<'PY' +import glob, os, re, sys +root = sys.argv[1] +FIX = "決まりの正は docs/runbooks/workflow.md「GitHub への書き込みの時点」。push の時点を意図して変えるなら、その節とこのテストの数を一緒に直す" +PUSH_WORDS = re.compile(r"commit/push|commit・push|コミット・push|git push") +PUSH_LINE = re.compile(r"^\s*git push\b") +ALLOWED = {"plan-issue": 2, "review-gate": 1, "close": 1} # 行の先頭の git push の数 +bad = [] +for path in sorted(glob.glob(os.path.join(root, ".claude", "skills", "*", "SKILL.md"))): + name = os.path.basename(os.path.dirname(path)) + rel = os.path.relpath(path, root) + lines = open(path, encoding="utf-8").read().split("\n") + if name not in ALLOWED: + for i, l in enumerate(lines, 1): + if PUSH_WORDS.search(l): + bad.append(f"P1 {rel}:{i}: push の指示は plan-issue・review-gate・close だけ(ほかの段階は commit だけ)") + else: + n = sum(1 for l in lines if PUSH_LINE.search(l)) + if n != ALLOWED[name]: + bad.append(f"P2 {rel}: 行の先頭の git push が {n} 行(決めた数は {ALLOWED[name]})") + if name != "grill-me": + for i, l in enumerate(lines, 1): + if "gh issue edit" in l: + bad.append(f"P3 {rel}:{i}: イシュー本文の書き換え(gh issue edit)は grill-me の終わりだけ") +wf = os.path.join(root, "docs", "runbooks", "workflow.md") +if not (os.path.isfile(wf) and re.search(r"^## GitHub への書き込みの時点", open(wf, encoding="utf-8").read(), re.M)): + bad.append("P4 docs/runbooks/workflow.md: 「## GitHub への書き込みの時点」の節が無い") +for b in bad: + print(b) +if bad: + print(FIX) +sys.exit(1 if bad else 0) +PY +} + +# ---- 本物(リポジトリの版)---- +out=$(check "$REPO_ROOT"); rc=$? +[ "$rc" = 0 ] || printf '%s\n' "$out" +ck "P1〜P4 リポジトリの版で合格" 0 "$rc" + +# ---- FG: 壊した写しでは、その決まりで不合格になる ---- +T="$(mktemp -d)" +trap 'rm -rf "$T"' EXIT +fg() { # fg <決まり> <説明> <写しのファイル(ルートからの相対)> + local d="$T/fg.$RANDOM" before + # 写すのは check が読むものだけ(primary では .claude/worktrees に全ワークツリーが入るので .claude を丸ごと写さない) + mkdir -p "$d/docs/runbooks" "$d/.claude" + cp -r "$REPO_ROOT/.claude/skills" "$d/.claude/" + cp "$REPO_ROOT/docs/runbooks/workflow.md" "$d/docs/runbooks/" + before=$(cat "$d/$3") + sed -i "$4" "$d/$3" + if [ "$(cat "$d/$3")" = "$before" ]; then ck "FG $1 $2 の書き換えが当たる" changed unchanged; return; fi + check "$d" > "$d/out" + ck "FG $1 $2 で不合格になる" 1 "$?" + local shown=no + if grep -q "^$1 " "$d/out"; then shown=yes; fi + ck "FG $1 $2 は $1 として出る" yes "$shown" +} +fg P1 "retro の結線に commit/push を書く" .claude/skills/retro/SKILL.md '1s/^/commit\/push する\n/' +fg P2 "review-gate の git push を 2 行にする" .claude/skills/review-gate/SKILL.md 's/^\([[:space:]]*\)git push$/\1git push\n\1git push/' +fg P3 "retro に gh issue edit を書く" .claude/skills/retro/SKILL.md '1s/^/gh issue edit 1 --body-file x\n/' +fg P4 "正の節の見出しを消す" docs/runbooks/workflow.md 's/^## GitHub への書き込みの時点.*$/## 別の見出し/' + +echo "---" +echo "pass=$pass fail=$fail" +[ "$fail" -eq 0 ] From 05c7ae2f388365a25db9915f15fd82c6962edc55 Mon Sep 17 00:00:00 2001 From: "osushi0404-claude[bot]" <352511081+osushi0404-claude[bot]@users.noreply.github.com> Date: Sat, 7 Nov 2026 22:28:14 +0900 Subject: [PATCH 06/11] docs(I224): STAGE_DONE implement Co-Authored-By: Claude Opus 5.5 --- docs/reviews/open/I224_review.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/reviews/open/I224_review.md b/docs/reviews/open/I224_review.md index 9237be02..0563d61a 100644 --- a/docs/reviews/open/I224_review.md +++ b/docs/reviews/open/I224_review.md @@ -41,3 +41,4 @@ STAGE_DONE: plan NEXT: plan-review STAGE_DONE: plan-review NEXT: implement +STAGE_DONE: implement NEXT: review-gate From 8e59ed18a2789e4a3092508c33d9b3388a0cd852 Mon Sep 17 00:00:00 2001 From: "osushi0404-claude[bot]" <352511081+osushi0404-claude[bot]@users.noreply.github.com> Date: Sat, 7 Nov 2026 22:38:47 +0900 Subject: [PATCH 07/11] =?UTF-8?q?docs(I224):=20code-review=20=E8=A8=98?= =?UTF-8?q?=E9=8C=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reviews/I224_code_review_20261107_2228.md | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 docs/reviews/I224_code_review_20261107_2228.md diff --git a/docs/reviews/I224_code_review_20261107_2228.md b/docs/reviews/I224_code_review_20261107_2228.md new file mode 100644 index 00000000..b6423aa2 --- /dev/null +++ b/docs/reviews/I224_code_review_20261107_2228.md @@ -0,0 +1,127 @@ +## 決定論ゲート実行結果(code-review.sh 自動注入) + +- `bash scripts/claude/tests/test_i224_push_points.sh` → exit=0 ✅ +- `bash scripts/claude/tests/test_i185_harness_docs.sh` → exit=0 ✅ +- `grep -q 同時に複数のセッションで docs/runbooks/workflow.md` → exit=0 ✅ +- `bash -n scripts/claude/tests/test_i224_push_points.sh` → exit=0 ✅ +- 高リスク判定: NO(計画レビュー=NO / path=NO / 台帳の目印=NO) +- 台帳(full・1 周目): OK(code-reviewer の VERDICT=OK・合否に使わない) + +- omission-lint: OK +- FINAL VERDICT(gate/omission/LLM 合成): OK + +--- + +# コードレビュー [I224] ── [2026-11-07] + +## 受け入れ条件の照合 +| # | 受け入れ条件 | 実装状況 | 備考 | +|---|------------|---------|------| +| 1 | push を 3 時点だけにし、ほかの段階は手元のコミットだけにする | ✅ 実装済み | 各スキルの「commit/push」を「commit」に直した。`review-gate` の最初に `git push` を足した。`close` は手順 3 のコミットで送る。証跡: `test_i224_push_points.sh` exit=0。ただし F1 と F2 は 3 時点の外に出る例外の漏れ。 | +| 2 | `gh issue edit --body-file` が grill-me の終わりの 1 回だけ | ✅ 実装済み | P3 が `.claude/skills/*/SKILL.md` で `grill-me` 以外を検査する。P3 の網の外が F7。 | +| 3 | 1 本のイシューの push が 4 回以内であることを、次のイシュー 1 本で実測して示す | ⚠️ 一部不足 | 実測は計画で次のイシューの retro に送ると決めている(計画 §9)。この PR の close の時点では未達のまま残る。 | +| 4 | 同時に複数のセッションで書き込まない決まりが手順書にある | ✅ 実装済み | `workflow.md` の新しい節にある。証跡: `grep -q 同時に複数のセッションで docs/runbooks/workflow.md` exit=0。 | +| 5 | review-gate の CI 待ちなど、push を前提にする確認が壊れていない | ✅ 実装済み | `review-gate` の先頭で push してから `code-review.sh` を流す。`CI_WAIT: NOT_PUSHED` の守りは残っている。 | +| 6 | 既存のハーネステスト・CI がすべて pass する | ✅ 実装済み | `test_i185_harness_docs.sh` exit=0。固定ファイルは `--update` で作り直した。全体は CI が正。 | + +## 台帳 +FINDING: F1 SEV=Medium STATUS=open FILE=.claude/skills/close/SKILL.md LINE=168 SECURITY=no STOP=- | close の手順 5.5 の後で、衝突を直したコミットを作っても push せずにマージ依頼へ進む。手順 6 は「コミット・push しない」で、`pr-base-sync.sh final` は手元の HEAD と PR の head を比べない | 再現: なし +FINDING: F2 SEV=Medium STATUS=open FILE=.claude/skills/proceed/SKILL.md LINE=35 SECURITY=no STOP=- | `merge` 段階で `/proceed` を打つたびに `pr-base-sync.sh final` が流れる。develop が進んでいると、承認後に merge コミットを push して承認を取り消し、書き込みも増える | 再現: なし +FINDING: F3 SEV=Low STATUS=open FILE=.claude/skills/close/SKILL.md LINE=126 SECURITY=no STOP=- | `STAGE_DONE: close NEXT: merge` を確認の前に書く。手順 4〜5.5 の途中で中断すると、残りの手順を飛ばして merge 段階と扱われる。計画レビューの Warning 2 で、`final` を流す対策は入れてある | 再現: なし +FINDING: F4 SEV=Low STATUS=open FILE=.claude/skills/close/SKILL.md LINE=169 SECURITY=no STOP=- | 手順 3 の後に分かったこと(最後の確認の結果など)を記録に足さず報告にだけ書くため、記録に残らない | 再現: なし +FINDING: F5 SEV=Low STATUS=open FILE=docs/runbooks/workflow.md LINE=60 SECURITY=no STOP=- | 「送り忘れても `NOT_PUSHED` で止まる」という安全網は review-gate にしか無く、close や merge の後の送り忘れは検出されない | 再現: なし +FINDING: F6 SEV=Low STATUS=open FILE=scripts/claude/tests/test_i224_push_points.sh LINE=- SECURITY=no STOP=- | P1 は `plan-issue`・`review-gate`・`close` を対象から外している。また PUSH_WORDS は「commit して push する」などの言い回しを拾わない | 再現: なし +FINDING: F7 SEV=Low STATUS=open FILE=scripts/claude/tests/test_i224_push_points.sh LINE=- SECURITY=no STOP=- | P3 は SKILL.md だけを見ており、`scripts/claude/*.sh` やエージェント定義の `gh issue edit` は検査の外 | 再現: なし +FINDING: F8 SEV=Low STATUS=open FILE=docs/runbooks/danger-ops.md LINE=37 SECURITY=no STOP=- | 「rebase の前に commit・push しておく」という旧来の指示が残っている。計画では push の指示ではないとして対象外にした | 再現: なし +FINDING: F9 SEV=Low STATUS=open FILE=- LINE=- SECURITY=no STOP=ac:3 | 受け入れ条件 3 のうち、次のイシュー 1 本での実測は未達。計画で、マージ後の retro で測ると決めている | 再現: なし + +--- + +REVIEWED_COMMIT: 05c7ae2f388365a25db9915f15fd82c6962edc55 +RISK: NO +VERDICT: OK + +## 台帳(累積・スクリプトが書く) +LEDGER: F1 SEV=Medium STATUS=open SCOPE=delta KIND=harness STOP=- REPRO=no RISK=- SECURITY=no FILE=.claude/skills/close/SKILL.md | close の手順 5.5 の後で、衝突を直したコミットを作っても push せずにマージ依頼へ進む。手順 6 は「コミット・push しない」で、`pr-base-sync.sh final` は手元の HEAD と PR の head を比べない +LEDGER: F2 SEV=Medium STATUS=open SCOPE=delta KIND=harness STOP=- REPRO=no RISK=- SECURITY=no FILE=.claude/skills/proceed/SKILL.md | `merge` 段階で `/proceed` を打つたびに `pr-base-sync.sh final` が流れる。develop が進んでいると、承認後に merge コミットを push して承認を取り消し、書き込みも増える +LEDGER: F3 SEV=Low STATUS=open SCOPE=delta KIND=harness STOP=- REPRO=no RISK=- SECURITY=no FILE=.claude/skills/close/SKILL.md | `STAGE_DONE: close NEXT: merge` を確認の前に書く。手順 4〜5.5 の途中で中断すると、残りの手順を飛ばして merge 段階と扱われる。計画レビューの Warning 2 で、`final` を流す対策は入れてある +LEDGER: F4 SEV=Low STATUS=open SCOPE=delta KIND=harness STOP=- REPRO=no RISK=- SECURITY=no FILE=.claude/skills/close/SKILL.md | 手順 3 の後に分かったこと(最後の確認の結果など)を記録に足さず報告にだけ書くため、記録に残らない +LEDGER: F5 SEV=Low STATUS=open SCOPE=delta KIND=harness STOP=- REPRO=no RISK=- SECURITY=no FILE=docs/runbooks/workflow.md | 「送り忘れても `NOT_PUSHED` で止まる」という安全網は review-gate にしか無く、close や merge の後の送り忘れは検出されない +LEDGER: F6 SEV=Low STATUS=open SCOPE=delta KIND=harness STOP=- REPRO=no RISK=- SECURITY=no FILE=scripts/claude/tests/test_i224_push_points.sh | P1 は `plan-issue`・`review-gate`・`close` を対象から外している。また PUSH_WORDS は「commit して push する」などの言い回しを拾わない +LEDGER: F7 SEV=Low STATUS=open SCOPE=delta KIND=harness STOP=- REPRO=no RISK=- SECURITY=no FILE=scripts/claude/tests/test_i224_push_points.sh | P3 は SKILL.md だけを見ており、`scripts/claude/*.sh` やエージェント定義の `gh issue edit` は検査の外 +LEDGER: F8 SEV=Low STATUS=open SCOPE=outside KIND=harness STOP=- REPRO=no RISK=- SECURITY=no FILE=docs/runbooks/danger-ops.md | 「rebase の前に commit・push しておく」という旧来の指示が残っている。計画では push の指示ではないとして対象外にした +LEDGER: F9 SEV=Low STATUS=open SCOPE=delta KIND=harness STOP=ac:3 REPRO=no RISK=- SECURITY=no FILE=- | 受け入れ条件 3 のうち、次のイシュー 1 本での実測は未達。計画で、マージ後の retro で測ると決めている +LEDGER_ROUND: 1 + +## 止める指摘(スクリプトが決めた・fix-loop が直すのはこれだけ) +(再現は本文の同じ番号の FINDING 行) + +## 組み込みのレビューの出力(公式・参考) + +### 組み込み /code-review の指摘 + +Permission allow rule "Read(*)" adds nothing to Read's default, which already runs without asking in the working directories. "Read" alone allows every path. Older versions of Claude Code treat "Read(*)" as "Read", and this version will too if Anthropic turns this change off. +Permission allow rule "Grep(*)" adds nothing to Grep's default, which already runs without asking in the working directories. "Grep" alone allows every path. Older versions of Claude Code treat "Grep(*)" as "Grep", and this version will too if Anthropic turns this change off. +Permission allow rule "Glob(*)" adds nothing to Glob's default, which already runs without asking in the working directories. "Glob" alone allows every path. Older versions of Claude Code treat "Glob(*)" as "Glob", and this version will too if Anthropic turns this change off. +```json +[ + { + "file": ".claude/skills/close/SKILL.md", + "line": 168, + "summary": "close では手順 3 の後に push しなくなった。そのため手順 5.5 の後で手元に作るコミットが GitHub に届かないまま、マージ依頼へ進む。", + "failure_scenario": "手順 5.5 の `pr-base-sync.sh final` が衝突で exit 1 を返し、「step 0 と同じ扱い」で記録の場所だけを直して commit したとする。手順 6 は「ここではコミット・push しない」ので、PR は DIRTY/BEHIND のまま。ユーザーには Approve & Merge が依頼される。`pr-base-sync.sh final` は headRefOid と手元の HEAD を比べないため、送り忘れを捕まえる仕組みもない(workflow.md が言う NOT_PUSHED の停止は review-gate にしかない)。" + }, + { + "file": ".claude/skills/proceed/SKILL.md", + "line": 35, + "summary": "merge 段階で `/proceed` を打つたびに `pr-base-sync.sh final` が流れる。develop が進んでいると、マージ待ちの PR に merge コミットを push してしまう。", + "failure_scenario": "close が依頼を済ませ、ユーザーが承認だけを済ませた後に develop が進んだとする。この状態で `/proceed I###` を打つと BEHIND と判定され、merge→`git push` が走る。承認は取り消され、gate-check を通っていない merge コミットが PR に入る。さらに、/proceed を打つたびに GitHub への書き込みと CI 待ちが起きる。これは I224 の「push は 3 時点だけ」という目的に反する。" + }, + { + "file": "scripts/claude/tests/test_i224_push_points.sh", + "line": 393, + "summary": "P1 は、push してよい 3 つのスキル(plan-issue・review-gate・close)を検査から丸ごと外している。そのため、この 3 つの結線に「commit/push」が戻っても見逃す。", + "failure_scenario": "review-gate の「## 4. 結線」や close の手順 5.5 の CI 失敗の戻しを「commit/push する」に戻しても、P1 は対象外で、P2 は行の先頭の `git push` しか数えない。テストは合格し、手順の途中で push が増える。workflow.md の「決まりの押し戻しは test_i224_push_points.sh が CI で止める」という説明と食い違う。" + }, + { + "file": "scripts/claude/tests/test_i224_push_points.sh", + "line": 385, + "summary": "PUSH_WORDS が拾うのは `commit/push`・`commit・push`・`コミット・push`・`git push` だけで、ふつうの日本語の言い回しを見逃す。", + "failure_scenario": "retro や test-gate に「commit して push する」「コミットしてから push する」「push して PR を更新する」と書き足しても、どの正規表現にも当たらず P1 は合格する。このテストが止めるとうたう「決まりを知らずに push を書き足す事故」の典型を通してしまう。" + }, + { + "file": ".claude/skills/close/SKILL.md", + "line": 126, + "summary": "`STAGE_DONE: close NEXT: merge` を手順 3(手順 4・5・5.5 より前)で書いて push するため、途中で中断すると、残りの手順を飛ばしたまま merge 段階として扱われる。", + "failure_scenario": "手順 3 の push の後、手順 4(base の確認)か手順 5(`gh pr ready`)の前でセッションが切れたとする。`/proceed` は NEXT: merge と読み、final だけを流す。DRAFT は final の exit 1 で拾えるが、手順 4 の base の確認と、手順 5.5 の exit 2(UNKNOWN が続く)を報告に書くことは飛ばされる。また、5.5 が exit 2 で止まった後に再開すると、記録の最後の行は「merge」のままで、確認が終わっていないことが分からない。" + }, + { + "file": ".claude/skills/close/SKILL.md", + "line": 169, + "summary": "手順 6 は「手順 3 の後に分かったこと(最後の確認の結果など)は記録に足さず、依頼の報告に書く」としている。CLAUDE.md の記録を残すルールに反する。", + "failure_scenario": "CLAUDE.md /mnt/c/app/study-app-multitenant/.claude/worktrees/app-1/CLAUDE.md §1-5「すべての作業は「記録(plan / tests / review)」が残る形で進める。」に当たる。手順 5.5 の final の結果(BEHIND の取り込みと push、UNKNOWN が続いたこと)は、会話の報告にしか残らない。docs/reviews/closed/I###_review.md の自律判断の記録からは追えない。" + }, + { + "file": "docs/runbooks/workflow.md", + "line": 304, + "summary": "「送り忘れても review-gate の CI 待ちが NOT_PUSHED で止まる(決定論)」と書いているが、この網が効くのは review-gate だけ。close の後や merge 段階の送り忘れは検出されない。", + "failure_scenario": "close の手順 3 の後や、proceed の merge で手元にコミットが増えた場合、review-gate はもう通らない。`pr-base-sync.sh final` も手元の HEAD と PR の head を比べない。手元にだけあるコミットは、マージされる PR に含まれないまま残る。正として参照される節が、実在しない安全網を前提にしている。" + }, + { + "file": "docs/runbooks/danger-ops.md", + "line": 37, + "summary": "danger-ops.md には「rebase の前に commit・push しておけば戻せる」という旧来の指示が残っており、新しい「push は 3 時点だけ」と食い違う。", + "failure_scenario": "rebase の前にこの記述に従って push すると、決めた 3 時点の外で GitHub に書き込むことになり、I224 が減らそうとしている書き込みの集中が起きる。test_i224_push_points.sh はスキルしか見ないため、この runbook の食い違いは検出されない。" + }, + { + "file": "scripts/claude/tests/test_i224_push_points.sh", + "line": 401, + "summary": "P3(`gh issue edit` は grill-me だけ)は SKILL.md だけを見ている。scripts/claude/*.sh やエージェント定義からイシュー本文を書き換える経路は検査の外にある。", + "failure_scenario": "スキルから呼ぶスクリプト(例: issue-bootstrap や retro が使う scripts/claude/*.sh)に `gh issue edit --body-file` を足しても P3 は合格する。「イシュー本文の書き換えは grill-me の終わりの 1 回だけ」という決まりが、スクリプトを経由すると守られない。" + } +] +``` + +### 組み込み /security-review の指摘 + +(実行していない: パス判定 NO) From 1cdef18f6ad3f83aecde293b48e8b1ff28c96e01 Mon Sep 17 00:00:00 2001 From: "osushi0404-claude[bot]" <352511081+osushi0404-claude[bot]@users.noreply.github.com> Date: Sat, 7 Nov 2026 22:39:16 +0900 Subject: [PATCH 08/11] =?UTF-8?q?docs(I224):=20review-gate=20OK=E3=83=BBST?= =?UTF-8?q?AGE=5FDONE=20review-gate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/reviews/open/I224_review.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/reviews/open/I224_review.md b/docs/reviews/open/I224_review.md index 0563d61a..abb69b2a 100644 --- a/docs/reviews/open/I224_review.md +++ b/docs/reviews/open/I224_review.md @@ -38,7 +38,9 @@ - [implement] `workflow.md` の新しい節を、`test_i185_harness_docs.sh` の固定範囲の外に置いた。固定している `plan-issue`・`fix-loop` の 2 か所はこのテストの決まりどおり `--update` で固定ファイルを作り直した — 意図した変更で、差分はレビューで見る - [implement] /simplify の指摘のうち、スキルの言い直しの統一・close と proceed の説明の短縮・テストの写す範囲(primary で全ワークツリーを写さない)・テストの引数と判定の整理は直した。`code-review.sh` に自分で push させる案(範囲の外・今も決定論で止まる)・P4 を消す案(計画で残すと決めた)・同梱の重複の整理を外す案(計画の同梱)は見送った - [implement] 手元では、変えたスキル・手順書を読むテスト 17 本だけを流した(全体は CI) +- [review-gate] 新しい手順どおり最初に `git push` してから `code-review.sh` を流した(CI_WAIT: OK=push を前提にする確認は壊れていない)。FINAL_VERDICT: OK・ADVERSARIAL_STAGE: NOT_REQUIRED(20261107_2228・ゲート 4 本 exit 0)。台帳の F1〜F9 は止める指摘でないので直さず retro へ — fix-loop が直すのは止める指摘だけ(I197) STAGE_DONE: plan NEXT: plan-review STAGE_DONE: plan-review NEXT: implement STAGE_DONE: implement NEXT: review-gate +STAGE_DONE: review-gate NEXT: test-gate From 89d5d2baedfa021651232d31f9bddea2849cd4a6 Mon Sep 17 00:00:00 2001 From: "osushi0404-claude[bot]" <352511081+osushi0404-claude[bot]@users.noreply.github.com> Date: Sat, 7 Nov 2026 22:40:04 +0900 Subject: [PATCH 09/11] =?UTF-8?q?docs(I224):=20test-gate=EF=BC=88M-01?= =?UTF-8?q?=E3=83=BBM-02=20OK=EF=BC=89=E3=83=BBSTAGE=5FDONE=20test-gate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/reviews/open/I224_review.md | 6 ++++-- docs/tests/open/I224_auto_test.md | 1 + docs/tests/open/I224_manual_test.md | 6 +++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/reviews/open/I224_review.md b/docs/reviews/open/I224_review.md index abb69b2a..be4fe68e 100644 --- a/docs/reviews/open/I224_review.md +++ b/docs/reviews/open/I224_review.md @@ -18,8 +18,8 @@ - Config: `.claude/skills/` の 10 本・`docs/runbooks/workflow.md`・`docs/runbooks/worktree.md`・`docs/runbooks/plan-writing-rules.md`・`scripts/claude/tests/test_i224_push_points.sh`・`scripts/claude/tests/fixtures/i185/`・`docs/reviews/backlog/I226.md` ## テスト結果 -- 自動: (test-gate で記入) -- 手動: (test-gate で記入) +- 自動: OK — review-gate がゲート 4 本を実走し全 exit 0・CI 全緑。test-gate に回された重いゲートは無い +- 手動: OK — M-01(push の回数: test-gate の時点で計 3 回・implement より後は 1 回)・M-02(新しいスキルの要所)を Claude が実施(Human の項目なし) ## 計画との差分 - 振る舞いの差分なし。節の置き場所・固定ファイルの作り直し・言い回しの整理は計画変更記録 2 のとおり @@ -39,8 +39,10 @@ - [implement] /simplify の指摘のうち、スキルの言い直しの統一・close と proceed の説明の短縮・テストの写す範囲(primary で全ワークツリーを写さない)・テストの引数と判定の整理は直した。`code-review.sh` に自分で push させる案(範囲の外・今も決定論で止まる)・P4 を消す案(計画で残すと決めた)・同梱の重複の整理を外す案(計画の同梱)は見送った - [implement] 手元では、変えたスキル・手順書を読むテスト 17 本だけを流した(全体は CI) - [review-gate] 新しい手順どおり最初に `git push` してから `code-review.sh` を流した(CI_WAIT: OK=push を前提にする確認は壊れていない)。FINAL_VERDICT: OK・ADVERSARIAL_STAGE: NOT_REQUIRED(20261107_2228・ゲート 4 本 exit 0)。台帳の F1〜F9 は止める指摘でないので直さず retro へ — fix-loop が直すのは止める指摘だけ(I197) +- [test-gate] gate-check OK。M-01・M-02 を自分で行い OK。M-01 の最終の数(close の ③ の後)は close の報告に書く — close の後は記録に足さない決まり(新しい close の手順 6) STAGE_DONE: plan NEXT: plan-review STAGE_DONE: plan-review NEXT: implement STAGE_DONE: implement NEXT: review-gate STAGE_DONE: review-gate NEXT: test-gate +STAGE_DONE: test-gate NEXT: retro diff --git a/docs/tests/open/I224_auto_test.md b/docs/tests/open/I224_auto_test.md index 2dd035d7..db27b190 100644 --- a/docs/tests/open/I224_auto_test.md +++ b/docs/tests/open/I224_auto_test.md @@ -32,6 +32,7 @@ | 2026-11-07 | TC-02(実装前の数え) | — | 行の先頭の `git push`: `plan-issue` 2・`review-gate` 0・`close` 1。`gh issue edit` は `grill-me` だけ。テストは実装前のため未作成 | | 2026-11-07 | TC-02(テストを先に書き、本体を直す前) | 期待どおり NG | P1 が 13 か所・P2(`review-gate` 0 行)・P4(節なし)で不合格 | | 2026-11-07 | TC-02・TC-03・TC-04(実装と /simplify の後) | OK | `test_i224_push_points.sh` pass=9 fail=0(FG 4 つとも、その決まりで不合格になることを含む)・`grep -q` exit 0・`bash -n` exit 0 | +| 2026-11-07 | TC-01〜TC-04(review-gate の実走・05c7ae2f) | OK | `code-review.sh` がゲート 4 本を実走しすべて exit=0・CI 全緑(`docs/reviews/I224_code_review_20261107_2228.md`)。test-gate に回された重いゲートは無い。gate-check OK | | 2026-11-07 | TC-01(変えたスキル・手順書を読むテスト 17 本だけ手元で) | OK | `test_i185_harness_docs.sh`(固定ファイルを `--update` で作り直した後)・`test_i193_official_flow.sh` ほか 17 本がすべて exit 0。全体は CI | ## 決定論ゲート(自動実走) diff --git a/docs/tests/open/I224_manual_test.md b/docs/tests/open/I224_manual_test.md index 79ae45a0..ac90403b 100644 --- a/docs/tests/open/I224_manual_test.md +++ b/docs/tests/open/I224_manual_test.md @@ -8,7 +8,7 @@ | No | 手順 | 期待結果 | 実施者 | 実結果 | 備考 | |---:|------|----------|--------|--------|------| -| M-01 | I224 自身のブランチへの push の回数を数える: `git reflog show --date=iso refs/remotes/origin/feature/I224-batch-github-writes`(test-gate で数え、close の後にもう一度数えて retro・close の報告に書く) | implement の後(新しいスキルで動く review-gate〜close)の `update by push` が 3 回以内(review-gate の前 1・fix-loop のやり直しごとに +1・close 1・BEHIND のときの取り込み +1)。review-gate の CI 待ちが `CI_WAIT: OK` で通っている(push を前提にする確認が壊れていない)。PR へのコメントの回数(`gh pr view 420 --json comments,reviews` の件数)も並べて記録する | Claude | | plan-issue〜implement は古いスキルで動くので数に入れない(区切りは implement の結線のコミット) | -| M-02 | 新しいスキルを読み、段階の終わりの指示を確かめる: `review-gate` の「## 1.」の最初に `git push`、`test-gate`・`retro` の結線に push が無い、`close` の手順 3 のコミットに `STAGE_DONE: close NEXT: merge` が入る、`proceed` の `merge` の行が依頼の前に `pr-base-sync.sh final` を流す | 4 点とも計画 4-2 のとおり | Claude | | TC-02 の P1・P2 で数は機械的に確かめる。ここは流れとして読めるか | +| M-01 | I224 自身のブランチへの push の回数を数える: `git reflog show --date=iso refs/remotes/origin/feature/I224-batch-github-writes`(test-gate で数え、close の後にもう一度数えて retro・close の報告に書く) | implement の後(新しいスキルで動く review-gate〜close)の `update by push` が 3 回以内(review-gate の前 1・fix-loop のやり直しごとに +1・close 1・BEHIND のときの取り込み +1)。review-gate の CI 待ちが `CI_WAIT: OK` で通っている(push を前提にする確認が壊れていない)。PR へのコメントの回数(`gh pr view 420 --json comments,reviews` の件数)も並べて記録する | Claude | OK(2026-11-07 test-gate の時点・05c7ae2f): push は計 3 回(22:12 plan-issue の ①・22:15 古いスキルでの計画文書・22:28 review-gate の ②)。implement より後は review-gate の 1 回だけで、`CI_WAIT: OK`。PR へのコメントは 0・レビューのコメントは 2(計画レビュー・コードレビュー)。close の ③ の後の最終の数は close の報告に書く(見込み: 計 4 回・implement より後は 2 回) | plan-issue〜implement は古いスキルで動くので数に入れない(区切りは implement の結線のコミット) | +| M-02 | 新しいスキルを読み、段階の終わりの指示を確かめる: `review-gate` の「## 1.」の最初に `git push`、`test-gate`・`retro` の結線に push が無い、`close` の手順 3 のコミットに `STAGE_DONE: close NEXT: merge` が入る、`proceed` の `merge` の行が依頼の前に `pr-base-sync.sh final` を流す | 4 点とも計画 4-2 のとおり | Claude | OK(2026-11-07・05c7ae2f): `review-gate` 16〜19 行に送る手順と `git push`。`test-gate`・`retro` の「push」は「push しない」の参照だけ。`close` 126 行の手順 3 のコミットに `STAGE_DONE: close NEXT: merge`。`proceed` 35 行の `merge` が `pr-base-sync.sh final` を流す | TC-02 の P1・P2 で数は機械的に確かめる。ここは流れとして読めるか | -結論: OK / NG +結論: OK From ec5341872c88d18af6009ba8bf23c32a8ed76e58 Mon Sep 17 00:00:00 2001 From: "osushi0404-claude[bot]" <352511081+osushi0404-claude[bot]@users.noreply.github.com> Date: Sat, 7 Nov 2026 22:40:51 +0900 Subject: [PATCH 10/11] =?UTF-8?q?docs(I224):=20retro=EF=BC=88=E5=8F=B0?= =?UTF-8?q?=E5=B8=B3=E3=81=AE=E6=AE=8B=E3=82=8A=E3=81=AF=E4=B8=80=E8=A6=A7?= =?UTF-8?q?=E3=81=B8=EF=BC=89=E3=83=BBSTAGE=5FDONE=20retro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/reviews/backlog/I224.md | 15 ++++++++++++ docs/reviews/open/I224_review.md | 41 ++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 docs/reviews/backlog/I224.md diff --git a/docs/reviews/backlog/I224.md b/docs/reviews/backlog/I224.md new file mode 100644 index 00000000..972eb616 --- /dev/null +++ b/docs/reviews/backlog/I224.md @@ -0,0 +1,15 @@ +# I224 の台帳の残り(軽い指摘の一覧) + +- 記録: `docs/reviews/I224_code_review_20261107_2228.md`(close の後は `docs/reviews/closed/`) +- 一覧に回した決まり: `.claude/skills/retro/SKILL.md` 4-0(Low、または再現なし。後続イシューにしない) +- 見る場所: `.claude/skills/plan-issue/SKILL.md`「台帳の残りの一覧」(実装対象のファイルに当たる行を、同梱するか残すか決める。同梱して直した行は消し、行が無くなったらこのファイルを消す) + +- F1 SEV=Medium REPRO=no KIND=harness FILE=.claude/skills/close/SKILL.md | close の手順 5.5 の後で、衝突を直したコミットを作っても push せずにマージ依頼へ進む。手順 6 は「コミット・push しない」で、`pr-base-sync.sh final` は手元の HEAD と PR の head を比べない | 一覧に回した理由: 再現なし +- F2 SEV=Medium REPRO=no KIND=harness FILE=.claude/skills/proceed/SKILL.md | `merge` 段階で `/proceed` を打つたびに `pr-base-sync.sh final` が流れる。develop が進んでいると、承認後に merge コミットを push して承認を取り消し、書き込みも増える | 一覧に回した理由: 再現なし +- F3 SEV=Low REPRO=no KIND=harness FILE=.claude/skills/close/SKILL.md | `STAGE_DONE: close NEXT: merge` を確認の前に書く。手順 4〜5.5 の途中で中断すると、残りの手順を飛ばして merge 段階と扱われる。計画レビューの Warning 2 で、`final` を流す対策は入れてある | 一覧に回した理由: Low/再現なし +- F4 SEV=Low REPRO=no KIND=harness FILE=.claude/skills/close/SKILL.md | 手順 3 の後に分かったこと(最後の確認の結果など)を記録に足さず報告にだけ書くため、記録に残らない | 一覧に回した理由: Low/再現なし +- F5 SEV=Low REPRO=no KIND=harness FILE=docs/runbooks/workflow.md | 「送り忘れても `NOT_PUSHED` で止まる」という安全網は review-gate にしか無く、close や merge の後の送り忘れは検出されない | 一覧に回した理由: Low/再現なし +- F6 SEV=Low REPRO=no KIND=harness FILE=scripts/claude/tests/test_i224_push_points.sh | P1 は `plan-issue`・`review-gate`・`close` を対象から外している。また PUSH_WORDS は「commit して push する」などの言い回しを拾わない | 一覧に回した理由: Low/再現なし +- F7 SEV=Low REPRO=no KIND=harness FILE=scripts/claude/tests/test_i224_push_points.sh | P3 は SKILL.md だけを見ており、`scripts/claude/*.sh` やエージェント定義の `gh issue edit` は検査の外 | 一覧に回した理由: Low/再現なし +- F8 SEV=Low REPRO=no KIND=harness FILE=docs/runbooks/danger-ops.md | 「rebase の前に commit・push しておく」という旧来の指示が残っている。計画では push の指示ではないとして対象外にした | 一覧に回した理由: Low/再現なし +- F9 SEV=Low REPRO=no KIND=harness FILE=- | 受け入れ条件 3 のうち、次のイシュー 1 本での実測は未達。計画で、マージ後の retro で測ると決めている | 一覧に回した理由: Low/再現なし diff --git a/docs/reviews/open/I224_review.md b/docs/reviews/open/I224_review.md index be4fe68e..89c94692 100644 --- a/docs/reviews/open/I224_review.md +++ b/docs/reviews/open/I224_review.md @@ -27,6 +27,44 @@ ## ロールバック - PR を revert する +## 振り返り + +### かんたんなまとめ +良かった点 +- 新しい決まりで I224 自身の review-gate から先を進められた(理由: 決まりを作ったその場で使い、push を前提にする確認〔CI 待ち〕が壊れていないことを実際に確かめられた。implement より後の push は review-gate の 1 回だけ) +- 手順書の書き方を戻してしまう事故を、テストで止める形にした(理由: push が増えても CI も画面も気づかないので、人の注意に頼れない) +- 変えた手順書を読む既存のテスト 17 本を、コミットの前に手元で流した(理由: 手順の写しを固定しているテストに、新しい節がぶつかるのをその場で見つけ、置き場所を変えて済ませられた) + +今回の問題への直接の対処 +- なし。レビューの残り 9 件(中くらい 2・軽い 7)は、どれも再現が無いか軽いので、決まりどおり軽い指摘の一覧に入れた。中くらいの 2 件(close の最後の確認の後に直したコミットが送られない・`/proceed` で最後の確認を流し直すと承認が取り消されうる)は、次に close・proceed を直すときに一覧から拾う + +同じ問題を次回から防ぐ改善 +- 新しい決まりは足さない。固定範囲とのぶつかりは既存のテストがその場で捕まえ、手戻りは置き場所の移動だけだった +- 受け入れ条件の残り(次のイシュー 1 本での push の回数)は、次のイシューの計画で測ることにして、マージ依頼の報告とメモリに残す + +### 詳細 +良かった点 +- 新しいスキルで review-gate〜close を回し、M-01 で push の回数を実測(`docs/tests/open/I224_manual_test.md`)・決定論のテスト P1〜P4 と FG(`test_i224_push_points.sh`)・関係テスト 17 本の手元実行で固定範囲(`test_i185_harness_docs.sh`)とのぶつかりを実装中に発見 + +是正処置(Corrective) +| # | カテゴリ | 根本原因 | 対処内容 | +|---|---------|---------|---------| +| (なし) | | | | + +予防処置(Preventive) +| # | カテゴリ | 根本原因 | 予防策 | 対象ファイル | +|---|---------|---------|--------|------------| +| (なし) | | | | | + +見送り +- 「手順書に節を足すときは、固定しているテストの範囲を先に確かめる」を計画の決まりに足す: 見送り — 既存のテストがその場で捕まえ、手戻りは置き場所の移動だけ(2.7 の問 2) + +5 Whys: 新しい節が手順の写しの固定範囲に入った +- Why 1: なぜ固定のテストが落ちたか → 新しい節を「## 記録とつなぎ」の直前に置き、そこが「## 止めて聞く条件」からの固定範囲の中だった +- Why 2: なぜその場所に置いたか → 内容が近い節の隣を選び、固定の範囲を見ていなかった +- Why 3: なぜ見ていなかったか → 固定の範囲はテストの中にだけ書かれていて、手順書の側からは見えない +- 根本原因: 手順書の一部をテストで固定していることが、手順書の側から見えない。ただし変えた手順書を読むテストを流す手順でその場で捕まり、手戻りは小さいので、新しい手順は足さない + ## 自律判断の記録 - [plan] 決まりの正を `workflow.md` の 1 節にし、スキルは参照だけにした — 写しを増やさない(I195) - [plan] `STAGE_DONE: close NEXT: merge` を close の手順 3 のコミットに入れる — 結線のためだけの 4 回目の push を無くす @@ -40,9 +78,12 @@ - [implement] 手元では、変えたスキル・手順書を読むテスト 17 本だけを流した(全体は CI) - [review-gate] 新しい手順どおり最初に `git push` してから `code-review.sh` を流した(CI_WAIT: OK=push を前提にする確認は壊れていない)。FINAL_VERDICT: OK・ADVERSARIAL_STAGE: NOT_REQUIRED(20261107_2228・ゲート 4 本 exit 0)。台帳の F1〜F9 は止める指摘でないので直さず retro へ — fix-loop が直すのは止める指摘だけ(I197) - [test-gate] gate-check OK。M-01・M-02 を自分で行い OK。M-01 の最終の数(close の ③ の後)は close の報告に書く — close の後は記録に足さない決まり(新しい close の手順 6) +- [retro] 台帳の残りの振り分け: 後続イシューに回す行は 0 件。F1〜F9 → `docs/reviews/backlog/I224.md` — `code-review.sh --route` の結果に従った(F1・F2 は Medium だが再現なし) +- [retro] 予防処置は足さない — 固定範囲とのぶつかりは既存のテストがその場で捕まえた(2.7 の問 2)。受け入れ条件 3 の残り(次のイシュー 1 本での push の回数)は、マージ依頼の報告とメモリに残し、次のイシューの計画で測る STAGE_DONE: plan NEXT: plan-review STAGE_DONE: plan-review NEXT: implement STAGE_DONE: implement NEXT: review-gate STAGE_DONE: review-gate NEXT: test-gate STAGE_DONE: test-gate NEXT: retro +STAGE_DONE: retro NEXT: close From 88dc77bbe0ab55dbe56e8bc0e44702b3fb6cd0ff Mon Sep 17 00:00:00 2001 From: "osushi0404-claude[bot]" <352511081+osushi0404-claude[bot]@users.noreply.github.com> Date: Sat, 7 Nov 2026 22:41:50 +0900 Subject: [PATCH 11/11] =?UTF-8?q?close(I224):=20=E8=A8=98=E9=8C=B2?= =?UTF-8?q?=E3=82=92=20closed=20=E3=81=B8=E7=A7=BB=E3=81=99=E3=83=BBSTAGE?= =?UTF-8?q?=5FDONE=20close=EF=BC=88=E3=83=9E=E3=83=BC=E3=82=B8=E4=BE=9D?= =?UTF-8?q?=E9=A0=BC=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/issues/{open => closed}/I224.md | 0 docs/plans/{open => closed}/plan_I224.md | 2 +- docs/reviews/{ => closed}/I224_code_review_20261107_2228.md | 0 docs/reviews/{ => closed}/I224_issue_review_20261105_0325.md | 0 docs/reviews/{ => closed}/I224_plan_review_20261107_2215.md | 0 docs/reviews/{open => closed}/I224_review.md | 2 ++ docs/tests/{open => closed}/I224_auto_test.md | 0 docs/tests/{open => closed}/I224_manual_test.md | 0 8 files changed, 3 insertions(+), 1 deletion(-) rename docs/issues/{open => closed}/I224.md (100%) rename docs/plans/{open => closed}/plan_I224.md (99%) rename docs/reviews/{ => closed}/I224_code_review_20261107_2228.md (100%) rename docs/reviews/{ => closed}/I224_issue_review_20261105_0325.md (100%) rename docs/reviews/{ => closed}/I224_plan_review_20261107_2215.md (100%) rename docs/reviews/{open => closed}/I224_review.md (96%) rename docs/tests/{open => closed}/I224_auto_test.md (100%) rename docs/tests/{open => closed}/I224_manual_test.md (100%) diff --git a/docs/issues/open/I224.md b/docs/issues/closed/I224.md similarity index 100% rename from docs/issues/open/I224.md rename to docs/issues/closed/I224.md diff --git a/docs/plans/open/plan_I224.md b/docs/plans/closed/plan_I224.md similarity index 99% rename from docs/plans/open/plan_I224.md rename to docs/plans/closed/plan_I224.md index e6beeecf..ad8b61b2 100644 --- a/docs/plans/open/plan_I224.md +++ b/docs/plans/closed/plan_I224.md @@ -146,4 +146,4 @@ Danger Ops(有無/手順/ロールバック): 2. 実装の途中と /simplify での調整(方式・範囲は変えない): (a) `workflow.md` の新しい節の置き場所を「## 記録とつなぎ」の後ろ(「## ゲート」の前)にした — 「## 止めて聞く条件」〜「## 記録とつなぎ」は `test_i185_harness_docs.sh` が写しで固定している範囲で、その中に入れないため (b) `plan-issue` の「この先へ続ける」と `fix-loop` の手順 8 は同じテストが固定しているので、`--update` で固定ファイル(`scripts/claude/tests/fixtures/i185/plan_issue_continue_section.txt`・`fix_loop_return.txt`)を作り直した(このテストの決まりどおり。差分はレビューで見る) (c) 各スキルの「push しない。次に送るのは…」の言い直しを、正への参照「(push しない・`docs/runbooks/workflow.md`「GitHub への書き込みの時点」)」にそろえた(写しを持たない) (d) close の手順 3・6 と proceed の `merge` の行の経緯の説明を短くした (e) テストはルートの引数をやめ、FG は `.claude/skills` だけを写す・不合格と「その決まりとして出たか」を分けて確かめる形にした。見送り: `code-review.sh` に自分で push させる案(スクリプトの作りを変える範囲の変更。今の形でも送り忘れは `CI_WAIT: NOT_PUSHED` で決定論で止まる)・P4 を消す案(§9 で決めたとおり、P1〜P3 の決まりの正を指すため 1 行残す)。計画レビューのやり直し: 不要 ## レビュー結果 -- [20261107_2215 判定: ✅ 完了](../../reviews/I224_plan_review_20261107_2215.md) +- [20261107_2215 判定: ✅ 完了](../../reviews/closed/I224_plan_review_20261107_2215.md) diff --git a/docs/reviews/I224_code_review_20261107_2228.md b/docs/reviews/closed/I224_code_review_20261107_2228.md similarity index 100% rename from docs/reviews/I224_code_review_20261107_2228.md rename to docs/reviews/closed/I224_code_review_20261107_2228.md diff --git a/docs/reviews/I224_issue_review_20261105_0325.md b/docs/reviews/closed/I224_issue_review_20261105_0325.md similarity index 100% rename from docs/reviews/I224_issue_review_20261105_0325.md rename to docs/reviews/closed/I224_issue_review_20261105_0325.md diff --git a/docs/reviews/I224_plan_review_20261107_2215.md b/docs/reviews/closed/I224_plan_review_20261107_2215.md similarity index 100% rename from docs/reviews/I224_plan_review_20261107_2215.md rename to docs/reviews/closed/I224_plan_review_20261107_2215.md diff --git a/docs/reviews/open/I224_review.md b/docs/reviews/closed/I224_review.md similarity index 96% rename from docs/reviews/open/I224_review.md rename to docs/reviews/closed/I224_review.md index 89c94692..9d0acb34 100644 --- a/docs/reviews/open/I224_review.md +++ b/docs/reviews/closed/I224_review.md @@ -80,6 +80,7 @@ - [test-gate] gate-check OK。M-01・M-02 を自分で行い OK。M-01 の最終の数(close の ③ の後)は close の報告に書く — close の後は記録に足さない決まり(新しい close の手順 6) - [retro] 台帳の残りの振り分け: 後続イシューに回す行は 0 件。F1〜F9 → `docs/reviews/backlog/I224.md` — `code-review.sh --route` の結果に従った(F1・F2 は Medium だが再現なし) - [retro] 予防処置は足さない — 固定範囲とのぶつかりは既存のテストがその場で捕まえた(2.7 の問 2)。受け入れ条件 3 の残り(次のイシュー 1 本での push の回数)は、マージ依頼の報告とメモリに残し、次のイシューの計画で測る +- [close] 新しい手順で、close の分の記録と `STAGE_DONE: close NEXT: merge` を手順 3 のコミットに入れて 1 回だけ送った。最後の確認の結果と最終の push の回数はマージ依頼の報告に書く — 手順 3 の後は記録に足さない決まり STAGE_DONE: plan NEXT: plan-review STAGE_DONE: plan-review NEXT: implement @@ -87,3 +88,4 @@ STAGE_DONE: implement NEXT: review-gate STAGE_DONE: review-gate NEXT: test-gate STAGE_DONE: test-gate NEXT: retro STAGE_DONE: retro NEXT: close +STAGE_DONE: close NEXT: merge diff --git a/docs/tests/open/I224_auto_test.md b/docs/tests/closed/I224_auto_test.md similarity index 100% rename from docs/tests/open/I224_auto_test.md rename to docs/tests/closed/I224_auto_test.md diff --git a/docs/tests/open/I224_manual_test.md b/docs/tests/closed/I224_manual_test.md similarity index 100% rename from docs/tests/open/I224_manual_test.md rename to docs/tests/closed/I224_manual_test.md