spec-lite 1.4.2 → 1.4.5
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 +21 -21
- package/package.json +1 -1
- package/skills/ado-config/SKILL.md +1 -1
- package/skills/ado-create/SKILL.md +7 -7
- package/skills/ado-update/SKILL.md +1 -1
- package/skills/archive/SKILL.md +19 -19
- package/skills/build/SKILL.md +5 -5
- package/skills/plan/SKILL.md +6 -6
- package/skills/review-everything/SKILL.md +9 -9
- package/skills/review-integration/SKILL.md +7 -7
- package/skills/scaffold/SKILL.md +9 -9
- package/skills/spec-brownfield-component/SKILL.md +11 -11
- package/skills/spec-brownfield-feature/SKILL.md +13 -13
- package/skills/spec-brownfield-init/SKILL.md +16 -14
- package/skills/spec-frd/SKILL.md +74 -18
- package/skills/spec-frd-update/SKILL.md +9 -9
- package/skills/spec-new/SKILL.md +13 -12
- package/skills/spec-prd/SKILL.md +41 -11
- package/skills/spec-remove/SKILL.md +27 -27
- package/skills/spec-sad/SKILL.md +47 -10
- package/skills/spec-tech/SKILL.md +16 -16
- package/skills/spec-test/SKILL.md +15 -15
- package/skills/spec-tsd/SKILL.md +10 -10
- package/skills-overview.md +32 -28
- package/templates/main/domain-template.md +11 -5
- package/templates/main/feature/frd-template.md +1 -1
- package/templates/main/prd-template.md +1 -1
- package/templates/main/sad-template.md +8 -0
|
@@ -7,7 +7,7 @@ description: Discover features từ code, generate frd.md + fdd.md cho từng fe
|
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Tạo
|
|
10
|
+
Tạo `.specs/main/feature/{F-XXX}-{feature-name}/frd.md` và `fdd.md` cho các features trong brownfield project.
|
|
11
11
|
|
|
12
12
|
Skill này **tự discover** features từ routes, use cases, và test files, sau đó scan sâu để extract user stories, AC, và inter-component flows. Khi hoàn thành, **điền Feature Index vào prd.md**.
|
|
13
13
|
|
|
@@ -33,9 +33,9 @@ Skill này **tự discover** features từ routes, use cases, và test files, sa
|
|
|
33
33
|
**Path:** Nếu có ARGUMENT là path → dùng làm root. Nếu không → CWD.
|
|
34
34
|
|
|
35
35
|
**Load:**
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
36
|
+
- `.specs/main/prd.md` — kiểm tra Component Index đã được điền
|
|
37
|
+
- `.specs/main/domain.md` — đọc Glossary và Shared Entities
|
|
38
|
+
- `.specs/main/component/*/crd.md` — đọc Public Interface của từng component (để cross-reference trong fdd.md)
|
|
39
39
|
|
|
40
40
|
**Kiểm tra preconditions:**
|
|
41
41
|
|
|
@@ -46,7 +46,7 @@ Nếu `prd.md` Component Index còn trống (không có C-XXX entries) → dừn
|
|
|
46
46
|
> Component Index chưa có entries. Hãy chạy `/spec-brownfield-component` trước.
|
|
47
47
|
> fdd.md cần tham chiếu C-XXX để mô tả inter-component flows.
|
|
48
48
|
|
|
49
|
-
Nếu
|
|
49
|
+
Nếu `.specs/main/component/` không có crd.md nào → cảnh báo tương tự và dừng.
|
|
50
50
|
|
|
51
51
|
**Attachments:**
|
|
52
52
|
> Bạn có tài liệu bổ sung nào không? (user stories, test plans, wireframes, existing specs)
|
|
@@ -216,10 +216,10 @@ Với mỗi feature, generate 2 files dùng templates tương ứng:
|
|
|
216
216
|
|
|
217
217
|
```
|
|
218
218
|
Sẽ tạo {N} features ({2N} files):
|
|
219
|
-
✓ specs/main/feature/F-001-user-registration/frd.md (4 NEEDS_CLARIFY)
|
|
220
|
-
✓ specs/main/feature/F-001-user-registration/fdd.md (2 NEEDS_CLARIFY)
|
|
221
|
-
✓ specs/main/feature/F-002-authentication/frd.md (1 NEEDS_CLARIFY)
|
|
222
|
-
✓ specs/main/feature/F-002-authentication/fdd.md (0 NEEDS_CLARIFY)
|
|
219
|
+
✓ .specs/main/feature/F-001-user-registration/frd.md (4 NEEDS_CLARIFY)
|
|
220
|
+
✓ .specs/main/feature/F-001-user-registration/fdd.md (2 NEEDS_CLARIFY)
|
|
221
|
+
✓ .specs/main/feature/F-002-authentication/frd.md (1 NEEDS_CLARIFY)
|
|
222
|
+
✓ .specs/main/feature/F-002-authentication/fdd.md (0 NEEDS_CLARIFY)
|
|
223
223
|
...
|
|
224
224
|
|
|
225
225
|
Ghi tất cả? [y] hoặc review từng file trước [r]:
|
|
@@ -237,7 +237,7 @@ Ghi tất cả? [y] hoặc review từng file trước [r]:
|
|
|
237
237
|
|
|
238
238
|
### Bước 8: Điền Feature Index vào prd.md
|
|
239
239
|
|
|
240
|
-
Sau khi artifacts đã được ghi, update
|
|
240
|
+
Sau khi artifacts đã được ghi, update `.specs/main/prd.md` Feature Index:
|
|
241
241
|
|
|
242
242
|
```
|
|
243
243
|
Sẽ điền Feature Index vào prd.md:
|
|
@@ -267,8 +267,8 @@ Khi apply → đồng thời append entry vào `## Change History` của prd.md
|
|
|
267
267
|
|
|
268
268
|
```
|
|
269
269
|
✓ Generated {N} features:
|
|
270
|
-
specs/main/feature/F-001-user-registration/ (frd.md + fdd.md)
|
|
271
|
-
specs/main/feature/F-002-authentication/ (frd.md + fdd.md)
|
|
270
|
+
.specs/main/feature/F-001-user-registration/ (frd.md + fdd.md)
|
|
271
|
+
.specs/main/feature/F-002-authentication/ (frd.md + fdd.md)
|
|
272
272
|
...
|
|
273
273
|
|
|
274
274
|
✓ prd.md Feature Index: {N} entries đã được điền
|
|
@@ -279,7 +279,7 @@ NEEDS_CLARIFY summary — {total} items:
|
|
|
279
279
|
...
|
|
280
280
|
|
|
281
281
|
Brownfield init hoàn tất! Main artifacts:
|
|
282
|
-
specs/main/
|
|
282
|
+
.specs/main/
|
|
283
283
|
├── prd.md (Component Index: {N} | Feature Index: {N})
|
|
284
284
|
├── domain.md (Glossary: {N} terms | Shared Entities: {N})
|
|
285
285
|
├── sad.md
|
|
@@ -7,7 +7,7 @@ description: Khởi tạo main artifacts (prd.md, domain.md, sad.md) cho brownfi
|
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Tạo
|
|
10
|
+
Tạo `.specs/main/prd.md`, `.specs/main/domain.md`, và `.specs/main/sad.md` cho một project đã tồn tại.
|
|
11
11
|
|
|
12
12
|
Skill này chỉ tập trung vào **product và architecture level** — những gì có thể extract từ README, docs, config, và kiến trúc tổng thể. Component Index và Feature Index trong prd.md sẽ **để trống** — chúng sẽ được điền bởi `/spec-brownfield-component` và `/spec-brownfield-feature` sau khi scan code chuyên sâu.
|
|
13
13
|
|
|
@@ -17,9 +17,9 @@ Mỗi file output được sinh ra từ template tương ứng — đọc templa
|
|
|
17
17
|
|
|
18
18
|
| Output file | Template |
|
|
19
19
|
| --- | --- |
|
|
20
|
-
|
|
|
21
|
-
|
|
|
22
|
-
|
|
|
20
|
+
| `.specs/main/prd.md` | `templates/main/prd-template.md` |
|
|
21
|
+
| `.specs/main/domain.md` | `templates/main/domain-template.md` |
|
|
22
|
+
| `.specs/main/sad.md` | `templates/main/sad-template.md` |
|
|
23
23
|
|
|
24
24
|
Giữ nguyên cấu trúc section và frontmatter từ template. Điền nội dung thu thập được từ scan và interview vào đúng vị trí.
|
|
25
25
|
|
|
@@ -32,7 +32,7 @@ Thông tin không thể detect từ code được đánh dấu nhất quán:
|
|
|
32
32
|
## When to Use
|
|
33
33
|
|
|
34
34
|
- Onboarding một brownfield project vào SDD workflow
|
|
35
|
-
-
|
|
35
|
+
- `.specs/main/prd.md` chưa có hoặc còn trống
|
|
36
36
|
|
|
37
37
|
## When NOT to Use
|
|
38
38
|
|
|
@@ -63,14 +63,14 @@ Load tất cả attachments trước khi scan. Dùng làm context bổ sung tron
|
|
|
63
63
|
|
|
64
64
|
### Bước 2: Kiểm tra existing specs
|
|
65
65
|
|
|
66
|
-
Kiểm tra
|
|
66
|
+
Kiểm tra `.specs/main/prd.md`, `.specs/main/domain.md`, `.specs/main/sad.md`:
|
|
67
67
|
|
|
68
68
|
Nếu một trong ba đã có nội dung thực → cảnh báo:
|
|
69
69
|
|
|
70
70
|
```
|
|
71
71
|
⚠ File đã có nội dung:
|
|
72
|
-
- specs/main/prd.md
|
|
73
|
-
- specs/main/sad.md
|
|
72
|
+
- .specs/main/prd.md
|
|
73
|
+
- .specs/main/sad.md
|
|
74
74
|
|
|
75
75
|
Skill này sẽ overwrite các file trên. Tiếp tục? [y/n]
|
|
76
76
|
```
|
|
@@ -236,7 +236,7 @@ Phần lớn auto từ scan. Chỉ hỏi 2 câu.
|
|
|
236
236
|
[0] Chưa rõ → NEEDS_CLARIFY tất cả
|
|
237
237
|
```
|
|
238
238
|
|
|
239
|
-
**7c. Hỏi
|
|
239
|
+
**7c. Hỏi architectural decisions (→ ADR Log):**
|
|
240
240
|
|
|
241
241
|
```
|
|
242
242
|
❓ Có architectural decision nào quan trọng chưa detect được không?
|
|
@@ -245,6 +245,8 @@ Phần lớn auto từ scan. Chỉ hỏi 2 câu.
|
|
|
245
245
|
[0] Không có thêm
|
|
246
246
|
```
|
|
247
247
|
|
|
248
|
+
Điền **ADR Log**: tạo ADR entry (status `accepted`) cho mỗi quyết định lớn — gồm cả các quyết định infer được ở 7a (architecture style, tech stack chính, communication) lẫn câu trả lời 7c. Mỗi entry ghi context/rationale + consequences ở mức suy luận được từ code; chỗ không chắc → NEEDS_CLARIFY.
|
|
249
|
+
|
|
248
250
|
---
|
|
249
251
|
|
|
250
252
|
### Bước 8: Review drafts
|
|
@@ -253,7 +255,7 @@ Hiển thị draft từng file lần lượt. Với mỗi file:
|
|
|
253
255
|
|
|
254
256
|
```
|
|
255
257
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
256
|
-
DRAFT: specs/main/{file}
|
|
258
|
+
DRAFT: .specs/main/{file}
|
|
257
259
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
258
260
|
{nội dung draft}
|
|
259
261
|
|
|
@@ -270,7 +272,7 @@ Confirm? [y] Bỏ qua [n] Chỉnh sửa [e]:
|
|
|
270
272
|
|
|
271
273
|
### Bước 9: Save
|
|
272
274
|
|
|
273
|
-
Tạo
|
|
275
|
+
Tạo `.specs/main/` nếu chưa có. Ghi các files đã được confirm.
|
|
274
276
|
|
|
275
277
|
**Change History:** Append entry vào section `## Change History` cuối mỗi file vừa ghi (`prd.md`, `domain.md`, `sad.md`) theo `conventions.md` §5.5:
|
|
276
278
|
|
|
@@ -281,9 +283,9 @@ Tạo `specs/main/` nếu chưa có. Ghi các files đã được confirm.
|
|
|
281
283
|
```
|
|
282
284
|
|
|
283
285
|
```
|
|
284
|
-
✓ specs/main/prd.md (Component Index và Feature Index: placeholder — chưa có)
|
|
285
|
-
✓ specs/main/domain.md (Glossary: {n} terms | Shared Entities: trống — sẽ mọc qua cascade)
|
|
286
|
-
✓ specs/main/sad.md
|
|
286
|
+
✓ .specs/main/prd.md (Component Index và Feature Index: placeholder — chưa có)
|
|
287
|
+
✓ .specs/main/domain.md (Glossary: {n} terms | Shared Entities: trống — sẽ mọc qua cascade)
|
|
288
|
+
✓ .specs/main/sad.md
|
|
287
289
|
|
|
288
290
|
NEEDS_CLARIFY summary — {total} items cần làm rõ:
|
|
289
291
|
prd.md: {n} — [Problem Statement, Business Constraints, ...]
|
package/skills/spec-frd/SKILL.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spec-frd
|
|
3
|
-
description: Author MỚI frd.md (Feature Requirements Document) trực tiếp ở feature level qua interview. Role BA, chạy trước integration. CREATE-only, đúng một feature/lần: frd đã tồn tại → redirect /spec-new (delta cascade); nguồn nhiều feature → redirect /spec-prd. Nhận F-XXX từ argument (hoặc chọn từ prd Feature Index) + tùy chọn nguồn baseline (path/@file/paste). Chỉ author frd.md (+ register feature row vào prd nếu feature mới) — reference component, KHÔNG tạo crd/cdd.
|
|
3
|
+
description: Author MỚI frd.md (Feature Requirements Document) trực tiếp ở feature level qua interview. Role BA, chạy trước integration. CREATE-only, đúng một feature/lần: frd đã tồn tại → redirect /spec-new (delta cascade); nguồn nhiều feature → redirect /spec-prd. Nhận F-XXX từ argument (hoặc chọn từ prd Feature Index) + tùy chọn nguồn baseline (path/@file/paste). Chỉ author frd.md (+ register feature row vào prd nếu feature mới; cascade glossary term + định nghĩa shared entity lên domain, Owner TBD để /spec-sad gán) — reference component, KHÔNG tạo crd/cdd.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# spec-frd
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Author
|
|
10
|
+
Author `.specs/main/feature/{F-XXX}-{feature-slug}/frd.md` trực tiếp qua interview — **spec-first ở feature level**, do **BA** chạy trước khi bất kỳ integration nào bắt đầu.
|
|
11
11
|
|
|
12
12
|
`frd.md` là **what to build** của một feature: Overview, User Flows, Feature AC, User Stories, Verification Rules, Scope, Dependencies. Đây là baseline ổn định, **author một lần** — mọi thay đổi sau đó đi qua `/spec-new` (delta cascade).
|
|
13
13
|
|
|
@@ -20,10 +20,11 @@ Skill này là cặp greenfield đối xứng với `/spec-brownfield-feature` (
|
|
|
20
20
|
**Phạm vi hẹp — chủ yếu frd.md:**
|
|
21
21
|
- ✅ Author frd.md (7 sections) cho **một** feature **chưa có frd**.
|
|
22
22
|
- ✅ *Reference* component frd phụ thuộc (Components Used) + ghi component cần-nhưng-chưa-có như **candidate**.
|
|
23
|
-
- ✅ Nếu feature mục tiêu là feature mới chưa có trong Index → **register một row vào `prd.md > Features`** (side-effect hợp lệ
|
|
23
|
+
- ✅ Nếu feature mục tiêu là feature mới chưa có trong Index → **register một row vào `prd.md > Features`** (side-effect hợp lệ lên prd).
|
|
24
|
+
- ✅ **Cascade vocabulary lên `domain.md`** (Bước 4b — pha *mô tả hệ thống*/WHAT): glossary term + **định nghĩa entity đầy đủ** (attributes). `Owner` của entity để `TBD` cho `/spec-sad` điền ở pha *thiết kế hệ thống* (HOW). BA duyệt trước khi ghi. Đây là điểm khác với phiên bản trước (`/spec-frd` từng không đụng domain) — vocabulary sinh ra ở feature-authoring time nên seed luôn, thay vì để domain rỗng tới integration đầu tiên.
|
|
24
25
|
- ❌ KHÔNG tạo/sửa `crd.md`/`cdd.md` — component artifacts ra đời ở integration time qua `/spec-new` cascade.
|
|
25
26
|
- ❌ KHÔNG tạo `fdd.md` (inter-component design) hay `tsd.md` (test) — để skill/role khác lo.
|
|
26
|
-
- ❌ KHÔNG đổi status feature đã c
|
|
27
|
+
- ❌ KHÔNG carve component / quyết `Owner` của shared entity (để `/spec-sad`/`/spec-new`); KHÔNG đổi status feature đã có; KHÔNG đụng sad.
|
|
27
28
|
|
|
28
29
|
## When to Use
|
|
29
30
|
|
|
@@ -59,7 +60,7 @@ Có nguồn → trích baseline cho từng section frd (overview, flows, stories
|
|
|
59
60
|
|
|
60
61
|
### Bước 1: Xác định feature
|
|
61
62
|
|
|
62
|
-
**Precondition:** đọc
|
|
63
|
+
**Precondition:** đọc `.specs/main/prd.md`. Nếu không tồn tại / template rỗng → dừng:
|
|
63
64
|
> `prd.md` chưa có nội dung. Hãy chạy `/spec-prd` trước.
|
|
64
65
|
|
|
65
66
|
`/spec-frd` là skill **CREATE-only, đúng một feature mỗi lần chạy**. Xác định feature mục tiêu qua ba gate — phải pass cả ba mới vào interview.
|
|
@@ -103,7 +104,7 @@ Chọn feature để author frd:
|
|
|
103
104
|
|
|
104
105
|
#### 1c. Create-only gate — frd.md CHƯA tồn tại
|
|
105
106
|
|
|
106
|
-
Kiểm tra
|
|
107
|
+
Kiểm tra `.specs/main/feature/{F-XXX}-*/frd.md`.
|
|
107
108
|
|
|
108
109
|
- **Chưa tồn tại** → tiếp Bước 2 (author mới).
|
|
109
110
|
- **Đã tồn tại** → **DỪNG**, redirect `/spec-new`:
|
|
@@ -117,10 +118,10 @@ Kiểm tra `specs/main/feature/{F-XXX}-*/frd.md`.
|
|
|
117
118
|
### Bước 2: Load context
|
|
118
119
|
|
|
119
120
|
Load:
|
|
120
|
-
-
|
|
121
|
-
-
|
|
122
|
-
-
|
|
123
|
-
-
|
|
121
|
+
- `.specs/main/prd.md` — Problem Statement, Target Users (personas), Scope, **row của feature này** trong Feature Index (tên, mô tả, priority), Component Index, **cột ADO** (nếu feature có ticket → lưu lại để spec.md sau này không tạo duplicate).
|
|
122
|
+
- `.specs/main/domain.md` — Glossary + Shared Entities liên quan.
|
|
123
|
+
- `.specs/main/sad.md` — bảng Components (góc nhìn kiến trúc, để biết C-XXX nào đã có boundary).
|
|
124
|
+
- `.specs/main/component/{C-XXX}-*/crd.md` — Public Interface của các component khả năng feature sẽ dùng (nếu đã tồn tại).
|
|
124
125
|
|
|
125
126
|
Tóm tắt context + surface assumptions:
|
|
126
127
|
|
|
@@ -186,6 +187,33 @@ Lý do: giữ **một authority duy nhất** cho việc carve component (archite
|
|
|
186
187
|
|
|
187
188
|
---
|
|
188
189
|
|
|
190
|
+
### Bước 4b: Trích domain vocabulary (glossary + định nghĩa entity)
|
|
191
|
+
|
|
192
|
+
Author frd là **điểm đầu tiên** business vocabulary xuất hiện cụ thể. Để `domain.md` không nằm rỗng tới integration đầu tiên (và để term không trôi/đụng nhau giữa các frd), skill seed vocabulary mới vào `domain.md` ngay tại BA-time. Giống VR và component candidate: **agent đề xuất, BA quyết** — không tự assert.
|
|
193
|
+
|
|
194
|
+
Đọc `domain.md` (đã load ở Bước 2) để biết Glossary/Shared Entities **đã có gì**, rồi rà draft frd tìm cái **mới**:
|
|
195
|
+
|
|
196
|
+
**1. Glossary term — ghi thẳng.** Thuật ngữ business xuất hiện trong frd mà chưa có trong domain Glossary. Glossary thuần vocabulary, không phụ thuộc component → cascade trực tiếp được. Với mỗi term đề xuất:
|
|
197
|
+
> Term mới phát hiện: **{term}** — đề xuất định nghĩa: "{định nghĩa}". Thêm vào domain Glossary? [y / sửa / bỏ]
|
|
198
|
+
|
|
199
|
+
Cấm: định nghĩa mơ hồ, hoặc nhét term thực ra là tên feature/component (không phải vocabulary nghiệp vụ).
|
|
200
|
+
|
|
201
|
+
**2. Entity — định nghĩa đầy đủ (WHAT), `Owner` để design-time điền.** Đây là điểm tách bạch quan trọng:
|
|
202
|
+
|
|
203
|
+
- **Define entity là *mô tả hệ thống* (WHAT)** → thuộc BA, làm ngay tại frd-time. BA định nghĩa entity đầy đủ: tên, mô tả, **attributes** (business type: text/number/money/date/email/phone), state machine nếu có lifecycle nghiệp vụ. Đây là vocabulary chung, không phải artifact hạng hai.
|
|
204
|
+
- **Entity *nằm ở component nào* (`Owner`) là *thiết kế hệ thống* (HOW)** → thuộc architect, điền ở `/spec-sad` (hoặc `/spec-new` khi carve). `/spec-frd` **không carve component** nên **không** quyết `Owner`.
|
|
205
|
+
|
|
206
|
+
Vì vậy khi seed entity vào domain Shared Entities:
|
|
207
|
+
- Điền đầy đủ definition + attributes từ frd.
|
|
208
|
+
- Để **`Owner: TBD (điền ở /spec-sad — design time)`** và **`Used by: TBD`**. Không phải vì entity "chưa chắc có thật", mà vì ownership là quyết định thiết kế chưa tới lượt.
|
|
209
|
+
- Entity rõ ràng chỉ là cấu trúc dữ liệu kỹ thuật nội bộ (không phải vocabulary nghiệp vụ) → không thuộc domain; bỏ qua, để lộ ra ở `crd.md` lúc carve.
|
|
210
|
+
|
|
211
|
+
> Entity feature mô tả: **{Entity}** với attributes {…}. Đây là vocabulary nghiệp vụ chung → mình seed định nghĩa vào domain (Owner để architect điền ở /spec-sad). Đồng ý? [y / sửa / bỏ]
|
|
212
|
+
|
|
213
|
+
BA quyết **định nghĩa entity** (WHAT); `Owner` để `/spec-sad` cascade bổ sung (HOW). Xem two-phase cascade ở `conventions.md` §5.5.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
189
217
|
### Bước 5: Write — sinh draft
|
|
190
218
|
|
|
191
219
|
Dùng `.claude/templates/main/feature/frd-template.md` làm skeleton, điền nội dung từ interview.
|
|
@@ -194,7 +222,9 @@ Dùng `.claude/templates/main/feature/frd-template.md` làm skeleton, điền n
|
|
|
194
222
|
|
|
195
223
|
**Frontmatter** frd mới: theo template, `status: draft`, `owner: BA`, `feature_id: F-XXX`.
|
|
196
224
|
|
|
197
|
-
Hiển thị **toàn bộ draft** cho user — chưa ghi file. Kèm
|
|
225
|
+
Hiển thị **toàn bộ draft** cho user — chưa ghi file. Kèm:
|
|
226
|
+
- danh sách component candidate (nếu có) và VR còn `TBD`;
|
|
227
|
+
- **danh sách domain vocabulary đề xuất** (Bước 4b): glossary term mới + định nghĩa shared entity (`Owner: TBD`), để BA duyệt trước khi cascade lên `domain.md`.
|
|
198
228
|
|
|
199
229
|
#### Verification Rules — quy ước sinh
|
|
200
230
|
|
|
@@ -215,6 +245,7 @@ Hiển thị **toàn bộ draft** cho user — chưa ghi file. Kèm danh sách c
|
|
|
215
245
|
> - User Stories + AC đo được chưa?
|
|
216
246
|
> - Verification Rules đã confirm với BA chưa (không còn TBD ngoài ý muốn)?
|
|
217
247
|
> - Components Used đúng chưa? Component candidate (nếu có) có hợp lý để chuyển cho /spec-sad không?
|
|
248
|
+
> - Glossary term / định nghĩa shared entity đề xuất cascade lên domain đã đúng chưa? (term có phải vocabulary nghiệp vụ thật, entity có đáng là shared không, attributes đủ chưa?)
|
|
218
249
|
|
|
219
250
|
Chỉ ghi file sau khi user confirm. Yêu cầu chỉnh → cập nhật draft → hỏi lại.
|
|
220
251
|
|
|
@@ -222,7 +253,7 @@ Chỉ ghi file sau khi user confirm. Yêu cầu chỉnh → cập nhật draft
|
|
|
222
253
|
|
|
223
254
|
### Bước 7: Save
|
|
224
255
|
|
|
225
|
-
**7a. Ghi
|
|
256
|
+
**7a. Ghi `.specs/main/feature/{F-XXX}-{slug}/frd.md`** — tạo thư mục nếu chưa có. Status `draft` (lifecycle riêng của artifact).
|
|
226
257
|
|
|
227
258
|
Slug feature lấy từ tên trong prd Feature Index, kebab-case (ví dụ F-001 "Authentication" → `F-001-authentication`).
|
|
228
259
|
|
|
@@ -251,14 +282,36 @@ Và append Change History entry vào prd.md (theo `conventions.md` §5.5):
|
|
|
251
282
|
- [NEW] F-XXX — {tên} (registered qua /spec-frd)
|
|
252
283
|
```
|
|
253
284
|
|
|
254
|
-
Đây là
|
|
285
|
+
Đây là side-effect hợp lệ của `/spec-frd` lên prd — thêm một feature row. Việc này atomic với 7a/7b: nếu fail thì rollback cả frd.
|
|
286
|
+
|
|
287
|
+
**7b''. (Chỉ khi Bước 4b/6 BA đã confirm vocabulary)** Cascade lên `.specs/main/domain.md`:
|
|
288
|
+
|
|
289
|
+
- **Glossary** → append row `[NEW]` cho mỗi term đã confirm: `| {term} | {định nghĩa} | {example/context} |`.
|
|
290
|
+
- **Shared Entities** → cho mỗi entity đã confirm, thêm một entry mới theo template với definition + attributes đầy đủ, để `**Owner:** TBD (điền ở /spec-sad — design time)` và `**Used by:** TBD`.
|
|
255
291
|
|
|
256
|
-
**
|
|
292
|
+
Append **một** Change History entry vào `domain.md`, operation = `manual` (author trực tiếp ngoài integration — cùng quy ước với 7b, theo `conventions.md` §5.5):
|
|
293
|
+
|
|
294
|
+
```markdown
|
|
295
|
+
### {YYYY-MM-DD} — manual — update
|
|
296
|
+
|
|
297
|
+
- **Glossary**:
|
|
298
|
+
- [NEW] {term} — {mô tả ngắn} (qua /spec-frd F-XXX)
|
|
299
|
+
- **Shared Entities**:
|
|
300
|
+
- [NEW] {Entity} — định nghĩa + attributes; Owner TBD chờ /spec-sad (qua /spec-frd F-XXX)
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
(Nếu domain.md đang là skeleton create lần đầu thì entry vẫn `manual`/`update` — file đã được `/spec-prd` scaffold với operation `create` từ trước.) Atomic với 7a: domain cascade fail → rollback cả frd. `Owner` của entity do `/spec-sad`/`/spec-new` cascade bổ sung sau (HOW phase) qua `[MODIFY Owner]`.
|
|
304
|
+
|
|
305
|
+
**7c. KHÔNG đụng gì khác.** Không đổi status của các feature *đã có* (frd tồn tại ≠ integration bắt đầu; marker "→ frd.md tồn tại" derive từ file existence). Không thêm component vào Index (chỉ candidate). Không carve component / không tự quyết `Owner` của shared entity. Không tạo crd/cdd/fdd/tsd. Không đụng sad.
|
|
257
306
|
|
|
258
307
|
**7d. Thông báo kết quả:**
|
|
259
308
|
|
|
260
309
|
```
|
|
261
|
-
✓ specs/main/feature/{F-XXX}-{slug}/frd.md đã được tạo (status: draft)
|
|
310
|
+
✓ .specs/main/feature/{F-XXX}-{slug}/frd.md đã được tạo (status: draft)
|
|
311
|
+
|
|
312
|
+
{nếu có} Domain cascade (pha mô tả hệ thống):
|
|
313
|
+
- Glossary: +{N} term
|
|
314
|
+
- Shared Entities: +{N} entity (định nghĩa đầy đủ; Owner TBD — chờ /spec-sad gán ở pha thiết kế)
|
|
262
315
|
|
|
263
316
|
{nếu có} Component candidate cần carve (chuyển cho architect / integration):
|
|
264
317
|
- {tên đề xuất} — {vai trò}
|
|
@@ -269,7 +322,7 @@ Và append Change History entry vào prd.md (theo `conventions.md` §5.5):
|
|
|
269
322
|
Bước tiếp theo:
|
|
270
323
|
- /spec-tsd F-XXX → QC bootstrap test spec từ frd này
|
|
271
324
|
- /spec-new F-XXX → DEV bắt đầu integration (frd sẽ được consume, crd/cdd sinh qua cascade)
|
|
272
|
-
{nếu có candidate} - /spec-sad → architect chốt boundary cho
|
|
325
|
+
{nếu có candidate hoặc entity Owner TBD} - /spec-sad → architect chốt boundary component + gán Owner cho shared entity
|
|
273
326
|
```
|
|
274
327
|
|
|
275
328
|
---
|
|
@@ -282,6 +335,8 @@ Bước tiếp theo:
|
|
|
282
335
|
| "BA cứ tạo luôn crd cho component cần" | Carve component là quyết định kiến trúc. BA tạo crd sớm = boundary sai sớm. Chỉ reference. |
|
|
283
336
|
| "Verification rule mình tự điền cho nhanh" | VR là business decision. Agent tự assert = rule sai mà không ai review. |
|
|
284
337
|
| "User Flows vẽ sau cũng được" | Flow buộc phải nghĩ edge case. Không có flow = AC thiếu nhánh thất bại. |
|
|
338
|
+
| "BA gán luôn Owner component cho entity cho gọn" | Ownership là quyết định *thiết kế* (HOW). BA gán sớm = boundary sai sớm. Để `Owner: TBD`, `/spec-sad` điền. |
|
|
339
|
+
| "Entity chưa biết owner thì khoan ghi vào domain" | Define entity là *mô tả* (WHAT) — độc lập với việc nó nằm ở component nào. Ghi định nghĩa luôn, Owner điền sau. |
|
|
285
340
|
|
|
286
341
|
## Red Flags
|
|
287
342
|
|
|
@@ -306,6 +361,7 @@ Bước tiếp theo:
|
|
|
306
361
|
- [ ] ID bắt đầu từ 001 (create mới)
|
|
307
362
|
- [ ] Components Used reference C-XXX có sẵn; component mới ghi candidate + surface cho /spec-sad
|
|
308
363
|
- [ ] Nếu register feature mới: prd Features có row [NEW] + Change History entry; status feature đã có KHÔNG đổi
|
|
309
|
-
- [ ]
|
|
310
|
-
- [ ]
|
|
364
|
+
- [ ] Domain cascade (nếu có vocabulary mới, đã BA confirm): Glossary term ghi đủ định nghĩa; Shared Entity ghi đủ definition + attributes với `Owner: TBD` (KHÔNG tự gán C-XXX); domain.md có Change History entry operation = `manual`
|
|
365
|
+
- [ ] KHÔNG tạo crd/cdd/fdd/tsd; KHÔNG carve component / gán Owner entity; KHÔNG đụng sad
|
|
366
|
+
- [ ] Change History entry (frd) operation = `manual` (luôn `create`)
|
|
311
367
|
- [ ] User đã confirm trước khi ghi file
|
|
@@ -7,7 +7,7 @@ description: Migrate frd.md hiện có lên cấu trúc template mới nhất
|
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Migrate các file
|
|
10
|
+
Migrate các file `.specs/main/feature/{F-XXX}-{slug}/frd.md` hiện có sang **format mới nhất** của [templates/main/feature/frd-template.md](../../templates/main/feature/frd-template.md).
|
|
11
11
|
|
|
12
12
|
Skill này **chỉ làm migration mechanical + propose** — không phải BA interview. Mọi quyết định nội dung mới (Verification Rules content) đều cần user approve trước khi ghi.
|
|
13
13
|
|
|
@@ -67,7 +67,7 @@ Chạy `git status --porcelain`. Nếu output không rỗng (có file modified /
|
|
|
67
67
|
Hãy commit hoặc stash thay đổi hiện tại trước khi chạy `/spec-frd-update`, rồi chạy lại.
|
|
68
68
|
|
|
69
69
|
Files dirty:
|
|
70
|
-
M specs/main/feature/F-001-auth/frd.md
|
|
70
|
+
M .specs/main/feature/F-001-auth/frd.md
|
|
71
71
|
?? notes.md
|
|
72
72
|
```
|
|
73
73
|
|
|
@@ -80,7 +80,7 @@ Nếu repo không phải git repo → cảnh báo và yêu cầu confirm:
|
|
|
80
80
|
|
|
81
81
|
### Bước 1: Discover & classify
|
|
82
82
|
|
|
83
|
-
Quét
|
|
83
|
+
Quét `.specs/main/feature/*/frd.md`. Với mỗi file:
|
|
84
84
|
|
|
85
85
|
1. Parse headings và frontmatter.
|
|
86
86
|
2. Run detection cho V1–V8.
|
|
@@ -123,11 +123,11 @@ Với mỗi FRD đã chọn, load các file sau (chỉ những gì cần thiết
|
|
|
123
123
|
|
|
124
124
|
| File | Bắt buộc | Mục đích |
|
|
125
125
|
|---|---|---|
|
|
126
|
-
|
|
|
126
|
+
| `.specs/main/feature/{F-XXX}-{slug}/frd.md` | ✓ | File cần migrate |
|
|
127
127
|
| [templates/main/feature/frd-template.md](../../templates/main/feature/frd-template.md) | ✓ | Target structure — copy text cho V2/V3/V5 |
|
|
128
|
-
|
|
|
129
|
-
|
|
|
130
|
-
|
|
|
128
|
+
| `.specs/main/feature/{F-XXX}-{slug}/fdd.md` | nếu tồn tại | Cascade target cho V4 (AC→FAC rename) |
|
|
129
|
+
| `.specs/main/feature/{F-XXX}-{slug}/tsd.md` | nếu tồn tại | Cascade target cho V4 |
|
|
130
|
+
| `.specs/main/domain.md` (Shared Entities block) | optional | Cho V6 — match field name với entity glossary để pick semantic type consistent |
|
|
131
131
|
|
|
132
132
|
**KHÔNG load:**
|
|
133
133
|
- `conventions.md` — template đã self-contained, load là thừa
|
|
@@ -183,7 +183,7 @@ Với mỗi FRD đã chọn, load các file sau (chỉ những gì cần thiết
|
|
|
183
183
|
```
|
|
184
184
|
|
|
185
185
|
#### 4.3 Scan cascade references
|
|
186
|
-
- Grep toàn
|
|
186
|
+
- Grep toàn `.specs/` cho từng ID cũ.
|
|
187
187
|
- **CRITICAL**: chỉ remap những match THUỘC Feature AC (Bước 4.1 list). KHÔNG đụng Story AC trùng namespace `AC-F{NNN}-{seq}` — đây là string overlap nhưng khác counter.
|
|
188
188
|
- Tạo bảng impact:
|
|
189
189
|
```
|
|
@@ -358,7 +358,7 @@ Cho mỗi FRD đã migrate:
|
|
|
358
358
|
|
|
359
359
|
Nếu artifact chưa có section `## Change History` (vì template cũ) → tạo section mới ở cuối file rồi append entry. Đây cũng là một migration vector ngầm — đảm bảo mọi main artifact sau migration đều có Change History section.
|
|
360
360
|
|
|
361
|
-
Rollback (nếu user phát hiện sai sau khi skill xong): `git checkout -- specs/main/feature/{F-XXX}-{slug}/` để revert toàn bộ feature dir, hoặc `git restore -p` để revert per-hunk.
|
|
361
|
+
Rollback (nếu user phát hiện sai sau khi skill xong): `git checkout -- .specs/main/feature/{F-XXX}-{slug}/` để revert toàn bộ feature dir, hoặc `git restore -p` để revert per-hunk.
|
|
362
362
|
|
|
363
363
|
Append vào [changelogs.md](../../changelogs.md) `## [Unreleased]`:
|
|
364
364
|
|
package/skills/spec-new/SKILL.md
CHANGED
|
@@ -7,7 +7,7 @@ description: Tạo spec.md cho một integration mới thông qua interview có
|
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Tạo `spec.md` cho một integration mới trong
|
|
10
|
+
Tạo `spec.md` cho một integration mới trong `.specs/integrations/{NNN}-{slug}/`.
|
|
11
11
|
|
|
12
12
|
`spec.md` là functional spec — định nghĩa **what to build**: vấn đề, requirements, acceptance criteria, out of scope. Không chứa technical design.
|
|
13
13
|
|
|
@@ -33,7 +33,7 @@ Tạo `spec.md` cho một integration mới trong `specs/integrations/{NNN}-{slu
|
|
|
33
33
|
|
|
34
34
|
**Nếu không có ARGUMENT:**
|
|
35
35
|
|
|
36
|
-
Đọc
|
|
36
|
+
Đọc `.specs/main/prd.md`. Nếu file không tồn tại hoặc là template rỗng → dừng:
|
|
37
37
|
> `prd.md` chưa có nội dung. Hãy chạy `/spec-prd` trước.
|
|
38
38
|
|
|
39
39
|
Đọc toàn bộ bảng Features. Hiển thị **tất cả** features kèm trạng thái — không lọc — để thấy rõ feature nào có FRD cần update:
|
|
@@ -50,7 +50,7 @@ Features trong PRD:
|
|
|
50
50
|
Chọn số feature để bắt đầu spec:
|
|
51
51
|
```
|
|
52
52
|
|
|
53
|
-
Ghi chú `→ frd.md tồn tại` nếu file
|
|
53
|
+
Ghi chú `→ frd.md tồn tại` nếu file `.specs/main/feature/{F-XXX}-*/frd.md` đã có.
|
|
54
54
|
|
|
55
55
|
Nếu tất cả features đều Done → thông báo:
|
|
56
56
|
> Tất cả features trong prd.md đã được implement. Nếu có yêu cầu mới, hãy truyền nó trực tiếp: `/spec-new <yêu cầu>`.
|
|
@@ -88,10 +88,10 @@ Lưu lại lựa chọn section.
|
|
|
88
88
|
|
|
89
89
|
Từ raw requirement, agent xác định features và components liên quan, rồi load các file sau:
|
|
90
90
|
|
|
91
|
-
-
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
91
|
+
- `.specs/main/prd.md` — đọc Problem Statement, Target Users, Scope, Feature Index, Component Index; **đặc biệt ghi nhận cột `ADO` trong bảng Features** — nếu feature đã có ticket ID thì lưu lại `{feature_id → ado_ticket_id, ado_ticket_title, ado_ticket_url}`
|
|
92
|
+
- `.specs/main/domain.md` — đọc Glossary và Shared Entities
|
|
93
|
+
- `.specs/main/feature/{F-XXX}-{slug}/frd.md` — cho mỗi feature liên quan (nếu file đã tồn tại)
|
|
94
|
+
- `.specs/main/component/{C-XXX}-{slug}/crd.md` — cho mỗi component bị touched (nếu file đã tồn tại)
|
|
95
95
|
|
|
96
96
|
Tóm tắt context và surface assumptions:
|
|
97
97
|
|
|
@@ -150,11 +150,11 @@ Từ title của integration, sinh slug:
|
|
|
150
150
|
- Nếu từ prd.md: dùng `{feature-id}-{feature-slug}`, ví dụ: `f001-authentication`
|
|
151
151
|
|
|
152
152
|
Xác định số thứ tự (`NNN`):
|
|
153
|
-
- Liệt kê các thư mục hiện có trong
|
|
153
|
+
- Liệt kê các thư mục hiện có trong `.specs/integrations/` theo pattern `{NNN}-*`
|
|
154
154
|
- Lấy số lớn nhất hiện có và cộng thêm 1, format 3 chữ số (ví dụ: `001`, `002`, `012`)
|
|
155
155
|
- Nếu chưa có thư mục nào → bắt đầu từ `001`
|
|
156
156
|
|
|
157
|
-
Output path:
|
|
157
|
+
Output path: `.specs/integrations/{NNN}-{slug}/spec.md`
|
|
158
158
|
|
|
159
159
|
---
|
|
160
160
|
|
|
@@ -258,7 +258,8 @@ Tạo block nếu integration:
|
|
|
258
258
|
|
|
259
259
|
Tạo block nếu integration:
|
|
260
260
|
- Giới thiệu glossary term mới → row [NEW] trong Glossary
|
|
261
|
-
- Giới thiệu shared entity mới (entity sẽ được dùng bởi 2+ component) → entity [NEW] với `Owner: C-XXX`
|
|
261
|
+
- Giới thiệu shared entity mới (entity sẽ được dùng bởi 2+ component) → entity [NEW] với `Owner: C-XXX` (component đã carve trong integration này); component chưa carve → `Owner: TBD`, `/spec-sad` gán sau (xem two-phase cascade `conventions.md` §5.5)
|
|
262
|
+
- Gán owner cho entity còn `Owner: TBD` (do pha mô tả seed) → entity [MODIFY Owner] `TBD → C-XXX`
|
|
262
263
|
- Sửa định nghĩa entity hiện có → entity [MODIFY ...]
|
|
263
264
|
|
|
264
265
|
**`sad.md`**
|
|
@@ -339,7 +340,7 @@ Chỉ tiến hành Bước 7 sau khi user confirm. Nếu user yêu cầu chỉnh
|
|
|
339
340
|
|
|
340
341
|
### Bước 7: Save + Auto-cascade
|
|
341
342
|
|
|
342
|
-
Tạo thư mục
|
|
343
|
+
Tạo thư mục `.specs/integrations/{NNN}-{slug}/` nếu chưa có.
|
|
343
344
|
|
|
344
345
|
**[7.1] Ghi spec.md** với status `approved` (không phải `draft` — human đã confirm ở Bước 6 chính là approval). Frontmatter `features` và `components` phải được điền theo những gì đã nhận diện ở Bước 2.
|
|
345
346
|
|
|
@@ -391,7 +392,7 @@ Cho mỗi artifact:
|
|
|
391
392
|
**[7.4] Thông báo kết quả:**
|
|
392
393
|
|
|
393
394
|
```
|
|
394
|
-
✓ specs/integrations/{NNN}-{slug}/spec.md đã được tạo (status: approved)
|
|
395
|
+
✓ .specs/integrations/{NNN}-{slug}/spec.md đã được tạo (status: approved)
|
|
395
396
|
|
|
396
397
|
Auto-cascade applied:
|
|
397
398
|
✓ prd.md — {summary}
|
package/skills/spec-prd/SKILL.md
CHANGED
|
@@ -7,15 +7,15 @@ description: Điền hoặc cập nhật prd.md — Product Requirements Documen
|
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Tạo nội dung cho
|
|
10
|
+
Tạo nội dung cho `.specs/main/prd.md` thông qua interview có cấu trúc. PRD là nguồn sự thật ở product level — nó định nghĩa vấn đề, users, scope, features, components, và NFRs trước khi bất kỳ technical decision nào được đưa ra.
|
|
11
11
|
|
|
12
|
-
Skill này cũng scaffold
|
|
12
|
+
Skill này cũng scaffold `.specs/main/domain.md` skeleton nếu chưa tồn tại — domain.md mọc dần qua cascade ở hai pha: mô tả (`/spec-frd`, `/spec-new` seed glossary + định nghĩa entity, `Owner: TBD`) và thiết kế (`/spec-sad` gán `Owner`). Xem two-phase cascade `conventions.md` §5.5.
|
|
13
13
|
|
|
14
14
|
PRD không chứa: tech stack, implementation details, entity schema, glossary, business rules — những thứ đó thuộc về `sad.md` hoặc `domain.md`.
|
|
15
15
|
|
|
16
16
|
## When to Use
|
|
17
17
|
|
|
18
|
-
-
|
|
18
|
+
- `.specs/main/prd.md` chưa có nội dung hoặc vẫn còn là template
|
|
19
19
|
- Cần bổ sung hoặc cập nhật một phần của PRD hiện tại
|
|
20
20
|
- Requirements thay đổi và PRD cần được đồng bộ lại
|
|
21
21
|
|
|
@@ -46,6 +46,32 @@ Chạy qua các phép thử; đa số phiếu nghiêng đâu thì xếp vào đ
|
|
|
46
46
|
| **Đặt tên** | Danh từ hệ thống (`auth`, `payment`) | Luồng nghiệp vụ (`checkout-flow`, `password-reset`) |
|
|
47
47
|
| **Trả lời** | "Phần nào của hệ thống chịu trách nhiệm X?" | "User làm được gì, nhận giá trị gì?" |
|
|
48
48
|
|
|
49
|
+
### Mục có tính chất kép — vừa Feature vừa Component
|
|
50
|
+
|
|
51
|
+
Litmus test ở trên giả định mỗi mục rơi vào **một** bucket. Nhưng một số mục có **hai mặt** và xứng đáng đăng ký ở **cả hai** index — kinh điển là `auth`:
|
|
52
|
+
|
|
53
|
+
- **Mặt trải nghiệm người dùng** (đăng nhập SSO/OTP, có Flows + User Stories + Acceptance Criteria) → **Feature**.
|
|
54
|
+
- **Mặt năng lực cross-cutting** (RBAC enforce mọi endpoint, session) mà mọi feature khác tham chiếu → **Component**.
|
|
55
|
+
|
|
56
|
+
**Phép thử tính kép** — một mục là *cả hai* khi thỏa CẢ hai điều kiện:
|
|
57
|
+
|
|
58
|
+
1. Nó là component **Given** (xem Given/Derived bên dưới — thường trúng câu 2 Mandated-substrate), VÀ
|
|
59
|
+
2. Nó có một **trải nghiệm người dùng** (Flows/US/AC) mà (a) **không** biểu diễn được trong `crd.md` (CRD chỉ có Role/Responsibilities/Interface/Business Rules — KHÔNG có Flows/User Stories/Acceptance Criteria), và (b) **không** thuộc sở hữu của feature nào khác.
|
|
60
|
+
|
|
61
|
+
Nếu kép → đăng ký **một Feature (F-XXX)** cho mặt UX + **một Component (C-XXX)** cho mặt năng lực, và chia trách nhiệm dứt khoát:
|
|
62
|
+
- Flows / User Stories / Acceptance Criteria / rule của luồng → **Feature** (`frd.md`), trỏ tới component qua mục "Components Used".
|
|
63
|
+
- Năng lực dùng chung + interface + rule nội bộ → **Component** (`crd.md`/`cdd.md`). Mô tả component **thu hẹp** về mặt năng lực, ghi rõ "UX thuộc F-XXX".
|
|
64
|
+
|
|
65
|
+
| Ứng viên | Mặt Feature (UX) | Mặt Component (năng lực) | Kết luận |
|
|
66
|
+
| --- | --- | --- | --- |
|
|
67
|
+
| auth | login SSO/OTP, lockout | RBAC enforce, session/token | **kép** |
|
|
68
|
+
| notification | notification center (chuông/panel, mark-read) | kênh gửi email + push dùng chung | **kép** |
|
|
69
|
+
| file-storage | document repository (upload/preview/download) | blob storage + access control | **kép** |
|
|
70
|
+
| payment-gateway / e-signature / erp-adapter | — (UX nằm trong feature tiêu thụ) | adapter tích hợp ngoài | **component-only** |
|
|
71
|
+
| checkout, password-reset | luồng nghiệp vụ | — (không năng lực cross-cutting) | **feature-only** |
|
|
72
|
+
|
|
73
|
+
**Cảnh báo:** đa số component **External** (câu 1 — adapter Stripe/DocuSign/BC) là **component-only** — trải nghiệm dùng chúng (thanh toán, ký, xem dữ liệu BC) thuộc về các feature tiêu thụ, bản thân adapter không có UX riêng. Tính kép chủ yếu xuất hiện ở component **Mandated-substrate** (câu 2: auth, notification, file-storage).
|
|
74
|
+
|
|
49
75
|
### Quy tắc đặt tên (cho cả Feature và Component)
|
|
50
76
|
|
|
51
77
|
**Goldilocks:** đặt tên ở mức trừu tượng **cao nhất mà vẫn truyền đạt đúng MỘT trách nhiệm/luồng rõ ràng**. Cao hơn → mất boundary; thấp hơn → rò rỉ chi tiết. Tên dùng kebab-case.
|
|
@@ -92,6 +118,7 @@ Input là **baseline, không phải chân lý tuyệt đối**:
|
|
|
92
118
|
|
|
93
119
|
- Reuse tên/ID/boundary nếu input đã có → không tự đẻ cấu trúc song song.
|
|
94
120
|
- Vẫn chạy litmus test (phân loại) + Given/Derived để **validate**. Nếu input gọi X là "component" mà nó fail ownership test → flag, đề xuất reclassify thành feature (không im lặng bê nguyên).
|
|
121
|
+
- Chạy **Phép thử tính kép** cho mọi component Given. Nếu input gọi X là "component" (vd `auth`) nhưng X cũng có trải nghiệm người dùng riêng (SSO/OTP flow, có Flows/US/AC) không thuộc feature khác → flag, đề xuất đăng ký **thêm** một Feature cho mặt UX và thu hẹp component về mặt năng lực — đừng để mặt UX không có nhà.
|
|
95
122
|
- Component **Derived** do input cung cấp → ghi nhận như *candidate*, chuyển sang `/spec-sad`, **không** nhồi vào Component Index của PRD.
|
|
96
123
|
- Phần input thiếu → mới interview để bù.
|
|
97
124
|
|
|
@@ -118,9 +145,9 @@ Nếu không có nguồn → bỏ qua, interview từ đầu như bình thườn
|
|
|
118
145
|
|
|
119
146
|
### Bước 1: Kiểm tra preconditions
|
|
120
147
|
|
|
121
|
-
Đọc
|
|
148
|
+
Đọc `.specs/main/prd.md`:
|
|
122
149
|
|
|
123
|
-
- **File không tồn tại** → tạo thư mục
|
|
150
|
+
- **File không tồn tại** → tạo thư mục `.specs/main/` (nếu chưa có) rồi tiến hành Bước 2 (full interview).
|
|
124
151
|
|
|
125
152
|
- **File là template rỗng** → tiến hành Bước 2 (full interview).
|
|
126
153
|
|
|
@@ -205,6 +232,8 @@ Sau đó hỏi tuần tự, từng phần một — không hỏi tất cả cùn
|
|
|
205
232
|
> - **Given** (trúng câu 1 External hoặc câu 2 Mandated-substrate) → khai vào Component Index.
|
|
206
233
|
> - **Derived** (câu 3 — boundary phụ thuộc cách carve lõi nghiệp vụ hoặc đánh đổi NFR, vd `order`, `pricing`) → **KHÔNG** khai. Để `/spec-sad` chốt, hoặc mọc qua `/spec-new F-XXX` cascade.
|
|
207
234
|
>
|
|
235
|
+
> Với mỗi component **Given** (nhất là Mandated-substrate), chạy thêm **Phép thử tính kép** (xem section "Mục có tính chất kép"): nếu nó cũng có trải nghiệm người dùng riêng (Flows/US/AC) không thuộc feature khác → đăng ký **thêm** một Feature cho mặt UX vào Phần 4, và thu hẹp mô tả component về mặt năng lực. Vd `auth` → Feature `authentication` (login UX) + Component `auth` (RBAC enforce).
|
|
236
|
+
>
|
|
208
237
|
> **KHÔNG** mechanical-derive components từ feature areas (vd: thấy "Pricing" trong yêu cầu → tạo ngay `C-pricing`; đó là Derived). Section này có thể chỉ có 3-6 entries, hoặc thậm chí trống. Đừng cố fill cho đủ.
|
|
209
238
|
|
|
210
239
|
**Phần 6 — Non-Functional Requirements:**
|
|
@@ -240,11 +269,11 @@ Chỉ ghi file sau khi user confirm. Nếu user yêu cầu chỉnh sửa → c
|
|
|
240
269
|
|
|
241
270
|
### Bước 5: Save
|
|
242
271
|
|
|
243
|
-
**5a. Ghi
|
|
272
|
+
**5a. Ghi `.specs/main/prd.md`** — nội dung đã được confirm, thay thế toàn bộ nội dung cũ.
|
|
244
273
|
|
|
245
|
-
**5b. Scaffold
|
|
274
|
+
**5b. Scaffold `.specs/main/domain.md`** *(chỉ khi file này chưa tồn tại)*:
|
|
246
275
|
|
|
247
|
-
- Copy `.claude/templates/main/domain-template.md` thành
|
|
276
|
+
- Copy `.claude/templates/main/domain-template.md` thành `.specs/main/domain.md`.
|
|
248
277
|
- Section **Glossary** giữ format bảng rỗng — terms sẽ được thêm dần qua cascade từ integrations.
|
|
249
278
|
- Section **Shared Entities** giữ block placeholder — entities sẽ mọc dần qua cascade khi integration giới thiệu shared entity.
|
|
250
279
|
|
|
@@ -264,8 +293,8 @@ Nếu `domain.md` đã tồn tại với nội dung thực → không đụng t
|
|
|
264
293
|
|
|
265
294
|
Thông báo kết quả:
|
|
266
295
|
```
|
|
267
|
-
✓ specs/main/prd.md đã được cập nhật (status: draft)
|
|
268
|
-
{nếu vừa scaffold} ✓ specs/main/domain.md đã được scaffold (skeleton — sẽ mọc dần qua cascade)
|
|
296
|
+
✓ .specs/main/prd.md đã được cập nhật (status: draft)
|
|
297
|
+
{nếu vừa scaffold} ✓ .specs/main/domain.md đã được scaffold (skeleton — sẽ mọc dần qua cascade)
|
|
269
298
|
|
|
270
299
|
Bước tiếp theo:
|
|
271
300
|
- /spec-sad → thiết kế kiến trúc kỹ thuật
|
|
@@ -300,7 +329,8 @@ Trước khi kết thúc, kiểm tra:
|
|
|
300
329
|
- [ ] Out of Scope có ít nhất 1 item với lý do
|
|
301
330
|
- [ ] Features có ít nhất 1 item, mỗi item có ID (F-XXX), tên, mô tả, priority. Mỗi item pass litmus test (đơn vị delivery, không phải ownership)
|
|
302
331
|
- [ ] Components: mọi entry là **Given** (trúng câu 1 External hoặc câu 2 Mandated-substrate). Không có component **Derived** (boundary phụ thuộc carve lõi nghiệp vụ — thuộc `/spec-sad`). Có thể trống. Mỗi item có ID (C-XXX), tên kebab-case, mô tả 1 câu
|
|
303
|
-
- [ ]
|
|
332
|
+
- [ ] Đã chạy **Phép thử tính kép** cho mọi component Given: mục có cả mặt UX riêng (vd auth/notification/file-storage) được đăng ký ở **CẢ** Feature Index lẫn Component Index, mô tả mỗi mặt thu hẹp đúng phạm vi (UX→feature, năng lực→component)
|
|
333
|
+
- [ ] Nếu input context có sẵn feature/component: đã reuse làm baseline, đã validate qua litmus + Given/Derived + Phép thử tính kép, đã flag mục phân loại sai (nếu có)
|
|
304
334
|
- [ ] Mỗi NFR có target đo được (không phải "nhanh", "bảo mật chung chung")
|
|
305
335
|
- [ ] domain.md tồn tại (đã scaffold skeleton hoặc có nội dung sẵn)
|
|
306
336
|
- [ ] User đã confirm trước khi file được ghi
|