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.
@@ -1,21 +1,21 @@
1
1
  ---
2
2
  name: spec-prd
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.
3
+ description: Điền hoặc cập nhật prd.md — Product Requirements Document ở product level. Nhận tùy chọn một nguồn yêu cầu (đường dẫn file/@file hoặc paste proposal/BRD/ghi chú) làm baseline để pre-fill interview. 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, 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 sẽ được mọc dần qua cascade từ integrations (glossary terms, shared entities).
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
 
@@ -26,13 +26,101 @@ PRD không chứa: tech stack, implementation details, entity schema, glossary,
26
26
 
27
27
  ---
28
28
 
29
+ ## Khái niệm: Feature vs Component
30
+
31
+ Section này là nền tảng để điền **Phần 4 (Features)** và **Phần 5 (Components)**. Đọc trước khi interview.
32
+
33
+ ### Nguyên tắc gốc
34
+
35
+ **Component là đơn vị ownership; Feature là đơn vị delivery.** Component bền vững theo thời gian; Feature là một luồng nghiệp vụ consume một hoặc nhiều component. Quan hệ giữa hai khái niệm là **N–N** — không mechanical-derive cái này từ cái kia.
36
+
37
+ ### Litmus test — phân loại một mục là Feature hay Component
38
+
39
+ Chạy qua các phép thử; đa số phiếu nghiêng đâu thì xếp vào đó:
40
+
41
+ | Phép thử | → Component | → Feature |
42
+ | --- | --- | --- |
43
+ | **Ownership** (quan trọng nhất) | Sở hữu entity + rule + interface | Điều phối/tiêu thụ dữ liệu & rule của thứ khác |
44
+ | **Lifetime** | Xóa hết luồng nghiệp vụ vẫn còn tồn tại | Bỏ đi, không component nào mất gì |
45
+ | **Hướng cắt** | Ngang — một năng lực dùng lại bởi N luồng | Dọc — UI→logic→data cho một luồng |
46
+ | **Đặt tên** | Danh từ hệ thống (`auth`, `payment`) | Luồng nghiệp vụ (`checkout-flow`, `password-reset`) |
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
+
49
+ ### Quy tắc đặt tên (cho cả Feature và Component)
50
+
51
+ **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.
52
+
53
+ **Component — theo năng lực bền vững, không theo công nghệ hiện tại:**
54
+ - ✅ `notification`, `auth`, `file-storage`, `payment-gateway`
55
+ - ❌ Quá cụ thể (rò rỉ impl): `email-sender` (mai thêm SMS/push?), `stripe-client`, `s3-uploader`
56
+ - ❌ Quá mơ hồ (mất boundary): `core`, `utils`, `manager`, `engine`, `service`, `data`
57
+ - Phép thử: *"Mai đổi nhà cung cấp / thêm kênh, tên còn đúng không?"* Không → quá cụ thể.
58
+
59
+ **Feature — theo outcome của một luồng hoàn chỉnh:**
60
+ - ✅ `user-registration`, `password-reset`, `checkout`
61
+ - ❌ Quá rộng (thành feature area, ôm nhiều luồng): `user-management`, `account`, `admin`
62
+ - ❌ Quá hẹp (chỉ một biến thể của luồng): `register-with-google`, `reset-password-via-sms-otp`
63
+ - Phép thử: *"Đây là MỘT luồng, hay cái ô chứa nhiều luồng?"* Cái ô → quá rộng.
64
+
65
+ ### Định nghĩa một Component
66
+
67
+ **Một component = một khối có (1) boundary rõ + interface tường minh, và (2) một lý do duy nhất để thay đổi.**
68
+
69
+ - Tính chất (1) là điều kiện *cần*; (2) là guardrail chống "tầng kỹ thuật" lọt vào. "Tầng controller" có boundary rõ nhưng đổi vì N lý do (auth đổi, payment đổi...) → cohesion bằng 0 → **không** phải component.
70
+ - Áp đúng tiêu chí "một lý do thay đổi" thì ranh giới theo capability/domain sẽ **tự hiện ra** — không cần áp luật "phải chia theo domain" từ ngoài vào.
71
+ - Mỗi component đồng thời có **mặt domain** (`crd.md` — WHAT/contract) và **mặt kỹ thuật** (`cdd.md` — HOW/internal design). Đừng phân loại component thành "domain component" hay "kỹ thuật component" — đó chỉ là mô tả *nguồn* cohesion, không phải luật cấu trúc.
72
+
73
+ ### Component nào khai ở PRD? — Logic Given vs Derived
74
+
75
+ Feature Index điền **đầy đủ** ở PRD. Component thì **không** — chỉ khai những component có boundary đã *chín*. Độ chín xác định bằng thủ tục quyết định, không cảm tính.
76
+
77
+ **Litmus gốc:** *"Cùng bộ yêu cầu này, một architect giỏi khác có thể vẽ boundary này khác đi một cách hợp lý không?"* — KHÔNG (bị ép, một cách vẽ) → **Given, khai ở PRD**. CÓ (một lựa chọn đánh đổi) → **Derived, để `/spec-sad`**.
78
+
79
+ **Thủ tục 3 câu** (YES đầu tiên thắng):
80
+
81
+ | # | Câu hỏi | Nếu YES |
82
+ | --- | --- | --- |
83
+ | 1. External | Nó bọc/adapt một hệ thống hay bên thứ ba **ngoài codebase** mà ta buộc phải tích hợp? | **Given** → khai PRD (vd `payment-gateway` tích hợp Stripe, `email-service` tích hợp SendGrid) |
84
+ | 2. Mandated-substrate | Nó là nền tảng kỹ thuật dùng chung mà yêu cầu nói rõ phải có, **độc lập với cách carve lõi nghiệp vụ**? | **Given** → khai PRD (vd `auth`, `file-storage`, `notification`) |
85
+ | 3. Còn lại | Boundary phụ thuộc cách carve lõi nghiệp vụ, hoặc phụ thuộc đánh đổi NFR (scale, isolation, consistency, team topology)? | **Derived** → KHÔNG khai, để `/spec-sad` (vd `order`, `pricing`, `inventory`) |
86
+
87
+ Ranh giới câu 2 vs câu 3 = **"boundary có độc lập với quyết định chia lõi nghiệp vụ không?"** Độc lập → Given; phụ thuộc → Derived.
88
+
89
+ ### Khi input context đã có sẵn feature/component
90
+
91
+ Input là **baseline, không phải chân lý tuyệt đối**:
92
+
93
+ - Reuse tên/ID/boundary nếu input đã có → không tự đẻ cấu trúc song song.
94
+ - 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).
95
+ - 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
+ - Phần input thiếu → mới interview để bù.
97
+
98
+ ---
99
+
29
100
  ## Process
