spec-lite 1.3.3 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -51,6 +51,9 @@ Scan codebase để extract main artifacts, sau đó vào Integration Pipeline.
51
51
  /spec-brownfield-feature
52
52
 
53
53
 
54
+ /spec-tsd [F-XXX] (tùy chọn — bootstrap tsd.md cho từng feature)
55
+
56
+
54
57
  (fill in NEEDS_CLARIFY khi có thêm context)
55
58
 
56
59
 
@@ -66,6 +69,9 @@ Scan module dirs, tạo `crd.md` + `cdd.md` cho từng component, điền Compon
66
69
  #### `/spec-brownfield-feature [path]`
67
70
  Scan routes/use cases/tests, tạo `frd.md` + `fdd.md` cho từng feature, điền Feature Index vào `prd.md`. Yêu cầu `component` đã chạy (fdd.md cần C-XXX IDs từ Component Index).
68
71
 
72
+ #### `/spec-tsd [F-XXX]`
73
+ Bootstrap `feature/{F-XXX}/tsd.md` (Test Spec Document) trực tiếp từ `frd.md` — mechanical derive Test Scenarios + Test Cases (mỗi Flow → TS, mỗi US/AC → Functional TC, mỗi VR → ≥1 positive + 1+ negative, mỗi FAC → Feature AC TC). Không interview, không cần integration. Dùng sau `/spec-brownfield-feature` để có test coverage tracking từ ngày 1, hoặc khi tsd drift khỏi frd cần regenerate fresh.
74
+
69
75
  > **NEEDS_CLARIFY:** Các mục chưa rõ khi scan được đánh dấu `[NEEDS_CLARIFY]` — không block workflow, fill in dần khi có thêm context.
70
76
 
71
77
  ---
@@ -78,17 +84,21 @@ Mỗi requirement mới đều đi qua pipeline này.
78
84
  /spec-new [requirement]
79
85
  (human review + apply cascade proposals + approve)
80
86
 
