tasks/prompts/handover_*.md に届いた依頼を、main への merge event を trigger に自動で消化する仕組みの運用手順。

決定: ADR-0197 (docs/adr/0197-auto-consume-inter-clone-inbox-on-merge.md)。起案規約 (frontmatter 必須 field / type 判定 / mechanical allow-list): .claude/rules/handover.md

いま何がある (2026-07-03 時点 · Phase 2b shipping 済)

成果物ファイル状態
lint scriptscripts/handover-frontmatter-lint.mjs稼働中 (Phase 1 shipping · PR #4213)
lint workflow.github/workflows/handover-lint.yml稼働中
消化 scriptscripts/inbox_consume.sh稼働中 (Phase 2b shipping · guard 3 種 + Claude CLI 発火 · default dry-run)
reusable 消化 workflow.github/workflows/reusable-inbox-consume.yml稼働中 (Phase 2b shipping)
消化 workflow (5 clone).github/workflows/inbox-consume-{main,doc,drp,mas,ocr}.yml5 本稼働中 (Phase 2b shipping · reusable 呼び出し · feature flag off default)
月次レポート dirdocs/_internal/06_ops/inbox_consume_report/稼働中 (Phase 3 shipping)
cost 集計 script + workflowscripts/inbox-consume-metrics.mjs + .github/workflows/inbox-cost-report.yml稼働中 (Phase 4 shipping)

type 分類の概要

詳細は .claude/rules/handover.md。この節は運用者向けの要約。

type消化経路
handover (既存互換)受信クローンの人間が session で読む全ての session close handover · 通常の申し送り
order-mechanicalworkflow が Claude Code CLI headless で自動消化archive 退避 · workflow 1 step 追加 · lint 追加 · frontmatter fix
order-needs-approvalworkflow が Issue 起票のみ · 人間判断待ちPipeline 発火 · 撤退判断 · ADR flip · 新規 script 実装

type を書き忘れた handover は lint が PR で block する。lint が誤って通した場合でも消化 script 側で order-needs-approval 相当扱いにする二重防御。

発火経路

各クローン向け workflow (inbox-consume-<role>.yml) は次で発火する。

  • trigger: push: branches: [main] + paths: [tasks/prompts/handover_*_to_<role>.md]
  • concurrency: group: inbox-consume-<role> · cancel-in-progress: false
  • permissions: contents: read · pull-requests: read (Phase 2b で write 追加予定)

手順:

  1. 起票者が handover_YYYY-MM-DD_topic_to_<role>.md を書き、frontmatter に必須 6 field + 適切な type を記入
  2. handover-lint が PR で緑になったら merge
  3. main への merge で inbox-consume-<role> workflow が起動
  4. 変更のあった handover を 1 本ずつ scripts/inbox_consume.sh に渡して消化
  5. 消化完了で tasks/prompts/archive/git mv (ADR-0134)

feature flag / dry-run 切替

Phase 2b shipping 時点でも消化 workflow は完全 no-op default。有効化は明示的に repo variable + secret を set する。

variable / secret意味default有効化
INBOX_CONSUME_ENABLED (variable)workflow を実行するかfalse (no-op)gh variable set INBOX_CONSUME_ENABLED --body true
INBOX_CONSUME_DRY_RUN (variable)実行するが Claude Code CLI を発火しないtrue (dry-run)gh variable set INBOX_CONSUME_DRY_RUN --body false
CLAUDE_API_KEY (secret)Claude Code CLI 用 API key (CLAUDE_CODE_ANTHROPIC_API_KEY として export)未設定gh secret set CLAUDE_API_KEY --body '<key>' (dry-run false 時のみ必須)

撤退の 30 秒手順: INBOX_CONSUME_ENABLED を false に戻すだけで完全停止。secret 失効は Anthropic Console で。

guard 3 種 (§3.2 盲点 1/3/6 対応)

dry-run false = 本番実行時に発火する 3 つの guard。

guard検出内容動作
allow-list guardClaude Code CLI 生成 diff の変更 file path が allow-list 外PR を draft 化 · 人手 review 要
secret scan (gitleaks)生成 diff に secret / API key / credential 検出PR を draft 化 · 人手 review 要
revert commit guardtrigger commit が Revert ... messageworkflow skip (再消化回避)

allow-list (2026-07-03 時点)

以下の path pattern のみ mechanical で許可。他は draft PR で人手 review 要。

  • .github/workflows/*.yml · .yaml (workflow 追加 · 既存に 1 step 追加)
  • scripts/*.{sh,mjs,js,py,ts} · scripts/lib/*.{sh,mjs,js,ts} (script 追加 · lib 修正)
  • tasks/prompts/archive/handover_*.md (archive 退避)
  • tasks/prompts/handover_*.md (通知 handover 起票)
  • .claude/rules/*.md (path-scoped rule 追加 · lint 追記)
  • docs/_internal/**/*.md (docs 追記)
  • docs/adr/adr-index.json · docs/adr/INDEX.md (adr-index 再生成)
  • docs/_config.json (nav 登録)

allow-list の拡張: 新規 pattern の追加は ADR 改訂を必須とし、追加 PR は必ず order-needs-approval 扱い (盲点 7 対応)。allow-list 更新の PR 自身は自動消化不可 (self-approval 禁止)。

trouble-shooting

workflow が発火したのに handover が消化されない

  • 確認 1: INBOX_CONSUME_ENABLED == 'true' が set されているか (gh variable list)
  • 確認 2: handover の typeorder-mechanical か (handover / order-needs-approval は自動消化しない)
  • 確認 3: handover の target_session が workflow の <role> と一致するか
  • 確認 4: revert commit / archive 退避後の delete で paths filter に該当したケース (workflow log の SKIP ログを見る)

Claude Code CLI 呼び出しで fail

Phase 2b で有効化。job の 10 分 timeout 超過 · Claude CLI 未 install · secret 未設定で fail する設計。

  • timeout: workflow が自動で inbox-consume-failure label 付きの Issue を起票 · 人間 fallback で消化 (.claude/rules/handover.md 準拠で手動対応)
  • secret 未設定: CLAUDE_API_KEY を追加するか、INBOX_CONSUME_DRY_RUN=true に戻して dry-run 縮退
  • cost 超過: allow-list を絞り込むか mechanical 分類を見直す (§8-2 撤退条件)

guard 逸脱で PR が draft 化された

  • allow-list 逸脱: scripts/inbox_consume.shallow_list_regex と実際の変更 file を照合。allow-list 拡張が妥当なら ADR 改訂で追加 · 妥当でなければ手動 revert
  • secret 検出: gitleaks log (/tmp/gitleaks.log) で detect した line を確認 · 誤検出なら .gitleaks.toml で allowlist · 実 secret なら key rotation + 削除 commit

handover-lint が緑にならない

scripts/handover-frontmatter-lint.mjs の findings を見る。主要 rule:

  • no-frontmatter: ---\n...\n--- が無い
  • missing-<field>: 必須 6 field のいずれかが欠落
  • empty-<field>: 値が空 or 空白のみ
  • invalid-type: type の値が allow-list 3 種 (handover / order-mechanical / order-needs-approval) の外

ローカル実行: node scripts/handover-frontmatter-lint.mjs tasks/prompts/handover_YYYY-MM-DD_...md

GitHub Actions 60 日 disable 挙動 (ADR-0197 §盲点 9)

GitHub は 60 日間 push が無い repo の schedule / push trigger の workflow を自動 disable する。本 workflow は次で対処する。

  • push trigger: bizlp-gas-accounting は日次で複数 PR が merge されるため 60 日連続 push なしは想定外。cron 系より安全。
  • stale 検知: docs/_internal/06_ops/inbox_consume_report/YYYY-MM.md の月次レポートで run_count = 0 が 3 ヶ月継続したら disable を疑う (ADR-0197 §8 撤退条件 4 の前段)
  • 再起動: gh workflow enable inbox-consume-main.yml

関連