모든 스킬

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.3177k
한 문장 프롬프트4.72126k
스킬 사용4.58133k

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 쓰기 차단 조건이었습니다. 프롬프트에는 스킬 이름을 전혀 언급하지 않았습니다.

  1. 작은 함수의 off-by-one — movavg.py의 moving_average가 잘못된 숫자를 반환합니다. moving_average([2, 4, 6, 8, 10], 3)은 [2, 3, 4, 6, 8]이어야 하는데 뒤쪽 값이 잘못 나옵니다. 원인을 찾아 수정하세요. 테스트: python3 -m unittest.
  2. 파일 간 날짜 버그 — 주간 보고서 헤더가 연말연시에 잘못된 날짜를 표시합니다. 예를 들어 header('2026-W01')은 'Week 2026-W01: Dec 29 - Jan 04, 2026'이어야 합니다. 원인을 찾아 수정하세요.
  3. 실행 순서에 따른 테스트 실패 — tests/test_settings.py의 테스트는 개별 실행하면 통과하지만 파일 전체를 실행하면 test_b가 실패하고, 설정이 이전 호출의 태그를 물고 오는 것처럼 보입니다. 진단하고 수정하세요.

채점은 프로그램 방식(숨은 테스트/심어 둔 문제 탐지/제약 조건 검사/해당되는 경우 렌더링+OCR)으로 진행하며 실행당 0~5점입니다. 어떤 점수도 LLM 심사자가 결정하지 않았습니다.

결과

세 번째 군에 제공한 한 문장 프롬프트: "먼저 이 정확한 버그에서 빨간불이 되는 빠르고 결정적인 통과/실패 피드백 루프를 만드세요(실패하는 테스트가 가장 좋습니다). 그다음 순위를 매긴 가설을 세우고, 수정 전에 증거와 함께 하나씩 검증하세요. 마지막으로 루프를 다시 실행해 수정을 확인하세요."

작업대조군 점수한 문장 프롬프트스킬 사용대조군 토큰한 문장 토큰스킬 사용 토큰스킬 읽음
t1-moving-average4.174.584.1760k102k87k2/2
t2-weekly-dates4.174.585.086k120k136k2/2
t3-shared-state4.585.04.5884k154k173k2/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

Pro 보기