spec-lite 1.4.5 → 1.4.7

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
@@ -7,7 +7,7 @@ Bộ skills spec-driven development cho Claude Code — phỏng vấn có cấu
7
7
  ## Cài đặt
8
8
 
9
9
  ```bash
10
- npx spec-lite install
10
+ npx spec-lite@latest install
11
11
  ```
12
12
 
13
13
  Lệnh này copy `skills/` và `templates/` vào thư mục `.claude/` của project.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spec-lite",
3
- "version": "1.4.5",
3
+ "version": "1.4.7",
4
4
  "description": "Spec-driven development kit for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {
@@ -53,16 +53,19 @@ options:
53
53
  description: "Cập nhật danh sách PE / SE / DE"
54
54
  - label: "Epic ticket"
55
55
  description: "Tạo mới hoặc thay Epic ticket đang được lưu"
56
+ - label: "Area / Iteration path"
57
+ description: "Cập nhật area_path và iteration_path mặc định cho ticket"
56
58
  - label: "Môi trường"
57
59
  description: "Cập nhật danh sách environments (dev / stag / prod)"
58
60
  ```
59
61
 
60
62
  Tuỳ theo lựa chọn:
61
- - **"Toàn bộ từ đầu"** → chạy Bước 2 → 3 → 4 → 5 → 6 → 7
62
- - **"Thông tin project"** → chỉ chạy Bước 2, bỏ qua Bước 3, 4, 5, nhảy thẳng đến Bước 67 (giữ nguyên `team`, `epic`, `environments` từ file cũ)
63
- - **"Team members"** → chỉ chạy Bước 3, bỏ qua Bước 2, 4, 5, nhảy thẳng đến Bước 67 (giữ nguyên `organization/project`, `epic`, `environments` từ file cũ)
64
- - **"Epic ticket"** → chỉ chạy Bước 4, bỏ qua Bước 2, 3, 5, nhảy thẳng đến Bước 67 (giữ nguyên `organization/project`, `team`, `environments` từ file cũ)
65
- - **"Môi trường"** → chỉ chạy Bước 5, bỏ qua Bước 2, 3, 4, nhảy thẳng đến Bước 67 (giữ nguyên tất cả từ file cũ)
63
+ - **"Toàn bộ từ đầu"** → chạy Bước 2 → 3 → 4 → 5 → 6 → 7 → 8
64
+ - **"Thông tin project"** → chỉ chạy Bước 2, bỏ qua Bước 3, 4, 5, 6, nhảy thẳng đến Bước 78 (giữ nguyên `team`, `epic`, `area_path/iteration_path`, `environments` từ file cũ)
65
+ - **"Team members"** → chỉ chạy Bước 3, bỏ qua Bước 2, 4, 5, 6, nhảy thẳng đến Bước 78 (giữ nguyên `organization/project`, `epic`, `area_path/iteration_path`, `environments` từ file cũ)
66
+ - **"Epic ticket"** → chỉ chạy Bước 4, bỏ qua Bước 2, 3, 5, 6, nhảy thẳng đến Bước 78 (giữ nguyên `organization/project`, `team`, `area_path/iteration_path`, `environments` từ file cũ)
67
+ - **"Area / Iteration path"** → chỉ chạy Bước 5, bỏ qua Bước 2, 3, 4, 6, nhảy thẳng đến Bước 78 (giữ nguyên tất cả còn lại từ file cũ)
68
+ - **"Môi trường"** → chỉ chạy Bước 6, bỏ qua Bước 2, 3, 4, 5, nhảy thẳng đến Bước 7 → 8 (giữ nguyên tất cả từ file cũ)
66
69
 
67
70
  ---
68
71
 
@@ -238,7 +241,41 @@ https://dev.azure.com/{organization}/{project_name}/_workitems/edit/{id}
238
241
 
239
242
  ---
240
243
 
241
- ### Bước 5: Cấu hình môi trường
244
+ ### Bước 5: Cấu hình Area & Iteration Path
245
+
246
+ Area Path và Iteration Path mặc định sẽ được gán cho mọi Feature/User Story khi `/ado-create` tạo ticket. Cả hai đều **tùy chọn** — nếu bỏ trống, ADO dùng giá trị mặc định của team.
247
+
248
+ Hỏi user bằng `AskUserQuestion`:
249
+
250
+ ```
251
+ question: "Cấu hình Area / Iteration path mặc định cho ticket?"
252
+ options:
253
+ - label: "Nhập area & iteration path"
254
+ description: "Gán area_path và iteration_path mặc định cho mọi ticket tạo qua /ado-create"
255
+ - label: "Bỏ qua"
256
+ description: "Không set — ADO dùng giá trị mặc định của team"
257
+ ```
258
+
259
+ Nếu user chọn **"Nhập area & iteration path"** → hỏi lần lượt (cho phép Enter trống để bỏ từng field):
260
+
261
+ ```
262
+ Area Path (ví dụ: Tickets\Clients\C-GAL\P-GCC):
263
+ > Tickets\Clients\C-GAL\P-GCC
264
+
265
+ Iteration Path (ví dụ: Tickets\Weekly Sprint):
266
+ > Tickets\Weekly Sprint
267
+ ```
268
+
269
+ Lưu ý khi thu thập:
270
+ - Path dùng dấu backslash `\` phân cách như trên ADO. Chấp nhận cả khi user paste có khoảng trắng ở đầu/cuối → trim.
271
+ - Nếu user nhập area path nhưng không chắc đúng → vẫn lưu nguyên văn, không tự validate qua MCP (tránh fail khi node chưa tồn tại). Validation thực tế sẽ xảy ra lúc `/ado-create` tạo ticket.
272
+ - Field nào để trống → bỏ key tương ứng trong YAML, không ghi `area_path: null`.
273
+
274
+ Nếu user chọn **"Bỏ qua"** → không thêm `area_path`/`iteration_path` vào config.
275
+
276
+ ---
277
+
278
+ ### Bước 6: Cấu hình môi trường
242
279
 
243
280
  **Bắt buộc** hỏi user bằng `AskUserQuestion` — không cho phép bỏ qua:
244
281
 
@@ -265,7 +302,7 @@ Nếu user chọn "Other" (nhập tay) → parse chuỗi nhập vào (phân các
265
302
 
266
303
  ---
267
304
 
268
- ### Bước 6: Preview và xác nhận
305
+ ### Bước 7: Preview và xác nhận
269
306
 
270
307
  Hiển thị preview YAML sẽ được ghi — **chưa ghi file**:
271
308
 
@@ -287,6 +324,9 @@ team:
287
324
  DE:
288
325
  - d@atstechnology.vn
289
326
 
327
+ area_path: 'Tickets\Clients\C-GAL\P-GCC'
328
+ iteration_path: 'Tickets\Weekly Sprint'
329
+
290
330
  epic:
291
331
  id: 42
292
332
  title: "[GAL-GCC] Spec Lite Kit"
@@ -304,11 +344,13 @@ Nếu user yêu cầu chỉnh sửa → cập nhật preview → hỏi lại.
304
344
 
305
345
  Nếu user bỏ qua bước Epic (không muốn cấu hình ngay) → bỏ qua key `epic` trong YAML, không ghi `epic: null`.
306
346
 
307
- **Bước 5 (môi trường) bắt buộc** không cho phép bỏ qua. Nếu user chưa chọn, nhắc lại trước khi tiếp tục.
347
+ Nếu user bỏ qua Area/Iteration (Bước 5) bỏ qua key `area_path`/`iteration_path` tương ứng, không ghi giá trị `null`.
348
+
349
+ **Bước 6 (môi trường) là bắt buộc** — không cho phép bỏ qua. Nếu user chưa chọn, nhắc lại trước khi tiếp tục.
308
350
 
309
351
  ---
310
352
 
311
- ### Bước 7: Ghi file
353
+ ### Bước 8: Ghi file
312
354
 
313
355
  Ghi nội dung đã confirm vào `.claude/ado.yaml`.
314
356
 
@@ -345,5 +387,6 @@ Trước khi ghi file, kiểm tra:
345
387
  - [ ] `team.PE` có ít nhất 1 email — không được để trống
346
388
  - [ ] SE và DE có thể là array rỗng `[]`
347
389
  - [ ] Nếu có Epic: `epic.id` là số nguyên, `epic.title` có prefix `[{project_code}]`, `epic.url` là full URL dạng `https://dev.azure.com/{org}/{project_name}/_workitems/edit/{id}`
