spec-lite 1.4.1 → 1.4.3

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: Tạo tsd.md (Test Spec Document) trực tiếp tại feature level
7
7
 
8
8
  ## Overview
9
9
 
10
- Tạo `specs/main/feature/{F-XXX}-{slug}/tsd.md` trực tiếp từ frd.md của feature đó — **không qua integration**, không cascade.
10
+ Tạo `.specs/main/feature/{F-XXX}-{slug}/tsd.md` trực tiếp từ frd.md của feature đó — **không qua integration**, không cascade.
11
11
 
12
12
  Skill này song hành với `/spec-prd` và `/spec-sad`: skill có acronym suffix (`prd`/`sad`/`tsd`) → tạo main artifact trực tiếp. Phân biệt với `/spec-test` — skill đó tạo `test.md` integration-level và cascade qua Changes blocks.
13
13
 
@@ -39,13 +39,13 @@ Quy tắc:
39
39
 
40
40
  **Nếu có ARGUMENT:**
41
41
  - Parse argument: có thể là feature ID (`F-001`, `001`) hoặc slug (`F-001-auth`, `auth`)
42
- - Quét `specs/main/feature/*/frd.md`, tìm feature khớp
42
+ - Quét `.specs/main/feature/*/frd.md`, tìm feature khớp
43
43
  - Nếu không tìm thấy → báo lỗi:
44
- > Không tìm thấy feature khớp với "{argument}". Kiểm tra `specs/main/feature/`.
44
+ > Không tìm thấy feature khớp với "{argument}". Kiểm tra `.specs/main/feature/`.
45
45
 
46
46
  **Nếu không có ARGUMENT:**
47
47
 
48
- Quét `specs/main/feature/`. Liệt kê **tất cả** features có `frd.md`, đánh dấu trạng thái tsd:
48
+ Quét `.specs/main/feature/`. Liệt kê **tất cả** features có `frd.md`, đánh dấu trạng thái tsd:
49
49
 
50
50
  ```
51
51
  Features có frd.md:
@@ -66,12 +66,12 @@ Nếu không có feature nào có frd → thông báo:
66
66
 
67
67
  **Check 1 — frd.md tồn tại:**
68
68
 
69
- Nếu `specs/main/feature/{F-XXX}-{slug}/frd.md` không tồn tại → dừng:
69
+ Nếu `.specs/main/feature/{F-XXX}-{slug}/frd.md` không tồn tại → dừng:
70
70
  > ⛔ `feature/{F-XXX}-{slug}/frd.md` không tồn tại. `/spec-tsd` cần frd làm input.
71
71
 
72
72
  **Check 2 — tsd.md đã tồn tại:**
73
73
 
74
- Nếu `specs/main/feature/{F-XXX}-{slug}/tsd.md` đã tồn tại:
74
+ Nếu `.specs/main/feature/{F-XXX}-{slug}/tsd.md` đã tồn tại:
75
75
 
76
76
  > ⚠ `tsd.md` đã tồn tại cho feature **{F-XXX} — {slug}**.
77
77
  >
@@ -90,8 +90,8 @@ Nếu user chọn yes → backup tsd.md cũ thành `tsd.md.bak.{timestamp}` rồ
90
90
 
91
91
  Load các file sau:
92
92
 
93
- - `specs/main/feature/{F-XXX}-{slug}/frd.md` — **bắt buộc**, source của TC
94
- - `specs/main/feature/{F-XXX}-{slug}/fdd.md` — optional, đọc nếu tồn tại để hint Components Used (cho Dependencies section của tsd)
93
+ - `.specs/main/feature/{F-XXX}-{slug}/frd.md` — **bắt buộc**, source của TC
94
+ - `.specs/main/feature/{F-XXX}-{slug}/fdd.md` — optional, đọc nếu tồn tại để hint Components Used (cho Dependencies section của tsd)
95
95
 
96
96
  Tóm tắt context:
97
97
 
@@ -183,7 +183,7 @@ Hiển thị draft đầy đủ — chưa ghi file.
183
183
 
184
184
  ### Bước 6: Save
185
185
 
186
- Ghi `specs/main/feature/{F-XXX}-{slug}/tsd.md` với status `draft` (feature-level artifact có lifecycle riêng, không phải `approved` — QC còn fill placeholders nên status `draft` cho đến khi đầy đủ).
186
+ Ghi `.specs/main/feature/{F-XXX}-{slug}/tsd.md` với status `draft` (feature-level artifact có lifecycle riêng, không phải `approved` — QC còn fill placeholders nên status `draft` cho đến khi đầy đủ).
187
187
 
188
188
  Nếu overwrite — file backup `tsd.md.bak.{timestamp}` đã tạo ở Bước 2.
189
189
 
@@ -200,7 +200,7 @@ Nếu overwrite tsd.md cũ → entry vẫn dùng operation `create` (vì IDs reg
200
200
  Thông báo kết quả:
201
201
 
202
202
  ```