81
- /spec-tech
82
- (human review + apply cascade proposals + approve)
83
-
84
- /plan
85
- (human approve)
86
-
87
- /build ◄──────────────┐
88
-
89
- /review-integration │ (nếu Critical/Important → sửa và build lại)
90
-
91
- [approve] ───────────┘ (nếu chỉ Suggestion hoặc không có finding)
87
+ ├─────────────────┐
88
+ ▼ ▼
89
+ /spec-tech /spec-test (song song — cả hai chỉ phụ thuộc spec.md)
90
+ (DEV approve) (QC approve, cascade lên feature/*/tsd.md)
91
+ │ │
92
+ └────────┬────────┘
93
+
94
+ /plan
95
+ (human approve)
96
+
97
+ /build ◄──────────────┐
98
+ │ │
99
+ /review-integration │ (nếu Critical/Important → sửa và build lại)
100
+ │ │
101
+ [approve] ───────────┘ (nếu chỉ Suggestion hoặc không có finding)
92
102
  ```
93
103
 
94
104
  #### `/spec-new [requirement]`
@@ -98,11 +108,14 @@ Tạo `specs/integrations/{slug}/spec.md` cho một integration mới.
98
108
  - Không có argument → hiển thị danh sách features TODO từ `prd.md` để chọn
99
109
 
100
110
  #### `/spec-tech [number]`
101
- Tạo `specs/integrations/{slug}/tech.md` sau khi `spec.md` được approve.
111
+ Tạo `specs/integrations/{slug}/tech.md` sau khi `spec.md` được approve. Chạy bởi **DEV**.
102
112
 
103
113
  - Có argument → chọn integration theo số thứ tự luôn
104
114
  - Không có argument → hiển thị danh sách tất cả integrations
105
115
 
116
+ #### `/spec-test [number]`
117
+ Tạo `specs/integrations/{slug}/test.md` sau khi `spec.md` được approve. Chạy bởi **QC**, **song song / độc lập** với `/spec-tech` — cả hai chỉ phụ thuộc `spec.md`. Mechanical derive Test Scenarios + Test Cases từ frd.md (Flow → TS, US/AC → Functional TC, VR → positive + negative, FAC → Feature AC TC), priority deterministic. Cascade lên `feature/{F-XXX}/tsd.md` qua Changes blocks. Gate: integration phải có `features:` non-empty (component-thuần không áp dụng).
118
+
106
119
  #### `/plan`
107
120
  Tạo `plan.md` và `todo.md` từ `spec.md` + `tech.md`.
108
121
 
@@ -122,6 +135,17 @@ Sau khi có findings, hỏi user severity tier muốn xử lý (Critical / Criti
122
135
 
123
136
  ---
124
137
 
138
+ ## Maintenance — migrate artifacts khi template thay đổi
139
+
140
+ Skill ad-hoc dùng khi template đã được update và artifacts hiện có cần migrate. Không phải pipeline — chạy khi cần.
141
+
142
+ #### `/spec-frd-update`
143
+ Migrate `feature/*/frd.md` hiện có sang format mới nhất của [frd-template.md](.claude/templates/main/feature/frd-template.md). Detect 8 migration vectors: fix Mermaid syntax `[{...}]` → `["..."]`, rename `Feature-level AC` → `Feature AC` với 4 nhóm chuẩn, rename `AC-F{NNN}-*` (Feature AC) → `FAC-F{NNN}-*` + cascade ID remap qua `fdd.md`/`tsd.md`/`integrations/*/{spec,tech,test}.md`, insert US/AC stability notes + Verification Rules, derive Mermaid User Flows từ User Stories, v.v.
144
+
145
+ Pre-flight yêu cầu git working tree clean — rollback dùng `git checkout -- {file}`, **không** tạo file `.bak`. V4 (FAC remap), V6 (Verification Rules propose), V8 (User Flows propose) đều có confirm step trước khi ghi. No-op safe: nếu mọi FRD đã clean, skill dừng mà không ghi gì.
146
+
147
+ ---
148
+
125
149
  ## Files được tạo ra
126
150
 
127
151
  | Command | Output |
@@ -131,8 +155,11 @@ Sau khi có findings, hỏi user severity tier muốn xử lý (Critical / Criti
131
155
  | `/spec-brownfield-init` | `specs/main/prd.md`, `specs/main/domain.md`, `specs/main/sad.md` |
132
156
  | `/spec-brownfield-component` | `specs/main/component/{C-XXX}-*/crd.md + cdd.md` |
133
157
  | `/spec-brownfield-feature` | `specs/main/feature/{F-XXX}-*/frd.md + fdd.md` |
158
+ | `/spec-tsd` | `specs/main/feature/{F-XXX}-*/tsd.md` |
159
+ | `/spec-frd-update` | *(modify in-place `feature/*/frd.md` + cascade refs)* |
134
160
  | `/spec-new` | `specs/integrations/{slug}/spec.md` |
135
161
  | `/spec-tech` | `specs/integrations/{slug}/tech.md` |
162
+ | `/spec-test` | `specs/integrations/{slug}/test.md`, cascade: `feature/{F-XXX}/tsd.md` |
136
163
  | `/plan` | `specs/integrations/{slug}/plan.md`, `todo.md` |
137
164
  | `/build` | *(implements tasks từ `plan.md`/`todo.md`)* |
138
165
  | `/review-integration` | *(findings report — không tạo file)* |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spec-lite",
3
- "version": "1.3.3",
3
+ "version": "1.4.1",
4
4
  "description": "Spec-driven development kit for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {
@@ -123,7 +123,7 @@ Dùng `.claude/templates/integrations/plan-template.md` làm skeleton, điền n
123
123
  **Lưu ý format:**
124
124
  - Task ID dùng `·` (middle dot), không dùng `—`
125
125
  - `**Các bước:**` là numbered list, đủ cụ thể để agent implement không cần đoán
126
- - `**Verification:**` là checklist `- [ ]`, gắn AC ID khi
126
+ - `**Verification:**` là checklist `- [ ]` test case hoặc observable result cụ thể
127
127
  - `**depends:**` luôn có, dùng `—` nếu không có dependency
128
128
 
129
129
  ### todo.md
@@ -191,7 +191,16 @@ Các entities sau được dùng bởi nhiều components.
191
191
  Apply cascade proposals vào domain.md? [y/n/edit]
192
192
  ```
193
193
 
194
- Nếu `y` → update `specs/main/domain.md` Shared Entities section.
194
+ Nếu `y` → update `specs/main/domain.md` Shared Entities section, đồng thời append entry vào `## Change History` của domain.md (theo `conventions.md` §5.5):
195
+
196
+ ```markdown
197
+ ### {YYYY-MM-DD} — manual — update
198
+
199
+ - **Shared Entities**:
200
+ - [NEW] Order — owner C-003-payment, used by inventory (detected từ /spec-brownfield-component scan)
201
+ - [NEW] User — owner C-001-auth, used by user/notification
202
+ ```
203
+
195
204
  Nếu `edit` → hỏi chỉnh sửa từng entity trước khi apply.
196
205
 
197
206
  ---
@@ -212,6 +221,14 @@ Ghi tất cả? [y] hoặc review từng file trước [r]:
212
221
  - `y` → ghi tất cả
213
222
  - `r` → hiển thị lần lượt từng file, user confirm / skip / edit từng cái
214
223
 
224
+ **Change History:** Append entry vào section `## Change History` cuối mỗi `crd.md`/`cdd.md` vừa ghi (theo `conventions.md` §5.5):
225
+
226
+ ```markdown
227
+ ### {YYYY-MM-DD} — manual — create
228
+
229
+ - **All sections**: initial brownfield scaffold qua /spec-brownfield-component (discovered từ code scan)
230
+ ```
231
+
215
232
  ---
216
233
 
217
234
  ### Bước 10: Điền Component Index vào prd.md + sad.md Components table
@@ -238,6 +255,18 @@ Apply? [y/n]
238
255
 
239
256
  Cột architectural notes trong sad.md nên ngắn gọn — tập trung vào boundary/deployment/key tech concern, không lặp lại business role từ prd.md.
240
257
 
258
+ Khi apply → đồng thời append entry vào `## Change History` của prd.md và sad.md (theo `conventions.md` §5.5):
259
+
260
+ ```markdown
261
+ ### {YYYY-MM-DD} — manual — update
262
+
263
+ - **Components**:
264
+ - [NEW] C-001 — auth (discovered từ /spec-brownfield-component scan)
265
+ - [NEW] C-002 — user
266
+ - [NEW] C-003 — payment
267
+ - [NEW] C-004 — notification
268
+ ```
269
+
241
270
  ---
242
271
 
243
272
  ### Bước 11: Summary
@@ -225,6 +225,14 @@ Sẽ tạo {N} features ({2N} files):
225
225
  Ghi tất cả? [y] hoặc review từng file trước [r]:
226
226
  ```
227
227
 
228
+ **Change History:** Append entry vào section `## Change History` cuối mỗi `frd.md`/`fdd.md` vừa ghi (theo `conventions.md` §5.5):
229
+
230
+ ```markdown
231
+ ### {YYYY-MM-DD} — manual — create
232
+
233
+ - **All sections**: initial brownfield scaffold qua /spec-brownfield-feature (discovered từ code scan)
234
+ ```
235
+
228
236
  ---
229
237
 
230
238
  ### Bước 8: Điền Feature Index vào prd.md
@@ -241,6 +249,18 @@ Sẽ điền Feature Index vào prd.md:
241
249
  Apply? [y/n]
242
250
  ```
243
251
 
252
+ Khi apply → đồng thời append entry vào `## Change History` của prd.md (theo `conventions.md` §5.5):
253
+
254
+ ```markdown
255
+ ### {YYYY-MM-DD} — manual — update
256
+
257
+ - **Features**:
258
+ - [NEW] F-001 — user-registration (discovered từ /spec-brownfield-feature scan)
259
+ - [NEW] F-002 — authentication
260
+ - [NEW] F-003 — checkout-flow
261
+ - [NEW] F-004 — order-history
262
+ ```
263
+
244
264
  ---
245
265
 
246
266
  ### Bước 9: Summary
@@ -272,6 +272,14 @@ Confirm? [y] Bỏ qua [n] Chỉnh sửa [e]:
272
272
 
273
273
  Tạo `specs/main/` nếu chưa có. Ghi các files đã được confirm.
274
274
 
275
+ **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
+
277
+ ```markdown
278
+ ### {YYYY-MM-DD} — manual — create
279
+
280
+ - **All sections**: initial brownfield scaffold qua /spec-brownfield-init (scan codebase + interview)
281
+ ```
282
+
275
283
  ```
276
284
  ✓ specs/main/prd.md (Component Index và Feature Index: placeholder — chưa có)
277
285
  ✓ specs/main/domain.md (Glossary: {n} terms | Shared Entities: trống — sẽ mọc qua cascade)
@@ -348,6 +348,16 @@ Cho mỗi FRD đã migrate:
348
348
  Vectors applied: V5, V6 (5 VRs added)
349
349
  ```
350
350
 
351
+ **Change History append:** Cho mỗi FRD vừa migrate (và mỗi cascade target `fdd.md`/`tsd.md` bị touched), append entry vào section `## Change History` theo `conventions.md` §5.5:
352
+
353
+ ```markdown
354
+ ### {YYYY-MM-DD} — manual — update
355
+
356
+ - **Migration**: applied vectors V1, V3, V4 (3 IDs remapped: AC-F001-001→FAC-F001-001, ...), V5, V6 (8 VRs added), V8 (2 flows added) qua /spec-frd-update
357
+ ```
358
+
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
+
351
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.
352
362
 
353
363
  Append vào [changelogs.md](../../changelogs.md) `## [Unreleased]`:
@@ -360,6 +360,30 @@ Cho từng block:
360
360
  - `[REMOVE]` → xóa item khỏi artifact (ID không tái sử dụng — không renumber các ID khác)
361
361
  - Ghi lại artifact
362
362
 
363
+ **[7.2.5] Append Change History entry** vào mỗi main artifact bị touched (theo `conventions.md` §5.5). Đây là phần atomic của auto-apply — nếu fail thì rollback luôn cả entry này.
364
+
365
+ Cho mỗi artifact:
366
+
367
+ 1. Mở file, tìm section `## Change History` (mọi template main đã scaffold sẵn section này — nếu thiếu, append vào cuối file).
368
+ 2. Append entry mới ở cuối section, format:
369
+
370
+ ```markdown
371
+ ### {YYYY-MM-DD} — [{NNN}-{slug}](../../integrations/{NNN}-{slug}/spec.md) — {operation}
372
+
373
+ - **{Section name 1}**:
374
+ - [marker] {ID/item} — {mô tả ngắn 1 dòng}
375
+ - **{Section name 2}**:
376
+ - [marker] {ID/item} — {mô tả ngắn 1 dòng}
377
+ ```
378
+
379
+ - Operation = `create` nếu vừa scaffold artifact mới, `update` nếu apply Changes block lên artifact đã tồn tại.
380
+ - Section name = tên section trong template gốc (`User Stories`, `Verification Rules`, `Components`, `Public Interface`, ...).
381
+ - Mỗi item có marker trong Changes block phải xuất hiện ở entry, không gộp, không bỏ sót.
382
+ - Mô tả ngắn 1 dòng: đủ context để hiểu thay đổi mà không phải mở `spec.md`. Ví dụ tốt: `[NEW] US-F002-005 — Refund order story cho customer`; ví dụ xấu: `[NEW] US-F002-005`.
383
+ - Path link: dùng relative path từ artifact đến `integrations/{NNN}-{slug}/spec.md` (số `../` phụ thuộc depth của artifact: 2 cho prd/domain/sad, 3 cho component/feature artifacts).
384
+
385
+ 3. Với operation=create và artifact được seed từ template trống (không có content từ Changes block) → entry body có thể đơn giản: `- **All sections**: initial scaffold`.
386
+
363
387
  **[7.3] Side-effects bổ sung:**
364
388
 
365
389
  - Nếu integration gắn với feature từ prd.md và prd.md Changes block không tự đổi status → tự động đổi `TODO` → `In Progress` cho feature đó trong prd.md.
@@ -415,4 +439,5 @@ Trước khi user confirm (Bước 6), kiểm tra:
415
439
  Sau khi user confirm (Bước 7):
416
440
 
417
441
  - [ ] Auto-apply chạy theo thứ tự prd → domain → sad → crd → frd
418
- - [ ] Fail-safe: nếu apply fail thì không ghi spec.md
442
+ - [ ] Mỗi artifact bị touched entry mới được append vào `## Change History` (xem `conventions.md` §5.5)
443
+ - [ ] Fail-safe: nếu apply fail thì không ghi spec.md (rollback luôn Change History entries)
@@ -152,6 +152,18 @@ Chỉ ghi file sau khi user confirm. Nếu user yêu cầu chỉnh sửa → c
152
152
 
153
153
  Nếu `domain.md` đã tồn tại với nội dung thực → không đụng tới.
154
154
 
155
+ **5c. Append Change History entry** vào mỗi artifact vừa ghi/scaffold (theo `conventions.md` §5.5):
156
+
157
+ ```markdown
158
+ ### {YYYY-MM-DD} — manual — create
159
+
160
+ - **All sections**: initial scaffold qua /spec-prd
161
+ ```
162
+
163
+ - Áp dụng cho `prd.md` (mỗi lần skill chạy — nếu là lần đầu thì `create`, nếu là update thì `update` và body liệt kê section bị đổi).
164
+ - Áp dụng cho `domain.md` chỉ khi vừa scaffold lần đầu — không đụng nếu đã tồn tại.
165
+ - Operation `update`: liệt kê section đã thay đổi với mô tả ngắn, ví dụ `- **Features**: updated Feature Index từ interview`.
166
+
155
167
  Thông báo kết quả:
156
168
  ```
157
169
  ✓ specs/main/prd.md đã được cập nhật (status: draft)
@@ -0,0 +1,588 @@
1
+ ---
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.
4
+ ---
5
+
6
+ # spec-remove
7
+
8
+ ## Overview
9
+
10
+ Tạo removal integration cho 1 feature đã tồn tại. Output là `spec.md` với đầy đủ:
11
+
12
+ - **Code Inventory** — code, route, DB, feature flag, config liên quan
13
+ - **Reverse Dependency Audit** — ai còn reference, an toàn xoá hay không
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`
16
+ - **Changes blocks** — `[REMOVE]` markers cho mọi artifact bị touched
17
+
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.
19
+
20
+ ## When to Use
21
+
22
+ - Một feature đã ship và cần decommission (deprecated, business pivot, replaced by feature khác)
23
+ - Cần xoá toàn bộ code + spec + ADO state một cách an toàn, có audit trail
24
+ - Có nhiều reverse-dep cần được liệt kê và quyết định rõ ràng trước khi xoá
25
+
26
+ ## When NOT to Use
27
+
28
+ - Chỉ muốn xoá 1 US / 1 AC / 1 VR khỏi feature → dùng `/spec-new` với marker `[REMOVE]` cho item đó. Feature vẫn sống.
29
+ - Feature chưa từng được implement (chỉ có frd.md, chưa có code) → dùng `/spec-new` với block `[REMOVE]` cho frd.md, không cần workflow này.
30
+ - Muốn pause / disable tạm thời mà giữ code → đây không phải removal, dùng feature flag thay vì skill này.
31
+
32
+ ---
33
+
34
+ ## Prerequisites
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
38
+ - (Optional) `.claude/ado.yaml` cấu hình nếu muốn đóng ADO tickets ở finalize step
39
+
40
+ ---
41
+
42
+ ## Process
43
+
44
+ ### Bước 1: Validate argument
45
+
46
+ Argument BẮT BUỘC là Feature ID dạng `F-XXX` (3 chữ số). Nếu argument thiếu hoặc sai format → dừng:
47
+
48
+ ```
49
+ spec-remove cần Feature ID. Ví dụ: /spec-remove F-001
50
+ ```
51
+
52
+ Tìm thư mục `specs/main/feature/F-XXX-*/`:
53
+ - 0 matches → báo lỗi feature không tồn tại, dừng.
54
+ - ≥ 2 matches → báo lỗi data inconsistency (nhiều thư mục cùng prefix), dừng.
55
+ - 1 match → tiếp.
56
+
57
+ Đọc `frd.md` frontmatter:
58
+ - Nếu `status: removed` → hỏi:
59
+
60
+ ```
61
+ F-XXX đã có status `removed`. Bạn muốn:
62
+ [1] Re-finalize (move artifacts + close ADO lại, idempotent)
63
+ [2] Tạo removal integration mới (có thể bạn chưa cleanup code lần trước)
64
+ [3] Hủy
65
+ ```
66
+
67
+ ---
68
+
69
+ ### Bước 2: Load context
70
+
71
+ Đọc các file sau:
72
+
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)
78
+
79
+ **Components used by F-XXX:**
80
+
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
84
+
85
+ **Reverse dependency scan:**
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ì.
88
+
89
+ Output context summary cho user:
90
+
91
+ ```
92
+ F-XXX — {feature title}
93
+ Status: {Done/In Progress/...}
94
+ ADO: #{ticket_id} ({current state}) {nếu prd.md có cột ADO}
95
+
96
+ Components dùng bởi F-XXX:
97
+ - C-YYY-{slug} — {role} ({exclusive | shared with F-AAA, F-BBB})
98
+ - ...
99
+
100
+ Reverse-dep features (dùng chung component với F-XXX):
101
+ ⚠ F-AAA {title} — dùng C-YYY {interface_name}
102
+ ⚠ F-BBB {title} — dùng C-ZZZ {interface_name}
103
+ {hoặc} ✓ Không có reverse-dep — F-XXX hoàn toàn cô lập
104
+
105
+ Glossary terms từ domain.md tham chiếu trong F-XXX:
106
+ - {term} {(unique to F-XXX | shared)}
107
+ - ...
108
+
109
+ Shared entities owned bởi components của F-XXX:
110
+ - {Entity} (Owner: C-YYY) — {used by F-XXX only | also F-AAA}
111
+ - ...
112
+ ```
113
+
114
+ ---
115
+
116
+ ### Bước 3: Interview ngắn
117
+
118
+ Hỏi 2 câu, tuần tự:
119
+
120
+ **3.1 — Lý do remove:**
121
+
122
+ ```
123
+ Lý do remove F-XXX? (sẽ ghi vào Change History + ADO closure comment)
124
+ > ___
125
+ ```
126
+
127
+ **3.2 — Removal strategy:**
128
+
129
+ Dùng `AskUserQuestion`:
130
+
131
+ ```
132
+ Removal strategy:
133
+ [1] Single-shot — xoá hết trong 1 deploy. Phù hợp khi feature off-traffic, internal-only, không có DB schema lớn.
134
+ [2] Phased — disable trước (feature flag off + deprecation banner), soak period, sau đó xoá code. Phù hợp khi có DB / external API / traffic gradual.
135
+ [3] Phased + drop schema riêng — như Phased nhưng tách thêm 1 integration cho DROP TABLE/COLUMN sau khi code đã xoá và observed.
136
+ ```
137
+
138
+ Nếu chọn `[2]` hoặc `[3]` → hỏi soak period (1-2 tuần là baseline):
139
+
140
+ ```
141
+ Soak period giữa các phase (ngày)?
142
+ > ___
143
+ ```
144
+
145
+ Phased và Phased+drop schema → ghi nhận để Bước 6 (sinh draft) có Removal Phases section.
146
+
147
+ ---
148
+
149
+ ### Bước 4: Code Discovery
150
+
151
+ Mục tiêu: build **Code Inventory** — danh sách code cụ thể sẽ bị xoá.
152
+
153
+ **Nguồn discovery (kết hợp):**
154
+
155
+ 1. **fdd.md / cdd.md** — nếu artifact có ghi file path / module path cụ thể trong section như "Implementation Notes" → dùng làm seed trực tiếp.
156
+ 2. **Component slug** — search filesystem cho directory matching `{C-YYY}-{slug}` (kebab) hoặc camelCase variant.
157
+ 3. **Public Interface signatures** — từ `crd.md` Public Interface, lấy function/class/endpoint name → grep codebase.
158
+ 4. **Route paths** — từ `frd.md` User Flows / `fdd.md` sequence diagrams, extract API path patterns (`/api/...`) → grep route registrations.
159
+ 5. **Owned Entities** — từ `domain.md` Shared Entities (owned bởi component của F-XXX), table name → grep migrations + queries.
160
+ 6. **Feature flag names** — nếu được nhắc trong artifact → grep config files.
161
+ 7. **Test files** — sau khi xác định module paths, grep `tests/` cho cùng prefix / cùng tên.
162
+
163
+ **Tools:** `Grep`, `Glob`, `Bash` (`rg`, `find`). Khi không chắc filesystem layout, hỏi user 1 câu: "Codebase root ở `src/` hay project có monorepo structure khác?"
164
+
165
+ **Output Code Inventory** dạng table, group theo category:
166
+
167
+ ```
168
+ Code Inventory for F-XXX:
169
+
170
+ ROUTES / API ENDPOINTS:
171
+ [1] POST /api/auth/login → src/routes/auth.ts:12-50
172
+ [2] POST /api/auth/logout → src/routes/auth.ts:52-80
173
+ [3] POST /api/auth/refresh → src/routes/auth.ts:82-115
174
+
175
+ SOURCE MODULES:
176
+ [4] src/services/auth/ → entire directory (8 files)
177
+ [5] src/middleware/auth-token.ts
178
+ [6] src/utils/jwt.ts → ⚠ also used by F-007 (reverse-dep)
179
+
180
+ TESTS:
181
+ [7] tests/auth/ → 12 files
182
+ [8] tests/integration/auth-flow.test.ts
183
+
184
+ DATABASE:
185
+ [9] table `sessions` → migration drop_sessions.sql cần tạo
186
+ [10] table `refresh_tokens` → migration cần tạo
187
+ [11] users.last_login_at column → ⚠ used by F-007 analytics
188
+
189
+ FEATURE FLAGS:
190
+ [12] ff_new_auth → src/config/flags.ts:12
191
+
192
+ CONFIG / ENV:
193
+ [13] AUTH_SECRET, AUTH_TTL → .env.example, src/config/index.ts
194
+
195
+ OTHER (best-effort, manual verify):
196
+ - Grafana dashboard "Auth metrics" — không scan được tự động, BA verify tay
197
+ - Docs site có section /docs/auth/ — verify tay
198
+ ```
199
+
200
+ Mỗi item có thể là `safe` (xanh) hoặc `⚠ has external ref` (cần quyết định ở Bước 5).
201
+
202
+ ---
203
+
204
+ ### Bước 5: Reverse Dependency Audit
205
+
206
+ Với mỗi item trong Code Inventory, grep external references (ngoài thư mục chính của F-XXX). Mọi reference `⚠` cần user quyết định.
207
+
208
+ ```
209
+ Reverse-dep audit:
210
+
211
+ [6] src/utils/jwt.ts
212
+ External refs found:
213
+ - src/services/admin/sessions.ts:34 — imports `verifyJWT`
214
+ - src/services/api-gateway/auth-check.ts:12 — imports `signJWT`
215
+
216
+ Quyết định:
217
+ [a] Keep file — không xoá src/utils/jwt.ts (chỉ xoá phần exclusive của F-XXX bên trong nếu có)
218
+ [b] Migrate consumer first — abort removal, tạo integration migration F-007 + api-gateway sang alternative trước
219
+ [c] Remove anyway — xoá luôn, downstream tự fix (rủi ro cao, cần justify)
220
+ Chọn: ___
221
+
222
+ [11] users.last_login_at column
223
+ External refs found:
224
+ - src/analytics/login-tracking.ts:88 — SELECT this column
225
+ Quyết định: ___
226
+ ```
227
+
228
+ Mọi item `⚠` đều phải có quyết định trước khi sang Bước 6. Nếu user chọn `[b]` cho bất kỳ item nào → dừng skill, instruct:
229
+
230
+ ```
231
+ F-XXX chưa thể remove vì có reverse-dep chưa migrate:
232
+ - {item} blocked by {consumer}
233
+
234
+ Tạo integration migration trước:
235
+ /spec-new "Migrate {consumer} away from {item}"
236
+
237
+ Sau khi migration deploy xong, chạy lại /spec-remove F-XXX.
238
+ ```
239
+
240
+ ---
241
+
242
+ ### Bước 6: Sinh draft spec.md
243
+
244
+ Xác định slug và NNN giống `/spec-new`:
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ố.
247
+
248
+ Output path: `specs/integrations/{NNN}-remove-{f-xxx-slug}/spec.md`
249
+
250
+ Cấu trúc spec.md:
251
+
252
+ ```markdown
253
+ ---
254
+ id: "{NNN}"
255
+ slug: "remove-{f-xxx-slug}"
256
+ title: "Remove {F-XXX} {feature title}"
257
+ features: [{F-XXX}]
258
+ components: [{C-YYY list những component bị touched}]
259
+ status: approved
260
+ removal: true
261
+ created: {YYYY-MM-DD}
262
+ ---
263
+
264
+ ## Context
265
+ {tóm tắt frd/fdd/components/reverse-deps đã load ở Bước 2}
266
+
267
+ ## Problem Statement
268
+ {lý do remove từ Bước 3.1 — ghi từ góc nhìn business/product, không phải tech}
269
+
270
+ ## Removal Strategy
271
+ {Single-shot | Phased | Phased + schema drop} — chi tiết theo lựa chọn:
272
+
273
+ ### Phase 1: Disable (chỉ khi Phased)
274
+ - Tắt feature flag `ff_xxx`
275
+ - Deprecation banner trên UI (nếu user-facing)
276
+ - Telemetry warning log mỗi lần feature được hit
277
+ - Soak: {N} ngày, monitor traffic = 0
278
+
279
+ ### Phase 2: Remove code
280
+ - Xoá code per Code Inventory dưới
281
+ - Regression tests (xem Test Strategy)
282
+
283
+ ### Phase 3: Drop schema (chỉ khi Phased + schema drop)
284
+ - Tạo integration riêng sau {N} ngày Phase 2 deployed
285
+ - Migration DROP TABLE / DROP COLUMN
286
+
287
+ ## Code Inventory
288
+ {copy table từ Bước 4, đã loại bỏ các item user quyết định `[a] Keep`}
289
+
290
+ ## Reverse Dependency Audit
291
+ {liệt kê mỗi item ⚠ + quyết định user đã chọn, kèm lý do/justify}
292
+
293
+ ## Test Strategy (Reverse-TDD)
294
+
295
+ Pattern cho mỗi target:
296
+
297
+ 1. **Baseline check (trước khi xoá):** ghi nhận test hiện có hoặc viết quick smoke test xác nhận thing exists và functional. Mục đích: confirm mental model trước khi xoá.
298
+
299
+ 2. **Delete trong 1 commit:**
300
+ - Xoá source code
301
+ - Xoá test files cũ tương ứng
302
+ - Update import statements
303
+
304
+ 3. **Regression assertion (sau khi xoá):** thêm test khẳng định thing is gone:
305
+ - Route → assert GET/POST trả 404 (hoặc proper error code)
306
+ - Exported function/class → assert import fails (compile-time check, không cần runtime test)
307
+ - DB table/column → migration test confirm DROP applied, query trả error
308
+ - Feature flag → assert flag key không tồn tại trong config
309
+
310
+ 4. **Full suite run:** mọi test khác phải pass. Nếu có test fail → reverse-dep chưa detect đủ, rollback commit, audit lại.
311
+
312
+ Regression tests **được giữ lại** trong codebase như guardrail — future-self không vô tình re-add feature đã removed.
313
+
314
+ ## Finalize Plan
315
+
316
+ Đây là **task cuối** trong todo.md (sẽ được /plan tự nhặt). DEV thực thi sau khi mọi removal task khác xong và đã deploy verify.
317
+
318
+ ### Actions:
319
+
320
+ 1. **Move feature artifacts:**
321
+ ```bash
322
+ mkdir -p specs/removed
323
+ mv specs/main/feature/{F-XXX}-{slug}/ specs/removed/{F-XXX}-{slug}/
324
+ ```
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):
327
+ ```markdown
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/
330
+ - Reason: {lý do từ Problem Statement}
331
+ ```
332
+
333
+ 3. **Update prd.md Feature Index:**
334
+ - Row F-XXX: status → `Removed`
335
+ - Add note column hoặc inline: `(see specs/removed/{F-XXX}-{slug}/)`
336
+
337
+ 4. **Close ADO tickets** (nếu prd.md có ADO ticket ID cho F-XXX):
338
+ - Feature ticket → state `Removed`
339
+ - Tất cả User Story tickets thuộc F-XXX → state `Removed`
340
+ - Comment trên mỗi ticket: "Decommissioned per integration {NNN}-remove-{slug}. Reason: {lý do}"
341
+ - Dùng `mcp__azure-devops__wit_update_work_item` (state) + `mcp__azure-devops__wit_add_work_item_comment` (comment)
342
+ - Nếu ADO state name khác (vd "Closed") → xem `.claude/ado.yaml` hoặc fetch từ `wit_get_work_item_type`
343
+
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
347
+ - prd.md grep `F-XXX` → status `Removed`
348
+ - ADO ticket fetch → state khớp
349
+
350
+ ## Changes
351
+ <!-- Changes blocks theo format chuẩn của spec-template.md, áp dụng cho mọi artifact bị touched. Xem markers [NEW]/[MODIFY {field}]/[REMOVE] theo conventions §5.5. -->
352
+
353
+ ### prd.md
354
+ **Operation:** update
355
+ **Format reference:** [prd-template.md](../../templates/main/prd-template.md)
356
+
357
+ #### Features (Feature Index)
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/"
360
+
361
+ #### Components (Component Index) — chỉ component exclusive với F-XXX
362
+ - Row [MODIFY status]: `C-YYY` {current status} → `Removed`
363
+ - ... (component shared thì KHÔNG đổi status)
364
+
365
+ ### feature/{F-XXX}-{slug}/frd.md
366
+ **Operation:** update
367
+ **Format reference:** [frd-template.md](../../templates/main/feature/frd-template.md)
368
+
369
+ <!--
370
+ Đánh dấu mọi item bằng [REMOVE]. File sẽ bị move sang specs/removed/ ở Finalize step
371
+ nhưng cascade content vẫn ghi vào file gốc trước (để Change History entry được apply).
372
+ -->
373
+
374
+ #### User Stories
375
+ - US-FXXX-001 [REMOVE] — feature decommissioned
376
+ - US-FXXX-002 [REMOVE] — feature decommissioned
377
+ - ... (mọi US)
378
+
379
+ #### Acceptance Criteria
380
+ - AC-FXXX-* [REMOVE] — feature decommissioned
381
+
382
+ #### Verification Rules
383
+ - VR-FXXX-* [REMOVE] — feature decommissioned
384
+
385
+ #### Frontmatter
386
+ - [MODIFY status]: `draft|approved|...` → `removed`
387
+
388
+ ### feature/{F-XXX}-{slug}/fdd.md *(nếu tồn tại)*
389
+ **Operation:** update
390
+ **Format reference:** [fdd-template.md](../../templates/main/feature/fdd-template.md)
391
+
392
+ #### Flow Sequences
393
+ - [REMOVE] FS-FXXX-* — feature decommissioned
394
+
395
+ #### Data Models
396
+ - [REMOVE] {model} — feature decommissioned
397
+
398
+ #### Frontmatter
399
+ - [MODIFY status]: → `removed`
400
+
401
+ ### component/{C-YYY}-{slug}/crd.md *(lặp cho mỗi component bị touched)*
402
+ **Operation:** update
403
+ **Format reference:** [crd-template.md](../../templates/main/component/crd-template.md)
404
+
405
+ <!--
406
+ Component exclusive với F-XXX:
407
+ - Toàn bộ sections [REMOVE]
408
+ - Frontmatter status → removed
409
+
410
+ Component shared (vẫn còn feature khác dùng):
411
+ - Chỉ [REMOVE] những Public Interface / Responsibility / Owned Entity
412
+ chỉ phục vụ F-XXX (đã audit ở Bước 5)
413
+ - Giữ nguyên phần còn lại
414
+ - Frontmatter status KHÔNG đổi
415
+ -->
416
+
417
+ #### Public Interface
418
+ - {interface} [REMOVE] — only used by F-XXX, no other consumer
419
+
420
+ #### Owned Entities
421
+ - {Entity} [REMOVE] — exclusive to F-XXX
422
+
423
+ ### domain.md
424
+ **Operation:** update
425
+ **Format reference:** [domain-template.md](../../templates/main/domain-template.md)
426
+
427
+ #### Glossary
428
+ - {term} [REMOVE] — unique to F-XXX, no other reference
429
+
430
+ #### Shared Entities
431
+ - {Entity} [REMOVE] — orphan after F-XXX removal, no other component owns
432
+
433
+ ## Out of Scope
434
+ - {Migration của reverse-dep features tới alternative — separate integration nếu có}
435
+ - {Documentation site cleanup — manual task ngoài integration}
436
+ - {Grafana dashboard cleanup — manual task}
437
+
438
+ ## Cascade Summary
439
+
440
+ | Artifact | Operation | Summary |
441
+ | --- | --- | --- |
442
+ | `prd.md` | update | F-XXX status → Removed; {N} components status → Removed |
443
+ | `feature/F-XXX-*/frd.md` | update | All items [REMOVE]; status → removed; folder move tại Finalize |
444
+ | `feature/F-XXX-*/fdd.md` | update | All items [REMOVE]; status → removed |
445
+ | `component/C-YYY-*/crd.md` | update | All [REMOVE] (exclusive) / {N} items [REMOVE] (shared) |
446
+ | `domain.md` | update | {N} glossary [REMOVE], {N} entity [REMOVE] |
447
+ ```
448
+
449
+ ---
450
+
451
+ ### Bước 7: Review — xác nhận với user
452
+
453
+ Hiển thị toàn bộ draft. Hỏi:
454
+
455
+ ```
456
+ Draft trên đã đúng chưa?
457
+ - Code Inventory đầy đủ và chính xác?
458
+ - Reverse-dep audit đã quyết định hết các ⚠?
459
+ - Removal Strategy phù hợp (single-shot vs phased)?
460
+ - Finalize Plan đủ steps?
461
+ - Changes blocks dùng [REMOVE] đúng chỗ (exclusive vs shared)?
462
+
463
+ Sau khi confirm, agent sẽ auto-apply Changes blocks lên main artifacts.
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,
466
+ do /build chạy sau khi mọi deletion task khác xong.
467
+ ```
468
+
469
+ Chỉ tiến hành Bước 8 sau khi user confirm.
470
+
471
+ ---
472
+
473
+ ### Bước 8: Save + Auto-cascade
474
+
475
+ Giống `/spec-new` Bước 7, nhưng với removal-specific extensions.
476
+
477
+ **[8.1] Ghi spec.md** với status `approved`, `removal: true` trong frontmatter. Frontmatter `features` chứa F-XXX, `components` chứa list components touched.
478
+
479
+ **[8.2] Auto-apply Changes blocks** vào main artifacts. Thứ tự: `prd.md` → `domain.md` → `sad.md` → `component/*/crd.md` → `component/*/cdd.md` → `feature/F-XXX-*/frd.md` → `feature/F-XXX-*/fdd.md`.
480
+
481
+ Áp dụng marker [REMOVE] theo conventions §5.5:
482
+ - Xoá item khỏi artifact, ID không tái sử dụng, không renumber.
483
+ - Khi toàn bộ items trong frd/fdd của F-XXX bị [REMOVE] → đổi frontmatter `status: removed`.
484
+
485
+ **[8.3] Append Change History entry** vào mọi artifact bị touched (conventions §5.5). Entry format chuẩn:
486
+
487
+ ```markdown
488
+ ### {YYYY-MM-DD} — [{NNN}-remove-{slug}](../../integrations/{NNN}-remove-{slug}/spec.md) — update
489
+
490
+ - **{Section name}**:
491
+ - [REMOVE] {ID/item} — feature decommissioned ({lý do ngắn})
492
+ ```
493
+
494
+ **[8.4] Side-effects:**
495
+
496
+ - Trong prd.md: row F-XXX status đổi `Removed` ngay (không chờ finalize). Lý do: spec.md đã approved tức là quyết định removal đã được ký, status reflect quyết định ngay.
497
+ - ADO tickets KHÔNG transition ngay. Chỉ transition khi DEV chạy task Finalize ở `/build`. Lý do: tránh case rollback removal sau khi spec approve nhưng chưa deploy.
498
+ - File feature/F-XXX-*/ KHÔNG move ngay. Lý do giống ADO — chỉ move sau khi code thật đã xoá và verified.
499
+
500
+ **[8.5] Thông báo kết quả:**
501
+
502
+ ```
503
+ ✓ specs/integrations/{NNN}-remove-{f-xxx-slug}/spec.md đã được tạo (status: approved, removal: true)
504
+
505
+ Auto-cascade applied:
506
+ ✓ prd.md — F-XXX status → Removed; {N} components status → Removed
507
+ ✓ domain.md — {N} glossary/entity [REMOVE]
508
+ ✓ component/C-YYY-*/crd.md — {summary}
509
+ ✓ feature/F-XXX-*/frd.md — all items [REMOVE], status → removed
510
+ ✓ feature/F-XXX-*/fdd.md — all items [REMOVE], status → removed
511
+
512
+ ⚠ File feature/F-XXX-*/ vẫn ở specs/main/feature/. Sẽ được move sang specs/removed/ ở task cuối todo.md.
513
+ ⚠ ADO tickets giữ nguyên state. Sẽ được close ở task cuối todo.md (cần .claude/ado.yaml).
514
+
515
+ Bước tiếp theo:
516
+ /spec-tech → thiết kế delete order, migration SQL, regression test cases
517
+ /plan → break down deletion tasks + finalize task cuối
518
+ /build → execute deletion + finalize
519
+ ```
520
+
521
+ **Nếu apply fail** (markers reference ID không tồn tại, reverse-dep audit chưa hoàn tất, file không ghi được) → dừng, báo lỗi cụ thể, **không** ghi spec.md. Yêu cầu user fix draft.
522
+
523
+ ---
524
+
525
+ ## Downstream Integration (informational)
526
+
527
+ Skill này chỉ sinh `spec.md`. Để biết các skill sau xử lý removal flavor như nào:
528
+
529
+ - **`/spec-tech`** đọc `spec.md`, thấy `removal: true` + Code Inventory + Test Strategy + Finalize Plan → sinh `tech.md` với:
530
+ - Section "Delete Order" liệt kê file paths theo Code Inventory
531
+ - Section "Migration SQL" nếu có DB target (DROP + rollback)
532
+ - Section "Regression Tests" theo Test Strategy pattern
533
+ - Section "Finalize Task" passthrough nguyên xi từ spec.md Finalize Plan
534
+
535
+ - **`/plan`** đọc cả spec.md + tech.md → sinh `plan.md` + `todo.md`. Task cuối todo.md = Finalize task với 5 sub-actions như Finalize Plan của spec.md.
536
+
537
+ - **`/build`** chạy tuần tự todo.md. Khi tới Finalize task:
538
+ - Move folder bằng shell mv
539
+ - Edit prd.md
540
+ - Append Change History
541
+ - Gọi ADO API để transition tickets (cần `.claude/ado.yaml` configured)
542
+ - Verify outputs
543
+
544
+ Nếu `/spec-tech` hoặc `/plan` hiện tại chưa nhặt được removal flavor → có thể cần update sau (separate work). Trong v1, spec.md đủ rõ ràng để 2 skill đó produce reasonable output kể cả không có removal-awareness explicit.
545
+
546
+ ---
547
+
548
+ ## Common Rationalizations
549
+
550
+ | Rationalization | Reality |
551
+ | --- | --- |
552
+ | "Grep nhanh, không cần Code Inventory chi tiết" | Inventory sót item = code chết nằm trong repo vô thời hạn. Audit trail mất. |
553
+ | "Reverse-dep nhỏ thôi, xoá luôn rồi fix sau" | Một import dangling phá CI cả team. Audit trước rẻ hơn rollback. |
554
+ | "Feature flag off là xong, không cần xoá code" | Code dead vẫn phải maintain (security patch, dependency upgrade). Xoá hẳn mới sạch. |
555
+ | "Single-shot cho nhanh, soak period làm gì" | Có DB / external traffic mà single-shot = rollback đắt khi phát hiện consumer chưa migrate. |
556
+ | "Skip Finalize, để folder ở main feature là được" | Active dir bị noise. Sau 5 features removed, không phân biệt được active vs dead. |
557
+
558
+ ## Red Flags
559
+
560
+ - Code Inventory empty hoặc chỉ có 1-2 file cho 1 feature đã ship → discovery chưa đủ rộng, xem lại sources
561
+ - Reverse-dep audit không có ⚠ nào cho component shared → grep chưa đủ kỹ
562
+ - Removal Strategy single-shot nhưng có DB schema lớn hoặc external traffic > 0 → cân nhắc Phased
563
+ - Test Strategy chỉ có "delete code" mà không có regression test → future re-add risk
564
+ - Finalize Plan thiếu ADO closure mà prd.md có ticket ID → audit trail không đầy đủ
565
+ - Changes block frd.md mark [REMOVE] nhưng không đổi `status: removed` trong frontmatter → inconsistent state
566
+
567
+ ## Verification
568
+
569
+ Trước khi user confirm (Bước 7):
570
+
571
+ - [ ] Code Inventory liệt kê đủ 7 category (route / module / test / DB / flag / config / other)
572
+ - [ ] Mỗi item ⚠ trong Reverse-dep audit đã có quyết định rõ ràng (a/b/c)
573
+ - [ ] Nếu có item chọn `[b] Migrate first` → skill đã dừng, không tạo spec
574
+ - [ ] Removal Strategy match scale: single-shot cho nhỏ, phased cho lớn
575
+ - [ ] Test Strategy có 4 sub-step: baseline / delete / regression / full-suite
576
+ - [ ] Finalize Plan có 5 actions: move folder / change history / prd update / ADO close / verify
577
+ - [ ] Changes blocks: exclusive component → all [REMOVE]; shared component → chỉ items của F-XXX [REMOVE]
578
+ - [ ] frd.md / fdd.md frontmatter có [MODIFY status] → removed
579
+
580
+ Sau khi user confirm (Bước 8):
581
+
582
+ - [ ] spec.md frontmatter `removal: true`
583
+ - [ ] Auto-cascade chạy đúng thứ tự prd → domain → sad → crd → cdd → frd → fdd
584
+ - [ ] Mọi artifact bị touched có Change History entry
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)
587
+ - [ ] ADO tickets KHÔNG bị transition (chưa close — chỉ close ở Finalize task)
588
+ - [ ] Notification cuối ghi rõ 2 ⚠ về việc folder + ADO chưa được động vào
@@ -169,6 +169,16 @@ Chỉ ghi file sau khi user confirm. Nếu user yêu cầu chỉnh sửa → c
169
169
 
170
170
  Ghi nội dung đã được confirm vào `specs/main/sad.md`.
171
171
 
172
+ **Change History:** Append entry vào section `## Change History` cuối `sad.md` (theo `conventions.md` §5.5):
173
+
174
+ ```markdown
175
+ ### {YYYY-MM-DD} — manual — create
176
+
177
+ - **All sections**: initial scaffold qua /spec-sad
178
+ ```
179
+
180
+ Nếu chạy lần thứ N (sad.md đã có) → operation = `update`, body liệt kê section đã đổi với mô tả ngắn.
181
+
172
182
  Thông báo kết quả:
173
183
  ```
174
184
  ✓ specs/main/sad.md đã được cập nhật (status: draft)
@@ -64,12 +64,7 @@ Nếu `status` **không phải** `approved`:
64
64
 
65
65
  > ⛔ `spec.md` của integration **{slug}** chưa được approve (status hiện tại: `{status}`).
66
66
  >
67
- > Để tiếp tục:
68
- > 1. Review `specs/integrations/{slug}/spec.md`
69
- > 2. Apply Cascade Proposals vào main artifacts (nếu có)
70
- > 3. Đổi `status: draft` → `status: approved` trong frontmatter
71
- >
72
- > Sau khi approve xong, chạy lại `/spec-tech`.
67
+ > `/spec-new` luôn ghi `spec.md` với `status: approved` sau khi auto-cascade thành công. Nếu file đang ở `draft` → có thể `/spec-new` bị fail giữa chừng hoặc user đổi tay status. Chạy lại `/spec-new` cho integration này.
73
68
 
74
69
  **Dừng hoàn toàn. Không tiếp tục.**
75
70
 
@@ -147,7 +142,7 @@ Tổng hợp và viết draft `tech.md`:
147
142
 
148
143
  **Cấu trúc file**: dùng `.claude/templates/integrations/tech-template.md` làm skeleton, điền nội dung từ interview vào.
149
144
 
150
- **Cascade Proposals** — agent đề xuất delta cho main artifacts theo các targets sau (chỉ điền nếu thực sự thay đổi, không thì ghi "Khôngthay đổi đề xuất."):
145
+ **Changes blocks** — agent sinh delta cho main artifacts trong section `## Changes` của tech.md. Mỗi block tương ứng 1 artifact bị touched, declare `Operation: create | update`, content theo format template gốc với markers `[NEW] / [MODIFY {field}] / [REMOVE]` cho operation=update. Đây là phần draft sẽ auto-apply sau khi user confirm — không "manual apply" bước riêng. Targets:
151
146
 