30
101
 
102
+ ### Bước 0: Nạp nguồn yêu cầu (tùy chọn)
103
+
104
+ Trước khi interview, xác định có **nguồn yêu cầu** (proposal, BRD, ghi chú họp, draft cũ) để dùng làm baseline không. Thứ tự ưu tiên:
105
+
106
+ 1. **ARGUMENT là path / `@file`** → đọc file đó. Hỗ trợ `.md`, `.txt`, PDF.
107
+ 2. **ARGUMENT là text dài (paste trực tiếp)** → dùng luôn làm nguồn.
108
+ 3. **Không có ARGUMENT** → hỏi một lần:
109
+ > Bạn có tài liệu/nguồn yêu cầu nào để mình tham khảo không? Nhập **đường dẫn file**, **paste nội dung**, hoặc `không` để interview từ đầu.
110
+
111
+ Nếu có nguồn → đọc và **trích baseline** cho từng section PRD (problem, users, scope, features, components, NFR, constraints). Đánh dấu cái nào trích được, cái nào nguồn không đề cập.
112
+
113
+ Áp **quy tắc baseline** (xem section "Khi input context đã có sẵn feature/component"): reuse tên/ID/boundary; validate feature/component qua litmus + Given/Derived; flag mục phân loại sai; component Derived → candidate cho `/spec-sad`, không nhồi vào Component Index.
114
+
115
+ Nếu không có nguồn → bỏ qua, interview từ đầu như bình thường.
116
+
117
+ ---
118
+
31
119
  ### Bước 1: Kiểm tra preconditions
32
120
 
33
- Đọc `specs/main/prd.md`:
121
+ Đọc `.specs/main/prd.md`:
34
122
 
35
- - **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).
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).
36
124
 
37
125
  - **File là template rỗng** → tiến hành Bước 2 (full interview).
38
126
 
@@ -79,6 +167,10 @@ PRD không chứa: tech stack, implementation details, entity schema, glossary,
79
167
 
80
168
  ### Bước 2: Gather — interview requirements
81
169
 
170
+ **Nếu Bước 0 đã nạp được nguồn:** interview chuyển từ "hỏi trắng" thành **xác nhận + bù chỗ thiếu**. Với mỗi phần, trình bày baseline đã trích rồi hỏi user confirm/sửa; chỉ những phần nguồn không đề cập mới hỏi từ đầu. Bỏ qua phần nào nguồn đã đủ rõ và user xác nhận.
171
+
172
+ **Nếu không có nguồn:** interview từ đầu như mô tả bên dưới.
173
+
82
174
  Trước khi hỏi, list ra các assumptions đang tạm thời:
83
175
 
84
176
  ```
@@ -105,9 +197,15 @@ Sau đó hỏi tuần tự, từng phần một — không hỏi tất cả cùn
105
197
  > 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).
106
198
  > (Đây sẽ là Feature Index mà các FRD sau này sẽ tham chiếu.)
107
199
 
108
- **Phần 5 — Components:**
109
- > Hệ thống những thành phần kỹ thuật (component) nào? Mỗi component gồm: tên ngắn (kebab-case, dụ `auth`, `payment`), 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.)
200
+ **Phần 5 — Components (chỉ component có boundary Given):**
201
+ > Hệ thống chắc chắn phải tích hợp hệ thống ngoài nào (vd `payment-gateway`, `email-service`), hoặc cần nền tảng kỹ thuật dùng chung nào độc lập với cách carve lõi nghiệp vụ (vd `auth`, `file-storage`, `notification`)?
202
+ > Mỗi component gồm: tên kebab-case + 1 câu tả responsibility.
203
+ >
204
+ > Áp **thủ tục Given vs Derived** (xem section "Khái niệm: Feature vs Component" ở trên) cho mỗi ứng viên:
205
+ > - **Given** (trúng câu 1 External hoặc câu 2 Mandated-substrate) → khai vào Component Index.
206
+ > - **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
+ >
208
+ > **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 đủ.
111
209
 
112
210
  **Phần 6 — Non-Functional Requirements:**
113
211
  > Có yêu cầu về performance, security, availability, scalability không?
@@ -142,11 +240,11 @@ Chỉ ghi file sau khi user confirm. Nếu user yêu cầu chỉnh sửa → c
142
240
 
143
241
  ### Bước 5: Save
144
242
 
145
- **5a. Ghi `specs/main/prd.md`** — nội dung đã được confirm, thay thế toàn bộ nội dung cũ.
243
+ **5a. Ghi `.specs/main/prd.md`** — nội dung đã được confirm, thay thế toàn bộ nội dung cũ.
146
244
 
147
- **5b. Scaffold `specs/main/domain.md`** *(chỉ khi file này chưa tồn tại)*:
245
+ **5b. Scaffold `.specs/main/domain.md`** *(chỉ khi file này chưa tồn tại)*:
148
246
 
149
- - Copy `.claude/templates/main/domain-template.md` thành `specs/main/domain.md`.
247
+ - Copy `.claude/templates/main/domain-template.md` thành `.specs/main/domain.md`.
150
248
  - Section **Glossary** giữ format bảng rỗng — terms sẽ được thêm dần qua cascade từ integrations.
151
249
  - Section **Shared Entities** giữ block placeholder — entities sẽ mọc dần qua cascade khi integration giới thiệu shared entity.
152
250
 
@@ -166,8 +264,8 @@ Nếu `domain.md` đã tồn tại với nội dung thực → không đụng t
166
264
 
167
265
  Thông báo kết quả:
168
266
  ```
