Dependabot Triage — Agente Automático
SSOT do processo de triagem automatizada de PRs do Dependabot. Workflow:
.github/workflows/dependabot-triage.ymlAgente: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)
- 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). - Checks falhados detalhados —
gh 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ópriodependabot-triage). - Changelog externo — npm registry → GitHub Releases → fallback
CHANGELOG.md/HISTORY.mdraw do repo (cobre postcss, @types/*, monorepos sem Releases). - 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:
- Detecta via
parseDependabotGroupTitle(regex separado do single-package). - Extrai a lista de pacotes/versões do corpo do PR (
Updates \pkg` from x to y`). - Agrega o bump pelo maior nível encontrado (
major > minor > patch). - Marca como crítico se qualquer item bater em
CRITICAL_DEPS. - Busca changelog dos 3 primeiros itens (limite para caber no prompt).
- 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
| Evento | Quando dispara |
|---|---|
pull_request (opened, reopened, synchronize) | Apenas se autor for dependabot[bot] |
workflow_dispatch | Sob demanda na aba Actions |
schedule cron 0 12 * * 1 | Toda 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
| Secret | Origem | Comportamento se ausente |
|---|---|---|
GITHUB_TOKEN | Auto-injetado pelo Actions | — |
NTFY_TOPIC_URL | Já existe (compartilhado com audit.yml) | ::warning:: + pula notificação |
ANTHROPIC_API_KEY | NOVO — 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_KEYeNTFY_TOPIC_URLprecisam existir em ambos:
- Settings → Secrets and variables → Actions (para
workflow_dispatcheschedule)- Settings → Secrets and variables → Dependabot (para o trigger
pull_requestdos 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):
| Sinal | Classificação |
|---|---|
major bump (single) | Investigar |
Dep crítica + patch + CI verde | Mergear (compat score reforça) |
| Dep crítica em qualquer outro caso | Investigar |
CI = failure (não crítica) | Investigar |
Demais (patch/minor sem flags) | Mergear |
| Grouped com qualquer item major | Investigar |
| Grouped com dep crítica fora de patch | Investigar |
| Grouped com CI falho | Investigar |
| Grouped patch/minor não-crítico | Mergear |
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:
highse houver ≥1 "investigar"; senãodefault - Tags:
package,robot+warningse houver investigar
Body (exemplo):
🟢 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/dependabotA 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 installnem checkout de código de terceiros — apenas leitura viaghCLI
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:
- Adicionar
ANTHROPIC_API_KEYem Settings → Secrets → Actions - Confirmar que
NTFY_TOPIC_URLestá presente (já está em ambos) - Copiar os 2 arquivos (
.github/workflows/dependabot-triage.yml+scripts/dependabot-triage/triage.mjs)
8. Manutenção
- Ajustar lista crítica: editar
CRITICAL_DEPSemtriage.mjs - Trocar modelo: ajustar
ANTHROPIC_MODELno topo do script - Mudar horário da varredura semanal: editar
cronno 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.ymlscripts/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