Manutenção editorial periódica do BACKLOG.md (4 heurísticas detectivas + salvaguarda worktree-probe), preview-first, non-destructive. Use quando o mantenedor quer varrer o backlog inteiro fora do fluxo de sessão (/next).
How this skill is triggered — by the user, by Claude, or both
Slash command
/pragmatic-dev-toolkit:curate-backlogThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Manutenção editorial periódica do papel `backlog` (default `BACKLOG.md`). Aplica 4 heurísticas cumulativas, oferece preview com mutações propostas, e aplica via commit unificado ou defere via NOTES.md signal queue conforme estado de concorrência. **Não-destrutivo, preview-first, sob demanda.**
Manutenção editorial periódica do papel backlog (default BACKLOG.md). Aplica 4 heurísticas cumulativas, oferece preview com mutações propostas, e aplica via commit unificado ou defere via NOTES.md signal queue conforme estado de concorrência. Não-destrutivo, preview-first, sob demanda.
Mecânica per ADR-057. Skill irmã de /archive-plans (ADR-022) — mesma natureza editorial, escopo BACKLOG.md em vez de docs/plans/.
Sem argumentos. Skill é low-frequency operator-initiated; toda invocação é preview-first.
git status --porcelain vazio). Curagem mistura mal com mudança não-revisada; bloquear preserva isolamento (mesmo pattern de /archive-plans)./curate-backlog em qualquer branch; a salvaguarda worktree-probe (passo 2) cobre concorrência mecanicamente.Em modo arquivo (canonical ou local): ler na íntegra BACKLOG.md (papel backlog; em modo local, .claude/local/BACKLOG.md).
Em modo forge (paths.backlog: forge, per ADR-058): seguir ${CLAUDE_PLUGIN_ROOT}/docs/procedures/forge-auto-detect.md. Output gh → gh issue list --state open --search "no:assignee" --json number,title,body,createdAt --jq '.[]'; output glab → glab issue list --opened --not-assignee --output json | jq -r '.[] | {number: .iid, title, body: .description, createdAt: .created_at}'. Output no-detection ou unsupported-host → parar com erro explícito orientando setup (gh auth login / glab auth login / dnf install jq) ou declarar paths.backlog: null ou path canonical (policy do caller per ADR-058 § (d)). Lista de issues retornada substitui o conteúdo de ## Próximos no fluxo subsequente; cada item carrega identificador #<número>: <título> + body (consumido por H2/H3).
Ler também .claude/local/NOTES.md se existir (ortogonal ao modo do backlog).
NOTES.md ausente → H4 vira no-op silente (sem fonte de sinais).
Em modo arquivo (canonical ou local): git worktree list --porcelain → classificar:
main-só): mutações cross-seção em BACKLOG.md autorizadas. ADR-049 § Decisão (a) preservado (sem concorrência multi-PR).worktree-adicional): mutações cross-seção deferidas via NOTES.md signal queue (formato no passo 6).Em modo forge: salvaguarda não aplica — state vive em forge remoto idempotente, sem arquivo local concorrente para merge artifact (per ADR-058 § (g)). Classificação sempre vira main-só em modo forge (mutações remotas aplicáveis diretamente).
Estado classificado vira metadata do preview (passo 4) e do gate (passo 5).
Acumular findings com (categoria, linha-do-BACKLOG, ação proposta). Sem findings em todas as heurísticas → skip silente para passo 7 (cutucada de descoberta + done).
Em modo arquivo: para cada linha em ## Próximos, casar regex de marca temporal:
até YYYY-MM-DD ou deadline YYYY-MM-DD — extrair data literal.T+Nd (N inteiro) — calcular data: data do commit de adição (via pickaxe git log -S "<linha>" --diff-filter=A --reverse | head -1) + N dias.Comparar contra date +%Y-%m-%d. Data passou → finding Gatilho temporal vencido, ação revisar prioridade ou mover para ## Concluídos.
Em modo forge: para cada issue, casar regex de marca temporal em title+body (mesmas marcas até YYYY-MM-DD / deadline YYYY-MM-DD / T+Nd). Data de referência para T+Nd = createdAt da issue (já disponível no item; sem pickaxe). Data passou → finding Gatilho temporal vencido no #<número>: <título>, ação revisar prioridade ou fechar issue.
Sem marca temporal → linha/issue não gera finding desta heurística.
Para cada linha em ## Próximos (modo arquivo) ou para cada title+body de issue (modo forge), julgamento do agente runtime via Read + cross-ref git log -S "<termo>" quando aplicável. Sinais alvo:
test -e <path> ou grep -F "<nome>" skills/ agents/).Substituído em § Status (cross-ref via grep -E "^\*\*Status:\*\* Substituído" docs/decisions/ADR-NNN-*.md).Finding Redação stale, ação refinar texto OR remover linha/issue. Limitação reconhecida no ADR-057: julgamento semântico do agente; spec leve por design (regex mecânica produziria falsos positivos massivos). Adicional em modo forge: issues raramente carregam refs estruturais (paths/ADRs) — heurística é menos potente que markdown agrupado (limitação documentada em ADR-058 § Limitações).
## Próximos (modo arquivo) ou cada title+body de issue (modo forge) em substantivos (heurística por capitalização + ignore stop-words PT-BR).Mergeable, ação consolidar em linha única OR fechar issue duplicada.Apresentar pares no preview com termos compartilhados destacados; operador decide redação do merge se aceitar. Em modo forge: similaridade por title funciona bem; por body é mais frágil (issues frequentemente têm body livre/conversacional). Limitação documentada em ADR-058 § Limitações.
Varredura textual de .claude/local/NOTES.md (scan completo na 1ª iteração). Sinais alvo:
/note.Findings desta heurística são informacionais — não geram ação direta no gate Aplicar tudo. Listados como contexto para operador inspecionar antes de decidir sobre H1-H3 (alinhado a ADR-054 § Decisão (a); NOTES.md mantém status non-role).
Reportar ao operador em formato compacto:
main-só: mutações diretas ou worktree-adicional: mutações deferidas via NOTES.md (literal).BACKLOG.md:<linha>: <texto> [marca <data>] → <ação>.BACKLOG.md:<linha>: <texto curto> → <ação>; cross-ref: <evidência>.BACKLOG.md:<linha-A> + <linha-B>: termos compartilhados <termo1, termo2, termo3> → consolidar.NOTES.md:<linha>: <trecho> ← relaciona BACKLOG.md:<linha>.H1: N | H2: M | H3: K (pares) | H4: J (info).H4 listado separado dos demais — operador entende que é contexto, não ação aplicável diretamente.
AskUserQuestionHeader Curate, opções:
Aplicar tudo — description: aplica N+M+K mutações de H1+H2+H3 (H4 não tem ação direta); commit unificado.Aplicar parcial — description: desce em sub-gate por categoria (H1/H2/H3) com Aplicar/Pular cada uma.Cancelar — description: zero mutações, zero commit.Sem Recommended — operador decide após ver preview; ambos Aplicar tudo e Aplicar parcial são legítimos. H4 nunca aparece no gate (informacional).
Caminho main-só (mutações diretas):
Em modo arquivo:
Para cada finding aceito, mutar BACKLOG.md:
## Próximos, adicionar topo de ## Concluídos.Commit unificado:
chore(backlog): editorial curation — <N> refinements
H1: <N1> moves Próximos→Concluídos
H2: <N2> refinos/removes (stale)
H3: <N3> merges
Não pusha — operador decide quando publicar (paralelo a /archive-plans).
Em modo forge:
AskUserQuestion por issue (header Forge, opções Aplicar no forge (Recommended) / Cancelar (não aplicar)) per ADR-058 § (e). description da opção Aplicar no forge carrega o(s) comando(s) concreto(s). Uma cutucada por issue:
gh, gh issue close <número> --reason completed --comment "<glosa>" (close + comentário num único comando); em glab, dois comandos sequenciais — glab issue note <número> --message "<glosa>" então glab issue close <número> (CLI assimétrica: glab issue close não aceita --comment). Glosa cita marca temporal vencida.gh issue edit <número> --title "<novo>" --body "<novo>" ou glab issue update <número> --title "<novo>" --description "<novo>". Operador edita texto antes de confirmar; cutucada carrega proposta.gh, gh issue close <número> --reason "not planned" --comment "<glosa>" (state_reason distinto de H1 completed). Em glab, issues fechadas não têm subclassificação (sem state_reason) — glab issue note <número> --message "<glosa>" então glab issue close <número>, glosa documenta motivo.--reason completed --comment "..."; glab: note + close sequencial); opcionalmente editar a issue mantida via H2 mecânica para refletir merge.Caminho worktree-adicional (mutações deferidas):
Escrever entry estruturada em .claude/local/NOTES.md. Formato:
## curate-backlog deferred YYYY-MM-DD
- BACKLOG.md:<linha>: H1 move para ## Concluídos — texto: "<linha exata>"
- BACKLOG.md:<linha>: H2 refinar — proposta: "<novo texto>"
- BACKLOG.md:<linha>: H3 merge com BACKLOG.md:<linha-B> — proposta: "<linha consolidada>"
Commit unificado:
chore(backlog): defer <N> editorial signals (worktree active)
<N1> moves + <N2> refinos + <N3> merges deferidos
Próxima invocação de /curate-backlog em estado main-só lê essa entry, propõe aplicar as mutações deferidas (preview-first com cross-ref à data da deferral), commit unificado limpa a entry após aplicação.
Executar conforme ${CLAUDE_PLUGIN_ROOT}/docs/procedures/cutucada-descoberta.md (emitir como última linha informacional antes de devolver controle). Skill nova traversa Resolution protocol step 3 para backlog; a cutucada cobre gap de configuração se CLAUDE.md ou o marker estiverem ausentes.
Operador invocando /curate-backlog em estado main-só com entries ## curate-backlog deferred YYYY-MM-DD existentes em NOTES.md:
AskUserQuestion (header Deferred, opções Aplicar pendentes / Aplicar pendentes + nova curagem / Cancelar).Aplicar pendentes → aplica mutações exatamente como descritas na entry; remove entry de NOTES.md; commit unificado chore(backlog): apply <N> deferred editorial signals.Aplicar pendentes + nova curagem → aplica deferidas, executa novamente passos 3-5 sobre o estado pós-aplicação, gate consolidado.BACKLOG.md quando worktree-adicional detectado. A salvaguarda existe para preservar ADR-049 § Decisão (a) mecanicamente; bypass via flag é anti-padrão./next. Skill só registra/move/refina/merge baseado em sinais empíricos.git push./triage.npx claudepluginhub fppfurtado/pragmatic-dev-toolkit --plugin pragmatic-dev-toolkitGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.