169
- ✓ specs/main/prd.md đã được cập nhật (status: draft)
170
- {nếu vừa scaffold} ✓ specs/main/domain.md đã được scaffold (skeleton — sẽ mọc dần qua cascade)
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)
171
269
 
172
270
  Bước tiếp theo:
173
271
  - /spec-sad → thiết kế kiến trúc kỹ thuật
@@ -200,8 +298,9 @@ Trước khi kết thúc, kiểm tra:
200
298
  - [ ] Problem Statement từ góc nhìn business, không mention tech stack
201
299
  - [ ] Mỗi persona có: tên vai trò, mục tiêu, pain point
202
300
  - [ ] Out of Scope có ít nhất 1 item với lý do
203
- - [ ] Features có ít nhất 1 item, mỗi item có ID (F-XXX), tên, mô tả, priority
204
- - [ ] Components: nếuitem, mỗi item có ID (C-XXX), tên, mô tả ngắn (có thể trống nếu chưa rõ)
301
+ - [ ] 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
+ - [ ] Components: mọi entry là **Given** (trúng câu 1 External hoặc câu 2 Mandated-substrate). Không 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 có sẵn feature/component: đã reuse làm baseline, đã validate qua litmus + Given/Derived, đã flag mục phân loại sai (nếu có)
205
304
  - [ ] Mỗi NFR có target đo được (không phải "nhanh", "bảo mật chung chung")
206
305
  - [ ] domain.md tồn tại (đã scaffold skeleton hoặc có nội dung sẵn)
207
306
  - [ ] User đã confirm trước khi file được ghi
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: spec-remove
3
- description: Remove một feature toàn diện — tạo removal integration với Code Inventory, Reverse Dependency Audit, reverse-TDD test strategy, và Finalize Plan (move feature artifacts sang specs/removed/ + đóng ADO tickets) như task cuối trong todo.md. Nhận F-XXX làm argument.
3
+ description: Remove một feature toàn diện — tạo removal integration với Code Inventory, Reverse Dependency Audit, reverse-TDD test strategy, và Finalize Plan (move feature artifacts sang .specs/removed/ + đóng ADO tickets) như task cuối trong todo.md. Nhận F-XXX làm argument.
4
4
  ---
5
5
 
6
6
  # spec-remove
@@ -12,7 +12,7 @@ Tạo removal integration cho 1 feature đã tồn tại. Output là `spec.md` v
12
12
  - **Code Inventory** — code, route, DB, feature flag, config liên quan
13
13
  - **Reverse Dependency Audit** — ai còn reference, an toàn xoá hay không
14
14
  - **Test Strategy** — reverse-TDD (regression test "thing is gone")
15
- - **Finalize Plan** — move feature artifacts sang `specs/removed/` + đóng ADO tickets, được DEV chạy như task cuối trong `todo.md`
15
+ - **Finalize Plan** — move feature artifacts sang `.specs/removed/` + đóng ADO tickets, được DEV chạy như task cuối trong `todo.md`
16
16
  - **Changes blocks** — `[REMOVE]` markers cho mọi artifact bị touched
17
17
 
18
18
  Skill **không** sinh `tech.md` / `plan.md` / `todo.md`. Sau khi `spec.md` được approve, chạy `/spec-tech` → `/plan` → `/build` như flow thường. `spec.md` đủ giàu để 3 skill đó hoạt động không cần modification.
@@ -33,8 +33,8 @@ Skill **không** sinh `tech.md` / `plan.md` / `todo.md`. Sau khi `spec.md` đư
33
33
 
34
34
  ## Prerequisites
35
35
 
36
- - `specs/main/feature/{F-XXX}-*/frd.md` tồn tại
37
- - `specs/main/prd.md` có row của feature trong Feature Index
36
+ - `.specs/main/feature/{F-XXX}-*/frd.md` tồn tại
37
+ - `.specs/main/prd.md` có row của feature trong Feature Index
38
38
  - (Optional) `.claude/ado.yaml` cấu hình nếu muốn đóng ADO tickets ở finalize step
39
39
 
40
40
  ---
@@ -49,7 +49,7 @@ Argument BẮT BUỘC là Feature ID dạng `F-XXX` (3 chữ số). Nếu argume
49
49
  spec-remove cần Feature ID. Ví dụ: /spec-remove F-001
