spec-lite 1.5.2 → 1.6.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 +8 -8
- package/package.json +1 -1
- package/skills/ado-create/SKILL.md +1 -1
- package/skills/artifact-audit/SKILL.md +3 -3
- package/skills/artifact-migrate/SKILL.md +3 -3
- package/skills/spec-brownfield-feature/SKILL.md +1 -1
- package/skills/spec-frd/SKILL.md +17 -10
- package/skills/spec-new/SKILL.md +15 -11
- package/skills/spec-test/SKILL.md +60 -59
- package/skills/spec-test-design/SKILL.md +243 -0
- package/skills-overview.md +23 -22
- package/templates/integrations/test-template.md +47 -25
- package/templates/main/feature/frd-template.md +43 -8
- package/templates/main/feature/{tsd-template.md → test-design-template.md} +73 -34
- package/templates/main/prd-template.md +2 -0
- package/skills/spec-tsd/SKILL.md +0 -241
|
@@ -1,33 +1,39 @@
|
|
|
1
1
|
---
|
|
2
|
-
id:
|
|
3
|
-
type:
|
|
2
|
+
id: test-design-{feature}
|
|
3
|
+
type: test-design
|
|
4
4
|
status: draft
|
|
5
5
|
owner: "{QC}"
|
|
6
6
|
feature_id: "{Feature ID — match frd.md}"
|
|
7
7
|
frd_ref: "feature/{F-XXX}-{slug}/frd.md"
|
|
8
|
-
template_version:
|
|
8
|
+
template_version: 2
|
|
9
9
|
migrations:
|
|
10
10
|
- to: 1
|
|
11
11
|
note: "baseline"
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
- to: 2
|
|
13
|
+
note: "Mirror frd v2 + trim execution-leakage (giữ vai WHAT). Tách 'Feature AC Test Cases' (v1) theo type/execution-mode: đổi tên → 'E2E Test Cases' (chỉ FAC end-to-end: journey/consistency/integrity), tách TC loại NFR → 'Non-Functional Test Cases' và loại data/migration → 'Data & Migration Test Cases', cả hai required-emptyable. TC giữ prefix TC-F* chung sequence."
|
|
14
|
+
add: ["E2E Test Cases", "Non-Functional Test Cases", "Data & Migration Test Cases"]
|
|
15
|
+
remove:
|
|
16
|
+
- { section: "Feature AC Test Cases", reason: "đổi tên → 'E2E Test Cases' (chỉ cover FAC end-to-end) + tách TC Type=NFR → 'Non-Functional Test Cases' (required-emptyable), Type=data/migration → 'Data & Migration Test Cases' (required-emptyable); carry-over toàn bộ TC theo field Type, không mất nội dung" }
|
|
17
|
+
- { section: "Test Strategy > Environments", reason: "env assignment/scheduling là execution concern — design chỉ cần env requirement ở per-TC Preconditions" }
|
|
18
|
+
update:
|
|
19
|
+
- { section: "Test Data", change: "đổi thành 'Test Data Requirements' — bỏ cột Nguồn (fixture/factory = provisioning) + Refresh (cadence = execution), thêm cột 'Yêu cầu data (shape)'" }
|
|
14
20
|
---
|
|
15
21
|
|
|
16
22
|
<!--
|
|
17
|
-
Canonical format cho feature/{F-XXX}-{slug}/
|
|
23
|
+
Canonical format cho feature/{F-XXX}-{slug}/test-design.md.
|
|
18
24
|
Sinh từ frd.md — mỗi AC / VR / Flow phải có ít nhất 1 test case cover.
|
|
19
25
|
Traceability Matrix ở cuối là source of truth để kiểm tra coverage trước khi đóng feature.
|
|
20
26
|
|
|
21
|
-
|
|
27
|
+
Test Design chỉ tồn tại ở FEATURE level — không tách test-design riêng cho component.
|
|
22
28
|
Component là internal building block; contract của component được verify gián tiếp qua TC ở đây
|
|
23
29
|
và qua unit test trong code (không phải spec artifact).
|
|
24
30
|
-->
|
|
25
31
|
|
|
26
|
-
# Test
|
|
32
|
+
# Test Design: {Feature Name}
|
|
27
33
|
|
|
28
34
|
## Overview
|
|
29
35
|
|
|
30
|
-
{Phạm vi
|
|
36
|
+
{Phạm vi test-design này — feature gì, các luồng / AC / VR chính cần verify, trong 2-3 câu.}
|
|
31
37
|
|
|
32
38
|
## Test Strategy
|
|
33
39
|
|
|
@@ -36,13 +42,11 @@ và qua unit test trong code (không phải spec artifact).
|
|
|
36
42
|
- **Functional**: verify từng US / Story AC theo happy + edge.
|
|
37
43
|
- **Validation**: derive 1:1 từ Verification Rules.
|
|
38
44
|
- **Flow-based (E2E)**: chạy theo Mermaid flows trong frd.
|
|
39
|
-
- **Feature AC**: cover
|
|
45
|
+
- **Feature AC (end-to-end)**: cover `FAC-*` — journey liên story + cross-story consistency.
|
|
46
|
+
- **Non-functional**: cover `NFR-*` — performance / a11y / security (execution-mode riêng: load test, scanner...).
|
|
47
|
+
- **Data & migration** *(nếu có)*: cover `DM-*` — chạy migration trên dataset, verify data cũ không mất/hỏng.
|
|
40
48
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
| Env | Mục đích | Data set | Ghi chú |
|
|
44
|
-
| --- | --- | --- | --- |
|
|
45
|
-
| {dev / staging / prod-like} | {functional / E2E / load} | {seed / anonymized prod} | ... |
|
|
49
|
+
> Yêu cầu env của mỗi test class ghi inline ở **Preconditions** từng TC (vd "env perf-test", "dataset prod-like đã load"). Gán env tier cụ thể + lịch chạy thuộc **execution layer** — không ở test-design.
|
|
46
50
|
|
|
47
51
|
## Test Scenarios
|
|
48
52
|
|
|
@@ -93,7 +97,7 @@ TC ID format: `TC-F{NNN}-{seq}` — đánh số tăng dần toàn feature. ID **
|
|
|
93
97
|
- {observable outcome 1}
|
|
94
98
|
- {observable outcome 2}
|
|
95
99
|
|
|
96
|
-
**Test data:** {ref Test Data
|
|
100
|
+
**Test data:** {ref Test Data Requirements hoặc inline literal}
|
|
97
101
|
|
|
98
102
|
---
|
|
99
103
|
|
|
@@ -113,15 +117,15 @@ Form bảng để dễ scan; case phức tạp có thể tách ra block riêng n
|
|
|
113
117
|
| `TC-{F_ID}-011` | `VR-{F_ID}-001` | `email` | `""` | reject — required | negative |
|
|
114
118
|
| `TC-{F_ID}-012` | `VR-{F_ID}-001` | `email` | `"abc"` | reject — invalid format | negative |
|
|
115
119
|
|
|
116
|
-
##
|
|
120
|
+
## E2E Test Cases
|
|
117
121
|
|
|
118
|
-
Cover Feature Acceptance Criteria (`FAC-*`) trong frd.
|
|
122
|
+
Cover Feature Acceptance Criteria (`FAC-*`) trong frd — **end-to-end** (journey + consistency + integrity). FAC ở frd đã ở format G/W/T → TC dịch 1:1: Given → Preconditions, When → Steps, Then → Expected. Phân biệt shape bằng field **Type**: `E2E — journey` = tuần tự liên story / `E2E — consistency` = so khớp đa màn / `E2E — integrity` = assert business invariant sau khi kết hợp nhiều story (không nhất thiết tuần tự) (không có TC riêng cho NFR / data ở đây — xem 2 section bên dưới).
|
|
119
123
|
|
|
120
|
-
### TC-{F_ID}-040: {Title — e2e liên story}
|
|
124
|
+
### TC-{F_ID}-040: {Title — e2e journey liên story}
|
|
121
125
|
|
|
122
126
|
| Field | Value |
|
|
123
127
|
| --- | --- |
|
|
124
|
-
| **Type** |
|
|
128
|
+
| **Type** | E2E — journey |
|
|
125
129
|
| **Priority** | P0 / P1 / P2 |
|
|
126
130
|
| **Covers** | `FAC-{F_ID}-001` |
|
|
127
131
|
| **Spans** | `US-{F_ID}-001`, `US-{F_ID}-002`, `US-{F_ID}-003` |
|
|
@@ -145,7 +149,7 @@ Cover Feature Acceptance Criteria (`FAC-*`) trong frd. Feature AC trong frd đã
|
|
|
145
149
|
|
|
146
150
|
| Field | Value |
|
|
147
151
|
| --- | --- |
|
|
148
|
-
| **Type** |
|
|
152
|
+
| **Type** | E2E — consistency |
|
|
149
153
|
| **Priority** | P1 |
|
|
150
154
|
| **Covers** | `FAC-{F_ID}-002` |
|
|
151
155
|
| **Preconditions** | feature đã deploy lên test env, 3 màn Register / Profile / Admin Create accessible |
|
|
@@ -164,13 +168,19 @@ Cover Feature Acceptance Criteria (`FAC-*`) trong frd. Feature AC trong frd đã
|
|
|
164
168
|
|
|
165
169
|
---
|
|
166
170
|
|
|
171
|
+
## Non-Functional Test Cases
|
|
172
|
+
|
|
173
|
+
<!-- Required-emptyable: GIỮ heading; để trống (không TC) nếu section Non-Functional Requirements ở frd rỗng. -->
|
|
174
|
+
|
|
175
|
+
Cover `NFR-*` trong frd. **Non-functional type** — execution-mode riêng (load test / scanner / a11y audit), không phải UI walk. Type = `performance` / `a11y` / `security` / ... TC giữ prefix `TC-F*` chung sequence.
|
|
176
|
+
|
|
167
177
|
### TC-{F_ID}-050: {Title — NFR perf}
|
|
168
178
|
|
|
169
179
|
| Field | Value |
|
|
170
180
|
| --- | --- |
|
|
171
|
-
| **Type** |
|
|
181
|
+
| **Type** | Non-functional — performance |
|
|
172
182
|
| **Priority** | P0 |
|
|
173
|
-
| **Covers** | `
|
|
183
|
+
| **Covers** | `NFR-{F_ID}-001` |
|
|
174
184
|
| **Preconditions** | env perf-test, dataset baseline đã load |
|
|
175
185
|
|
|
176
186
|
**Steps:**
|
|
@@ -183,12 +193,40 @@ Cover Feature Acceptance Criteria (`FAC-*`) trong frd. Feature AC trong frd đã
|
|
|
183
193
|
- p95 ≤ 500ms
|
|
184
194
|
- Error rate ≤ 0.1%
|
|
185
195
|
|
|
186
|
-
## Test
|
|
196
|
+
## Data & Migration Test Cases
|
|
187
197
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
198
|
+
<!-- Required-emptyable: GIỮ heading; để trống (không TC) nếu section Data & Migration ở frd rỗng. -->
|
|
199
|
+
|
|
200
|
+
Cover `DM-*` trong frd. Chạy migration trên dataset prod-like rồi assert data cũ nguyên vẹn. Type = `data migration`. TC giữ prefix `TC-F*` chung sequence.
|
|
201
|
+
|
|
202
|
+
### TC-{F_ID}-060: {Title — migrate data cũ}
|
|
203
|
+
|
|
204
|
+
| Field | Value |
|
|
205
|
+
| --- | --- |
|
|
206
|
+
| **Type** | Data migration |
|
|
207
|
+
| **Priority** | P0 |
|
|
208
|
+
| **Covers** | `DM-{F_ID}-001` |
|
|
209
|
+
| **Preconditions** | env có dataset cũ prod-like (vd: 10.000 bản ghi địa chỉ format cũ) đã load |
|
|
210
|
+
|
|
211
|
+
**Steps:**
|
|
212
|
+
|
|
213
|
+
1. Snapshot count + checksum dataset trước migration
|
|
214
|
+
2. Chạy migration script
|
|
215
|
+
3. Đọc lại toàn bộ bản ghi sau migration
|
|
216
|
+
|
|
217
|
+
**Expected:**
|
|
218
|
+
|
|
219
|
+
- Count sau = count trước (10.000/10.000), không bản ghi nào null
|
|
220
|
+
- Mọi địa chỉ cũ đọc được đúng format mới, 0 lỗi parse
|
|
221
|
+
|
|
222
|
+
## Test Data Requirements
|
|
223
|
+
|
|
224
|
+
Dữ liệu mỗi test **cần** (requirement — KHÔNG phải provisioning/refresh; cách lấy data + cadence thuộc execution layer).
|
|
225
|
+
|
|
226
|
+
| Data set | Mục đích | Yêu cầu data (shape / đặc điểm) |
|
|
227
|
+
| --- | --- | --- |
|
|
228
|
+
| `seed_users` | functional positive | user hợp lệ, đủ field bắt buộc |
|
|
229
|
+
| `boundary_inputs` | validation edges | giá trị biên cho mỗi VR (rỗng, sai format, quá dài...) |
|
|
192
230
|
|
|
193
231
|
## Traceability Matrix
|
|
194
232
|
|
|
@@ -200,9 +238,10 @@ Cover Feature Acceptance Criteria (`FAC-*`) trong frd. Feature AC trong frd đã
|
|
|
200
238
|
| `US-{F_ID}-001` | US | `TC-{F_ID}-001`, `TC-{F_ID}-002` | ✅ |
|
|
201
239
|
| `AC-{F_ID}-001` | Story AC | `TC-{F_ID}-001` | ✅ |
|
|
202
240
|
| `VR-{F_ID}-001` | VR | `TC-{F_ID}-010`, `TC-{F_ID}-011`, `TC-{F_ID}-012` | ✅ |
|
|
203
|
-
| `FAC-{F_ID}-001` | Feature AC | `TC-{F_ID}-040` | ✅ |
|
|
204
|
-
| `FAC-{F_ID}-002` | Feature AC | `TC-{F_ID}-041` | ✅ |
|
|
205
|
-
| `
|
|
241
|
+
| `FAC-{F_ID}-001` | Feature AC (e2e) | `TC-{F_ID}-040` | ✅ |
|
|
242
|
+
| `FAC-{F_ID}-002` | Feature AC (consistency) | `TC-{F_ID}-041` | ✅ |
|
|
243
|
+
| `NFR-{F_ID}-001` | NFR | `TC-{F_ID}-050` | ✅ |
|
|
244
|
+
| `DM-{F_ID}-001` | Data & Migration | `TC-{F_ID}-060` | ✅ |
|
|
206
245
|
| `AC-{F_ID}-00X` | Story AC | — | ❌ chưa có TC |
|
|
207
246
|
|
|
208
247
|
### Gaps
|
|
@@ -211,17 +250,17 @@ Cover Feature Acceptance Criteria (`FAC-*`) trong frd. Feature AC trong frd đã
|
|
|
211
250
|
|
|
212
251
|
## Out of Scope
|
|
213
252
|
|
|
214
|
-
- {những gì
|
|
253
|
+
- {những gì test-design này KHÔNG cover — lý do (vd: thuộc layer khác như infra/security audit, đã verify ở môi trường khác, ...)}
|
|
215
254
|
|
|
216
255
|
## Dependencies
|
|
217
256
|
|
|
218
257
|
### FRD reference
|
|
219
258
|
|
|
220
|
-
- `frd.md` của feature này — mọi ID (`US-`, `AC-`, `VR-`, Flow) phải match.
|
|
259
|
+
- `frd.md` của feature này — mọi ID (`US-`, `AC-`, `VR-`, `FAC-`, `NFR-`, `DM-`, Flow) phải match.
|
|
221
260
|
|
|
222
261
|
### Components Used (input only)
|
|
223
262
|
|
|
224
|
-
Tham chiếu `frd.md > Components Used` để hiểu contract của các component được feature này dùng. Behavior của component được verify **gián tiếp** qua các TC ở đây — không tách
|
|
263
|
+
Tham chiếu `frd.md > Components Used` để hiểu contract của các component được feature này dùng. Behavior của component được verify **gián tiếp** qua các TC ở đây — không tách test-design riêng cho component.
|
|
225
264
|
|
|
226
265
|
## Change History
|
|
227
266
|
|
|
@@ -68,6 +68,8 @@ Chi tiết về vai trò và thiết kế nằm trong `.specs/main/component/{C-
|
|
|
68
68
|
|
|
69
69
|
## Non-Functional Requirements
|
|
70
70
|
|
|
71
|
+
NFR **product-wide** (bar chung cho cả sản phẩm). Feature refine/siết bar này cho ngữ cảnh của nó trong `frd.md > Non-Functional Requirements` bằng `NFR-F{NNN}-{seq}` *(tham chiếu `NFR-*` ở đây)*; NFR đặc thù-feature mà chưa có ở đây → nếu lặp lại ở nhiều feature thì **promote** lên bảng này.
|
|
72
|
+
|
|
71
73
|
| ID | Category | Requirement | Target | Priority |
|
|
72
74
|
| --- | --- | --- | --- | --- |
|
|
73
75
|
| NFR-P01 | Performance | {requirement} | {target đo được} | High/Medium/Low |
|
package/skills/spec-tsd/SKILL.md
DELETED
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: spec-tsd
|
|
3
|
-
description: Tạo tsd.md (Test Spec Document) trực tiếp tại feature level từ frd.md — mechanical derive Test Scenarios + Test Cases. KHÔNG cần integration, không cascade. Dùng cho brownfield onboarding (sau /spec-brownfield-feature) hoặc greenfield bootstrap khi feature đã có frd.md nhưng chưa có tsd.md.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# spec-tsd
|
|
7
|
-
|
|
8
|
-
## Overview
|
|
9
|
-
|
|
10
|
-
Tạo `.specs/main/feature/{F-XXX}-{slug}/tsd.md` trực tiếp từ frd.md của feature đó — **không qua integration**, không cascade.
|
|
11
|
-
|
|
12
|
-
Skill này song hành với `/spec-prd` và `/spec-sad`: skill có acronym suffix (`prd`/`sad`/`tsd`) → tạo main artifact trực tiếp. Phân biệt với `/spec-test` — skill đó tạo `test.md` integration-level và cascade qua Changes blocks.
|
|
13
|
-
|
|
14
|
-
## When to Use
|
|
15
|
-
|
|
16
|
-
- **Brownfield onboarding** — sau `/spec-brownfield-feature` đã sinh frd.md, cần bootstrap tsd.md để có test coverage tracking ngay từ đầu.
|
|
17
|
-
- **Greenfield deferred** — feature có frd.md từ lâu nhưng tsd.md chưa được tạo (vd: test design bị defer).
|
|
18
|
-
- **Ad-hoc rebuild** — tsd.md drift quá xa khỏi frd.md, muốn regenerate fresh.
|
|
19
|
-
|
|
20
|
-
## When NOT to Use
|
|
21
|
-
|
|
22
|
-
- Có integration mới và muốn cascade thay đổi frd lên tsd hiện tại → dùng `/spec-test` (changeset patch giữ ID stable)
|
|
23
|
-
- Chỉ muốn sửa vài TC → edit `tsd.md` trực tiếp
|
|
24
|
-
- Feature chưa có frd.md → chạy `/spec-brownfield-feature` (brownfield) hoặc `/spec-new` (greenfield) trước
|
|
25
|
-
|
|
26
|
-
## Cảnh báo về ID stability
|
|
27
|
-
|
|
28
|
-
`/spec-tsd` **regenerate IDs từ 001** mỗi lần chạy. Nếu tsd.md đã tồn tại và đang được reference (vd: test code có `// covers TC-F001-005`), rebuild sẽ làm vỡ những reference đó.
|
|
29
|
-
|
|
30
|
-
Quy tắc:
|
|
31
|
-
- **tsd.md chưa tồn tại** → an toàn, không có reference, regenerate fresh.
|
|
32
|
-
- **tsd.md tồn tại** → skill hỏi confirm rõ ràng trước khi overwrite. Khuyến nghị: dùng `/spec-test` qua integration changeset để preserve ID stable.
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## Process
|
|
37
|
-
|
|
38
|
-
### Bước 1: Xác định feature
|
|
39
|
-
|
|
40
|
-
**Nếu có ARGUMENT:**
|
|
41
|
-
- Parse argument: có thể là feature ID (`F-001`, `001`) hoặc slug (`F-001-auth`, `auth`)
|
|
42
|
-
- Quét `.specs/main/feature/*/frd.md`, tìm feature khớp
|
|
43
|
-
- Nếu không tìm thấy → báo lỗi:
|
|
44
|
-
> Không tìm thấy feature khớp với "{argument}". Kiểm tra `.specs/main/feature/`.
|
|
45
|
-
|
|
46
|
-
**Nếu không có ARGUMENT:**
|
|
47
|
-
|
|
48
|
-
Quét `.specs/main/feature/`. Liệt kê **tất cả** features có `frd.md`, đánh dấu trạng thái tsd:
|
|
49
|
-
|
|
50
|
-
```
|
|
51
|
-
Features có frd.md:
|
|
52
|
-
|
|
53
|
-
[1] F-001 — auth spec✓ tsd✓
|
|
54
|
-
[2] F-002 — checkout spec✓ tsd—
|
|
55
|
-
[3] F-003 — refund spec✓ tsd— (frd có 5 Flow, 12 US, 8 VR, 3 FAC)
|
|
56
|
-
|
|
57
|
-
Chọn số feature:
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
Nếu không có feature nào có frd → thông báo:
|
|
61
|
-
> Chưa có feature nào có frd.md. Hãy chạy `/spec-brownfield-feature` hoặc `/spec-new` trước.
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
### Bước 2: Gate check — frd.md tồn tại + warn nếu tsd.md đã có
|
|
66
|
-
|
|
67
|
-
**Check 1 — frd.md tồn tại:**
|
|
68
|
-
|
|
69
|
-
Nếu `.specs/main/feature/{F-XXX}-{slug}/frd.md` không tồn tại → dừng:
|
|
70
|
-
> ⛔ `feature/{F-XXX}-{slug}/frd.md` không tồn tại. `/spec-tsd` cần frd làm input.
|
|
71
|
-
|
|
72
|
-
**Check 2 — tsd.md đã tồn tại:**
|
|
73
|
-
|
|
74
|
-
Nếu `.specs/main/feature/{F-XXX}-{slug}/tsd.md` đã tồn tại:
|
|
75
|
-
|
|
76
|
-
> ⚠ `tsd.md` đã tồn tại cho feature **{F-XXX} — {slug}**.
|
|
77
|
-
>
|
|
78
|
-
> `/spec-tsd` regenerate IDs từ 001 — nếu có test code đang reference TC-{F_ID}-NNN hoặc TS-{F_ID}-NNN, references sẽ bị vỡ.
|
|
79
|
-
>
|
|
80
|
-
> Khuyến nghị: dùng `/spec-test` qua integration changeset để giữ ID stable.
|
|
81
|
-
>
|
|
82
|
-
> Tiếp tục overwrite? (yes / no — default no)
|
|
83
|
-
|
|
84
|
-
Nếu user chọn no → dừng, suggest `/spec-test`.
|
|
85
|
-
Nếu user chọn yes → backup tsd.md cũ thành `tsd.md.bak.{timestamp}` rồi proceed.
|
|
86
|
-
|
|
87
|
-
---
|
|
88
|
-
|
|
89
|
-
### Bước 3: Load context
|
|
90
|
-
|
|
91
|
-
Load các file sau:
|
|
92
|
-
|
|
93
|
-
- `.specs/main/feature/{F-XXX}-{slug}/frd.md` — **bắt buộc**, source của TC
|
|
94
|
-
- `.specs/main/feature/{F-XXX}-{slug}/fdd.md` — optional, đọc nếu tồn tại để hint Components Used (cho Dependencies section của tsd)
|
|
95
|
-
|
|
96
|
-
Tóm tắt context:
|
|
97
|
-
|
|
98
|
-
```
|
|
99
|
-
TÔI HIỂU:
|
|
100
|
-
- Feature: {F-XXX} — {slug}
|
|
101
|
-
- Trong frd.md:
|
|
102
|
-
- {N} Flows
|
|
103
|
-
- {M} User Stories ({K} Acceptance Criteria)
|
|
104
|
-
- {P} Verification Rules
|
|
105
|
-
- {Q} Feature Acceptance Criteria
|
|
106
|
-
- tsd.md hiện tại: {chưa có / sẽ overwrite — backup tại tsd.md.bak.{timestamp}}
|
|
107
|
-
- fdd.md: {tồn tại — Components Used: C-XXX, C-YYY / chưa có}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
### Bước 4: Auto-derive draft
|
|
113
|
-
|
|
114
|
-
**Nguyên tắc:** mechanical derive 1:1 từ frd.md — same algorithm như `/spec-test` (xem [skills/spec-test/SKILL.md](../spec-test/SKILL.md) Bước 3.1-3.3). Tóm lại:
|
|
115
|
-
|
|
116
|
-
#### 4.1 ID assignment
|
|
117
|
-
|
|
118
|
-
- IDs bắt đầu từ `001` (vì tạo mới hoặc regenerate). TS và TC cùng feature ID `F{NNN}`, TC dùng chung sequence cho Functional / Validation / Feature AC.
|
|
119
|
-
- ID sẽ stable kể từ thời điểm này — lần edit tiếp theo qua `/spec-test` integration phải preserve.
|
|
120
|
-
|
|
121
|
-
#### 4.2 Derivation rules
|
|
122
|
-
|
|
123
|
-
| frd item | tsd output |
|
|
124
|
-
| --- | --- |
|
|
125
|
-
| Mỗi `Flow {N}` trong User Flows | 1 Test Scenario `TS-F{NNN}-{seq}` |
|
|
126
|
-
| Mỗi `AC-F{NNN}-{seq}` trong US | 1 Functional TC `TC-F{NNN}-{seq}` |
|
|
127
|
-
| Mỗi `VR-F{NNN}-{seq}` | 1 positive + 1+ negative Validation TC |
|
|
128
|
-
| Mỗi `FAC-F{NNN}-{seq}` | 1 Feature AC TC |
|
|
129
|
-
|
|
130
|
-
Detail dịch G/W/T → Preconditions/Steps/Expected, infer negative VR branches từ rule text — xem `/spec-test` Bước 3.2.
|
|
131
|
-
|
|
132
|
-
#### 4.3 Priority defaults
|
|
133
|
-
|
|
134
|
-
| Source | Priority |
|
|
135
|
-
| --- | --- |
|
|
136
|
-
| TC cover US Must | P0 |
|
|
137
|
-
| TC cover US Should | P1 |
|
|
138
|
-
| TC cover US Could | P2 |
|
|
139
|
-
| TC cover VR | inherit max priority của Refs (P1 default nếu Refs trống) |
|
|
140
|
-
| TC cover FAC e2e | P0 |
|
|
141
|
-
| TC cover FAC consistency | P1 |
|
|
142
|
-
| TC cover FAC NFR security/data | P0 |
|
|
143
|
-
| TC cover FAC NFR perf/a11y/i18n/browser | P1 |
|
|
144
|
-
| TC cover FAC data & migration | P0 |
|
|
145
|
-
|
|
146
|
-
#### 4.4 Traceability Matrix
|
|
147
|
-
|
|
148
|
-
Row per frd item — Flow / US / Story AC / VR / FAC. Mọi item phải có cover ✅. Item không thể derive → ❌ + ghi lý do ở Gaps section.
|
|
149
|
-
|
|
150
|
-
#### 4.5 Placeholders cần QC fill
|
|
151
|
-
|
|
152
|
-
Agent **không suy đoán**:
|
|
153
|
-
|
|
154
|
-
| Field | Placeholder |
|
|
155
|
-
| --- | --- |
|
|
156
|
-
| Environments table | Row mặc định `dev / staging / prod-like` với data set `TBD`, mục đích `TBD` |
|
|
157
|
-
| Test Data table | Row `{TBD — fixture}` cho mỗi dataset thấy cần |
|
|
158
|
-
| Out of Scope | Để trống với note `<!-- QC fill -->` |
|
|
159
|
-
| Test Strategy > Approach | Bullet generic theo template gốc |
|
|
160
|
-
| Overview | 2-3 câu mô tả feature scope từ frd Overview |
|
|
161
|
-
|
|
162
|
-
#### 4.6 Dependencies section
|
|
163
|
-
|
|
164
|
-
- **FRD reference**: path tới `frd.md` của feature này
|
|
165
|
-
- **Components Used**: copy từ `frd.md > Components Used`. Nếu fdd.md tồn tại → cross-reference C-XXX để đảm bảo đúng.
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
### Bước 5: Review — xác nhận với QC
|
|
170
|
-
|
|
171
|
-
Hiển thị draft đầy đủ — chưa ghi file.
|
|
172
|
-
|
|
173
|
-
> Draft tsd.md trên đã đúng chưa? Check:
|
|
174
|
-
>
|
|
175
|
-
> 1. **Coverage** — Traceability Matrix có đủ row cho mỗi Flow / US / AC / VR / FAC trong frd?
|
|
176
|
-
> 2. **Priority** — defaults theo bảng 4.3, có TC nào cần override?
|
|
177
|
-
> 3. **Placeholders** — fill Environments / Test Data / Out of Scope / Strategy Approach.
|
|
178
|
-
> 4. **Extra edge cases** — ngoài AC/VR có scenario QC muốn thêm?
|
|
179
|
-
>
|
|
180
|
-
> Confirm để ghi file. Reject để revise.
|
|
181
|
-
|
|
182
|
-
---
|
|
183
|
-
|
|
184
|
-
### Bước 6: Save
|
|
185
|
-
|
|
186
|
-
Ghi `.specs/main/feature/{F-XXX}-{slug}/tsd.md` với status `draft` (feature-level artifact có lifecycle riêng, không phải `approved` — QC còn fill placeholders nên status `draft` cho đến khi đầy đủ). Frontmatter lấy `template_version` từ `tsd-template.md` (xem `conventions.md` §7).
|
|
187
|
-
|
|
188
|
-
Nếu overwrite — file backup `tsd.md.bak.{timestamp}` đã tạo ở Bước 2.
|
|
189
|
-
|
|
190
|
-
**Change History:** Append entry vào section `## Change History` cuối tsd.md (theo `conventions.md` §5.5):
|
|
191
|
-
|
|
192
|
-
```markdown
|
|
193
|
-
### {YYYY-MM-DD} — manual — create
|
|
194
|
-
|
|
195
|
-
- **All sections**: initial scaffold qua /spec-tsd (mechanical derive từ frd.md — N TS, M Functional TC, P Validation TC, Q Feature AC TC)
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
Nếu overwrite tsd.md cũ → entry vẫn dùng operation `create` (vì IDs regenerate fresh, không phải update), thêm note trong body: `- **Note**: overwrote previous tsd.md (backup tại tsd.md.bak.{timestamp}) — IDs regenerated từ 001`.
|
|
199
|
-
|
|
200
|
-
Thông báo kết quả:
|
|
201
|
-
|
|
202
|
-
```
|
|
203
|
-
✓ .specs/main/feature/{F-XXX}-{slug}/tsd.md đã được tạo (status: draft)
|
|
204
|
-
Coverage: N Flows → N TS, M US/AC → M Functional TC, P VR → ~2P Validation TC, Q FAC → Q Feature AC TC
|
|
205
|
-
{nếu overwrite: backup tại tsd.md.bak.{timestamp}}
|
|
206
|
-
|
|
207
|
-
Bước tiếp theo:
|
|
208
|
-
- QC: fill remaining placeholders (Environments, Test Data, Out of Scope, Strategy)
|
|
209
|
-
- Đổi status: draft → approved khi sẵn sàng
|
|
210
|
-
- Sau này: nếu frd thay đổi → dùng /spec-test qua integration changeset để giữ ID stable
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
---
|
|
214
|
-
|
|
215
|
-
## Common Rationalizations
|
|
216
|
-
|
|
217
|
-
| Rationalization | Reality |
|
|
218
|
-
| --- | --- |
|
|
219
|
-
| "Có frd rồi, viết tsd sau cũng được" | Test coverage không tracked = không biết feature đóng được chưa. tsd làm song song với frd, không sau. |
|
|
220
|
-
| "Rebuild tsd nhanh hơn cập nhật manual" | Đúng cho lần đầu. Lần sau khi đã có test code reference → rebuild sẽ break references. Lúc đó dùng `/spec-test`. |
|
|
221
|
-
| "Brownfield không cần tsd, đã có test code" | Test code là HOW. tsd là WHAT — declarative TC list để track coverage vs frd. Hai layer khác nhau. |
|
|
222
|
-
|
|
223
|
-
## Red Flags
|
|
224
|
-
|
|
225
|
-
- Traceability Matrix có ❌ mà không có Gaps section giải thích
|
|
226
|
-
- Priority hàng loạt P1 — chưa override theo defaults
|
|
227
|
-
- Test Strategy / Test Data toàn `TBD` sau khi QC review xong
|
|
228
|
-
- Overwrite tsd.md hiện có mà không cảnh báo về ID break
|
|
229
|
-
|
|
230
|
-
## Verification
|
|
231
|
-
|
|
232
|
-
Trước khi ghi file:
|
|
233
|
-
|
|
234
|
-
- [ ] Mỗi Flow trong frd có 1 TS
|
|
235
|
-
- [ ] Mỗi US AC có TC Functional cover
|
|
236
|
-
- [ ] Mỗi VR có ≥1 positive + ≥1 negative TC
|
|
237
|
-
- [ ] Mỗi FAC có TC Feature AC cover
|
|
238
|
-
- [ ] Priority deterministic theo bảng 4.3
|
|
239
|
-
- [ ] Nếu overwrite: tsd.md.bak.{timestamp} đã được tạo
|
|
240
|
-
- [ ] QC đã confirm draft
|
|
241
|
-
- [ ] Frontmatter có `template_version` copy từ `tsd-template.md`
|