203
- ✓ specs/main/feature/{F-XXX}-{slug}/tsd.md đã được tạo (status: draft)
203
+ .specs/main/feature/{F-XXX}-{slug}/tsd.md đã được tạo (status: draft)
204
204
  Coverage: N Flows → N TS, M US/AC → M Functional TC, P VR → ~2P Validation TC, Q FAC → Q Feature AC TC
205
205
  {nếu overwrite: backup tại tsd.md.bak.{timestamp}}
206
206
 
@@ -8,12 +8,13 @@ Dùng khi bắt đầu dự án mới chưa có code. Mục tiêu: bootstrap `pr
8
8
 
9
9
  | Command | Reads | Writes |
10
10
  | --- | --- | --- |
11
- | `/spec-prd` | — | `specs/main/prd.md`, `specs/main/domain.md` *(skeleton)* |
12
- | `/spec-sad` | `prd.md`, `domain.md` | `specs/main/sad.md` |
11
+ | `/spec-prd` | — *(tùy chọn: nguồn baseline path/@file/paste)* | `.specs/main/prd.md`, `.specs/main/domain.md` *(skeleton)* |
12
+ | `/spec-sad` | `prd.md`, `domain.md` | `.specs/main/sad.md` |
13
+ | `/spec-frd [F-XXX]` *(tùy chọn)* | `prd.md`, `domain.md`, `sad.md`, `crd(s)` *(+ nguồn baseline)* | `.specs/main/feature/{F-XXX}-*/frd.md` *(+ register feature row vào `prd.md` nếu feature mới)* |
13
14
 
14
15
  ### `/spec-prd`
15
16
 
16
- Tạo hoặc cập nhật `specs/main/prd.md` thông qua interview có cấu trúc. Ngoài ra **scaffold luôn `specs/main/domain.md` skeleton** (Glossary placeholder + Shared Entities rỗng) — domain mọc dần qua cascade từ integrations.
17
+ Tạo hoặc cập nhật `.specs/main/prd.md` thông qua interview có cấu trúc. Ngoài ra **scaffold luôn `.specs/main/domain.md` skeleton** (Glossary placeholder + Shared Entities rỗng) — domain mọc dần qua cascade từ integrations.
17
18
 
18
19
  **Sections template** (7): Problem Statement · Target Users · Scope · Features · Components · Non-Functional Requirements · Business Constraints
19
20
 
@@ -32,7 +33,7 @@ Chọn `A` → interview tuần tự 7 sections template (sections thừa không
32
33
 
33
34
  ### `/spec-sad`
34
35
 
35
- 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 (cả hai do `/spec-prd` scaffold).
36
+ 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 (cả hai do `/spec-prd` scaffold).
36
37
 
37
38
  Trước khi interview, đọc `prd.md` (NFRs, constraints) và `domain.md` (glossary, shared entities) để surface assumptions và đề xuất options phù hợp khi user chưa quyết định.
38
39
 
@@ -48,12 +49,36 @@ Nếu `prd.md` chưa có → dừng, yêu cầu chạy `/spec-prd` trước.
48
49
 
49
50
  ---
50
51
 
52
+ ### `/spec-frd [F-XXX]` *(tùy chọn)*
53
+
54
+ BA author `.specs/main/feature/{F-XXX}-*/frd.md` trực tiếp qua interview — **spec-first ở feature level**, chạy *trước* khi DEV bắt đầu integration. Cặp greenfield đối xứng với `/spec-brownfield-feature` (vốn reverse-engineer frd từ code).
55
+
56
+ Nhận F-XXX từ argument (hoặc chọn từ prd Feature Index) + tùy chọn nguồn baseline (path/@file/paste như `/spec-prd`). Yêu cầu `prd.md` tồn tại.
57
+
58
+ **Hai gate input (làm chặt) — phải pass cả hai mới author:**
59
+ - **Single-feature**: nguồn liên quan **đúng 1 feature**. Xác định > 1 feature → **dừng + mô tả rõ lý do tách** (outcome/luồng/persona của từng cái) → redirect `/spec-prd` để khai Feature Index.
60
+ - **Create-only**: frd.md của feature mục tiêu **chưa tồn tại**. Đã tồn tại → **dừng, redirect `/spec-new`** (thay đổi feature đã spec phải đi qua integration để delta cascade + kéo theo `/spec-tech`/`/spec-test`).
61
+ - Feature mới **đơn lẻ** chưa có trong Index → offer **register một row vào `prd.md > Features`** rồi author.
62
+
63
+ **Sections template** (7): Overview · User Flows · Feature Acceptance Criteria · User Stories · Verification Rules · Scope · Dependencies
64
+
65
+ **Phạm vi hẹp — chủ yếu `frd.md`:**
66
+ - Reference component frd phụ thuộc (Components Used → C-XXX có sẵn).
67
+ - Component cần-nhưng-chưa-có → ghi *candidate* + Open Question cho `/spec-sad`/architect chốt boundary.
68
+ - Có thể register **một** feature row vào prd (side-effect hợp lệ duy nhất lên prd). **KHÔNG** tạo `crd.md`/`cdd.md` (sinh ở integration time qua `/spec-new` cascade), không tạo `fdd.md`/`tsd.md`, không đổi status feature đã có, không đụng sad/domain.
69
+ - Change History operation = `manual`. Verification Rules dùng quy ước option-suggester của `/spec-new` (BA owns).
70
+
71
+ Bỏ qua bước này cũng được — `/spec-new` sẽ tự tạo frd làm fallback khi integration đầu tiên chạm tới feature.
72
+
73
+ ---
74
+
51
75
  ### Thứ tự thực hiện
52
76
 
53
77
  ```
