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.
@@ -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 `specs/main/feature/{F-XXX}-{feature-name}/frd.md` và `fdd.md` cho các features trong brownfield project.
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
- - `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)
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 `specs/main/component/` không có crd.md nào → cảnh báo tương tự và dừng.
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 `specs/main/prd.md` Feature Index:
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 `specs/main/prd.md`, `specs/main/domain.md`, và `specs/main/sad.md` cho một project đã tồn tại.
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
- | `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` |
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
- - `specs/main/prd.md` chưa có hoặc còn trống
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 `specs/main/prd.md`, `specs/main/domain.md`, `specs/main/sad.md`:
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 additional constraints:**
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 `specs/main/` nếu chưa có. Ghi các files đã được confirm.
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, ...]
@@ -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 `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.
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ệ duy nhất lên prd).
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ó, không đụng sad/domain.
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 `specs/main/prd.md`. Nếu không tồn tại / template rỗng → dừng:
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 `specs/main/feature/{F-XXX}-*/frd.md`.
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
- - `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).
121
- - `specs/main/domain.md` — Glossary + Shared Entities liên quan.
122
- - `specs/main/sad.md` — bảng Components (góc nhìn kiến trúc, để biết C-XXX nào đã có boundary).
123
- - `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).
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 danh sách component candidate (nếu có) và VR còn `TBD`.
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 `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).
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à **side-effect hợp lệ duy nhất** 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.
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
- **7c. KHÔNG đụng 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 tạo crd/cdd/fdd/tsd. Không đụng sad/domain.
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 component candidate
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
- - [ ] KHÔNG tạo crd/cdd/fdd/tsd; KHÔNG đụng sad/domain
310
- - [ ] Change History entry operation = `manual` (luôn `create`)
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 `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).
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 `specs/main/feature/*/frd.md`. Với mỗi file:
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
- | `specs/main/feature/{F-XXX}-{slug}/frd.md` | ✓ | File cần migrate |
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
- | `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 |
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 `specs/` cho từng ID cũ.
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
 
@@ -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 `specs/integrations/{NNN}-{slug}/`.
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 `specs/main/prd.md`. Nếu file không tồn tại hoặc là template rỗng → dừng:
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 `specs/main/feature/{F-XXX}-*/frd.md` đã có.
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
- - `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)
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 `specs/integrations/` theo pattern `{NNN}-*`
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: `specs/integrations/{NNN}-{slug}/spec.md`
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 `specs/integrations/{NNN}-{slug}/` nếu chưa 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}
@@ -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 `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.
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 `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).
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
- - `specs/main/prd.md` chưa có nội dung hoặc vẫn còn là template
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 `specs/main/prd.md`:
148
+ Đọc `.specs/main/prd.md`:
122
149
 
123
- - **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).
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 `specs/main/prd.md`** — nội dung đã được confirm, thay thế toàn bộ nội dung cũ.
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 `specs/main/domain.md`** *(chỉ khi file này chưa tồn tại)*:
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 `specs/main/domain.md`.
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
- - [ ] Nếu input context sẵn feature/component: đã reuse làm baseline, đã validate qua litmus + Given/Derived, đã flag mục phân loại sai (nếu )
332
+ - [ ] Đã chạy **Phép thử tính kép** cho mọi component Given: mục cả mặt UX riêng (vd auth/notification/file-storage) được đăng ký ở **CẢ** Feature Index lẫn Component Index, 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