planning-ko 완료 후 호출 — plan.md를 2~5분 단위 TDD 5스텝 태스크로 분해. 모든 must AC가 최소 1 태스크에 매핑되도록 보장. bash 테스트 컨벤션 (templates/test-conventions-bash.md) 준수 점검 포함
Install
npx skillscat add andyko18/specops-ko/decomposing-ko Install via the SkillsCat registry.
Engine 스킬 — 태스크 분해 (decomposing)
plan.md의 카테고리·순서를 2~5분 단위 TDD 바이트사이즈 태스크로 분해한다. 모든 must AC가 최소 1 태스크에 매핑되도록 보장.
bash 테스트 파일 규약: 생성되는 test-*.sh 에 shebang (#!/usr/bin/env bash) 또는 실행권한 (exec-bit, chmod +x) 이 누락된 채로 specops-ko:implementing-ko 호출 금지. 단, 파일 첫 두 줄 내에 # library-only 주석 마커가 존재하면 library-only 전용 (sourced only) 으로 간주하여 exec-bit 검증 skip. shebang 은 library-only 포함 모든 bash 테스트 파일에 필수. 상세: templates/test-conventions-bash.md.
Python 테스트 파일 규약: 생성되는 test_*.py 에 exec-bit 및 shebang 불필요. pytest가 직접 실행. 파일명은 test_<subject>.py (underscore, hyphen 아님). 상세: templates/test-conventions-python.md.
v0.4a 신규 — DAG 섹션 의무: tasks.md 끝에 ## 의존 그래프 섹션이 YAML fenced block 으로 작성되지 않은 채로 specops-ko:implementing-ko 호출 금지. YAML 파싱 실패 (bash "${CLAUDE_PLUGIN_ROOT}"/scripts/dag/parse-dag.sh 의 dag::find_independent_batch 가 stderr WARN 발화) 시도 차단. fallback 운영은 implementing-ko 의 sequential 분기 책임 (advisor 협의 13:00 — v0.4a 는 decomposing-ko 자동 생성은 100% YAML 정합 보장).
foundation 재사용 게이트: spec.md §유형이 foundation 이 아니고 .specops/memory/foundation-manifest.md 가 존재하면, 각 task 에 다음 중 하나가 반드시 기재되어야 한다 — 누락 시 specops-ko:implementing-ko 호출 금지:
**재사용 foundation**: <foundation-manifest.md 의 모듈명>— foundation 모듈을 재사용하는 경우**미재사용 근거**: <이유>— 재사용하지 않는 경우 (예: 해당 task 가 foundation 범위 외)
판정 SoT =
scripts/_internal/check-foundation-reuse.sh(20260806 기계화). Step 10b 의emit-context.sh가 구현 전에 자동 호출하므로 누락 시 dispatch 자체가 열리지 않는다(디스크 작성 0 — 다른 검증과 동일 원자성). 종전엔 산문뿐이라 모델이 선언을 빠뜨리면 그대로 통과했다 — 공통부를 만들어 놓고 아무도 안 쓰는 상태가 조용히 지나간다. 빈 값·<모듈명>류 placeholder 는 미기재로 판정한다(형식만 갖춘 통과 차단).
최소 태스크 게이트: 각 task 에 rung 순서 질문 — 존재 필요(YAGNI)? · 기존 헬퍼·유틸 재사용? · stdlib? · 네이티브 기능? · 설치된 의존성? 과잉 task 제거 후 매핑 유지. 검증·에러·보안 절차 task 는 제거 대상 아님.
trivial / §lite 단축 분기 (plan.md 부재)
다음 중 하나이고 plan.md 가 부재하면 (clarify·plan SKIP — specifying trivial 또는 /start-lite·/maintain-lite) — 아래 경량 절차로 대체하고 정상 체크리스트를 건너뛴다:
**§유형**: trivial- 또는
**§lite**: true(§유형이유지보수여도 §lite면 본 분기)
- 입력 확인 —
.specops/<FID>/spec.md+acceptance-criteria.md존재 (plan.md·clarifications.md 부재는 정상 — SKIP 됨). 위 조건 재확인 (아니면 정상 체크리스트로 복귀). - 단일 태스크 합성 — spec.md 설계 섹션 + AC(
must, 유지보수면 AC-R-*) 를 근거로 TDD 5스텝 단일 태스크 를templates/tasks.md구조로 작성. 모든mustAC 가 이 1 태스크에 매핑.review_mode: end-loaded필수. 파일 구조는 spec.md §참조·설계 섹션에서 확정 (plan.md §파일구조 대체). - teeth 불변 준수 — TDD 5스텝·플레이스홀더 스캔·테스트 컨벤션·DAG 섹션(단일 노드 YAML)은 정상과 동일하게 필수. 축약되는 것은 clarify·plan 뿐.
- DAG — leaf 1개 YAML (
depends_on: []). Step 10 자체 검증·Step 10bemit-context.sh정상 수행. - 이후
## 다음 skill(implementing-ko) 로 정상 진행.
오판 안전망: trivial/§lite 는 사용자가 명시(슬래시·승인)한 것이나, decompose 가 spec+AC 를 단일 태스크로 못 담을 만큼 복잡하면 (must AC ≥ 4 또는 구현 파일 ≥ 2 — 테스트 파일 제외) — "규모가 lite/trivial 을 넘습니다. 정식 plan 을 거칠까요?" 확인 후 정상 경로 복귀 가능. teeth 유지가 우선.
(기준 보정 근거 — 20260716 trivial dogfood 발견 #1: 구 기준 "AC ≥ 3 또는 파일 ≥ 2" 는 TDD 최소 구성에 항상 걸리는 false-trigger 였다. 실질 복잡도 신호는 비테스트 구현 파일 2개↑ 또는 AC 4건↑.)
체크리스트
- 입력 아티팩트 확인 —
.specops/<FID>/plan.md+.specops/<FID>/acceptance-criteria.md. 없으면 planning-ko 선행 요청 후 중단. 예외: 위## trivial / §lite 단축 분기조건이면 그 경량 절차를 따르고 본 체크리스트는 건너뛴다
1a. DAG 힌트 추출 (v0.4b 신규) — spec.md §2 포함 섹션에서 의존 구조 사전 파악:(독립 — 병렬 구현 가능)표기 항목 2개 이상 → DAG leaf 후보 목록 초기화(의존: X)표기 항목 → 해당 태스크의depends_on초기값으로 설정- 표기 없으면 → 기능 설명에서 독립성 추론 (공유 파일·상태 없으면 독립으로 간주)
- 결과를 step 10 DAG 의존 그래프에 반영
- AC 커버리지 매핑 — 각
mustAC → 최소 1 태스크 할당. 커버리지 표 작성 - 파일 구조 확정 — plan.md §파일 구조의 Create/Modify/Delete 목록 고정
- TDD 5스텝 작성 —
specops-ko:tdd-ko준수:- Step 1 RED: 실패 테스트 (실제 코드)
- Step 2 검증: FAIL 확인
- Step 3 GREEN: 최소 구현 (실제 코드)
- Step 4 검증: PASS 확인
- Step 5 COMMIT:
git add+ 한국어 커밋 메시지
- 문지기 체크 (원칙 2) — 파괴적 작업 태스크는 별도 분리 +
⚠️ 사용자 승인 필요표기 + 확인 스텝 삽입 - 플레이스홀더 스캔 — TBD·TODO·"similar to N" 발견 시 구체 코드로 대체
- 테스트 컨벤션 점검 — 테스트 생성 태스크가 있으면 언어별 컨벤션 준수 확인:
- bash (
test-*.sh):templates/test-conventions-bash.md준수. exec-bit·shebang 누락 시<HARD-GATE>발동 - Python (
test_*.py):templates/test-conventions-python.md준수. exec-bit·shebang 불필요.test_<subject>.py명명 위반 시<HARD-GATE>발동
- bash (
- 타입 일관성 점검 — 후속 태스크의 시그니처가 이전 태스크와 일치
- 출력 —
templates/tasks.md구조로.specops/<FID>/tasks.md생성 - DAG 의존 그래프 작성 (v0.4a 신규, 의무) —
tasks.md끝에## 의존 그래프섹션 추가:- Mermaid block (사람용 시각화):
graph TD+ 노드·edge - YAML fenced block (기계용 단일 소스 진실): 루트에
review_mode: end-loaded(기본) +tasks:배열 — 각 task에id·depends_on·inputs·outputs·ac필드id는 숫자 전용(T1~Tn) — T1a·task-3 같은 접미사·비숫자 id 는emit-context(check-task-ids.sh)가 구현 전에 거부한다(FID 날짜 20261001 이후). 커밋 메시지의Task: T숫자와 정확히 일치해야 R-1 receipt 탈출구가 열린다
review_mode: 기본end-loaded(implementing이 A만 wave → FID 말미 B·C 각 1회). 고위험 FID만per-taskopt-in(태스크마다 A→B→C). §batch(/start-all)도 FID end-loaded — FR마다 implementing이 B/C까지 수행. 필드 부재 시 implementing은 end-loaded로 취급.- 형식 표준:
templates/tasks.md끝 placeholder +scripts/tests/dag/fixtures/tasks-md/05-diamond.md예시 참조 - 자체 검증: 작성 직후 다음 명령으로 YAML 정합 + leaf 식별 확인
source scripts/dag/parse-dag.sh yaml=$(dag::extract_yaml .specops/<FID>/tasks.md) dag::list_leaves "$yaml" # 빈 출력 시 YAML 결함 → 재작성 dag::find_independent_batch "$yaml" # 병렬 후보 출력 (참고용) - YAML 파싱 실패 또는 빈 leaf 시 → 본 스킬 재작성 의무 (HARD-GATE 차단)
- Step 10b. emit-context.sh 자동 산출 (Wave 2 U2 — 의무) — Step 10 의 DAG 자체 검증 통과 후:
bash "${CLAUDE_PLUGIN_ROOT}"/scripts/dag/emit-context.sh <FID>- tasks.md YAML 의 모든 task 에 대해
.specops/<FID>/dispatch/<task-id>-context.md5섹션 자동 산출 - fail-fast atomic — 1건이라도 검증 실패 (test_command 미기재 / ac 배열 빈 값 / AC.md 매칭 AC-id 부재 / inputs·outputs 키 부재) 시 exit 1 + stderr 출력 + 부분 잔류 0
- 성공 시 stdout
EMIT: N files - 실패 시 본 스킬 재진입 의무 (HARD GATE — tasks.md 정합성 확보 후 재호출)
- implementing-ko 는 본 산출물의
.specops/<FID>/dispatch/<task-id>-context.md를 leaf dispatch 직전에 §5 worktree 라인만 sed 갱신 (컨텍스트 수동 작성 단계 단순화)
10c. 위험 프로파일 limited-live 기록 (P1) — tasks.md 확정 후:
- tasks.md YAML 의 모든 task 에 대해
bash "${CLAUDE_PLUGIN_ROOT}"/scripts/_internal/risk-profile.sh compute <FID>.specops/<FID>/risk-profile.json에lite|standard|strict기록 (mode=live)effective=lite→reductions_allowed: ["batch-review-skip"](그 외는[])- allowlist 외 축소 금지 — TDD·verify·Phase B/C·receipt는 프로파일과 무관하게 유지.
batch-review-skip만 batch 오케스트레이터가 requesting/receiving에 적용 가능.review_mode: end-loaded는 Phase B/C 생략이 아님(시점만 FID 말미로 통합) — allowlist와 무관하게 기본 동작 - 사용자 상향만 허용:
--floor standard|strict또는SPECOPS_RISK_PROFILE_FLOOR - ★ rc=3 =
LITE-STRICT-GUARD(HARD GATE — 20260806):§liteFID 인데 프로파일이strict면 compute 가 rc=3 을 낸다. lite 는 clarify·plan 을 이미 건너뛴 상태라 그대로 진행하면 고위험 변경이 설계 검토 없이 구현된다. implementing-ko 로 진행 금지 —specops-ko:clarifying-ko→specops-ko:planning-ko를 수행해 승격한 뒤 본 스킬 재진입(정상 체크리스트 경로).plan.md가 생기면 가드는 자동 해제된다. 사용자 주권 우회는 env + 사유 병기(SPECOPS_LITE_STRICT_OVERRIDE=1 SPECOPS_LITE_STRICT_REASON='<사유>')뿐 — 모델이 파일을 써서 열 수 없다.
- Mermaid block (사람용 시각화):
- session-progress append —
bash "${CLAUDE_PLUGIN_ROOT}"/scripts/session-progress-append.sh <FID> /tasks 완료 "tasks.md (N 태스크)"호출.specops-ko:implementing-ko다음 단계 안내 - 전환 —
specops-ko:implementing-ko호출
골격 기계 생성 (선택 — 있으면 쓴다)
Step 9(출력) 에서 tasks.md 를 처음부터 타이핑하기 전에, plan.md 가 있으면 골격 생성을 먼저 시도한다:
bash "${CLAUDE_PLUGIN_ROOT}"/scripts/dag/plan-to-tasks.sh <FID> > "${TMPDIR:-/tmp}/tasks-skeleton-<FID>.md"- rc=0 —
${TMPDIR:-/tmp}/tasks-skeleton-<FID>.md가## Task N블록(**파일**블록·Step 본문·코드펜스 포함)을 담고 있다. 그 위에 생성기가 만들지 않는 4섹션만 직접 작성한다 —## AC → Task 매핑·## 파괴적 작업·## 진행 상태·## 의존 그래프(YAML). Task 본문을 다시 타이핑하지 않는다. - rc≠0 — 생성기가 파싱을 거부했다(산문형 plan · Step 0개 Task · plan 부재). stderr 사유를 1줄 고지하고 기존 전량 작성 경로로 진행한다. chain 을 막지 않는다(graceful fallback).
근거(실측 20260809):
tasks.md의 substantive 줄 중plan.md와 완전 동일한 줄이 44~63% 다(3 FID). 생성기는 그 도출 가능한 구간만 옮긴다.
생성기는
## 의존 그래프YAML 을 의도적으로 만들지 않는다.depends_on은 plan.md 에서 도출할 수 없고,[]로 채우면dag::find_independent_batch가 전 태스크를 절대 leaf 로 보아 거짓 병렬이 열린다(실측: 3-task all-leaf →T1 T2 T3무경고 반환). 이 섹션은 항상 사람·모델이 쓴다.
per-task
ac배열도 생성기가 채우지 않는다 — 이것은 안전하다. 비운 채로 두면emit-context.sh가must AC 미커버로 dispatch 를 차단하므로 관문이 강제한다. 반대로depends_on은 그런 관문이 없어서(무경고 통과) 생성기가 손대지 않는 쪽을 택했다. 두 필드의 처리가 다른 이유가 이것이다.
태스크 크기 규약
각 태스크 = 2~5분 작업 단위
- 5 스텝 (RED 작성·FAIL 검증·GREEN 구현·PASS 검증·COMMIT)
- 각 스텝에 실제 코드·명령·예상 출력 포함
- 단일 파일 또는 밀접한 2~3 파일로 한정
- 스텝 간 의존 없음 (스텝 N+1이 스텝 N 산출 없이도 읽고 이해 가능)
태스크가 5분을 초과한다면: 더 작은 태스크로 분할
FID 크기 규약 (완성율 레버)
per-태스크 크기(2~5분)와 별개로, FID 전체 태스크 수가 완성율을 좌우한다 — dogfood 실측: test2 3-태스크 FID 는 6/6 완주, test1 10-태스크 FID 는 24h+ 정체(태스크 각각은 정상이었으나 FID 전체가 7.5시간 마라톤 → 세션 경계에서 중간 이탈). 큰 FID = 긴 세션 = 이탈 노출 ↑.
권장 FID 스코프 = 태스크 ≤6.
분해 결과 태스크가 7개 이상이면 — 분해 출력 끝에 소프트 신호 1줄을 남긴다:
⚠️ FID-SIZE: <N> 태스크 (권장 ≤6) — 다중 세션에 걸칠 수 있음. 중간 이탈 시 재개는 /status (reconcile) 로.그리고 아래 중 하나를 택한다:
- 선호 (예방) — 다음 기능부터
specifying-ko단계에서 수직 슬라이스(각자 독립 shippable 단위)로 FID 를 작게 스코프한다. 큰 기능 1 FID 보다 작은 기능 여러 FID 가 완주율이 높다. - 현 FID (완화) — (6개 초과 9개 이하, 또는 아래 무인·batch·foundation 예외)
implementing-ko는 태스크별로dispatch-log를 갱신하므로(session-progress 는 끝에 1줄), 중간 이탈해도/statusreconcile 이 그 dispatch-log·커밋을 읽어 정확한 재개점을 잡는다. 즉 큰 FID 의 세션 경계 생존은 reconcile(#220)에 의존한다.
7개 이상 분할 계획행 의무 — tasks.md 끝에 줄 선두 **분할 계획**: <이번 FID 범위·후속 FID 후보> 1행. 미기재 시 emit-context.sh(check-fid-size.sh)가 거부한다.
10개 이상 차단 (대화형) — FID 분할 없이 구현 진입 불가(계획행이 있어도 check-fid-size.sh 가 거부). 수직 슬라이스로 FID 를 나눈 뒤 본 스킬 재진입. 예외 — 사용자 채널이 없는 §auto·/start-all batch(FR 단위 FID)·foundation 은 분할할 수 없어 계획행 + FID-SIZE 경고만으로 진행한다.
테스트 컨벤션 (bash)
plan.md 가 bash 테스트 파일 생성 태스크를 포함하는 경우, 다음 4 항목 규약을 준수하도록 태스크를 설계한다. 상세는 templates/test-conventions-bash.md 참조.
| 항목 | 규칙 요약 | 강도 |
|---|---|---|
| 위치 | scripts/tests/[feature]/test-*.sh · 전역은 scripts/tests/test-*.sh |
내부 예시 |
| 명명 | test-<subject>.sh — subject 는 대응 프로덕션 파일 basename (확장자 제거) |
내부 예시 |
| 실행권한 | chmod +x (755) |
Universal 강제 |
| 헤더 L1 | #!/usr/bin/env bash shebang |
Universal 강제 |
| 헤더 L2~ | set -u, PASS=0; FAIL=0, PLUGIN=$(cd ... && pwd), T<N>.<letter> TEST ID |
내부 예시 |
강도 해석:
- Universal 강제 — 위반 시
<HARD-GATE>발동.specops-ko:implementing-ko호출 차단 - 내부 예시 — specops-ko 패턴. downstream 프로젝트 기존 패턴이 있으면 그것 우선
- 단일 예외 — 실행권한 강제는 파일 L2 에
# library-only마커 선언 시 skip (library-only 파일). shebang 은 예외 없음
상세 규약·예시 코드블록·회귀 금지 체크리스트: templates/test-conventions-bash.md.
Python 테스트 파일 (test_*.py)
plan.md 가 Python 테스트 파일 생성 태스크를 포함하는 경우, 다음 규약을 준수하도록 태스크를 설계한다. 상세는 templates/test-conventions-python.md 참조.
| 항목 | 규칙 | 강도 |
|---|---|---|
| 위치 | downstream 프로젝트 기존 test 디렉토리 우선, 없으면 tests/ |
권장 |
| 명명 | test_<subject>.py — underscore |
Universal 강제 |
| exec-bit | 불필요 | Universal 규약 |
| 헤더 | shebang 불필요 | Universal 규약 |
강도 해석:
- Universal 강제 —
test_*.py명명 위반 시<HARD-GATE>발동 - Universal 규약 — exec-bit·shebang은 불필요 (bash와 다름)
- 내부 예시 — downstream 프로젝트 기존 패턴이 있으면 그것 우선
상세: templates/test-conventions-python.md.
AC 커버리지 표
## AC → Task 매핑
| AC | must/should | Task(s) |
|---|---|---|
| AC-1 | must | Task 1, Task 3 |
| AC-2 | must | Task 2 |
| AC-3 | must | Task 4 |
| AC-4 | should | Task 5 |
| AC-5 | must | Task 6 |
**must AC 커버리지**: 5/5 (100%)미매핑 must AC가 1건이라도 있으면 → chain 중단, planning-ko 재호출
태스크 포맷
templates/tasks.md 그대로 사용. 각 태스크는:
### Task N: <컴포넌트명>
**AC 매핑**: AC-1, AC-3
**파일**:
- Create: `exact/path/to/file.py`
- Modify: `exact/path/to/existing.py:123-145`
- Test: `tests/exact/path/to/test.py`
- [ ] **Step 1: RED — 실패 테스트 작성**
```python
def test_specific_behavior():
result = function(input)
assert result == expected
```
- [ ] **Step 2: FAIL 검증**
실행: `pytest tests/path/test.py::test_name -v`
예상: `FAIL — function not defined`
- [ ] **Step 3: GREEN — 최소 구현**
```python
def function(input):
return expected
```
- [ ] **Step 4: PASS 검증**
실행: `pytest tests/path/test.py::test_name -v`
예상: `PASS`
- [ ] **Step 5: COMMIT**
```bash
git add tests/path/test.py src/path/file.py
git commit -m "feat: <기능명> 추가"
```마이그레이션 태스크 분해 (DB 스키마 변경 시)
트리거: data-model.md 스키마 변경(테이블·컬럼·인덱스 신설/변경) 또는 plan.md 에 DDL 표면(CREATE/ALTER TABLE·ORM 스키마·마이그레이션 파일 생성)이 있으면 — 둘 중 하나라도 마이그레이션을 분해한다. (★ data-model.md 가 미부트스트랩인 /start-auto DB 기능에서도 plan DDL 만으로 발동 — 파괴적 마이그레이션이 reverse/test 없이 진행되는 구멍 차단.)
마이그레이션을 forward+reverse 쌍으로 분해한다 (단순 "비가역 격리"로 끝내지 말 것):
- forward(up) 태스크 — DDL 적용 (
CREATE/ALTER).data-model.md§6 도구(Prisma Migrate/Alembic/Flyway 등)·명명 규약(<timestamp>_<desc>) 준수 - reverse(down) 태스크 — 롤백 DDL. 가역 가능하면 작성, 데이터 손실 동반(DROP 류)이면 down 으로도 복구 불가임을 명시 + 아래 "파괴적 작업 격리" +
analyzing-ko §2 expand-contract적용 - 마이그레이션 테스트 태스크 — up→down→up 멱등·역가역성 + 제약(NOT NULL/CHECK/UNIQUE) 위반 경로 + 인덱스 존재 검증
- data-model.md 의 ERD·엔티티표가 forward 와 일치하도록 갱신 (Step 5.6 design-first 산출과 정합)
DAG: down·테스트는 up 에 depends_on. 파괴적 forward 는 아래 격리 규칙으로 irreversible: true.
파괴적 작업 격리
데이터 삭제·프로덕션 설정 변경·마이그레이션 등 되돌릴 수 없는 작업은:
- 별도 태스크로 분리 (다른 태스크와 합치지 말 것)
- 태스크 헤더에
⚠️ 사용자 승인 필요표기 - Step 0 삽입: "사용자에게 파괴적 변경 승인 요청. 승인 없으면 태스크 중단"
- DAG YAML 노드에
irreversible: true필드 추가 — implementing-ko(부모)가 pre-dispatch에서 이 필드를 읽어 분기 처리:§batch→ 진행 (오케스트레이터 책임)§auto→ mini HARD GATE (발생 위치에서 정지):"AUTO-HARD-GATE: <task-id> 비가역 작업 — 확인 필요 [y/n]"- 단일 모드 → 기존 Step 0 확인
### Task 7 ⚠️ 사용자 승인 필요: `.cache/` 디렉토리 정리
- [ ] **Step 0: 승인 요청**
사용자에게 다음 메시지 전달:
> "Task 7은 `.cache/` 디렉토리 전체를 삭제합니다. 진행하시겠습니까? [y/n]"
`y`가 아니면 **중단**.
> **참고 (§auto 모드)**: 서브에이전트는 사용자 채널이 없으므로 Step 0을 직접 실행할 수 없다. `irreversible: true` 필드가 있는 task는 implementing-ko 부모가 pre-dispatch 단계에서 mini HARD GATE를 발동한다. 이 Step 0은 단일 모드 전용이자 PR 게이트 가정 다이제스트의 참조 소스다.
- [ ] **Step 1: RED** ...DAG YAML irreversible 필드 예시:
tasks:
- id: T7
irreversible: true # ← 파괴적/덮어쓰기 작업 표기
depends_on: [T6]
outputs: [.cache/]
ac: [AC-8]5원칙 주입 (specops-ko 고유)
| 원칙 | 본 스킬 적용 |
|---|---|
| 1 투명성 | 각 태스크에 AC 매핑 명시. "이 태스크가 어느 요구사항을 충족하는가" |
| 2 문지기 | 파괴적 태스크는 별도 격리 + 승인 스텝. 합치지 말 것 |
| 3 깊이 | 플레이스홀더 남기지 말 것. "similar to N"도 구체화 |
| 4 주권 존중 | 파괴적 작업 승인은 사용자에게 직접 질문. 대신 결정 금지 |
| 5 한계 고백 | 불확실한 태스크에 "추정 — 구현 중 확인 필요" 태그 |
안티패턴
- 태스크 크기 초과 — 1 태스크 = 2~5분. 더 크면 분할
- TDD 5스텝 생략 — 특히 RED 검증 스텝 누락
- 플레이스홀더 포함 — TBD·TODO·구현 생략 금지
- 미매핑 must AC 방치 — 커버리지 100% 전 chain 진행 금지
- 파괴적 작업을 일반 태스크에 섞음 — 반드시 격리
- Task N 참조만으로 코드 생략 — 엔지니어가 순서와 무관하게 읽을 수 있으니 코드 반복
참조
skills/planning-ko/SKILL.md— 선행 스킬skills/tdd-ko/SKILL.md— TDD 5스텝 규약templates/tasks.md— 출력 포맷- upstream 근거: Spec-Kit
commands/tasks.md(specops-ko 경유) + bite-sized 태스크 단위 규약 - specops-ko 선례:
commands/tasks.md,templates/tasks.md skills/structured-artifacts-ko/SKILL.md— .specops// 아티팩트 경로 규약skills/karpathy-ko/SKILL.md— Think·Simplicity·Surgical·Goal 4원칙 (cross-cutting)
Handoff 기록 (다음 skill 진입 직전 필수)
implementing-ko 호출 직전 .specops/<FID>/handoffs/decomposing.md 작성 (structured-artifacts-ko 규약 4필드: Decided/Rejected/Risks/Remaining).
다음 skill
tasks.md 저장 + AC 커버리지 100% + 플레이스홀더 0 확인 + handoff.md 기록 후:
3-way 분기 확인:
if grep -qE '^\*\*§batch\*\*:' .specops/<FID>/spec.md; then
echo "BATCH"
elif grep -qE '^\*\*§auto\*\*:[[:space:]]*true' .specops/<FID>/spec.md; then
echo "AUTO"
else
echo "SINGLE"
fi- §batch (batch 분기) →
BATCH-PHASE1-DONE: <FID>출력 후 halt (implementing-ko 미호출)./start-all오케스트레이터가 queue.md를 PLAN_DONE으로 갱신하고 다음 FR을 처리한다. - §auto (auto 분기) → implementing-ko 직행. §auto 라벨이 propagate되어 각 단계에서 가역 게이트 자동 통과가 계속됨.
- 단일 분기 → 기존 동작. 호출 직전 한 줄 선언(R-3 투명성 — 20260718 test2 회고: implementing-ko 만 선언 없이 자동 호출돼 R-3 warn 12건 누적. 자동 체인이라도 전환을 1줄 명시):
구현 단계로 진행 — specops-ko:implementing-ko 를 호출합니다.
Skill: specops-ko:implementing-koimplementing-ko가 각 태스크마다 fresh 서브에이전트를 dispatch한다. 본 decomposing-ko는 batch halt 또는 implementing-ko 이외의 다음 스킬을 호출하지 않는다.