54
78
  /spec-prd → /spec-sad
55
79
 
56
80
  │ (có thể chạy /scaffold để khởi tạo project structure)
81
+ │ (tùy chọn /spec-frd [F-XXX] — BA author frd.md trước)
57
82
 
58
83
 
59
84
  → Integration Pipeline
@@ -228,17 +253,17 @@ Sau khi main artifacts đã sẵn sàng (từ greenfield hoặc brownfield), m
228
253
 
229
254
  | Command | Reads | Writes |
230
255
  | --- | --- | --- |
231
- | `/spec-new [requirement]` | `prd.md`, `domain.md`, frd(s), crd(s) | `specs/integrations/{slug}/spec.md` |
232
- | `/spec-tech [number]` | `sad.md`, `domain.md`, cdd(s), fdd(s), `spec.md` | `specs/integrations/{slug}/tech.md` |
233
- | `/spec-test [number]` | `spec.md`, frd(s), tsd(s), `tech.md` *(optional)* | `specs/integrations/{slug}/test.md`, `feature/{F-XXX}/tsd.md` |
256
+ | `/spec-new [requirement]` | `prd.md`, `domain.md`, frd(s), crd(s) | `.specs/integrations/{slug}/spec.md` |
257
+ | `/spec-tech [number]` | `sad.md`, `domain.md`, cdd(s), fdd(s), `spec.md` | `.specs/integrations/{slug}/tech.md` |
258
+ | `/spec-test [number]` | `spec.md`, frd(s), tsd(s), `tech.md` *(optional)* | `.specs/integrations/{slug}/test.md`, `feature/{F-XXX}/tsd.md` |
234
259
  | `/plan` | `spec.md`, `tech.md`, `domain.md` | `plan.md`, `todo.md` |
