Communitygithub.com

prove-it

하나의 pytest 회귀 테스트가 지정된 버그를 수정 전에는 잡아내고 수정 후에는 통과하는지 확인하며, 반복 실행과 검토 가능한 증거를 제공합니다. 버그 수정 주장을 검증하거나 수정 없이도 통과하는 테스트를 확인할 때 사용하세요.

prove-it란 무엇인가요?

Prove It은 특정 pytest 테스트가 버그를 수정 전에 명확히 탐지하고 수정 후에는 성공적으로 통과하는지를 검증하는 AI 에이전트 스킬입니다. 전체 테스트 스위트가 통과하는 것만으로는 버그 탐지 능력을 입증할 수 없기 때문에, 이 스킬은 수정 전후의 Git 리비전을 비교하여 동일한 테스트 함수에서 특정 assertion 메시지가 나타나는지 확인합니다. Claude Code, Cursor, Codex 등의 환경에서 사용할 수 있으며, 사용자는 수정과 테스트를 포함한 두 Git 커밋을 지정하고, 테스트 내에 `PROVEIT:` 접두사가 붙은 assertion 메시지를 추가해야 합니다. 이 스킬은 증명 스크립트를 절대 경로로 실행하며, 리포지토리를 오염시키지 않고 독립적인 스냅샷에서 테스트를 세 번 반복하고, 결과를 `report.md`, `report.json` 등의 증거 파일로 제공합니다. 최종 결과는 'supported'(버그 탐지 성공), 'not_supported'(실패), 'inconclusive'(판정 불가) 중 하나로 표시되며, 검증된 증거만을 바탕으로 객관적인 주장을 돕습니다.

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

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Prove It

동일한 테스트가 수정 전에는 지정된 결함을 잡아내고 수정 후에는 통과한다는 좁은 범위의 주장을 확립합니다. 단순히 테스트 스위트가 통과한다는 것만으로는 이를 입증할 수 없습니다.

증인 선택

수정 사항과 관련 테스트를 검사하세요. 예상되는 입력/출력 또는 상태 전환을 식별하고, 정확히 하나의 pytest 노드를 선택하세요. 두 개의 커밋된 로컬 Git 참조를 사용하세요. 이후 참조(after ref)에는 수정 사항과 테스트가 모두 포함되어야 합니다. 커밋되지 않은 편집 내용은 포함되지 않습니다. 이 도구를 실행하기 위해 다른 사람의 작업을 커밋하지 마세요.

결함 assertion에는 다음과 같은 특정 메시지가 필요합니다:

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

메시지는 선택한 테스트 함수 내의 assertion에 있어야 합니다. 관련 없는 assertion, fixture, 애플리케이션 코드 또는 print 문에 넣지 마세요. 이 assertion이 실제로 버그가 설명하는 동작을 관찰하는지 검사하세요. 기존 테스트에 메시지가 필요한 경우, 승인된 편집 범위 내에서만 추가하고 해당 테스트를 이후 수정본(after revision)에 포함시키세요. 그렇지 않으면 누락된 입력을 설명하세요.

비교 실행

번들 스크립트를 절대 설치 경로를 사용하여 실행하세요. 선택한 인터프리터에는 pytest와 프로젝트의 종속성이 이미 설치되어 있어야 합니다. 종속성 설치, 네트워크 접근, Git 체크아웃, 리셋, 스태시 또는 커밋이 수행되지 않습니다.

python <skill-directory>/scripts/proveit.py --repo <repository> --before <old-ref> --after <fixed-ref> --test tests/test_expiry.py::test_at_deadline --expect PROVEIT:expiry-boundary --output <new-directory-outside-repository>

실행기는 이후 수정본의 선택된 테스트 파일을 두 스냅샷 모두에 덮어쓰고, 시도당 새 복사본을 사용하며, 기본적으로 수정본당 3회 실행 및 실행당 10초 타임아웃을 적용합니다. 작업 필요에 따라 --python, --repeat 2..5 또는 --timeout을 사용하세요. 테스트가 매개변수화된 경우 전체 매개변수 ID를 선택하세요.

스냅샷은 파일을 격리할 뿐 실행을 격리하지 않습니다. 이 환경에서 이미 승인된 코드만 실행하세요. 테스트는 사용자의 파일 시스템, 네트워크 및 자격 증명 접근 권한을 유지합니다. 임시 디렉터리를 보안 샌드박스로 해석하지 마세요. 관련 없는 작업 트리나 디렉터리를 정리하지 마세요. 실행기는 자신의 임시 스냅샷만 제거하고 증거 디렉터리는 검토를 위해 남겨둡니다.

증거 검토

report.md, report.json, selected-test.py, fix.diff 및 관련 로그를 읽으세요. 관찰된 assertion, 선택된 노드, 단계 기록 및 변경된 경로를 확인하세요.

결과해석종료 코드
supported모든 이전 실행이 선언된 assertion에 적중했으며, 모든 새 실행이 통과했습니다.0
not_supported이전 테스트도 통과하거나, 수정된 리비전이 여전히 해당 assertion에 적중합니다.1
inconclusive환경, 관련 없는 실패, 시간 초과, 스킵, 불완전하거나 불안정한 실행.2

새 리비전이 통과하더라도 관련 없는 호출 실패는 'inconclusive'입니다. 수집, 종속성, 구문, 설정 및 해제 실패는 결코 증인이 될 수 없습니다. 이를 잡힌 버그로 재분류하지 마세요. 관찰된 원인을 범위 내에서 해결하고 새 증거 디렉터리로 다시 실행하세요. 변경되지 않은 실패 설정을 반복하지 마세요.

'supported'를 수락하기 전에 리비전별 fixture/설정을 검사하고 변경 사항을 설명하지 않는지 확인하세요. 선택한 테스트 파일만 덮어씁니다. 설치된 종속성은 공유되며, 타사 pytest 플러그인 자동 로드는 비활성화되고 프로젝트 addopts는 지워집니다. 외부 플러그인이나 빌드가 필요한 프로젝트는 별도로 준비된 환경이 필요할 수 있습니다. 지원되지 않는 실행을 솔직히 보고하세요.

테스트, 참조, 결과, 증거 위치 및 중요한 제한 사항을 보고하세요. 이 증인이 지정된 동작을 이러한 실행에서 잡아냈다고 말하세요. 전반적인 정확성의 증명, 불안정성 부재, 일반적인 테스트 품질 또는 측정된 생산성 향상을 주장하지 마세요. 검토하고 해당 게시 승인을 받지 않고 로컬 경로나 로그가 포함된 보고서를 게시하지 마세요.

관련 스킬