50
50
  ```
51
51
 
52
- Tìm thư mục `specs/main/feature/F-XXX-*/`:
52
+ Tìm thư mục `.specs/main/feature/F-XXX-*/`:
53
53
  - 0 matches → báo lỗi feature không tồn tại, dừng.
54
54
  - ≥ 2 matches → báo lỗi data inconsistency (nhiều thư mục cùng prefix), dừng.
55
55
  - 1 match → tiếp.
@@ -71,20 +71,20 @@ F-XXX đã có status `removed`. Bạn muốn:
71
71
  Đọc các file sau:
72
72
 
73
73
  **Bắt buộc:**
74
- - `specs/main/feature/{F-XXX}-*/frd.md` — full content
75
- - `specs/main/feature/{F-XXX}-*/fdd.md` — nếu tồn tại
76
- - `specs/main/prd.md` — Feature Index (capture ADO ticket ID cho F-XXX), Component Index, NFR
77
- - `specs/main/domain.md` — Glossary + Shared Entities (xác định entity nào owned bởi component thuộc F-XXX)
74
+ - `.specs/main/feature/{F-XXX}-*/frd.md` — full content
75
+ - `.specs/main/feature/{F-XXX}-*/fdd.md` — nếu tồn tại
76
+ - `.specs/main/prd.md` — Feature Index (capture ADO ticket ID cho F-XXX), Component Index, NFR
77
+ - `.specs/main/domain.md` — Glossary + Shared Entities (xác định entity nào owned bởi component thuộc F-XXX)
78
78
 
79
79
  **Components used by F-XXX:**
80
80
 
81
81
  Trích từ `frd.md` section `Components Used` + `fdd.md` section `Components Touched`. Với mỗi C-YYY:
82
- - `specs/main/component/{C-YYY}-*/crd.md`
83
- - `specs/main/component/{C-YYY}-*/cdd.md` — nếu tồn tại
82
+ - `.specs/main/component/{C-YYY}-*/crd.md`
83
+ - `.specs/main/component/{C-YYY}-*/cdd.md` — nếu tồn tại
84
84
 
85
85
  **Reverse dependency scan:**
86
86
 
87
- Với mỗi C-YYY mà F-XXX sử dụng, grep `specs/main/feature/F-*/frd.md` (trừ F-XXX) tìm references tới C-YYY. Mọi feature khác có reference → load `frd.md` của feature đó để hiểu nó dùng C-YYY làm gì.
87
+ Với mỗi C-YYY mà F-XXX sử dụng, grep `.specs/main/feature/F-*/frd.md` (trừ F-XXX) tìm references tới C-YYY. Mọi feature khác có reference → load `frd.md` của feature đó để hiểu nó dùng C-YYY làm gì.
88
88
 
89
89
  Output context summary cho user:
90
90
 
@@ -243,9 +243,9 @@ Sau khi migration deploy xong, chạy lại /spec-remove F-XXX.
243
243
 
244
244
  Xác định slug và NNN giống `/spec-new`:
245
245
  - Slug: `remove-{f-xxx-slug}` (ví dụ `remove-f001-authentication`)
246
- - NNN: max của thư mục hiện có trong `specs/integrations/` + 1, format 3 chữ số.
246
+ - NNN: max của thư mục hiện có trong `.specs/integrations/` + 1, format 3 chữ số.
247
247
 
248
- Output path: `specs/integrations/{NNN}-remove-{f-xxx-slug}/spec.md`
248
+ Output path: `.specs/integrations/{NNN}-remove-{f-xxx-slug}/spec.md`
249
249
 
250
250
  Cấu trúc spec.md:
251
251
 
@@ -319,20 +319,20 @@ Regression tests **được giữ lại** trong codebase như guardrail — futu
319
319
 
320
320
  1. **Move feature artifacts:**
321
321
  ```bash
322
- mkdir -p specs/removed
323
- mv specs/main/feature/{F-XXX}-{slug}/ specs/removed/{F-XXX}-{slug}/
322
+ mkdir -p .specs/removed
323
+ mv .specs/main/feature/{F-XXX}-{slug}/ .specs/removed/{F-XXX}-{slug}/
324
324
  ```
325
325
 
326
- 2. **Append Change History** vào `specs/removed/{F-XXX}-{slug}/frd.md` (nếu file còn tồn tại sau move):
326
+ 2. **Append Change History** vào `.specs/removed/{F-XXX}-{slug}/frd.md` (nếu file còn tồn tại sau move):
327
327
  ```markdown
328
328
  ### {YYYY-MM-DD} — [{NNN}-remove-{slug}](../../integrations/{NNN}-remove-{slug}/spec.md) — removed
329
- - **Feature decommissioned**: moved from specs/main/feature/ to specs/removed/
329
+ - **Feature decommissioned**: moved from .specs/main/feature/ to .specs/removed/
330
330
  - Reason: {lý do từ Problem Statement}
331
331
  ```
332
332
 
333
333
  3. **Update prd.md Feature Index:**
334
334
  - Row F-XXX: status → `Removed`
335
- - Add note column hoặc inline: `(see specs/removed/{F-XXX}-{slug}/)`
335
+ - Add note column hoặc inline: `(see .specs/removed/{F-XXX}-{slug}/)`
336
336
 
337
337
  4. **Close ADO tickets** (nếu prd.md có ADO ticket ID cho F-XXX):
338
338
  - Feature ticket → state `Removed`
@@ -342,8 +342,8 @@ Regression tests **được giữ lại** trong codebase như guardrail — futu
342
342
  - Nếu ADO state name khác (vd "Closed") → xem `.claude/ado.yaml` hoặc fetch từ `wit_get_work_item_type`
343
343
 
344
344
  5. **Verify finalize:**
345
- - `ls specs/main/feature/ | grep {F-XXX}` → không còn match
346
- - `ls specs/removed/{F-XXX}-{slug}/` → tồn tại
345
+ - `ls .specs/main/feature/ | grep {F-XXX}` → không còn match
346
+ - `ls .specs/removed/{F-XXX}-{slug}/` → tồn tại
347
347
  - prd.md grep `F-XXX` → status `Removed`
348
348
  - ADO ticket fetch → state khớp
349
349
 
@@ -356,7 +356,7 @@ Regression tests **được giữ lại** trong codebase như guardrail — futu
356
356
 
357
357
  #### Features (Feature Index)
358
358
  - Row [MODIFY status]: `F-XXX` {current status} → `Removed`
359
- - {nếu có note column} Row [MODIFY note]: `F-XXX` add note "see specs/removed/"
359
+ - {nếu có note column} Row [MODIFY note]: `F-XXX` add note "see .specs/removed/"
360
360
 
361
361
  #### Components (Component Index) — chỉ component exclusive với F-XXX
362
362
  - Row [MODIFY status]: `C-YYY` {current status} → `Removed`
@@ -367,7 +367,7 @@ Regression tests **được giữ lại** trong codebase như guardrail — futu
367
367
  **Format reference:** [frd-template.md](../../templates/main/feature/frd-template.md)
368
368
 
369
369
  <!--
370
- Đánh dấu mọi item bằng [REMOVE]. File sẽ bị move sang specs/removed/ ở Finalize step
370
+ Đánh dấu mọi item bằng [REMOVE]. File sẽ bị move sang .specs/removed/ ở Finalize step
371
371
  nhưng cascade content vẫn ghi vào file gốc trước (để Change History entry được apply).
372
372
  -->
373
373
 
@@ -462,7 +462,7 @@ Draft trên đã đúng chưa?
462
462
 
463
463
  Sau khi confirm, agent sẽ auto-apply Changes blocks lên main artifacts.
464
464
  File feature artifacts (frd/fdd) KHÔNG bị move ngay — chỉ apply [REMOVE] markers
465
- + Change History entry. Move sang specs/removed/ là task cuối trong todo.md,
465
+ + Change History entry. Move sang .specs/removed/ là task cuối trong todo.md,
466
466
  do /build chạy sau khi mọi deletion task khác xong.
467
467
  ```
