@angar2/taskery 0.7.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/close.js +13 -1
- package/bin/legacy-quotes.js +60 -0
- package/bin/lib.js +159 -7
- package/bin/migrate.js +261 -86
- package/bin/update.js +13 -7
- package/package.json +1 -1
- package/template/.codex/agents/task-tester.toml +10 -4
- package/template/.codex/agents/test-plan-author.toml +34 -0
- package/template/.project/rules/CHANGELOG_RULE.md +26 -20
- package/template/.project/rules/GIT_RULE.md +2 -0
- package/template/.project/rules/TASKERY_RULE.md +4 -4
- package/template/.project/rules/TASK_DOC_RULE.md +11 -1
- package/template/shared/skills/project-init/SKILL.md +1 -0
- package/template/shared/skills/task-close/SKILL.md +11 -8
- package/template/shared/skills/task-plan/SKILL.md +121 -6
- package/template/shared/skills/task-test/SKILL.md +22 -3
|
@@ -16,27 +16,30 @@
|
|
|
16
16
|
|
|
17
17
|
## 2. 항목 형식
|
|
18
18
|
|
|
19
|
-
각 task close 시 새 항목 1
|
|
19
|
+
**작성 주체 = close CLI 자동.** 각 task close 시 `npx @angar2/taskery close`가 새 항목 1개를 직접 append한다 (헤더=task 문서 H1 제목 / 날짜 / 타입=헤더 유형 / 변경 요약=Dev Plan Phase 명 목록):
|
|
20
20
|
|
|
21
21
|
```markdown
|
|
22
|
-
## [TASK-NNN]
|
|
22
|
+
## [TASK-NNN] <제목 — task 문서 H1>
|
|
23
23
|
|
|
24
24
|
- **날짜**: YYYY-MM-DD
|
|
25
25
|
- **타입**: feature / bug / improvement / refactor / docs / chore
|
|
26
|
-
- **변경 요약**:
|
|
27
|
-
-
|
|
28
|
-
-
|
|
26
|
+
- **변경 요약**:
|
|
27
|
+
- Phase 1 — <Phase 명>
|
|
28
|
+
- Phase 2 — <Phase 명>
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
### 필수 필드
|
|
31
|
+
### 필수 필드 (CLI 자동 작성분)
|
|
32
32
|
|
|
33
|
-
1. 헤더 `## [TASK-NNN]
|
|
33
|
+
1. 헤더 `## [TASK-NNN] <제목>` (한 줄)
|
|
34
34
|
2. **날짜** (`YYYY-MM-DD`)
|
|
35
|
-
3. **타입** (
|
|
36
|
-
4. **변경 요약** (
|
|
35
|
+
3. **타입** (task 헤더 유형 — `feature` / `bug` / `improvement` / `refactor` / `docs` / `chore`)
|
|
36
|
+
4. **변경 요약** (Phase 명 목록 — Phase 부재 시 제목 1줄)
|
|
37
37
|
|
|
38
|
-
### 선택
|
|
38
|
+
### 보강 (선택 — 세션·사용자 자유 편집)
|
|
39
39
|
|
|
40
|
+
CLI 자동 작성분이 기본이고, 세션·사용자가 항목을 자유롭게 보강할 수 있다 (closed 잠금은 task 문서만 — changelog는 잠금 밖):
|
|
41
|
+
|
|
42
|
+
- 변경 요약 문장 보강
|
|
40
43
|
- 영향 파일 (참고용)
|
|
41
44
|
- 사유 (참고용)
|
|
42
45
|
- 관련 PR / 이슈 링크 (있을 시)
|
|
@@ -53,23 +56,24 @@
|
|
|
53
56
|
|
|
54
57
|
## 4. task-close 흐름과의 정합
|
|
55
58
|
|
|
56
|
-
|
|
59
|
+
**close CLI가 append한다 — 세션 수기 작성 불요, 보강만.**
|
|
57
60
|
|
|
58
|
-
1.
|
|
59
|
-
2.
|
|
60
|
-
3.
|
|
61
|
-
4. 커밋 — 메시지 형식: `docs: [TASK-NNN] CHANGELOG 업데이트`
|
|
61
|
+
1. `npx @angar2/taskery close`(또는 `task_close` 도구)가 §2 형식으로 항목을 자동 append — 파일 없으면 생성(§1 두 형식 중 단일 `CHANGELOG.md` 실재 시 그쪽, 아니면 이번 달 `<YYYY-MM>.md`), 최신 위치(맨 위) 삽입, `[TASK-NNN]` 중복 가드(재호출 시 skip)
|
|
62
|
+
2. 세션은 필요 시 append된 항목을 보강(§2 보강)
|
|
63
|
+
3. 커밋: 미등록 케이스는 close의 문서 커밋이 자동 수거 / 등록 케이스는 `.project/`가 git 밖이라 커밋 불요
|
|
62
64
|
|
|
63
65
|
---
|
|
64
66
|
|
|
65
67
|
## 5. 예시
|
|
66
68
|
|
|
67
69
|
```markdown
|
|
68
|
-
## [TASK-042] 사용자 인증 OAuth 2.0 지원
|
|
70
|
+
## [TASK-042] 사용자 인증 OAuth 2.0 지원
|
|
69
71
|
|
|
70
72
|
- **날짜**: 2026-06-15
|
|
71
73
|
- **타입**: feature
|
|
72
|
-
- **변경 요약**:
|
|
74
|
+
- **변경 요약**:
|
|
75
|
+
- Phase 1 — OAuth provider 연동 (Google / GitHub)
|
|
76
|
+
- Phase 2 — 인증 라우트 배선
|
|
73
77
|
- **영향 파일**: `src/auth/oauth.ts`, `src/routes/auth.ts`, `migrations/0042_oauth.sql`
|
|
74
78
|
- **사유**: 외부 서비스 연동 요구 누적 — 인증 흐름 다변화
|
|
75
79
|
|
|
@@ -77,11 +81,12 @@
|
|
|
77
81
|
|
|
78
82
|
- **날짜**: 2026-06-12
|
|
79
83
|
- **타입**: bug
|
|
80
|
-
- **변경 요약**:
|
|
81
|
-
-
|
|
82
|
-
- **사유**: TASK-038 신고 — 빈 이메일로 로그인 시도 시 서버 오류
|
|
84
|
+
- **변경 요약**:
|
|
85
|
+
- Phase 1 — 이메일 형식 검증 보강
|
|
83
86
|
```
|
|
84
87
|
|
|
88
|
+
(TASK-042 = CLI 자동 작성분에 영향 파일·사유를 보강한 예 / TASK-041 = CLI 자동 작성분 그대로.)
|
|
89
|
+
|
|
85
90
|
---
|
|
86
91
|
|
|
87
92
|
## 6. 수정 이력
|
|
@@ -89,3 +94,4 @@
|
|
|
89
94
|
| 날짜 | 변경 사항 |
|
|
90
95
|
|------|----------|
|
|
91
96
|
| 2026-05-30 | 신규 작성 — 위치 / 형식 / 필수 필드 / task-close 정합 (stash FRICTION_LOG #8+9 반영) |
|
|
97
|
+
| 2026-08-09 | 작성 주체를 close CLI 자동으로 개정 — §2 항목 형식(변경 요약=Phase 명 목록)·필수/보강 재편, §4 흐름 개정(수기 작성 불요·보강만·중복 가드). recordion FRICTION 2026-08-09(문서 갱신 세션 준수 의존) 반영 |
|
|
@@ -124,6 +124,7 @@ feat: [TASK-001] Phase 1 - 사용자 인증 로직 구현
|
|
|
124
124
|
- **Dev Plan에 없는 빌드 산출물**(`*.pbxproj` / `package-lock.json` 등 잠금파일 계열) **→ 마지막 Phase 커밋에 자동 편입** + `(빌드 산출물 자동 편입)` 표기. 산출물은 소스에 딸려 바뀌는 파생물이라 Phase 소속을 물을 대상이 아니다.
|
|
125
125
|
- **Dev Plan에 없는 일반 파일 → 자동 편입 없이 중단(blocked)** — 계획에 없던 작업일 수 있어 사람 판단으로 남긴다.
|
|
126
126
|
- **중간 커밋의 독립 빌드 가능성은 보장 대상이 아니다** — 다중 Phase 편입 시 어느 배치로도 중간 커밋 빌드는 성립하지 않을 수 있다(최종 트리 정상이면 충분). 이를 이유로 매핑을 수동 재배치하지 않는다.
|
|
127
|
+
- **`- 파일:` 다중 파일 표기 규격** — 권장 = `- 파일:` 다음 줄부터 들여쓴 목록(` - <경로>`), 허용 = 쉼표·가운뎃점(`·`) 구분 한 줄. `(신규)`류 꼬리 괄호 주석은 파서가 제거한다. **규격 밖 표기는 파서가 못 읽어 `blocked:'mapping'`으로 멈춘다.**
|
|
127
128
|
|
|
128
129
|
### 태스크 문서 커밋 메시지
|
|
129
130
|
|
|
@@ -321,3 +322,4 @@ git -C "$MAIN_WT" branch --list \
|
|
|
321
322
|
| 2026-08-08 | 출처 표기 개편 — `RM-NNN`(로드맵 항목 채번, 미구현) → `ST-N`(ROADMAP Stage 번호 그대로, 채번 불요·동일 출처 중복 게이트 미적용). 구형 RM-NNN은 호환 수용만. + §커밋 순서에 "Phase↔파일 매핑 규칙" 신설 — 다중 Phase 파일=이른 Phase 편입+표기 / 빌드 산출물=마지막 Phase 자동 편입 / 일반 미매핑만 blocked / 중간 커밋 독립 빌드 비보장 명문화. stash·recordion FRICTION_LOG 반영 |
|
|
322
323
|
| 2026-08-08 | §멀티세션 검수 환경에 "중복 기동 방지"·"화면·입력 점유 회피" 2항 추가 — 검수 앱 중복 기동(부모만 종료해 창 잔존) 및 UI 자동조작 스위트의 화면·입력 강탈 마찰 반영. stash·recordion FRICTION_LOG |
|
|
323
324
|
| 2026-08-08 | 0.7.0 문서 체계 재편 정합 — 진입 문서 단일화(`AGENTS.md` 본문 + `CLAUDE.md`는 임포트 한 줄)에 따라 검증 명령 참조 경로 변경, 폐지된 `TEST-GUIDE.md` 참조를 `TEST_RULE.local.md`로 교체. 머리말에 `.local.md` 구속력 안내 추가(코어와 동등 — `TASKERY_RULE` §7) |
|
|
325
|
+
| 2026-08-09 | §Phase↔파일 매핑 규칙에 `- 파일:` 다중 파일 표기 규격 추가 — 권장=들여쓴 목록 / 허용=쉼표·가운뎃점 한 줄 / 꼬리 괄호 주석 파서 제거 / 규격 밖=blocked 명문화. recordion FRICTION 2026-08-09(TASK-010 — 가운뎃점 표기가 줄 전체 경로 하나로 파싱) 반영 |
|
|
@@ -79,10 +79,10 @@ draft → planned → developing → developed → testing → tested → closed
|
|
|
79
79
|
| `/project-init` | project | `AGENTS.md` 리포 값 기입 + `.project/` 진입·제품 관통 문서 + 리포 로컬 룰 초안 생성 (1회성) |
|
|
80
80
|
| `/plan-init` | plan | plan 폴더·PLAN·ROADMAP 생성 + FEATURES/UX-UI에 의도 추가 |
|
|
81
81
|
| `/task-init` | task | 채번 + 워크트리·브랜치 분기 + task 문서 골격 (→ `draft`) |
|
|
82
|
-
| `/task-plan` | task | Requirements / Scope / Dev Plan / Test Plan 작성 (→ `planned`) |
|
|
82
|
+
| `/task-plan` | task | Requirements / Scope / Dev Plan / Test Plan 작성 (→ `planned`). 해석 여지 태스크는 Test Plan을 격리 서브에이전트 B가 출제(출제 분리 — 구현자 겸 출제의 오독 동조 차단, 원문 origin 보존) |
|
|
83
83
|
| `/task-dev` | task | Phase 순서 구현 + 자체 점검 (→ `developed`) |
|
|
84
|
-
| `/task-test` | task | 서브에이전트 격리 검증 (→ `tested`) |
|
|
85
|
-
| `/task-close` | task |
|
|
84
|
+
| `/task-test` | task | 서브에이전트 격리 검증 (→ `tested`). 출제 분리 태스크는 origin 대조로 시험지 오염 검사(무플래그 수정 즉시 반려) + 핵심 시나리오 음성 대조 |
|
|
85
|
+
| `/task-close` | task | 문서 게이트(PLAN·수정이력 grep) + 커밋 + CHANGELOG 자동 append + 부모 브랜치 병합 (→ `closed`) |
|
|
86
86
|
| `/add-backlog` | meta | 백로그 항목 1건 추가 (얕은 분석 + 채번) |
|
|
87
87
|
| `/log-friction` | meta | 작업 흐름의 불편을 `FRICTION_LOG.md`에 한 행 기록 |
|
|
88
88
|
| `/run-team` | meta · **Claude 전용** | 다건 task를 팀원 세션에 분배해 병렬 처리 |
|
|
@@ -170,7 +170,7 @@ git 정책의 상세(브랜치 명명·커밋 형식·병합 방식·금지 명
|
|
|
170
170
|
| 섹션 | 내용 |
|
|
171
171
|
|------|------|
|
|
172
172
|
| 방식별 실행 경로 | 데이터 조회 / API 호출 / UI·E2E / 시각 실행 — 각 방식을 *이 프로젝트에서 실제로 돌리는 명령·경로·셋업* |
|
|
173
|
-
| 테스트 실행 환경 | 화면·입력을 점유하는 스위트의 **격리 실행 경로**(창 숨김·헤드리스 플래그 / 컨테이너·가상 디스플레이 / VM / CI 러너) |
|
|
173
|
+
| 테스트 실행 환경 | 화면·입력을 점유하는 스위트의 **격리 실행 경로**(창 숨김·헤드리스 플래그 / 컨테이너·가상 디스플레이 / VM / CI 러너). 결정 자체도 기록 대상이다 — 격리 경로를 두지 않기로 했다면 *"없음 — 매번 승인(사용자 결정 YYYY-MM-DD)"*로 적어 미결정 상태와 구분한다 |
|
|
174
174
|
| 범위·방식 정책 | 무엇을 얼마나 검증하나 — 수정 루프에서의 실행 범위, 테스트 신설 상한 등 |
|
|
175
175
|
|
|
176
176
|
**"방식별 실행 경로"는 그대로 실행 가능한 형태로 적는다.** 추상적 설명이 아니라 명령과 경로다. 모르면 비워 두지 말고 사용자에게 확인한 즉시 기록한다 — 재사용의 근거는 기억이 아니라 파일이어야 세션이 바뀌어도 남는다.
|
|
@@ -103,6 +103,7 @@ draft → planned → developing → developed → testing → tested → closed
|
|
|
103
103
|
| spec-diffs (변경된 제품 문서(루트) 추적) | `.project/tasks/<NNN_slug>/spec-diffs/<NNN>_<slug>_spec-diff.md` (**`<NNN_slug>` 공통** — 단일/폴더 모두) | `/task-plan` Step 6 (Phase 0 변경 시) |
|
|
104
104
|
| screenshots (UI 작업 자료) | `.project/tasks/<NNN_slug>/screenshots/<NNN>_*.png` (**`<NNN_slug>` 공통**) | `/task-test` 격리 세션 또는 메인 |
|
|
105
105
|
| mockup (UX/UI HTML 목업) | `.project/tasks/<NNN_slug>/mockup/<task-doc-name>-mockup.html` (**`<NNN_slug>` 공통** — 단일/폴더 모두) | `/task-plan` Step 4.5 (UX/UI task 한정) — 단일 진실 소스 `MOCKUP_RULE.md` |
|
|
106
|
+
| test-plan-origin (출제 분리 B 원문) | `.project/tasks/<NNN_slug>/<NNN>_<slug>_test-plan-origin.md` (**`<NNN_slug>` 공통** — 단일/폴더 모두) | `/task-plan` Step 5-B (분리 적용 task 한정) — B 산출 그대로 보존, `/task-test` 오염 대조의 기준 사본 |
|
|
106
107
|
| 폴더 승격 task의 추가 자료 (서브 문서 등) | `TASK-<NNN>_<slug>/` 안 자유 | 메인 / `/task-dev` |
|
|
107
108
|
|
|
108
109
|
**원칙**:
|
|
@@ -111,7 +112,7 @@ draft → planned → developing → developed → testing → tested → closed
|
|
|
111
112
|
- **spec-diff = per-task 기록** — 그 task가 어느 *제품 문서(`.project/` 루트)*를 NEW/MOD/DEL 했는지의 task 산출물. 제품 문서의 *정식 변경 이력은 git*이 단일 진실이며, 별도 전역 변경 인덱스는 두지 않는다.
|
|
112
113
|
- 폴더 승격은 *task의 추가 자료*용 (서브 문서 / 디자인 자료 등) — *spec-diffs / screenshots / mockup 위치 X*.
|
|
113
114
|
|
|
114
|
-
**closed-immutable hook 보호 범위** — task.md 본 파일만 (단일 파일 또는 폴더 승격 task.md). spec-diffs / screenshots / mockup / 폴더 승격 추가 자료는 *역사적 자료*로 자유 수정.
|
|
115
|
+
**closed-immutable hook 보호 범위** — task.md 본 파일만 (단일 파일 또는 폴더 승격 task.md). spec-diffs / screenshots / mockup / 폴더 승격 추가 자료는 *역사적 자료*로 자유 수정. **단 test-plan-origin은 hook 보호 밖이어도 규약상 불변** — 오염 대조의 기준 사본이므로 어떤 주체도 수정하지 않는다.
|
|
115
116
|
|
|
116
117
|
---
|
|
117
118
|
|
|
@@ -217,6 +218,14 @@ draft → planned → developing → developed → testing → tested → closed
|
|
|
217
218
|
| 시각 *객관* (레이아웃 / 요소 유무 / 색 / 배치 깨짐) | `[AUTO]` 캡처-목업 대조 | 승인 목업 (`mockup/<task-doc-name>-mockup.html`) — 화면 캡처 → 대조 → 어긋남 목록 |
|
|
218
219
|
| 시각 *미세 취향* (2px / 색조 / 호버 강도 / 느낌) | `[USER]` 체크리스트 + 목업 참조 | 사용자 최종 사인 (증거 캡처) |
|
|
219
220
|
|
|
221
|
+
**기대값 출처 표기** (UX/UI task 한정) — 모든 `[AUTO]` PASS 기준 끝에 출처를 단다: `(출처: 목업 §N / Req N)`. 출처를 못 다는 기대값은 `(출처 없음 — 사용자 확인 필요)`로 표기해 합의 때 사용자 확인 항목으로 분리한다. task-test 문 앞 검사의 자격 요건이다.
|
|
222
|
+
|
|
223
|
+
**출제 분리 계약** (해석 여지 태스크 — task-plan Step 2.5 / 5-B):
|
|
224
|
+
- 출제 주체 = 격리 서브에이전트 **B** (입력 = Requirements 합의문 + 승인 목업 + `TEST_RULE.local.md`만 — B 기동 시점에 Dev Plan 부재). B 원문은 `<NNN>_<slug>_test-plan-origin.md`로 그대로 보존한다 (§1.5).
|
|
225
|
+
- **A(메인)의 수정권 = 방식 칸만**, 그것도 `TEST_RULE.local.md` 등재 경로로 교체할 때만. **시나리오 칸·PASS 기준 칸 불가침.**
|
|
226
|
+
- **플래그 문법** — origin과 달라지는 모든 칸에 필수: `【<A수정|사용자결정|보수> · 원안: "<원문>"(· 근거: TEST_RULE.local.md §<절> — A수정만)】`. 정당 경로 3종 = A수정(방식 교체) / 사용자결정(Step 7 합의 변경) / 보수(Test Plan 보수 모드). **무플래그 차이 = task-test가 시험지 오염으로 즉시 반려.**
|
|
227
|
+
- task-test는 origin 대조(룰 18)로 오염을 검사하고, 오염 판정 시 메인이 origin 기준으로 복원한다.
|
|
228
|
+
|
|
220
229
|
**시각 영역 fix 사이클 사전 예고** — 시각 시나리오 있으면 Test Plan 끝에 *"시각 영역 항목 N개 — fix 사이클 1~2회 예상"* 명시 (사용자 기대치 사전 정렬).
|
|
221
230
|
|
|
222
231
|
**검증 / 테스트 명령 참조** — `AGENTS.md`의 `## 검증 명령` (코드 상태: 빌드 / 린트 / 타입체크) + `## 테스트 명령` (테스트 실행: 단위 / 통합 / E2E) 두 섹션을 격리 세션이 자동 참조. Test Plan 본문에 재인용 불필요.
|
|
@@ -656,3 +665,4 @@ Test Plan 작성 완료 후 *반드시* 점검. *"누적/리셋 안 함"* 같은
|
|
|
656
665
|
| 2026-05-30 | stash FRICTION_LOG 기반 정합 — §1.5 mockup 행 추가 (vX.X 공통, 단일 진실 소스 MOCKUP_RULE) + §2.5 Test Plan 본질 재정의 (실질 동작 시나리오 + `[AUTO]` / `[USER]` 분류 강제 + 카탈로그 7방식 + UX/UI 영역 분리 매트릭스 + 시각 fix 사이클 사전 예고 + 검증 / 테스트 명령 두 섹션 참조) + §4.5 / §5 완성 예시 3개 Test Plan 형식 갱신 (분류 표 + PASS 기준 명시. 기존 번호 매김 시나리오 + 검증 명령 나열은 옛 형식). (stash FRICTION_LOG #14+19 / #25 정합) |
|
|
657
666
|
| 2026-06-02 | 0.1.3 F5 정합 — §2.5 가이드라인 안티패턴 3종 추가 (grep/Read-only 보조용 / 요구사항당 end-to-end 1개 이상 / 무거운 검증 회피 금지) + 요구사항 ↔ 시나리오 커버리지 점검 단계 신설 (stash FRICTION_LOG 2026-06-01 Test Plan 동어반복 + 누락 마찰 반영) |
|
|
658
667
|
| 2026-06-27 | PLAYBOOK §13 정합 — plan = 기능 그룹. 헤더 *플랜* 컬럼 = `NNN_slug` 폴더명(예: 001_mvp). §1.5 경로 `tasks/<NNN_slug>/`, *`<NNN_slug>` 공통*으로 통일. spec-diff 정의 = *변경된 제품 문서(루트) 추적*(per-task 기록, 정식 변경 이력은 git 단일 진실) |
|
|
668
|
+
| 2026-08-09 | 출제 분리 정합 — §1.5 test-plan-origin 행 추가(B 원문 보존, 규약상 불변) + §2.5 기대값 출처 표기·출제 분리 계약 명문(방식 칸 불가침 / 플래그 문법 【A수정|사용자결정|보수 · 원안】 / 무플래그 차이=오염 반려). recordion FRICTION 2026-08-09 반영 |
|
|
@@ -189,6 +189,7 @@ taskery 도입 직후 **1회성**으로 호출. 사용자 또는 동료가 새
|
|
|
189
189
|
> 실제 앱을 띄워 UI를 자동 조작하는 스위트를 **사용자의 화면·마우스·키보드를 뺏지 않고** 돌리는 경로.
|
|
190
190
|
> 여기가 비어 있으면 자동 게이트·격리 세션은 그 스위트를 실행하지 않고 사용자 승인을 받는다.
|
|
191
191
|
> 적을 수 있는 것: 창 숨김·헤드리스 플래그 / 가상 디스플레이·컨테이너 / VM / CI 러너 위임 / 점유 스위트를 제외하는 한정 실행 옵션.
|
|
192
|
+
> 결정 자체도 기록 대상 — 격리 경로를 두지 않기로 했다면 *"없음 — 매번 승인(사용자 결정 YYYY-MM-DD)"*로 적어 미결정 상태와 구분한다.
|
|
192
193
|
|
|
193
194
|
<아직 미정>
|
|
194
195
|
|
|
@@ -114,10 +114,10 @@ FAIL 시:
|
|
|
114
114
|
|
|
115
115
|
| # | 대상 | 갱신 내용 |
|
|
116
116
|
|---|------|----------|
|
|
117
|
-
| 1 | `.project/plans/<활성 plan>/PLAN.md` | 본 task에 해당하는 체크리스트 항목 `[x]` + TASK
|
|
117
|
+
| 1 | `.project/plans/<활성 plan>/PLAN.md` | 본 task에 해당하는 체크리스트 항목 `[x]` + **`TASK-NNN`(3자리 제로패드) 문자열 표기 의무** — Step 3 `close`가 이 문자열을 grep 게이트로 검사한다(로드맵 출처 `ST-N`/`RM-NNN` 태스크만 — BL·DR 출처는 체크리스트 항목 자체가 없어 검사 제외). 누락 시 `blocked:'docs'`로 멈춘다 |
|
|
118
118
|
| 2 | `.project/plans/<활성 plan>/ROADMAP.md` | Stage 상태·완료 노트 (출처가 `ST-N`이거나 Stage 진척이 생긴 경우) |
|
|
119
|
-
| 3 | `.project/changelog
|
|
120
|
-
| 4 | 본 task가 수정한 **제품 관통 문서·plan 문서**의 `## 수정 이력` | 해당 문서마다 행
|
|
119
|
+
| 3 | `.project/changelog/` | **close CLI가 자동 append한다** (헤더·날짜·타입·변경 요약=Dev Plan Phase 명. 단일 `CHANGELOG.md`/월별 두 형식 지원, 파일 없으면 생성 — `CHANGELOG_RULE` §2). 세션은 작성 불요 — 요약을 보강하고 싶을 때만 append된 항목을 자유 편집(선택) |
|
|
120
|
+
| 4 | 본 task가 수정한 **제품 관통 문서·plan 문서**의 `## 수정 이력` | 해당 문서마다 행 추가(표가 없으면 신설) + **행에 `TASK-NNN`(3자리 제로패드) 문자열 표기 의무** — Step 3 `close`가 `spec-diffs/` 대상 문서(DEL 제외)마다 이 문자열을 grep 게이트로 검사한다. 누락 시 `blocked:'docs'`. 대상 목록의 출처 = `spec-diffs/` + Dev Plan Phase 0 기록 (등록 케이스는 `.project/`가 git 밖이라 `git diff`로 찾을 수 없다). **task 문서는 제외** — close가 잠그는 별개 계열이다 |
|
|
121
121
|
| 5 | 후속 task 후보 (있을 때만) | **손편집 금지** — `backlog_add` 도구(또는 `npx @angar2/taskery backlog-add ...`)로 등재한다. BL 채번·서식·`withMetaLock` 직렬화를 코드가 보장하며, 파일 위치는 등록/미등록과 무관하게 **항상 메인 워크트리**(`.project/tasks/<활성 plan>/BACKLOG.md`)다 — 위 "편집 위치" 분기가 적용되지 않는 유일한 항목 |
|
|
122
122
|
| 6 | `spec-diffs/` ↔ 실제 문서 변경 | 기재한 diff가 실제 반영됐는지 대조 |
|
|
123
123
|
|
|
@@ -128,16 +128,19 @@ FAIL 시:
|
|
|
128
128
|
|
|
129
129
|
`task_close` 도구 (또는 `npx @angar2/taskery close TASK-NNN`) 한 번으로 다음을 코드가 수행:
|
|
130
130
|
- **Phase 기능 커밋** — uncommitted 코드 변경분(`.project/` 외)을 task.md `### Phase N`의 `- 파일:` 필드에 매핑해 Phase 순서대로 자동 커밋 (GIT_RULE 메시지 형식, 태그 자동: feature→`feat:` / bug→`fix:` / improve→`improve:` / refactor→`refactor:` / docs·chore→`docs:`). 매핑 폴백은 GIT_RULE §"Phase↔파일 매핑 규칙" — 한 파일이 여러 Phase에 걸치면 *가장 이른 Phase*, Dev Plan에 없는 *빌드 산출물*(`*.pbxproj`·잠금파일)은 *마지막 Phase*에 자동 편입(커밋 메시지에 사유 표기).
|
|
131
|
+
- **문서 게이트** (모든 변이 앞) — Step 2.5 항목 1(PLAN 체크리스트)·4(수정 이력)의 `TASK-NNN` 표기를 grep 검사. 누락 시 `blocked:'docs'`로 멈춘다(아무것도 안 바뀐 상태).
|
|
131
132
|
- **status → `closed`** — task 문서 헤더 (`.gitignore` 케이스 자동 판정 — 등록=메인WT / 미등록=워크트리).
|
|
132
|
-
- **
|
|
133
|
+
- **CHANGELOG 자동 append** — `[TASK-NNN]` 항목을 changelog 파일 맨 위에 삽입(없으면 생성, 재호출 중복 가드). 세션 수기 작성 불요.
|
|
134
|
+
- **flows/문서 커밋** (미등록 케이스) — 워크트리 안 `.project/flows/` + task 문서 + changelog.
|
|
133
135
|
- **추적 마커 빈커밋** — 부모 브랜치보다 앞선 커밋이 0개(코드 0·`.project` gitignore인 docs/분석 task)면 채번 보존용 1개.
|
|
134
136
|
|
|
135
|
-
반환 JSON `{ prepped, branch, parent, wtPath, registered, commits, aheadOfParent, multiPhase?, autoAssigned? }`. **`parent`(= task 헤더에 기록된 부모 브랜치, 예 `dev` / `dev_feat_x`)가 이후 Step 4·5의 rebase·머지 대상이다** — 아래 명령의 `$PARENT`로 사용. (task-init이 fork 시점 현재 브랜치를 헤더에 기록해뒀다.)
|
|
137
|
+
반환 JSON `{ prepped, branch, parent, wtPath, registered, commits, aheadOfParent, changelog, multiPhase?, autoAssigned? }`. **`parent`(= task 헤더에 기록된 부모 브랜치, 예 `dev` / `dev_feat_x`)가 이후 Step 4·5의 rebase·머지 대상이다** — 아래 명령의 `$PARENT`로 사용. (task-init이 fork 시점 현재 브랜치를 헤더에 기록해뒀다.)
|
|
136
138
|
|
|
137
139
|
- **`multiPhase` / `autoAssigned`가 있으면 Step 8 보고에 그대로 옮긴다** — 코드가 자동 편입한 파일과 그 근거(어느 Phase로 갔는지)를 사용자가 볼 수 있어야 한다. 재배치 목적의 수동 커밋 재작업은 하지 않는다(GIT_RULE: 중간 커밋 독립 빌드 비보장).
|
|
138
140
|
|
|
139
141
|
**콜백 (반환 `blocked` 필드 / npx는 특수 exit — 메인이 LLM 판단 후 처리):**
|
|
140
142
|
- **`blocked:'mapping'`** (npx exit 2 — `{files, phases, reason}`): Dev Plan `- 파일:` 필드가 변경 파일을 못 덮음(**미매핑 — 빌드 산출물이 아닌 일반 파일 한정**. 다중 Phase 파일·산출물은 위 폴백으로 자동 처리돼 여기 오지 않는다). → 메인이 Dev Plan + `git -C "$WT_PATH" diff --name-only` 정독 후 **코드 변경분을 Phase별로 수동 커밋**(GIT_RULE 형식, 위 태그) → `task_close` 도구(또는 `npx ... close`) **재호출**. 코드가 이미 커밋돼 있으므로 close가 status=closed + 문서 커밋 + 마커를 자동 완료한다.
|
|
143
|
+
- **`blocked:'docs'`** (npx exit 4 — `{missing:[{kind:'plan'|'history', file}...]}`): PLAN 체크리스트 또는 수정 이력에 `TASK-NNN` 표기 누락. → missing 목록의 문서를 채운 후(Step 2.5 항목 1·4 형식) `task_close` 도구(또는 `npx ... close`) **그대로 재호출** — 게이트는 모든 변이 앞이라 코드·상태 아무것도 안 바뀌었다.
|
|
141
144
|
- **`blocked:'status'`** (npx exit 3 — `{current}`): status가 `tested`가 아님. Step 1~2 통과했다면 발생 X. 발생 시 사용자 보고 + 중단.
|
|
142
145
|
|
|
143
146
|
> **close 후 task 문서 수정 금지** — close가 status=`closed`로 잠갔다(`closed-immutable.sh` hook 차단). 이후 Step 4 충돌 해결 내역은 *task 문서가 아니라 rebase/머지 커밋 메시지*에 기록한다.
|
|
@@ -278,8 +281,8 @@ git -C "$MAIN_WT" worktree remove "$WT_PATH"
|
|
|
278
281
|
✅ TASK-<NNN> closed
|
|
279
282
|
- 작업 브랜치: <BRANCH> (삭제 / 보존)
|
|
280
283
|
- 워크트리: <WT_PATH> (제거 / 보존)
|
|
281
|
-
- 커밋: Phase <N>개 + 태스크 문서 + (
|
|
282
|
-
- 문서 갱신: <Step 2.5 점검 6항 중 실제 갱신한 것
|
|
284
|
+
- 커밋: Phase <N>개 + 태스크 문서 + CHANGELOG(close 자동 append — 반환 `changelog`의 file·added|skipped)
|
|
285
|
+
- 문서 갱신: <Step 2.5 점검 6항 중 실제 갱신한 것 + 문서 게이트(PLAN·수정이력) 통과 명시. 없으면 "해당 없음">
|
|
283
286
|
- 자동 편입: <multiPhase / autoAssigned 있을 때만 — 예: `src/ipc.ts` Phase 2·5 → Phase 2 / `project.pbxproj` → Phase 3(빌드 산출물)>
|
|
284
287
|
- 부모 브랜치 병합: <PARENT> ← --no-ff 완료 ($MERGE_COMMIT)
|
|
285
288
|
- 충돌 해결: <건수, 자료 한계 보고 있으면 포함>
|
|
@@ -291,7 +294,7 @@ git -C "$MAIN_WT" worktree remove "$WT_PATH"
|
|
|
291
294
|
|
|
292
295
|
- **Read**: GIT_RULE / task 파일 / AGENTS.md 검증 명령 정독 / `task_close` 반환 JSON
|
|
293
296
|
- **Bash / 도구**: `task_close` 도구(또는 `npx @angar2/taskery close TASK-NNN`) 결정적 준비 + git 명령 (`rebase`, `merge`, `worktree`, `branch`) + 검증 명령 재실행. **유일하게 git 사용 허가된 스킬**
|
|
294
|
-
- **Edit / Write**: (
|
|
297
|
+
- **Edit / Write**: (매핑·docs 콜백 시) 수동 Phase 커밋용 staging / PLAN·수정이력 보완 / (선택) CHANGELOG 요약 보강 — 본문은 close가 자동 append. **close 후 task 문서는 closed라 수정 X**
|
|
295
298
|
- **bin/lib.js**: `withMergeLock` (머지 락 — Step 5)
|
|
296
299
|
|
|
297
300
|
## 주의사항
|
|
@@ -7,7 +7,7 @@ description: task 기획 채우기 — Requirements / Scope / Dev Plan / Test Pl
|
|
|
7
7
|
|
|
8
8
|
## 개요
|
|
9
9
|
|
|
10
|
-
`draft` 상태 task의 본문 4 섹션(Requirements / Scope / Dev Plan / Test Plan)을 채우고 status를 `planned`로 갱신. 사용자와 대화로 진행 — 인터뷰 + 증폭 + 코드 서치 + Phase 분할.
|
|
10
|
+
`draft` 상태 task의 본문 4 섹션(Requirements / Scope / Dev Plan / Test Plan)을 채우고 status를 `planned`로 갱신. 사용자와 대화로 진행 — 인터뷰 + 증폭 + 코드 서치 + Phase 분할. 해석 여지가 있는 태스크는 Test Plan 출제를 격리 서브에이전트 B에 분리한다 (Step 2.5 — 구현자 겸 출제의 오독 동조 차단).
|
|
11
11
|
|
|
12
12
|
리뷰는 *대화로 OK* 자동 전이로 단순화 — 별도 리뷰 단계 없음.
|
|
13
13
|
|
|
@@ -52,7 +52,7 @@ MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
|
|
|
52
52
|
- 인자 없음 → `status` 도구(또는 `npx @angar2/taskery status`)의 *진행중 태스크* 목록에서 후보를 찾는다 — task 문서는 미등록 케이스에서 **각 task의 워크트리 안에만** 있으므로, 메인 워크트리에서 `ls .project/tasks/<NNN_slug>/`로 찾으면 아무것도 안 나와 *"task가 없다"*고 잘못 끝난다. 각 후보의 문서 경로는 `status`가 알려주는 워크트리 경로 아래 `.project/tasks/<NNN_slug>/`다. 그중 status=`draft`인 가장 최근 task. 발견 시 *"TASK-<NNN> 진행할까요?"* confirm. 진행중 목록 자체가 비어 있을 때만 *"draft 상태 task가 없네요. `/task-init` 먼저 호출하세요."* + 종료.
|
|
53
53
|
3. 상태 검증 — 두 진입만 허용, 그 외 종료 + 안내:
|
|
54
54
|
- **`draft`** → 일반 기획 (Step 2~ 전체 진행).
|
|
55
|
-
- **`testing` + Test Plan 보수 모드** → `/task-test`가 *시험문제 결함*으로 반려해 되돌아온 경우에 한해 허용. 이때는 **Test Plan 섹션만 보수**(Requirements / Scope / Dev Plan 보존), Step 2~4는 건너뛰고 Step 5(Test Plan)만 수행, status는 `testing` 그대로 둔다(전이 X — 보수 후 `/task-test` 재실행).
|
|
55
|
+
- **`testing` + Test Plan 보수 모드** → `/task-test`가 *시험문제 결함*으로 반려해 되돌아온 경우에 한해 허용. 이때는 **Test Plan 섹션만 보수**(Requirements / Scope / Dev Plan 보존), Step 2~4는 건너뛰고 Step 5(Test Plan)만 수행, status는 `testing` 그대로 둔다(전이 X — 보수 후 `/task-test` 재실행). **origin 파일(`<NNN>_<slug>_test-plan-origin.md`)이 있는 태스크는** 보수로 바뀐 칸마다 `【보수 · 원안: "<원문>"】` 플래그를 단다 — 무플래그 차이는 task-test가 오염으로 반려한다.
|
|
56
56
|
- **그 외(`planned` / `developing` / `developed` / `tested` / `closed`)** → 종료 + 안내. (특히 `tested` / `closed`는 보수 모드로도 진입 거부 — 우회 방지.)
|
|
57
57
|
4. **프로젝트 로컬 룰 확인** — `$MAIN_WT/.project/rules/TEST_RULE.local.md`를 Read한다. 모든 리포에 있어야 하는 필수 문서다(`TASKERY_RULE` §8) — **없으면 Step 5 실행 경로 확인 단계에서 생성**한다. 로컬 룰의 조항은 코어와 동등한 구속력을 가진다 — 겹치면 로컬이 최우선이고, **겹치지 않는 로컬 조항도 그대로 준수한다** (안전선 제외 — `TASKERY_RULE` §7).
|
|
58
58
|
|
|
@@ -79,6 +79,29 @@ MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
|
|
|
79
79
|
- <최종 합의 — 무엇을 만드는가 한두 줄 요약>
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
+
### Step 2.5 — 출제 분리 판단 (Test Plan 작성 주체 결정)
|
|
83
|
+
|
|
84
|
+
출제(Test Plan)를 구현자(A=메인)가 겸하면 요구사항을 오독했을 때 *같은 오독이 문제지와 답안지에 함께* 들어가 검증이 오독을 잡지 못한다 (recordion FRICTION 2026-08-09). 그래서 해석 여지가 있는 태스크는 Test Plan을 **격리 서브에이전트 B**에 위임한다.
|
|
85
|
+
|
|
86
|
+
**적용 조건** — 다음 둘 다 해당할 때만:
|
|
87
|
+
1. 헤더 유형이 `feature` / `improvement` / `bug`
|
|
88
|
+
2. Requirements에 해석 여지가 있다 (UX/UI·기능 동작 — "어떻게 보여야/움직여야 하나"가 자명하지 않은 태스크)
|
|
89
|
+
|
|
90
|
+
`chore`·`docs`·오타·설정 등 해석 여지 없는 태스크는 **분리 비적용** — 기존 순서(Step 3 → 4 → 4.5 → 5) 그대로, 본 단계 이하의 분리 절차 diff 0.
|
|
91
|
+
|
|
92
|
+
**분리 적용 시 흐름 재배치**:
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
Step 2 (Requirements 합의)
|
|
96
|
+
→ Step 4.5 목업 (앞당김 — B 기동 전에 사용자 승인 완료. 미승인 목업 = 정답지 아님)
|
|
97
|
+
→ 분기: [B 서브에이전트 격리 호출 — Test Plan 출제 (Step 5-B)] ∥ [A: Step 3 Scope + Step 4 Dev Plan]
|
|
98
|
+
→ B 산출 수령 → 원문 독립 보존 → A 검토(방식 칸 한정) → Test Plan 섹션 반영
|
|
99
|
+
→ Step 6 spec-diff → Step 7 통합 합의 → planned
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
- 병렬 실행 가능한 플랫폼(클로드)은 B 기동 직후 A가 Step 3·4를 병렬 진행. 순차만 가능한 환경(코덱스)은 **B를 먼저 완료시킨 후** A가 Step 3·4를 작성한다.
|
|
103
|
+
- 어느 쪽이든 불변식은 같다: **B 기동 시점에 Dev Plan은 존재하지 않는다** — 구현 관점이 시험지에 스며드는 오염이 구조적으로 불가능하다.
|
|
104
|
+
|
|
82
105
|
### Step 3 — Scope (코드 서치)
|
|
83
106
|
|
|
84
107
|
1. Grep / Glob / Read로 *영향 받을 파일* 탐색:
|
|
@@ -140,9 +163,15 @@ MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
|
|
|
140
163
|
- 완료 기준: ...
|
|
141
164
|
- 진행: [ ]
|
|
142
165
|
|
|
143
|
-
### Phase 2 —
|
|
166
|
+
### Phase 2 — <다중 파일 Phase의 표기 예>
|
|
167
|
+
- 파일:
|
|
168
|
+
- src/auth/login.ts
|
|
169
|
+
- src/auth/session.ts (신규)
|
|
170
|
+
- 왜: ...
|
|
144
171
|
```
|
|
145
172
|
|
|
173
|
+
**`- 파일:` 다중 파일 표기 규격** — close가 이 필드를 파싱해 Phase 커밋을 자동 생성하므로 표기가 계약이다. 권장 = 들여쓴 목록(위 Phase 2 예), 허용 = 쉼표·가운뎃점(`·`) 구분 한 줄(`- 파일: a.ts, b.ts` / `- 파일: a.ts · b.ts`). `(신규)`·`(수정)` 류 꼬리 주석은 붙여도 된다(파서가 제거). 규격 밖 표기는 파서가 못 읽어 close가 `blocked:'mapping'`으로 멈춘다.
|
|
174
|
+
|
|
146
175
|
### Step 4.5 — HTML 목업 프로세스 (UX/UI 구현 task 한정 — stash FRICTION_LOG #14+19 반영)
|
|
147
176
|
|
|
148
177
|
본 task가 UX/UI 구현 포함하면 *시각 영역 사전 정합* + *task-test 시각 자동 대조 정답지 확보*용 HTML 목업 생성.
|
|
@@ -195,6 +224,8 @@ Step 2 Requirements 인터뷰 결과로 본 task가 *UX/UI 구현 (페이지/컴
|
|
|
195
224
|
|
|
196
225
|
### Step 5 — Test Plan (실질 동작 시나리오 — stash FRICTION_LOG #14+19 / #25 반영)
|
|
197
226
|
|
|
227
|
+
> **분리 적용 태스크(Step 2.5)는 본 Step을 A가 작성하지 않는다** — Step 5-B(B 출제)로 수행하고, A는 산출 검토만 한다. 본 Step의 형식·규칙(방식 선택 / 시나리오 형식 / 커버리지 / 실행 경로 확인)은 B 펜스에 동일 계약으로 내장돼 있다. 분리 비적용 태스크만 본 Step을 직접 작성한다.
|
|
228
|
+
|
|
198
229
|
#### 본질
|
|
199
230
|
|
|
200
231
|
Test Plan = *본 task에서 구현한 요구사항이 정상 동작하는지* 검증 시나리오. **유닛 테스트 X** (유닛 테스트는 task-dev Step 6.5에서 단일 시점 실행 — *코드 정상성* 영역, 본 Test Plan과 직교).
|
|
@@ -235,7 +266,14 @@ Test Plan = *본 task에서 구현한 요구사항이 정상 동작하는지*
|
|
|
235
266
|
| 회귀 시나리오 | 기존 기능 영향 | 이전과 동일 결과 | test 자동 | 직전 동작하던 시나리오 재실행 |
|
|
236
267
|
| E2E 자동화 도구 | UI 동작 자동화 (도구 있을 시) | 액션 후 관측 변화 | 도구면 test, 아니면 사람 | Playwright / Cypress / XCTest UI Test 등 — 가능하면 자동화, 안 되면 수동 검수. **화면·입력 점유 여부를 먼저 확인** (아래) |
|
|
237
268
|
|
|
238
|
-
> **점유 스위트의
|
|
269
|
+
> **점유 동작 스위트의 실행 방식 결정 (5단계 — 반드시 출구 확정)** — UI를 실제 조작하는 자동화(XCUITest·headed 브라우저 E2E 등)는 실행 중 사용자의 화면·마우스·키보드를 점유한다. 이런 방식을 Test Plan에 넣는 시점에 아래 절차로 출구를 확정한다 — 출구 없는 `[AUTO]`는 격리 세션이 실행하지 못하고 *실행 보류*로 돌려보내 왕복이 생긴다 (stash FRICTION 2026-07-25 · recordion FRICTION 2026-08-05/08-09):
|
|
270
|
+
> 1. `TEST_RULE.local.md` *테스트 실행 환경* 절을 Read한다.
|
|
271
|
+
> 2. 격리 실행 경로(창 숨김·헤드리스 플래그 / 컨테이너·가상 디스플레이 / VM / CI 러너) 선언 있음 → `[AUTO]` (질문 X).
|
|
272
|
+
> 3. *"없음 — 매번 승인(사용자 결정 …)"* 기록 있음 → 시나리오에 **사용자 승인 후 실행** 표기 (질문 X — 이미 내린 결정).
|
|
273
|
+
> 4. 아무 기록 없음 → 그 자리에서 1회 질문: *"격리 실행 경로를 이 태스크 Dev Plan에 포함해 만들까(이후 영구 자동)? 아니면 매번 승인으로 갈까?"* 격리 경로 구축을 택하면 Dev Plan에 Phase로 편입한다(Step 4와 연결).
|
|
274
|
+
> 5. 어느 답이든 *테스트 실행 환경* 절에 기록한다 — 매번 승인을 택해도 *"없음 — 매번 승인(사용자 결정 YYYY-MM-DD)"*로 명시해 빈 상태(미결정)와 구분한다.
|
|
275
|
+
>
|
|
276
|
+
> **경계**: 대상은 **점유 동작 스위트**뿐이다. 시각(캡처) 방식은 위 `[AUTO]` 승격 조건 원칙 그대로 — 경로 없으면 조용히 `[USER]` 폴백, 질문하지 않는다. 출제 분리 적용 태스크에서는 서브에이전트 B가 사용자에게 질문할 수 없으므로 4의 1회 질문은 **B 산출 수령 후 A가 사용자와 함께** 수행한다(Step 7 통합 합의 자리) — B는 *테스트 실행 환경* 절의 현재 기록 상태 기준으로 작성한다(기록 없으면 *사용자 승인 후 실행* 표기).
|
|
239
277
|
|
|
240
278
|
#### UX/UI 영역 분리 + 검증 방식 매트릭스 (UX/UI 구현 task 한정)
|
|
241
279
|
|
|
@@ -257,6 +295,8 @@ Test Plan = *본 task에서 구현한 요구사항이 정상 동작하는지*
|
|
|
257
295
|
- ❌ `5번 실패하면 잠긴다 | 잠금이 정상 동작함`
|
|
258
296
|
- ✅ `틀린 비번 5회 POST → 6번째 응답코드 == 423 + body에 retry_after. 4번째는 401(미잠금).`
|
|
259
297
|
|
|
298
|
+
- **기대값 출처 표기 (UX/UI task 한정)** — 모든 `[AUTO]` PASS 기준 끝에 출처를 단다: `(출처: 목업 §N / Req N)`. 출처를 못 다는 기대값 = 승인 근거 없는 추정 — 숨기지 말고 `(출처 없음 — 사용자 확인 필요)`로 표기해 Step 7 합의 때 *사용자 확인 항목*으로 분리 제시한다. task-test가 문 앞 검사에서 출처 표기 유무를 확인한다(룰 11).
|
|
299
|
+
|
|
260
300
|
```markdown
|
|
261
301
|
## Test Plan
|
|
262
302
|
|
|
@@ -323,6 +363,78 @@ Test Plan 작성 완료 후 *반드시* 점검 단계 수행. *"누적/리셋
|
|
|
323
363
|
- `## 테스트 명령` (테스트 실행 — 단위/통합/E2E)
|
|
324
364
|
- `.project/rules/TEST_RULE.local.md` (각 방식의 *이 프로젝트 실제 실행 방법*)
|
|
325
365
|
|
|
366
|
+
### Step 5-B — Test Plan 출제 분리 (분리 적용 태스크 한정 — Step 2.5)
|
|
367
|
+
|
|
368
|
+
Step 5를 A(메인)가 작성하는 대신, **격리 서브에이전트 B**가 Requirements 합의문 + 승인 목업 + `TEST_RULE.local.md` **만** 입력으로 Test Plan을 출제한다.
|
|
369
|
+
|
|
370
|
+
#### 1. B 기동 (서브에이전트 격리 호출)
|
|
371
|
+
|
|
372
|
+
prompt는 자기완결적 — 아래 펜스 그대로. 메인 컨텍스트(Scope·Dev Plan·코드 지식) 일체 안 들어감.
|
|
373
|
+
|
|
374
|
+
**B prompt 본문 (정확히 이 형식)**:
|
|
375
|
+
|
|
376
|
+
```
|
|
377
|
+
당신은 격리 세션의 Test Plan 출제자입니다. 이 prompt에 명시된 자료만 보고, 구현 계획·코드에 대한 어떤 가정도 없이 검증 시나리오를 출제합니다.
|
|
378
|
+
|
|
379
|
+
## 입력 (이것만 본다)
|
|
380
|
+
|
|
381
|
+
Requirements 합의문 (전문):
|
|
382
|
+
<REQUIREMENTS_INLINE>
|
|
383
|
+
|
|
384
|
+
승인된 목업 경로 (있을 때만): <ABSOLUTE_PATH_TO_MOCKUP>
|
|
385
|
+
이 프로젝트의 검증 규칙 (있을 때만): <ABSOLUTE_PATH_TO_TEST_RULE_LOCAL_MD>
|
|
386
|
+
|
|
387
|
+
위 자료 외 참조 금지 — task 문서·코드·기타 문서를 열지 않습니다. Requirements에 적힌 것만 검증 대상입니다 (적히지 않은 요구를 추정해 시나리오를 만들지 않는다).
|
|
388
|
+
검증 규칙 파일이 경로로 주어졌으면 반드시 Read — ① 방식별 실행 경로(각 방식을 이 프로젝트에서 실제로 어떻게 돌리나) ② 테스트 실행 환경(점유 스위트 격리 경로·사용자 결정 기록) ③ 범위·방식 정책.
|
|
389
|
+
|
|
390
|
+
## 출제 룰
|
|
391
|
+
|
|
392
|
+
1. **시나리오 형식 = [실제 실행할 명령/입력] + [구체적·관측 가능한 기대값] 한 쌍 강제.** "정상 동작 / 잘 됨 / 확인한다" 같은 소원은 기대값이 아님. 장면 쪼개기 — 한 덩어리 금지, 진짜 떨어질 장면 여러 개로 분해.
|
|
393
|
+
2. **방식 선택은 기계적으로** — 화면 신규·변경=시각(캡처-목업 대조) / 클릭·입력 상호작용=UI 동작 / 엔드포인트=API 호출 / 데이터 쓰기·변경=사이드 이펙트 조회 / 순수 계산·변환=입출력 비교 / 기존 영역 접촉=회귀. 여러 개 걸리면 다 붙인다.
|
|
394
|
+
3. **방식 칸은 검증 규칙의 "방식별 실행 경로" 절에 등재된 경로로 채운다.** 필요한 방식의 등재 경로가 없으면 그 칸에 "등재 경로 없음 — 메인 확인 필요"라고 적는다 (실행 경로를 지어내지 않는다).
|
|
395
|
+
4. **어서션 정면성** — 기대값이 요구사항 자체를 관측해야 한다. "벗어날 수 없다"가 요구면 실제로 벗어나 보는 것이 정면이고, 버튼 disabled 확인 같은 우회 지표는 통로가 열려 있어도 통과하므로 PASS 기준이 될 수 없다.
|
|
396
|
+
5. **기대값 출처 표기** — UX/UI 요구의 모든 [AUTO] PASS 기준 끝에 출처를 단다: (출처: 목업 §N / Req N). 출처를 달 수 없는 기대값은 (출처 없음 — 사용자 확인 필요)로 표기한다 (추정 은폐 금지).
|
|
397
|
+
6. **화면·입력 점유 스위트**(XCUITest·headed 브라우저 E2E 등)는 검증 규칙 "테스트 실행 환경" 절의 *현재 기록* 기준으로 분류한다 — 격리 실행 경로 선언 있음=[AUTO] / "없음 — 매번 승인" 기록 또는 무기록=시나리오에 "사용자 승인 후 실행" 표기. 사용자에게 물을 수 없으므로 질문이 필요한 판단은 메인 몫으로 남긴다.
|
|
398
|
+
7. **grep/Read-only 존재 확인 시나리오 = 보조용** — 단독 PASS 가치 없음. Requirements 각 항목당 end-to-end 실동작 시나리오 최소 1개.
|
|
399
|
+
|
|
400
|
+
## 출력 형식 (이 포맷 그대로 리턴)
|
|
401
|
+
|
|
402
|
+
## Test Plan
|
|
403
|
+
|
|
404
|
+
| # | 시나리오 | 분류 | 방식 | PASS 기준 (구체적 기대값) |
|
|
405
|
+
|---|---------|------|------|----------|
|
|
406
|
+
| 1 | <쪼갠 장면 한 줄> | [AUTO] / [USER] | <등재 경로 기반 방식> | <관측 가능한 구체값 (출처: ...)> |
|
|
407
|
+
|
|
408
|
+
### Requirements ↔ Test Plan 매트릭스
|
|
409
|
+
|
|
410
|
+
| 요구사항 | 커버 시나리오 # |
|
|
411
|
+
|---------|----------------|
|
|
412
|
+
| <Req 한 줄> | #N |
|
|
413
|
+
|
|
414
|
+
## 종료 조건
|
|
415
|
+
|
|
416
|
+
위 형식 그대로 리턴 후 종료. 코드·문서 수정 금지 — 출제만.
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
**구현 디테일**:
|
|
420
|
+
- `<REQUIREMENTS_INLINE>` 자리에 Step 2에서 합의된 `## Requirements` 섹션 **전문을 그대로 인라인** (경로 아님 — B가 task 문서를 열지 않게).
|
|
421
|
+
- 목업 경로는 Step 4.5 승인 완료본이 있을 때만, `TEST_RULE.local.md` 경로는 파일 실재 시만 삽입 — 없으면 그 줄 자체를 제외한다 (task-test Step 3과 동일 방식).
|
|
422
|
+
- **코덱스 spawn (플랫폼 패리티)**: `.codex/agents/test-plan-author.toml`의 `test-plan-author` 서브에이전트로 spawn + 위 펜스 전체를 그대로 전달 (task-test의 `task-tester`와 동일 패턴 — 펜스가 양 플랫폼 공통 단일 룰 소스).
|
|
423
|
+
|
|
424
|
+
#### 2. B 원문 독립 보존
|
|
425
|
+
|
|
426
|
+
B 산출을 받으면 **그대로** `.project/tasks/<NNN_slug>/<NNN>_<slug>_test-plan-origin.md`에 Write한다 — 수정 금지. 위치는 plan 폴더 공통(spec-diffs·mockup과 동일 — 폴더 승격 무관, `TASK_DOC_RULE` §1.5). task-test 시험지 오염 대조(룰 18)의 기준 사본이며, closed 잠금 밖의 역사 자료다.
|
|
427
|
+
|
|
428
|
+
#### 3. A 검토 (수정권 = 방식 칸만) + 반영
|
|
429
|
+
|
|
430
|
+
- A의 수정권 = Test Plan 표 **방식 칸만**, 그것도 `TEST_RULE.local.md` 등재 경로로 교체할 때만. **시나리오 칸·PASS 기준 칸은 불가침.**
|
|
431
|
+
- 교체한 칸에 플래그 3요소 강제: `【A수정 · 원안: "<B 원문>" · 근거: TEST_RULE.local.md §<절>】` — 무플래그 수정은 task-test가 시험지 오염으로 즉시 반려한다.
|
|
432
|
+
- A가 처리하지 않고 **사용자에게 보고**하는 3케이스:
|
|
433
|
+
1. 등재 어느 경로로도 확인 불가 (도구 부재)
|
|
434
|
+
2. 방식 교체가 PASS 기준 문구 변경을 수반
|
|
435
|
+
3. B의 기대값이 A의 이해와 충돌하거나 터무니없음 — **해석 분기 신호**다. 고치지 말고 드러낸다 (드러내는 것이 분리의 목적).
|
|
436
|
+
- 검토 후 Test Plan 섹션을 task 문서에 반영. "사용자 승인 후 실행" 점유 스위트가 있고 그 원인이 *테스트 실행 환경* 절 무기록이면, Step 7 자리에서 출구 질문(카탈로그의 점유 동작 스위트 5단계 절차 4)을 사용자와 진행한다.
|
|
437
|
+
|
|
326
438
|
### Step 6 — spec-diff 처리 (Phase 0 변경 있을 시)
|
|
327
439
|
|
|
328
440
|
1. `.project/tasks/<NNN_slug>/spec-diffs/` 디렉토리 존재 확인 (없으면 `mkdir -p`).
|
|
@@ -343,10 +455,11 @@ Test Plan 작성 완료 후 *반드시* 점검 단계 수행. *"누적/리셋
|
|
|
343
455
|
|
|
344
456
|
### Step 7 — 사용자 합의 + 상태 전이
|
|
345
457
|
|
|
346
|
-
1. 작성된 4 섹션 보여주기 — *"이렇게 가자?"* 합의 요청.
|
|
458
|
+
1. 작성된 4 섹션 보여주기 — *"이렇게 가자?"* 합의 요청. **분리 적용 태스크는 추가로**: B 원문(origin)과 반영본의 차이(A수정 플래그 칸)·Step 5-B의 사용자 보고 3케이스·`(출처 없음 — 사용자 확인 필요)` 기대값을 명시 제시하고, 출구 질문이 남아 있으면(점유 스위트 무기록) 여기서 1회 진행한다. **`(출처 없음)` 기대값을 사용자가 확인해 주면 그 칸의 출처를 `(출처: 사용자 확인 YYYY-MM-DD)`로 갱신한다** (origin과 달라지므로 `【사용자결정 · 원안: "…"】` 플래그 — 그대로 두면 task-test 문 앞 검사(룰 11)가 자격 미달로 반려한다).
|
|
347
459
|
2. 사용자 *"OK"* / *"수정해줘"* 응답:
|
|
348
460
|
- **OK** → Step 8 진행.
|
|
349
461
|
- **수정 요청** → 해당 섹션 수정 후 다시 합의. 한도 없이 반복 OK (반복 잦으면 task 분리/규모 재조정 검토).
|
|
462
|
+
- **Test Plan 칸이 사용자 결정으로 바뀌면** (기대값 충돌 해소 등) 그 칸에 플래그를 단다: `【사용자결정 · 원안: "<원문>"】` — origin과 달라지는 정당 경로도 표기해야 task-test 오염 대조(무플래그 차이 = 무조건 오염)를 통과한다.
|
|
350
463
|
3. 합의 완료 후 `set_status` 도구로 `planned` 전이 (또는 `npx @angar2/taskery set-status TASK-<NNN> planned`) — 헤더 상태 전이(유효전이 코드 검증). (Test Plan 보수 모드는 `testing` 유지 — 전이 호출 X.)
|
|
351
464
|
|
|
352
465
|
### Step 8 — 결과 보고
|
|
@@ -354,6 +467,7 @@ Test Plan 작성 완료 후 *반드시* 점검 단계 수행. *"누적/리셋
|
|
|
354
467
|
```
|
|
355
468
|
✅ TASK-<NNN> 기획 완료
|
|
356
469
|
- Requirements / Scope / Dev Plan / Test Plan 작성
|
|
470
|
+
- 출제 분리: <적용 (B 출제 · origin 보존 · A수정 N칸) / 비적용>
|
|
357
471
|
- 상태: draft → planned
|
|
358
472
|
- Phase 수: <N>개 (규모: <X>)
|
|
359
473
|
- spec-diff: <있음 / 없음>
|
|
@@ -365,8 +479,9 @@ Test Plan 작성 완료 후 *반드시* 점검 단계 수행. *"누적/리셋
|
|
|
365
479
|
- **Read**: task 파일 / `.project/` 루트 제품 관통 문서 / 관련 코드 정독
|
|
366
480
|
- **Grep / Glob**: Scope 코드 서치 (관련 함수/파일 탐색)
|
|
367
481
|
- **Edit**: task 파일 4 섹션 채우기
|
|
482
|
+
- **서브에이전트 격리 호출**: Step 5-B의 B 출제 (분리 적용 태스크 한정 — 코덱스는 `test-plan-author`)
|
|
368
483
|
- **Bash / 도구**: `set_status` 도구(또는 `npx @angar2/taskery set-status`) status 전이 (유효전이 코드 검증)
|
|
369
|
-
- **Write**: spec-diff 파일 (Phase 0 변경 시)
|
|
484
|
+
- **Write**: spec-diff 파일 (Phase 0 변경 시) / B 원문 보존 파일 (`<NNN>_<slug>_test-plan-origin.md`)
|
|
370
485
|
- **AskUserQuestion**: Requirements 증폭 confirm / 합의 단계 / Phase 분할 검토
|
|
371
486
|
|
|
372
487
|
## 주의사항
|
|
@@ -72,8 +72,9 @@ Task tool로 sub-agent spawn. prompt는 *자기완결적* — task.md 경로 +
|
|
|
72
72
|
|
|
73
73
|
task 파일 경로: <ABSOLUTE_PATH_TO_TASK_MD>
|
|
74
74
|
이 프로젝트의 검증 규칙(있을 때만): <ABSOLUTE_PATH_TO_TEST_RULE_LOCAL_MD>
|
|
75
|
+
시험지 원본(있을 때만): <ABSOLUTE_PATH_TO_TEST_PLAN_ORIGIN_MD>
|
|
75
76
|
|
|
76
|
-
task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별 완료 기준을 정독하세요. 위에 경로로 명시된 문서(task 파일 · 검증 규칙) + 목업 외 다른 문서 참조 X.
|
|
77
|
+
task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별 완료 기준을 정독하세요. 위에 경로로 명시된 문서(task 파일 · 검증 규칙 · 시험지 원본) + 목업 외 다른 문서 참조 X.
|
|
77
78
|
(단 task.md가 `mockup/<task-doc-name>-mockup.html` 참조하면 해당 목업 파일도 직접 Read — *승인된 목업 = 시각 시나리오의 정답지*입니다. 시각 시나리오 = 실제 화면 캡처 → 이 목업과 자동 대조.)
|
|
78
79
|
검증 규칙 파일(`TEST_RULE.local.md`)이 경로로 주어졌으면 반드시 Read한다 — 두 가지가 그 안에 있다. ① *방식별 실행 경로*: 각 테스트 방식을 이 프로젝트에서 실제로 어떻게 돌리나(DB 조회 경로 / API 호출법 / E2E 셋업 / 시각 실행 / 격리 실행 환경). ② *범위·방식 정책*: 무엇을 얼마나 검증하나. 위 수행 룰과 겹치는 항목은 그쪽을 우선하고, 겹치지 않는 조항도 그대로 준수한다(멀티세션 불변식·안전 조항 제외). 경로가 주어지지 않았으면 그 프로젝트에 아직 규칙이 없다는 뜻이므로, 실행 경로를 스스로 지어내지 말고 확인 불가한 시나리오는 실행 보류로 리턴한다.
|
|
79
80
|
|
|
@@ -86,10 +87,10 @@ task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별
|
|
|
86
87
|
5. `AGENTS.md` `## 검증 명령` (빌드/린트/타입체크) + `## 테스트 명령` (단위/통합/E2E 테스트) 둘 다 직접 실행 + 결과 리턴. **단 값이 `<예:` 로 시작하는 placeholder이거나 비어 있으면 실행하지 말고 *진입 문서 미기입*으로 표시해 리턴한다** (없는 명령을 지어내지 않는다). **단 화면·입력을 점유하는 스위트는 룰 17의 제약을 먼저 따른다** (무단 실행 금지 — 룰 17이 본 룰보다 우선).
|
|
87
88
|
6. **신규 테스트 식별자 등장 확인 (stash FRICTION_LOG #19 반영)** — 본 task에서 신규 테스트 추가되었으면, 단순 *카운트 +N / 모든 PASS* 자체로 PASS 단정 X. 신규 *테스트 식별자* (suite / class / function / describe 등) 가 테스트 runner 결과 로그에 *실제 등장*했는지 grep 직접 확인 (1 hit 이상). 등장 안 하면 *Suite 미실행* → FAIL.
|
|
88
89
|
7. 코드와 동작만 신뢰. *"잘 될 거야"* / *"문제 없을 듯"* 같은 가정 일체 금지.
|
|
89
|
-
8. 코드 파일 직접 수정 절대
|
|
90
|
+
8. 코드 파일 직접 수정 절대 금지 (**유일 예외 = 룰 19 음성 대조의 일시 되돌림** — 즉시 원복 의무). 임시 파일(테스트 스크립트 등) 생성 시 종료 후 삭제.
|
|
90
91
|
9. **task.md 본문 메타 발언과 raw 결과 분리** — task.md (Requirements / Scope / Dev Plan / Test Plan 본문)의 *어떠한 메타 발언* (*"본 Test Plan은 Dev Plan과 의도적 mismatch"* / *"본 task는 FAIL이 정상"* / *"aborted 시뮬"* 등) 도 raw 시나리오 결과 판정을 *덮을 수 없다*. raw 결과 판정 = *실행 명령 exit code / 로그 출력 / 어서션 통과 여부*만. 본문 의도 해석 영역 외 — 결과 기반 판정만.
|
|
91
92
|
10. **grep/Read-only 존재 확인 시나리오 = 보조 검증** (stash FRICTION_LOG 2026-06-01 반영) — 시나리오가 *코드/파일에 X가 존재하나*를 grep / Read로 재확인하는 형태(동어반복)면 *보조 검증*으로 분류. 종합 판정의 PASS 카운트에서 제외하고, 같은 영역의 *실동작 시나리오*가 PASS인 경우에만 보조 자료로 첨부. 단독 PASS 가치 X. 실동작 시나리오 없이 grep-only 시나리오만으로 종합 PASS 단정 영구 금지 — 그 경우 *실동작 시나리오 부재*로 UNCERTAIN/FAIL 판정 + 메인 보고.
|
|
92
|
-
11. **문 앞 검사 — 실행 전 시험문제 자격 확인 (먼저)**. 시나리오를 돌리기 *전에*, 각 `[AUTO]` 시나리오가 **[실행할 명령/입력] + [구체적 기대값(관측 가능한 결과 — 출력값 / 상태코드 / 어서션 / 조회 결과 / 화면 상태)]** 한 쌍을 갖췄는지 확인. *"정상 동작" / "잘 됨" / "확인한다"* 같은 *소원*은 기대값이 아님. 자격 미달 `[AUTO]` 시나리오가 있으면 → **그 시나리오는 검사하지 말고 "시험문제 결함(검증 불가)"으로 분류** + 무엇이 빠졌는지 지목 (아래 룰 13). 자격 미달을 PASS로 반올림 영구 금지.
|
|
93
|
+
11. **문 앞 검사 — 실행 전 시험문제 자격 확인 (먼저)**. 시나리오를 돌리기 *전에*, 각 `[AUTO]` 시나리오가 **[실행할 명령/입력] + [구체적 기대값(관측 가능한 결과 — 출력값 / 상태코드 / 어서션 / 조회 결과 / 화면 상태)]** 한 쌍을 갖췄는지 확인. *"정상 동작" / "잘 됨" / "확인한다"* 같은 *소원*은 기대값이 아님. **UX/UI task의 `[AUTO]` 기대값은 출처 표기(`(출처: 목업 §N / Req N)`)도 자격 요건** — 무표기 또는 `(출처 없음 — 사용자 확인 필요)` 잔존은 승인 근거 없는 추정이므로 자격 미달. 자격 미달 `[AUTO]` 시나리오가 있으면 → **그 시나리오는 검사하지 말고 "시험문제 결함(검증 불가)"으로 분류** + 무엇이 빠졌는지 지목 (아래 룰 13). 자격 미달을 PASS로 반올림 영구 금지.
|
|
93
94
|
12. **증거 일치 시만 PASS**. 자격을 갖춘 `[AUTO]` 시나리오는 *실제로 실행*하여 — *관측한 결과가 기대값과 일치할 때만* PASS. 코드 정독 "그럴듯함" / 추정 / "될 듯"으로 PASS 영구 금지. 증거(명령 출력 · 응답 로그 · 캡처 · 조회 결과)를 결과 표 근거 칸에 첨부.
|
|
94
95
|
13. **UNCERTAIN 세 종류 — 섞지 말 것**.
|
|
95
96
|
- **UNCERTAIN(사람 검수)** — 정답지가 *주관*인 영역(룰 4: 시각 미세 취향 / UX 느낌). 정상. 사용자 직접 검수 항목으로 리턴 (증거 캡처 첨부).
|
|
@@ -102,6 +103,13 @@ task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별
|
|
|
102
103
|
|
|
103
104
|
17. **화면·입력 점유 스위트 자동 실행 금지**. 실제 앱을 띄워 UI를 자동 조작하는 스위트(XCUITest·headed 브라우저 E2E 등)는 사용자의 화면·마우스·키보드를 점유해 작업을 중단시킨다. TEST_RULE.local.md *테스트 실행 환경* 절에 **격리 실행 경로**(창 숨김·헤드리스 플래그 / 컨테이너·가상 디스플레이 / VM / CI 러너)가 선언돼 있으면 그 경로로 실행한다. 선언이 없으면 — 비점유 부분만 한정 실행할 수 있으면 그것만 실행하고, 한정 수단도 없으면 **실행하지 말고** 해당 시나리오를 *실행 보류(사용자 승인 필요)*로 표시해 메인에 리턴한다 (무단 실행 금지). 헤드리스 모드가 있으면 항상 그쪽을 쓴다.
|
|
104
105
|
|
|
106
|
+
18. **시험지 오염 대조 (시험지 원본 경로가 주어졌을 때 — 먼저)**. 원본 파일을 Read → task.md `## Test Plan` 표와 *칸 단위*로 대조한다.
|
|
107
|
+
- **무플래그 차이 = 무조건 오염** — 어느 칸이든 원본과 다른데 플래그(`【…】`)가 없으면 **시험지 오염**으로 즉시 반려.
|
|
108
|
+
- **플래그 칸은 종류별 검증** — `【A수정 · 원안: "…" · 근거: TEST_RULE.local.md §…】`는 *방식 칸만* 허용(원안 문자열이 원본과 일치해야 하며, 시나리오·PASS 기준 칸의 A수정 플래그 = 오염). `【사용자결정 · 원안: "…"】`·`【보수 · 원안: "…"】`는 허용 경로 — 원안 표기가 원본과 일치하는지만 확인.
|
|
109
|
+
- **방식 교체를 빙자한 침범** — A수정 플래그 칸에서 방식 외(기대값·시나리오 의미)가 함께 바뀌었으면 오염.
|
|
110
|
+
- 오염 판정 = UNCERTAIN(검증 불가) 계열 + **"시험지 오염" 라벨**로 리턴 — 어느 칸이 어떻게 다른지 명시. 오염이 없으면 통상 검증을 계속한다.
|
|
111
|
+
19. **음성 대조 (핵심 시나리오 최소 1개 — 룰 8의 명시 예외)**. 핵심 시나리오 1개 이상은 구현 코드를 Edit로 *일시 되돌린* 상태에서 그 시나리오가 **실제로 FAIL함**을 확인한 후 즉시 원복하고, 그 사실을 통과 근거에 포함한다 — 테스트가 버그를 잡을 수 있음의 증명(통과만 보면 무력한 테스트를 모른다). git 명령 금지 — Edit 원복만. **종료 시 되돌림 흔적 0 의무** (원복 후 스스로 diff 확인). 되돌리기가 위험한 영역(마이그레이션·전역 상태·파괴적 사이드 이펙트)이면 생략 + 사유 기록.
|
|
112
|
+
|
|
105
113
|
## 결과 형식 (이 포맷 그대로 리턴)
|
|
106
114
|
|
|
107
115
|
### 종합 판정
|
|
@@ -141,6 +149,13 @@ task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별
|
|
|
141
149
|
- <시나리오 N: 무엇이 [AUTO]인데 기대값을 못 만들었나 + 무엇을 시도했나 + 왜 불가한가>
|
|
142
150
|
→ task-plan으로 Test Plan 보수 필요 (이 시나리오를 [실행 명령 + 구체적 기대값]으로 다시 작성).
|
|
143
151
|
|
|
152
|
+
### 시험지 오염 (UNCERTAIN 검증 불가 · 오염 라벨 — 룰 18 해당 시)
|
|
153
|
+
- <어느 칸이 원본과 어떻게 다른가 + 플래그 유무 + 원안↔현재 인용>
|
|
154
|
+
→ 메인이 원본 기준 복원 + 사용자 보고 필요.
|
|
155
|
+
|
|
156
|
+
### 음성 대조 결과 (룰 19 — 수행 시)
|
|
157
|
+
- <어느 시나리오를 어떤 되돌림으로 FAIL 확인했나 + 원복 확인(diff 무변) / 생략 시 사유>
|
|
158
|
+
|
|
144
159
|
### 실행 보류 (UNCERTAIN 실행 보류 — 해당 시)
|
|
145
160
|
- <어느 시나리오/명령을 실행하지 않았나 + 무엇을 점유하는가(화면·마우스·키보드·전역 단축키 등) + 비점유 부분만 실행했다면 그 범위>
|
|
146
161
|
→ 메인이 사용자 승인을 받아 실행하거나, TEST_RULE.local.md *테스트 실행 환경* 절에 격리 실행 경로를 마련한 뒤 재검증 필요.
|
|
@@ -153,6 +168,8 @@ task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별
|
|
|
153
168
|
**구현 디테일**:
|
|
154
169
|
- `<ABSOLUTE_PATH_TO_TASK_MD>` 자리에 `.project/tasks/<NNN_slug>/<NNN>_<slug>.md` (또는 폴더 승격 시 `<...>/task.md`)의 절대 경로 삽입.
|
|
155
170
|
- `<ABSOLUTE_PATH_TO_TEST_RULE_LOCAL_MD>` 자리에 `$MAIN_WT/.project/rules/TEST_RULE.local.md`의 절대 경로 삽입 (위 "멀티세션 메타 위치"의 `MAIN_WT` 사용 — 워크트리에서 호출돼도 메인 워크트리의 단일 소스를 읽도록). **파일이 없으면 그 줄 자체를 prompt에서 제외**한다 (없는 경로를 넘기면 격리 세션이 헤맨다). 0.7.0 이전 리포라 파일이 없고 구형 `$MAIN_WT/.project/TEST-GUIDE.md`가 남아 있으면 **그 경로를 대신 넘기고**, 메인은 사용자에게 `TEST_RULE.local.md`로의 이행을 1회 제안한다.
|
|
171
|
+
- `<ABSOLUTE_PATH_TO_TEST_PLAN_ORIGIN_MD>` 자리에 `.project/tasks/<NNN_slug>/<NNN>_<slug>_test-plan-origin.md`(출제 분리 태스크의 B 원문 — task-plan Step 5-B가 생성)의 절대 경로 삽입. **파일이 없으면 그 줄 자체를 prompt에서 제외**한다 (분리 비적용 태스크 — 룰 18 자체가 발동하지 않음).
|
|
172
|
+
- **메인 측 원복 안전망 (룰 19)**: 격리 세션 기동 *직전* 워크트리 스냅샷을 뜬다 — ① `git -C "$WT_PATH" diff` 출력 해시 ② `git -C "$WT_PATH" status --porcelain -uall` 목록 ③ 미추적 파일 각각의 내용 해시. 리턴 *직후* 같은 방식으로 재계산해 대조하고, 불일치(격리 세션의 되돌림 미원복·잔재) 시 사용자 보고. ①만으로는 부족하다 — task-dev 시점 변경분은 미커밋이라 *신규 파일*이 `git diff`에 안 잡힌다(②③까지 합산해야 원복 실패를 잡는다).
|
|
156
173
|
- Task tool의 `subagent_type`: `general-purpose` (도구 풀 다 필요).
|
|
157
174
|
- Task tool의 `description`: `Isolated test for TASK-<NNN>`.
|
|
158
175
|
- **코덱스 spawn (플랫폼 패리티)**: 코덱스에선 `.codex/agents/task-tester.toml`의 `task-tester` 서브에이전트로 spawn하되, *위 펜스 전체를 task prompt로 그대로 전달*한다 — 펜스가 양 플랫폼 공통 단일 룰 소스다(클로드 = `general-purpose` + 펜스 / 코덱스 = `task-tester` + 펜스, 동일 효과). `task-tester`의 `developer_instructions`는 같은 룰의 코덱스 기준선 미러 — 본 펜스의 수행 룰을 바꾸면 그 `developer_instructions`도 함께 갱신한다.
|
|
@@ -225,6 +242,7 @@ task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별
|
|
|
225
242
|
→ /task-plan 으로 Test Plan만 보수 (이 시나리오를 [실행 명령 + 구체적 기대값]으로 다시 작성) → 보수 후 /task-test 재실행
|
|
226
243
|
```
|
|
227
244
|
3. `/task-plan`은 *Test Plan 섹션만* 보수 (Requirements / Scope / Dev Plan / 코드 보존). 보수 후 `/task-test` 재실행 (코드 미변경이므로 `/task-dev` 재실행 없음). status는 `testing` 유지.
|
|
245
|
+
4. **"시험지 오염" 라벨(룰 18)인 경우** — Test Plan 보수가 아니라 **메인이 origin(`<NNN>_<slug>_test-plan-origin.md`) 기준으로 task.md Test Plan을 복원**한 후 `/task-test` 재실행. 사용자 보고에 귀책을 명시한다: 오염 칸에 플래그 有 → A 수정 귀책 / 결함이 origin 그대로의 칸이면 → B 출제 품질 (원안의 사후 귀책 평가). 무플래그 오염은 발생 자체가 규약 위반이므로 경위를 함께 보고한다.
|
|
228
246
|
|
|
229
247
|
#### UNCERTAIN(실행 보류) 분기 — 환경 제약 → 승인 또는 격리 경로
|
|
230
248
|
|
|
@@ -243,6 +261,7 @@ task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별
|
|
|
243
261
|
3. "격리 경로 만들자" — 창 숨김·헤드리스 / 컨테이너 / VM / CI 중 하나를 마련 후 재검증 (다음 task부터 승인 없이 자동 실행됨)
|
|
244
262
|
4. "보류인 채로 마무리해" — 미검증 영역으로 명시하고 tested 전이 (위험: 이 영역은 검증 안 된 채 closed)
|
|
245
263
|
```
|
|
264
|
+
단, `TEST_RULE.local.md` *테스트 실행 환경* 절에 *"없음 — 매번 승인(사용자 결정 …)"*이 이미 기록돼 있으면 선택지 3("격리 경로 만들자")을 새 제안처럼 내지 않는다 — 이미 내린 결정이다. 승인 여부(1·2·4)만 묻는다.
|
|
246
265
|
3. 사용자 응답별 처리:
|
|
247
266
|
- **"지금 돌려"** → 승인받았으므로 점유 스위트를 실행하고, 그 결과로 PASS / FAIL 분기를 따른다.
|
|
248
267
|
- **"나중에"** → 보류 유지. status는 `testing` 그대로 두고 **여기서 멈춘다** (`/task-close`로 넘어가지 않는다 — close는 `tested`가 아니면 `blocked:'status'`로 차단된다). 사용자가 자리를 비운 뒤 *"이제 돌려"* 하면 위 "지금 돌려"로 재개.
|