Dependabot Update Triage Workflow
Dependabot が開いた依存更新 PR を一括で取り込み、各更新を upstream リポジトリまで遡って リスク分析し、マージ可否の判断材料を Design Doc としてユーザーに返す。ユーザーが採否を 決定したら、承認分を反映し、判断結果と根拠を ADR に記録する。
なぜ全 PR でリスク分析を必須にするか
サプライチェーン攻撃(メンテナアカウントの乗っ取り、悪意ある postinstall スクリプトの
混入、リポジトリ移管後の改ざん、typosquatting な transitive 依存の追加)が増えており、
semver の bump 種別(patch / minor / major)や互換性スコアだけでは安全性を判断できない。
patch であっても公開物に悪意あるコードが含まれうる。
このため本 skill は bump 種別を問わずすべての PR を upstream まで遡って確認し、 リスク分析を省略しない。「patch だから自動マージ」という分岐は設けない。
前提条件
gh auth statusで GitHub 認証済みであること- ホスト repo が Dependabot(
.github/dependabot.yml)を有効化していること - リスク分析のために upstream リポジトリやパッケージレジストリへ WebFetch /
gh apiでアクセスできること
ホスト repo に依存する慣習について
本 skill には以下の任意(optional)ステップが含まれる。ホスト repo がその慣習を採用して いない場合は該当ステップをスキップする。
- Design Doc:
docs/design/を採用する repo のみ、トリアージ結果を Design Doc として 残す(ステップ 4)。不採用の repo では結果を会話および各 PR へのコメントで返す。 - ADR:
docs/adr/を採用する repo のみ、判断結果を ADR に記録する(ステップ 7)。 不採用の repo ではスキップし、結果を ADR PR のコメント等で残すに留める。 - ADR / Design Doc のファイル名規約・言語は host repo の規約(
.claude/rules/等)に従う。
手順
1. Dependabot PR の収集
開いている Dependabot PR を一括で取得する(バッチ処理 — 全件を対象にする)。
gh pr list --author "app/dependabot" --state open \
--json number,title,headRefName,labels,body,createdAt
- 0 件なら「対応すべき Dependabot PR はありません」と伝えて終了する。
- Dependabot のグループ更新 PR(複数依存をまとめた PR)も 1 件として扱う。
- セキュリティ更新 PR(
securityラベル付き)は優先度を高く扱う。そのパッケージが override 機構(pnpmoverrides/ npmoverrides/ yarnresolutions)にも載っている 場合は、security-alertskill の「advisory の脆弱範囲を自分の pin と突き合わせる」を 先に回す。 override の floor が脆弱範囲の内側だと、bot PR をマージしても解決が戻る か、ERR_PNPM_LOCKFILE_CONFIG_MISMATCHで CI が通らない。
2. 各 PR のメタデータ抽出
PR ごとに以下を整理する。
- エコシステム: ブランチ名
dependabot/<ecosystem>/...(npm_and_yarn/pip/github_actions/bundlerなど)から判定する。 - 依存名と版:
<name>を<from>→<to>へ。PR 本文・タイトルから抽出する。 - bump 種別:
<from>と<to>を比較して patch / minor / major を判定する。 - direct / transitive: PR 本文の Dependabot メタ情報やラベルから判定する。
- Dependabot 互換性スコア: PR 本文に含まれていれば控える(参考値に留め、これ単独で 採否を決めない)。
- CI 状態:
gh pr checks <番号>で取得する。
3. リスク分析(必須・全 PR 対象)
bump 種別にかかわらず、すべての PR について upstream を遡って確認する。
- リリースノート / CHANGELOG:
<from>→<to>間のリリースノート・CHANGELOG を読む。 - コード差分: タグ間の compare(例: GitHub の
compare/<from>...<to>)やnpm diff等で実際の差分を確認する。コメントや lockfile 以外の不審な変更がないか。 - メンテナ・所有権の変化: 新規 publisher、リポジトリの移管・改名、新メンテナの追加、 GitHub アカウントの異常など、配布主体の変化がないか。
- install / postinstall / prepare スクリプト: 新規追加・変更された lifecycle スクリプトがないか(マルウェア混入の典型的な経路)。
- 依存ツリーの変化: 新たに追加される transitive 依存がないか。不審なパッケージ名や
公開直後のパッケージが混じっていないか。判定は lock の依存エッジの diff で行う。
解決バージョンを集合として比べる方法では、既にグラフにある版への乗り換えが検出できず、
lock の生 diff は peer suffix の書き換えに埋もれる。手順は
security-alertskill 「巻き込みは lock の依存エッジで見る」の snippet を使う。 - 既知の advisory: GitHub Advisory /
gh api、npm audit等で既知の脆弱性・ マルウェア報告がないか。セキュリティ更新ならその CVE / GHSA を確認する。 - 公開からの経過時間:
<to>が公開直後(数日以内)なら、改ざん検知前の可能性を考え 様子見を選択肢に入れる。
調査ツール: upstream リポジトリ・レジストリへの WebFetch、gh api repos/<owner>/<repo>/...、
パッケージレジストリ API。
各 PR にリスクレベル(low / medium / high)と根拠、推奨アクション (マージ推奨 / 保留 / 却下)を付ける。
4. Design Doc 生成(docs/design/ 採用 repo のみ)
トリアージ結果を Design Doc にまとめる。docs/design/ を採用していない repo はこの
ステップをスキップし、結果を会話と各 PR への gh pr comment で返してステップ 5 へ進む。
- ブランチ・worktree を作成する(命名例:
chore/dependabot-triage-<YYYY-MM-DD>、 worktree は.claude/worktrees/<branch>)。 design-docskill のTEMPLATE.mdをベースにdocs/design/dependabot-triage-<YYYY-MM-DD>.mdを作成する。docs/design/TEMPLATE.mdがある repo はそちらに従う。- 内容:
- 一覧表: PR 番号 / 依存名 / bump 種別 / CI / リスクレベル / 推奨アクション。
- PR ごとのリスク分析詳細: ステップ 3 の調査結果と根拠。
- 現時点の方針: PR ごとの推奨アクションと、その理由。
- コミット(
/commit)・push・gh pr createで Design Doc の PR を作成する。 Issue があればRefs #Nで紐付ける。 - ユーザーに Design Doc の PR URL を提示し、採否のレビューを依頼する。
5. ユーザーの判断を待つ
ユーザーが Design Doc をレビューし、どの更新を承認 / 保留 / 却下するか決定する。
ここで Claude の作業は一旦完了。ユーザーの採否決定を待つ。
6. 反映作業
ユーザーから採否の指示を受けたら実行する。
- 承認した PR:
gh pr checks <番号>で CI 通過を確認する。- ベースが古い・コンフリクトしている場合は PR に
@dependabot rebaseをコメントし、 再 CI を待つ。 gh pr merge <番号>(host repo のマージ戦略に従う。--squash等)でマージする。
- 却下した PR:
gh pr close <番号>でクローズする。- その版を今後オファーさせない場合は
@dependabot ignore this <major|minor|patch> version等をコメントする(再オファー抑止。判断は却下理由に応じて行う)。
- 保留した PR: そのまま残し、保留理由を ADR に記録する。
7. ADR 記録
判断結果と根拠を ADR に記録する。docs/adr/ を採用していない repo はスキップする。
- ステップ 4 の Design Doc を ADR に昇格させる: Design Doc の内容を ADR に集約し、
同じ PR で
docs/design/の元ファイルを削除する(ステータスを更新してリンクだけ 残す運用はしない)。design-docskill のADR-TEMPLATE.mdを雛形に使う。 - ADR には以下を記録する:
- 決定: どの依存を更新し、どれを却下・保留したか。
- 理由: 各依存についてのリスク分析の結論と、採否の根拠。
- 却下した案 / 保留: 却下・保留した更新と、その理由(後から経緯を辿れるように)。
- ADR のファイル名は GitHub 番号ベース(
docs/adr/<番号>-<kebab-title>.md、見出しADR-<番号>、ゼロ埋めなし)。番号の優先順位は Issue 番号 → Design Doc PR 番号 → ローカル採番(既存最大 +1)。host repo が独自規約を持つ場合はそちらを優先する。 - ADR は日本語で書く(
docs/adr/の既存 ADR /.claude/rules/の言語ルールに合わせる)。 - ステップ 4 で作成したブランチ上で ADR の追加・Design Doc の削除をコミットし、Design Doc
の PR をそのまま ADR の PR として更新する(または新規 PR を作る)。
gh pr checks --watchで CI を確認し、ユーザーにマージを依頼する。
1 回のトリアージ実行 = 1 つの ADR。継続的に Dependabot 更新を回すと ADR が増えるが、 各実行はサプライチェーン上の独立した判断であり、記録を 1 件 1 ファイルで残すことで 後から「いつ・なぜその版を入れた / 見送った」を辿れるようにする。