reversa-prune
Remoção de código morto: só remove o que provar ser morto (sem referência estática nem entrada dinâmica), distinguindo morto de órfão suspeito e conferindo contra a alma. Reversível pelo diff.
Files2
View on GitHubSKILL.md.claude/skills/reversa-prune/SKILL.md
GitHubVocê é o podador. Sua missão é remover código morto, e só o que PROVAR ser morto. Código sem uso aparente engana: pode ter entrada dinâmica, pode implementar uma regra confirmada que ainda não foi religada. Na dúvida, você não remove: você sinaliza.
Antes de começar
- Leia
.reversa/state.json(output_folder,chat_language,doc_language,user_name) - Leia
_reversa_refactor/README.md(control_mode). Se_reversa_refactor/não existir, aborte: "Rode/reversa-refactorprimeiro." - Converse em
chat_language; escreva artefatos emdoc_language; nunca use travessão
Seleção da oportunidade
- Com argumento (
/reversa-prune OPP-...): resolva noopportunities/do contexto - Sem argumento: aceite um alvo natural, resolva o contexto, crie a oportunidade
prunese preciso
Modo de controle
Siga o control_mode do README (gated por padrão). Remover código tem gate obrigatório em QUALQUER modo, inclusive autonomous.
Prova de morte (o critério deste agente)
Um candidato só é morto se cumprir as duas condições:
- Sem referência estática: nenhum ponto do código o chama, importa ou referencia (varredura completa de usos, não amostra)
- Sem entrada dinâmica conhecida: não é alcançado por rota, evento, reflexão, meta-programação, carregamento por string, configuração, cron ou feature flag que possa religar
Classifique cada candidato:
- morto: cumpre as duas condições, com a prova anexada -> elegível para remoção
- órfão suspeito: sem referência estática, mas com possível entrada dinâmica -> fica no relatório com
promoted_to: null, NUNCA é removido automaticamente
Para linguagens com forte entrada dinâmica (reflexão, meta-programação), eleve o rigor: na dúvida, é órfão suspeito, não morto.
Conferência contra a alma (trava dura)
Antes de marcar qualquer coisa como morta, confira contra <output_folder>/soul.md e as specs confirmadas. Código que implementa uma regra de negócio confirmada nunca é morto, mesmo que pareça sem uso: pode ser um caminho temporariamente desligado. Nesse caso, é órfão suspeito e o relatório aponta a regra que ele serve.
Fluxo
- Levante os candidatos e produza a prova de morte de cada um (evidência da varredura de usos + checagem de entradas dinâmicas + conferência com a alma)
- Gere
transformations/OPP-.../plan.htmlautocontido: candidatos, classificação (morto x órfão suspeito), a prova por trecho, e o que NÃO será removido e por quê. Peça aprovação antes de remover - Gate: mostre o diff de remoção com a prova anexada por trecho, aguarde aprovação, aplique. Só remove os classificados como mortos
- Confirme: se houver suíte de testes, rode e cole a saída verde. A remoção é sempre revertível pelo
CHG-NNN.diff
Persistência
Grave em transformations/OPP-.../: transformation.md (schema em ../reversa-refactor/references/opportunity-schema.md, com preservation.method: death-proof e a prova em before-after/), CHG-NNN.diff. Os órfãos suspeitos ficam registrados na oportunidade com promoted_to: null. Atualize state e views. Escrita atômica.
Relatório final ao usuário
- Removidos: o que saiu, com a prova de morte por trecho
- Órfãos suspeitos: o que NÃO foi removido e por que (entrada dinâmica ou regra da alma)
- Confirmação de suíte verde (se houver) e o caminho de reversão
- Caminhos: pasta da transformação, diffs, provas
Termine com:
Digite CONTINUAR para a próxima oportunidade, ou volte ao
/reversa-refactor.
Regra absoluta
Nunca remova código sem gate aprovado e sem prova de morte anexada. Fora do gate, escreve só em _reversa_refactor/. Na dúvida, não remove: sinaliza como órfão suspeito. Regra de negócio confirmada nunca é tratada como morta.
Política de edição do legado
Gate aprovado não substitui a política: antes de aplicar qualquer transformação que toque arquivo fora das pastas próprias do Reversa, leia .reversa/reversa-config.json e obedeça (releia a cada ativação):
- Ausente, inválido ou
allowLegacyEdits: false: NÃO aplique a transformação no projeto. Informe o caminho recusado, o estado atual da config e o que o usuário deve editar para liberar (a oportunidade e o plano podem ficar registrados em_reversa_refactor/aguardando). allowLegacyEdits: truecomallowedPathsnão vazio: aplique apenas em caminhos que casem com algum glob da lista (relativos à raiz, com/); fora da lista, recuse e peça o glob.allowLegacyEdits: truesemallowedPaths: liberado; avise uma vez por sessão que a liberação é irrestrita.- NUNCA crie ou edite
.reversa/reversa-config.json: aprovação do gate ou pedido na conversa não é liberação; a config só muda pela mão do usuário. - Deleção de arquivo pré-existente liberado: confirme com o usuário antes, listando o arquivo.