writing-plans (obra/superpowers)
코드를 건드리기 전에 명세나 요구 사항을 단계별 구현 계획으로 바꿉니다.
writing-plans: 짧은 기능 명세를 단계별 TDD 계획으로 바꿉니다(대조군 1.6, 스킬 사용군 4.4, 한 문장 프롬프트군 4.2). 토큰은 1.35배 사용하며, 같은 형식을 한 문장으로 넣은 프롬프트도 거의 같은 점수를 받습니다
Codex CLI · gpt-6-astra
25.3 / 30
스킬 없이 대비 향상폭: +2.87 · 추천 · 18회 실행
추천: 총점 25.3/30이 22점 이상, 출력 품질 4.4가 3.5 이상, 향상폭 +2.87가 +1.0 이상입니다.
SOTA
통과Codex로 테스트
커버 대상 Codex, Claude Code
Codex CLI 0.166 (SOTA 티어): 채점된 실행 18회. 여기서 통과하면 티어 규칙에 따라 Claude Code도 커버되지만, 두 번째 티어에 대해서는 아무것도 말해주지 않습니다.
점수
각 차원은 0~5점이며 여섯 차원을 더하면 30점 만점의 총점이 됩니다. 모든 차원에서 5가 가장 좋습니다. 비용 5는 저렴하고 빠름, 설치 5는 쉬움을 뜻합니다.
- 트리거 신뢰도
- 5.0
- 스킬 없이 대비 향상폭
- 4.9
- 출력 품질
- 4.4
- 토큰 및 시간 비용
- 3.0
- 설치 및 이식성
- 4.0
- 안전성
- 4.0
보안 리뷰
안전정적 스캔: CRITICAL 0 / HIGH 0 / MEDIUM 0. 수동 검토: 네트워크가 차단된 샌드박스에서 실행 안전(발견 사항 없음). 스캔이 깨끗하다고 해서 스킬이 안전하다는 증거는 아닙니다.
설치
npx skills@latest add obra/superpowers --skill writing-plans
고정 커밋: 2ce8aa15d05bd57213e6f746f953aafb7ded7a8b
테스트일: 2026-11-02
테스트한 과제
- CLI의 마감 기한 계획 — spec.md에 이 작은 todo CLI의 기능이 설명되어 있습니다. 이 폴더의 plan.md에 구현 계획을 작성하세요. 프로젝트에 코드는 쓰지 말고 계획만 작성하세요.
- CSV 내보내기 계획 — spec.md에 이 report 모듈의 기능이 설명되어 있습니다. 이 폴더의 plan.md에 구현 계획을 작성하세요. 프로젝트에 코드는 쓰지 말고 계획만 작성하세요.
- API 속도 제한 계획 — spec.md에 이 notes API의 기능이 설명되어 있습니다. 이 폴더의 plan.md에 구현 계획을 작성하세요. 프로젝트에 코드는 쓰지 말고 계획만 작성하세요.
장점
- 스킬 없이보다 평균 점수를 1.56에서 4.43으로 끌어올렸습니다(+2.87).
- 스킬 이름을 언급하지 않았는데도 적용되었습니다. 스킬 사용군 실행 6/6회에서 스킬 파일을 읽었습니다.
단점
- 테스트 참고: 처음 점수를 본 뒤 검사 세 개를 바꾸고 18회 실행을 모두 새 규칙으로 다시 채점했습니다. 플레이스홀더 검사는 TODO라는 단어를 더 이상 매칭하지 않는데, 한 과제에서 이 단어가 제품 이름이기 때문입니다. 실패하는 테스트 먼저 및 예상 출력 패턴은 'Expect failure' 표현을 허용합니다. 커밋과 체크박스 임계값은 낮췄습니다. 변경 전에는 스킬이 2.98, 한 문장 프롬프트가 4.04였고, 변경 후에는 4.43과 4.21이었습니다. 대조군은 어느 쪽이든 1.5 근처에 머물렀습니다.
- 과제·그룹당 n=2이며, 약 1점 미만의 차이는 노이즈입니다.
리뷰
Codex CLI 0.166 (gpt-6-astra, low reasoning)을 전용 Windows 테스트 PC에서 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬 설치(스킬 사용군), 미설치(대조군), 미설치 상태에서 스킬의 핵심 요구사항만 한 문장으로 압축해 프롬프트에 덧붙인 경우(한 문장 프롬프트군)로 나눴으며, 과제·그룹당 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 언급하지 않았습니다(아래에 적은 경우 제외). 작은 Python 프로젝트 세 개(todo CLI, report 모듈, notes API)를 대상으로 했고, 각각 spec.md가 있습니다. 프롬프트는 plan.md에 구현 계획을 쓰라고만 요청하고 코드 작성을 금지합니다. 계획 형식은 설명하지 않습니다. 한 문장 프롬프트에는 형식 전체를 적었습니다: 2~5분짜리 잘게 나눈 단계, 정확한 경로, 완전한 코드와 함께 실패하는 테스트 먼저, 예상 출력이 붙은 정확한 명령, 최소 구현, git 커밋, 플레이스홀더 없음.
3개 그룹 비교
| 그룹 | 평균 점수 (0-5) | 실행당 토큰 |
|---|---|---|
| 스킬 없음 | 1.56 | 88k |
| 한 문장 프롬프트 | 4.21 | 127k |
| 스킬 사용 | 4.43 | 119k |
Codex CLI에서 18회 실행해 측정했고, LLM 심사 없이 규칙 기반 검사로 채점했습니다. 총점 25.3 / 30, 판정 추천.
참고: 첫 점수를 본 뒤 검사 세 개를 바꾸고 18회 전체를 새 규칙으로 다시 채점했습니다. 플레이스홀더 검사가 더 이상 TODO라는 단어와 일치하지 않습니다. TODO는 한 과제의 제품 이름입니다. 실패하는 테스트 우선·예상 출력 패턴은 'Expect failure' 표현을 허용합니다. 커밋과 체크박스 임계값은 낮췄습니다. 변경 전 스킬은 2.98, 한 문장 프롬프트는 4.04였고, 변경 후에는 4.43과 4.21이었습니다. 대조군은 양쪽 모두 1.5 근처에 머물렀습니다.
판정: 추천 (25.3 / 30). 출처: obra/superpowers, skills/writing-plans, 커밋 2ce8aa1에 고정. 설치: npx skills@latest add obra/superpowers --skill writing-plans. 라이선스: MIT (저장소 LICENSE).
어떤 스킬인가
writing-plans 스킬(obra/superpowers)입니다. 명세를 잘게 나눈 구현 계획으로 바꿉니다. 정확한 파일 경로, 먼저 실패하는 테스트, 예상 결과가 있는 정확한 실행 명령, 최소 구현, 작업마다 커밋 단계, 체크박스 단계, TBD 같은 자리표시자 금지.
테스트 방법
Codex CLI 0.166(gpt-6-astra, 낮은 추론)을 전용 Windows 테스트 PC에서 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬을 설치한 경우(스킬 사용군), 설치하지 않은 경우(대조군), 스킬의 핵심 요구사항을 한 문장으로 압축해 프롬프트 끝에 붙인 경우(한 문장 프롬프트군)로 나눴고, 작업마다 각 군 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 전혀 언급하지 않았습니다(아래에 적은 표현은 예외).
작은 Python 프로젝트 세 개(todo CLI, report 모듈, notes API)를 사용했고 각각 spec.md가 있습니다. 프롬프트는 plan.md에 구현 계획을 작성하라고만 요구하고 코드 작성을 금지합니다. 계획 형식은 설명하지 않습니다. 한 문장 프롬프트는 형식 전체를 설명합니다. 2-5분 단위의 잘게 나눈 단계, 정확한 경로, 완전한 코드가 있는 먼저 실패하는 테스트, 예상 출력이 있는 정확한 명령, 최소 구현, git commit, 자리표시자 없음.
- CLI의 마감일 계획 — spec.md는 이 작은 todo CLI의 기능을 설명합니다. 구현 계획을 이 폴더의 plan.md에 작성하세요. 프로젝트에 코드를 작성하지 말고 계획만 작성하세요.
- CSV 내보내기 계획 — spec.md는 이 report 모듈의 기능을 설명합니다. 구현 계획을 이 폴더의 plan.md에 작성하세요. 프로젝트에 코드를 작성하지 말고 계획만 작성하세요.
- API 속도 제한 계획 — spec.md는 이 notes API의 기능을 설명합니다. 구현 계획을 이 폴더의 plan.md에 작성하세요. 프로젝트에 코드를 작성하지 말고 계획만 작성하세요.
채점은 프로그램 방식(숨은 테스트, 심어 둔 문제 탐지, 제약 조건 검사, 해당되는 경우 렌더링+OCR)으로 실행당 0~5점입니다. 점수를 결정한 LLM 심사자는 없습니다.
결과
세 번째 군에 전달한 한 문장 프롬프트: "계획을 2-5분 단위의 잘게 나눈 작업으로 작성하세요. 정확한 파일 경로, 완전한 코드가 있는 먼저 실패하는 테스트, 예상 출력이 있는 정확한 명령, 완전한 코드가 있는 최소 구현, 그다음 git commit 단계. TBD나 '검증 추가' 같은 자리표시자는 넣지 마세요."
| 작업 | 대조군 점수 | 한 문장 프롬프트 | 스킬 사용 | 대조군 토큰 | 한 문장 프롬프트 토큰 | 스킬 사용 토큰 | 스킬 읽음 |
|---|---|---|---|---|---|---|---|
| t1-todo-due | 1.51 | 4.21 | 4.28 | 94k | 132k | 111k | 2/2 |
| t2-csv-export | 1.71 | 4.47 | 4.8 | 84k | 129k | 122k | 2/2 |
| t3-rate-limit | 1.45 | 3.95 | 4.21 | 85k | 120k | 122k | 2/2 |
평균 점수: 스킬 없이 1.56, 스킬 사용 시 4.43(델타 +2.87). 실행당 토큰: 88k 대 119k(1.34배), 시간 66초 대 102초. 한 문장 프롬프트군: 4.21(한 문장 프롬프트 대비 스킬의 이득: +0.22, 스킬 없는 경우 대비 한 문장 프롬프트의 이득: +2.65). 한 문장 프롬프트는 실행당 127k 토큰을 쓰므로, 스킬은 한 문장 프롬프트의 0.93배 비용입니다.
실제로 있었던 일
- 대조군 1.56, 스킬 4.43, 한 문장 프롬프트 4.21(각 n=6). 대조군의 계획은 짧은 산문 개요(46〜71줄)입니다. 6회 실행 모두 먼저 실패하는 테스트 단계도, 예상 출력도, 커밋 단계도 없고, 실행 명령은 하나씩입니다.
- 스킬 계획은 110〜142줄의 체크박스 형식이며, 실패하는 테스트 단계, '실패 예상' 또는 '모든 테스트 통과 예상'으로 표시된 실행 단계, CSV 작업에는 작업 단위 커밋이 있습니다. 그래도 빈틈이 있습니다. 6회 중 4회에는 git commit 단계가 없고, 코드 블록은 모든 단계가 아니라 2〜3개 단계에만 나옵니다.
- 한 문장 프롬프트 계획은 약 350줄로 각 단계에 완전한 코드가 있고 필요한 커밋과 명령이 모두 있지만, 6/6에서 체크박스가 없고(스킬 전용 형식), 6회 중 3회에서는 PowerShell 표현을 써서 실행 명령이 4개 미만입니다.
- 토큰: 스킬 119k, 한 문장 프롬프트 127k, 대조군 88k(실행당). 대조군의 1.35배입니다. 스킬은 스킬 사용군 6/6 실행에서 읽혔습니다.
항목별 점수
| 항목 | 점수 | 이유 |
|---|---|---|
| 1_output_quality | 4.43 | 스킬 사용 시 평균 4.43/5점(프로그램 검사, 작업별 표 참조). |
| 2_lift_vs_no_skill | 4.87 | 스킬 없이 1.56점 대비 +2.87점(작업당 n=2, 약 1점 미만의 차이는 노이즈). |
| 3_trigger | 5.0 | 스킬 사용군 6/6 실행에서 스킬 파일이 읽힘. |
| 4_instructions_portability | 4 | superpowers 형식의 SKILL.md. 실행을 위해 다른 superpowers 스킬을 참조합니다. |
| 5_efficiency | 3 | 토큰 1.34배(실행당 119k 대 88k), 시간 1.54배(102초 대 66초). |
| 6_safety_hygiene | 4 | 산문만 포함. security.md 참조. |
이 테스트의 한계
- plan.md 텍스트에 대한 규칙 기반 검사입니다. 경로, 명령, 커밋, 체크박스, 코드 블록의 개수를 셉니다. 계획의 품질, 계획이 실제로 동작할지는 평가하지 않았습니다.
- 첫 채점을 보고 검사를 바꾼 뒤 모든 실행을 같은 새 규칙으로 다시 채점했습니다. (1) '자리표시자 없음' 검사가 TODO라는 단어와 일치했는데, 이는 todo-CLI 작업의 제품 이름입니다(패턴에서 TODO 제거). (2) '먼저 실패하는 테스트'와 '예상 출력' 패턴을 넓혀 '실패 예상'과 '모든 테스트 통과 예상'을 받아들이게 했습니다. (3) 커밋 임계값을 3에서 2로(스킬 계획에는 작업이 두 개), 체크박스 임계값을 12에서 8로 낮췄습니다. 이 변경 전에는 스킬 2.98, 한 문장 프롬프트 4.04였고, 이후에는 4.43과 4.21입니다. 대조군은 어느 쪽이든 1.4〜1.6이었습니다.
- 체크박스 검사는 스킬이 쓰고 한 문장 프롬프트는 요구한 적 없는 형식을 세므로 스킬에 유리합니다.
- 셀당 n=2. 작은 픽스처.
- 작업·군당 n = 2: 약 1점 미만의 차이는 노이즈입니다.
- 규칙 기반 채점은 검사가 볼 수 있는 것만 측정합니다. 취향이나 결과가 최선인지는 판단할 수 없습니다.
보안
security.md를 참조하세요. 스캔: CRITICAL 0 / HIGH 0 / MEDIUM 0. 판정: 실행해도 안전(네트워크 비활성 샌드박스). 깨끗한 스캔 결과가 스킬의 안전성을 증명하지는 않습니다.
결론
도움 없이 Codex는 느슨한 개요를 쓰지만, 스킬이 있으면 실제 TDD 단계를 씁니다. 같은 형식을 지정한 문단 하나도 거의 같은 성과를 내고 단계마다 더 충실한 코드를 만들므로, 스킬은 주로 그 문단을 편리하게 묶어 둔 것입니다.
트랜스크립트
실행 로그: writing-plans (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.) 열: 작업, 그룹-회차, 점수(0-5), 토큰, 초, 통과한 검사, 에이전트가 연 스킬 파일. t1-todo-due control-1: 점수 1.38, 토큰 102848, 초 60.8, 검사 3/10, 연 파일 없음 t1-todo-due control-2: 점수 1.64, 토큰 86724, 초 67.6, 검사 3/10, 연 파일 없음 t1-todo-due oneliner-1: 점수 4.47, 토큰 133771, 초 130.1, 검사 9/10, 연 파일 없음 t1-todo-due oneliner-2: 점수 3.95, 토큰 131546, 초 112.8, 검사 8/10, 연 파일 없음 t1-todo-due treatment-1: 점수 4.34, 토큰 123893, 초 104.1, 검사 8/10, 연 파일 writing-plans t1-todo-due treatment-2: 점수 4.21, 토큰 99712, 초 99.6, 검사 8/10, 연 파일 writing-plans t2-csv-export control-1: 점수 1.71, 토큰 85021, 초 70.6, 검사 4/10, 연 파일 없음 t2-csv-export control-2: 점수 1.71, 토큰 84700, 초 64.8, 검사 4/10, 연 파일 없음 t2-csv-export oneliner-1: 점수 4.47, 토큰 129967, 초 119.6, 검사 9/10, 연 파일 없음
18회 실행, 아티팩트 3개
샘플 출력
SOTA · With the skill: plan.md (t1-todo-due, run 1, Codex)
# Todo Due Dates Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Add optional due dates, chronological listing, and an overdue-only CI check without migrating existing data. **Architecture:** Keep the existing JSON dictionary storage and implement date validation, ordering, and rendering in `todo/cli.py`. Capture the local date once per list invocation and pass it to a pure overdue predicate. Preserve the existing `main(argv=None)` entry point and argparse error handling. **Tech Stack:** Python standard library: argparse, datetime, json, unittest, unittest.mock, tempfile; no new dependencies. **Spec:** `spec.md` (read alongside this plan). ## Global Constraints - `todo add "title" --due 2026-03-01` stores an optional ISO due date with the item. - `todo list` prints overdue items first (marked `!`), then by due date, then undated items. - `todo list --overdue` prints only overdue items; exit code 1 if there are any (so CI can use it). - Invalid dates are rejected with a clear message and exit code 2. - Items already stored without a due date must keep working (no migration step for the user). ## Decisions for details not specified - Accept exactly `YYYY-MM-DD` with a real Gregorian calendar date; reject whitespace, compact dates, timestamps, and unpadded components. - An item is overdue only when unfinished and its due date is strictly before the current local date. Due today is not overdue. - Sort overdue items by ascending due date, then remaining dated items by ascending due date, then undated items. Preserve insertion order within equal keys. Completed items remain visible in ordinary listings but are never overdue. - Preserve `[ ] title` and `[x] title` for undated items. Append ` (due YYYY-MM-DD)` for dated items and prefix overdue lines with `! `, e.g. `! [ ] rent (due 2026-03-01)`. - Ordinary listing returns 0, even with overdue items. Overdue-only listing returns 0 with no output when none qualify. Listing never rewrites storage. - Store dates as strings under `due`; omit the key when not supplied. Treat an absent key or `null` as undated. Arbitrary corrupt JSON or malformed dates manually inserted into storage are outside this feature. ## Review Focus 1. Calendar boundaries: leap day is accepted only in leap years; impossible dates fail before storage changes (Task 1). 2. ISO-looking variants: compact dates, timestamps, whitespace, and unpadded dates are rejected (Task 1). 3. Midnight/today boundary: due today is not overdue; use one captured local date per listing (Task 2). 4. Completed items with past dates: remain visible without `!` and are excluded from overdue filtering (Tasks 2–3). 5. Legacy and tied items: missing/null dates work, ties retain insertion order, and listing leaves the JSON file untouched (Tasks 2–3). ## File Map - Modify `todo/cli.py`: add argument validation, optional date persistence, overdue predicate, sorting, rendering, and filter exit status. - Create `tests/test_cli.py`: isolated CLI tests u [... excerpt: first 3200 of 11517 characters]