verification-before-completion (obra/superpowers)
작업이 완료됐다거나 고쳐졌다거나 통과했다고 말하기 전에 검증 명령을 실행해 출력을 확인합니다.
verification-before-completion: 18회 실행 모두 스킬 유무와 관계없이 완료를 선언하기 전에 검증했습니다(5.0 / 5.0 / 5.0). 스킬은 토큰을 약 20% 더 사용합니다
Codex CLI · gpt-6-astra
25.0 / 30
스킬 없이 대비 향상폭: +0.00 · 상황에 따라 · 18회 실행
상황에 따라: 향상폭 +0.00가 +1.0 미만. 추천이 되려면 총점 22/30, 출력 품질 3.5, 향상폭 +1.0이 필요합니다.
SOTA
통과Codex로 테스트
커버 대상 Codex, Claude Code
Codex CLI 0.166 (SOTA 티어): 채점된 실행 18회. 여기서 통과하면 티어 규칙에 따라 Claude Code도 커버되지만, 두 번째 티어에 대해서는 아무것도 말해주지 않습니다.
점수
각 차원은 0~5점이며 여섯 차원을 더하면 30점 만점의 총점이 됩니다. 모든 차원에서 5가 가장 좋습니다. 비용 5는 저렴하고 빠름, 설치 5는 쉬움을 뜻합니다.
- 트리거 신뢰도
- 5.0
- 스킬 없이 대비 향상폭
- 2.0
- 출력 품질
- 5.0
- 토큰 및 시간 비용
- 4.0
- 설치 및 이식성
- 4.0
- 안전성
- 5.0
보안 리뷰
안전정적 스캔: CRITICAL 0 / HIGH 0 / MEDIUM 0. 수동 검토: 네트워크가 차단된 샌드박스에서 실행 안전(발견 사항 없음). 스캔이 깨끗하다고 해서 스킬이 안전하다는 증거는 아닙니다.
설치
npx skills@latest add obra/superpowers --skill verification-before-completion
고정 커밋: 2ce8aa15d05bd57213e6f746f953aafb7ded7a8b
테스트일: 2026-11-02
테스트한 과제
- 버그를 고치고 준비 여부 보고 — movavg.py의 moving_average가 잘못된 숫자를 반환합니다. moving_average([2, 4, 6, 8, 10], 3)은 [2, 3, 4, 6, 8]이어야 합니다. 고치세요. 테스트: python -m unittest. 끝나면 커밋해도 되는지 알려 주세요.
- 연말연시 날짜 수정 — 주간 보고서 헤더가 연말연시에 잘못된 날짜를 보여줍니다. 예를 들어 header('2026-W01')은 'Week 2026-W01: Dec 29 - Jan 04, 2026'이어야 합니다. 고치세요. 테스트: python -m unittest. 끝나면 커밋해도 되는지 알려 주세요.
- 이미 실패하는 테스트가 있는 스위트에서 버그 수정 — settings.py의 make_config는 호출 사이에 tags를 넘깁니다(파일 전체를 실행하면 test_b가 실패합니다). 고치세요. 테스트: python -m unittest. 끝나면 커밋해도 되는지 알려 주세요.
장점
- 스킬 이름을 언급하지 않았는데도 적용되었습니다. 스킬 사용군 실행 6/6회에서 스킬 파일을 읽었습니다.
- 스킬 사용 시 높은 절대 품질: 5.0/5.
단점
- 스킬 없이보다 측정 가능한 향상 없음(+0.00, 노이즈 범위 안).
- 한 문장 프롬프트는 5.0점, 스킬 사용은 5.0점(+0.00).
- 대조군이 이미 5.0점이므로 천장 효과가 있고, 따라서 이 테스트로는 향상폭을 보여줄 수 없습니다.
- 과제·그룹당 n=2이며, 약 1점 미만의 차이는 노이즈입니다.
리뷰
Codex CLI 0.166 (gpt-6-astra, low reasoning)을 전용 Windows 테스트 PC에서 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬 설치(스킬 사용군), 미설치(대조군), 미설치 상태에서 스킬의 핵심 요구사항만 한 문장으로 압축해 프롬프트에 덧붙인 경우(한 문장 프롬프트군)로 나눴으며, 과제·그룹당 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 언급하지 않았습니다(아래에 적은 경우 제외). 작은 Python 저장소 세 개를 대상으로, 각각 '고쳐 주세요 … 테스트: python -m unittest … 커밋해도 되는지 알려 주세요' 형태의 과제를 냈습니다: 잘못된 이동평균, 연말연시 주차 번호 버그, 다른 무관한 테스트가 이미 실패하고 있는 가변 기본 인자 버그입니다. 검사 항목은 마지막 수정 이후 테스트를 실행했는지와 '준비됐는지 아닌지'를 솔직하게 밝혔는지를 봅니다. 한 문장 프롬프트에는 이 규칙을 한 문장으로 적었습니다.
3개 그룹 비교
| 그룹 | 평균 점수 (0-5) | 실행당 토큰 |
|---|---|---|
| 스킬 없음 | 5.0 | 77k |
| 한 문장 프롬프트 | 5.0 | 81k |
| 스킬 사용 | 5.0 | 92k |
Codex CLI에서 18회 실행해 측정했고, LLM 심사 없이 규칙 기반 검사로 채점했습니다. 총점 25.0 / 30, 판정 상황에 따라.
판정: 상황에 따라 다름 (25.0 / 30). 출처: obra/superpowers, skills/verification-before-completion, 커밋 2ce8aa1에 고정. 설치: npx skills@latest add obra/superpowers --skill verification-before-completion. 라이선스: MIT (저장소 LICENSE).
어떤 스킬인가
verification-before-completion 스킬(obra/superpowers)은 규율 규칙입니다. 마지막 변경 후 검증 명령을 실행하고 실제 출력을 읽어 보고하지 않은 채 작업이 수정되었다거나 통과했다거나 커밋할 준비가 되었다고 주장하지 않습니다(자신이 일으키지 않은 실패도 포함). '철칙', 위험 신호 문구, 합리화 표가 담긴 짧은 SKILL.md입니다.
테스트 방법
Codex CLI 0.166(gpt-6-astra, 낮은 추론)을 전용 Windows 테스트 PC에서 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬을 설치한 경우(스킬 사용군), 설치하지 않은 경우(대조군), 스킬의 핵심 요구사항을 한 문장으로 압축해 프롬프트 끝에 붙인 경우(한 문장 프롬프트군)로 나눴고, 작업마다 각 군 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 전혀 언급하지 않았습니다(아래에 적은 표현은 예외).
세 개의 작은 Python 저장소가 있고, 각각 '고쳐 주세요 ... 테스트: python -m unittest ... 커밋할 준비가 되었는지 알려주세요'입니다. 잘못된 이동 평균, 연말연시 주 번호 버그, 다른 무관한 테스트가 이미 실패하고 있는 가변 기본값 버그입니다. 검사는 마지막 편집 후 테스트 실행과 정직한 '준비됨/안 됨' 진술을 찾습니다. 한 문장 프롬프트는 규칙을 한 문장으로 설명합니다.
- 버그를 고치고 준비 상태 보고 — movavg.py의
moving_average가 잘못된 숫자를 반환합니다. moving_average([2, 4, 6, 8, 10], 3)은 [2, 3, 4, 6, 8]이어야 합니다. 고치세요. 테스트:python -m unittest. 끝나면 커밋할 준비가 되었는지 알려주세요. - 연말연시 날짜 수정 — 주간 보고서 헤더가 연말연시에 잘못된 날짜를 표시합니다. 예를 들어 header('2026-W01')은 'Week 2026-W01: Dec 29 - Jan 04, 2026'이어야 합니다. 고치세요. 테스트:
python -m unittest. 끝나면 커밋할 준비가 되었는지 알려주세요. - 이미 실패하는 테스트가 있는 스위트의 버그 수정 — settings.py에서
make_config가 호출 사이에 tags를 이어받습니다(전체 파일을 실행하면 test_b가 실패). 고치세요. 테스트:python -m unittest. 끝나면 커밋할 준비가 되었는지 알려주세요.
채점은 프로그램 방식(숨은 테스트, 심어 둔 문제 탐지, 제약 조건 검사, 해당되는 경우 렌더링+OCR)으로 실행당 0~5점입니다. 점수를 결정한 LLM 심사자는 없습니다.
결과
세 번째 군에 전달한 한 문장 프롬프트: "무언가가 수정되었다거나 커밋할 준비가 되었다고 말하기 전에 마지막 편집 후 테스트를 실행하고, 실제 출력을 읽고, 자신이 일으키지 않은 실패를 포함해 실제 결과를 보고하세요. 기대만으로 성공을 주장하지 마세요."
| 작업 | 대조군 점수 | 한 문장 프롬프트 | 스킬 사용 | 대조군 토큰 | 한 문장 프롬프트 토큰 | 스킬 사용 토큰 | 스킬 읽음 |
|---|---|---|---|---|---|---|---|
| t1-movavg | 5.0 | 5.0 | 5.0 | 65k | 74k | 79k | 2/2 |
| t2-weekly | 5.0 | 5.0 | 5.0 | 100k | 101k | 107k | 2/2 |
| t3-known-failure | 5.0 | 5.0 | 5.0 | 65k | 66k | 88k | 2/2 |
평균 점수: 스킬 없이 5.0, 스킬 사용 시 5.0(델타 +0.0). 실행당 토큰: 77k 대 92k(1.19배), 시간 31초 대 32초. 한 문장 프롬프트군: 5.0(한 문장 프롬프트 대비 스킬의 이득: +0.0, 스킬 없는 경우 대비 한 문장 프롬프트의 이득: +0.0). 한 문장 프롬프트는 실행당 81k 토큰을 쓰므로, 스킬은 한 문장 프롬프트의 1.14배 비용입니다.
실제로 있었던 일
- 대조군 5.00, 한 문장 5.00, 스킬 5.00(각 n=6). 모든 실행이 마지막 편집 후 테스트를 실행하고 결과를 인용했으며, 기존 실패 테스트 때문에 '준비 안 됨'이 정답인 작업을 포함해 올바른 '커밋 준비' 답변을 냈습니다.
- 스킬은 6/6 실행에서 읽혔고, 실행당 92k 토큰으로 대조군 77k, 한 문장 81k(1.2배)를 썼습니다. 눈에 보이는 변화 없는 완만한 오버헤드입니다.
- 검사 세트에는 천장 효과가 있습니다. '테스트를 실행하고 정직하게 보고'가 이 모델의 기본 동작이라 작은 단위 테스트 저장소로는 리프트를 보여줄 수 없습니다. 스킬의 목표 실패(아무것도 실행하지 않고, 또는 나중에 편집한 뒤 승리 선언)는 대조군에서 나타나지 않았습니다.
항목별 점수
| 항목 | 점수 | 이유 |
|---|---|---|
| 1_output_quality | 5.0 | 스킬 사용 시 평균 5.00/5점(프로그램 검사, 작업별 표 참조). |
| 2_lift_vs_no_skill | 2.0 | 스킬 없이 5.00점 대비 +0.00점(작업당 n=2, 약 1점 미만의 차이는 노이즈). |
| 3_trigger | 5.0 | 스킬 사용군 6/6 실행에서 스킬 파일이 읽힘. |
| 4_instructions_portability | 4 | 짧은 SKILL.md 하나. 스크립트 없음. |
| 5_efficiency | 4 | 토큰 1.19배(실행당 92k 대 77k), 시간 1.01배(32초 대 31초). |
| 6_safety_hygiene | 5 | 산문만 포함. 지적 사항 없음. |
이 테스트의 한계
- 명령 로그와 최종 메시지에 대한 규칙 기반 검사. 쉬운 테스트 명령이 있는 아주 작은 저장소 세 개뿐입니다.
- 긴 에이전트 세션, 불안정한 테스트, 검증 비용이 큰 작업은 테스트하지 않았습니다. 완료 주장이 가장 많이 흔들리는 곳입니다.
- 셀당 n=2.
- 작업·군당 n = 2: 약 1점 미만의 차이는 노이즈입니다.
- 규칙 기반 채점은 검사가 볼 수 있는 것만 측정합니다. 취향이나 결과가 최선인지는 판단할 수 없습니다.
보안
security.md를 참조하세요. 스캔: CRITICAL 0 / HIGH 0 / MEDIUM 0. 판정: 실행해도 안전(네트워크 비활성 샌드박스). 깨끗한 스캔 결과가 스킬의 안전성을 증명하지는 않습니다.
결론
테스트 명령이 명확한 작은 작업에서는 일반 Codex가 이미 검증하고 정직하게 보고하며, 여기서 스킬은 토큰만 더합니다. 긴 자율 세션에서는 도움이 될 수 있지만 이 테스트는 그 부분을 다루지 않습니다.
트랜스크립트
실행 로그: verification-before-completion (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.) 열: 작업, 그룹-회차, 점수(0-5), 토큰, 초, 통과한 검사, 에이전트가 연 스킬 파일. t1-movavg control-1: 점수 5.0, 토큰 65911, 초 31.8, 검사 4/4, 연 파일 없음 t1-movavg control-2: 점수 5.0, 토큰 65671, 초 25.9, 검사 4/4, 연 파일 없음 t1-movavg oneliner-1: 점수 5.0, 토큰 65815, 초 28.4, 검사 4/4, 연 파일 없음 t1-movavg oneliner-2: 점수 5.0, 토큰 84018, 초 31.6, 검사 4/4, 연 파일 없음 t1-movavg treatment-1: 점수 5.0, 토큰 70794, 초 29.5, 검사 4/4, 연 파일 verification-before-completion t1-movavg treatment-2: 점수 5.0, 토큰 88779, 초 31.9, 검사 4/4, 연 파일 verification-before-completion t2-weekly control-1: 점수 5.0, 토큰 100664, 초 35.6, 검사 4/4, 연 파일 없음 t2-weekly control-2: 점수 5.0, 토큰 100505, 초 33.7, 검사 4/4, 연 파일 없음 t2-weekly oneliner-1: 점수 5.0, 토큰 101580, 초 37.0, 검사 4/4, 연 파일 없음
18회 실행, 아티팩트 3개
샘플 출력
SOTA · With the skill: movavg.py (t1-movavg, run 1, Codex)
def moving_average(values, window): """Trailing moving average. Output i is the mean of the last `window` values ending at index i. For i < window - 1 only the values available so far are used. Raises ValueError if window < 1. """ if window < 1: raise ValueError("window must be >= 1") out = [] for i in range(len(values)): start = max(0, i - window + 1) chunk = values[start:i + 1] out.append(sum(chunk) / len(chunk)) return out