390
+ - [ ] Nếu có `area_path` / `iteration_path`: là chuỗi đã trim, giữ nguyên dấu `\` (dùng YAML single-quote để tránh escape); bỏ qua key nếu user không nhập — không ghi `null`
348
391
  - [ ] `environments` là array ít nhất 1 phần tử (bắt buộc), mỗi phần tử là lowercase string không có khoảng trắng, luôn có `prod` ở cuối
349
392
  - [ ] User đã confirm preview trước khi ghi file
@@ -14,6 +14,8 @@ description: Tạo Feature và User Story tickets trên ADO từ spec.md của m
14
14
  - `.claude/ado.yaml` phải tồn tại và có `epic.id` (chạy `/ado-config` nếu chưa có)
15
15
  - `frd.md` tương ứng phải tồn tại trong `.specs/main/features/` cho mỗi feature
16
16
 
17
+ **Area / Iteration (tùy chọn):** Nếu `.claude/ado.yaml` có `area_path` và/hoặc `iteration_path`, mọi ticket (Feature + User Story) tạo ở Bước 5 và Bước 6 phải set `areaPath` / `iterationPath` tương ứng. Nếu không khai báo → để ADO dùng giá trị mặc định của team.
18
+
17
19
  ---
18
20
 
19
21
  ## Process
@@ -131,6 +133,8 @@ Gọi `mcp__azure-devops__wit_create_work_item` với:
131
133
  - `title`: `[{project_code}] [{feature_id}] {feature_name}` — ví dụ: `[SDLC-TEST] [F-001] Đăng ký / Đăng nhập`
132
134
  - `description`: toàn bộ nội dung `frd.md` (giữ nguyên format Markdown)
133
135
  - `assignedTo`: ADO identity ID của current user (nếu resolve thành công)
136
+ - `areaPath`: giá trị `area_path` từ ado.yaml (nếu có)
137
+ - `iterationPath`: giá trị `iteration_path` từ ado.yaml (nếu có)
134
138
 
135
139
  Sau khi tạo thành công → **ngay lập tức** link parent. Ưu tiên dùng `mcp__azure-devops__wit_add_child_work_items` (parent = Epic ID, child = Feature ticket ID). Nếu tool này không khả dụng, fallback sang `mcp__azure-devops__wit_work_items_link` với:
136
140
  - `sourceId`: Feature ticket ID vừa tạo
@@ -186,6 +190,8 @@ Gọi `mcp__azure-devops__wit_create_work_item` với:
186
190
  - `title`: `[{project_code}] [{feature_name}] - {US-code} — {story_title}` — ví dụ: `[SDLC-TEST] [Đăng ký / Đăng nhập] - US-F001-001 — Đăng ký`
187
191
  - `description`: description đã build ở 6.2
188
192
  - `assignedTo`: ADO identity ID của current user
193
+ - `areaPath`: giá trị `area_path` từ ado.yaml (nếu có)
194
+ - `iterationPath`: giá trị `iteration_path` từ ado.yaml (nếu có)
189
195
 
190
196
  Sau khi tạo thành công → **ngay lập tức** link parent. Ưu tiên dùng `mcp__azure-devops__wit_add_child_work_items` (parent = Feature ticket ID, child = User Story ticket ID). Nếu không khả dụng, fallback sang `mcp__azure-devops__wit_work_items_link` với:
191
197
  - `sourceId`: User Story ticket ID vừa tạo
@@ -191,14 +191,14 @@ 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, đồng thời append entry vào `## Change History` của domain.md (theo `conventions.md` §5.5):
194
+ Nếu `y` → update `.specs/main/domain.md` Shared Entities section — mỗi entity [NEW] dùng heading `### E-XXX {Entity Name}`, cấp ID tuần tự theo quy ước `domain-template.md` (max E-XXX đã từng cấp trong `domain.md` + 1, quét cả heading lẫn Change History; ID không tái sử dụng) — đồng thời append entry vào `## Change History` của domain.md (theo `conventions.md` §5.5):
195
195
 
