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.
- package/README.md +31 -18
- package/package.json +1 -1
- package/skills/ado-config/SKILL.md +1 -1
- package/skills/ado-create/SKILL.md +7 -7
- package/skills/ado-update/SKILL.md +1 -1
- package/skills/archive/SKILL.md +19 -19
- package/skills/build/SKILL.md +5 -5
- package/skills/plan/SKILL.md +6 -6
- package/skills/review-everything/SKILL.md +9 -9
- package/skills/review-integration/SKILL.md +7 -7
- package/skills/scaffold/SKILL.md +9 -9
- package/skills/spec-brownfield-component/SKILL.md +11 -11
- package/skills/spec-brownfield-feature/SKILL.md +13 -13
- package/skills/spec-brownfield-init/SKILL.md +13 -13
- package/skills/spec-frd/SKILL.md +311 -0
- package/skills/spec-frd-update/SKILL.md +9 -9
- package/skills/spec-new/SKILL.md +11 -11
- package/skills/spec-prd/SKILL.md +115 -16
- package/skills/spec-remove/SKILL.md +27 -27
- package/skills/spec-sad/SKILL.md +6 -6
- package/skills/spec-tech/SKILL.md +16 -16
- package/skills/spec-test/SKILL.md +15 -15
- package/skills/spec-tsd/SKILL.md +10 -10
- package/skills-overview.md +49 -24
- package/templates/main/domain-template.md +1 -1
- package/templates/main/feature/frd-template.md +2 -1
- package/templates/main/prd-template.md +16 -1
package/skills/spec-prd/SKILL.md
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
-
|
|
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
|
|
121
|
+
Đọc `.specs/main/prd.md`:
|
|
34
122
|
|
|
35
|
-
- **File không tồn tại** → tạo thư mục
|
|
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
|
|
110
|
-
>
|
|
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 mô 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
|
|
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
|
|
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
|
|
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:
|
|
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 có component **Derived** (boundary phụ thuộc carve lõi nghiệp vụ — thuộc `/spec-sad`). Có thể trống. Mỗi item có ID (C-XXX), tên kebab-case, mô tả 1 câu
|
|
303
|
+
- [ ] Nếu input context 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
|
|
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
|
-
-
|
|
37
|
-
-
|
|
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
|
|
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
|
-
-
|
|
75
|
-
-
|
|
76
|
-
-
|
|
77
|
-
-
|
|
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
|
-
-
|
|
83
|
-
-
|
|
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
|
|
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
|
|
246
|
+
- NNN: max của thư mục hiện có trong `.specs/integrations/` + 1, format 3 chữ số.
|
|
247
247
|
|
|
248
|
-
Output path:
|
|
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
|
|
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
|
package/skills/spec-sad/SKILL.md
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
-
|
|
80
|
-
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
-
|
|
84
|
-
-
|
|
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**
|
|
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**
|
|
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**
|
|
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**
|
|
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
|
|
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
|
|
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
|
-
-
|
|
16
|
-
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
-
|
|
111
|
-
-
|
|
112
|
-
-
|
|
113
|
-
-
|
|
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
|
-
> ⛔
|
|
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
|
|
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
|
|
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}
|