Skip to content
Back to skills

Prd Generator

ASecurity

아이디어나 docs/IDEA.md를 받아 "무엇을 만들 것인가"를 정의하는 PRD(docs/PRD.md)를 작성한다. 요구사항마다 고유 ID와 검증 가능한 수용 기준을 붙여, 이후 아키텍처·플랜·태스크·품질 게이트가 그대로 참조할 수 있게 만든다. 사용자가 "PRD 써줘", "요구사항 정리해줘", "기획서 만들어줘", "제품 스펙 문서", "유저 스토리 정리"라고 하거나, 아이디어 브레인스토밍을 마치고 다음 단계로 넘어갈 때 반드시 이 스킬을 사용한다. 무엇을 만들지는 정해졌는데 기능 목록과 수용 기준이 문서로 없는 상태에서 개발이나 설계를 시작하려 할 때도 이 스킬로 먼저 요구사항을 고정한다.

  • 3 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 23, 2026
ai-agentsapifullstack

Works with

  • claude code
  • api

Security analysis

A100/100

Pro scans all 3 files and shows the line behind each finding

Scanned September 23, 2026

npx -y skills add GangJaeYu/harness_loop_full_korean --skill prd-generator --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Prd Generator?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Prd Generator
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/gangjaeyu-prd-generator/badge)](https://www.skillsdirectory.com/skills/gangjaeyu-prd-generator)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: prd-generator
description: 아이디어나 docs/IDEA.md를 받아 "무엇을 만들 것인가"를 정의하는 PRD(docs/PRD.md)를 작성한다. 요구사항마다 고유 ID와 검증 가능한 수용 기준을 붙여, 이후 아키텍처·플랜·태스크·품질 게이트가 그대로 참조할 수 있게 만든다. 사용자가 "PRD 써줘", "요구사항 정리해줘", "기획서 만들어줘", "제품 스펙 문서", "유저 스토리 정리"라고 하거나, 아이디어 브레인스토밍을 마치고 다음 단계로 넘어갈 때 반드시 이 스킬을 사용한다. 무엇을 만들지는 정해졌는데 기능 목록과 수용 기준이 문서로 없는 상태에서 개발이나 설계를 시작하려 할 때도 이 스킬로 먼저 요구사항을 고정한다.
---

# PRD 작성 (Layer 1)

## 이 스킬의 목적

PRD는 **"무엇을 만들 것인가"**에 대한 합의문이다. 여기서 정의한 요구사항 하나하나가 뒤에서 이렇게 흘러간다.

```
PRD의 요구사항 FR-007
   → 아키텍처에서 어느 컴포넌트가 책임지는지 결정  (Layer 2)
   → 태스크로 쪼개져 구현                          (Layer 3~5)
   → 수용 기준이 그대로 검증 항목이 됨              (Layer 4 품질 게이트)
```

그래서 이 문서의 품질은 "읽기 좋은가"가 아니라 **"나중에 기계적으로 추적하고 검증할 수 있는가"**로 판정된다.
"사용자가 편리하게 로그인할 수 있다" 같은 문장은 읽기엔 좋지만, 태스크로 쪼갤 수도 없고 통과 여부를 판정할 수도 없다.
그런 문장이 PRD에 남으면 Layer 4의 task validation 단계에서 검증자가 무엇을 확인해야 할지 몰라 그냥 통과시키게 된다.

### 여기서 하는 일과 하지 않는 일

| 하지 않는 것 | 어디서 하는가 |
|---|---|
| 기술 스택, 프레임워크, DB, 배포 방식 | TRD (`trd-generator`) |
| 테이블 설계, API 엔드포인트, 컴포넌트 구조 | Layer 2 아키텍처 |
| 개발 순서, 일정, 태스크 분할 | Layer 3 마스터 플랜 |
| 화면 픽셀 디자인 | 별도 디자인 작업 |

PRD와 TRD를 나누는 이유는 형식이 아니다. **요구사항은 기술 선택보다 오래 살기 때문**이다.
"결제 기능이 필요하다"는 3년 뒤에도 유효하지만 "Stripe를 쓴다"는 6개월 만에 바뀔 수 있다.
둘을 한 문서에 섞으면 기술을 바꿀 때 요구사항까지 함께 흔들리고, 무엇이 합의된 것이고 무엇이 구현 선택이었는지 아무도 구별하지 못하게 된다.

다만 요구사항이 특정 기술을 **강제하는 제약**이라면(예: "관공서 납품이라 국내 리전에 저장해야 함) 그건 비기능 요구사항으로 PRD에 적는다.
선택이 아니라 제약이기 때문이다. 판단 기준은 이것이다 — **"이걸 다른 걸로 바꿔도 사용자에게 약속한 것이 지켜지는가?"** 지켜지면 기술 선택(TRD), 안 지켜지면 제약(PRD).

---

## 1단계. 입력 확보

먼저 `docs/IDEA.md` 가 있는지 확인한다. 있으면 그것이 주 입력이다.

**IDEA.md 가 있는 경우** — 전부 읽고, 특히 **'미결 사항'과 '(가정)' 표기를 최우선으로 처리한다.**
아이디어 단계에서 미뤄 둔 결정이 PRD에 그대로 넘어오면, 요구사항이 가정 위에 세워진다. 그 가정이 틀어지면 요구사항 절반이 무효가 된다.

미결 항목마다 아래 넷 중 하나로 처리하고, 어느 쪽인지 문서에 남긴다.

1. **지금 결정한다** — 사용자에게 선택지와 함께 묻는다. 요구사항의 존재 여부를 가르는 것이면 반드시 여기에 해당한다.
2. **가정으로 확정하고 표시한다** — 세부 사항이면 합리적 값으로 정하고 `(가정)` 표기를 유지한다.
3. **범위 밖으로 밀어낸다** — 이번 버전에서 안 다루기로 하고 '범위 밖'에 적는다.
4. **미결로 남기되, 흘러갈 경로를 만든다** — 아래를 따른다.

미결을 미결인 채로 요구사항 본문에 섞어 넣는 것만은 하지 않는다. 뒤 레이어는 PRD 본문을 확정된 합의로 읽는다.

### 즉답으로 풀리지 않는 미결 다루기

미결을 전부 "사용자에게 물어보면 되는 것"으로 취급하면 안 된다. 실제로는 종류가 다르고, 종류마다 푸는 방법이 다르다.
이걸 구분하지 않으면 모델은 둘 중 하나를 하게 된다 — 그럴듯한 값으로 가정해 확정해 버리거나, 표에 적어 두고 잊거나.
둘 다 나중에 요구사항 여러 개를 무효로 만든다.

**이 분류는 잠정이다.** 모델이 제안하는 것이고, 확정하는 사람은 사용자다.
같은 항목이 사용자에게는 다르게 보일 수 있다 — 모델이 "물어보면 되는 것"으로 본 항목을 사용자는
"인터뷰 끝나기 전엔 정하면 안 되는 것"으로 알 수 있다. 그쪽이 맞다. 사용자가 맥락을 더 안다.
그래서 문서에는 종류를 `질문(잠정)` 처럼 적고, 6단계 보고에서 **"이 분류가 틀렸으면 알려달라"**고 명시적으로 요청한다.

| 종류 | 어떤 미결인가 | 어떻게 푸는가 |
|---|---|---|
| **질문** | 사용자의 선호·방침. 물으면 바로 답이 나온다 | 선택지와 함께 묻는다 |
| **확인** | 사용자도 모른다. 외부 사실 확인이 필요하다 (사내 정책, 법 규정, 외부 서비스 지원 여부) | 누가 무엇을 확인할지 적는다. 확인 자체가 하나의 할 일이다 |
| **실험** | 해봐야 안다 (기술적 실현 가능성, 성능 한계) | 스파이크로 전환한다. Layer 3에서 검증용 태스크가 된다 |
| **유예** | 지금 정하면 오히려 틀린다 (사용자 인터뷰 전, 초기 데이터 전) | 무엇을 보면 정할 수 있는지와 시점을 적는다 |

### 미결은 만들기 전에 한 번 걸러낸다

미결은 공짜가 아니다. 하나 만들 때마다 사용자가 답해야 할 항목이 늘고, 뒤 레이어에는 blocked 태스크가 생기고,
STATE.md에 추적할 것이 붙는다. **미결 목록이 길수록 좋은 문서가 아니라, 결정을 미룬 문서다.**

그래서 미결로 올리기 전에 세 가지를 자문한다. 하나라도 "아니오"면 미결로 만들지 말고 그 자리에서 처리한다.

1. **이 답에 따라 요구사항이 생기거나 사라지거나 바뀌는가?**
   아니라면 미결이 아니다. 성공 지표의 숫자, 문서 문구, 화면 문구 같은 것은 기본값으로 정하고 넘어간다.
   나중에 바꿔도 요구사항이 흔들리지 않는다.
2. **틀렸을 때 되돌리는 비용이 실제로 큰가?**
   작다면 가정으로 확정한다. `(가정)` 표기와 리스크 표 한 줄이면 충분하다.
3. **사용자만 답할 수 있는가?**
   문서 안에서 이미 답이 나오거나(IDEA.md에 있는데 못 찾은 경우), 업계 표준으로 정해도 되는 것이면 묻지 않는다.

**미결이 다른 미결에 흡수되는지도 본다.** "클라이언트가 확인 버튼을 누를 수 있는가"는 "전자서명을 넣는가"의 답에 따라
자동으로 정해진다. 이런 것은 독립 미결로 세우지 말고 상위 미결의 선택지 설명에 녹인다.
미결 12개 중 절반이 사실 3개의 파생이라면, 사용자는 같은 결정을 네 번 하게 된다.

### 미결이 남은 채로 진행할 때의 규칙

미결이 있다고 PRD 작성을 멈추지 않는다. 대신 두 가지를 지킨다.

**첫째, 미결이 P0 요구사항을 막으면 그 요구사항은 가정으로 덮지 않는다.**
P0는 "없으면 출시 불가"인 것들이다. 그 근거가 흔들리는 상태로 확정하면, 나중에 뒤집혔을 때 제품의 뼈대가 함께 무너진다.
이런 미결은 미결 표에서 **차단(blocking)** 으로 표시하고, 사용자에게 보고할 때 맨 위에 올린다.
P1 이하라면 기본값으로 진행해도 된다. 되돌리는 비용이 감당 가능한 범위이기 때문이다.

**둘째, 모든 미결에 '미해소 시 기본값'과 '되돌리기 비용'을 적는다.**
기본값이 있으면 답을 못 받아도 프로젝트가 멈추지 않는다. 되돌리기 비용이 있으면 무엇을 걸고 진행하는지가 분명해진다.

되돌리기 비용은 "이 기본값이 나중에 틀렸다고 판명되면 무엇을 다시 해야 하는가"이다. 예를 들면 이렇게 쓴다.

> **미결**: 전자서명을 이번 버전에서 빼도 되는가
> **기본값**: 뺀다 (PDF 생성 + 링크 공유까지)
> **되돌리기 비용**: FR-010~013 재작성, 서명 관련 FR 3~5개 추가. 외부 연동까지 필요하면 인보이스 기능 전체를 다음 버전으로 이동

이걸 적는 이유가 셋 있다.
사용자가 답의 무게를 알게 되고("빼도 되죠?"에 쉽게 동의하지 않게 된다),
어떤 미결을 먼저 풀지 정할 수 있으며(비싼 것부터),
실제로 되돌릴 상황이 왔을 때 그때의 판단 근거가 남아 있다.

### 미결은 소멸하지 않고 뒤 레이어로 간다

PRD의 미결은 여기서 끝나는 항목이 아니라 **다음 레이어가 이어받는 객체**다. 흐름은 이렇다.

```
PRD의 미결 OQ-003 (외부 API 전송 가능 여부, 차단)
   → 차단하는 요구사항 표시:  FR-005, FR-009
   → Layer 3에서 그 FR의 태스크는 status: blocked 로 생성된다
   → '확인' 액션 자체가 별도 태스크가 된다
   → 해소되면 blocked 해제, STATE.md·LOG.md에 기록
```

그래서 미결에는 **OQ-001** 형태의 ID를 붙이고, 차단하는 FR 번호를 반드시 적는다.
ID가 없으면 뒤 레이어에서 "무엇 때문에 막힌 태스크인지" 가리킬 방법이 없다.

**IDEA.md 가 없는 경우** — Layer 0을 건너뛴 것이므로 사용자 설명이 유일한 입력이다.
이때는 PRD를 쓰기 전에 최소한 이것들을 묻는다. 답이 없으면 요구사항을 쓸 수 없는 것들이다.

- 이 제품의 사용자는 누구이고, 지금은 그 일을 어떻게 처리하고 있는가
- 첫 버전에 반드시 있어야 하는 기능과 없어도 되는 기능
- 무엇이 되면 성공이라고 말할 수 있는가
- 반드시 지켜야 하는 제약(법·보안·성능·기간)이 있는가

질문은 한 번에 1~2개씩, 선택지를 붙여서 한다. 아이디어가 많이 모호하면 PRD를 억지로 쓰지 말고
`idea-brainstorm` 스킬로 먼저 정리하자고 제안한다.

**기존 코드베이스가 있는 경우** — 기존 기능을 추측으로 적지 말고 실제로 확인한다. README, 라우트 파일, 화면 목록을 훑어
"이미 있는 것 / 새로 만드는 것 / 바꾸는 것"을 구분한다. 이 구분이 없으면 뒤에서 이미 있는 기능을 다시 만드는 태스크가 생긴다.

## 2단계. 사용자와 유저 스토리 정리

요구사항을 바로 나열하지 말고 **사용자 → 스토리 → 요구사항** 순서로 간다.
기능부터 쓰면 "있으면 좋을 것 같은" 기능이 섞여 들어오는데, 스토리에서 출발하면 그 기능이 누구의 무엇을 위한 것인지 자동으로 검사된다.

- **사용자 유형**을 2~4개로 정리한다. 각 유형은 목표와 기술 숙련도가 실제로 다른 사람이어야 한다.
  "관리자"와 "슈퍼 관리자"처럼 권한만 다르면 하나로 합친다.
- **유저 스토리**는 `(사용자)로서, (무엇)을 하고 싶다. 왜냐하면 (이유)이기 때문이다` 형태로 쓴다.
  '왜냐하면'을 빼먹지 않는 것이 중요하다. 구현 단계에서 판단이 갈릴 때 개발자가 되돌아보는 것이 바로 그 이유다.
- 각 스토리에 **US-001** 형태의 ID를 붙인다.

## 3단계. 기능 요구사항

### 작성 규칙

각 요구사항은 아래 형태를 갖춘다.

```markdown
#### FR-003. 견적서 PDF 내보내기
- **관련 스토리**: US-002
- **우선순위**: P0
- **차단 미결**: 없음 (있으면 OQ-00x 를 적는다. 그 미결이 풀리기 전에는 이 요구사항을 구현하지 않는다)
- **설명**: 사용자는 작성한 견적서를 PDF 파일로 내려받을 수 있다.
- **수용 기준**:
  - [ ] 견적서 상세 화면에서 '내보내기'를 누르면 PDF 파일이 다운로드된다
  - [ ] PDF에는 화면에 표시된 항목·금액·합계가 동일하게 포함된다
  - [ ] 항목이 30개를 넘으면 페이지가 나뉘고 각 페이지에 합계가 표시되지 않는다
  - [ ] 견적서가 없거나 권한이 없으면 404를 반환하고 파일은 생성되지 않는다
```

### 수용 기준이 이 문서의 핵심이다

수용 기준은 나중에 **다른 세션의 검증자가 이 제품을 처음 보고도 통과/실패를 판정할 수 있어야** 한다(Layer 4의 task validation은
구현한 세션과 분리된 세션에서 돌아간다. 구현자의 머릿속 맥락이 검증에 새는 것을 막기 위해서다).
그 검증자에게는 이 문장이 전부다. 그러니 아래를 지킨다.

- **관찰 가능한 것만 쓴다.** 화면에 무엇이 보이는지, 무엇이 저장되는지, 어떤 응답이 오는지. "빠르게", "직관적으로", "안정적으로"는 판정할 수 없다.
- **실패 경로를 반드시 하나 이상 넣는다.** 성공 경로만 적힌 요구사항은 절반만 검증된다. 빈 입력, 권한 없음, 없는 리소스, 중복 요청 중 이 기능에서 실제로 일어날 것을 고른다.
- **숫자가 필요한 곳에는 숫자를 쓴다.** "많은 항목" 대신 "30개 초과", "곧" 대신 "3초 이내".
- 하나의 수용 기준은 하나만 검사한다. "저장되고 이메일도 발송된다"는 두 줄로 나눈다.

### 우선순위

P0(없으면 출시 불가) / P1(첫 버전에 포함 목표) / P2(다음 버전) 세 단계로만 나눈다.
단계를 더 늘리면 판단이 흐려지고, 실제로는 "지금 만드나 안 만드나"의 이진 결정이기 때문이다.
**P0가 전체의 절반을 넘으면 범위가 과하다는 신호다.** 사용자에게 그 사실을 알리고 함께 줄인다.

## 4단계. 비기능 요구사항

기능이 아니라 **품질과 제약**이다. 이것들도 검증 대상이므로 똑같이 ID와 측정 가능한 기준을 붙인다.
"보안을 준수한다" 같은 문장은 아무것도 검증하지 못한다.

아래 항목들을 훑어보고 이 제품에 **실제로 해당하는 것만** 적는다. 해당 없는 항목을 형식적으로 채우면
뒤 레이어가 그것을 만족시키려고 불필요한 작업을 만든다.

| 범주 | 무엇을 정하나 | 나쁜 예 → 좋은 예 |
|---|---|---|
| 성능 | 응답 시간, 동시 사용자, 데이터 규모 | "빠르게" → "목록 조회 P95 500ms 이내, 데이터 1만 건 기준" |
| 보안·권한 | 인증 방식의 요구, 역할별 접근 범위, 민감정보 | "안전하게" → "타인의 견적서는 URL을 알아도 열람 불가(403)" |
| 데이터 | 보관 기간, 삭제·백업 정책, 개인정보 범위 | "잘 보관" → "계약 종료 후 3년 보관, 이후 자동 파기" |
| 가용성 | 목표 가동률, 장애 시 허용 범위 | — |
| 접근성·호환 | 지원 브라우저·기기, 다국어 | "모바일 지원" → "iOS Safari 최신 2개 버전에서 전 기능 동작" |
| 법·규정 | 준수 대상 규정, 지역 제약 | "법 준수" → "개인정보 국외 이전 불가, 국내 리전 저장" |

## 5단계. `docs/PRD.md` 작성

경로는 프로젝트 루트 기준 `docs/PRD.md`. 아래 구조를 그대로 사용한다.

```markdown
# PRD: (제품 이름)

- **버전**: 0.1 (초안)
- **작성일**: YYYY-MM-DD
- **입력 문서**: docs/IDEA.md (없으면 "사용자 설명")
- **상태**: 사람 검토 대기

## 1. 개요
### 1.1 한 줄 정의
### 1.2 배경과 문제
(왜 지금 이걸 만드는가. 현재의 대안과 그 한계.)
### 1.3 목표와 비목표
- **목표**: (이 제품이 달성하려는 것)
- **비목표**: (일부러 하지 않는 것. 여기 적어 두면 나중에 범위가 새는 것을 막는다.)

## 2. 사용자
| 유형 | 설명 | 주요 목표 | 기술 숙련도 |
|---|---|---|---|

## 3. 유저 스토리
| ID | 사용자 | 스토리 | 우선순위 |
|---|---|---|---|
| US-001 | | ...로서 ...하고 싶다. 왜냐하면 ... | P0 |

## 4. 기능 요구사항
(FR-001부터. 3단계의 형식을 따른다. 관련 있는 것끼리 묶어 소제목을 둔다.)

## 5. 비기능 요구사항
(NFR-001부터. 범주 / 요구사항 / 측정 기준 형태로.)

## 6. 범위 밖 (Out of Scope)
| 항목 | 이유 | 언제 다시 볼 것인가 |
|---|---|---|

## 7. 성공 지표
| 지표 | 목표값 | 측정 방법 |
|---|---|---|

## 8. 가정과 미결 사항
### 확정된 가정
| 가정 | 근거 | 틀리면 영향받는 요구사항 |
|---|---|---|
### 미결 사항
| ID | 결정할 것 | 종류 | 차단하는 요구사항 | 해소 방법 | 미해소 시 기본값 | 되돌리기 비용 |
|---|---|---|---|---|---|---|
| OQ-001 | | 질문(잠정)/확인/실험/유예 | FR-00x (차단이면 굵게) | | | |

## 9. 요구사항 추적표
| 요구사항 | 관련 스토리 | 우선순위 | 차단 미결 | 담당 태스크 | 상태 |
|---|---|---|---|---|---|
| FR-001 | US-001 | P0 | — | (Layer 3에서 채움) | 정의됨 |
| FR-006 | US-003 | P0 | **OQ-007** | (Layer 3에서 채움) | 정의됨 (차단) |
```

**9번 추적표를 생략하지 않는다.** 뒤 레이어에서 태스크를 만들 때 "이 요구사항이 어느 태스크로 갔는가",
반대로 "이 태스크가 어느 요구사항을 위한 것인가"를 확인하는 곳이 여기다. 이 표가 없으면 구현 중 조용히 빠지는 요구사항이 생긴다.

### 9절 `차단 미결` 열과 `상태` 열은 짝이다

`상태` 열의 값은 이 단계에서 둘뿐이다 — `정의됨` / `정의됨 (차단)`.
**`차단 미결` 열에 적힌 OQ가 8절에서 차단(굵게)이면 `상태` 는 반드시 `정의됨 (차단)` 이고, 아니면 `정의됨` 이다.**
두 열을 따로 고치지 않는다.

이렇게 못 박는 이유가 있다. Layer 3은 어느 태스크를 `blocked` 로 만들지를 **`상태` 열의 `(차단)` 을 1순위 신호**로 판정한다.
`차단 미결` 열에는 OQ가 있는데 `상태` 가 그냥 `정의됨` 이면 Layer 3이 스스로 판정하게 되고, 같은 PRD로 두 번 만든 플랜이 서로 다르게 막힌다.
8절 표의 "차단하는 요구사항" 열에 적힌 FR이 전부 차단인 것은 아니다 — **차단 여부는 OQ 단위(P0를 막는가)로 정하고, 9절에는 그 결과를 옮겨 적는다.**

### `CLAUDE.md` · `AGENTS.md` 갱신

`docs/PRD.md` 를 쓴 뒤 프로젝트 루트의 `CLAUDE.md` 와 `AGENTS.md` 를 **같은 내용으로** 갱신한다. 사용자가 직접 연 세션과 루프의 자식 세션은 이 스킬을 읽지 않고 시작하는데,
그때 자동으로 읽히는 파일은 Claude Code 는 `CLAUDE.md`, Codex 는 `AGENTS.md` 뿐이다. 그래서 **지금 어느 호스트에서 돌든 둘 다 쓴다** —
한쪽만 쓰면 다른 호스트의 세션이 규칙을 모른 채 시작한다. 내용은 **어느 세션에서든 반드시 지킬 것**만 두고 세부 규칙은 문서를 가리킨다 —
규칙을 옮겨 적으면 두 곳이 곧 어긋나고, 어긋나면 세션은 짧은 쪽을 믿는다.

- 둘 다 없으면 아래 뼈대로 만든다. 있으면 **`## 제품 (docs/PRD.md)` 절과 `현재 단계` 줄만** 고친다. 다른 절과 사용자가 손으로 적은 내용은 건드리지 않는다
- 두 파일이 서로 다르면 지금 호스트의 파일을 기준으로 다른 쪽을 맞춘다. 손으로 적은 줄은 양쪽에 남긴다
- 파일은 있는데 `## 문서 지도`·`## 공통 규칙` 이 없으면(예: `/init` 이 만든 파일) 기존 내용 **아래에** 뼈대 두 절을 더한다. 기존 내용은 손대지 않는다
- 절이 없으면 `공통 규칙` 뒤에 제품·기술·구조·플랜·하네스·루프 순서의 자리에 더한다
- 전체 **100줄 안팎, 200줄을 넘기지 않는다.** 넘치면 규칙을 문서 쪽으로 돌려보내고 가리키는 줄만 남긴다

```markdown
# <프로젝트 이름>

> harness-loop-fullstack 스킬이 만들고 갱신하는 파일이다. 각 절은 그 레이어의 스킬만 고친다.
> `CLAUDE.md` 와 `AGENTS.md` 는 같은 내용이다. 한쪽을 손으로 고치면 다른 쪽도 같이 고친다.
> 세부 규칙은 각 문서에 있다 — 여기에는 어느 세션에서든 반드시 지킬 것만 둔다. 200줄을 넘기지 않는다.

## 문서 지도
- `docs/IDEA.md` → `docs/PRD.md` → `docs/TRD.md` → `docs/ARCHITECTURE/` → `plan_setup/` → `harness_setup/` → `loop_setup/LOOP.md`
- 뒤 문서는 앞 문서를 근거로 한다. 충돌하면 앞 문서가 이기고, 앞 문서를 고치려면 그 레이어의 스킬을 다시 부른다
- 현재 단계: <마지막으로 끝낸 스킬> → 다음: <다음 스킬>

## 공통 규칙
- 앞 레이어의 **파일**만 입력이다. 대화 기억이나 추측으로 요구사항·기술 결정을 만들지 않는다
- ID(`FR-`·`NFR-`·`US-`·`OQ-`·`TD-`·`phase-NN-task-MM`)는 참조만 한다. 새 ID 는 그 레이어의 스킬만 만든다
- 사용자가 말하지 않은 값은 `(가정)` 으로 표시한다. 모호하면 추측하지 말고 묻는다
- 요청된 범위를 조용히 넓히거나 줄이지 않는다. 범위 판단은 보고한다
```

`## 제품 (docs/PRD.md)` 절에는 이것만 적는다.

```markdown
## 제품 (docs/PRD.md)
- <한 줄 정의>
- P0 <n>개 · 차단 OQ: <ID 목록, 없으면 "없음">
- 범위 밖: <6절에서 핵심 2~3개>
- PRD 에 없는 기능을 만들지 않는다. 더하려면 PRD 와 9절 추적표를 먼저 고친다
```

## 6단계. 자체 점검 후 인계

파일을 쓴 뒤 처음부터 다시 읽으면서 아래를 확인한다. 방향이 헷갈리지 않도록 '통과 조건'을 그대로 적었다.

| 확인할 것 | 통과 조건 | 걸렸을 때 |
|---|---|---|
| 수용 기준 | 모든 FR에 있고, 전부 관찰 가능한 서술 | 고친다 |
| 실패 경로 | 실패 경로가 하나도 없는 FR이 0개 | 고친다. 단 계산 규칙처럼 실패 경로가 본래 없는 FR이면 그 사실을 보고한다 |
| 기술 선택 | 프레임워크·DB·라이브러리 이름이 본문에 0건 | 지우고 TRD로 넘긴다 |
| 스토리 연결 | 어떤 스토리에도 안 걸린 FR이 0개 | 정말 필요한 기능인지 다시 보고, 애매하면 보고한다 |
| P0 비중 | 전체의 절반 이하 | 임의로 줄이지 말고 후보와 함께 사용자에게 보고한다 |
| 미결 처리 | IDEA.md의 미결이 전부 결정/가정/범위 밖/미결(OQ) 중 하나로 매핑됨 | 빠진 항목을 채운다 |
| 미결 형식 | 모든 미결에 ID·종류·기본값·되돌리기 비용이 있음 | 채운다 |
| 미결 개수 | 세 가지 필터를 통과한 것만 남음. 서로의 파생이 아님 | 가정으로 내리거나 상위 미결에 흡수한다 |
| 9절 두 열 | `차단 미결` 열의 OQ가 차단이면 `상태` 가 `정의됨 (차단)`, 아니면 `정의됨`. 어긋난 행 0개 | 맞춘다. Layer 3이 `상태` 열을 1순위 신호로 읽는다 |
| `CLAUDE.md` · `AGENTS.md` | 두 파일이 같고 `## 제품` 절이 갱신됐고 각 200줄 이하 | 자기 절만 고친다. 넘치면 규칙을 문서로 돌려보내고 가리키는 줄만 남긴다 |

**임의로 고쳐도 되는 것과 보고해야 하는 것이 다르다.** 형식 문제(수용 기준 누락, 기술명 혼입)는 고치면 된다.
범위 판단(P0 비중, 필요 없어 보이는 FR)은 사용자의 결정이므로 고치지 말고 보고한다.
여기서 조용히 범위를 줄이면, 사용자는 자기가 요청한 것이 빠진 줄 모른 채 다음 레이어로 넘어간다.

그다음 사용자에게 보고한다.

1. `docs/PRD.md` 를 만들었다는 사실과 요구사항 개수(FR n개, NFR n개, P0 n개)
2. **미결 사항 목록 — 차단(P0를 막는 것)을 맨 위에 둔다.** 이게 보고의 핵심이다. PRD는 사람이 검토하고 함께 고치라고 만드는 문서다.
   각 미결에 "답을 못 주시면 이 기본값으로 갑니다"를 함께 적어, 사용자가 지금 답하지 못해도 진행이 멈추지 않게 한다.
   그리고 **미결의 종류 분류가 잠정이라는 것과, 틀렸으면 바꿔 달라는 것을 함께 알린다.** 그다음 7단계로 하나씩 처리한다.
3. 자체 점검에서 걸렸지만 임의로 고치지 않은 것
4. 다음 단계 안내: "검토하시고, 괜찮으면 TRD로 넘어갈까요? (`trd-generator`)"

사용자 검토 전에 TRD로 넘어가지 않는다. PRD가 틀린 채로 넘어가면 그 뒤 모든 문서가 같이 틀린다.

## 7단계. 미결 해소 세션

PRD를 넘기고 끝이 아니다. 사용자가 검토를 시작하면 **미결을 하나씩 함께 처리해서, 여기서 최대한 태운다.**
한 번에 다 던지면 사용자는 앞의 두세 개만 답하고 나머지는 "일단 그렇게 하죠"가 된다. 그러면 미결을 만든 의미가 없다.

### 왜 여기서 태워야 하는가

미결 하나를 다음 레이어로 넘기면 비용이 하나로 끝나지 않는다. 레이어를 지날 때마다 불어난다.

```
PRD에 미결 1건 (전자서명 필요 여부)
  → TRD:      서명 저장·검증 방식을 정할 수 없어 인증·저장 설계에 분기가 생긴다
  → 아키텍처:  두 갈래를 다 감당하는 설계를 하거나, 한쪽으로 정하고 나중에 갈아엎는다
  → 플랜:      영향받는 FR 4개가 태스크 8~10개로 쪼개지는데 전부 blocked 로 시작한다
  → 루프:      blocked 태스크는 실행 순서에서 계속 밀리고, 의존하는 후속 태스크까지 막힌다
```

**PRD에서 5분이면 끝날 대화가, 플랜 단계에서는 태스크 10개의 재작성이 된다.**
지금 사용자 앞에 문서와 맥락이 다 있고 사용자의 주의도 여기 있다. 이만큼 싸게 결정할 수 있는 시점은 뒤에 없다.

그래서 목표는 "미결을 목록으로 잘 정리하는 것"이 아니라 **"이 세션이 끝났을 때 미결 개수를 최대한 줄이는 것"**이다.
차단 미결은 0개가 되어야 하고, 나머지도 '확인/실험 때문에 물리적으로 지금 못 푸는 것'만 남기는 것을 목표로 한다.
사용자가 피곤해하면 남겨도 되지만, 남길 때는 그것이 뒤에서 무엇을 막는지 알려주고 남긴다.

### 순서

**차단(P0를 막는 것) 먼저, 그다음 되돌리기 비용이 큰 순서**로 제시한다.
싼 것부터 처리하면 사용자의 집중력이 성공 지표 숫자 같은 데 소모되고, 정작 제품을 뒤집을 결정에 남는 게 없다.

### 한 항목을 제시하는 방법

```
OQ-001 (차단 · 질문으로 분류) — 전자서명을 이번 버전에서 빼도 될까요?

  왜 이걸 질문으로 봤는지: 사용자의 방침 결정이고, 외부 확인 없이 답할 수 있다고 판단했습니다.
  막고 있는 것: FR-006, FR-008, FR-009, FR-011 (전부 P0)
  답이 없으면: 뺀다 (PDF + 링크 공유까지)
  나중에 되돌리면: 인보이스 기능 전체가 다음 버전으로 밀립니다

  A) 뺀다   B) 동의 기록만 남긴다   C) 법적 효력 있는 서명이 필수다
  ─ 종류가 틀렸다면 그것부터 알려주세요. "이건 알아봐야 안다"거나 "지금 정하면 안 된다"면 답 대신 그렇게 말씀해 주시면 됩니다.
```

마지막 줄이 중요하다. 이 문장이 없으면 사용자는 **주어진 선택지 안에서만 답해야 한다고 느낀다.**
모르는 것도 찍게 만드는 건 결국 이 지점이다. 선택지를 거부할 길을 열어 두는 것이 분류 오류에 대한 진짜 안전망이다.

### 사용자가 종류를 바꾸면

종류가 바뀌면 그 항목의 나머지도 전부 다시 계산해야 한다. 종류는 라벨이 아니라 처리 방식을 결정하는 값이기 때문이다.

| 사용자가 이렇게 말하면 | 바뀌는 것 |
|---|---|
| "그건 알아봐야 알아" → **확인** | 선택지를 치운다. 누가 무엇을 언제까지 확인할지 적는다. 기본값은 유지하되 "확인 전 잠정"으로 표시 |
| "해봐야 알지" → **실험** | 스파이크로 전환. 무엇을 만들어 무엇을 보면 판정되는지 적는다. Layer 3에서 검증 태스크가 된다 |
| "지금 정하면 틀려" → **유예** | 재검토 시점과 그때 볼 근거를 적는다. 그때까지 영향받는 FR을 P1 이하로 내릴지 사용자에게 확인한다 |
| "그건 안 할래" → **범위 밖** | 미결에서 빼고 6절로 옮긴다. 관련 FR을 삭제하거나 P2로 내린다 |
| "그게 왜 문제가 되지?" → **불필요** | 미결을 지운다. 물어볼 필요가 없었던 것이다 |

마지막 줄을 가볍게 보지 않는다. **미결이 애초에 필요 없었던 경우가 실제로 자주 있다.**
사용자가 이미 답한 것을 못 알아들었거나, 다른 결정에 자동으로 딸려 오는 것이었거나,
업계에서 답이 정해져 있는 것을 모델이 몰랐던 경우다. 이럴 때는 억지로 결정으로 만들지 말고 그냥 지운다.
지운 미결은 관련 FR의 `차단 미결`도 함께 '없음'으로 되돌린다.

바뀐 내용은 **그 자리에서 PRD에 반영한다.** 대화에서만 합의하고 문서를 안 고치면, 다음 레이어는 옛날 문서를 읽는다.

### 처리 결과별 문서 갱신

- **결정됨** → 미결 표에서 제거하고 '확정된 가정'으로 옮기거나 FR에 직접 반영. 관련 FR의 `차단 미결`을 '없음'으로,
  9절의 `차단 미결` 열을 `—` 로, `상태` 를 `정의됨` 으로 함께 되돌린다
- **확인/실험으로 재분류** → 미결 표에 남기되 해소 방법과 담당·시점을 채운다. 관련 FR의 `차단 미결`은 그대로 둔다
- **유예** → 기본값으로 진행하고, 재검토 시점을 적는다

### 세션을 마칠 때

남은 미결을 한 번 더 훑고 사용자에게 이렇게 정리해 준다.

- 처리한 것: 결정 n건, 재분류 n건, 불필요로 삭제 n건, 범위 밖으로 이동 n건
- 남은 것: 각각이 **뒤에서 무엇을 막는지**와 함께. ("OQ-007이 남으면 계약서 템플릿 태스크 3개가 blocked로 시작합니다.")
- 남은 미결의 해소 담당과 시점

이 요약을 PRD 8절에도 반영해서, 다음 레이어가 문서만 보고도 무엇이 열려 있는지 알게 한다.

### 언제 멈추는가

미결이 다 풀리지 않아도 TRD로 넘어갈 수 있다. **단 하나의 조건은 차단 미결이 남아 있지 않은 것**이다.
차단 미결은 P0 요구사항의 존재 근거를 흔드는 것들이라, 그 위에 기술 설계를 얹으면 설계를 통째로 다시 하게 된다.
확인·실험 종류라 지금 당장 못 푸는 차단 미결이 있다면, 사용자에게 두 가지 중 하나를 고르게 한다.

1. 확인/실험을 먼저 하고 그 결과를 기다린다
2. 기본값으로 진행하되, 되돌리기 비용을 감수한다고 명시적으로 확인한다

임의로 2번을 선택하지 않는다. 되돌리기 비용을 치르는 건 사용자다.

---

## 에이전트별 참고

- Claude Code에서 실행 중이면: `references/claude-code.md`
- Codex에서 실행 중이면: `references/codex.md`

Files in this skill

  • SKILL.md30.9 KB
  • references/claude-code.md2.4 KB
  • references/codex.md1.9 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.