152
147
  ### sad.md
153
148
 
@@ -199,7 +194,8 @@ Liệt kê **tất cả** features liên quan trong frontmatter và đánh giá:
199
194
  - Nếu integration thêm/đổi rule trong FRD → cập nhật bảng Verification Implementation tương ứng
200
195
 
201
196
  Bỏ block fdd.md nếu integration không gắn với feature nào (`features: []`).
202
- ```
197
+
198
+ **Cascade Summary** — sau các Changes blocks, sinh bảng tóm tắt liệt kê tất cả targets (kể cả targets không có block, ghi `no-op`) để reviewer scan nhanh.
203
199
 
204
200
  Hiển thị draft cho user xem — **chưa ghi file**.
205
201
 
@@ -209,27 +205,81 @@ Hiển thị draft cho user xem — **chưa ghi file**.
209
205
 
210
206
  > Draft trên đã đúng chưa?
211
207
  > - Technical Design có đủ để DEV implement không?
212
- > - Cascade Proposals (nếu) cần approve trước khi tiến hành.
208
+ > - Changes blocks đã đúng chưa? Mỗi marker khớp current state của main artifact không?
209
+ > - Guardrails Compliance đã pass?
210
+
211
+ > **Sau khi confirm, agent sẽ auto-apply tất cả Changes blocks lên main artifacts (sad → domain → cdd → fdd).** Không có bước manual apply.
213
212
 
214
213
  Chỉ ghi file sau khi user confirm. Nếu user yêu cầu chỉnh sửa → cập nhật draft → hỏi lại.
215
214
 
216
215
  ---
217
216
 
218
- ### Bước 6: Save
217
+ ### Bước 6: Save + Auto-cascade
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`.
220
+
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
+
223
+ Cho từng block:
224
+
225
+ - **Operation=create:**
226
+ - Tạo file mới tại path tương ứng
227
+ - Nội dung = nội dung của Changes block (theo format của template gốc — `cdd-template.md` hoặc `fdd-template.md`)
228
+ - Frontmatter: lấy từ template (status `draft` cho artifact mới — separate lifecycle với tech.md)
229
+
230
+ - **Operation=update:**
231
+ - Đọc artifact hiện tại
232
+ - Với mỗi item trong Changes block:
233
+ - `[NEW]` → append/insert vào section tương ứng (giữ thứ tự numeric của ID)
234
+ - `[MODIFY {field}]` → tìm item bằng ID, update field đã chỉ định, giữ nguyên các field khác
235
+ - `[REMOVE]` → xóa item khỏi artifact (ID không tái sử dụng — không renumber các ID khác)
236
+ - Ghi lại artifact
237
+
238
+ **[6.2.5] Append Change History entry** vào mỗi main artifact bị touched (theo `conventions.md` §5.5). Đây là phần atomic của auto-apply — nếu fail thì rollback luôn cả entry này.
239
+
240
+ Cho mỗi artifact:
219
241
 