468
468
 
@@ -500,7 +500,7 @@ Giống `/spec-new` Bước 7, nhưng với removal-specific extensions.
500
500
  **[8.5] Thông báo kết quả:**
501
501
 
502
502
  ```
503
- ✓ specs/integrations/{NNN}-remove-{f-xxx-slug}/spec.md đã được tạo (status: approved, removal: true)
503
+ .specs/integrations/{NNN}-remove-{f-xxx-slug}/spec.md đã được tạo (status: approved, removal: true)
504
504
 
505
505
  Auto-cascade applied:
506
506
  ✓ prd.md — F-XXX status → Removed; {N} components status → Removed
@@ -509,7 +509,7 @@ Auto-cascade applied:
509
509
  ✓ feature/F-XXX-*/frd.md — all items [REMOVE], status → removed
510
510
  ✓ feature/F-XXX-*/fdd.md — all items [REMOVE], status → removed
511
511
 
512
- ⚠ File feature/F-XXX-*/ vẫn ở specs/main/feature/. Sẽ được move sang specs/removed/ ở task cuối todo.md.
512
+ ⚠ File feature/F-XXX-*/ vẫn ở .specs/main/feature/. Sẽ được move sang .specs/removed/ ở task cuối todo.md.
513
513
  ⚠ ADO tickets giữ nguyên state. Sẽ được close ở task cuối todo.md (cần .claude/ado.yaml).
514
514
 
515
515
  Bước tiếp theo:
@@ -583,6 +583,6 @@ Sau khi user confirm (Bước 8):
583
583
  - [ ] Auto-cascade chạy đúng thứ tự prd → domain → sad → crd → cdd → frd → fdd
584
584
  - [ ] Mọi artifact bị touched có Change History entry
585
585
  - [ ] prd.md row F-XXX status = Removed (đổi ngay sau approve)
586
- - [ ] File feature/F-XXX-*/ VẪN ở specs/main/feature/ (chưa move — chỉ move ở Finalize task)
586
+ - [ ] File feature/F-XXX-*/ VẪN ở .specs/main/feature/ (chưa move — chỉ move ở Finalize task)
587
587
  - [ ] ADO tickets KHÔNG bị transition (chưa close — chỉ close ở Finalize task)
588
588
  - [ ] Notification cuối ghi rõ 2 ⚠ về việc folder + ADO chưa được động vào
@@ -7,7 +7,7 @@ description: Điền hoặc cập nhật sad.md — System Architecture Document
7
7
 
8
8
  ## Overview
9
9
 
10
- Tạo nội dung cho `specs/main/sad.md` thông qua interview có cấu trúc. SAD là bản đồ kỹ thuật của hệ thống — nó định nghĩa các quyết định kiến trúc, tech stack, và đặc biệt là **Architectural Guardrails**: các nguyên tắc bất biến mà mọi agent phải tuân theo khi sinh `tech.md`.
10
+ Tạo nội dung cho `.specs/main/sad.md` thông qua interview có cấu trúc. SAD là bản đồ kỹ thuật của hệ thống — nó định nghĩa các quyết định kiến trúc, tech stack, và đặc biệt là **Architectural Guardrails**: các nguyên tắc bất biến mà mọi agent phải tuân theo khi sinh `tech.md`.
11
11
 
12
12
  SAD không chứa: feature-level design, business rules, entity details — những thứ đó thuộc về `domain.md` và `fdd.md`.
13
13
 
@@ -30,21 +30,21 @@ SAD không chứa: feature-level design, business rules, entity details — nh
30
30
 
31
31
  ### Bước 1: Kiểm tra preconditions
32
32
 
33
- **Đọc `specs/main/prd.md`:**
33
+ **Đọc `.specs/main/prd.md`:**
34
34
 
35
35
  - **Chưa tồn tại hoặc là template** → dừng ngay:
36
36
  > `prd.md` chưa có nội dung. Hãy chạy `/spec-prd` trước.
37
37
 
38
38
  - **Đã có nội dung** → đọc để lấy: NFRs (performance, security, availability targets), business constraints, scope.
39
39
 
40
- **Đọc `specs/main/domain.md`:**
40
+ **Đọc `.specs/main/domain.md`:**
41
41
 
42
42
  - **Chưa tồn tại** → dừng ngay:
43
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
- **Đọc `specs/main/sad.md`:**
47
+ **Đọc `.specs/main/sad.md`:**
48
48
 
49
49
  - **Chưa tồn tại** → tiến hành Bước 2 (full interview).
50
50
 
@@ -167,7 +167,7 @@ Chỉ ghi file sau khi user confirm. Nếu user yêu cầu chỉnh sửa → c
167
167
 
168
168
  ### Bước 5: Save
169
169
 
170
- Ghi nội dung đã được confirm vào `specs/main/sad.md`.
170
+ Ghi nội dung đã được confirm vào `.specs/main/sad.md`.
171
171
 
172
172
  **Change History:** Append entry vào section `## Change History` cuối `sad.md` (theo `conventions.md` §5.5):