235
260
  | `/build` | `plan.md`, `todo.md` | *(source code)* |
236
261
  | `/review-integration` | `spec.md`, `tech.md`, `plan.md`, `todo.md`, *(source code)* | *(findings report)* |
237
- | `/archive` | `specs/integrations/` | `specs/archive/` |
262
+ | `/archive` | `.specs/integrations/` | `.specs/archive/` |
238
263
 
239
264
  ### `/spec-new [requirement]`
240
265
 
241
- Tạo `specs/integrations/{slug}/spec.md` cho một integration mới. Chạy bởi BA.
266
+ Tạo `.specs/integrations/{slug}/spec.md` cho một integration mới. Chạy bởi BA.
242
267
 
243
268
  **Nếu không có argument** → đọc `prd.md`, hiển thị danh sách features có `Status = TODO`, user chọn số.
244
269
 
@@ -258,9 +283,9 @@ Sau khi confirm → ghi `spec.md`, cập nhật `prd.md`: Status `TODO → In Pr
258
283
 
259
284
  ### `/spec-tech [number]`
260
285
 
261
- Tạo `specs/integrations/{slug}/tech.md` cho một integration. Chạy bởi DEV sau khi `spec.md` đã được approve.
286
+ Tạo `.specs/integrations/{slug}/tech.md` cho một integration. Chạy bởi DEV sau khi `spec.md` đã được approve.
262
287
 
263
- **Luôn hiển thị danh sách tất cả integrations** trong `specs/integrations/`, đánh dấu `✓` những cái đã có `tech.md`. Nếu có argument → argument là số thứ tự (`1`, `001`...), chọn luôn không cần hiển thị.
288
+ **Luôn hiển thị danh sách tất cả integrations** trong `.specs/integrations/`, đánh dấu `✓` những cái đã có `tech.md`. Nếu có argument → argument là số thứ tự (`1`, `001`...), chọn luôn không cần hiển thị.
264
289
 
265
290
  Nếu integration đã có `tech.md` → hỏi confirm trước khi ghi đè.
266
291
 
@@ -274,9 +299,9 @@ Context load: `spec.md` + `sad.md` + `domain.md` + `cdd.md` (cho mỗi component
274
299
 
275
300
  ### `/spec-test [number]`
276
301
 
277
- Tạo `specs/integrations/{slug}/test.md` cho một integration. Chạy bởi **QC** sau khi `spec.md` đã được approve. **Song song / độc lập** với `/spec-tech` — cả hai chỉ phụ thuộc `spec.md`. Không có thứ tự bắt buộc giữa chúng.
302
+ Tạo `.specs/integrations/{slug}/test.md` cho một integration. Chạy bởi **QC** sau khi `spec.md` đã được approve. **Song song / độc lập** với `/spec-tech` — cả hai chỉ phụ thuộc `spec.md`. Không có thứ tự bắt buộc giữa chúng.
278
303
 
279
- **Luôn hiển thị danh sách tất cả integrations** trong `specs/integrations/`, đánh dấu `✓` những cái đã có `test.md`. Nếu có argument → chọn luôn không cần hiển thị.
304
+ **Luôn hiển thị danh sách tất cả integrations** trong `.specs/integrations/`, đánh dấu `✓` những cái đã có `test.md`. Nếu có argument → chọn luôn không cần hiển thị.
280
305
 
281
306
  **Gate check:** spec.md phải `approved` + `features:` non-empty. Integration có `features: []` (thuần component) → dừng vì component-level `tsd` không tồn tại trong kit này.
282
307
 
@@ -301,7 +326,7 @@ QC review: override priority defaults, fill placeholders (env / data / OOS / str
301
326
  Tạo `plan.md` và `todo.md` từ `spec.md` + `tech.md`. Là SDD wrapper quanh `planning-and-task-breakdown`.
302
327
 
303
328
  **Bước 1: Xác định integration**
304
- Quét `specs/integrations/`, hiển thị danh sách với trạng thái `spec✓/—`, `tech✓/—`, `plan✓/—`. Nếu có argument → chọn luôn. Nếu `plan.md`/`todo.md` đã tồn tại → hỏi trước khi ghi đè.
329
+ Quét `.specs/integrations/`, hiển thị danh sách với trạng thái `spec✓/—`, `tech✓/—`, `plan✓/—`. Nếu có argument → chọn luôn. Nếu `plan.md`/`todo.md` đã tồn tại → hỏi trước khi ghi đè.
305
330
 
306
331
  **Bước 2: Load và surface context**
307
332
  Đọc `spec.md`, `tech.md`, `domain.md`. Surface tóm tắt (features, components, AC IDs, thay đổi kỹ thuật, shared entities) và assumptions để user confirm. Plan mode từ đây — chỉ đọc, không viết code.
@@ -354,17 +379,17 @@ Review implementation sau `/build` theo năm trục: correctness, readability, a
354
379
 
355
380
  ### `/archive`
356
381
 
357
- Di chuyển integration đã hoàn thành hoặc không còn active từ `specs/integrations/` sang `specs/archive/` để dọn dẹp thư mục làm việc chính.
382
+ Di chuyển integration đã hoàn thành hoặc không còn active từ `.specs/integrations/` sang `.specs/archive/` để dọn dẹp thư mục làm việc chính.
358
383
 
359
- **Bước 1 — Kiểm tra thư mục:** Tự động tạo `specs/archive/` nếu chưa tồn tại.
384
+ **Bước 1 — Kiểm tra thư mục:** Tự động tạo `.specs/archive/` nếu chưa tồn tại.
360
385
 
361
- **Bước 2 — Liệt kê:** Quét `specs/integrations/`, hiển thị numbered list kèm status (đọc từ `spec.md` nếu có). Nếu không có integration nào → thông báo và dừng.
386
+ **Bước 2 — Liệt kê:** Quét `.specs/integrations/`, hiển thị numbered list kèm status (đọc từ `spec.md` nếu có). Nếu không có integration nào → thông báo và dừng.
362
387
 
363
388
  **Bước 3 — Xác nhận:** Hiển thị preview mapping `integrations/{slug}/ → archive/{slug}/` trước khi di chuyển. Chờ user confirm.
364
389
 
365
- **Bước 4 — Di chuyển:** Move toàn bộ thư mục, giữ nguyên cấu trúc bên trong. Nếu slug đã tồn tại trong `specs/archive/` → bỏ qua và cảnh báo để tránh ghi đè.
390
+ **Bước 4 — Di chuyển:** Move toàn bộ thư mục, giữ nguyên cấu trúc bên trong. Nếu slug đã tồn tại trong `.specs/archive/` → bỏ qua và cảnh báo để tránh ghi đè.
366
391
 
367
- **Bước 5 — Kết quả:** Liệt kê integrations đã archive, integrations bị bỏ qua (nếu có), và số integration còn lại trong `specs/integrations/`.
392
+ **Bước 5 — Kết quả:** Liệt kê integrations đã archive, integrations bị bỏ qua (nếu có), và số integration còn lại trong `.specs/integrations/`.
368
393
 
369
394
  ---
370
395
 
@@ -407,7 +432,7 @@ Khác với `/review-integration` (chạy sau `/build` cho một integration c
407
432
 
408
433
  | Command | Reads | Writes |
409
434
  | --- | --- | --- |
410
- | `/review-everything` | `prd.md`, `domain.md`, `sad.md`, *(source code)* | `specs/integrations/{NNN}-{slug}/review-findings.md` *(qua /spec-new)* |
435
+ | `/review-everything` | `prd.md`, `domain.md`, `sad.md`, *(source code)* | `.specs/integrations/{NNN}-{slug}/review-findings.md` *(qua /spec-new)* |
411
436
 
412
437
  ### `/review-everything`
413
438
 
@@ -425,7 +450,7 @@ Review codebase ở project level theo năm trục của `code-review-and-qualit
425
450
 
