@angar2/taskery 0.6.1 → 0.8.0
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/README.md +11 -9
- package/bin/close.js +13 -1
- package/bin/init.js +7 -2
- package/bin/lib.js +238 -52
- package/bin/mcp.js +2 -2
- package/bin/migrate.js +344 -0
- package/bin/plan.js +61 -21
- package/bin/set-status.js +18 -3
- package/bin/status.js +12 -0
- package/bin/taskery.js +7 -2
- package/bin/update.js +75 -0
- package/package.json +1 -1
- package/template/.claude/skills/run-team/SKILL.md +4 -4
- package/template/.codex/agents/task-tester.toml +14 -8
- package/template/.codex/agents/test-plan-author.toml +34 -0
- package/template/.project/rules/CHANGELOG_RULE.md +27 -21
- package/template/.project/rules/GIT_RULE.md +7 -4
- package/template/.project/rules/MOCKUP_RULE.md +1 -1
- package/template/.project/rules/TASKERY_RULE.md +237 -0
- package/template/.project/rules/TASK_DOC_RULE.md +14 -3
- package/template/AGENTS.md +26 -179
- package/template/CLAUDE.md +1 -208
- package/template/shared/skills/log-friction/SKILL.md +21 -1
- package/template/shared/skills/plan-init/SKILL.md +8 -8
- package/template/shared/skills/project-init/SKILL.md +80 -43
- package/template/shared/skills/task-close/SKILL.md +24 -14
- package/template/shared/skills/task-dev/SKILL.md +17 -16
- package/template/shared/skills/task-init/SKILL.md +3 -3
- package/template/shared/skills/task-plan/SKILL.md +134 -19
- package/template/shared/skills/task-test/SKILL.md +39 -22
- package/template/.project/FRICTION_LOG.md +0 -16
- package/template/.project/TEST-GUIDE.md +0 -62
|
@@ -7,13 +7,13 @@ 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
|
|
|
14
14
|
## 멀티세션 메타 위치 (0.1.2+)
|
|
15
15
|
|
|
16
|
-
본 스킬은 워크트리에서 호출되는 게 default (멀티세션 — 각 워크트리 = 독립 세션). 다만 호출 위치 자유 — 메인 cwd / 서브 세션 호출 등 다른 운영 모델에서도 cwd 무관 동작. 메타(`.project/`, `
|
|
16
|
+
본 스킬은 워크트리에서 호출되는 게 default (멀티세션 — 각 워크트리 = 독립 세션). 다만 호출 위치 자유 — 메인 cwd / 서브 세션 호출 등 다른 운영 모델에서도 cwd 무관 동작. 메타(`.project/`, `AGENTS.md`) 접근 시 **메인 워크트리 절대 경로** 우선 — *task 문서 단일 진실 소스* 유지.
|
|
17
17
|
|
|
18
18
|
```sh
|
|
19
19
|
MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
|
|
@@ -23,8 +23,8 @@ MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
|
|
|
23
23
|
|
|
24
24
|
| 케이스 | task 문서 위치 | 제품 관통 문서 위치 | 동시 쓰기 |
|
|
25
25
|
|--------|--------------|----------------|----------|
|
|
26
|
-
| 등록 (
|
|
27
|
-
| 미등록 | `$WT_PATH/.project/tasks/<NNN_slug>/...` (워크트리 안, 머지 시 부모 브랜치 반영) | `$MAIN_WT/.project/<doc>.md` (제품 문서는 여전히 단일 소스) | 단일 세션 가정 (워크트리 내부) |
|
|
26
|
+
| 등록 (`.project/`가 `.gitignore`에 있음) | `$MAIN_WT/.project/tasks/<NNN_slug>/...` | `$MAIN_WT/.project/<doc>.md` (루트 평평) | `withMetaLock` (`bin/lib.js`) |
|
|
27
|
+
| 미등록 (**기본 설치값** — `fork`/`status` 반환의 `registered:false`) | `$WT_PATH/.project/tasks/<NNN_slug>/...` (워크트리 안, 머지 시 부모 브랜치 반영) | `$MAIN_WT/.project/<doc>.md` (제품 문서는 여전히 단일 소스) | 단일 세션 가정 (워크트리 내부) |
|
|
28
28
|
|
|
29
29
|
본문 모든 `.project/...` 경로는 *위 분기에 따라* 적용. spec-diff / mockup / screenshots는 task 문서와 같은 위치.
|
|
30
30
|
|
|
@@ -46,15 +46,15 @@ MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
|
|
|
46
46
|
|
|
47
47
|
### Step 1 — task 파일 + active plan 확인
|
|
48
48
|
|
|
49
|
-
1.
|
|
49
|
+
1. `status` 도구(또는 `npx @angar2/taskery status`)로 활성 plan 확인.
|
|
50
50
|
2. task 파일 Read:
|
|
51
51
|
- 인자 있음 → 해당 파일.
|
|
52
|
-
- 인자 없음 → `ls .project/tasks/<NNN_slug
|
|
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
|
-
4. **프로젝트 로컬 룰 확인** — `$MAIN_WT/.project/rules/TEST_RULE.local.md
|
|
57
|
+
4. **프로젝트 로컬 룰 확인** — `$MAIN_WT/.project/rules/TEST_RULE.local.md`를 Read한다. 모든 리포에 있어야 하는 필수 문서다(`TASKERY_RULE` §8) — **없으면 Step 5 실행 경로 확인 단계에서 생성**한다. 로컬 룰의 조항은 코어와 동등한 구속력을 가진다 — 겹치면 로컬이 최우선이고, **겹치지 않는 로컬 조항도 그대로 준수한다** (안전선 제외 — `TASKERY_RULE` §7).
|
|
58
58
|
|
|
59
59
|
### Step 2 — Requirements 인터뷰 + 증폭
|
|
60
60
|
|
|
@@ -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 목업 생성.
|
|
@@ -188,13 +217,15 @@ Step 2 Requirements 인터뷰 결과로 본 task가 *UX/UI 구현 (페이지/컴
|
|
|
188
217
|
승인된 목업 = task-test의 **시각 *자동 대조* 정답지** (+ 미세 취향은 사용자 최종 사인). 사용자가 맘에 들 때까지 승인 안 하므로 목업 = 이미 사용자가 검증한 정답지 — task-test 격리 세션이 *실제 화면 캡처 → 이 목업과 자동 대조*해 객관적 깨짐을 잡는다. Step 5 Test Plan 작성 시:
|
|
189
218
|
- **시각 *객관* 영역(레이아웃/요소 유무/색/배치) → `[AUTO]`** (캡처-목업 대조) + 목업 경로 참조 명시.
|
|
190
219
|
- **시각 *미세 취향*(2px·색조·느낌) → `[USER]`** (사용자 최종 사인, 증거 캡처).
|
|
191
|
-
- **`[AUTO]` 승격 조건 — 실행 경로 확인 필수**: 시각 객관 영역의 `[AUTO]` 분류는 `$MAIN_WT/.project/
|
|
220
|
+
- **`[AUTO]` 승격 조건 — 실행 경로 확인 필수**: 시각 객관 영역의 `[AUTO]` 분류는 `$MAIN_WT/.project/rules/TEST_RULE.local.md` *시각 실행* 절에 **이 프로젝트의 캡처 실행 경로가 적혀 있을 때만** 성립한다. 목업 존재는 *정답지 확보*일 뿐 *실행 경로 확보*가 아니다. 경로가 없거나, 앱 기동이 사용자 실데이터·전역 단축키·화면 입력을 건드리는 구조면 `[USER]` 폴백으로 둔다 (stash FRICTION 2026-07-27 — 경로 없는 `[AUTO]` 분류로 `/task-test` 2회 왕복). **다른 방식과 달리 시각은 경로가 없다고 사용자에게 도구 도입을 요구하며 멈추지 않는다** — 조용히 `[USER]`로 두고 진행한다. 자동화 도입 여부는 사용자가 원할 때 별도로 정한다.
|
|
192
221
|
(이전의 "승인 목업 = USER 검수 기준 / 시각=전부 [USER]"는 폐기 — 사용자에게 흠 사냥을 떠넘기던 원인.)
|
|
193
222
|
|
|
194
223
|
---
|
|
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,14 +266,21 @@ 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
|
|
|
242
280
|
| 영역 | 분류 | 기준 |
|
|
243
281
|
|------|------|------|
|
|
244
282
|
| 동작 (클릭/호버/드래그/입력 → 결과) | 도구 있고 *점유하지 않게 돌릴 경로*가 있으면 `[AUTO]` E2E, 없으면 `[USER]` 체크리스트 | 액션 후 관측되는 변화 |
|
|
245
|
-
| 시각 *객관* (레이아웃/요소 유무/색/배치 깨짐) |
|
|
283
|
+
| 시각 *객관* (레이아웃/요소 유무/색/배치 깨짐) | TEST_RULE.local.md에 캡처 실행 경로 **있으면** `[AUTO]` 캡처-목업 대조 (원칙), **없으면** `[USER]` 폴백 | 승인된 목업 (격리 세션이 화면 캡처 → 대조 → 어긋남 목록) |
|
|
246
284
|
| 시각 *미세 취향* (2px·색조·호버 강도·느낌) | `[USER]` 체크리스트 + 목업 참조 | 사용자 최종 사인 (증거 캡처 첨부) |
|
|
247
285
|
|
|
248
286
|
#### 시나리오 형식 — [명령/입력] + [구체적 기대값] 한 쌍 강제
|
|
@@ -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
|
|
|
@@ -309,19 +349,91 @@ Test Plan 작성 완료 후 *반드시* 점검 단계 수행. *"누적/리셋
|
|
|
309
349
|
|
|
310
350
|
방식을 골랐어도, **격리 세션이 *이 프로젝트의* DB/API/E2E에 실제로 어떻게 접근하는지 모르면 그 시나리오는 실행 불가능한 허울뿐인 명세다.** 스택마다 다르다(NestJS+TypeORM이면 그 DataSource/repository, 다른 프로젝트는 또 다름). 그래서 *모르면 묻고, 알면 재사용*:
|
|
311
351
|
|
|
312
|
-
1. 필요 방식마다 `$MAIN_WT/.project/
|
|
352
|
+
1. 필요 방식마다 `$MAIN_WT/.project/rules/TEST_RULE.local.md`를 Read → **이 프로젝트에 실행 경로가 적혀 있나** 확인. **데이터·API·E2E뿐 아니라 *시각(앱 기동 + 화면 캡처)* 방식도 동일하게 확인 대상이다** — 목업이 있다는 사실은 실행 경로 확보가 아니다.
|
|
313
353
|
2. **있으면** → 그 경로를 시나리오의 *방식* 칸에 반영(재사용). 앱은 기존 실행 명령으로 띄움.
|
|
314
354
|
3. **없으면** → *멈추고 사용자에게 요구*: 예) *"이 요구사항은 DB 검증이 필요한데 이 프로젝트에 실행 경로가 없다. 어떻게 검증할지 알려주거나 도구를 깔아줘."* → 사용자가 경로를 주거나 결정. **단 시각 방식은 예외** — 멈추지 않고 `[USER]` 폴백으로 두고 진행한다 (Step 4.5 §5 참조).
|
|
315
|
-
4. **확인받은 즉시 `
|
|
355
|
+
4. **확인받은 즉시 `TEST_RULE.local.md`에 기록** → 다음 task/세션부터 안 묻고 재사용. (재사용 = 기억이 아니라 *파일* — 세션/컴팩트로 사라지지 않게.)
|
|
316
356
|
|
|
317
|
-
>
|
|
357
|
+
> `TEST_RULE.local.md`는 `/project-init`이 골격을 만들어 둔다. 파일이 없으면(사후 도입·구형 리포) **본 단계에서 생성**한다 — 골격은 `TASKERY_RULE` §8 구성을 따른다. 방식별 섹션(데이터 검증 / API 호출 / UI·E2E / 시각 실행 / 기타)에 *이 프로젝트의 실제 실행 방법*을 채운다.
|
|
318
358
|
|
|
319
359
|
#### 검증/테스트 명령 참조
|
|
320
360
|
|
|
321
|
-
`/task-test` 격리 세션은
|
|
361
|
+
`/task-test` 격리 세션은 진입 문서(`AGENTS.md`)의 두 섹션 + `TEST_RULE.local.md`를 자동 참조 — Test Plan에 재인용 불필요:
|
|
322
362
|
- `## 검증 명령` (코드 상태 — 빌드/린트/타입체크)
|
|
323
363
|
- `## 테스트 명령` (테스트 실행 — 단위/통합/E2E)
|
|
324
|
-
- `.project/
|
|
364
|
+
- `.project/rules/TEST_RULE.local.md` (각 방식의 *이 프로젝트 실제 실행 방법*)
|
|
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)을 사용자와 진행한다.
|
|
325
437
|
|
|
326
438
|
### Step 6 — spec-diff 처리 (Phase 0 변경 있을 시)
|
|
327
439
|
|
|
@@ -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
|
## 주의사항
|
|
@@ -23,12 +23,12 @@ MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
|
|
|
23
23
|
|
|
24
24
|
| 케이스 | task 문서 위치 | 격리 세션 작업 디렉토리 |
|
|
25
25
|
|--------|--------------|---------------------|
|
|
26
|
-
| 등록 (
|
|
27
|
-
| 미등록 | `$WT_PATH/.project/tasks/<NNN_slug>/...` (워크트리 안) | `$WT_PATH` (워크트리) |
|
|
26
|
+
| 등록 (`.project/`가 `.gitignore`에 있음) | `$MAIN_WT/.project/tasks/<NNN_slug>/...` | `$WT_PATH` (워크트리 — 코드 변경 위치) |
|
|
27
|
+
| 미등록 (**기본 설치값** — `fork`/`status` 반환의 `registered:false`) | `$WT_PATH/.project/tasks/<NNN_slug>/...` (워크트리 안) | `$WT_PATH` (워크트리) |
|
|
28
28
|
|
|
29
|
-
격리 세션은 *워크트리 안*에서 검증/테스트 명령 실행 (`$MAIN_WT/
|
|
29
|
+
격리 세션은 *워크트리 안*에서 검증/테스트 명령 실행 (`$MAIN_WT/AGENTS.md`의 `## 검증 명령` / `## 테스트 명령` 단일 진실 소스).
|
|
30
30
|
|
|
31
|
-
**검증 방법 출처 = `$MAIN_WT/.project/
|
|
31
|
+
**검증 방법 출처 = `$MAIN_WT/.project/rules/TEST_RULE.local.md`** — 각 테스트 방식(데이터 조회 / API 호출 / E2E / 시각 실행)을 *이 프로젝트에서 실제로 어떻게 돌리나*가 적힌 단일 소스. 격리 세션 prompt에 task 문서 경로와 *동일 방식*으로 이 절대 경로를 넘긴다 (메모리 아닌 파일 — 세션/컴팩트 무관 재사용).
|
|
32
32
|
|
|
33
33
|
## 호출 시점
|
|
34
34
|
|
|
@@ -47,13 +47,13 @@ MAIN_WT=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
|
|
|
47
47
|
|
|
48
48
|
### Step 1 — task 파일 + Test Plan 추출
|
|
49
49
|
|
|
50
|
-
1.
|
|
50
|
+
1. `status` 도구(또는 `npx @angar2/taskery status`)로 활성 plan 확인.
|
|
51
51
|
2. task 파일 Read:
|
|
52
52
|
- 인자 있음 → 해당 파일.
|
|
53
|
-
- 인자 없음 → `
|
|
53
|
+
- 인자 없음 → `status` 도구(또는 `npx @angar2/taskery status`)의 *진행중 태스크* 목록에서 후보를 찾는다 — task 문서는 미등록 케이스에서 **각 task의 워크트리 안에만** 있으므로, 메인 워크트리에서 `ls .project/tasks/<NNN_slug>/`로 찾으면 아무것도 안 나와 *"task가 없다"*고 잘못 끝난다. 각 후보의 문서 경로는 `status`가 알려주는 워크트리 경로 아래 `.project/tasks/<NNN_slug>/`다. 그중 status=`developed`인 가장 최근 task. 발견 시 confirm. 진행중 목록 자체가 비어 있을 때만 *"검증할 task 없음."* + 종료.
|
|
54
54
|
3. 상태 = `developed` 검증. `testing`이면 이어가기 (Step 2 skip). 그 외면 종료.
|
|
55
55
|
4. `## Test Plan` 섹션 + `## Dev Plan`의 Phase별 *완료 기준* 정독. 자기완결성 점검 — 다른 문서 참조나 *"위에서 만든 X"* 같은 표현 있으면 사용자에게 보고 + Test Plan 보강 후 재시도.
|
|
56
|
-
5. **프로젝트 로컬 룰 확인** — `$MAIN_WT/.project/rules/TEST_RULE.local.md
|
|
56
|
+
5. **프로젝트 로컬 룰 확인** — `$MAIN_WT/.project/rules/TEST_RULE.local.md`를 Read한다. 이 파일은 모든 리포에 있어야 하는 필수 문서다(`TASKERY_RULE` §8) — **없으면 사용자에게 알리고** 이번 검증은 실행 경로를 지어내지 말고 진행한다(확인 불가한 시나리오는 실행 보류). 로컬 룰의 조항은 코어와 동등한 구속력을 가진다 — 겹치면 **로컬이 최우선**이고, **겹치지 않는 로컬 조항도 그대로 준수한다** (`TASKERY_RULE` §7). 단 멀티세션 불변식·destructive 승인·상태 전이 유효성은 로컬이 뒤집지 못한다.
|
|
57
57
|
|
|
58
58
|
### Step 2 — status 전환 (developed → testing)
|
|
59
59
|
|
|
@@ -71,37 +71,44 @@ Task tool로 sub-agent spawn. prompt는 *자기완결적* — task.md 경로 +
|
|
|
71
71
|
## 대상 task
|
|
72
72
|
|
|
73
73
|
task 파일 경로: <ABSOLUTE_PATH_TO_TASK_MD>
|
|
74
|
-
검증
|
|
75
|
-
|
|
74
|
+
이 프로젝트의 검증 규칙(있을 때만): <ABSOLUTE_PATH_TO_TEST_RULE_LOCAL_MD>
|
|
75
|
+
시험지 원본(있을 때만): <ABSOLUTE_PATH_TO_TEST_PLAN_ORIGIN_MD>
|
|
76
76
|
|
|
77
|
-
task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별 완료 기준을 정독하세요.
|
|
77
|
+
task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별 완료 기준을 정독하세요. 위에 경로로 명시된 문서(task 파일 · 검증 규칙 · 시험지 원본) + 목업 외 다른 문서 참조 X.
|
|
78
78
|
(단 task.md가 `mockup/<task-doc-name>-mockup.html` 참조하면 해당 목업 파일도 직접 Read — *승인된 목업 = 시각 시나리오의 정답지*입니다. 시각 시나리오 = 실제 화면 캡처 → 이 목업과 자동 대조.)
|
|
79
|
-
|
|
79
|
+
검증 규칙 파일(`TEST_RULE.local.md`)이 경로로 주어졌으면 반드시 Read한다 — 두 가지가 그 안에 있다. ① *방식별 실행 경로*: 각 테스트 방식을 이 프로젝트에서 실제로 어떻게 돌리나(DB 조회 경로 / API 호출법 / E2E 셋업 / 시각 실행 / 격리 실행 환경). ② *범위·방식 정책*: 무엇을 얼마나 검증하나. 위 수행 룰과 겹치는 항목은 그쪽을 우선하고, 겹치지 않는 조항도 그대로 준수한다(멀티세션 불변식·안전 조항 제외). 경로가 주어지지 않았으면 그 프로젝트에 아직 규칙이 없다는 뜻이므로, 실행 경로를 스스로 지어내지 말고 확인 불가한 시나리오는 실행 보류로 리턴한다.
|
|
80
80
|
|
|
81
81
|
## 수행 룰
|
|
82
82
|
|
|
83
83
|
1. **본질 — Test Plan 시나리오 기반 실질 동작 검증**. 본 task에서 구현한 *요구사항이 정상 동작하는지* 검증이 목적. 단위 테스트 수치(카운트 +N / 모든 PASS) 자체로 task PASS 단정 절대 X — Test Plan에 명시된 *각 시나리오*가 PASS인지가 본질.
|
|
84
84
|
2. ## Test Plan 시나리오를 *순서대로* 그대로 수행. 임의 추가 / 스킵 / 변형 금지. 각 시나리오의 `[AUTO]` / `[USER]` 분류 (task-plan에서 정의됨) 그대로 따름.
|
|
85
85
|
3. `[AUTO]` 시나리오 — *실제 명령 실행*. 실행 없이 pass 처리 절대 금지. 검증 도구 (단위/통합/E2E 테스트 / API 호출 / 스크립트 실행 등) 직접 수행 + 결과 로그 확보.
|
|
86
|
-
4. `[USER]` 시나리오 — *정답지가 주관*인 영역만 (시각 미세 취향 / 색조·여백 2px 수준 / UX 사용감·매끄러움). UNCERTAIN(사람 검수)으로 분류 + *사용자 직접 검수 항목*으로 리턴 (단 증거=캡처 첨부). **시각 *객관* 영역(레이아웃 깨짐 / 요소 빠짐 / 빈 화면 / 색 완전히 틀림 / 배치 딴판)은 `[USER]`가 아니라 `[AUTO]`** — 실제 화면 캡처 → 승인 목업과 직접 대조해 격리 세션이 판정. **단 이 승격은
|
|
87
|
-
5.
|
|
86
|
+
4. `[USER]` 시나리오 — *정답지가 주관*인 영역만 (시각 미세 취향 / 색조·여백 2px 수준 / UX 사용감·매끄러움). UNCERTAIN(사람 검수)으로 분류 + *사용자 직접 검수 항목*으로 리턴 (단 증거=캡처 첨부). **시각 *객관* 영역(레이아웃 깨짐 / 요소 빠짐 / 빈 화면 / 색 완전히 틀림 / 배치 딴판)은 `[USER]`가 아니라 `[AUTO]`** — 실제 화면 캡처 → 승인 목업과 직접 대조해 격리 세션이 판정. **단 이 승격은 TEST_RULE.local.md *시각 실행* 절에 이 프로젝트의 캡처 실행 경로가 있을 때 한정이다** — 경로가 없어 task.md가 시각 시나리오를 `[USER]`로 분류했다면 그 분류를 존중하고 `[AUTO]`로 뒤집지 않는다. (시각이라고 무조건 사람에게 넘기지 말 것 — 객관 깨짐은 네가 잡는다.)
|
|
87
|
+
5. `AGENTS.md` `## 검증 명령` (빌드/린트/타입체크) + `## 테스트 명령` (단위/통합/E2E 테스트) 둘 다 직접 실행 + 결과 리턴. **단 값이 `<예:` 로 시작하는 placeholder이거나 비어 있으면 실행하지 말고 *진입 문서 미기입*으로 표시해 리턴한다** (없는 명령을 지어내지 않는다). **단 화면·입력을 점유하는 스위트는 룰 17의 제약을 먼저 따른다** (무단 실행 금지 — 룰 17이 본 룰보다 우선).
|
|
88
88
|
6. **신규 테스트 식별자 등장 확인 (stash FRICTION_LOG #19 반영)** — 본 task에서 신규 테스트 추가되었으면, 단순 *카운트 +N / 모든 PASS* 자체로 PASS 단정 X. 신규 *테스트 식별자* (suite / class / function / describe 등) 가 테스트 runner 결과 로그에 *실제 등장*했는지 grep 직접 확인 (1 hit 이상). 등장 안 하면 *Suite 미실행* → FAIL.
|
|
89
89
|
7. 코드와 동작만 신뢰. *"잘 될 거야"* / *"문제 없을 듯"* 같은 가정 일체 금지.
|
|
90
|
-
8. 코드 파일 직접 수정 절대
|
|
90
|
+
8. 코드 파일 직접 수정 절대 금지 (**유일 예외 = 룰 19 음성 대조의 일시 되돌림** — 즉시 원복 의무). 임시 파일(테스트 스크립트 등) 생성 시 종료 후 삭제.
|
|
91
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 / 로그 출력 / 어서션 통과 여부*만. 본문 의도 해석 영역 외 — 결과 기반 판정만.
|
|
92
92
|
10. **grep/Read-only 존재 확인 시나리오 = 보조 검증** (stash FRICTION_LOG 2026-06-01 반영) — 시나리오가 *코드/파일에 X가 존재하나*를 grep / Read로 재확인하는 형태(동어반복)면 *보조 검증*으로 분류. 종합 판정의 PASS 카운트에서 제외하고, 같은 영역의 *실동작 시나리오*가 PASS인 경우에만 보조 자료로 첨부. 단독 PASS 가치 X. 실동작 시나리오 없이 grep-only 시나리오만으로 종합 PASS 단정 영구 금지 — 그 경우 *실동작 시나리오 부재*로 UNCERTAIN/FAIL 판정 + 메인 보고.
|
|
93
|
-
11. **문 앞 검사 — 실행 전 시험문제 자격 확인 (먼저)**. 시나리오를 돌리기 *전에*, 각 `[AUTO]` 시나리오가 **[실행할 명령/입력] + [구체적 기대값(관측 가능한 결과 — 출력값 / 상태코드 / 어서션 / 조회 결과 / 화면 상태)]** 한 쌍을 갖췄는지 확인. *"정상 동작" / "잘 됨" / "확인한다"* 같은 *소원*은 기대값이 아님. 자격 미달 `[AUTO]` 시나리오가 있으면 → **그 시나리오는 검사하지 말고 "시험문제 결함(검증 불가)"으로 분류** + 무엇이 빠졌는지 지목 (아래 룰 13). 자격 미달을 PASS로 반올림 영구 금지.
|
|
93
|
+
11. **문 앞 검사 — 실행 전 시험문제 자격 확인 (먼저)**. 시나리오를 돌리기 *전에*, 각 `[AUTO]` 시나리오가 **[실행할 명령/입력] + [구체적 기대값(관측 가능한 결과 — 출력값 / 상태코드 / 어서션 / 조회 결과 / 화면 상태)]** 한 쌍을 갖췄는지 확인. *"정상 동작" / "잘 됨" / "확인한다"* 같은 *소원*은 기대값이 아님. **UX/UI task의 `[AUTO]` 기대값은 출처 표기(`(출처: 목업 §N / Req N)`)도 자격 요건** — 무표기 또는 `(출처 없음 — 사용자 확인 필요)` 잔존은 승인 근거 없는 추정이므로 자격 미달. 자격 미달 `[AUTO]` 시나리오가 있으면 → **그 시나리오는 검사하지 말고 "시험문제 결함(검증 불가)"으로 분류** + 무엇이 빠졌는지 지목 (아래 룰 13). 자격 미달을 PASS로 반올림 영구 금지.
|
|
94
94
|
12. **증거 일치 시만 PASS**. 자격을 갖춘 `[AUTO]` 시나리오는 *실제로 실행*하여 — *관측한 결과가 기대값과 일치할 때만* PASS. 코드 정독 "그럴듯함" / 추정 / "될 듯"으로 PASS 영구 금지. 증거(명령 출력 · 응답 로그 · 캡처 · 조회 결과)를 결과 표 근거 칸에 첨부.
|
|
95
95
|
13. **UNCERTAIN 세 종류 — 섞지 말 것**.
|
|
96
96
|
- **UNCERTAIN(사람 검수)** — 정답지가 *주관*인 영역(룰 4: 시각 미세 취향 / UX 느낌). 정상. 사용자 직접 검수 항목으로 리턴 (증거 캡처 첨부).
|
|
97
97
|
- **UNCERTAIN(검증 불가)** — `[AUTO]`로 분류됐는데 *대조할 기대값을 구성하지 못한* 경우 = **시험문제 결함**. PASS로 반올림 금지, 사람 검수로도 넘기지 말 것(주관 아님). **근거 의무**: *무엇을 시도했고 왜 기대값을 구성할 수 없는지* 반드시 기록. (이건 네가 쉴 자리가 아니라 task-plan으로 되돌아가 Test Plan을 보수해야 하는 신호 — 도망쳐도 이득 없음.)
|
|
98
98
|
- **UNCERTAIN(실행 보류)** — 룰 17에 걸려 *실행하지 않은* 경우 = 시험문제도 코드도 아닌 **환경 제약**. 사용자 승인 또는 격리 실행 경로 마련이 필요하다는 신호이므로, PASS·FAIL 어느 쪽으로도 반올림하지 말고 *무엇을 왜 실행하지 않았는지*(어느 스위트가 무엇을 점유하는지)를 기록해 리턴한다.
|
|
99
|
-
14. **시각 `[AUTO]` 시나리오 = 캡처-목업 대조**. 앱을 띄워 실제 화면을 캡처 → 승인된 목업(정답지)과 대조. (본 룰은
|
|
99
|
+
14. **시각 `[AUTO]` 시나리오 = 캡처-목업 대조**. 앱을 띄워 실제 화면을 캡처 → 승인된 목업(정답지)과 대조. (본 룰은 TEST_RULE.local.md에 캡처 실행 경로가 있는 경우에만 적용된다. 경로가 없으면 해당 시나리오는 `[USER]`이며 룰 4 단서에 따른다.) 어긋나면 → *구체적 어긋남 목록*(예: "헤더 색 틀림 / 카드가 가로 아닌 세로로 쌓임 / 저장 버튼 없음")을 뽑아 **FAIL**로 보고. 합격선 = *픽셀 일치가 아니라* "사람이 보면 '이거네' 할 정도로 본질적으로 같다" (객관적 깨짐만 잡고 미세 취향은 룰 4로). 증거 = 스크린샷 + 어긋남 목록.
|
|
100
100
|
|
|
101
101
|
15. **픽스처 현실성 의심 + 재생성 판정**. 시나리오가 쓰는 픽스처·시드 데이터가 *실제 산출물과 형식·정밀도가 같은지* 의심하라 (예: 실제 엔진은 소수 시각을 쓰는데 픽스처는 정수만 심는 경우 — 비교 결함이 통째로 가려진다). 의심되면 **실제 코드(writer·생성기)로 픽스처를 재생성해 시나리오를 재실행하고, 그 결과로 판정**한다. 재생성 경로가 없어 대조를 구성할 수 없으면 그 시나리오는 *시험문제 결함(검증 불가)*으로 분류한다. 손으로 심은 픽스처는 구현자의 맹점을 그대로 복제하므로, 통과했다는 사실만으로 안전하다고 보지 않는다.
|
|
102
102
|
16. **어서션 정면성**. 각 시나리오의 기대값이 요구사항을 *정면으로* 겨누는지 확인하라. "셋업을 벗어날 수 없다"가 요구사항이면 **실제로 벗어나 보는 것**이 정면이고, 버튼이 `disabled`인지 보는 것은 우회 지표다 — 우회 지표는 통로가 열려 있어도 통과한다. 우회 지표로 검사하는 `[AUTO]` 시나리오를 발견하면 그 시나리오는 *시험문제 결함(검증 불가)*으로 분류하고, 무엇이 정면 관측인지 함께 지목한다.
|
|
103
103
|
|
|
104
|
-
17. **화면·입력 점유 스위트 자동 실행 금지**. 실제 앱을 띄워 UI를 자동 조작하는 스위트(XCUITest·headed 브라우저 E2E 등)는 사용자의 화면·마우스·키보드를 점유해 작업을 중단시킨다.
|
|
104
|
+
17. **화면·입력 점유 스위트 자동 실행 금지**. 실제 앱을 띄워 UI를 자동 조작하는 스위트(XCUITest·headed 브라우저 E2E 등)는 사용자의 화면·마우스·키보드를 점유해 작업을 중단시킨다. TEST_RULE.local.md *테스트 실행 환경* 절에 **격리 실행 경로**(창 숨김·헤드리스 플래그 / 컨테이너·가상 디스플레이 / VM / CI 러너)가 선언돼 있으면 그 경로로 실행한다. 선언이 없으면 — 비점유 부분만 한정 실행할 수 있으면 그것만 실행하고, 한정 수단도 없으면 **실행하지 말고** 해당 시나리오를 *실행 보류(사용자 승인 필요)*로 표시해 메인에 리턴한다 (무단 실행 금지). 헤드리스 모드가 있으면 항상 그쪽을 쓴다.
|
|
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 확인). 되돌리기가 위험한 영역(마이그레이션·전역 상태·파괴적 사이드 이펙트)이면 생략 + 사유 기록.
|
|
105
112
|
|
|
106
113
|
## 결과 형식 (이 포맷 그대로 리턴)
|
|
107
114
|
|
|
@@ -142,9 +149,16 @@ task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별
|
|
|
142
149
|
- <시나리오 N: 무엇이 [AUTO]인데 기대값을 못 만들었나 + 무엇을 시도했나 + 왜 불가한가>
|
|
143
150
|
→ task-plan으로 Test Plan 보수 필요 (이 시나리오를 [실행 명령 + 구체적 기대값]으로 다시 작성).
|
|
144
151
|
|
|
152
|
+
### 시험지 오염 (UNCERTAIN 검증 불가 · 오염 라벨 — 룰 18 해당 시)
|
|
153
|
+
- <어느 칸이 원본과 어떻게 다른가 + 플래그 유무 + 원안↔현재 인용>
|
|
154
|
+
→ 메인이 원본 기준 복원 + 사용자 보고 필요.
|
|
155
|
+
|
|
156
|
+
### 음성 대조 결과 (룰 19 — 수행 시)
|
|
157
|
+
- <어느 시나리오를 어떤 되돌림으로 FAIL 확인했나 + 원복 확인(diff 무변) / 생략 시 사유>
|
|
158
|
+
|
|
145
159
|
### 실행 보류 (UNCERTAIN 실행 보류 — 해당 시)
|
|
146
160
|
- <어느 시나리오/명령을 실행하지 않았나 + 무엇을 점유하는가(화면·마우스·키보드·전역 단축키 등) + 비점유 부분만 실행했다면 그 범위>
|
|
147
|
-
→ 메인이 사용자 승인을 받아 실행하거나,
|
|
161
|
+
→ 메인이 사용자 승인을 받아 실행하거나, TEST_RULE.local.md *테스트 실행 환경* 절에 격리 실행 경로를 마련한 뒤 재검증 필요.
|
|
148
162
|
|
|
149
163
|
## 종료 조건
|
|
150
164
|
|
|
@@ -153,8 +167,9 @@ task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별
|
|
|
153
167
|
|
|
154
168
|
**구현 디테일**:
|
|
155
169
|
- `<ABSOLUTE_PATH_TO_TASK_MD>` 자리에 `.project/tasks/<NNN_slug>/<NNN>_<slug>.md` (또는 폴더 승격 시 `<...>/task.md`)의 절대 경로 삽입.
|
|
156
|
-
- `<
|
|
157
|
-
- `<
|
|
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`에 안 잡힌다(②③까지 합산해야 원복 실패를 잡는다).
|
|
158
173
|
- Task tool의 `subagent_type`: `general-purpose` (도구 풀 다 필요).
|
|
159
174
|
- Task tool의 `description`: `Isolated test for TASK-<NNN>`.
|
|
160
175
|
- **코덱스 spawn (플랫폼 패리티)**: 코덱스에선 `.codex/agents/task-tester.toml`의 `task-tester` 서브에이전트로 spawn하되, *위 펜스 전체를 task prompt로 그대로 전달*한다 — 펜스가 양 플랫폼 공통 단일 룰 소스다(클로드 = `general-purpose` + 펜스 / 코덱스 = `task-tester` + 펜스, 동일 효과). `task-tester`의 `developer_instructions`는 같은 룰의 코덱스 기준선 미러 — 본 펜스의 수행 룰을 바꾸면 그 `developer_instructions`도 함께 갱신한다.
|
|
@@ -227,6 +242,7 @@ task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별
|
|
|
227
242
|
→ /task-plan 으로 Test Plan만 보수 (이 시나리오를 [실행 명령 + 구체적 기대값]으로 다시 작성) → 보수 후 /task-test 재실행
|
|
228
243
|
```
|
|
229
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 출제 품질 (원안의 사후 귀책 평가). 무플래그 오염은 발생 자체가 규약 위반이므로 경위를 함께 보고한다.
|
|
230
246
|
|
|
231
247
|
#### UNCERTAIN(실행 보류) 분기 — 환경 제약 → 승인 또는 격리 경로
|
|
232
248
|
|
|
@@ -245,10 +261,11 @@ task 파일을 직접 Read 해서 ## Test Plan 섹션 + ## Dev Plan의 Phase별
|
|
|
245
261
|
3. "격리 경로 만들자" — 창 숨김·헤드리스 / 컨테이너 / VM / CI 중 하나를 마련 후 재검증 (다음 task부터 승인 없이 자동 실행됨)
|
|
246
262
|
4. "보류인 채로 마무리해" — 미검증 영역으로 명시하고 tested 전이 (위험: 이 영역은 검증 안 된 채 closed)
|
|
247
263
|
```
|
|
264
|
+
단, `TEST_RULE.local.md` *테스트 실행 환경* 절에 *"없음 — 매번 승인(사용자 결정 …)"*이 이미 기록돼 있으면 선택지 3("격리 경로 만들자")을 새 제안처럼 내지 않는다 — 이미 내린 결정이다. 승인 여부(1·2·4)만 묻는다.
|
|
248
265
|
3. 사용자 응답별 처리:
|
|
249
266
|
- **"지금 돌려"** → 승인받았으므로 점유 스위트를 실행하고, 그 결과로 PASS / FAIL 분기를 따른다.
|
|
250
267
|
- **"나중에"** → 보류 유지. status는 `testing` 그대로 두고 **여기서 멈춘다** (`/task-close`로 넘어가지 않는다 — close는 `tested`가 아니면 `blocked:'status'`로 차단된다). 사용자가 자리를 비운 뒤 *"이제 돌려"* 하면 위 "지금 돌려"로 재개.
|
|
251
|
-
- **"격리 경로 만들자"** → 경로(창 숨김·헤드리스 / 컨테이너 / VM / CI)를 마련하고 `
|
|
268
|
+
- **"격리 경로 만들자"** → 경로(창 숨김·헤드리스 / 컨테이너 / VM / CI)를 마련하고 `TEST_RULE.local.md` *테스트 실행 환경* 절에 기록한 뒤 `/task-test` 재실행. 다음 task부터는 승인 없이 자동 실행된다.
|
|
252
269
|
- **"보류인 채로 마무리해"** (알려진 미검증 감수) → FAIL 분기의 *"OK 마무리"*와 동일 처리 — `set_status` 도구로 `tested` 전이(또는 `npx @angar2/taskery set-status TASK-<NNN> tested`) + Result 섹션에 *"미검증 영역: <보류 시나리오> — 사유: 화면·입력 점유, 사용자 판단으로 미실행"* 명시 후 `/task-close` 안내.
|
|
253
270
|
4. **묵묵히 PASS 처리 금지** — 어느 경로로 가든 보류된 시나리오는 Result에 *미검증 영역*으로 남긴다. 실행하지 않은 것을 통과로 적지 않는다.
|
|
254
271
|
|
|
@@ -290,7 +307,7 @@ USER 검수 — N 항목 (목업 기준: <mockup path — 있을 시>)
|
|
|
290
307
|
|
|
291
308
|
### Step 7 — 검수 서버 기동 (PASS 후 세션 종료·해당 시)
|
|
292
309
|
|
|
293
|
-
**조건**: ① 종합 판정 PASS + 이번 세션이 여기서 멈추고 사용자에게 제어를 넘김(= `/task-close`로 바로 진행하지 않음) + ② `
|
|
310
|
+
**조건**: ① 종합 판정 PASS + 이번 세션이 여기서 멈추고 사용자에게 제어를 넘김(= `/task-close`로 바로 진행하지 않음) + ② `AGENTS.md`에 `## 검수 실행 명령`이 선언됨.
|
|
294
311
|
|
|
295
312
|
- 두 조건 충족 시 — 그 명령으로 서버를 *백그라운드* 기동(포트 = 기준 포트 + TASK번호) + 접속 URL 보고. 모바일 검수가 필요하다고 판단되면 터널도 기동.
|
|
296
313
|
- 격리 세션 검증이 *기능상* 이미 서버를 띄워 둔 경우 — 죽였다 다시 띄우지 말고 그대로 두고 URL만 보고.
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# FRICTION_LOG
|
|
2
|
-
|
|
3
|
-
> 사용자가 작업 흐름 중 겪은 불편 / 한계 / 짚이는 부분의 누적.
|
|
4
|
-
> `/log-friction` 스킬이 사용자 합의 후 한 행씩 추가한다.
|
|
5
|
-
|
|
6
|
-
**사용 규칙**:
|
|
7
|
-
- 한 행에 한 불편
|
|
8
|
-
- 손수 편집 X — 메인이 대화로 적음
|
|
9
|
-
- 사용자 명시 호출 / 사용자 불만 발화 캐치 / task-close 직후 마찰 신호 자체 감지 시 추가
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## 불편 누적
|
|
14
|
-
|
|
15
|
-
| 날짜 | 불편 | 맥락 (어느 task / 스킬 / 카테고리) |
|
|
16
|
-
|------|------|-----------------------------------|
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
# TEST-GUIDE
|
|
2
|
-
|
|
3
|
-
> 이 프로젝트에서 각 테스트 방식을 *실제로 어떻게 실행하나*의 단일 소스.
|
|
4
|
-
> **제품 관통 문서 아님 — 검증 방법 문서.** (제품 스펙은 `.project/` 루트 그룹 A/B 문서 참조.)
|
|
5
|
-
> `/task-test` 격리 세션이 task.md와 함께 이 파일을 읽어, 명세된 방식을 *이 프로젝트의 실제 경로*로 실행한다.
|
|
6
|
-
> **역할 구분**: 본 문서 = *어떻게 실행하나*(경로·명령·셋업). `.project/rules/TEST_RULE.local.md` = *무엇을 얼마나 검증하나*(범위·방식 정책, 옵션·로컬 전용). 둘을 섞어 적으면 어느 쪽에도 안 남는다.
|
|
7
|
-
|
|
8
|
-
**사용 규칙**:
|
|
9
|
-
- 처음엔 빈 골격 — 검증 방법을 아직 모름. `/task-plan`이 방식별 실행 경로를 *사용자에게 확인받은 즉시* 채운다.
|
|
10
|
-
- 각 항목 = "이 프로젝트에서의 실제 실행 방법" (명령 · 경로 · 연결). 추상 설명 아니라 *그대로 돌릴 수 있는* 형태.
|
|
11
|
-
- 모르면 비워 두지 말고 `/task-plan`이 사용자에게 물어 채운다 (모르면 묻고, 알면 재사용).
|
|
12
|
-
- 부정확이 드러나면 정정. 손수 편집보다 task 진행 중 갱신 권장.
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## 데이터 검증 (DB / 파일 / 상태 조회)
|
|
17
|
-
|
|
18
|
-
> 시나리오 실행 후 데이터 상태를 *직접 조회*하는 실제 경로. (예: ORM repository / DB 클라이언트 / 쿼리 명령 / 파일 확인 명령.)
|
|
19
|
-
|
|
20
|
-
<아직 미정 — 데이터 쓰기·변경·삭제 검증이 필요한 task에서 `/task-plan`이 사용자에게 확인 후 기록>
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## API 호출 (엔드포인트 / 외부 인터페이스)
|
|
25
|
-
|
|
26
|
-
> 엔드포인트를 실제로 호출하고 상태코드·응답 필드를 확인하는 경로. (예: curl / httpie / 테스트 클라이언트 + 베이스 URL · 인증 방법.)
|
|
27
|
-
|
|
28
|
-
<아직 미정>
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## UI 동작 · E2E (클릭 / 입력 / 흐름 자동화)
|
|
33
|
-
|
|
34
|
-
> UI 동작·흐름을 자동화하는 도구와 셋업. (예: Playwright / Cypress 설치 여부 · 실행 명령 · 셋업 단계.) 도구가 없으면 "없음 — 사람 검수"로 명시.
|
|
35
|
-
|
|
36
|
-
<아직 미정>
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## 시각 실행 (앱 기동 + 화면 캡처)
|
|
41
|
-
|
|
42
|
-
> 앱을 띄워 실제 화면을 캡처해 승인 목업과 대조하는 경로. (예: 개발 서버 실행 명령 · 포트 · 캡처 방법.) 검수 서버는 `CLAUDE.md`(코덱스 `AGENTS.md`)의 `## 검수 실행 명령` 참조.
|
|
43
|
-
|
|
44
|
-
<아직 미정>
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## 테스트 실행 환경 (격리 실행 경로 — 화면·입력 점유 회피)
|
|
49
|
-
|
|
50
|
-
> 실제 앱을 띄워 UI를 자동 조작하는 스위트(XCUITest · headed 브라우저 E2E 등)를 **사용자의 화면·마우스·키보드를 뺏지 않고** 돌리는 경로. 여기에 경로가 적혀 있으면 자동 게이트·격리 세션이 그 경로로 자동 실행하고, 비어 있으면 자동 실행하지 않고 사용자 승인을 받는다 (`/task-dev` Step 6.5 · `/task-test` 격리 룰).
|
|
51
|
-
>
|
|
52
|
-
> 적을 수 있는 것: 창 숨김·헤드리스 플래그(예: 테스트 모드 환경변수로 창 표시·포커스 탈취 비활성) / 가상 디스플레이·컨테이너 / VM / CI 러너 위임 / 점유 스위트를 제외하는 한정 실행 옵션(번들·프로젝트·태그 지정).
|
|
53
|
-
|
|
54
|
-
<아직 미정 — 점유 스위트가 있는 프로젝트에서 `/task-dev`·`/task-test`가 사용자에게 확인 후 기록>
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## 기타
|
|
59
|
-
|
|
60
|
-
> 위 분류에 안 맞는 프로젝트 고유 검증 방법.
|
|
61
|
-
|
|
62
|
-
<아직 미정>
|