196
196
  ```markdown
197
197
  ### {YYYY-MM-DD} — manual — update
198
198
 
199
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
200
+ - [NEW] E-001 Order — owner C-003-payment, used by inventory (detected từ /spec-brownfield-component scan)
201
+ - [NEW] E-002 User — owner C-001-auth, used by user/notification
202
202
  ```
203
203
 
204
204
  Nếu `edit` → hỏi chỉnh sửa từng entity trước khi apply.
@@ -18,7 +18,7 @@ Skill này là cặp greenfield đối xứng với `/spec-brownfield-feature` (
18
18
  2. **CREATE-only** — frd.md đã tồn tại → DỪNG, redirect `/spec-new` để phân tích delta + cascade + downstream (tech/test) (Bước 1c).
19
19
 
20
20
  **Phạm vi hẹp — chủ yếu frd.md:**
21
- - ✅ Author frd.md (7 sections) cho **một** feature **chưa có frd**.
21
+ - ✅ Author frd.md (7 core sections + `Open Questions` tùy chọn) cho **một** feature **chưa có frd**.
22
22
  - ✅ *Reference* component frd phụ thuộc (Components Used) + ghi component cần-nhưng-chưa-có như **candidate**.
23
23
  - ✅ Nếu feature mục tiêu là feature mới chưa có trong Index → **register một row vào `prd.md > Features`** (side-effect hợp lệ lên prd).
24
24
  - ✅ **Cascade vocabulary lên `domain.md`** (Bước 4b — pha *mô tả hệ thống*/WHAT): glossary term + **định nghĩa entity đầy đủ** (attributes). `Owner` của entity để `TBD` cho `/spec-sad` điền ở pha *thiết kế hệ thống* (HOW). BA duyệt trước khi ghi. Đây là điểm khác với phiên bản trước (`/spec-frd` từng không đụng domain) — vocabulary sinh ra ở feature-authoring time nên seed luôn, thay vì để domain rỗng tới integration đầu tiên.
@@ -171,6 +171,8 @@ Hỏi tuần tự, từng phần — không hỏi tất cả cùng lúc. Nếu B
171
171
 
172
172
  Câu trả lời vague → hỏi lại để làm rõ (ngưỡng đo được, field cụ thể, nhánh xử lý).
173
173
 
174
+ **Open Questions — gom trong lúc interview.** Điểm nào BA chưa chốt được ngay (chờ stakeholder, phụ thuộc quyết định khác, ngưỡng/nhánh chưa rõ) → KHÔNG đoán bừa vào AC/VR. Ghi lại thành một mục trong `## Open Questions` của draft (kèm ai trả lời / khi nào), rồi tiếp tục các phần còn lại. Section này gom cả component candidate (Bước 4) lẫn câu hỏi clarify từ interview; rỗng thì xóa khi save.
175
+
174
176
  ---
175
177
 
176
178
  ### Bước 4: Xử lý component (mức reference + candidate)
@@ -204,6 +206,7 @@ Cấm: định nghĩa mơ hồ, hoặc nhét term thực ra là tên feature/com
204
206
  - **Entity *nằm ở component nào* (`Owner`) là *thiết kế hệ thống* (HOW)** → thuộc architect, điền ở `/spec-sad` (hoặc `/spec-new` khi carve). `/spec-frd` **không carve component** nên **không** quyết `Owner`.
205
207
 
206
208
  Vì vậy khi seed entity vào domain Shared Entities:
209
+ - **Cấp Entity ID `E-XXX`** theo quy ước của `domain-template.md`: ID tiếp theo = max ID đã từng cấp trong `domain.md` + 1 (quét cả heading hiện có lẫn Change History — ID của entity đã remove không tái sử dụng). Heading entity: `### E-XXX {Entity Name}`.
207
210
  - Điền đầy đủ definition + attributes từ frd.
208
211
  - Để **`Owner: TBD (điền ở /spec-sad — design time)`** và **`Used by: TBD`**. Không phải vì entity "chưa chắc có thật", mà vì ownership là quyết định thiết kế chưa tới lượt.
209
212
  - Entity rõ ràng chỉ là cấu trúc dữ liệu kỹ thuật nội bộ (không phải vocabulary nghiệp vụ) → không thuộc domain; bỏ qua, để lộ ra ở `crd.md` lúc carve.
@@ -224,6 +227,7 @@ Dùng `.claude/templates/main/feature/frd-template.md` làm skeleton, điền n
224
227
 
225
228
  Hiển thị **toàn bộ draft** cho user — chưa ghi file. Kèm:
226
229
  - danh sách component candidate (nếu có) và VR còn `TBD`;
230
+ - **Open Questions** còn mở (câu hỏi clarify + component candidate) để BA xác nhận hoặc giải quyết trước khi save;
227
231
  - **danh sách domain vocabulary đề xuất** (Bước 4b): glossary term mới + định nghĩa shared entity (`Owner: TBD`), để BA duyệt trước khi cascade lên `domain.md`.
228
232
 
229
233
  #### Verification Rules — quy ước sinh
@@ -287,7 +291,7 @@ Và append Change History entry vào prd.md (theo `conventions.md` §5.5):
287
291
  **7b''. (Chỉ khi Bước 4b/6 BA đã confirm vocabulary)** Cascade lên `.specs/main/domain.md`:
288
292
 
289
293
  - **Glossary** → append row `[NEW]` cho mỗi term đã confirm: `| {term} | {định nghĩa} | {example/context} |`.
290
- - **Shared Entities** → cho mỗi entity đã confirm, thêm một entry mới theo template với definition + attributes đầy đủ, để `**Owner:** TBD (điền ở /spec-sad — design time)` và `**Used by:** TBD`.
294
+ - **Shared Entities** → cho mỗi entity đã confirm, thêm một entry mới theo template với heading `### E-XXX {Entity Name}` (ID cấp ở Bước 4b — tuần tự, không tái sử dụng), definition + attributes đầy đủ, để `**Owner:** TBD (điền ở /spec-sad — design time)` và `**Used by:** TBD`. Trong frd, reference entity theo dạng `E-XXX {Entity Name}` để trace về domain.md.
291
295
 
292
296
  Append **một** Change History entry vào `domain.md`, operation = `manual` (author trực tiếp ngoài integration — cùng quy ước với 7b, theo `conventions.md` §5.5):
293
297
 
@@ -297,7 +301,7 @@ Append **một** Change History entry vào `domain.md`, operation = `manual` (au
297
301
  - **Glossary**:
298
302
  - [NEW] {term} — {mô tả ngắn} (qua /spec-frd F-XXX)
299
303
  - **Shared Entities**:
300
- - [NEW] {Entity} — định nghĩa + attributes; Owner TBD chờ /spec-sad (qua /spec-frd F-XXX)
304
+ - [NEW] E-XXX {Entity} — định nghĩa + attributes; Owner TBD chờ /spec-sad (qua /spec-frd F-XXX)
301
305
  ```
302
306
 
303
307
  (Nếu domain.md đang là skeleton create lần đầu thì entry vẫn `manual`/`update` — file đã được `/spec-prd` scaffold với operation `create` từ trước.) Atomic với 7a: domain cascade fail → rollback cả frd. `Owner` của entity do `/spec-sad`/`/spec-new` cascade bổ sung sau (HOW phase) qua `[MODIFY Owner]`.
@@ -343,6 +347,7 @@ Bước tiếp theo:
343
347
  - frd dùng từ không đo được trong AC ("hoạt động đúng", "nhanh", "đẹp")
344
348
  - User Stories không có persona rõ hoặc không có AC
345
349
  - Verification Rules tự điền mà chưa hỏi BA
350
+ - Đoán bừa vào AC/VR thay vì ghi điểm chưa chốt vào Open Questions
346
351
  - Tạo crd.md/cdd.md (vượt phạm vi — đó là integration time)
347
352
  - Component candidate không được surface cho architect
348
353
  - **Update frd đã tồn tại** thay vì redirect `/spec-new` (vi phạm CREATE-only)
@@ -354,7 +359,7 @@ Bước tiếp theo:
354
359
  - [ ] **Single-feature gate**: nguồn liên quan đúng 1 feature; nếu >1 đã DỪNG và mô tả rõ lý do tách + redirect `/spec-prd`
355
360
  - [ ] **Create-only gate**: frd.md của feature mục tiêu CHƯA tồn tại; nếu đã có đã redirect `/spec-new`
356
361
  - [ ] Feature mục tiêu có trong Index, HOẶC feature mới đơn lẻ đã được user đồng ý register (Bước 1b)
357
- - [ ] frd.md có đủ 7 sections (luôn create mới)
362
+ - [ ] frd.md có đủ 7 core sections (luôn create mới); `Open Questions` chứa câu hỏi clarify + component candidate còn mở, hoặc đã xóa nếu rỗng
358
363
  - [ ] Mỗi User Story có persona + priority + ít nhất 1 AC Given/When/Then
359
364
  - [ ] Feature AC dùng ID `FAC-F{NNN}-{seq}` (counter độc lập với `AC-F{NNN}`), Then đo được
360
365
  - [ ] Verification Rules đã confirm với BA (không tự assert); không chứa regex/code/error message; semantic type
@@ -258,9 +258,10 @@ Tạo block nếu integration:
258
258
 
259
259
  Tạo block nếu integration:
260
260
  - Giới thiệu glossary term mới → row [NEW] trong Glossary
261
- - Giới thiệu shared entity mới (entity sẽ được dùng bởi 2+ component) → entity [NEW] với `Owner: C-XXX` (component đã carve trong integration này); component chưa carve → `Owner: TBD`, `/spec-sad` gán sau (xem two-phase cascade `conventions.md` §5.5)
262
- - Gán owner cho entity còn `Owner: TBD` (do pha mô tả seed) → entity [MODIFY Owner] `TBD → C-XXX`
263
- - Sửa định nghĩa entity hiện có → entity [MODIFY ...]
261
+ - Giới thiệu shared entity mới (entity sẽ được dùng bởi 2+ component) → entity [NEW] với heading `### E-XXX {Entity Name}` (auto-pick `E-XXX` next available — quy ước `domain-template.md`: max ID đã từng cấp trong `domain.md` + 1, quét cả heading lẫn Change History; ID không tái sử dụng) và `Owner: C-XXX` (component đã carve trong integration này); component chưa carve → `Owner: TBD`, `/spec-sad` gán sau (xem two-phase cascade `conventions.md` §5.5)
262
+ - Gán owner cho entity còn `Owner: TBD` (do pha mô tả seed) → entity [MODIFY Owner] `TBD → C-XXX` (giữ nguyên `E-XXX`)
263
+ - Sửa định nghĩa entity hiện có → entity [MODIFY ...] (giữ nguyên `E-XXX`)
264
+ - Remove entity → [REMOVE] kèm lý do — ID của entity đã remove vẫn giữ chỗ, không cấp lại
264
265
 
265
266
  **`sad.md`**
266
267
 
@@ -428,7 +428,7 @@ Component shared (vẫn còn feature khác dùng):
428
428
  - {term} [REMOVE] — unique to F-XXX, no other reference
429
429
 
430
430
  #### Shared Entities
431
- - {Entity} [REMOVE] — orphan after F-XXX removal, no other component owns
431
+ - E-XXX {Entity} [REMOVE] — orphan after F-XXX removal, no other component owns. ID `E-XXX` của entity đã remove **vẫn giữ chỗ** (ghi trong Change History) — không bao giờ cấp lại cho entity mới (quy ước `domain-template.md`)
432
432
 
433
433
  ## Out of Scope
434
434
  - {Migration của reverse-dep features tới alternative — separate integration nếu có}
@@ -154,8 +154,8 @@ Tổng hợp và viết draft `tech.md`:
154
154
  ### domain.md
155
155
 
156
156
  Đề xuất cập nhật nếu integration này:
157
- - Thay đổi shared entity (entity được dùng bởi 2+ component)
158
- - Thêm shared entity mới phát sinh từ thiết kế kỹ thuật
157
+ - Thay đổi shared entity (entity được dùng bởi 2+ component) — giữ nguyên `E-XXX` đã cấp
158
+ - Thêm shared entity mới phát sinh từ thiết kế kỹ thuật — heading `### E-XXX {Entity Name}`, cấp ID theo quy ước `domain-template.md`: max E-XXX đã từng cấp trong `domain.md` + 1 (quét cả heading lẫn Change History); ID không tái sử dụng
159
159
 
160
160
  ### component/{C-XXX}-{component-name}/cdd.md
161
161
 
@@ -550,6 +550,7 @@ Tạo hoặc cập nhật `.claude/ado.yaml` — file config ADO dùng chung cho
550
550
  - Thông tin project
551
551
  - Team members
552
552
  - Epic ticket
553
+ - Area / Iteration path
553
554
  - Môi trường
554
555
 
555
556
  **Bước 2 — Project:**
@@ -561,7 +562,9 @@ Tạo hoặc cập nhật `.claude/ado.yaml` — file config ADO dùng chung cho
561
562
 
562
563
  **Bước 4 — Epic Ticket:** Tạo Epic mới qua MCP (title được prefix `[{project_code}]`, assignee là PE đầu tiên) hoặc nhập ID ticket có sẵn (validate qua MCP: phải là type `Epic`). Lưu `id`, `title`, `url` vào config.
563
564
 
564
- **Bước 5 — Environments:** Collect danh sách môi trường (dev / stag / prod).
565
+ **Bước 5 — Area / Iteration Path:** (tùy chọn) Collect `area_path` `iteration_path` mặc định cho ticket. Bỏ qua nếu user không nhập → ADO dùng giá trị mặc định của team.
566
+
567
+ **Bước 6 — Environments:** Collect danh sách môi trường (dev / stag / prod).
565
568
 
566
569
  **Cuối:** Ghi `.claude/ado.yaml`, đảm bảo file không bị ignore bởi `.gitignore` (thêm `!.claude/ado.yaml` nếu `.claude/` đang bị ignore).
567
570
 
@@ -581,7 +584,7 @@ Tạo hoặc cập nhật `.claude/ado.yaml` — file config ADO dùng chung cho
581
584
 
582
585
  **Bước 4 — Preview:** Hiển thị kế hoạch đầy đủ (Feature và User Story sẽ tạo, skip list) trước khi tạo bất kỳ ticket nào. Chờ user confirm.
583
586
 
584
- **Bước 5-6 — Tạo tickets:**
587
+ **Bước 5-6 — Tạo tickets:** (set `areaPath`/`iterationPath` từ `ado.yaml` nếu có)
585
588
  - Feature ticket: type `Feature`, title `[{project_code}] [{feature_id}] {feature_name}`, description từ `frd.md`. Link parent → Epic ngay sau khi tạo.
586
589
  - User Story ticket: type `User Story`, title `[{project_code}] [{feature_name}] - {US-code} — {story_title}`, description gồm câu story + ACs. Link parent → Feature ngay sau khi tạo.
587
590
  - Nếu link parent fail → retry 1 lần → nếu vẫn fail: đánh dấu `orphan` (KHÔNG xóa ticket), báo cáo cuối.
@@ -119,7 +119,7 @@ Thường là update — thêm glossary term, thêm shared entity, sửa entity
119
119
  - Row [NEW]: `Refund — số tiền hoàn lại cho user sau khi order bị hủy`
120
120
 
121
121
  #### Shared Entities
122
- - Entity [NEW]: `Refund (Owner: C-005-refund-processor)` — { fields, relationships }
122
+ - Entity [NEW]: `E-XXX Refund (Owner: C-005-refund-processor)` — { fields, relationships } — E-XXX = next available trong domain.md (tuần tự theo thứ tự seed, không tái sử dụng — xem domain-template.md)
123
123
  -->
124
124
 
125
125
  ### sad.md *(bỏ nếu không có thay đổi)*
@@ -34,7 +34,12 @@ Entity ở mức vocabulary nghiệp vụ chung. Hai phần thông tin tới t
34
34
 
35
35
  Entity rõ ràng nội bộ một component (không phải vocabulary chung) không vào đây — chúng nằm trong `crd.md` của component đó.
36
36
 
37
- ### {Entity Name}
37
+ **Entity ID (`E-XXX`):** mỗi shared entity được cấp một ID tuần tự khi seed lần đầu, theo thứ tự được thêm vào file này.
38
+ - ID tiếp theo = **max ID đã từng cấp + 1** — quét cả heading hiện có **và** Change History (entity đã `[REMOVE]` vẫn giữ chỗ ID của nó).
39
+ - ID **không bao giờ tái sử dụng** và **không đánh lại** khi entity bị remove hoặc đổi tên.
40
+ - Reference từ artifact khác (frd/crd/spec/tech) dùng dạng `E-XXX {Entity Name}`.
41
+
42
+ ### E-XXX {Entity Name}
38
43
 
39
44
  **Owner:** `{C-XXX}-{component-name}` *(component sở hữu canonical definition; `TBD` nếu chưa carve — `/spec-sad` điền)*
40
45
 
@@ -155,6 +155,13 @@ Tham chiếu đến `.specs/main/component/{C-XXX}-...`.
155
155
  | --- | --- |
156
156
  | `{C-XXX}-{component-name}` | {component này phục vụ cái gì cho feature này} |
157
157
 
158
+ ## Open Questions
159
+
160
+ <!-- Các câu hỏi cần làm rõ trong interview / với stakeholder trước khi proceed.
161
+ Cũng dùng để note component candidate chưa carve (xem skills/spec-frd). Xóa section nếu không còn câu hỏi nào. -->
162
+
163
+ - [ ] {câu hỏi cần clarify} — {ai trả lời / khi nào}
164
+
158
165
  ## Change History
159
166
 
160
167
  Append-only log của các thay đổi cascade lên artifact này. Quy ước xem `conventions.md` §5.5.