220
- Ghi nội dung đã confirm vào `specs/integrations/{slug}/tech.md`.
242
+ 1. Mở file, tìm section `## Change History` (mọi template main đã scaffold sẵn — nếu thiếu, append vào cuối file).
243
+ 2. Append entry mới ở cuối section, format:
244
+
245
+ ```markdown
246
+ ### {YYYY-MM-DD} — [{NNN}-{slug}](../../integrations/{NNN}-{slug}/tech.md) — {operation}
247
+
248
+ - **{Section name}**:
249
+ - [marker] {ID/item} — {mô tả ngắn 1 dòng}
250
+ ```
251
+
252
+ - Operation = `create` (artifact mới) | `update` (artifact đã tồn tại).
253
+ - Integration link trỏ tới `tech.md` (không phải `spec.md`) — đây là cascade từ tech.
254
+ - Section name = tên section trong template gốc (`Module Structure`, `Storage & Persistence`, `Inter-Component Data Flow`, `Verification Implementation`...).
255
+ - Path link: relative từ artifact đến `integrations/{NNN}-{slug}/tech.md` (số `../` phụ thuộc depth: 2 cho sad/domain, 3 cho component/feature).
256
+ - Mọi item có marker trong Changes block phải xuất hiện ở entry, group theo section.
257
+
258
+ 3. Với operation=create từ template trống → entry body có thể là `- **All sections**: initial scaffold`.
259
+
260
+ **[6.3] Atomic rollback:** Nếu apply block nào fail (vd `[MODIFY {ID}]` nhưng ID không tồn tại):
261
+ 1. Rollback các block đã apply trước đó (kể cả Change History entries) về state ban đầu
262
+ 2. **Không** ghi tech.md
263
+ 3. Báo lỗi cụ thể cho user fix draft hoặc artifact hiện tại
264
+
265
+ **[6.4] Thông báo kết quả:**
221
266
 