173
173
 
@@ -181,7 +181,7 @@ Nếu chạy lần thứ N (sad.md đã có) → operation = `update`, body li
181
181
 
182
182
  Thông báo kết quả:
183
183
  ```
184
- ✓ specs/main/sad.md đã được cập nhật (status: draft)
184
+ .specs/main/sad.md đã được cập nhật (status: draft)
185
185
 
186
186
  Bước tiếp theo:
187
187
  - /spec-new {feature-name} → định nghĩa requirements của từng feature
@@ -7,7 +7,7 @@ description: Tạo tech.md cho một integration dựa trên spec.md đã đư
7
7
 
8
8
  ## Overview
9
9
 
10
- Tạo `tech.md` cho một integration trong `specs/integrations/{slug}/`.
10
+ Tạo `tech.md` cho một integration trong `.specs/integrations/{slug}/`.
11
11
 
12
12
  `tech.md` là technical design — định nghĩa **how to build**: solution approach, data model changes, interfaces. Phải có `spec.md` đã approve trước khi chạy skill này.
13
13
 
@@ -30,14 +30,14 @@ Tạo `tech.md` cho một integration trong `specs/integrations/{slug}/`.
30
30
 
31
31
  **Nếu có ARGUMENT:**
32
32
  - Parse argument: có thể là số thứ tự (`2`, `002`) hoặc slug (`002-implement-todo`)
33
- - Quét `specs/integrations/*/spec.md`, tìm integration khớp với argument
33
+ - Quét `.specs/integrations/*/spec.md`, tìm integration khớp với argument
34
34
  - Nếu không tìm thấy → báo lỗi:
35
35
  > Không tìm thấy integration khớp với "{argument}". Kiểm tra lại tên hoặc số thứ tự.
36
36
  - Nếu tìm thấy → dùng integration đó, bắt đầu luôn
37
37
 
38
38
  **Nếu không có ARGUMENT:**
39
39
 
40
- Quét `specs/integrations/`. Liệt kê **tất cả** integrations có `spec.md`, đánh dấu những cái đã có `tech.md`:
40
+ Quét `.specs/integrations/`. Liệt kê **tất cả** integrations có `spec.md`, đánh dấu những cái đã có `tech.md`:
41
41
 
42
42
  ```
43
43
  Integrations:
@@ -58,7 +58,7 @@ Nếu integration đã có `tech.md` → hỏi trước khi tiếp tục:
58
58
 
59
59
  ### Bước 1b: Gate check — spec.md phải approved
60
60
 
61
- Đọc frontmatter của `specs/integrations/{slug}/spec.md`.
61
+ Đọc frontmatter của `.specs/integrations/{slug}/spec.md`.
62
62
 
63
63
  Nếu `status` **không phải** `approved`:
64
64
 
@@ -76,12 +76,12 @@ Nếu `status: approved` → tiếp tục sang Bước 2.
76
76
 
77
77
  Load các file sau:
78
78
 
79
- - `specs/integrations/{slug}/spec.md` — đọc toàn bộ + frontmatter (`features`, `components`)
80
- - `specs/main/sad.md` — đọc Tech Stack và Architectural Guardrails
81
- - `specs/main/domain.md` — đọc Glossary và Shared Entities
82
- - `specs/main/component/{C-XXX}-{slug}/cdd.md` — cho mỗi component trong frontmatter `components` (nếu cdd.md tồn tại)
83
- - `specs/main/feature/{F-XXX}-{slug}/frd.md` — cho mỗi feature trong frontmatter `features` (đọc `Verification Rules` để sinh `Verification Implementation` trong fdd.md)
84
- - `specs/main/feature/{F-XXX}-{slug}/fdd.md` — cho mỗi feature trong frontmatter `features` (nếu fdd.md tồn tại)
79
+ - `.specs/integrations/{slug}/spec.md` — đọc toàn bộ + frontmatter (`features`, `components`)
80
+ - `.specs/main/sad.md` — đọc Tech Stack và Architectural Guardrails
81
+ - `.specs/main/domain.md` — đọc Glossary và Shared Entities
82
+ - `.specs/main/component/{C-XXX}-{slug}/cdd.md` — cho mỗi component trong frontmatter `components` (nếu cdd.md tồn tại)
83
+ - `.specs/main/feature/{F-XXX}-{slug}/frd.md` — cho mỗi feature trong frontmatter `features` (đọc `Verification Rules` để sinh `Verification Implementation` trong fdd.md)
84
+ - `.specs/main/feature/{F-XXX}-{slug}/fdd.md` — cho mỗi feature trong frontmatter `features` (nếu fdd.md tồn tại)
85
85
 
86
86
  Tóm tắt context và surface assumptions:
87
87
 
@@ -168,11 +168,11 @@ Liệt kê **tất cả** components bị touched trong frontmatter và đánh g
168
168
 
169
169
  Với từng component có đề xuất:
170
170
 
171
- **Tạo mới** `specs/main/component/{C-XXX}-{component-slug}/cdd.md`
171
+ **Tạo mới** `.specs/main/component/{C-XXX}-{component-slug}/cdd.md`
172
172
  - 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)
173
173
  - Nội dung: Module Structure, Internal Data Flow, Storage & Persistence, Internal Interfaces, Technical Decisions
174
174
 
175
- **Cập nhật** `specs/main/component/{C-XXX}-{component-slug}/cdd.md`
175
+ **Cập nhật** `.specs/main/component/{C-XXX}-{component-slug}/cdd.md`
176
176
  - Khi cdd.md đã tồn tại và integration thay đổi internal design
177
177
 
