Skip to content

feat: I224 GitHub への書き込み(イシューの書き換え・コメント・push)の回数を絞り、短い間に集中しないようにする - #420

Merged
oshui0404 merged 11 commits into
developfrom
feature/I224-batch-github-writes
Nov 7, 2026
Merged

oshui0404 merged 11 commits into
developfrom
feature/I224-batch-github-writes

Conversation

@osushi0404-claude

@osushi0404-claude osushi0404-claude Bot commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

外部からの PR は受け付けていません(CONTRIBUTING.md)。このテンプレートはメンテナ用です。

概要

GitHub への書き込みが短い間に集中しないよう、push を要る 3 時点(下書き PR の作成・review-gate の CI 待ちの前・close の最後の確認の前)にまとめた。ほかの段階は手元でコミットだけする。イシュー本文の書き換えは grill-me の終わりの 1 回だけにし、同時に複数のセッションで書き込まない決まりを書いた。決まりを戻してしまう書き方は決定論のテストで止める。

  • 背景: 2026-10-30 の bot の停止(短い間の書き込みの集中がきっかけと見ている)の再発防止
  • 実測: I226 は push 10 回 → I224 は計 4 回の見込み(新しいスキルで動いた implement より後は 2 回)

関連イシュー

Closes #413

変更点

  • docs/runbooks/workflow.md: 新しい節「## GitHub への書き込みの時点(I224)」(決まりの正)
  • .claude/skills/ の 10 本: 「commit/push」を「commit(push しない・正への参照)」に。review-gate の最初に git push。close は手順 3 のコミットに STAGE_DONE: close NEXT: merge を入れる。proceed の merge は依頼の前に pr-base-sync.sh final を流す
  • docs/runbooks/worktree.md・docs/runbooks/plan-writing-rules.md: push の言い回しを合わせた(同梱: I226 の軽い指摘 F2 の重複の整理)
  • scripts/claude/tests/test_i224_push_points.sh(新規): push の指示がある場所・git push の行数・gh issue edit の場所・正の節の有無を確かめる(失敗の注入つき)
  • scripts/claude/tests/fixtures/i185/: 手順の写しを固定するテストの固定ファイル 2 つを作り直した(意図した変更)
  • 軽い指摘の一覧: docs/reviews/backlog/I224.md(新規)・docs/reviews/backlog/I226.md(同梱した F2 を消した)

テスト確認

  • CI(自動テスト)pass 確認(review-gate で CI 全緑・決定論ゲート 4 本 exit 0)
  • 手動テスト確認(docs/tests/closed/I224_manual_test.md。M-01・M-02 を Claude が実施・OK)

ロールバック手順

  • この PR を revert する(手順書とテストだけ)

参照ドキュメント

  • 計画書: docs/plans/closed/plan_I224.md
  • レビュー: docs/reviews/closed/I224_review.md・docs/reviews/closed/I224_code_review_20261107_2228.md
  • テスト: docs/tests/closed/I224_auto_test.md・docs/tests/closed/I224_manual_test.md

🤖 Generated with Claude Code

osushi0404-claude Bot and others added 3 commits November 7, 2026 22:12
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@osushi0404-claude osushi0404-claude Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

計画書レビュー [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

@osushi0404-claude osushi0404-claude Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

決定論ゲート実行結果(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: 05c7ae2
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.

[
  {
    "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)

osushi0404-claude Bot and others added 4 commits November 7, 2026 22:39
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@osushi0404-claude
osushi0404-claude Bot marked this pull request as ready for review November 7, 2026 13:42
@oshui0404
oshui0404 merged commit 1c6ebdd into develop Nov 7, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

I224: GitHub への書き込み(イシューの書き換え・コメント・push)の回数を絞り、短い間に集中しないようにする

1 participant