426
451
  Nếu user chọn fix → gom selected findings thành raw requirement, invoke `/spec-new` với ARGUMENT đó. Integration được tạo và xử lý như integration thường (`/spec-tech` → `/plan` → `/build`).
427
452
 
428
- `review-findings.md` (full snapshot, gồm cả deferred) được ghi vào `specs/integrations/{NNN}-{slug}/` để traceability.
453
+ `review-findings.md` (full snapshot, gồm cả deferred) được ghi vào `.specs/integrations/{NNN}-{slug}/` để traceability.
429
454
 
430
455
  **Khi dùng:**
431
456
 
@@ -546,7 +571,7 @@ Tạo hoặc cập nhật `.claude/ado.yaml` — file config ADO dùng chung cho
546
571
 
547
572
  **Bước 1 — Current user:** Đọc `git config user.email`, tìm trong `team.*` của `ado.yaml`. Nếu không khớp → hỏi user chọn. Resolve email → ADO identity ID để dùng làm assignee.
548
573
 
549
- **Bước 2 — Chọn integration:** List tất cả `specs/integrations/` kèm title và status từ frontmatter `spec.md`.
574
+ **Bước 2 — Chọn integration:** List tất cả `.specs/integrations/` kèm title và status từ frontmatter `spec.md`.
550
575
 
