Communitygithub.com

Prove It

Verifica se um teste de regressão pytest captura um bug específico antes de um commit de correção e passa após ele, com execuções repetidas e evidências revisáveis. Use ao validar uma alegação de correção de bug ou ao verificar se um teste também passa sem a correção.

O que é Prove It?

O Prove It é uma habilidade especializada para validar alegações de correção de bugs em projetos Python usando pytest. Ele estabelece uma afirmação restrita: o mesmo teste captura o comportamento defeituoso especificado antes de uma correção e passa após ela, o que uma suíte de testes simplesmente aprovada não estabelece. A ferramenta suporta qualquer plataforma que possa executar scripts Python com pytest e Git, como Claude Code, Cursor ou Codex. O fluxo de trabalho envolve selecionar um nó pytest específico, identificar uma asserção com uma mensagem marcadora (por exemplo, `PROVEIT:expiry-boundary`), executar um script de comparação que sobrepõe o arquivo de teste da revisão corrigida em ambos os snapshots do Git e executar várias rodadas com um timeout configurável. O resultado é classificado como `supported`, `not_supported` ou `inconclusive`, com evidências detalhadas geradas em um diretório de saída contendo relatórios, diffs e logs. É crucial revisar as evidências para garantir que a mudança de comportamento seja devida à correção e não a configurações ou dependências específicas da revisão. O Prove It é útil para desenvolvedores que precisam provar que um teste realmente captura um bug antes da correção, evitando falsos positivos ou alegações não fundamentadas de cobertura de bugs.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/K-kiron/ProveIt/tree/main/skills/prove-it

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que Prove It faz?

Estabeleça uma afirmação restrita: o mesmo teste captura o comportamento defeituoso especificado antes de uma correção e passa após ela. Uma suíte de testes simplesmente aprovada não estabelece isso.

Escolha a testemunha

Inspecione a correção e o teste relevante. Identifique a entrada/saída esperada ou transição de estado e selecione exatamente um nó pytest. Use duas referências Git locais commitadas; a referência posterior deve conter tanto a correção quanto o teste. Edições não commitadas não são incluídas. Não commite o trabalho de outra pessoa apenas para executar esta ferramenta.

A asserção de defeito precisa de uma mensagem específica, como:

assert expired(now=10, deadline=10), "PROVEIT:expiry-boundary"

A mensagem deve estar em uma asserção na função de teste selecionada. Não a coloque em asserções não relacionadas, em uma fixture, em código de aplicação ou em uma instrução print. Inspecione se esta asserção realmente observa o comportamento descrito pelo bug. Se o teste existente precisar de uma mensagem, adicione-a apenas dentro do escopo de edição autorizado e inclua esse teste na revisão posterior. Caso contrário, explique a entrada ausente.

Execute a comparação

Execute o script fornecido usando seu caminho absoluto instalado. O interpretador selecionado precisa que pytest e as dependências do projeto já estejam instalados. Não é realizada instalação de dependências, acesso à rede, checkout Git, reset, stash ou commit.

python <skill-directory>/scripts/proveit.py --repo <repositório> --before <ref-antigo> --after <ref-corrigido> --test tests/test_expiry.py::test_at_deadline --expect PROVEIT:expiry-boundary --output <novo-diretório-fora-do-repositório>

O executor sobrepõe o arquivo de teste selecionado da revisão posterior em ambos os snapshots, usa uma cópia nova por tentativa e padroniza para três execuções por revisão com um timeout de 10 segundos por execução. Use --python, --repeat 2..5 ou --timeout apenas conforme necessário para a tarefa. Selecione um ID de parâmetro completo se o teste for parametrizado.

Snapshots isolam arquivos, não a execução. Execute apenas código cuja execução já esteja autorizada neste ambiente. Os testes retêm o acesso do usuário ao sistema de arquivos, rede e credenciais. Não interprete um diretório temporário como uma sandbox de segurança. Nunca limpe worktrees ou diretórios não relacionados. O executor remove apenas seus próprios snapshots temporários e deixa o diretório de evidências para revisão.

Revise as evidências

Leia report.md, report.json, selected-test.py, fix.diff e os logs relevantes. Verifique a asserção observada, o nó selecionado, os registros de fase e os caminhos alterados.

ResultadoInterpretaçãoSaída
supportedToda execução antiga atinge a asserção declarada; toda nova execução passa.0
not_supportedO teste antigo também passa, ou a revisão corrigida ainda atinge essa asserção.1
inconclusiveAmbiente, falha não relacionada, timeout, skip, execução incompleta ou instável.2

Uma falha de chamada não relacionada é inconclusiva mesmo quando a nova revisão passa. Falhas de coleta, dependência, sintaxe, configuração e desmontagem nunca são uma testemunha. Não as rotule como um bug capturado. Resolva a causa observada dentro do escopo e reexecute em um novo diretório de evidências; não repita uma configuração com falha inalterada.

Antes de aceitar supported, inspecione fixtures/configuração específicas da revisão e confirme que elas não explicam a mudança. Apenas o arquivo de teste escolhido é sobreposto. Dependências instaladas são compartilhadas, o carregamento automático de plugins pytest de terceiros é desabilitado e addopts do projeto é limpo. Projetos que exigem plugins externos ou builds podem precisar de um ambiente preparado separadamente; relate execução não suportada de forma direta.

Relate o teste, referências, resultado, local das evidências e limitações materiais. Diga que esta testemunha capturou o comportamento especificado nestas execuções. Não reivindique uma prova de correção geral, ausência de flakiness, qualidade geral do teste ou melhoria medida de produtividade. Não publique relatórios contendo caminhos locais ou logs sem revisá-los e obter a autorização de publicação aplicável.

Habilidades Relacionadas