spec-lite 1.0.2 → 1.1.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 +21 -22
- package/package.json +1 -1
- package/skills/plan/SKILL.md +4 -2
- package/skills/spec-new/SKILL.md +64 -32
- package/skills/spec-prd/SKILL.md +33 -14
- package/skills/spec-sad/SKILL.md +3 -3
- package/skills/spec-tech/SKILL.md +51 -18
- package/templates/integrations/plan-template.md +1 -0
- package/templates/integrations/spec-template.md +34 -12
- package/templates/integrations/tech-template.md +10 -1
- package/templates/integrations/todo-template.md +1 -0
- package/templates/main/component/cdd-template.md +63 -0
- package/templates/main/component/crd-template.md +88 -0
- package/templates/main/domain-template.md +22 -21
- package/templates/main/feature/fdd-template.md +27 -30
- package/templates/main/feature/frd-template.md +18 -7
- package/templates/main/prd-template.md +8 -0
- package/skills/spec-domain/SKILL.md +0 -176
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# spec-lite
|
|
2
2
|
|
|
3
|
-
Bộ skills spec-driven development cho Claude Code — phỏng vấn có cấu trúc để xây dựng PRD,
|
|
3
|
+
Bộ skills spec-driven development cho Claude Code — phỏng vấn có cấu trúc để xây dựng PRD, kiến trúc hệ thống, và integration specs. Domain knowledge và component/feature artifacts mọc dần qua cascade từ integrations.
|
|
4
4
|
|
|
5
5
|
> **Lưu ý:** Hiện tại chỉ hoạt động với [Claude Code](https://claude.ai/code) (thư mục `.claude/`).
|
|
6
6
|
|
|
@@ -19,17 +19,17 @@ Các skill được gọi bằng slash command bên trong Claude Code.
|
|
|
19
19
|
### Thứ tự thực hiện
|
|
20
20
|
|
|
21
21
|
```
|
|
22
|
-
/spec-prd → /spec-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
/spec-prd → /spec-sad
|
|
23
|
+
│
|
|
24
|
+
(có requirement mới)
|
|
25
|
+
│
|
|
26
|
+
/spec-new
|
|
27
|
+
│
|
|
28
|
+
/spec-tech
|
|
29
|
+
│
|
|
30
|
+
/plan
|
|
31
|
+
│
|
|
32
|
+
/build
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
---
|
|
@@ -37,17 +37,12 @@ Các skill được gọi bằng slash command bên trong Claude Code.
|
|
|
37
37
|
### Seed skills — chạy một lần khi bắt đầu dự án
|
|
38
38
|
|
|
39
39
|
#### `/spec-prd`
|
|
40
|
-
Tạo hoặc cập nhật `specs/main/prd.md` thông qua interview có cấu trúc.
|
|
40
|
+
Tạo hoặc cập nhật `specs/main/prd.md` thông qua interview có cấu trúc. Đồng thời scaffold `specs/main/domain.md` skeleton.
|
|
41
41
|
|
|
42
|
-
Sections: Problem Statement · Target Users · Scope · Features · Non-Functional Requirements · Business Constraints
|
|
43
|
-
|
|
44
|
-
#### `/spec-domain`
|
|
45
|
-
Tạo hoặc cập nhật `specs/main/domain.md`. Yêu cầu `prd.md` phải có nội dung trước.
|
|
46
|
-
|
|
47
|
-
Sections: Terminology · Entities · Business Rules · Domain Events
|
|
42
|
+
Sections: Problem Statement · Target Users · Scope · Features · Components · Non-Functional Requirements · Business Constraints
|
|
48
43
|
|
|
49
44
|
#### `/spec-sad`
|
|
50
|
-
Tạo hoặc cập nhật `specs/main/sad.md`. Yêu cầu `prd.md` và `domain.md`
|
|
45
|
+
Tạo hoặc cập nhật `specs/main/sad.md`. Yêu cầu `prd.md` và `domain.md` đã tồn tại.
|
|
51
46
|
|
|
52
47
|
Sections: Architectural Style · System Overview · Tech Stack · Cross-Cutting Concerns · Inter-Service Communication · Infrastructure Overview · Architectural Guardrails
|
|
53
48
|
|
|
@@ -70,16 +65,20 @@ Tạo `specs/integrations/{slug}/tech.md` sau khi `spec.md` được approve.
|
|
|
70
65
|
#### `/plan`
|
|
71
66
|
Tạo `plan.md` và `todo.md` từ `spec.md` + `tech.md`.
|
|
72
67
|
|
|
68
|
+
#### `/build`
|
|
69
|
+
Implement từng task trong `plan.md`/`todo.md` theo TDD incremental.
|
|
70
|
+
|
|
73
71
|
---
|
|
74
72
|
|
|
75
73
|
### Files được tạo ra
|
|
76
74
|
|
|
77
75
|
| Command | Output |
|
|
78
76
|
|---------|--------|
|
|
79
|
-
| `/spec-prd` | `specs/main/prd.md` |
|
|
80
|
-
| `/spec-domain` | `specs/main/domain.md` |
|
|
77
|
+
| `/spec-prd` | `specs/main/prd.md`, `specs/main/domain.md` (skeleton) |
|
|
81
78
|
| `/spec-sad` | `specs/main/sad.md` |
|
|
82
79
|
| `/spec-new` | `specs/integrations/{slug}/spec.md` |
|
|
83
80
|
| `/spec-tech` | `specs/integrations/{slug}/tech.md` |
|
|
84
81
|
| `/plan` | `specs/integrations/{slug}/plan.md`, `todo.md` |
|
|
85
82
|
| `/build` | _(implements tasks từ `plan.md`/`todo.md`)_ |
|
|
83
|
+
|
|
84
|
+
Component (`crd.md`, `cdd.md`) và feature (`frd.md`, `fdd.md`) artifacts mọc dần qua **cascade proposals** từ integrations — không có skill chuyên biệt để tạo.
|
package/package.json
CHANGED
package/skills/plan/SKILL.md
CHANGED
|
@@ -66,10 +66,12 @@ Surface tóm tắt để planning-and-task-breakdown có đủ context:
|
|
|
66
66
|
```
|
|
67
67
|
CONTEXT CHO PLANNING:
|
|
68
68
|
- Integration: {title}
|
|
69
|
+
- Features: {từ spec.md frontmatter}
|
|
70
|
+
- Components: {từ spec.md frontmatter}
|
|
69
71
|
- Yêu cầu chính: {tóm tắt từ spec.md — 2-4 bullet}
|
|
70
|
-
- Acceptance Criteria: {số
|
|
72
|
+
- Acceptance Criteria: {tổng số AC — list IDs theo nhóm Feature/Component như spec.md}
|
|
71
73
|
- Thay đổi kỹ thuật: {modules, data model, interfaces từ tech.md}
|
|
72
|
-
-
|
|
74
|
+
- Shared entities liên quan: {từ domain.md}
|
|
73
75
|
|
|
74
76
|
ASSUMPTIONS:
|
|
75
77
|
1. {assumption về ordering nếu có}
|
package/skills/spec-new/SKILL.md
CHANGED
|
@@ -19,7 +19,7 @@ Tạo `spec.md` cho một integration mới trong `specs/integrations/{NNN}-{slu
|
|
|
19
19
|
|
|
20
20
|
## When NOT to Use
|
|
21
21
|
|
|
22
|
-
- `prd.md`
|
|
22
|
+
- `prd.md` chưa có → chạy `/spec-prd` trước (skill đó scaffold cả `domain.md` skeleton)
|
|
23
23
|
- Muốn thiết kế technical design → dùng `/spec-tech` (cần `spec.md` đã approve trước)
|
|
24
24
|
- Chỉ muốn cập nhật spec đã có → edit file trực tiếp
|
|
25
25
|
|
|
@@ -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 `specs/main/
|
|
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>`.
|
|
@@ -84,11 +84,12 @@ Lưu lại lựa chọn section.
|
|
|
84
84
|
|
|
85
85
|
### Bước 2: Load context
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
Từ raw requirement, agent xác định features và components liên quan, rồi load các file sau:
|
|
88
88
|
|
|
89
|
-
- `specs/main/prd.md` — đọc Problem Statement, Target Users, Scope,
|
|
90
|
-
- `specs/main/domain.md` — đọc
|
|
91
|
-
-
|
|
89
|
+
- `specs/main/prd.md` — đọc Problem Statement, Target Users, Scope, Feature Index, Component Index
|
|
90
|
+
- `specs/main/domain.md` — đọc Glossary và Shared Entities
|
|
91
|
+
- `specs/main/feature/{F-XXX}-{slug}/frd.md` — cho mỗi feature liên quan (nếu file đã tồn tại)
|
|
92
|
+
- `specs/main/component/{C-XXX}-{slug}/crd.md` — cho mỗi component bị touched (nếu file đã tồn tại)
|
|
92
93
|
|
|
93
94
|
Tóm tắt context và surface assumptions:
|
|
94
95
|
|
|
@@ -96,15 +97,19 @@ Tóm tắt context và surface assumptions:
|
|
|
96
97
|
TỪ PRD & DOMAIN TÔI HIỂU:
|
|
97
98
|
- Vấn đề đang giải quyết: {problem statement ngắn từ prd}
|
|
98
99
|
- Personas liên quan: {từ prd Target Users}
|
|
99
|
-
-
|
|
100
|
-
|
|
100
|
+
- Glossary terms liên quan: {từ domain.md}
|
|
101
|
+
- Shared entities liên quan: {từ domain.md}
|
|
102
|
+
{nếu có feature liên quan} - Features: {F-XXX — tên — mô tả ngắn}
|
|
103
|
+
{nếu có component liên quan} - Components: {C-XXX — tên — mô tả ngắn}
|
|
101
104
|
|
|
102
105
|
ASSUMPTIONS TÔI ĐANG ĐẶT RA:
|
|
103
106
|
1. {assumption về scope}
|
|
104
|
-
2. {assumption về
|
|
107
|
+
2. {assumption về features/components bị touched}
|
|
105
108
|
→ Sửa lại nếu sai trước khi tiếp tục.
|
|
106
109
|
```
|
|
107
110
|
|
|
111
|
+
Nếu integration giới thiệu feature mới hoặc component mới chưa có trong PRD Index → ghi nhận để cascade ở Bước 5.
|
|
112
|
+
|
|
108
113
|
---
|
|
109
114
|
|
|
110
115
|
### Bước 3: Interview
|
|
@@ -120,11 +125,11 @@ Hỏi tuần tự, từng phần — không hỏi tất cả cùng lúc:
|
|
|
120
125
|
> Hoặc liệt kê functional requirements nếu không theo user story format.
|
|
121
126
|
|
|
122
127
|
**Phần 3 — Acceptance Criteria:**
|
|
123
|
-
> Điều kiện nào để biết integration này là done?
|
|
124
|
-
>
|
|
125
|
-
> -
|
|
126
|
-
>
|
|
127
|
-
>
|
|
128
|
+
> Điều kiện nào để biết integration này là done? Format Given/When/Then.
|
|
129
|
+
> Agent tự nhóm AC theo cách phù hợp với bản chất integration:
|
|
130
|
+
> - Có user-facing flow → group theo Feature → User Story → AC, dùng ID `AC-{F_ID}-{seq}`
|
|
131
|
+
> - Thuần technical (refactor / capability nội tại) → group theo Component, dùng ID `AC-{C_ID}-{seq}`, không cần user story
|
|
132
|
+
> - Mixed (vừa thêm feature, vừa thay đổi component) → có thể có cả 2 nhóm
|
|
128
133
|
|
|
129
134
|
**Phần 4 — Out of Scope:**
|
|
130
135
|
> Có gì liên quan nhưng sẽ KHÔNG làm trong integration này không? Ghi rõ lý do.
|
|
@@ -157,34 +162,59 @@ Tổng hợp và viết draft `spec.md`:
|
|
|
157
162
|
|
|
158
163
|
**Cấu trúc file**: dùng `.claude/templates/integrations/spec-template.md` làm skeleton, điền nội dung từ interview vào.
|
|
159
164
|
|
|
160
|
-
**Cascade Proposals** —
|
|
165
|
+
**Cascade Proposals** — agent đề xuất delta cho main artifacts theo các targets sau (chỉ điền nếu thực sự có thay đổi, không thì ghi "Không có thay đổi đề xuất."):
|
|
161
166
|
|
|
162
167
|
### prd.md
|
|
163
168
|
|
|
164
|
-
|
|
169
|
+
Đề xuất cập nhật nếu integration này:
|
|
170
|
+
- Giới thiệu feature mới chưa có trong Feature Index → đề xuất thêm row vào Features (auto-pick `F-XXX` next ID, slug từ context)
|
|
171
|
+
- Giới thiệu component mới chưa có trong Component Index → đề xuất thêm row vào Components (auto-pick `C-XXX` next ID)
|
|
172
|
+
- Đổi status feature từ `TODO` sang `In Progress`
|
|
173
|
+
- Có scope hoặc NFR thay đổi
|
|
165
174
|
|
|
166
175
|
### domain.md
|
|
167
176
|
|
|
168
|
-
|
|
177
|
+
Đề xuất cập nhật nếu integration này:
|
|
178
|
+
- Giới thiệu glossary term mới → đề xuất thêm vào Glossary
|
|
179
|
+
- Giới thiệu shared entity mới (entity sẽ được dùng bởi 2+ component) → đề xuất thêm vào Shared Entities với field `Owner: C-XXX`
|
|
180
|
+
|
|
181
|
+
### component/{C-XXX}-{component-name}/crd.md
|
|
182
|
+
|
|
183
|
+
Liệt kê **tất cả** components bị touched trong integration và đánh giá từng cái:
|
|
184
|
+
|
|
185
|
+
| Component | crd.md | Đề xuất |
|
|
186
|
+
| --- | --- | --- |
|
|
187
|
+
| C-001 — auth | tồn tại | **Cập nhật** — thêm responsibility "rate limiting", thêm endpoint `POST /auth/rate-check` |
|
|
188
|
+
| C-003 — payment | chưa có | **Tạo mới** crd + cdd |
|
|
189
|
+
|
|
190
|
+
Với từng component có đề xuất:
|
|
191
|
+
|
|
192
|
+
**Tạo mới** `specs/main/component/{C-XXX}-{component-slug}/crd.md` *(và `cdd.md` cascade ở spec-tech)*
|
|
193
|
+
- Dùng khi integration này là lần đầu tiên giới thiệu component này
|
|
194
|
+
- Auto-pick C-XXX (next available) và slug kebab-case từ context
|
|
195
|
+
- Đề xuất nội dung crd: Role, Responsibilities, Owned Entities, Public Interface, Business Rules, Dependencies — dựa trên spec.md
|
|
169
196
|
|
|
170
|
-
|
|
197
|
+
**Cập nhật** `specs/main/component/{C-XXX}-{component-slug}/crd.md`
|
|
198
|
+
- Dùng khi crd.md đã tồn tại và integration bổ sung thêm responsibility, interface, hoặc business rule
|
|
199
|
+
- Ghi rõ section nào bị touched và delta cụ thể
|
|
171
200
|
|
|
172
|
-
|
|
201
|
+
### feature/{F-XXX}-{feature-name}/frd.md
|
|
202
|
+
|
|
203
|
+
Liệt kê **tất cả** features liên quan đến integration và đánh giá từng cái:
|
|
173
204
|
|
|
174
205
|
| Feature | Status | frd.md | Đề xuất |
|
|
175
206
|
| --- | --- | --- | --- |
|
|
176
207
|
| F-001 — Authentication | In Progress | tồn tại | **Cập nhật** — bổ sung US-003, AC mới về rate limiting |
|
|
177
208
|
| F-002 — User Profile | TODO | chưa có | **Tạo mới** |
|
|
178
|
-
| F-003 — Credit System | Done | tồn tại | Không liên quan |
|
|
179
209
|
|
|
180
|
-
Với từng feature có đề xuất thay đổi
|
|
210
|
+
Với từng feature có đề xuất thay đổi:
|
|
181
211
|
|
|
182
|
-
**Tạo mới** `specs/main/
|
|
212
|
+
**Tạo mới** `specs/main/feature/{F-XXX}-{feature-slug}/frd.md`
|
|
183
213
|
- Dùng khi integration này là lần đầu tiên implement feature này
|
|
184
|
-
- Thư mục đặt tên
|
|
185
|
-
- Nội dung đề xuất:
|
|
214
|
+
- Thư mục đặt tên: `{F-XXX}-{feature-slug}` (ví dụ: `F-001-authentication`)
|
|
215
|
+
- Nội dung đề xuất: User Stories, AC, Components consumed (reference C-XXX) — từ spec.md
|
|
186
216
|
|
|
187
|
-
**Cập nhật** `specs/main/
|
|
217
|
+
**Cập nhật** `specs/main/feature/{F-XXX}-{feature-slug}/frd.md`
|
|
188
218
|
- Dùng khi frd.md đã tồn tại và integration này bổ sung thêm stories hoặc criteria
|
|
189
219
|
- Đọc file frd.md hiện tại, liệt kê các sections và hỏi user muốn update section nào:
|
|
190
220
|
|
|
@@ -193,10 +223,11 @@ frd.md — F-001 Authentication đã tồn tại.
|
|
|
193
223
|
Sections hiện có:
|
|
194
224
|
|
|
195
225
|
[1] Overview
|
|
196
|
-
[2]
|
|
197
|
-
[3]
|
|
198
|
-
[4]
|
|
199
|
-
[5]
|
|
226
|
+
[2] Components Consumed
|
|
227
|
+
[3] Feature-level Acceptance Criteria
|
|
228
|
+
[4] User Stories
|
|
229
|
+
[5] Scope (In Scope / Out of Scope)
|
|
230
|
+
[6] Dependencies
|
|
200
231
|
[A] All — viết lại toàn bộ từ đầu
|
|
201
232
|
|
|
202
233
|
Chọn section cần cập nhật (có thể chọn nhiều, ví dụ: 2 3):
|
|
@@ -225,9 +256,9 @@ Chỉ ghi file sau khi user confirm. Nếu user yêu cầu chỉnh sửa → c
|
|
|
225
256
|
|
|
226
257
|
Tạo thư mục `specs/integrations/{NNN}-{slug}/` nếu chưa có.
|
|
227
258
|
|
|
228
|
-
Ghi nội dung đã confirm vào `specs/integrations/{NNN}-{slug}/spec.md`.
|
|
259
|
+
Ghi nội dung đã confirm vào `specs/integrations/{NNN}-{slug}/spec.md`. Frontmatter `features` và `components` phải được điền theo những gì đã nhận diện ở Bước 2.
|
|
229
260
|
|
|
230
|
-
Nếu integration này
|
|
261
|
+
Nếu integration này gắn với feature từ prd.md, cập nhật `specs/main/prd.md`: đổi Status của feature từ `TODO` → `In Progress`.
|
|
231
262
|
|
|
232
263
|
Thông báo kết quả:
|
|
233
264
|
```
|
|
@@ -235,7 +266,8 @@ Thông báo kết quả:
|
|
|
235
266
|
{nếu có} ✓ prd.md — F-XXX status cập nhật: TODO → In Progress
|
|
236
267
|
|
|
237
268
|
Bước tiếp theo:
|
|
238
|
-
- Review và
|
|
269
|
+
- Review spec.md và apply Cascade Proposals (nếu có) vào main artifacts thủ công
|
|
270
|
+
- Approve spec.md (đổi status: draft → approved)
|
|
239
271
|
- /spec-tech → thiết kế technical design dựa trên spec.md này
|
|
240
272
|
```
|
|
241
273
|
|
package/skills/spec-prd/SKILL.md
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spec-prd
|
|
3
|
-
description: Điền hoặc cập nhật prd.md — Product Requirements Document ở product level. Dùng khi prd.md còn là template rỗng hoặc cần review/cập nhật.
|
|
3
|
+
description: Điền hoặc cập nhật prd.md — Product Requirements Document ở product level. Cũng scaffold domain.md skeleton (glossary placeholder + Shared Entities rỗng). Dùng khi prd.md còn là template rỗng hoặc cần review/cập nhật.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# spec-prd
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
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, và NFRs trước khi bất kỳ technical decision nào được đưa ra.
|
|
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
|
-
|
|
12
|
+
Skill này cũng scaffold `specs/main/domain.md` skeleton nếu chưa tồn tại — domain.md sẽ được mọc dần qua cascade từ integrations (glossary terms, shared entities).
|
|
13
|
+
|
|
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`.
|
|
13
15
|
|
|
14
16
|
## When to Use
|
|
15
17
|
|
|
@@ -19,8 +21,8 @@ PRD không chứa: tech stack, implementation details, entity schema, hay bất
|
|
|
19
21
|
|
|
20
22
|
## When NOT to Use
|
|
21
23
|
|
|
22
|
-
- Đang muốn thiết kế kiến trúc kỹ thuật → dùng `/spec
|
|
23
|
-
-
|
|
24
|
+
- Đang muốn thiết kế kiến trúc kỹ thuật → dùng `/spec-sad`
|
|
25
|
+
- Cập nhật domain entities cụ thể → đi qua integration (`/spec-new`) và để cascade mechanism handle
|
|
24
26
|
|
|
25
27
|
---
|
|
26
28
|
|
|
@@ -44,8 +46,9 @@ PRD không chứa: tech stack, implementation details, entity schema, hay bất
|
|
|
44
46
|
| 2 | Target Users | ✓ đã có / ✗ trống/thiếu |
|
|
45
47
|
| 3 | Scope | ✓ đã có / ✗ trống/thiếu |
|
|
46
48
|
| 4 | Features | ✓ đã có / ✗ trống/thiếu |
|
|
47
|
-
| 5 |
|
|
48
|
-
| 6 |
|
|
49
|
+
| 5 | Components | ✓ đã có / ✗ trống/thiếu |
|
|
50
|
+
| 6 | Non-Functional Requirements | ✓ đã có / ✗ trống/thiếu |
|
|
51
|
+
| 7 | Business Constraints | ✓ đã có / ✗ trống/thiếu |
|
|
49
52
|
|
|
50
53
|
Một section được coi là **trống/thiếu** nếu: không tồn tại trong file, hoặc chỉ chứa placeholder template (dấu `{}`), hoặc không có dòng nội dung thực.
|
|
51
54
|
|
|
@@ -60,8 +63,9 @@ PRD không chứa: tech stack, implementation details, entity schema, hay bất
|
|
|
60
63
|
[3] Scope ✓ đã có
|
|
61
64
|
[4] Risks ⚠ không có trong template
|
|
62
65
|
[5] Features ✗ chưa có — cần bổ sung
|
|
63
|
-
[6]
|
|
64
|
-
[7]
|
|
66
|
+
[6] Components ✗ chưa có — cần bổ sung
|
|
67
|
+
[7] Non-Functional Req. ✓ đã có
|
|
68
|
+
[8] Business Constraints ✓ đã có
|
|
65
69
|
[A] Interview tất cả sections
|
|
66
70
|
|
|
67
71
|
Chọn số hoặc A:
|
|
@@ -101,11 +105,15 @@ Sau đó hỏi tuần tự, từng phần một — không hỏi tất cả cùn
|
|
|
101
105
|
> Hệ thống cần implement những features gì? Mỗi feature gồm: tên ngắn, mô tả 1 câu (làm gì, cho ai), priority (Must/Should/Could).
|
|
102
106
|
> (Đây sẽ là Feature Index mà các FRD sau này sẽ tham chiếu.)
|
|
103
107
|
|
|
104
|
-
**Phần 5 —
|
|
108
|
+
**Phần 5 — Components:**
|
|
109
|
+
> Hệ thống có những thành phần kỹ thuật (component) nào? Mỗi component gồm: tên ngắn (kebab-case, ví dụ `auth`, `payment`), mô tả 1 câu — component chịu trách nhiệm gì.
|
|
110
|
+
> (Đây là Component Index — agent có thể bỏ trống nếu user chưa rõ; component sẽ được thêm dần qua cascade từ integrations sau này.)
|
|
111
|
+
|
|
112
|
+
**Phần 6 — Non-Functional Requirements:**
|
|
105
113
|
> Có yêu cầu về performance, security, availability, scalability không?
|
|
106
114
|
> Mỗi NFR cần: category, mô tả cụ thể, target đo được, priority (Must/Should/Could).
|
|
107
115
|
|
|
108
|
-
**Phần
|
|
116
|
+
**Phần 7 — Business Constraints:**
|
|
109
117
|
> Có ràng buộc kinh doanh nào không? (deadline, budget, compliance, vendor lock-in, v.v.)
|
|
110
118
|
> Có giả định nào quan trọng cần ghi lại không?
|
|
111
119
|
|
|
@@ -134,15 +142,24 @@ Chỉ ghi file sau khi user confirm. Nếu user yêu cầu chỉnh sửa → c
|
|
|
134
142
|
|
|
135
143
|
### Bước 5: Save
|
|
136
144
|
|
|
137
|
-
Ghi nội dung đã được confirm
|
|
145
|
+
**5a. Ghi `specs/main/prd.md`** — nội dung đã được confirm, thay thế toàn bộ nội dung cũ.
|
|
146
|
+
|
|
147
|
+
**5b. Scaffold `specs/main/domain.md`** *(chỉ khi file này chưa tồn tại)*:
|
|
148
|
+
|
|
149
|
+
- Copy `.claude/templates/main/domain-template.md` thành `specs/main/domain.md`.
|
|
150
|
+
- Section **Glossary** giữ format bảng rỗng — terms sẽ được thêm dần qua cascade từ integrations.
|
|
151
|
+
- Section **Shared Entities** giữ block placeholder — entities sẽ mọc dần qua cascade khi integration giới thiệu shared entity.
|
|
152
|
+
|
|
153
|
+
Nếu `domain.md` đã tồn tại với nội dung thực → không đụng tới.
|
|
138
154
|
|
|
139
155
|
Thông báo kết quả:
|
|
140
156
|
```
|
|
141
157
|
✓ specs/main/prd.md đã được cập nhật (status: draft)
|
|
158
|
+
{nếu vừa scaffold} ✓ specs/main/domain.md đã được scaffold (skeleton — sẽ mọc dần qua cascade)
|
|
142
159
|
|
|
143
160
|
Bước tiếp theo:
|
|
144
|
-
- /spec-
|
|
145
|
-
- (sau
|
|
161
|
+
- /spec-sad → thiết kế kiến trúc kỹ thuật
|
|
162
|
+
- (sau sad) /spec-new → bắt đầu integration đầu tiên
|
|
146
163
|
```
|
|
147
164
|
|
|
148
165
|
---
|
|
@@ -172,5 +189,7 @@ Trước khi kết thúc, kiểm tra:
|
|
|
172
189
|
- [ ] Mỗi persona có: tên vai trò, mục tiêu, pain point
|
|
173
190
|
- [ ] Out of Scope có ít nhất 1 item với lý do
|
|
174
191
|
- [ ] Features có ít nhất 1 item, mỗi item có ID (F-XXX), tên, mô tả, priority
|
|
192
|
+
- [ ] Components: nếu có item, mỗi item có ID (C-XXX), tên, mô tả ngắn (có thể trống nếu chưa rõ)
|
|
175
193
|
- [ ] Mỗi NFR có target đo được (không phải "nhanh", "bảo mật chung chung")
|
|
194
|
+
- [ ] domain.md tồn tại (đã scaffold skeleton hoặc có nội dung sẵn)
|
|
176
195
|
- [ ] User đã confirm trước khi file được ghi
|
package/skills/spec-sad/SKILL.md
CHANGED
|
@@ -39,10 +39,10 @@ SAD không chứa: feature-level design, business rules, entity details — nh
|
|
|
39
39
|
|
|
40
40
|
**Đọc `specs/main/domain.md`:**
|
|
41
41
|
|
|
42
|
-
- **Chưa tồn tại
|
|
43
|
-
> `domain.md` chưa
|
|
42
|
+
- **Chưa tồn tại** → dừng ngay:
|
|
43
|
+
> `domain.md` chưa được scaffold. Hãy chạy `/spec-prd` trước (skill này scaffold cả `prd.md` và `domain.md` skeleton).
|
|
44
44
|
|
|
45
|
-
- **Đã
|
|
45
|
+
- **Đã tồn tại** → đọc để hiểu: glossary và shared entities (nếu có). Lưu ý `domain.md` có thể chỉ mới là skeleton vì nội dung chi tiết mọc dần qua cascade từ integrations — không cần dừng nếu file mỏng.
|
|
46
46
|
|
|
47
47
|
**Đọc `specs/main/sad.md`:**
|
|
48
48
|
|
|
@@ -60,18 +60,24 @@ Nếu integration đã có `tech.md` → hỏi trước khi tiếp tục:
|
|
|
60
60
|
|
|
61
61
|
Load các file sau:
|
|
62
62
|
|
|
63
|
-
- `specs/integrations/{slug}/spec.md` — đọc toàn
|
|
63
|
+
- `specs/integrations/{slug}/spec.md` — đọc toàn bộ + frontmatter (`features`, `components`)
|
|
64
64
|
- `specs/main/sad.md` — đọc Tech Stack và Architectural Guardrails
|
|
65
|
-
- `specs/main/domain.md` — đọc
|
|
65
|
+
- `specs/main/domain.md` — đọc Glossary và Shared Entities
|
|
66
|
+
- `specs/main/component/{C-XXX}-{slug}/cdd.md` — cho mỗi component trong frontmatter `components` (nếu cdd.md tồn tại)
|
|
67
|
+
- `specs/main/feature/{F-XXX}-{slug}/fdd.md` — cho mỗi feature trong frontmatter `features` (nếu fdd.md tồn tại)
|
|
66
68
|
|
|
67
69
|
Tóm tắt context và surface assumptions:
|
|
68
70
|
|
|
69
71
|
```
|
|
70
72
|
TỪ SPEC & SAD TÔI HIỂU:
|
|
71
73
|
- Integration: {title}
|
|
74
|
+
- Features liên quan: {từ frontmatter — F-XXX, ...}
|
|
75
|
+
- Components bị touched: {từ frontmatter — C-XXX, ...}
|
|
72
76
|
- Yêu cầu chính: {tóm tắt requirements từ spec.md}
|
|
73
77
|
- Tech stack: {từ sad.md}
|
|
74
|
-
-
|
|
78
|
+
- Shared entities liên quan: {từ domain.md}
|
|
79
|
+
- Component design hiện tại: {tóm tắt từ cdd.md(s) — bỏ qua nếu chưa tồn tại}
|
|
80
|
+
- Inter-component flow hiện tại: {tóm tắt từ fdd.md(s) — bỏ qua nếu chưa tồn tại}
|
|
75
81
|
- Guardrails cần tuân theo: {list GUARD-XXX từ sad.md}
|
|
76
82
|
|
|
77
83
|
ASSUMPTIONS TÔI ĐANG ĐẶT RA:
|
|
@@ -119,29 +125,56 @@ Tổng hợp và viết draft `tech.md`:
|
|
|
119
125
|
|
|
120
126
|
**Cấu trúc file**: dùng `.claude/templates/integrations/tech-template.md` làm skeleton, điền nội dung từ interview vào.
|
|
121
127
|
|
|
122
|
-
**Cascade Proposals** —
|
|
128
|
+
**Cascade Proposals** — agent đề xuất delta cho main artifacts theo các targets sau (chỉ điền nếu thực sự có thay đổi, không thì ghi "Không có thay đổi đề xuất."):
|
|
123
129
|
|
|
124
130
|
### sad.md
|
|
125
131
|
|
|
126
|
-
|
|
132
|
+
Đề xuất cập nhật nếu integration này:
|
|
133
|
+
- Thêm cross-cutting concern mới (logging strategy, caching, ...)
|
|
134
|
+
- Thay đổi tech stack
|
|
135
|
+
- Thêm guardrail mới
|
|
127
136
|
|
|
128
137
|
### domain.md
|
|
129
138
|
|
|
130
|
-
|
|
139
|
+
Đề xuất cập nhật nếu integration này:
|
|
140
|
+
- Thay đổi shared entity (entity được dùng bởi 2+ component)
|
|
141
|
+
- Thêm shared entity mới phát sinh từ thiết kế kỹ thuật
|
|
131
142
|
|
|
132
|
-
###
|
|
143
|
+
### component/{C-XXX}-{component-name}/cdd.md
|
|
133
144
|
|
|
134
|
-
|
|
145
|
+
Liệt kê **tất cả** components bị touched trong frontmatter và đánh giá từng cái:
|
|
135
146
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
-
|
|
139
|
-
-
|
|
147
|
+
| Component | cdd.md | Đề xuất |
|
|
148
|
+
| --- | --- | --- |
|
|
149
|
+
| C-001 — auth | tồn tại | **Cập nhật** — thêm module RateLimiter, đổi storage strategy cho session |
|
|
150
|
+
| C-003 — payment | chưa có | **Tạo mới** — full cdd skeleton |
|
|
140
151
|
|
|
141
|
-
|
|
142
|
-
- Dùng khi fdd.md đã tồn tại, ghi rõ thay đổi cụ thể cần thêm/sửa
|
|
152
|
+
Với từng component có đề xuất:
|
|
143
153
|
|
|
144
|
-
|
|
154
|
+
**Tạo mới** `specs/main/component/{C-XXX}-{component-slug}/cdd.md`
|
|
155
|
+
- Dùng khi component này được giới thiệu lần đầu trong integration (cascade từ spec.md đã đề xuất tạo crd, giờ tech.md đề xuất tạo cdd)
|
|
156
|
+
- Nội dung: Module Structure, Internal Data Flow, Storage & Persistence, Internal Interfaces, Technical Decisions
|
|
157
|
+
|
|
158
|
+
**Cập nhật** `specs/main/component/{C-XXX}-{component-slug}/cdd.md`
|
|
159
|
+
- Khi cdd.md đã tồn tại và integration thay đổi internal design
|
|
160
|
+
|
|
161
|
+
### feature/{F-XXX}-{feature-name}/fdd.md
|
|
162
|
+
|
|
163
|
+
Liệt kê **tất cả** features liên quan trong frontmatter và đánh giá:
|
|
164
|
+
|
|
165
|
+
| Feature | fdd.md | Đề xuất |
|
|
166
|
+
| --- | --- | --- |
|
|
167
|
+
| F-001 — Checkout | tồn tại | **Cập nhật** — thêm sequence khi payment fail |
|
|
168
|
+
| F-002 — Refund | chưa có | **Tạo mới** |
|
|
169
|
+
|
|
170
|
+
**Tạo mới** `specs/main/feature/{F-XXX}-{feature-slug}/fdd.md`
|
|
171
|
+
- Khi feature gắn với integration nhưng chưa có fdd.md
|
|
172
|
+
- Nội dung: Inter-component data flow, Orchestration, Cross-component invariants — từ tech.md (chỉ phần inter-component, không lặp internal design của component)
|
|
173
|
+
|
|
174
|
+
**Cập nhật** `specs/main/feature/{F-XXX}-{feature-slug}/fdd.md`
|
|
175
|
+
- Khi fdd.md đã tồn tại, ghi rõ thay đổi flow nào
|
|
176
|
+
|
|
177
|
+
Bỏ block fdd.md nếu integration không gắn với feature nào (`features: []`).
|
|
145
178
|
```
|
|
146
179
|
|
|
147
180
|
Hiển thị draft cho user xem — **chưa ghi file**.
|
|
@@ -167,10 +200,10 @@ Thông báo kết quả:
|
|
|
167
200
|
✓ specs/integrations/{slug}/tech.md đã được tạo (status: draft)
|
|
168
201
|
|
|
169
202
|
Bước tiếp theo:
|
|
170
|
-
- Review và
|
|
203
|
+
- Review tech.md và apply Cascade Proposals (nếu có) vào main artifacts thủ công
|
|
204
|
+
- Approve tech.md (đổi status: draft → approved)
|
|
171
205
|
- /plan → tạo plan.md và todo.md cho integration này
|
|
172
|
-
- Sau khi done: đổi status F-XXX trong prd.md thành DONE
|
|
173
|
-
- Nếu Cascade Proposals có thay đổi → chạy /spec-domain hoặc /spec-sad
|
|
206
|
+
- Sau khi tất cả tasks done: đổi status F-XXX trong prd.md thành DONE
|
|
174
207
|
```
|
|
175
208
|
|
|
176
209
|
---
|
|
@@ -3,6 +3,7 @@ id: "{id}"
|
|
|
3
3
|
slug: "{slug}"
|
|
4
4
|
title: "{title}"
|
|
5
5
|
features: []
|
|
6
|
+
components: []
|
|
6
7
|
status: draft
|
|
7
8
|
created: {YYYY-MM-DD}
|
|
8
9
|
referenced_by:
|
|
@@ -12,36 +13,51 @@ referenced_by:
|
|
|
12
13
|
|
|
13
14
|
## Context
|
|
14
15
|
|
|
15
|
-
<!-- Tóm tắt ngắn các thông tin quan trọng từ context đã load (prd.md, domain.md, frd.md), để file self-contained -->
|
|
16
|
+
<!-- Tóm tắt ngắn các thông tin quan trọng từ context đã load (prd.md, domain.md, frd.md, crd.md), để file self-contained -->
|
|
16
17
|
|
|
17
18
|
## Problem Statement
|
|
18
19
|
|
|
19
20
|
<!-- Vấn đề cần giải quyết là gì, tại sao cần giải quyết -->
|
|
20
21
|
|
|
21
|
-
##
|
|
22
|
+
## Acceptance Criteria
|
|
22
23
|
|
|
23
|
-
<!--
|
|
24
|
+
<!--
|
|
25
|
+
Agent tự chọn cách tổ chức phù hợp với bản chất integration. Có thể mix nếu integration vừa thêm feature, vừa thay đổi component.
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
AC ID format:
|
|
28
|
+
- AC liên quan feature: `AC-{F_ID}-{seq}` — feature-scoped, cascade vào frd.md
|
|
29
|
+
- AC liên quan component: `AC-{C_ID}-{seq}` — component-scoped, cascade vào responsibilities/interface/rules của crd.md
|
|
26
30
|
|
|
27
|
-
|
|
31
|
+
Format Given/When/Then. Bỏ block không dùng.
|
|
32
|
+
-->
|
|
28
33
|
|
|
29
|
-
-
|
|
34
|
+
### Feature: {feature-name} *(bỏ nếu integration không touch feature; lặp lại block cho mỗi feature)*
|
|
35
|
+
|
|
36
|
+
**Feature-level AC:**
|
|
37
|
+
|
|
38
|
+
- [ ] `AC-{F_ID}-{seq}`
|
|
30
39
|
- **Given** {precondition}
|
|
31
40
|
- **When** {action}
|
|
32
41
|
- **Then** {expected outcome}
|
|
33
42
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
#### US-001: {Story title}
|
|
43
|
+
#### US-{F_ID}-{seq}: {Story title}
|
|
37
44
|
|
|
38
45
|
**{Persona}** muốn **{hành động}** để **{mục tiêu}**.
|
|
39
46
|
|
|
40
47
|
**Priority:** Must / Should / Could
|
|
41
48
|
|
|
42
|
-
**
|
|
49
|
+
**Story AC:**
|
|
43
50
|
|
|
44
|
-
- [ ] AC-
|
|
51
|
+
- [ ] `AC-{F_ID}-{seq}`
|
|
52
|
+
- **Given** {precondition}
|
|
53
|
+
- **When** {action}
|
|
54
|
+
- **Then** {expected outcome}
|
|
55
|
+
|
|
56
|
+
### Component: `{C-XXX}-{component-name}` *(bỏ nếu integration không touch component; lặp lại block cho mỗi component)*
|
|
57
|
+
|
|
58
|
+
**AC theo responsibility / interface / rule:**
|
|
59
|
+
|
|
60
|
+
- [ ] `AC-{C_ID}-{seq}` — {responsibility / interface / rule mô tả}
|
|
45
61
|
- **Given** {precondition}
|
|
46
62
|
- **When** {action}
|
|
47
63
|
- **Then** {expected outcome}
|
|
@@ -67,8 +83,14 @@ Không có thay đổi đề xuất.
|
|
|
67
83
|
|
|
68
84
|
Không có thay đổi đề xuất.
|
|
69
85
|
|
|
86
|
+
### component/{C-XXX}-{component-name}/crd.md
|
|
87
|
+
|
|
88
|
+
<!-- Lặp lại section này cho mỗi component liên quan đến spec. Bỏ nếu integration không touch component nào. -->
|
|
89
|
+
|
|
90
|
+
Không có thay đổi đề xuất.
|
|
91
|
+
|
|
70
92
|
### feature/{F-XXX}-{feature-name}/frd.md
|
|
71
93
|
|
|
72
|
-
<!-- Lặp lại section này cho mỗi feature liên quan đến spec -->
|
|
94
|
+
<!-- Lặp lại section này cho mỗi feature liên quan đến spec. Bỏ nếu integration không gắn với feature nào. -->
|
|
73
95
|
|
|
74
96
|
Không có thay đổi đề xuất.
|
|
@@ -3,6 +3,7 @@ id: "{id}"
|
|
|
3
3
|
slug: "{slug}"
|
|
4
4
|
title: "{title}"
|
|
5
5
|
features: []
|
|
6
|
+
components: []
|
|
6
7
|
status: draft
|
|
7
8
|
created: {YYYY-MM-DD}
|
|
8
9
|
referenced_by:
|
|
@@ -12,7 +13,7 @@ referenced_by:
|
|
|
12
13
|
|
|
13
14
|
## Context
|
|
14
15
|
|
|
15
|
-
<!-- Tóm tắt ngắn các thông tin quan trọng từ context đã load (sad.md, domain.md, fdd.md, spec.md) -->
|
|
16
|
+
<!-- Tóm tắt ngắn các thông tin quan trọng từ context đã load (sad.md, domain.md, cdd.md, fdd.md, spec.md) -->
|
|
16
17
|
|
|
17
18
|
## Solution Overview
|
|
18
19
|
|
|
@@ -54,6 +55,14 @@ Không có thay đổi đề xuất.
|
|
|
54
55
|
|
|
55
56
|
Không có thay đổi đề xuất.
|
|
56
57
|
|
|
58
|
+
### component/{C-XXX}-{component-name}/cdd.md
|
|
59
|
+
|
|
60
|
+
<!-- Lặp lại section này cho mỗi component bị touched. Bỏ nếu integration không touch component nào. -->
|
|
61
|
+
|
|
62
|
+
Không có thay đổi đề xuất.
|
|
63
|
+
|
|
57
64
|
### feature/{F-XXX}-{feature-name}/fdd.md
|
|
58
65
|
|
|
66
|
+
<!-- Lặp lại section này cho mỗi feature liên quan. Bỏ nếu integration không gắn feature nào. -->
|
|
67
|
+
|
|
59
68
|
Không có thay đổi đề xuất.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: cdd-{component}
|
|
3
|
+
type: cdd
|
|
4
|
+
status: draft
|
|
5
|
+
owner: "{Tech Lead / Senior Dev}"
|
|
6
|
+
component_id: "{Component ID, ví dụ C-001}"
|
|
7
|
+
referenced_by:
|
|
8
|
+
- conventions.md > 3. Main Artifacts > 3.2 Component level > cdd.md > Cấu trúc
|
|
9
|
+
- skills/spec-tech/SKILL.md > Process > Cascade Proposals > component cdd.md
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Component Design: {Component Name}
|
|
13
|
+
|
|
14
|
+
> File này mô tả **internal design** của component — cách nó được tổ chức bên trong.
|
|
15
|
+
>
|
|
16
|
+
> Vai trò, public interface, business rules nằm trong `crd.md`. Cross-cutting concerns (auth, logging, ...) nằm trong `sad.md`.
|
|
17
|
+
|
|
18
|
+
## Module Structure
|
|
19
|
+
|
|
20
|
+
Các module/sub-component bên trong component và responsibility của từng module.
|
|
21
|
+
|
|
22
|
+
| Module | Responsibility |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| {module} | {mô tả} |
|
|
25
|
+
|
|
26
|
+
## Internal Data Flow
|
|
27
|
+
|
|
28
|
+
Luồng dữ liệu nội bộ component — từ input đến output, qua những module nào.
|
|
29
|
+
|
|
30
|
+
```mermaid
|
|
31
|
+
sequenceDiagram
|
|
32
|
+
...
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Storage & Persistence
|
|
36
|
+
|
|
37
|
+
Cách component lưu trữ data. Bỏ section nếu component stateless.
|
|
38
|
+
|
|
39
|
+
### Tables / Collections
|
|
40
|
+
|
|
41
|
+
| Name | Mục đích | Key columns / Indexes |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| {table_name} | {mục đích} | PK: {cols}, Index: {cols} |
|
|
44
|
+
|
|
45
|
+
### Cache Strategy *(bỏ nếu dùng global strategy từ SAD)*
|
|
46
|
+
|
|
47
|
+
{Mô tả cache strategy nội bộ component nếu khác SAD.}
|
|
48
|
+
|
|
49
|
+
## Internal Interfaces
|
|
50
|
+
|
|
51
|
+
Contract giữa các module bên trong component. Public interface (ra ngoài) đã được mô tả trong `crd.md`.
|
|
52
|
+
|
|
53
|
+
| Caller | Callee | Purpose |
|
|
54
|
+
| --- | --- | --- |
|
|
55
|
+
| {module A} | {module B} | {gọi để làm gì} |
|
|
56
|
+
|
|
57
|
+
## Technical Decisions
|
|
58
|
+
|
|
59
|
+
Các quyết định kỹ thuật đặc thù của component và lý do.
|
|
60
|
+
|
|
61
|
+
| Quyết định | Lý do | Alternatives đã cân nhắc |
|
|
62
|
+
| --- | --- | --- |
|
|
63
|
+
| {decision} | {lý do cụ thể} | {option A vs B} |
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: crd-{component}
|
|
3
|
+
type: crd
|
|
4
|
+
status: draft
|
|
5
|
+
owner: "{BA / Tech Lead}"
|
|
6
|
+
component_id: "{Component ID từ PRD Component Index, ví dụ C-001}"
|
|
7
|
+
referenced_by:
|
|
8
|
+
- conventions.md > 3. Main Artifacts > 3.2 Component level > crd.md > Cấu trúc
|
|
9
|
+
- skills/spec-new/SKILL.md > Process > Cascade Proposals > component crd.md
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Component: {Component Name}
|
|
13
|
+
|
|
14
|
+
## Role
|
|
15
|
+
|
|
16
|
+
{1-2 câu mô tả vai trò của component trong hệ thống. Component này là "nơi chịu trách nhiệm" cho cái gì?}
|
|
17
|
+
|
|
18
|
+
## Responsibilities
|
|
19
|
+
|
|
20
|
+
Trách nhiệm cụ thể của component — phải làm gì, **không** làm gì.
|
|
21
|
+
|
|
22
|
+
### Does
|
|
23
|
+
|
|
24
|
+
- {responsibility 1}
|
|
25
|
+
- {responsibility 2}
|
|
26
|
+
|
|
27
|
+
### Does NOT
|
|
28
|
+
|
|
29
|
+
- {responsibility thuộc component khác — ghi rõ component nào sở hữu}
|
|
30
|
+
- {responsibility nằm ngoài scope}
|
|
31
|
+
|
|
32
|
+
## Owned Entities
|
|
33
|
+
|
|
34
|
+
Entities mà component này sở hữu canonical definition. Nếu entity được dùng bởi 2+ component, định nghĩa chính sẽ ở `domain.md` (Shared Entities) thay vì ở đây — chỉ ghi reference.
|
|
35
|
+
|
|
36
|
+
### {Entity Name}
|
|
37
|
+
|
|
38
|
+
{Mô tả entity này đại diện cho cái gì.}
|
|
39
|
+
|
|
40
|
+
**Attributes:**
|
|
41
|
+
|
|
42
|
+
| Attribute | Type | Required | Validation |
|
|
43
|
+
| --- | --- | --- | --- |
|
|
44
|
+
| {tên} | {business type} | Yes/No | {rule} |
|
|
45
|
+
|
|
46
|
+
**State Machine:** *(bỏ nếu entity không có lifecycle)*
|
|
47
|
+
|
|
48
|
+
| From | To | Trigger | Guard |
|
|
49
|
+
| --- | --- | --- | --- |
|
|
50
|
+
| {state} | {state} | {sự kiện} | {điều kiện} |
|
|
51
|
+
|
|
52
|
+
## Public Interface
|
|
53
|
+
|
|
54
|
+
Các interface mà component expose ra ngoài — signature level, không bao gồm implementation.
|
|
55
|
+
|
|
56
|
+
### API Endpoints *(bỏ nếu component không expose HTTP API)*
|
|
57
|
+
|
|
58
|
+
| Method | Path | Purpose | Auth |
|
|
59
|
+
| --- | --- | --- | --- |
|
|
60
|
+
| {GET/POST/...} | {/path} | {mục đích} | required/public |
|
|
61
|
+
|
|
62
|
+
### Events Published *(bỏ nếu không emit event)*
|
|
63
|
+
|
|
64
|
+
| Event | Trigger | Payload chính |
|
|
65
|
+
| --- | --- | --- |
|
|
66
|
+
| {EventName} | {khi nào emit} | {fields chính} |
|
|
67
|
+
|
|
68
|
+
### Events Consumed *(bỏ nếu không consume event)*
|
|
69
|
+
|
|
70
|
+
| Event | Source Component | Action |
|
|
71
|
+
| --- | --- | --- |
|
|
72
|
+
| {EventName} | {C-XXX} | {component này làm gì khi nhận event} |
|
|
73
|
+
|
|
74
|
+
## Business Rules
|
|
75
|
+
|
|
76
|
+
Các quy tắc nghiệp vụ thuộc về component này. Rule cross-component thuộc về `fdd.md` của feature liên quan.
|
|
77
|
+
|
|
78
|
+
| ID | Rule | Condition | Exception |
|
|
79
|
+
| --- | --- | --- | --- |
|
|
80
|
+
| {C-XXX-R01} | {mô tả rule} | {khi nào apply} | {ngoại lệ nếu có} |
|
|
81
|
+
|
|
82
|
+
## Dependencies
|
|
83
|
+
|
|
84
|
+
Các component khác mà component này phụ thuộc.
|
|
85
|
+
|
|
86
|
+
| Component | Loại dependency | Cách dùng |
|
|
87
|
+
| --- | --- | --- |
|
|
88
|
+
| `{C-XXX}-{name}` | sync call / event subscription / shared entity | {cụ thể: gọi API nào, subscribe event nào} |
|
|
@@ -5,22 +5,35 @@ status: draft
|
|
|
5
5
|
owner: "{BA/Domain Expert}"
|
|
6
6
|
referenced_by:
|
|
7
7
|
- conventions.md > 3. Main Artifacts > 3.1 Product level > domain.md > Cấu trúc
|
|
8
|
-
- skills/spec-
|
|
9
|
-
- skills/spec-
|
|
8
|
+
- skills/spec-prd/SKILL.md > Process > Bước 5: Save (scaffold domain.md skeleton)
|
|
9
|
+
- skills/spec-new/SKILL.md > Process > Cascade Proposals > domain.md
|
|
10
|
+
- skills/spec-tech/SKILL.md > Process > Cascade Proposals > domain.md
|
|
10
11
|
---
|
|
11
12
|
|
|
12
13
|
# Domain
|
|
13
14
|
|
|
14
|
-
|
|
15
|
+
> File này mỏng — chỉ chứa **shared vocabulary** và **shared entities** (entities được dùng bởi 2+ component).
|
|
16
|
+
>
|
|
17
|
+
> Business rules, domain events, internal entities thuộc về component sở hữu — xem `specs/main/component/{C-XXX}-{component-name}/crd.md`.
|
|
15
18
|
|
|
16
|
-
|
|
17
|
-
| --- | --- |
|
|
18
|
-
| {term} | {definition chính xác, không mơ hồ} |
|
|
19
|
+
## Glossary
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
Định nghĩa các thuật ngữ business — đây là **nơi duy nhất** chứa glossary trong toàn dự án.
|
|
22
|
+
|
|
23
|
+
| Term | Definition | Example / Context |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
| {term} | {định nghĩa chính xác, không mơ hồ} | {context hoặc ví dụ minh họa nếu cần} |
|
|
26
|
+
|
|
27
|
+
## Shared Entities
|
|
28
|
+
|
|
29
|
+
Chỉ liệt kê entity được dùng bởi **2 hoặc nhiều component**. Entity nội bộ một component không vào đây — chúng nằm trong `crd.md` của component đó.
|
|
21
30
|
|
|
22
31
|
### {Entity Name}
|
|
23
32
|
|
|
33
|
+
**Owner:** `{C-XXX}-{component-name}` *(component sở hữu canonical definition)*
|
|
34
|
+
|
|
35
|
+
**Used by:** `{C-XXX}`, `{C-YYY}` *(các component reference entity này)*
|
|
36
|
+
|
|
24
37
|
{Mô tả entity này đại diện cho cái gì trong business context.}
|
|
25
38
|
|
|
26
39
|
**Attributes:**
|
|
@@ -39,22 +52,10 @@ Type là business type (text, number, money, date, email, phone) — không ph
|
|
|
39
52
|
|
|
40
53
|
## Entity Relationships
|
|
41
54
|
|
|
55
|
+
Quan hệ giữa các shared entities. Quan hệ giữa entity nội bộ component thuộc về `cdd.md` của component đó.
|
|
56
|
+
|
|
42
57
|
```mermaid
|
|
43
58
|
erDiagram
|
|
44
59
|
EntityA ||--o{ EntityB : ""
|
|
45
60
|
EntityB }o--|| EntityC : ""
|
|
46
61
|
```
|
|
47
|
-
|
|
48
|
-
## Business Rules
|
|
49
|
-
|
|
50
|
-
| ID | Rule | Condition | Exception |
|
|
51
|
-
| --- | --- | --- | --- |
|
|
52
|
-
| {DOMAIN-R01} | {mô tả rule} | {khi nào apply} | {ngoại lệ nếu có} |
|
|
53
|
-
|
|
54
|
-
## Domain Events
|
|
55
|
-
|
|
56
|
-
*(Bỏ nếu không có event-driven behavior)*
|
|
57
|
-
|
|
58
|
-
| Event | Trigger | Payload |
|
|
59
|
-
| --- | --- | --- |
|
|
60
|
-
| {EventName} | {khi nào xảy ra} | {data đi kèm} |
|
|
@@ -5,51 +5,48 @@ status: draft
|
|
|
5
5
|
owner: "{Tech Lead / Senior Dev}"
|
|
6
6
|
feature_id: "{Feature ID}"
|
|
7
7
|
referenced_by:
|
|
8
|
-
- conventions.md > 3. Main Artifacts > 3.
|
|
8
|
+
- conventions.md > 3. Main Artifacts > 3.3 Feature level > fdd.md > Cấu trúc
|
|
9
9
|
- skills/spec-tech/SKILL.md > Process > Bước 4: Write — sinh draft > Cascade Proposals > fdd.md
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# Feature Design: {Feature Name}
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
> File này mỏng — chỉ mô tả **cách các component tương tác với nhau** để thực hiện feature.
|
|
15
|
+
>
|
|
16
|
+
> Internal design của từng component nằm trong `cdd.md` của component đó. Cross-cutting concerns nằm trong `sad.md`.
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
## Inter-Component Data Flow
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
| --- | --- |
|
|
20
|
-
| {module} | {mô tả} |
|
|
21
|
-
|
|
22
|
-
## Data Flow
|
|
23
|
-
|
|
24
|
-
{Mô tả data flow nội bộ feature — từ input đến output, qua những bước nào.}
|
|
20
|
+
Luồng dữ liệu đi qua các component — sequence diagram là form chính, có thể bổ sung mô tả prose.
|
|
25
21
|
|
|
26
22
|
```mermaid
|
|
27
23
|
sequenceDiagram
|
|
28
|
-
|
|
24
|
+
participant User
|
|
25
|
+
participant {C-XXX} as ComponentA
|
|
26
|
+
participant {C-YYY} as ComponentB
|
|
27
|
+
|
|
28
|
+
User->>ComponentA: {request}
|
|
29
|
+
ComponentA->>ComponentB: {call}
|
|
30
|
+
ComponentB-->>ComponentA: {response}
|
|
31
|
+
ComponentA-->>User: {result}
|
|
29
32
|
```
|
|
30
33
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
### API Endpoints
|
|
34
|
+
{Mô tả ngắn các bước nếu sequence diagram chưa đủ rõ.}
|
|
34
35
|
|
|
35
|
-
|
|
36
|
-
| --- | --- | --- | --- |
|
|
37
|
-
| {GET/POST/...} | {/path} | {mục đích} | required/public |
|
|
36
|
+
## Orchestration
|
|
38
37
|
|
|
39
|
-
|
|
38
|
+
Logic ở cấp feature — không thuộc component nào riêng lẻ. Bỏ section nếu feature đơn giản (1-2 component, không cần retry/fallback đặc biệt).
|
|
40
39
|
|
|
41
|
-
|
|
|
42
|
-
| --- | --- |
|
|
43
|
-
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
*(Bỏ nếu dùng global strategy từ SAD)*
|
|
40
|
+
| Concern | Handling |
|
|
41
|
+
| --- | --- |
|
|
42
|
+
| Retry policy | {ví dụ: retry 3 lần với exponential backoff khi gọi component X} |
|
|
43
|
+
| Timeout | {ví dụ: timeout tổng feature 5s; per-component 2s} |
|
|
44
|
+
| Fallback | {ví dụ: nếu component X fail, dùng cached data} |
|
|
45
|
+
| Error propagation | {ví dụ: lỗi từ component Y được map thành 503 cho user} |
|
|
48
46
|
|
|
49
|
-
|
|
47
|
+
## Cross-Component Invariants
|
|
50
48
|
|
|
51
|
-
|
|
49
|
+
Các invariant cần đảm bảo xuyên component — consistency, transactional boundary, ordering. Bỏ section nếu không có.
|
|
52
50
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
| {decision} | {lý do cụ thể} | {option A vs B} |
|
|
51
|
+
- {ví dụ: Order chỉ được đánh dấu `paid` sau khi Payment component confirm thành công}
|
|
52
|
+
- {ví dụ: Inventory phải được reserve trước khi Order được tạo, rollback nếu Payment fail}
|
|
@@ -5,7 +5,7 @@ status: draft
|
|
|
5
5
|
owner: "{BA}"
|
|
6
6
|
feature_id: "{Feature ID từ PRD Feature Index}"
|
|
7
7
|
referenced_by:
|
|
8
|
-
- conventions.md > 3. Main Artifacts > 3.
|
|
8
|
+
- conventions.md > 3. Main Artifacts > 3.3 Feature level > frd.md > Cấu trúc
|
|
9
9
|
- skills/spec-new/SKILL.md > Process > Bước 5: Write — sinh draft > Cascade Proposals > frd.md
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -15,18 +15,29 @@ referenced_by:
|
|
|
15
15
|
|
|
16
16
|
{Mô tả feature này giải quyết vấn đề gì cho user nào, trong 2-3 câu.}
|
|
17
17
|
|
|
18
|
+
## Components Consumed
|
|
19
|
+
|
|
20
|
+
Các component mà feature này dùng — tham chiếu đến `specs/main/component/{C-XXX}-...`.
|
|
21
|
+
|
|
22
|
+
| Component | Vai trò trong feature |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| `{C-XXX}-{component-name}` | {component này phục vụ cái gì cho feature này} |
|
|
25
|
+
|
|
18
26
|
## Feature-level Acceptance Criteria
|
|
19
27
|
|
|
20
28
|
Criteria áp dụng cho toàn bộ feature — không gắn với story cụ thể (ví dụ: performance, security, accessibility).
|
|
29
|
+
AC ID format: `AC-F{NNN}-{seq}` — đánh số tăng dần toàn feature (không reset giữa sections).
|
|
21
30
|
|
|
22
|
-
-
|
|
31
|
+
- `AC-{F_ID}-001`
|
|
23
32
|
- **Given** {precondition}
|
|
24
33
|
- **When** {action}
|
|
25
34
|
- **Then** {expected outcome}
|
|
26
35
|
|
|
27
36
|
## User Stories
|
|
28
37
|
|
|
29
|
-
|
|
38
|
+
US ID format: `US-F{NNN}-{seq}` — đánh số tăng dần toàn feature.
|
|
39
|
+
|
|
40
|
+
### US-{F_ID}-001: {Story title}
|
|
30
41
|
|
|
31
42
|
**{Persona}** muốn **{hành động}** để **{mục tiêu}**.
|
|
32
43
|
|
|
@@ -34,18 +45,18 @@ Criteria áp dụng cho toàn bộ feature — không gắn với story cụ th
|
|
|
34
45
|
|
|
35
46
|
**Acceptance Criteria:**
|
|
36
47
|
|
|
37
|
-
-
|
|
48
|
+
- `AC-{F_ID}-{seq}`
|
|
38
49
|
- **Given** {precondition}
|
|
39
50
|
- **When** {action}
|
|
40
51
|
- **Then** {expected outcome}
|
|
41
|
-
-
|
|
52
|
+
- `AC-{F_ID}-{seq}`
|
|
42
53
|
- **Given** {precondition}
|
|
43
54
|
- **When** {action}
|
|
44
55
|
- **Then** {expected outcome}
|
|
45
56
|
|
|
46
57
|
---
|
|
47
58
|
|
|
48
|
-
### US-002: {Story title}
|
|
59
|
+
### US-{F_ID}-002: {Story title}
|
|
49
60
|
|
|
50
61
|
**{Persona}** muốn **{hành động}** để **{mục tiêu}**.
|
|
51
62
|
|
|
@@ -53,7 +64,7 @@ Criteria áp dụng cho toàn bộ feature — không gắn với story cụ th
|
|
|
53
64
|
|
|
54
65
|
**Acceptance Criteria:**
|
|
55
66
|
|
|
56
|
-
-
|
|
67
|
+
- `AC-{F_ID}-{seq}`
|
|
57
68
|
- **Given** {precondition}
|
|
58
69
|
- **When** {action}
|
|
59
70
|
- **Then** {expected outcome}
|
|
@@ -39,6 +39,14 @@ Tại sao cần giải quyết bây giờ.
|
|
|
39
39
|
| --- | --- | --- | --- | --- |
|
|
40
40
|
| F-001 | {tên feature} | {mô tả ngắn — feature làm gì, cho ai} | High/Medium/Low | TODO/DONE |
|
|
41
41
|
|
|
42
|
+
## Components
|
|
43
|
+
|
|
44
|
+
Các thành phần kỹ thuật của hệ thống — chi tiết về vai trò và thiết kế nằm trong `specs/main/component/{C-XXX}-{component-name}/`.
|
|
45
|
+
|
|
46
|
+
| ID | Component | Mô tả ngắn | Status |
|
|
47
|
+
| --- | --- | --- | --- |
|
|
48
|
+
| C-001 | {tên component} | {1 câu — component này chịu trách nhiệm gì} | TODO/DONE |
|
|
49
|
+
|
|
42
50
|
## Non-Functional Requirements
|
|
43
51
|
|
|
44
52
|
| ID | Category | Requirement | Target | Priority |
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: spec-domain
|
|
3
|
-
description: Điền hoặc cập nhật domain.md — Domain Knowledge (entities, business rules, terminology). Dùng sau khi prd.md đã có nội dung.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# spec-domain
|
|
7
|
-
|
|
8
|
-
## Overview
|
|
9
|
-
|
|
10
|
-
Tạo nội dung cho `specs/main/domain.md` thông qua interview có cấu trúc. Domain là ngôn ngữ chung của hệ thống — nó định nghĩa các khái niệm business, entities, business rules, và events mà toàn bộ team (cả business lẫn tech) dùng chung.
|
|
11
|
-
|
|
12
|
-
Domain không chứa: implementation details, DB schema, framework-specific code, hay bất cứ thứ gì thuộc về `sad.md`, `fdd.md`.
|
|
13
|
-
|
|
14
|
-
## When to Use
|
|
15
|
-
|
|
16
|
-
- `domain.md` chưa có hoặc còn rỗng, và `prd.md` đã có nội dung
|
|
17
|
-
- Cần bổ sung entity hoặc business rule mới phát sinh từ một integration
|
|
18
|
-
- Cascade proposals từ `spec.md` hoặc `tech.md` yêu cầu cập nhật domain
|
|
19
|
-
|
|
20
|
-
## When NOT to Use
|
|
21
|
-
|
|
22
|
-
- `prd.md` chưa có nội dung → chạy `/spec-prd` trước
|
|
23
|
-
- Đang muốn thiết kế kiến trúc kỹ thuật → dùng `/spec-sad`
|
|
24
|
-
- Đang muốn định nghĩa feature-level requirements → dùng `/spec-frd`
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## Process
|
|
29
|
-
|
|
30
|
-
### Bước 1: Kiểm tra preconditions
|
|
31
|
-
|
|
32
|
-
**Đọc `specs/main/prd.md`:**
|
|
33
|
-
|
|
34
|
-
- **Chưa tồn tại hoặc là template** → dừng ngay:
|
|
35
|
-
> `prd.md` chưa có nội dung. Hãy chạy `/spec-prd` trước để có PRD trước khi định nghĩa domain.
|
|
36
|
-
|
|
37
|
-
- **Đã có nội dung** → đọc để lấy context: scope, problem statement, target users. Dùng làm nền để hỏi về entities.
|
|
38
|
-
|
|
39
|
-
**Đọc `specs/main/domain.md`:**
|
|
40
|
-
|
|
41
|
-
- **Chưa tồn tại** → tạo thư mục `specs/main/` nếu chưa có, tiến hành Bước 2 (full interview).
|
|
42
|
-
|
|
43
|
-
- **Đã có nội dung thực** → quét toàn bộ sections, hiển thị trạng thái từng section, rồi hỏi user muốn làm gì.
|
|
44
|
-
|
|
45
|
-
**Các sections cần quét** (theo thứ tự):
|
|
46
|
-
|
|
47
|
-
| # | Section | Có nội dung thực? |
|
|
48
|
-
| --- | --- | --- |
|
|
49
|
-
| 1 | Terminology | ✓ đã có / ✗ trống/thiếu |
|
|
50
|
-
| 2 | Entities | ✓ đã có / ✗ trống/thiếu |
|
|
51
|
-
| 3 | Business Rules | ✓ đã có / ✗ trống/thiếu |
|
|
52
|
-
| 4 | Domain Events | ✓ đã có / ✗ trống/thiếu |
|
|
53
|
-
|
|
54
|
-
Một section được coi là **trống/thiếu** nếu: không tồn tại trong file, hoặc chỉ chứa placeholder template (dấu `{}`), hoặc không có dòng nội dung thực. Ngoài các sections trên, **ghi nhận các sections thừa** — những `##` heading có trong file nhưng không có trong template.
|
|
55
|
-
|
|
56
|
-
Sau khi quét, liệt kê tất cả sections **theo đúng thứ tự xuất hiện trong file**, đánh số liên tục:
|
|
57
|
-
|
|
58
|
-
```
|
|
59
|
-
domain.md hiện tại:
|
|
60
|
-
[1] Terminology ✓ đã có
|
|
61
|
-
[2] Entities ✓ đã có
|
|
62
|
-
[3] Business Rules ✗ chưa có — cần bổ sung
|
|
63
|
-
[4] Risks ⚠ không có trong template
|
|
64
|
-
[5] Domain Events ✓ đã có
|
|
65
|
-
[A] Interview tất cả sections
|
|
66
|
-
|
|
67
|
-
Chọn số hoặc A:
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
- User chọn số section thuộc template → interview section đó rồi merge vào file.
|
|
71
|
-
- User chọn số section thừa (⚠) → xoá section đó khỏi file ngay, không hỏi thêm.
|
|
72
|
-
- User chọn A → interview tuần tự tất cả sections thuộc template (sections thừa không bị đụng tới).
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
### Bước 2: Gather — interview có cấu trúc
|
|
77
|
-
|
|
78
|
-
Trước khi hỏi, tóm tắt ngắn context đọc được từ `prd.md` (nếu có) và surface assumptions:
|
|
79
|
-
|
|
80
|
-
```
|
|
81
|
-
TỪ PRD TÔI HIỂU:
|
|
82
|
-
- Hệ thống giải quyết: {problem statement ngắn gọn}
|
|
83
|
-
- Các khái niệm tôi thấy xuất hiện: {list terms từ prd}
|
|
84
|
-
|
|
85
|
-
ASSUMPTIONS TÔI ĐANG ĐẶT RA:
|
|
86
|
-
1. {assumption 1}
|
|
87
|
-
2. {assumption 2}
|
|
88
|
-
→ Sửa lại nếu sai trước khi tiếp tục.
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
Sau đó hỏi tuần tự từng phần — không hỏi tất cả cùng lúc:
|
|
92
|
-
|
|
93
|
-
**Phần 1 — Terminology:**
|
|
94
|
-
> Có thuật ngữ nghiệp vụ nào đặc thù cần định nghĩa rõ không? (Ví dụ: "đơn hàng" trong hệ thống này nghĩa là gì chính xác?)
|
|
95
|
-
> Liệt kê những term hay bị dùng sai hoặc có nhiều cách hiểu.
|
|
96
|
-
|
|
97
|
-
**Phần 2 — Entities:**
|
|
98
|
-
> Hệ thống làm việc với những "đối tượng" nghiệp vụ nào? (Ví dụ: User, Order, Product...)
|
|
99
|
-
> Với mỗi entity: nó đại diện cho cái gì trong business? Attributes nào quan trọng? Có lifecycle (state machine) không?
|
|
100
|
-
|
|
101
|
-
Với mỗi entity được đề cập, hỏi tiếp:
|
|
102
|
-
> Entity này có trạng thái (state) thay đổi theo thời gian không? Nếu có, các trạng thái đó là gì và khi nào chuyển đổi?
|
|
103
|
-
|
|
104
|
-
**Phần 3 — Business Rules:**
|
|
105
|
-
> Có quy tắc nghiệp vụ nào bất biến không? (Ví dụ: "Không thể hủy đơn hàng đã giao", "User chưa verify không được thanh toán")
|
|
106
|
-
> Ghi theo format: rule — khi nào apply — ngoại lệ nếu có.
|
|
107
|
-
|
|
108
|
-
**Phần 4 — Domain Events:** *(hỏi nếu hệ thống có event-driven behavior)*
|
|
109
|
-
> Có sự kiện nghiệp vụ nào quan trọng cần track không? (Ví dụ: OrderPlaced, PaymentFailed...)
|
|
110
|
-
> Khi nào xảy ra? Data gì đi kèm?
|
|
111
|
-
|
|
112
|
-
Nếu câu trả lời vague → hỏi lại. Ví dụ:
|
|
113
|
-
- "có nhiều loại user" → "liệt kê cụ thể từng loại và điểm khác nhau giữa chúng là gì?"
|
|
114
|
-
- "đơn hàng có nhiều trạng thái" → "liệt kê hết các trạng thái và vẽ luồng chuyển đổi"
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
### Bước 3: Write — sinh draft
|
|
119
|
-
|
|
120
|
-
Dùng `.claude/templates/main/domain-template.md` làm skeleton, điền nội dung từ interview vào từng section.
|
|
121
|
-
|
|
122
|
-
Hiển thị draft cho user xem — **chưa ghi file**.
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
### Bước 4: Review — xác nhận với user
|
|
127
|
-
|
|
128
|
-
Trình bày draft và hỏi:
|
|
129
|
-
> Draft Domain trên đã đúng chưa? Có entity nào thiếu, business rule nào sai không?
|
|
130
|
-
|
|
131
|
-
Chỉ ghi file sau khi user confirm. Nếu user yêu cầu chỉnh sửa → cập nhật draft → hỏi lại.
|
|
132
|
-
|
|
133
|
-
---
|
|
134
|
-
|
|
135
|
-
### Bước 5: Save
|
|
136
|
-
|
|
137
|
-
Ghi nội dung đã được confirm vào `specs/main/domain.md`.
|
|
138
|
-
|
|
139
|
-
Thông báo kết quả:
|
|
140
|
-
```
|
|
141
|
-
✓ specs/main/domain.md đã được cập nhật (status: draft)
|
|
142
|
-
|
|
143
|
-
Bước tiếp theo:
|
|
144
|
-
- /spec-sad → thiết kế kiến trúc kỹ thuật (dùng prd.md + domain.md làm context)
|
|
145
|
-
- (sau sad) /spec-frd {feature-name} → định nghĩa requirements của từng feature
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
|
|
150
|
-
## Common Rationalizations
|
|
151
|
-
|
|
152
|
-
| Rationalization | Reality |
|
|
153
|
-
| --- | --- |
|
|
154
|
-
| "Entities thì ai cũng biết rồi, không cần ghi" | Entity chưa được viết ra là entity chưa được đồng thuận. Dev và BA có thể hiểu khác nhau. |
|
|
155
|
-
| "Business rules thì ghi trong code thôi" | Business rules trong code không ai đọc được ngoài dev. Domain là ngôn ngữ chung cho cả team. |
|
|
156
|
-
| "State machine phức tạp, thêm sau" | State machine ảnh hưởng trực tiếp đến data model và API design. Thiếu nó là thiếu constraint quan trọng. |
|
|
157
|
-
| "Terminology thì khỏi cần, ai cũng hiểu" | "Order" trong hệ thống bán lẻ khác "Order" trong hệ thống sản xuất. Định nghĩa rõ tránh miscommunication. |
|
|
158
|
-
|
|
159
|
-
## Red Flags
|
|
160
|
-
|
|
161
|
-
- Entity chỉ có tên, không có attributes hay mô tả
|
|
162
|
-
- Business rules ghi dưới dạng technical ("validate bằng regex") thay vì business ("số điện thoại phải là số Việt Nam")
|
|
163
|
-
- Terminology section trống trong khi domain có nhiều thuật ngữ đặc thù
|
|
164
|
-
- Attributes dùng DB type (`VARCHAR`, `INT`) thay vì business type (`text`, `number`)
|
|
165
|
-
|
|
166
|
-
## Verification
|
|
167
|
-
|
|
168
|
-
Trước khi kết thúc, kiểm tra:
|
|
169
|
-
|
|
170
|
-
- [ ] Frontmatter đầy đủ và đúng schema
|
|
171
|
-
- [ ] Mỗi term trong Terminology có definition rõ ràng, không mơ hồ
|
|
172
|
-
- [ ] Mỗi entity có mô tả business context (không chỉ là tên)
|
|
173
|
-
- [ ] Attributes dùng business type, không phải DB type
|
|
174
|
-
- [ ] State machine chỉ có ở entity có lifecycle thực sự
|
|
175
|
-
- [ ] Business rules có ID (`DOM-R01`...), condition, và exception rõ ràng
|
|
176
|
-
- [ ] User đã confirm trước khi file được ghi
|