551
576
  **Bước 3 — Parse spec.md:** Extract Features (`### Feature: <name> (<ID>)`) và User Stories (`#### US-FXXX-YYY — <title>`). Detect ticket đã tồn tại qua dòng `**ADO:**` ngay sau heading — đánh dấu `already_created`, bỏ qua khi tạo.
552
577
 
@@ -574,7 +599,7 @@ Cập nhật state đồng loạt cho User Story (và tuỳ chọn Feature) tick
574
599
 
575
600
  **Bước 1 — Load config:** Đọc `ado.yaml`. Dừng nếu thiếu file hoặc `environments` rỗng.
576
601
 
577
- **Bước 2 — Chọn integration:** List `specs/integrations/` kèm title và status.
602
+ **Bước 2 — Chọn integration:** List `.specs/integrations/` kèm title và status.
578
603
 
579
604
  **Bước 3 — Parse & validate:** Extract tất cả Feature và User Story tickets từ dòng `**ADO:**` trong `spec.md`. Nếu bất kỳ ticket nào chưa có → dừng, báo danh sách thiếu, yêu cầu chạy `/ado-create` trước.
580
605
 
@@ -595,7 +620,7 @@ Cập nhật state đồng loạt cho User Story (và tuỳ chọn Feature) tick
595
620
  ## Ghi chú
596
621
 
597
622
  - Cascade proposals trong `spec.md` và `tech.md` do human review và apply thủ công — không có skill riêng.
598
- - **Greenfield**: Component và Feature artifacts mọc dần qua cascade từ integrations — không skill chuyên biệt để tạo.
623
+ - **Greenfield**: Feature artifacts (`frd.md`) có thể author trước bằng `/spec-frd`, hoặc mọc dần qua cascade từ integrations (`/spec-new` fallback). Component artifacts (`crd.md`/`cdd.md`) chỉ mọc qua cascade `/spec-frd` chỉ reference component, không tạo crd/cdd.
599
624
  - **Brownfield**: Component và Feature artifacts được bootstrap bởi `spec-brownfield-component` và `spec-brownfield-feature` — sau đó tiếp tục mọc qua cascade như bình thường.
600
625
  - Thứ tự trong một integration: `spec-new` → `spec-tech` → `plan` → `build`.
601
626
  - `frontend-design` và `frontend-ui-engineering` được `build` invoke tự động — không cần gọi thủ công.
@@ -14,7 +14,7 @@ referenced_by:
14
14
 
15
15
  > File này mỏng — chỉ chứa **shared vocabulary** và **shared entities** (entities được dùng bởi 2+ component).