178
178
  ### feature/{F-XXX}-{feature-name}/fdd.md
@@ -184,12 +184,12 @@ Liệt kê **tất cả** features liên quan trong frontmatter và đánh giá:
184
184
  | F-001 — Checkout | tồn tại | **Cập nhật** — thêm sequence khi payment fail |
185
185
  | F-002 — Refund | chưa có | **Tạo mới** |
186
186
 
187
- **Tạo mới** `specs/main/feature/{F-XXX}-{feature-slug}/fdd.md`
187
+ **Tạo mới** `.specs/main/feature/{F-XXX}-{feature-slug}/fdd.md`
188
188
  - Khi feature gắn với integration nhưng chưa có fdd.md
189
189
  - Nội dung: Inter-component data flow, Orchestration, Cross-component invariants, **Verification Implementation** — từ tech.md (chỉ phần inter-component, không lặp internal design của component)
190
190
  - **Verification Implementation**: với mỗi rule trong `frd.md > Verification Rules` của feature này, sinh row trong bảng `Rule ID | Rule (short) | Layer | Owning component | Error propagation`. Reference rule bằng `VR-F{NNN}-{seq}` ID (lấy nguyên từ FRD, không tạo ID mới). Rule (short) copy ngắn gọn từ FRD để row tự đọc được. Layer = client/gateway/service (có thể combine). Owning component reference C-XXX. KHÔNG đưa regex/validator code/error message wording vào — đó thuộc `cdd.md` của owning component (cascade riêng) hoặc UI copy artifact. Bỏ qua nếu FRD không có Verification Rules.
191
191
 
192
- **Cập nhật** `specs/main/feature/{F-XXX}-{feature-slug}/fdd.md`
192
+ **Cập nhật** `.specs/main/feature/{F-XXX}-{feature-slug}/fdd.md`
193
193
  - Khi fdd.md đã tồn tại, ghi rõ thay đổi flow nào
194
194
  - Nếu integration thêm/đổi rule trong FRD → cập nhật bảng Verification Implementation tương ứng
195
195
 
@@ -216,7 +216,7 @@ Chỉ ghi file sau khi user confirm. Nếu user yêu cầu chỉnh sửa → c
216
216
 
217
217
  ### Bước 6: Save + Auto-cascade
218
218
 
219
- **[6.1] Ghi `specs/integrations/{slug}/tech.md`** với status `approved` (không phải `draft` — human đã confirm ở Bước 5 chính là approval). Frontmatter `features` và `components` mirror từ `spec.md`.
219
+ **[6.1] Ghi `.specs/integrations/{slug}/tech.md`** với status `approved` (không phải `draft` — human đã confirm ở Bước 5 chính là approval). Frontmatter `features` và `components` mirror từ `spec.md`.
220
220
 
221
221
  **[6.2] Auto-apply mỗi Changes block** vào main artifact tương ứng. Thứ tự apply (để tránh forward reference): `sad.md` → `domain.md` → `component/*/cdd.md` → `feature/*/fdd.md`.
222
222
 
@@ -265,7 +265,7 @@ Cho mỗi artifact:
265
265
  **[6.4] Thông báo kết quả:**
266
266
 
267
267
  ```
268
- ✓ specs/integrations/{slug}/tech.md đã được tạo (status: approved)
268
+ .specs/integrations/{slug}/tech.md đã được tạo (status: approved)
269
269
 
270
270
  Auto-cascade applied:
271
271
  ✓ sad.md — {summary | no-op}
@@ -7,13 +7,13 @@ description: Tạo test.md cho một integration bằng cách mechanical derive
7
7
 
8
8
  ## Overview
9
9
 
10
- Tạo `test.md` cho một integration trong `specs/integrations/{slug}/`.
10
+ Tạo `test.md` cho một integration trong `.specs/integrations/{slug}/`.
11
11
 
12
12
  `test.md` là verification design ở integration level — định nghĩa **how to verify** rằng integration đáp ứng `spec.md`. Nội dung gồm Test Strategy (per integration) + Changes blocks cascade lên feature `tsd.md` (Test Spec Document).
13
13
 
14
14
  **Hai artifact tách bạch:**
15
- - `specs/integrations/{slug}/test.md` — integration-level, ephemeral, PR record bất biến sau approve (single-word naming như `spec.md` / `tech.md` / `plan.md`).
16
- - `specs/main/feature/{F-XXX}-{slug}/tsd.md` — feature-level, persistent canonical artifact (3-letter naming như `frd.md` / `fdd.md`). TC content cuối cùng nằm ở đây.
15
+ - `.specs/integrations/{slug}/test.md` — integration-level, ephemeral, PR record bất biến sau approve (single-word naming như `spec.md` / `tech.md` / `plan.md`).
16
+ - `.specs/main/feature/{F-XXX}-{slug}/tsd.md` — feature-level, persistent canonical artifact (3-letter naming như `frd.md` / `fdd.md`). TC content cuối cùng nằm ở đây.
17
17
 
18
18
  **Role:** QC. Song song với `/spec-tech` (DEV role). Cả hai chỉ phụ thuộc `spec.md` approved — không có thứ tự bắt buộc giữa chúng.
19
19
 
@@ -38,14 +38,14 @@ Tạo `test.md` cho một integration trong `specs/integrations/{slug}/`.
38
38
 
39
39
  **Nếu có ARGUMENT:**
40
40
  - Parse argument: có thể là số thứ tự (`2`, `002`) hoặc slug (`002-implement-todo`)
41
- - Quét `specs/integrations/*/spec.md`, tìm integration khớp với argument
41
+ - Quét `.specs/integrations/*/spec.md`, tìm integration khớp với argument
42
42
  - Nếu không tìm thấy → báo lỗi:
43
43
  > Không tìm thấy integration khớp với "{argument}". Kiểm tra lại tên hoặc số thứ tự.
44
44
  - Nếu tìm thấy → dùng integration đó, bắt đầu luôn
45
45
 
46
46
  **Nếu không có ARGUMENT:**
47
47
 
48
- Quét `specs/integrations/`. Liệt kê **tất cả** integrations có `spec.md`, đánh dấu những cái đã có `test.md`:
48
+ Quét `.specs/integrations/`. Liệt kê **tất cả** integrations có `spec.md`, đánh dấu những cái đã có `test.md`:
49
49
 
50
50
  ```
