diagnosing-bugs (Matt Pocock)
어려운 버그와 성능 회귀를 진단 루프로 추적한 뒤 수정안을 제시합니다.
mattpocock diagnosing-bugs: '먼저 피드백 루프를 구축하라'는 규칙을 한 문장으로 옮긴 프롬프트가 스킬 전체와 같은 성과를 냈고, 비용은 스킬의 0.95배였습니다
Codex CLI · gpt-6-astra
22.9 / 30
스킬 없이 대비 향상폭: +0.28 · 상황에 따라 · 18회 실행
상황에 따라: 향상폭 +0.28가 +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.3
- 출력 품질
- 4.6
- 토큰 및 시간 비용
- 2.0
- 설치 및 이식성
- 4.0
- 안전성
- 5.0
보안 리뷰
안전정적 스캔: CRITICAL 0 / HIGH 0 / MEDIUM 0. 수동 검토: 네트워크가 차단된 샌드박스에서 실행 안전(발견 사항 없음). 스캔이 깨끗하다고 해서 스킬이 안전하다는 증거는 아닙니다.
설치
npx skills@latest add mattpocock/skills --skill diagnosing-bugs
고정 커밋: 4ae2317ddb22b046e26455e4f9c9b3aaaf62212d
테스트일: 2026-11-02
테스트한 과제
- 작은 함수의 off-by-one 오류 — movavg.py의 moving_average가 잘못된 값을 반환합니다. moving_average([2, 4, 6, 8, 10], 3)은 [2, 3, 4, 6, 8]이어야 하는데 뒤쪽 값이 잘못 나옵니다. 원인을 찾아 고치세요. 테스트: python3 -m unittest.
- 여러 파일에 걸친 날짜 버그 — 주간 보고서 헤더가 연말연시에 잘못된 날짜를 표시합니다. 예를 들어 header('2026-W01')은 'Week 2026-W01: Dec 29 - Jan 04, 2026'이어야 합니다. 원인을 찾아 고치세요.
- 실행 순서에 따라 달라지는 테스트 실패 — tests/test_settings.py의 테스트는 개별 실행하면 통과하지만 파일 전체를 실행하면 test_b가 실패합니다. 설정이 이전 호출의 태그를 물고 오는 것 같습니다. 원인을 진단하고 고치세요.
장점
- 스킬 이름을 언급하지 않았는데도 적용되었습니다. 스킬 사용군 실행 6/6회에서 스킬 파일을 읽었습니다.
- 스킬 사용 시 높은 절대 품질: 4.58/5.
단점
- 스킬 없이보다 측정 가능한 향상 없음(+0.28, 노이즈 범위 안).
- 한 문장 프롬프트는 4.72점, 스킬 사용은 4.58점(-0.14).
- 스킬 없이보다 토큰을 1.71배 사용합니다.
- 과제·그룹당 n=2이며, 약 1점 미만의 차이는 노이즈입니다.
리뷰
Codex CLI 0.166 (gpt-6-astra, low reasoning)을 Mac 테스트 머신에서 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬 설치(스킬 사용군), 미설치(대조군), 미설치 상태에서 스킬의 핵심 요구사항만 한 문장으로 압축해 프롬프트에 덧붙인 경우(한 문장 프롬프트군)로 나눴으며, 과제·그룹당 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 언급하지 않았습니다. 채점은 자동화된 프로그램으로 수행했습니다(숨은 테스트 / 심어 둔 문제 탐지율 / 제약 조건 검사 / 해당되는 경우 렌더링+OCR). 실행당 0–5점이며, 어떤 점수도 LLM 심사자가 결정하지 않았습니다.
3개 그룹 비교
| 그룹 | 평균 점수 (0-5) | 실행당 토큰 |
|---|---|---|
| 스킬 없음 | 4.31 | 77k |
| 한 문장 프롬프트 | 4.72 | 126k |
| 스킬 사용 | 4.58 | 133k |
Codex CLI에서 18회 실행해 측정했고, LLM 심사 없이 규칙 기반 검사로 채점했습니다. 총점 22.9 / 30, 판정 상황에 따라.
판정: 상황에 따라 (22.9 / 30). 출처: mattpocock/skills, skills/engineering/diagnosing-bugs, 커밋 4ae2317에 고정. 설치: npx skills@latest add mattpocock/skills --skill diagnosing-bugs. 라이선스: MIT(저장소 LICENSE).
무엇인가
Matt Pocock의 스킬 저장소(engineering)에 있는 diagnosing-bugs 스킬입니다. 어려운 버그를 다루는 훈련법으로, 1단계는 '촘촘한 통과/실패 피드백 루프 만들기'입니다(실패하는 테스트, curl 스크립트, CLI diff, 헤드리스 브라우저, 재생한 트레이스). 그다음 순위를 매긴 가설을 하나씩 검증하고, 계측을 추가하고, 회귀 테스트를 작성하고, 정리합니다. 약 1,000단어의 Markdown, hitl-loop.template.sh 도우미 템플릿 하나, 출력을 보여주기 전에 비밀을 가리라는 규칙이 들어 있습니다. 'diagnose', 'debug this', 'something is broken/failing'에 반응해 실행됩니다.
테스트 방법
Codex CLI 0.166(gpt-6-astra, 낮은 추론)을 Mac 테스트 머신에서 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬을 설치한 스킬 사용군, 스킬이 없는 대조군, 스킬 없이 핵심 요구사항을 한 문장으로 압축해 프롬프트 끝에 붙인 한 문장 프롬프트군으로 나눴으며, 작업·군당 2회 실행, 네트워크 차단, /tmp 쓰기 차단 조건이었습니다. 프롬프트에는 스킬 이름을 전혀 언급하지 않았습니다.
- 작은 함수의 off-by-one — movavg.py의
moving_average가 잘못된 숫자를 반환합니다. moving_average([2, 4, 6, 8, 10], 3)은 [2, 3, 4, 6, 8]이어야 하는데 뒤쪽 값이 잘못 나옵니다. 원인을 찾아 수정하세요. 테스트:python3 -m unittest. - 파일 간 날짜 버그 — 주간 보고서 헤더가 연말연시에 잘못된 날짜를 표시합니다. 예를 들어 header('2026-W01')은 'Week 2026-W01: Dec 29 - Jan 04, 2026'이어야 합니다. 원인을 찾아 수정하세요.
- 실행 순서에 따른 테스트 실패 — tests/test_settings.py의 테스트는 개별 실행하면 통과하지만 파일 전체를 실행하면
test_b가 실패하고, 설정이 이전 호출의 태그를 물고 오는 것처럼 보입니다. 진단하고 수정하세요.
채점은 프로그램 방식(숨은 테스트/심어 둔 문제 탐지/제약 조건 검사/해당되는 경우 렌더링+OCR)으로 진행하며 실행당 0~5점입니다. 어떤 점수도 LLM 심사자가 결정하지 않았습니다.
결과
세 번째 군에 제공한 한 문장 프롬프트: "먼저 이 정확한 버그에서 빨간불이 되는 빠르고 결정적인 통과/실패 피드백 루프를 만드세요(실패하는 테스트가 가장 좋습니다). 그다음 순위를 매긴 가설을 세우고, 수정 전에 증거와 함께 하나씩 검증하세요. 마지막으로 루프를 다시 실행해 수정을 확인하세요."
| 작업 | 대조군 점수 | 한 문장 프롬프트 | 스킬 사용 | 대조군 토큰 | 한 문장 토큰 | 스킬 사용 토큰 | 스킬 읽음 |
|---|---|---|---|---|---|---|---|
| t1-moving-average | 4.17 | 4.58 | 4.17 | 60k | 102k | 87k | 2/2 |
| t2-weekly-dates | 4.17 | 4.58 | 5.0 | 86k | 120k | 136k | 2/2 |
| t3-shared-state | 4.58 | 5.0 | 4.58 | 84k | 154k | 173k | 2/2 |
평균 점수: 스킬 없음 4.31 vs 스킬 사용 4.58(델타 +0.28). 실행당 토큰: 77k vs 133k(1.71배), 시간 38초 vs 51초. 한 문장 프롬프트군: 4.72(한 문장 프롬프트 대비 스킬의 이득: -0.14, 스킬 없음 대비 한 문장 프롬프트의 이득: +0.42). 한 문장 프롬프트는 실행당 126k 토큰이므로 스킬 비용은 한 문장 프롬프트의 1.05배입니다.
무슨 일이 있었나
- 최종 정확성은 세 군 모두 같았습니다. 숨은 테스트가 18/18 실행에서 통과했고 모든 diff가 소규모 diff 한도 안에 머물렀습니다. 심어 둔 세 버그(off-by-one, 파일 간 날짜 로직, 실행 순서에 따른 테스트 오염)는 일반 Codex로도 고칠 만큼 쉬웠습니다.
- 달라진 것은 '코드를 수정하기 전에 테스트를 실행했는가', 즉 먼저 재현했는가라는 과정 검사뿐입니다. 스킬 없이는 1/6 실행이 그렇게 했고, 스킬의 첫 규칙을 한 문장으로 옮긴 경우 4/6, 스킬을 설치한 경우 4/6이었습니다. 즉 그 한 문장이 효과 전체를 재현했습니다.
- 스킬은 어떤 프롬프트에서도 언급되지 않았지만 스킬 사용군 6/6 실행에서 읽혔습니다('debug this'에 반응). 에이전트를 더 많이 움직이게 했습니다. 실행당 명령이 18개로, 스킬 없음 8개, 한 문장 13개보다 많았습니다.
- 비용: 실행당 스킬 133k 토큰으로 스킬 없음 77k(1.71배), 한 문장 126k(1.05배)였습니다. 한 문장 군 자체도 대조군의 1.64배 비용이었는데, 에이전트에게 먼저 루프를 만들라고 하면 단계를 더 실행하기 때문입니다.
- 스킬 사용 실행 하나(공유 상태 작업)는 버그를 고치고 숨은 테스트를 통과했지만, 답변이 저희 근본 원인 검사(원인을 명시하는지 봄)와 맞지 않았습니다. 어느 군에서든 이 검사를 놓친 유일한 실행입니다.
항목별 점수
| 항목 | 점수 | 이유 |
|---|---|---|
| 1_출력_품질 | 4.58 | 스킬 사용 시 평균 4.58/5(프로그램 검사, 작업별 표 참고). |
| 2_스킬_없음_대비_향상 | 2.2800000000000002 | 스킬 없음 4.31 대비 +0.28점(작업당 n=2, 약 1점 미만은 노이즈). |
| 3_트리거 | 5.0 | 스킬 사용군 6/6 실행에서 스킬 파일을 읽었습니다. |
| 4_지침_이식성 | 4 | 평범한 Markdown이며, 있으면 선택적으로 GLOSSARY.md/ADR을 읽습니다. HTTP/브라우저 루프 옵션은 샌드박스에 없을 수 있는 도구를 필요로 합니다. |
| 5_효율성 | 2 | 토큰 1.71배(실행당 133k vs 77k), 시간 1.35배(51초 vs 38초). |
| 6_안전성_및_위생 | 5 | Markdown과 로컬 셸 템플릿 하나(입력을 받아 출력만 하고, 네트워크와 쓰기는 없음). 스킬은 출력을 보여주기 전에 비밀을 가리라고 지시합니다. |
이 테스트의 한계
- 코드를 읽으면 찾을 수 있는 작은 단일 파일 Python 버그 세 개입니다. 이 스킬은 어려운 버그(간헐적 버그, 성능 회귀, 하네스가 필요한 버그)를 위해 만들어졌지만 그런 것은 테스트하지 않았습니다.
- 스킬의 다른 도구(HTTP/브라우저 루프, 트레이스 재생, 이분 탐색, 계측 태그)는 구동할 앱이 없는 네트워크 차단 샌드박스에서 실행할 수 없습니다.
- '수정 전 테스트 실행' 검사는 이벤트 로그에서 첫 테스트 명령과 첫 쓰기의 순서를 비교할 뿐, 재현의 품질을 판단하지 않습니다.
- 작업·군당 n=2: 약 1점 미만의 차이는 노이즈입니다.
- 규칙 기반 채점은 검사가 볼 수 있는 것만 측정하며, 취향이나 결과가 최선인지는 판단하지 못합니다.
보안
security.md를 참고하세요. 스캔: CRITICAL 0 / HIGH 0 / MEDIUM 0. 판정: 실행해도 안전(네트워크 차단 샌드박스). 깨끗한 스캔 결과가 스킬의 안전성을 증명하지는 않습니다.
결론
이 스킬의 핵심 아이디어는 좋은 습관이고 Codex는 말해 주면 이를 따릅니다. 그러나 그 한 문장만으로도 거의 같은 비용에 같은 '먼저 재현' 행동과 같은 통과율을 얻었고, 쉬운 버그는 어느 쪽이든 에이전트가 고칩니다. 어렵고 간헐적인 버그를 디버깅하며 전체 훈련법을 원한다면 설치해 두세요. 작은 버그라면 첫 규칙을 프롬프트에 넣는 것만으로 이득을 볼 수 있습니다.
트랜스크립트
실행 로그: diagnosing-bugs (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.) 열: 작업, 그룹-회차, 점수(0-5), 토큰, 초, 통과한 검사, 에이전트가 연 스킬 파일. t1-moving-average control-1: 점수 4.17, 토큰 60541, 초 27.1, 검사 3/4, 연 파일 없음 t1-moving-average control-2: 점수 4.17, 토큰 60464, 초 29.1, 검사 3/4, 연 파일 없음 t1-moving-average oneliner-1: 점수 5.0, 토큰 93708, 초 49.0, 검사 4/4, 연 파일 없음 t1-moving-average oneliner-2: 점수 4.17, 토큰 111338, 초 39.8, 검사 3/4, 연 파일 없음 t1-moving-average treatment-1: 점수 4.17, 토큰 87669, 초 36.8, 검사 3/4, 연 파일 diagnosing-bugs t1-moving-average treatment-2: 점수 4.17, 토큰 87501, 초 36.0, 검사 3/4, 연 파일 diagnosing-bugs t2-weekly-dates control-1: 점수 4.17, 토큰 95094, 초 43.4, 검사 3/4, 연 파일 없음 t2-weekly-dates control-2: 점수 4.17, 토큰 78531, 초 38.2, 검사 3/4, 연 파일 없음 t2-weekly-dates oneliner-1: 점수 4.17, 토큰 129649, 초 49.4, 검사 3/4, 연 파일 없음
18회 실행, 아티팩트 3개
샘플 출력
SOTA · With the skill: movavg.py (t1-moving-average, 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