222
- Thông báo kết quả:
223
267
  ```
224
- ✓ specs/integrations/{slug}/tech.md đã được tạo (status: draft)
268
+ ✓ specs/integrations/{slug}/tech.md đã được tạo (status: approved)
269
+
270
+ Auto-cascade applied:
271
+ ✓ sad.md — {summary | no-op}
272
+ ✓ domain.md — {summary | no-op}
273
+ ✓ component/C-XXX-{slug}/cdd.md — {created | updated: summary}
274
+ ✓ feature/F-XXX-{slug}/fdd.md — {created | updated: summary}
225
275
 
226
276
  Bước tiếp theo:
227
- - Review tech.md và apply Cascade Proposals (nếu có) vào main artifacts thủ công
228
- - Approve tech.md (đổi status: draft → approved)
229
277
  - /plan → tạo plan.md và todo.md cho integration này
230
278
  - Sau khi tất cả tasks done: đổi status F-XXX trong prd.md thành DONE
231
279
  ```
232
280
 
281
+ **Nếu apply fail** → dừng, báo lỗi cụ thể, **không** ghi tech.md. Yêu cầu user fix draft hoặc check artifact hiện tại.
282
+
233
283
  ---
234
284
 
235
285
  ## Common Rationalizations
@@ -238,21 +288,30 @@ Bước tiếp theo:
238
288
  | --- | --- |
