prd-generator · diff
git:20261012.aa46794 to git:20261029.9a25015
60 added, 469 removed. Audit A to A.
---
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).
-
+ description: 아이디어·사용자 설명·기존 프로젝트를 바탕으로 docs/PRD.md에 요구 ID와 관찰 가능한 수용 기준, 자율운영 합의를 작성하거나 필요한 부분을 갱신한다.
---
- ## 1단계. 입력 확보
-
- **`docs/PRD.md` 가 이미 있으면 작성(1~6단계)을 다시 돌지 않는다** — 남은 미결을 푸는 것이면 7단계(미결 해소 세션), 내용을 바꾸는 것이면 8단계(부분 갱신)만 한다. 7단계로 풀었는데 뒤 문서(TRD 이후)가 이미 있으면, 끝에 8단계의 버전·`변경 이력` 한 줄·뒤 문서 맞추기를 한다 — 미결 해소도 PRD 를 바꾼 것이고, 버전이 그대로면 뒤 스킬이 알아채지 못한다. 처음부터 다시 쓰면 FR 번호와 사용자와 푼 미결이 초기값으로 덮이고, 그 번호를 가리키는 뒤 문서가 전부 엉뚱한 요구사항을 가리킨다. 사용자가 처음부터 다시 쓰라고 명시하면 그때만 1단계부터 돈다 — 뒤 문서가 이미 있으면 번호가 흔들려 뒤 문서의 참조가 엉뚱한 항목을 가리킨다는 것을 먼저 알린다.
-
- 먼저 `docs/IDEA.md` 가 있는지 확인한다. 있으면 그것이 주 입력이다.
-
- **IDEA.md 가 있는 경우** — 전부 읽고, 특히 **'미결 사항'과 '(가정)' 표기를 최우선으로 처리한다.**
- 아이디어 단계에서 미뤄 둔 결정이 PRD에 그대로 넘어오면, 요구사항이 가정 위에 세워진다. 그 가정이 틀어지면 요구사항 절반이 무효가 된다.
-
- 미결 항목마다 아래 넷 중 하나로 처리하고, 어느 쪽인지 문서에 남긴다.
-
- 1. **지금 결정한다** — 사용자에게 선택지와 함께 묻는다. 요구사항의 존재 여부를 가르는 것이면 반드시 여기에 해당한다.
- 2. **가정으로 확정하고 표시한다** — 세부 사항이면 합리적 값으로 정하고 `(가정)` 표기를 유지한다.
- 3. **범위 밖으로 밀어낸다** — 이번 버전에서 안 다루기로 하고 '범위 밖'에 적는다.
- 4. **미결로 남기되, 흘러갈 경로를 만든다** — 아래를 따른다.
-
- 미결을 미결인 채로 요구사항 본문에 섞어 넣는 것만은 하지 않는다. 뒤 레이어는 PRD 본문을 확정된 합의로 읽는다.
-
- **처리하다가 범위가 바뀌면 IDEA.md 에도 돌려놓는다(변경 전파).** 3번처럼 IDEA 의 MVP 포함 항목을 범위 밖으로 보내거나, 사용자가 대화에서 타깃·핵심 흐름을 바꾸면
- IDEA 와 PRD 가 서로 다른 제품을 말하게 된다. 사용자가 그 결정을 내린 자리에서 `idea-brainstorm` 7단계(부분 갱신)로 해당 줄만 고치고(부를 수 없으면 같은 규칙으로 직접 — 해당 줄만, 버전·`변경 이력` 한 줄)
- PRD 머리의 `입력 문서` 버전을 맞춘 뒤 이어 간다. 세부(수용 기준·NFR 수치)는 PRD 가 덮으므로 IDEA 에 옮기지 않는다.
-
- ### 즉답으로 풀리지 않는 미결 다루기
-
- 미결을 전부 "사용자에게 물어보면 되는 것"으로 취급하면 안 된다. 실제로는 종류가 다르고, 종류마다 푸는 방법이 다르다.
- 이걸 구분하지 않으면 모델은 둘 중 하나를 하게 된다 — 그럴듯한 값으로 가정해 확정해 버리거나, 표에 적어 두고 잊거나.
- 둘 다 나중에 요구사항 여러 개를 무효로 만든다.
-
- **이 분류는 잠정이다.** 모델이 제안하는 것이고, 확정하는 사람은 사용자다.
- 같은 항목이 사용자에게는 다르게 보일 수 있다 — 모델이 "물어보면 되는 것"으로 본 항목을 사용자는
- "인터뷰 끝나기 전엔 정하면 안 되는 것"으로 알 수 있다. 그쪽이 맞다. 사용자가 맥락을 더 안다.
- 그래서 문서에는 종류를 `질문(잠정)` 처럼 적고, 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 (0.1) (없으면 "사용자 설명")
- - **상태**: 사람 검토 대기
- - **변경 이력**: (없음 — 고칠 때마다 `0.2 (YYYY-MM-DD, <고친 스킬>) — <무엇을 왜>. 영향: <뒤 문서의 ID·절>` 한 줄씩)
-
- ## 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절에서 차단(굵게)이면 `상태` 는 반드시 `정의됨 (차단)` 이고, 아니면 `정의됨` 이다.**
- 두 열을 따로 고치지 않는다.
- 예외는 하나 — 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`
- - 뒤 문서는 앞 문서를 근거로 한다. 어긋나면 앞 문서가 이긴다 — 바꿔야 하면 사용자 확인 뒤 **가장 앞 문서부터** 고치고(버전·`변경 이력` 한 줄. 프로젝트 완료 뒤에는 `feature-add`·`refactor-plan` 의 후미 절로) 사이 문서를 맞춘 다음 이어 간다(변경 전파). 손으로 고칠 때도 같다. 루프 세션은 앞 문서를 고치지 않고 LOOP.md 대로 멈춘다
- - 현재 단계: <마지막으로 끝낸 스킬> → 다음: <다음 스킬>
-
- ## 공통 규칙
- - 앞 레이어의 **파일**만 입력이다. 대화 기억이나 추측으로 요구사항·기술 결정을 만들지 않는다
- - ID(`FR-`·`NFR-`·`US-`·`OQ-`·`TD-`·`phase-NN-task-MM`)는 참조만 한다. 새 ID 는 마지막 번호 다음으로만 만든다 — OQ 는 프로젝트 전체(`HARNESS.md`·`LOOP.md` 의 미결 표까지)에서, 나머지는 그 문서에서 센다(변경 전파로 앞 문서에 더할 때도)
- - 사용자가 말하지 않은 값은 `(가정)` 으로 표시한다. 모호하면 추측하지 말고 묻는다
- - 요청된 범위를 조용히 넓히거나 줄이지 않는다. 범위 판단은 보고한다
- ```
-
- `## 제품 (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개 (7·8단계로 이미 있는 PRD 를 고칠 때는 `폐기` 행과, 플랜이 이미 올려 둔 `계획됨` 행은 그대로 둔다 — `계획됨` 이면 괄호의 `(차단)` 만 맞춘다) | 맞춘다. 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의 `차단 미결`은 그대로 둔다
- - **유예** → 기본값으로 진행하고, 재검토 시점을 적는다
+ ## 목적과 입력
- ### 세션을 마칠 때
+ PRD는 누구에게 어떤 결과를 제공할지 정한다. 사용자 요청·기존 합의·`docs/IDEA.md`가 있으면 읽고
+ 기존 코드의 현재 동작을 조사한다. IDEA가 없다는 이유로 명확한 요청을 다시 브레인스토밍하지 않는다.
+ 기존 PRD·후속 문서·상태가 있으면 먼저 읽어 확정 결정과 진행을 이어받는다.
- 남은 미결을 한 번 더 훑고 사용자에게 이렇게 정리해 준다.
+ ## 최소 산출물
- - 처리한 것: 결정 n건, 재분류 n건, 불필요로 삭제 n건, 범위 밖으로 이동 n건
- - 남은 것: 각각이 **뒤에서 무엇을 막는지**와 함께. ("OQ-007이 남으면 계약서 템플릿 태스크 3개가 blocked로 시작합니다.")
- - 남은 미결의 해소 담당과 시점
+ `docs/PRD.md`에 다음 정보가 있으면 충분하다. 작은 프로젝트는 짧게 쓴다.
- 이 요약을 PRD 8절에도 반영해서, 다음 레이어가 문서만 보고도 무엇이 열려 있는지 알게 한다.
+ - 목적·사용자·핵심 흐름·포함/제외와 우선순위
+ - 기능 `FR-xxx`, 필요한 비기능 `NFR-xxx`와 각각의 관찰 가능한 수용 기준
+ - 사용자 목표 연결이 필요하면 `US-xxx`; 가정·중요 제약·남은 미결 `OQ-xxx`
+ - `## 자율운영 합의`
- ### 언제 멈추는가
+ 수용 기준은 입력/행동과 화면·응답·저장값 등 확인할 결과를 적는다.
+ 중요한 오류·권한·빈 입력 경로를 포함하고 수치가 필요하면 조건과 측정 방법을 함께 쓴다.
+ “편리하다·안정적이다”만으로 완료를 판정하지 않는다. P0/P1/P2는 실제 중요도로 정하며 비율을 맞추지 않는다.
+ 기술명은 사용자 제약일 때 기록한다. 기술 선정은 TRD, 계약·구조는 Architecture, 순서는 Plan의 책임이다.
- 미결이 다 풀리지 않아도 TRD로 넘어갈 수 있다. **단 하나의 조건은 차단 미결이 남아 있지 않은 것**이다.
- 차단 미결은 P0 요구사항의 존재 근거를 흔드는 것들이라, 그 위에 기술 설계를 얹으면 설계를 통째로 다시 하게 된다.
- 확인·실험 종류라 지금 당장 못 푸는 차단 미결이 있다면, 사용자에게 두 가지 중 하나를 고르게 한다.
+ ## 시각 미리보기와 사용자 확정
- 1. 확인/실험을 먼저 하고 그 결과를 기다린다
- 2. 기본값으로 진행하되, 되돌리기 비용을 감수한다고 명시적으로 확인한다
+ - 화면이 있는 제품은 요구 정리 후 본격적인 화면 구현과 해당 제품 Loop 전에 검토 가능한 실제 렌더링 미리보기와 사용자의 최종 시각 결정을 확보한다.
+ - 정본은 `docs/DESIGN.md` 또는 기존 동등 문서로 두고 선호·참고 방향, 결정 대상과 미결을 연결한다.
+ - 실제 가용 호스트 도구를 확인해 아티팩트·로컬 페이지·앱·이미지 등 적합한 수단으로 미리보기를 준비하며 제품명으로 기능을 가정하지 않는다.
+ - 미리보기에 필요한 최소 잠정 기술 선택은 허용하되 최종 기술 선정은 TRD에 잇고, 대안 수·라이브러리·프레임워크를 강제하지 않는다.
+ - 정보 위계·타이포그래피·색과 대비·간격과 정렬·주요 상태·반응형을 대상에 맞는 관찰 가능한 시각 품질 기준으로 정한다.
+ - 미리보기 자산과 재현에 필요한 자료를 지속 경로에 보존하고 정본에 연결한다. 일시적 링크만 남기지 않는다.
+ - 정본에 사용자의 선택·승인 근거·대상 버전·적용 범위를 기록한다. 기술·아키텍처 위임, 침묵과 경과 시간은 최종 시각 승인이 아니다.
+ - 문서만 요청하면 미리보기 구현을 강제하지 않고 미결과 다음 행동을 기록한다. 개발 요청이면 추상적 질문에 그치지 않고 실제 미리보기를 준비해 사용자 결정을 받는다. 결정을 받기 전에는 미리보기를 화면 구현보다 먼저 만들고 임시 후보로 UI를 구현·완료하지 않는다.
+ - 확인 가능한 승인 기준선은 그 범위에서 재사용한다. 시각을 보존하는 버그 수정·리팩터링과 CLI·문서 작업에는 새 디자인 절차를 요구하지 않는다.
+ - 필수 시각 승인을 충족한 범위에서 후속 단계의 재승인을 생략하며, 준비 비용은 기존 전체 예산에 포함한다. DESIGN의 미결·재개 조건 기록은 질문 파일 금지와 별개다.
- 임의로 2번을 선택하지 않는다. 되돌리기 비용을 치르는 건 사용자다.
+ ## 자율운영 합의
- ## 8단계. 이미 `docs/PRD.md` 가 있을 때 — 부분 갱신
+ 실행 전에 코드·문서·OS·도구·권한·외부 의존을 조사한다. 직접 확인할 사실은 질문하지 않는다.
+ 기존 합의를 재사용하고 사용자만 정할 핵심 빈칸을 미리 묶어 묻는다. 합의 절에는 아래를 최소 기록한다.
- PRD 는 한 번 쓰고 끝나지 않는다. 뒤 레이어가 쓰는 동안 **요구사항을 바꿔야 하는 결정**이 나온다 — 아키텍처의 충돌(CF) 해소가 NFR 수치를 조정하거나,
- TRD·설계가 PRD 에 없는 요구사항을 필요로 하거나("설계 유발"), 사용자가 설계를 시키면서 "이것도 넣어줘"라고 하거나, 하네스가 관찰할 수 없는 수용 기준을 발견한다.
- 그 결정이 PRD 에 안 돌아오면 뒤 문서마다 같은 모순을 다시 경고하고, 루프는 옛 수용 기준으로 검증한다. 이 단계가 그 결정을 받는다.
+ - 목표/제외와 기술·설계 선택 재량
+ - 허용된 코드·문서·테스트·의존성·로컬 환경 변경 및 복구
+ - 외부 접근·비용·데이터 경계, 시간/사용량 상한, 커밋·게시 권한
+ - 역할별 기본 모델과 사용량 한도 도달 시 처리(대기 후 재개·허용 대체 모델·중단)
+ - 막혔을 때 허용 대안과 최종 미완료 처리
- **불린 자리에 따라 셋으로 나뉜다.**
+ 시간 상한은 실행·검증·복구·결과 회수를 포함한 전체 예산으로 두고 측정 불가 사용량은 미확인으로 남긴다.
+ 환경 준비·네 게이트·독립 검증·분석 전환의 상세 운영은 Harness/Loop에 연결하고 여기서 복제하지 않는다.
+ 사용자 명시 기본값 변경·자식 실행 금지를 우선하며 달라진 보장과 미검증을 합의에 기록한다.
+ 이전 합의는 원래 위치를 참조해도 된다. 문서화만 요청됐다면 실행 권한은 미합의로 표시하고 구현을 강제하지 않는다.
+ 필수 권한이나 핵심 결정이 미해소이면 자율 실행 준비 완료로 표시하지 않는다. 미응답을 승인으로 해석하지 않는다.
+ Loop 이후 합의 안에서 질문·재승인·수동 조작 요청 없이 구현·검증·복구한다.
+ 새 권한이 필요한 작업과 의존 작업은 차단하고 독립 작업을 마친 뒤 증거와 재개 조건을 남긴 미완료 결과로 끝낸다.
- - **다른 스킬이 불렀다(변경 전파)** — 결정은 이미 사용자가 그 스킬에서 내렸다. 여기서는 그 결정을 PRD 형식으로 기록하고 돌아간다. 다만 기록하려면 **새 결정이 더 필요한 경우**가 많다 — "이것도 넣자"로 생긴 FR 의 수용 기준·우선순위, 범위에 새로 들어온 기능의 실패 경로. 그것은 2~4단계 규칙대로 사용자에게 묻고(답을 받기 전에는 쓰지 않는다) 채운다. 뒤 문서 연쇄는 부른 스킬이 한다. `CLAUDE.md` 의 `현재 단계` 줄은 건드리지 않는다 — 단계가 바뀐 것이 아니다
- - **사용자가 직접 불렀다**("요구사항 바꾸자", "FR-003 수용 기준 고쳐줘") — 프로젝트가 완료됐으면(`STATE.md` 의 `Phase Overview` 가 전부 `completed`) 이 단계로 본문을 고치지 않고 `feature-add`(요구 변경)·`refactor-plan`(기술·구조 변경)으로 안내한다 — 완료 뒤에는 후미 절로 반영하는 것이 원본 규칙이다. 아니면 바꿀 것을 2~4단계 규칙대로 사용자와 정하고, 끝에 아래 "뒤 문서 맞추기"까지 한다
- - **Layer 6(`feature-add`)이 후미 절 모드로 불렀다** — 그 지시가 우선이다. 본문을 고치지 않고 `## 추가 N` 절에 적는다(대체한 항목의 제목 아래 `> 대체됨 — '## 추가 N' (날짜)` 한 줄만 예외). 아래 규칙 중 번호·추적표·버전은 그대로 적용하고(Layer 6 후미 절 모드면 `변경 이력` 줄은 쓰지 않고 버전만 올린다 — 후미 절 첫 줄(날짜·요청·ID)이 이력이다), 뒤 문서는 부른 스킬이 순서대로 부르므로 여기서 부르지 않는다
+ ## 미결과 갱신
- **지킬 것.**
+ - 미결은 사용자 결정 / 사실 확인 / 실험 / 유예로 구분하고 영향 요구와 해소 방법을 적는다.
+ 확인·실험을 사용자에게 추측하게 하지 않는다. 위임된 선택은 스스로 결정하고 근거를 남긴다.
+ - 기존 FR/NFR/US/OQ ID·절 참조·사용자 수정·상태를 보존한다. 새 번호는 끝에 붙인다.
+ OQ 번호는 관련 프로젝트 문서 전체에서 충돌하지 않게 확인한다.
+ - 폐기/대체와 해소 이력을 연결한다. 기존 추적표의 해당 행만 맞추고 계획됨·구현됨 상태를 초기화하지 않는다.
+ - 충돌은 가장 앞의 영향 부분(IDEA 포함)부터 고치고 근거·현재 기준 포인터를 남긴다. 통과 편의로 기준을 낮추거나 요청 범위를 몰래 바꾸지 않는다.
+ - 후미 절 요청은 `## 추가 N`·`## 리팩토링 N`을 보존한다. 필요한 후속 문서와 루트 포인터만 갱신한다.
- - **바뀐 항목만 고친다.** 파일을 통째로 다시 쓰지 않는다. 사용자가 손으로 고친 문장이 있다
- - **ID 는 유지한다.** 새 FR·NFR·US·OQ 는 **마지막 번호 다음**(OQ 는 프로젝트 전체 — TRD·아키텍처·`HARNESS.md`·`LOOP.md` 의 미결 표까지 — 에서 마지막 번호 다음). 없어진 요구사항은 지우지 않고 `폐기 — 대체: FR-0xx`(대체가 없으면 `폐기 — (이유)`)로 표시한다 —
- TRD 추적표·설계 단위·태스크가 그 번호를 가리키고 있어, 지우면 뒤 문서의 참조가 허공을 가리킨다
- - 수용 기준을 바꾸면 3단계 규칙(관찰 가능·실패 경로 하나 이상·숫자)을 그대로 지킨다. 바뀐 기준 줄 끝에 `(0.2 변경)` 을 붙여 뒤 레이어가 어느 줄이 새것인지 알게 한다
- - 풀린 미결은 7단계 "처리 결과별 문서 갱신" 그대로 옮긴다. 옮긴 자리에 `(OQ-007 해소)` 를 남겨 루프의 차단 해소가 찾을 수 있게 한다
- - **9절 추적표를 함께 맞춘다** — 새 FR 은 행을 더하고 `상태` 는 `정의됨`(차단이면 `정의됨 (차단)`), `담당 태스크` 는 비운다(플랜이 채운다). 폐기한 FR 은 `상태` 를 `폐기` 로
- - **버전을 올리고 `변경 이력` 에 한 줄** — `0.2 (YYYY-MM-DD, <부른 스킬>) — <무엇을 왜>. 영향: <TRD·설계·태스크의 ID·절>`.
- 뒤 문서는 `입력 문서` 에 PRD 버전을 적어 두었으므로, 이 줄이 뒤 스킬이 "무엇이 낡았는가"를 찾는 출발점이다
- - 범위가 바뀌었으면(MVP 포함/제외, 타깃, 핵심 흐름) `idea-brainstorm` 7단계로 IDEA.md 도 맞춘다. 반대로 IDEA 버전이 머리의 `입력 문서` 버전보다 높으면 IDEA 의 `변경 이력` 에서 그 뒤 줄을 읽어 PRD 부터 맞춘다
- - 6단계 자체 점검 중 바뀐 항목에 걸리는 행만 다시 돌린다
+ ## 완료 증거와 연결
- **뒤 문서 맞추기(사용자가 직접 불렀을 때. `idea-brainstorm` 7단계가 연쇄를 시작해 이 단계를 불렀으면 그 세션이 같은 순서로 한다).** 뒤 문서가 이미 있으면 앞에서 뒤 순서로 그 레이어의 갱신을 이어서 부른다 —
- TRD(바뀐 FR·NFR 이 근거인 TD 가 있을 때만 `trd-generator` 9단계) → 아키텍처(`architecture-generator` 9단계) → 플랜(`plan-generator` 10단계) → 하네스(`harness-update`) → 루프(`loop-update`, DAG 가 바뀔 때).
- 각 스킬이 자기 승인 규칙(완료 태스크 불변, 하네스 약화의 승인)을 지킨다. **루프가 도는 중(`STATE.md` 의 `Phase Overview` 에 `in_progress`)이면 플랜부터는 부르지 않고** 무엇이 낡았는지 보고한다 — 그 문서들의 필자는 루프다.
- 보고에는 `앞 문서 반영`·`뒤 문서 반영` 묶음(문서·새 버전·바뀐 ID)을 둔다.
+ 작업 시작·중요 결정·종료 때 PRD나 기존 STATE/LOG에 현재 단계·확정/미결·다음 행동과 근거를 증분 저장한다.
+ 원 대화 없이 요구·합의를 이어받게 하되 작은 문서 요청에 전체 계획 체계를 강제하지 않는다.
- ---
+ 요청의 모든 포함 항목이 수용 기준이나 명시적 미결로 연결되는지, 제약과 기준이 모순되지 않는지 확인한다.
+ 변경 ID·기준·차단·합의 범위를 보고한다. 문서 완성과 실제 제품 검증 결과를 구분한다.
+ 기획만 요청됐다면 여기서 끝내고 다음 스킬을 제안한다. 다음 단계는 필요한 시각 미리보기·사용자 확정을 거친 `trd-generator`다.
+ 사용자가 그 단계 이후 진행을 명시적으로 승인했으면 이어 수행하고, 아니면 결과와 다음 스킬을 제안해 승인을 받는다. 명시 승인은 요청이나 사용자가 확정한 합의가 이후 단계 진행을 권한·예산과 함께 밝힌 경우이며 '만들어줘'만이나 침묵, 에이전트가 채운 합의는 해당하지 않는다.
+ 필수 디자인 선택은 앞단에서 받되 이미 확정한 내용을 재승인받지 않고 승인된 실행을 사용자에게 넘기지 않는다.
- ## 에이전트별 참고
+ ## 환경 참고
- - Claude Code에서 실행 중이면: `references/claude-code.md`
- - Codex에서 실행 중이면: `references/codex.md`
+ 도구 차이가 필요할 때만 [Claude Code](references/claude-code.md) 또는 [Codex](references/codex.md)를 읽는다.