Skip to content

Dependabot Triage — Agente Automático

SSOT do processo de triagem automatizada de PRs do Dependabot. Workflow: .github/workflows/dependabot-triage.yml Agente: scripts/dependabot-triage/triage.mjs


1. Visão Geral

Agente que roda em GitHub Actions, lista todos os PRs abertos do dependabot[bot], analisa cada um com Claude Haiku 4.5 (API Anthropic direta) e envia uma única notificação ntfy consolidada.

Fontes de contexto enviadas ao Claude (ordem de prioridade)

  1. Corpo do PR do Dependabot — release notes, changelog e commits que o próprio Dependabot embute em <details> (gh pr list --json body). Inclui o compatibility score extraído do badge SVG (% de outros repos que mergearam esse mesmo bump sem regressão).
  2. Checks falhados detalhadosgh pr checks --json name,state,link. Não basta saber que CI falhou; o agente envia quais checks falharam para o Claude decidir se são bloqueantes (ex: build/type-check) ou ruído (lint flaky, e2e instável, o próprio dependabot-triage).
  3. Changelog externo — npm registry → GitHub Releases → fallback CHANGELOG.md / HISTORY.md raw do repo (cobre postcss, @types/*, monorepos sem Releases).
  4. Escopo, área de uso, diff do package.json — sinais estruturais do projeto.

Classificação

  • 🟢 Mergear — patch/minor sem breaking explícito, compatibility score alto (≥90%), OU CI verde, OU falhas de CI em checks não relacionados. Inclui dep crítica em patch com CI ok.
  • 🟡 Investigar — major, breaking changes explícitos no changelog/PR body, dep crítica em minor sem info, CI falhou em check claramente ligado à dep.
  • Ignorar — dep já substituída/obsoleta no projeto, PR duplicado.

Grouped updates do Dependabot

Quando o Dependabot agrupa múltiplos bumps em 1 PR (Bump the <group> group ...with N updates), o agente:

  1. Detecta via parseDependabotGroupTitle (regex separado do single-package).
  2. Extrai a lista de pacotes/versões do corpo do PR (Updates \pkg` from x to y`).
  3. Agrega o bump pelo maior nível encontrado (major > minor > patch).
  4. Marca como crítico se qualquer item bater em CRITICAL_DEPS.
  5. Busca changelog dos 3 primeiros itens (limite para caber no prompt).
  6. Classifica pelo item de maior risco — qualquer major ou breaking em qualquer item ⇒ Investigar.

Na notificação, o item agrupado aparece como 🔀 grupo <nome> (N pacotes, bump=<maior>).

O agente não mergeia nada (pull-requests: read). Decisão sempre humana.


2. Triggers

EventoQuando dispara
pull_request (opened, reopened, synchronize)Apenas se autor for dependabot[bot]
workflow_dispatchSob demanda na aba Actions
schedule cron 0 12 * * 1Toda segunda 09:00 BRT (12:00 UTC) — varredura semanal consolidada

concurrency: dependabot-triage evita múltiplas runs paralelas quando o Dependabot abre vários PRs em sequência.


3. Secrets necessários

SecretOrigemComportamento se ausente
GITHUB_TOKENAuto-injetado pelo Actions
NTFY_TOPIC_URLJá existe (compartilhado com audit.yml)::warning:: + pula notificação
ANTHROPIC_API_KEYNOVO — adicionar em cada repo::warning:: + classificação por heurística

⚠️ Duplo escopo obrigatório (Actions + Dependabot). PRs abertos pelo dependabot[bot] rodam num contexto isolado onde apenas secrets do escopo "Dependabot" são expostos — secrets cadastrados só em "Actions" chegam vazios. Para a triagem em tempo real funcionar nos PRs do bot, ANTHROPIC_API_KEY e NTFY_TOPIC_URL precisam existir em ambos:

  • Settings → Secrets and variables → Actions (para workflow_dispatch e schedule)
  • Settings → Secrets and variables → Dependabot (para o trigger pull_request dos PRs do bot)

Sem o escopo Dependabot, o agente cai na heurística e o ntfy é pulado silenciosamente em cada PR novo do bot. Ao rotacionar a chave, atualizar nos dois lugares.

Por que Claude Haiku e não Lovable AI? O Lovable AI Gateway serve apenas modelos Google Gemini e OpenAI GPT. O requisito é Claude. Como o workflow roda em GitHub Actions (fora do runtime do app), chamamos a API Anthropic direta — sem perda funcional.


4. Heurística de fallback (Claude indisponível)

Se a chamada à Claude API falhar (rede, 4xx/5xx, timeout 30s, JSON inválido, key ausente):

SinalClassificação
major bump (single)Investigar
Dep crítica + patch + CI verdeMergear (compat score reforça)
Dep crítica em qualquer outro casoInvestigar
CI = failure (não crítica)Investigar
Demais (patch/minor sem flags)Mergear
Grouped com qualquer item majorInvestigar
Grouped com dep crítica fora de patchInvestigar
Grouped com CI falhoInvestigar
Grouped patch/minor não-críticoMergear

Lista crítica (em scripts/dependabot-triage/triage.mjs): @supabase/*, argon2, bcrypt*, jose, jsonwebtoken, crypto-js, zod, @anthropic-ai/*, react, react-dom, vite, @tanstack/react-query.

Itens classificados por heurística carregam o sufixo (heurística — Claude indisponível) na justificativa para auditoria.


5. Formato da notificação ntfy

  • Title: Dependabot Triage - <repo> (<N> PRs) (ASCII puro — sanitizado para header HTTP)
  • Priority: high se houver ≥1 "investigar"; senão default
  • Tags: package,robot + warning se houver investigar

Body (exemplo):

text
🟢 Mergear (3)
  • next-themes 0.4.5 → 0.4.6 (patch) — sem breaking, CI verde
  • @types/node 20.11.0 → 20.11.5 (patch) — dev dep
  • picomatch 2.3.1 → 2.3.2 (patch) — security fix ReDoS

🟡 Investigar (1)
  • @supabase/supabase-js 2.45.0 → 2.50.0 (minor) — dep crítica; mudança em onAuthStateChange
    → https://github.com/owner/repo/pull/42

⚪ Ignorar (0)

📅 04/06/2026 09:01 (BRT) · run #1234567890
🔗 https://github.com/owner/repo/pulls?q=is:pr+is:open+author:app/dependabot

A notificação é sempre enviada, mesmo quando todos são "Mergear" — funciona como lembrete de que há PRs prontos para revisão.


6. LGPD / Segurança

  • Zero PII no payload Claude/ntfy — só nomes de pacote, versões e diff de package.json
  • permissions: mínimo (pull-requests: read, contents: read, checks: read)
  • Não dispara em PRs de fork (secrets indisponíveis em fork PRs → falha graciosa)
  • Não usa npm install nem checkout de código de terceiros — apenas leitura via gh CLI

7. Portabilidade

O workflow é idêntico em olp-plataforma e olp-crm. Não há paths/owners hardcoded — tudo é resolvido em runtime via github.repository. Para ativar no segundo repo:

  1. Adicionar ANTHROPIC_API_KEY em Settings → Secrets → Actions
  2. Confirmar que NTFY_TOPIC_URL está presente (já está em ambos)
  3. Copiar os 2 arquivos (.github/workflows/dependabot-triage.yml + scripts/dependabot-triage/triage.mjs)

8. Manutenção

  • Ajustar lista crítica: editar CRITICAL_DEPS em triage.mjs
  • Trocar modelo: ajustar ANTHROPIC_MODEL no topo do script
  • Mudar horário da varredura semanal: editar cron no workflow (sempre em UTC)
  • Custo Claude: ~1.5k input + 200 output por PR × até 10 PRs = centavos por run; com temperature: 0 é determinístico para o mesmo input

Referências

  • .github/workflows/dependabot-triage.yml
  • scripts/dependabot-triage/triage.mjs
  • .github/dependabot.yml — config do Dependabot (limite 10 PRs)
  • ALERTAS_PUSH.md — padrão ntfy
  • DEPENDABOT_ANALYSIS.md — análises manuais anteriores