239
289
  | "Tech design thì code xong mới biết được" | Không cần design hoàn hảo, cần đủ để thống nhất approach trước khi viết code. |
240
290
  | "Interface thì ghi sau khi implement xong" | Interface chưa được agree = BA không biết integration làm gì, không thể verify AC. |
241
- | "Cascade Proposals thì sau cập nhật cũng được" | Domain SAD shared context. Cập nhật trễ = các tech.md sau dùng context sai. |
291
+ | "Cascade Proposals thì sau cập nhật cũng được" | Cascade auto-apply atomic với save. Không "sau" confirm draft = cascade chạy ngay. |
242
292
 
243
293
  ## Red Flags
244
294
 
245
295
  - Solution Overview không có lý do chọn approach — chỉ mô tả "sẽ làm X" mà không giải thích tại sao
246
296
  - Interface Changes trống trong khi spec.md có AC về API/response shape
247
297
  - Data Model Changes bỏ qua nhưng spec.md có requirement về data mới
248
- - Cascade Proposals không được review trước khi approve
298
+ - Changes blocks không được review trước khi confirm (cascade auto-apply là irreversible — không có undo)
299
+ - Marker không khớp current state: `[NEW]` cho item đã tồn tại, hoặc `[MODIFY]/[REMOVE]` cho ID không có
249
300
 
250
301
  ## Verification
251
302
 
252
- Trước khi ghi file, kiểm tra:
303
+ Trước khi user confirm (Bước 5), kiểm tra:
253
304
 
254
305
  - [ ] Solution Overview có lý do chọn approach (không chỉ mô tả)
255
306
  - [ ] Mỗi Acceptance Criterion trong spec.md đều được cover bởi design
256
307
  - [ ] Interface Changes đầy đủ method, path, auth requirement (nếu có)
257
- - [ ] Cascade Proposals đã được user review
258
- - [ ] User đã confirm draft trước khi ghi file
308
+ - [ ] Mỗi Changes block Operation rõ ràng (create | update)
309
+ - [ ] Mỗi item trong update block marker đúng ([NEW]/[MODIFY {field}]/[REMOVE])
310
+ - [ ] Guardrails Compliance đã pass cho từng GUARD-XXX
311
+ - [ ] Cascade Summary table khớp với các Changes blocks
312
+
313
+ Sau khi user confirm (Bước 6):
314
+
315
+ - [ ] Auto-apply chạy theo thứ tự sad → domain → cdd → fdd
316
+ - [ ] Mỗi artifact bị touched có entry mới được append vào `## Change History` (conventions §5.5)
317
+ - [ ] Fail-safe: nếu apply fail thì không ghi tech.md (rollback luôn Change History entries)
@@ -304,6 +304,23 @@ Cho từng block:
304
304
  - Cập nhật Traceability Matrix: thêm row cho item mới, update row của item bị MODIFY, KHÔNG xóa row của REMOVE (đánh dấu retire)
305
305
  - Ghi lại tsd.md
306
306
 
307
+ **[6.2.5] Append Change History entry** vào mỗi tsd.md bị touched (theo `conventions.md` §5.5). Đây là phần atomic của auto-apply — nếu fail thì rollback luôn.
308
+
309
+ Format entry:
310
+
311
+ ```markdown
312
+ ### {YYYY-MM-DD} — [{NNN}-{slug}](../../../integrations/{NNN}-{slug}/test.md) — {operation}
313
+
314
+ - **{Section name}**:
315
+ - [marker] {TS/TC ID} — {mô tả ngắn 1 dòng}
316
+ ```
317
+
318
+ - Operation = `create` (tsd.md mới) | `update` (tsd.md đã tồn tại).
319
+ - Integration link trỏ tới `test.md` (không phải `spec.md`) — đây là cascade từ test.
320
+ - Section name = tên section trong template tsd (`Test Scenarios`, `Functional Test Cases`, `Validation Test Cases`, `Feature AC Test Cases`, `Traceability Matrix`...).
321
+ - Mọi TS/TC có marker trong Changes block phải xuất hiện ở entry, group theo section.
322
+ - Với operation=create từ template trống (no Changes block content) → entry body có thể là `- **All sections**: initial scaffold`.
323
+
307
324
  **[6.3] Atomic rollback:** Nếu apply block nào fail (vd `[MODIFY TC-F001-005]` nhưng ID không tồn tại):
308
325
  1. Rollback các block đã apply trước đó về state ban đầu
309
326
  2. **Không** ghi integration test.md
@@ -361,5 +378,6 @@ Trước khi QC confirm (Bước 5), kiểm tra:
361
378
  Sau khi QC confirm (Bước 6):
362
379
 
363
380
  - [ ] Auto-apply theo thứ tự features trong frontmatter
364
- - [ ] Fail-safe: nếu apply fail thì không ghi integration test.md
381
+ - [ ] Mỗi tsd.md bị touched entry mới trong `## Change History` (conventions §5.5)
382
+ - [ ] Fail-safe: nếu apply fail thì không ghi integration test.md (rollback luôn Change History entries)
365
383
  - [ ] Mỗi feature tsd.md mới có status `draft` (separate lifecycle)