16
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`.
17
+ > Business rules, domain events, internal entities thuộc về component sở hữu — xem `.specs/main/component/{C-XXX}-{component-name}/crd.md`.
18
18
 
19
19
  ## Glossary
20
20
 
@@ -6,6 +6,7 @@ owner: "{BA}"
6
6
  feature_id: "{Feature ID từ PRD Feature Index}"
7
7
  referenced_by:
8
8
  - conventions.md > 3. Main Artifacts > 3.3 Feature level > frd.md > Cấu trúc
9
+ - skills/spec-frd/SKILL.md > Process > Bước 5: Write — sinh draft
9
10
  - skills/spec-new/SKILL.md > Process > Bước 5: Write — sinh draft > feature/{F-XXX}/frd.md
10
11
  - templates/integrations/spec-template.md > Changes > feature/{F-XXX}/frd.md
11
12
  ---
@@ -148,7 +149,7 @@ Sub-rule phức tạp (vd: password complexity với nhiều điều kiện) →
148
149
 
149
150
  ### Components Used
150
151
 
151
- Tham chiếu đến `specs/main/component/{C-XXX}-...`.
152
+ Tham chiếu đến `.specs/main/component/{C-XXX}-...`.
152
153
 
153
154
  | Component | Vai trò trong feature |
154
155
  | --- | --- |
@@ -35,13 +35,28 @@ Tại sao cần giải quyết bây giờ.
35
35
 
36
36
  ## Features
37
37
 
38
+ Đặt tên feature theo **outcome của một luồng hoàn chỉnh**, kebab-case, đủ khái quát mà vẫn là *một* luồng — không quá rộng (`user-management` là feature area), không quá hẹp (`register-with-google` chỉ là biến thể). ✅ `user-registration`, `password-reset`, `checkout`.
39
+
38
40
  | ID | Feature | Mô tả | Priority | Status |
39
41
  | --- | --- | --- | --- | --- |
40
42
  | F-001 | {tên feature} | {mô tả ngắn — feature làm gì, cho ai} | High/Medium/Low | TODO/DONE |
41
43
 
42
44
  ## Components
43
45
 
44
- Các thành phần kỹ thuật của hệ thống chi tiết về vai trò thiết kế nằm trong `specs/main/component/{C-XXX}-{component-name}/`.
46
+ Một component = một khối có **boundary rõ + interface tường minh** và **một lý do duy nhất để thay đổi**. Không phân loại component thành "domain" hay "kỹ thuật" mỗi component đều mặt domain (`crd.md`) lẫn mặt kỹ thuật (`cdd.md`).
47
+
48
+ Đặt tên component theo **năng lực bền vững**, không theo công nghệ hiện tại, kebab-case. ✅ `notification`, `auth`, `file-storage`. ❌ quá cụ thể (`email-sender`, `stripe-client`) hoặc quá mơ hồ (`core`, `utils`, `manager`).
49
+
50
+ Section này **chỉ liệt kê component có boundary _Given_** — tức boundary bị ép từ ngoài, chỉ có một cách vẽ hợp lý. Áp thủ tục:
51
+ - **Câu 1 (External):** bọc/adapt hệ thống ngoài ta buộc phải tích hợp? (vd `payment-gateway` tích hợp Stripe, `email-service` tích hợp SendGrid) → Given, khai ở đây.
52
+ - **Câu 2 (Mandated-substrate):** nền tảng kỹ thuật dùng chung mà yêu cầu bắt buộc, độc lập với cách carve lõi nghiệp vụ? (vd `auth`, `file-storage`, `notification`) → Given, khai ở đây.
53
+ - **Còn lại (Derived):** boundary phụ thuộc cách carve lõi nghiệp vụ hoặc đánh đổi NFR (vd `order`, `pricing`, `inventory`) → **KHÔNG** khai ở đây.
54
+
55
+ **Component Derived mọc dần qua:**
56
+ - `/spec-sad` — architect lock component boundaries dựa trên full feature index + NFRs
57
+ - `/spec-new F-XXX` cascade — khi analyze 1 feature, discover component mới nếu cần và register vào đây qua Change History
58
+
59
+ Chi tiết về vai trò và thiết kế nằm trong `.specs/main/component/{C-XXX}-{component-name}/`.
45
60
 
46
61
  | ID | Component | Mô tả ngắn | Status |
47
62
  | --- | --- | --- | --- |