51
51
  Integrations:
@@ -66,7 +66,7 @@ Nếu integration đã có `test.md` → hỏi trước khi tiếp tục:
66
66
 
67
67
  ### Bước 1b: Gate check
68
68
 
69
- Đọc frontmatter của `specs/integrations/{slug}/spec.md`.
69
+ Đọc frontmatter của `.specs/integrations/{slug}/spec.md`.
70
70
 
71
71
  **Check 1 — spec.md phải approved:**
72
72
 
@@ -77,7 +77,7 @@ Nếu `status` **không phải** `approved`:
77
77
  > `/spec-test` cần spec.md approved vì cascade frd.md (nguồn của TC) chỉ apply sau khi approve.
78
78
  >
79
79
  > Để tiếp tục:
80
- > 1. Review `specs/integrations/{slug}/spec.md`
80
+ > 1. Review `.specs/integrations/{slug}/spec.md`
81
81
  > 2. Approve (đổi `status: draft` → `status: approved`)
82
82
  >
83
83
  > Sau đó chạy lại `/spec-test`.
@@ -107,10 +107,10 @@ Nếu cả 2 check pass → tiếp tục Bước 2.
107
107
 
108
108
  Load các file sau:
109
109
 
110
- - `specs/integrations/{slug}/spec.md` — đọc toàn bộ + frontmatter (`features`)
111
- - `specs/main/feature/{F-XXX}-{slug}/frd.md` — cho mỗi feature trong frontmatter `features` (source của TC — bắt buộc tồn tại vì cascade từ spec.md đã apply)
112
- - `specs/main/feature/{F-XXX}-{slug}/tsd.md` — cho mỗi feature trong frontmatter `features` (nếu tồn tại — cần để diff và assign next ID)
113
- - `specs/integrations/{slug}/tech.md` — đọc nếu tồn tại (optional, dùng để hint environment / data set / NFR perf threshold)
110
+ - `.specs/integrations/{slug}/spec.md` — đọc toàn bộ + frontmatter (`features`)
111
+ - `.specs/main/feature/{F-XXX}-{slug}/frd.md` — cho mỗi feature trong frontmatter `features` (source của TC — bắt buộc tồn tại vì cascade từ spec.md đã apply)
112
+ - `.specs/main/feature/{F-XXX}-{slug}/tsd.md` — cho mỗi feature trong frontmatter `features` (nếu tồn tại — cần để diff và assign next ID)
113
+ - `.specs/integrations/{slug}/tech.md` — đọc nếu tồn tại (optional, dùng để hint environment / data set / NFR perf threshold)
114
114
 
115
115
  Tóm tắt context:
116
116
 
@@ -127,7 +127,7 @@ TÔI HIỂU:
127
127
  ```
128
128
 
129
129
  Nếu frd.md của feature nào không tồn tại → báo lỗi và dừng (lỗi cascade từ spec.md trước đó):
130
- > ⛔ `specs/main/feature/{F-XXX}-{slug}/frd.md` không tồn tại nhưng feature có trong `features:` của spec.md. Cascade từ spec.md có thể đã fail. Kiểm tra lại.
130
+ > ⛔ `.specs/main/feature/{F-XXX}-{slug}/frd.md` không tồn tại nhưng feature có trong `features:` của spec.md. Cascade từ spec.md có thể đã fail. Kiểm tra lại.
131
131
 
132
132
  ---
133
133
 
@@ -284,14 +284,14 @@ Chỉ tiến hành Bước 6 sau khi QC confirm.
284
284
 
285
285
  ### Bước 6: Save + Auto-cascade
286
286
 
287
- **[6.1] Ghi `specs/integrations/{slug}/test.md`** với status `approved` (không phải `draft` — human đã confirm ở Bước 5 chính là approval). Frontmatter `features` mirror từ `spec.md`.
287
+ **[6.1] Ghi `.specs/integrations/{slug}/test.md`** với status `approved` (không phải `draft` — human đã confirm ở Bước 5 chính là approval). Frontmatter `features` mirror từ `spec.md`.
288
288
 
289
289
  **[6.2] Auto-apply mỗi Changes block** vào `feature/{F-XXX}/tsd.md` tương ứng. Thứ tự apply: theo thứ tự xuất hiện trong frontmatter `features` (deterministic, không có forward reference giữa các feature tsd.md). Bỏ qua feature có operation `no-op` trong Cascade Summary.
290
290
 
291
291
  Cho từng block:
292
292
 
293
293
  - **Operation=create:**
294
- - Tạo file `specs/main/feature/{F-XXX}-{slug}/tsd.md`
294
+ - Tạo file `.specs/main/feature/{F-XXX}-{slug}/tsd.md`
295
295
  - Nội dung = nội dung của Changes block (theo format `templates/main/feature/tsd-template.md`)
296
296
  - Frontmatter của tsd.md mới: status `draft` (separate lifecycle với integration test.md)
297
297
 
@@ -329,7 +329,7 @@ Format entry:
329
329
  **[6.4] Thông báo kết quả:**
330
330
 
331
331
  ```
332
- ✓ specs/integrations/{slug}/test.md đã được tạo (status: approved)
332
+ .specs/integrations/{slug}/test.md đã được tạo (status: approved)
333
333
 
334
334
  Auto-cascade applied:
335
335
  ✓ feature/F-XXX-{slug}/tsd.md — {created | updated: +N TS, +M TC, modify K TC, remove L TC}