@@ -187,6 +187,16 @@ Ghi `specs/main/feature/{F-XXX}-{slug}/tsd.md` với status `draft` (feature-lev
187
187
 
188
188
  Nếu overwrite — file backup `tsd.md.bak.{timestamp}` đã tạo ở Bước 2.
189
189
 
190
+ **Change History:** Append entry vào section `## Change History` cuối tsd.md (theo `conventions.md` §5.5):
191
+
192
+ ```markdown
193
+ ### {YYYY-MM-DD} — manual — create
194
+
195
+ - **All sections**: initial scaffold qua /spec-tsd (mechanical derive từ frd.md — N TS, M Functional TC, P Validation TC, Q Feature AC TC)
196
+ ```
197
+
198
+ Nếu overwrite tsd.md cũ → entry vẫn dùng operation `create` (vì IDs regenerate fresh, không phải update), thêm note trong body: `- **Note**: overwrote previous tsd.md (backup tại tsd.md.bak.{timestamp}) — IDs regenerated từ 001`.
199
+
190
200
  Thông báo kết quả:
191
201
 
192
202
  ```
@@ -61,3 +61,17 @@ Các quyết định kỹ thuật đặc thù của component và lý do.
61
61
  | Quyết định | Lý do | Alternatives đã cân nhắc |
62
62
  | --- | --- | --- |
63
63
  | {decision} | {lý do cụ thể} | {option A vs B} |
64
+
65
+ ## Change History
66
+
67
+ Append-only log của các thay đổi cascade lên artifact này. Quy ước xem `conventions.md` §5.5.
68
+
69
+ <!-- Entry format:
70
+ ### YYYY-MM-DD — [{id}-{slug}](../../../integrations/{id}-{slug}/tech.md) — create|update|manual
71
+
72
+ - **{Section name}**:
73
+ - [NEW] {item} — {mô tả ngắn}
74
+ - [MODIFY {field}] {item} — {old → new}
75
+ - [REMOVE] {item} — {lý do}
76
+ -->
77
+
@@ -93,3 +93,17 @@ Các component khác mà component này phụ thuộc.
93
93
  | Component | Loại dependency | Cách dùng |
94
94
  | --- | --- | --- |
95
95
  | `{C-XXX}-{name}` | sync call / event subscription / shared entity | {cụ thể: gọi API nào, subscribe event nào} |
96
+
97
+ ## Change History
98
+
99
+ Append-only log của các thay đổi cascade lên artifact này. Quy ước xem `conventions.md` §5.5.
100
+
101
+ <!-- Entry format:
102
+ ### YYYY-MM-DD — [{id}-{slug}](../../../integrations/{id}-{slug}/spec.md) — create|update|manual
103
+
104
+ - **{Section name}**:
105
+ - [NEW] {item} — {mô tả ngắn}
106
+ - [MODIFY {field}] {item} — {old → new}
107
+ - [REMOVE] {item} — {lý do}
108
+ -->
109
+
@@ -59,3 +59,17 @@ erDiagram
59
59
  EntityA ||--o{ EntityB : ""
60
60
  EntityB }o--|| EntityC : ""
61
61
  ```
62
+
63
+ ## Change History
64
+
65
+ Append-only log của các thay đổi cascade lên artifact này. Quy ước xem `conventions.md` §5.5.
66
+
67
+ <!-- Entry format:
68
+ ### YYYY-MM-DD — [{id}-{slug}](../integrations/{id}-{slug}/spec.md) — create|update|manual
69
+
70
+ - **{Section name}**:
71
+ - [NEW] {item} — {mô tả ngắn}
72
+ - [MODIFY {field}] {item} — {old → new}
73
+ - [REMOVE] {item} — {lý do}
74
+ -->
75
+
@@ -69,3 +69,17 @@ Quy ước:
69
69
  - **Layer**: `client` (UI validation trước submit), `gateway` (API gateway / request validator), `service` (business logic component), hoặc kết hợp (`client + gateway` cho double-check). Layer ảnh hưởng UX (inline vs server round-trip).
70
70
  - **Owning component**: component nào chịu trách nhiệm enforce. Implementation chi tiết (regex, validator code, error class) nằm trong `cdd.md` của component đó.
71
71
  - **Error propagation**: HTTP status + error code semantic + cách render cho user. Wording cụ thể của error message thuộc UI copy artifact, không ở đây.
72
+
73
+ ## Change History
74
+
75
+ Append-only log của các thay đổi cascade lên artifact này. Quy ước xem `conventions.md` §5.5.
76
+
77
+ <!-- Entry format:
78
+ ### YYYY-MM-DD — [{id}-{slug}](../../../integrations/{id}-{slug}/tech.md) — create|update|manual
79
+
80
+ - **{Section name}**:
81
+ - [NEW] {item} — {mô tả ngắn}
82
+ - [MODIFY {field}] {item} — {old → new}
83
+ - [REMOVE] {item} — {lý do}
84
+ -->
85
+
@@ -153,3 +153,17 @@ Tham chiếu đến `specs/main/component/{C-XXX}-...`.
153
153
  | Component | Vai trò trong feature |
154
154
  | --- | --- |
155
155
  | `{C-XXX}-{component-name}` | {component này phục vụ cái gì cho feature này} |
156
+
157
+ ## Change History
158
+
159
+ Append-only log của các thay đổi cascade lên artifact này. Quy ước xem `conventions.md` §5.5.
160
+
161
+ <!-- Entry format:
162
+ ### YYYY-MM-DD — [{id}-{slug}](../../../integrations/{id}-{slug}/spec.md) — create|update|manual
163
+
164
+ - **{Section name}**:
165
+ - [NEW] {item} — {mô tả ngắn}
166
+ - [MODIFY {field}] {item} — {old → new}
167
+ - [REMOVE] {item} — {lý do}
168
+ -->
169
+
@@ -218,3 +218,17 @@ Cover Feature Acceptance Criteria (`FAC-*`) trong frd. Feature AC trong frd đã
218
218
  ### Components Used (input only)
219
219
 
220
220
  Tham chiếu `frd.md > Components Used` để hiểu contract của các component được feature này dùng. Behavior của component được verify **gián tiếp** qua các TC ở đây — không tách tsd riêng cho component.
221
+
222
+ ## Change History
223
+
224
+ Append-only log của các thay đổi cascade lên artifact này. Quy ước xem `conventions.md` §5.5.
225
+
226
+ <!-- Entry format:
227
+ ### YYYY-MM-DD — [{id}-{slug}](../../../integrations/{id}-{slug}/test.md) — create|update|manual
228
+
229
+ - **{Section name}**:
230
+ - [NEW] {item} — {mô tả ngắn}
231
+ - [MODIFY {field}] {item} — {old → new}
232
+ - [REMOVE] {item} — {lý do}
233
+ -->
234
+
@@ -59,3 +59,17 @@ Các thành phần kỹ thuật của hệ thống — chi tiết về vai trò
59
59
 
60
60
  - {ràng buộc kinh doanh} — constraint
61
61
  - {giả định quan trọng} — assumption
62
+
63
+ ## Change History
64
+
65
+ Append-only log của các thay đổi cascade lên artifact này. Quy ước xem `conventions.md` §5.5.
66
+
67
+ <!-- Entry format:
68
+ ### YYYY-MM-DD — [{id}-{slug}](../integrations/{id}-{slug}/spec.md) — create|update|manual
69
+
70
+ - **{Section name}**:
71
+ - [NEW] {item} — {mô tả ngắn}
72
+ - [MODIFY {field}] {item} — {old → new}
73
+ - [REMOVE] {item} — {lý do}
74
+ -->
75
+
@@ -74,3 +74,17 @@ Các nguyên tắc sau là bất biến. Agent phải kiểm tra compliance trư
74
74
  - GUARD-001: {nguyên tắc — ví dụ: Không dùng raw SQL, phải qua ORM}
75
75
  - GUARD-002: {nguyên tắc — ví dụ: Mọi external API call phải có retry + timeout}
76
76
  - GUARD-003: {nguyên tắc — ví dụ: Không để business logic trong API layer}
77
+
78
+ ## Change History
79
+
80
+ Append-only log của các thay đổi cascade lên artifact này. Quy ước xem `conventions.md` §5.5.
81
+
82
+ <!-- Entry format:
83
+ ### YYYY-MM-DD — [{id}-{slug}](../integrations/{id}-{slug}/spec.md) — create|update|manual
84
+
85
+ - **{Section name}**:
86
+ - [NEW] {item} — {mô tả ngắn}
87
+ - [MODIFY {field}] {item} — {old → new}
88
+ - [REMOVE] {item} — {lý do}
89
+ -->
90
+