@edupia-tutor/spec-driven-docs 0.14.3 → 0.14.5

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.
Files changed (82) hide show
  1. package/commands/debug.md +1 -0
  2. package/commands/define-product.md +70 -5
  3. package/commands/define-product.tmpl +33 -5
  4. package/commands/dev-gen-test.md +1 -0
  5. package/commands/dev-run-test.md +1 -0
  6. package/commands/dev-smoke-test.md +1 -0
  7. package/commands/fix-bug.md +1 -0
  8. package/commands/generate-bdd.md +15 -11
  9. package/commands/generate-bdd.tmpl +14 -11
  10. package/commands/generate-code.md +1 -0
  11. package/commands/generate-design-spec.md +1 -0
  12. package/commands/generate-prd.md +111 -10
  13. package/commands/generate-prd.tmpl +61 -7
  14. package/commands/generate-spec-manifest.md +1 -0
  15. package/commands/generate-tech-docs.md +1 -0
  16. package/commands/learn.md +1 -0
  17. package/commands/map-testids.md +1 -0
  18. package/commands/propose-scenario.md +1 -0
  19. package/commands/qc-analyze.md +1 -0
  20. package/commands/qc-design-test.md +1 -0
  21. package/commands/qc-plan.md +1 -0
  22. package/commands/qc-report.md +1 -0
  23. package/commands/qc-review.md +1 -0
  24. package/commands/qc-run-test.md +1 -0
  25. package/commands/refine-prd.md +172 -18
  26. package/commands/refine-prd.tmpl +114 -13
  27. package/commands/report-bug.md +1 -0
  28. package/commands/review-code.md +1 -0
  29. package/commands/review-context.md +22 -5
  30. package/commands/review-tech-docs.md +1 -0
  31. package/commands/setup-ai-first.md +1 -0
  32. package/commands/validate-traces.md +1 -0
  33. package/core/FRAMEWORK_VERSION +1 -1
  34. package/core/commands/debug.md +1 -0
  35. package/core/commands/define-product.md +70 -5
  36. package/core/commands/dev-gen-test.md +1 -0
  37. package/core/commands/dev-run-test.md +1 -0
  38. package/core/commands/dev-smoke-test.md +1 -0
  39. package/core/commands/fix-bug.md +1 -0
  40. package/core/commands/generate-bdd.md +15 -11
  41. package/core/commands/generate-code.md +1 -0
  42. package/core/commands/generate-design-spec.md +1 -0
  43. package/core/commands/generate-prd.md +111 -10
  44. package/core/commands/generate-spec-manifest.md +1 -0
  45. package/core/commands/generate-tech-docs.md +1 -0
  46. package/core/commands/learn.md +1 -0
  47. package/core/commands/map-testids.md +1 -0
  48. package/core/commands/propose-scenario.md +1 -0
  49. package/core/commands/qc-analyze.md +1 -0
  50. package/core/commands/qc-design-test.md +1 -0
  51. package/core/commands/qc-plan.md +1 -0
  52. package/core/commands/qc-report.md +1 -0
  53. package/core/commands/qc-review.md +1 -0
  54. package/core/commands/qc-run-test.md +1 -0
  55. package/core/commands/refine-prd.md +172 -18
  56. package/core/commands/report-bug.md +1 -0
  57. package/core/commands/review-code.md +1 -0
  58. package/core/commands/review-context.md +22 -5
  59. package/core/commands/review-tech-docs.md +1 -0
  60. package/core/commands/setup-ai-first.md +1 -0
  61. package/core/commands/validate-traces.md +1 -0
  62. package/core/skills/code/SKILL.md +1 -0
  63. package/core/skills/design-spec/SKILL.md +1 -0
  64. package/core/skills/prd/SKILL.md +14 -3
  65. package/core/skills/spec/SKILL.md +1 -0
  66. package/core/skills/test/SKILL.md +1 -0
  67. package/core/steps/business-language.md +36 -0
  68. package/core/steps/gate.md +1 -0
  69. package/core/steps/review-fanout.md +21 -5
  70. package/core/templates/prd.template.md +13 -3
  71. package/core/templates/product-definition.template.md +8 -1
  72. package/package.json +1 -1
  73. package/skills/code/SKILL.md +1 -0
  74. package/skills/design-spec/SKILL.md +1 -0
  75. package/skills/prd/SKILL.md +14 -3
  76. package/skills/spec/SKILL.md +1 -0
  77. package/skills/test/SKILL.md +1 -0
  78. package/steps/business-language.md +36 -0
  79. package/steps/gate.md +1 -0
  80. package/steps/review-fanout.md +21 -5
  81. package/templates/prd.template.md +13 -3
  82. package/templates/product-definition.template.md +8 -1
@@ -46,7 +46,7 @@
46
46
  | **Domain** | {domain} |
47
47
  | **Created** | {date} |
48
48
  | **Updated** | {date} |
49
- | **Jira Ticket** | [{TICKET}-{N}]({ticket_url}) |
49
+ | **Ticket** | {TICKET}-{N}{ — nếu PO có link tracker thật, thêm bên cạnh: `{TICKET}-{N} ([Jira]({tracker_url}))`} |
50
50
  | **API Source** | *(để trống nếu greenfield — chỉ điền `existing` khi PRD bọc một API đã chạy production)* |
51
51
 
52
52
  ---
@@ -76,13 +76,21 @@
76
76
  **Out of Scope** *(chỉ thêm khi có ranh giới cần nói rõ)*
77
77
  - {hạng mục ngoài phạm vi + lý do / chủ sở hữu}
78
78
 
79
+ ## c. Phụ thuộc liên service *(mức nghiệp vụ — KHÔNG mô tả API/event/kỹ thuật)*
80
+
81
+ > Kế thừa từ Product Definition Phase 1 ("Phụ thuộc liên service"). Nếu contract do đối tác phát triển song song (xem `API Source`), ghi phụ thuộc partner vào đây.
82
+
83
+ - {Cần {dữ liệu/năng lực} từ {feature/team/partner} — vì {lý do nghiệp vụ}} — hoặc "Không có"
84
+
79
85
  ---
80
86
 
81
87
  # 2. Acceptance Criteria
82
88
 
83
- **AC1:** {Tiêu chí nghiệm thu, văn xuôi, kiểm chứng được.}
89
+ > Mỗi AC kế thừa liên kết "Bắt nguồn từ BR" của Product Definition (Phase 6), remap sang BR ID của PRD. Vì BR ID đã chứa số UC nên ref BR truy ngược được tới đúng UC.
84
90
 
85
- **AC2:** {}
91
+ **AC1:** {Tiêu chí nghiệm thu, văn xuôi, kiểm chứng được.} _(BR: {TICKET}-{N}-UC{n}-BR{m})_
92
+
93
+ **AC2:** {…} _(BR: {TICKET}-{N}-UC{n}-BR{m})_
86
94
 
87
95
  ---
88
96
 
@@ -100,6 +108,8 @@
100
108
  **Post-condition:**
101
109
  - {kết quả sau 1}
102
110
 
111
+ **AC liên quan:** AC{x}, AC{y} *(các AC mà UC này thoả — phải đúng bằng tập AC có ref BR trỏ về UC này ở §2)*
112
+
103
113
  **Business Rule**
104
114
 
105
115
  | ID | Business Rule | Business Logic |
@@ -100,6 +100,13 @@
100
100
  | 1 | {hành động} | {trạng thái/kết quả nghiệp vụ} | {ghi chú} |
101
101
  | 2 | {hành động} | {trạng thái/kết quả nghiệp vụ} | {ghi chú} |
102
102
 
103
+ ### Màn hình & thành phần chính
104
+ > Mức nghiệp vụ — nguồn cho Wireframe PRD (§4b) và độ phủ BDD (C.1). KHÔNG pixel/layout/màu.
105
+
106
+ | Màn hình | Thành phần chính | Hành động → kết quả nghiệp vụ |
107
+ |----------|------------------|-------------------------------|
108
+ | {màn 1} | {thành phần} | {hành động → kết quả} |
109
+
103
110
  ### Điểm ra (Exit Point)
104
111
  {Kết quả cuối khi flow hoàn thành}
105
112
 
@@ -176,6 +183,6 @@
176
183
  <!--
177
184
  NEXT STEPS:
178
185
  Khi Product Definition hoàn tất (Status: completed), chạy:
179
- /generate-prd {path-to-this-file} --jira {TICKET-ID}
186
+ /generate-prd {path-to-this-file}
180
187
  để sinh PRD từ Product Definition này.
181
188
  -->
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edupia-tutor/spec-driven-docs",
3
- "version": "0.14.3",
3
+ "version": "0.14.5",
4
4
  "description": "AI-First Spec-Driven Development workflow framework for Claude Code",
5
5
  "bin": {
6
6
  "spec-driven-docs": "./bin/index.js"
@@ -28,6 +28,7 @@ Trước tiên, kiểm tra xem `$ARGUMENTS` có phải là payload JSON từ m
28
28
  - Đặt loaded context = `payload.context` (KHÔNG chạy context-loader.md)
29
29
  - Đặt phạm vi UC = `payload.uc_id` (chỉ xử lý UC này)
30
30
  - Đặt line range = `payload.uc_section` (chỉ đọc đúng section đó của PRD)
31
+ - Đặt dimension = `payload.dimension` nếu có (lệnh review per-UC: chỉ review đúng lăng kính này)
31
32
  - Đi thẳng tới phần logic riêng của lệnh.
32
33
  3. Nếu `$ARGUMENTS` không phải JSON hoặc không có `_agent_mode` → tiếp tục sang Bước 1 (chế độ thường).
33
34
 
@@ -31,6 +31,7 @@ Trước tiên, kiểm tra xem `$ARGUMENTS` có phải là payload JSON từ m
31
31
  - Đặt loaded context = `payload.context` (KHÔNG chạy context-loader.md)
32
32
  - Đặt phạm vi UC = `payload.uc_id` (chỉ xử lý UC này)
33
33
  - Đặt line range = `payload.uc_section` (chỉ đọc đúng section đó của PRD)
34
+ - Đặt dimension = `payload.dimension` nếu có (lệnh review per-UC: chỉ review đúng lăng kính này)
34
35
  - Đi thẳng tới phần logic riêng của lệnh.
35
36
  3. Nếu `$ARGUMENTS` không phải JSON hoặc không có `_agent_mode` → tiếp tục sang Bước 1 (chế độ thường).
36
37
 
@@ -28,6 +28,7 @@ Trước tiên, kiểm tra xem `$ARGUMENTS` có phải là payload JSON từ m
28
28
  - Đặt loaded context = `payload.context` (KHÔNG chạy context-loader.md)
29
29
  - Đặt phạm vi UC = `payload.uc_id` (chỉ xử lý UC này)
30
30
  - Đặt line range = `payload.uc_section` (chỉ đọc đúng section đó của PRD)
31
+ - Đặt dimension = `payload.dimension` nếu có (lệnh review per-UC: chỉ review đúng lăng kính này)
31
32
  - Đi thẳng tới phần logic riêng của lệnh.
32
33
  3. Nếu `$ARGUMENTS` không phải JSON hoặc không có `_agent_mode` → tiếp tục sang Bước 1 (chế độ thường).
33
34
 
@@ -186,7 +187,7 @@ Template (cấu trúc đầu ra — single-source từ `templates/prd.template.m
186
187
  | **Domain** | {domain} |
187
188
  | **Created** | {date} |
188
189
  | **Updated** | {date} |
189
- | **Jira Ticket** | [{TICKET}-{N}]({ticket_url}) |
190
+ | **Ticket** | {TICKET}-{N}{ — nếu PO có link tracker thật, thêm bên cạnh: `{TICKET}-{N} ([Jira]({tracker_url}))`} |
190
191
  | **API Source** | *(để trống nếu greenfield — chỉ điền `existing` khi PRD bọc một API đã chạy production)* |
191
192
 
192
193
  ---
@@ -216,13 +217,21 @@ Template (cấu trúc đầu ra — single-source từ `templates/prd.template.m
216
217
  **Out of Scope** *(chỉ thêm khi có ranh giới cần nói rõ)*
217
218
  - {hạng mục ngoài phạm vi + lý do / chủ sở hữu}
218
219
 
220
+ ## c. Phụ thuộc liên service *(mức nghiệp vụ — KHÔNG mô tả API/event/kỹ thuật)*
221
+
222
+ > Kế thừa từ Product Definition Phase 1 ("Phụ thuộc liên service"). Nếu contract do đối tác phát triển song song (xem `API Source`), ghi phụ thuộc partner vào đây.
223
+
224
+ - {Cần {dữ liệu/năng lực} từ {feature/team/partner} — vì {lý do nghiệp vụ}} — hoặc "Không có"
225
+
219
226
  ---
220
227
 
221
228
  # 2. Acceptance Criteria
222
229
 
223
- **AC1:** {Tiêu chí nghiệm thu, văn xuôi, kiểm chứng được.}
230
+ > Mỗi AC kế thừa liên kết "Bắt nguồn từ BR" của Product Definition (Phase 6), remap sang BR ID của PRD. Vì BR ID đã chứa số UC nên ref BR truy ngược được tới đúng UC.
224
231
 
225
- **AC2:** {}
232
+ **AC1:** {Tiêu chí nghiệm thu, văn xuôi, kiểm chứng được.} _(BR: {TICKET}-{N}-UC{n}-BR{m})_
233
+
234
+ **AC2:** {…} _(BR: {TICKET}-{N}-UC{n}-BR{m})_
226
235
 
227
236
  ---
228
237
 
@@ -240,6 +249,8 @@ Template (cấu trúc đầu ra — single-source từ `templates/prd.template.m
240
249
  **Post-condition:**
241
250
  - {kết quả sau 1}
242
251
 
252
+ **AC liên quan:** AC{x}, AC{y} *(các AC mà UC này thoả — phải đúng bằng tập AC có ref BR trỏ về UC này ở §2)*
253
+
243
254
  **Business Rule**
244
255
 
245
256
  | ID | Business Rule | Business Logic |
@@ -28,6 +28,7 @@ Trước tiên, kiểm tra xem `$ARGUMENTS` có phải là payload JSON từ m
28
28
  - Đặt loaded context = `payload.context` (KHÔNG chạy context-loader.md)
29
29
  - Đặt phạm vi UC = `payload.uc_id` (chỉ xử lý UC này)
30
30
  - Đặt line range = `payload.uc_section` (chỉ đọc đúng section đó của PRD)
31
+ - Đặt dimension = `payload.dimension` nếu có (lệnh review per-UC: chỉ review đúng lăng kính này)
31
32
  - Đi thẳng tới phần logic riêng của lệnh.
32
33
  3. Nếu `$ARGUMENTS` không phải JSON hoặc không có `_agent_mode` → tiếp tục sang Bước 1 (chế độ thường).
33
34
 
@@ -28,6 +28,7 @@ Trước tiên, kiểm tra xem `$ARGUMENTS` có phải là payload JSON từ m
28
28
  - Đặt loaded context = `payload.context` (KHÔNG chạy context-loader.md)
29
29
  - Đặt phạm vi UC = `payload.uc_id` (chỉ xử lý UC này)
30
30
  - Đặt line range = `payload.uc_section` (chỉ đọc đúng section đó của PRD)
31
+ - Đặt dimension = `payload.dimension` nếu có (lệnh review per-UC: chỉ review đúng lăng kính này)
31
32
  - Đi thẳng tới phần logic riêng của lệnh.
32
33
  3. Nếu `$ARGUMENTS` không phải JSON hoặc không có `_agent_mode` → tiếp tục sang Bước 1 (chế độ thường).
33
34
 
@@ -0,0 +1,36 @@
1
+ # Business Language Guard — chặn thuật ngữ kỹ thuật rò vào tài liệu nghiệp vụ
2
+
3
+ Tài liệu nghiệp vụ (PRD, product-definition) mô tả **WHAT** — chỉ ngôn ngữ nghiệp vụ. Guard này chạy **mỗi khi viết hoặc sửa** prose (gen mới, áp fix `--resume`, hiệu chỉnh): **quét và xử lý** các thuật ngữ kỹ thuật/UI phổ thông bên dưới **trước khi ghi**.
4
+
5
+ > Guard này là **baseline framework**, chạy **song song** với Banned Terms của `business-dictionary.md` (cơ chế dictionary giữ nguyên; project vẫn bổ sung term đặc thù vào đó). Khi cả hai cùng áp, ưu tiên bản chuẩn của dictionary nếu có.
6
+
7
+ ## Bản đồ xử lý (3 nhóm)
8
+
9
+ **Nhóm 1 — Tương tác/triển khai → DIỄN ĐẠT LẠI sang nghiệp vụ (giữ nguyên nghĩa):**
10
+
11
+ | Kỹ thuật/UI | Cách nói nghiệp vụ |
12
+ |---|---|
13
+ | re-render / render lại / reload / refresh (màn) | "hiển thị lại {tên màn}" |
14
+ | timeout | "quá thời gian chờ" |
15
+ | lỗi mạng / network error | "lỗi kết nối" |
16
+ | UI / giao diện (khi chỉ một màn) | "màn" / "màn hình" |
17
+ | click / tap | "bấm" / "chọn" |
18
+ | popup / modal (nếu chỉ là khái niệm hiển thị) | "hộp thoại" / "thông báo" |
19
+ | disable / enable (nút) | "khoá" / "mở" thao tác |
20
+ | redirect / navigate | "chuyển tới {màn}" |
21
+
22
+ **Nhóm 2 — Visual thuần → CHUYỂN Design Spec (bỏ khỏi PRD, ghi nhận lại):**
23
+ `spinner`, `loading indicator`, `animation`, `fade/slide`, màu sắc, font, layout pixel, micro-interaction → *"Chi tiết visual này thuộc Design Spec — ghi nhận để tạo Design Spec sau."*
24
+
25
+ **Nhóm 3 — Backend/contract thuần → BỎ khỏi PRD (thuộc Tech Docs):**
26
+ `API`, `endpoint`, `token/JWT`, `HTTP status`, tên class/bảng/cột DB, query, payload, header.
27
+ *(Ngoại lệ DUY NHẤT: Appendix "Existing API Contract" khi `API Source: existing` — xem Platform Strategy.)*
28
+
29
+ ## Quy tắc áp dụng
30
+ - Quét toàn bộ text sắp ghi (User Story, AC, BR, Business Logic, Scope, Edge Cases, Assumptions…).
31
+ - Nhóm 1 → thay tại chỗ, giữ nguyên nghĩa nghiệp vụ. **Đồng bộ cách diễn đạt** với chỗ đã có sẵn trong cùng tài liệu (vd nếu "quá thời gian chờ" đã dùng ở một BR → dùng nhất quán ở mọi nơi).
32
+ - Nhóm 2 → gỡ khỏi prose nghiệp vụ + nhắc chuyển Design Spec.
33
+ - Nhóm 3 → gỡ khỏi PRD (trừ ngoại lệ brownfield).
34
+ - Nếu term không có trong bản đồ nhưng rõ ràng là tên kỹ thuật/triển khai → vẫn diễn đạt lại theo tinh thần Nhóm 1, đừng để lọt.
35
+
36
+ **Checklist (dùng ở Quality Checklist của lệnh):** 0 thuật ngữ kỹ thuật/UI (re-render, UI, timeout, spinner, API/endpoint/token…) trong prose nghiệp vụ — đã diễn đạt lại (Nhóm 1) / chuyển Design Spec (Nhóm 2) / bỏ về Tech Docs (Nhóm 3).
package/steps/gate.md CHANGED
@@ -13,6 +13,7 @@ Trước tiên, kiểm tra xem `$ARGUMENTS` có phải là payload JSON từ m
13
13
  - Đặt loaded context = `payload.context` (KHÔNG chạy context-loader.md)
14
14
  - Đặt phạm vi UC = `payload.uc_id` (chỉ xử lý UC này)
15
15
  - Đặt line range = `payload.uc_section` (chỉ đọc đúng section đó của PRD)
16
+ - Đặt dimension = `payload.dimension` nếu có (lệnh review per-UC: chỉ review đúng lăng kính này)
16
17
  - Đi thẳng tới phần logic riêng của lệnh.
17
18
  3. Nếu `$ARGUMENTS` không phải JSON hoặc không có `_agent_mode` → tiếp tục sang Bước 1 (chế độ thường).
18
19
 
@@ -6,10 +6,12 @@ dừng ở mức "đủ" findings, nên mỗi vòng review sau lại lòi ra v
6
6
  fan out song song theo các chiều review, rồi lặp một critic độ-đầy-đủ cho tới khi một
7
7
  vòng không sinh thêm gì mới, *trước khi* ghi file findings.
8
8
 
9
- Lệnh gọi cung cấp hai thứ:
9
+ Lệnh gọi cung cấp hai thứ bắt buộc + hai tuỳ chọn:
10
10
  - **DIMENSIONS** — danh sách các chiều review để fan out
11
11
  (`/refine-prd` → 4 lăng kính; `/review-context` → các P-check hoặc B-check).
12
12
  - **FINDINGS SCHEMA** — dạng YAML mà mỗi finding phải theo (định nghĩa trong lệnh).
13
+ - **GRANULARITY** *(tuỳ chọn, mặc định `auto`)* — `auto`: chọn độ mịn fan-out theo bảng ngưỡng kích thước ở Phase 1 (hành vi cũ). `per-uc`: **LUÔN** fan-out theo từng UC, **bỏ qua ngưỡng** — dùng cho review cần độ đầy đủ cao (`/refine-prd` truyền cái này để lần đầu đã quét sâu). Lệnh không truyền → `auto` → hành vi không đổi.
14
+ - **CHANGED_SCOPE** *(tuỳ chọn)* — danh sách UC/section đã thay đổi (review **delta**). Nếu được truyền, Phase 1 chỉ fan-out trên các phạm vi này + PRD-global; Phase 2 critic vẫn quét **toàn doc** làm lưới an toàn. Không truyền → quét toàn bộ như thường.
13
15
 
14
16
  > **Bỏ qua ở chế độ sub-agent:** Nếu Gate Bước 0 đã set `_agent_mode: true`, toàn bộ
15
17
  > quy trình này bị **bỏ qua** — orchestrator đã chạy sẵn một dimension/UC cho mỗi
@@ -21,8 +23,11 @@ Lệnh gọi cung cấp hai thứ:
21
23
 
22
24
  **Bao nhiêu sub-agent:** *số lượng* agent không phải là đòn bẩy độ đầy đủ — bề rộng được
23
25
  cố định bởi taxonomy DIMENSION (thêm agent vào cùng một dimension chỉ tìm lại cùng vấn đề),
24
- còn *độ sâu* thuộc về vòng lặp critic ở Phase 2. Chọn **độ mịn fan-out**
25
- theo kích thước target, tái dùng ngưỡng của `steps/spawn-agent.md`:
26
+ còn *độ sâu* thuộc về vòng lặp critic ở Phase 2.
27
+
28
+ **Nếu `GRANULARITY = per-uc`:** **bỏ qua bảng ngưỡng dưới đây**, luôn dùng độ mịn **DIMENSION × phạm vi UC** (kể cả PRD nhỏ) — đảm bảo quét sâu, không bỏ sót ngay lần đầu. (Cái giá: nhiều agent hơn cho PRD nhỏ — chấp nhận để lần đầu đầy đủ.)
29
+
30
+ **Nếu `GRANULARITY = auto`** (mặc định): chọn **độ mịn fan-out** theo kích thước target, tái dùng ngưỡng của `steps/spawn-agent.md`:
26
31
 
27
32
  | Kích thước target | Độ mịn | Số agent |
28
33
  |-------------|-------------|-------------|
@@ -45,6 +50,7 @@ UC duy nhất — chính là điều ngăn bỏ sót trên các PRD lớn.
45
50
  agent). Giới hạn mỗi wave ở **`AGENT_CAP = 12`** agent và gom batch các phạm vi UC cho vừa:
46
51
 
47
52
  1. Dựng danh sách phạm vi = `[UC1, UC2, …, UCn, PRD-global]` (độ dài `UCs + 1`).
53
+ - **Nếu `CHANGED_SCOPE` được truyền (review delta):** danh sách phạm vi = `[các UC trong CHANGED_SCOPE] + [PRD-global]` (chỉ các UC đã đổi + global), KHÔNG phải tất cả UC. Số agent tụt theo đó.
48
54
  2. Tính số-phạm-vi-mỗi-bucket: `groups = max(1, floor(AGENT_CAP / dimensions))`.
49
55
  - Nếu `groups ≥ UCs + 1` → không cần batch, chạy một agent cho mỗi `DIMENSION × scope`.
50
56
  - Else chia danh sách phạm vi thành `groups` bucket liền kề kích thước xấp xỉ bằng nhau
@@ -86,10 +92,20 @@ Gom mảng findings của mọi sub-agent vào một danh sách hợp nhất `AL
86
92
  Đây là bước chống đập-chuột-chũi. Lặp cho tới khi **hai vòng liên tiếp thêm 0 finding
87
93
  mới**, hoặc tới cap cứng **3 vòng**, cái nào đến trước:
88
94
 
95
+ > **Lưu ý delta:** kể cả khi `CHANGED_SCOPE` giới hạn Phase 1 vào các UC đã đổi, completeness-critic ở Phase 2 **vẫn đọc TOÀN bộ doc** — đây là lưới an toàn bắt các vấn đề mà một fix ở UC đã đổi có thể làm lộ ra ở chỗ khác.
96
+
89
97
  1. Spawn một sub-agent **completeness-critic** bằng Agent tool. Cho nó:
90
98
  - toàn bộ target file (`{target_file}`),
91
- - danh sách `ALL_FINDINGS` hiện tại (để biết những đã được ghi nhận),
92
- - cùng context gọn đó.
99
+ - danh sách findings đã ghi nhận dưới dạng **slim JSON** chỉ 3 fields cốt lõi
100
+ đủ để critic nhận ra trùng lặp (không cần `quote`, `suggestion`, `auto_fixable`, `severity`):
101
+ ```json
102
+ [
103
+ { "uc_id": "...", "section": "...", "finding": "..." },
104
+ ...
105
+ ]
106
+ ```
107
+ Nếu `ALL_FINDINGS` vượt 60 items, rút gọn `finding` xuống còn 80 ký tự đầu mỗi item.
108
+ - cùng slim context (banned terms, canonical entities, layer order, domains).
93
109
  Prompt nó:
94
110
  ```
95
111
  Here is a document and a list of issues already found. Read the WHOLE document.
@@ -46,7 +46,7 @@
46
46
  | **Domain** | {domain} |
47
47
  | **Created** | {date} |
48
48
  | **Updated** | {date} |
49
- | **Jira Ticket** | [{TICKET}-{N}]({ticket_url}) |
49
+ | **Ticket** | {TICKET}-{N}{ — nếu PO có link tracker thật, thêm bên cạnh: `{TICKET}-{N} ([Jira]({tracker_url}))`} |
50
50
  | **API Source** | *(để trống nếu greenfield — chỉ điền `existing` khi PRD bọc một API đã chạy production)* |
51
51
 
52
52
  ---
@@ -76,13 +76,21 @@
76
76
  **Out of Scope** *(chỉ thêm khi có ranh giới cần nói rõ)*
77
77
  - {hạng mục ngoài phạm vi + lý do / chủ sở hữu}
78
78
 
79
+ ## c. Phụ thuộc liên service *(mức nghiệp vụ — KHÔNG mô tả API/event/kỹ thuật)*
80
+
81
+ > Kế thừa từ Product Definition Phase 1 ("Phụ thuộc liên service"). Nếu contract do đối tác phát triển song song (xem `API Source`), ghi phụ thuộc partner vào đây.
82
+
83
+ - {Cần {dữ liệu/năng lực} từ {feature/team/partner} — vì {lý do nghiệp vụ}} — hoặc "Không có"
84
+
79
85
  ---
80
86
 
81
87
  # 2. Acceptance Criteria
82
88
 
83
- **AC1:** {Tiêu chí nghiệm thu, văn xuôi, kiểm chứng được.}
89
+ > Mỗi AC kế thừa liên kết "Bắt nguồn từ BR" của Product Definition (Phase 6), remap sang BR ID của PRD. Vì BR ID đã chứa số UC nên ref BR truy ngược được tới đúng UC.
84
90
 
85
- **AC2:** {}
91
+ **AC1:** {Tiêu chí nghiệm thu, văn xuôi, kiểm chứng được.} _(BR: {TICKET}-{N}-UC{n}-BR{m})_
92
+
93
+ **AC2:** {…} _(BR: {TICKET}-{N}-UC{n}-BR{m})_
86
94
 
87
95
  ---
88
96
 
@@ -100,6 +108,8 @@
100
108
  **Post-condition:**
101
109
  - {kết quả sau 1}
102
110
 
111
+ **AC liên quan:** AC{x}, AC{y} *(các AC mà UC này thoả — phải đúng bằng tập AC có ref BR trỏ về UC này ở §2)*
112
+
103
113
  **Business Rule**
104
114
 
105
115
  | ID | Business Rule | Business Logic |
@@ -100,6 +100,13 @@
100
100
  | 1 | {hành động} | {trạng thái/kết quả nghiệp vụ} | {ghi chú} |
101
101
  | 2 | {hành động} | {trạng thái/kết quả nghiệp vụ} | {ghi chú} |
102
102
 
103
+ ### Màn hình & thành phần chính
104
+ > Mức nghiệp vụ — nguồn cho Wireframe PRD (§4b) và độ phủ BDD (C.1). KHÔNG pixel/layout/màu.
105
+
106
+ | Màn hình | Thành phần chính | Hành động → kết quả nghiệp vụ |
107
+ |----------|------------------|-------------------------------|
108
+ | {màn 1} | {thành phần} | {hành động → kết quả} |
109
+
103
110
  ### Điểm ra (Exit Point)
104
111
  {Kết quả cuối khi flow hoàn thành}
105
112
 
@@ -176,6 +183,6 @@
176
183
  <!--
177
184
  NEXT STEPS:
178
185
  Khi Product Definition hoàn tất (Status: completed), chạy:
179
- /generate-prd {path-to-this-file} --jira {TICKET-ID}
186
+ /generate-prd {path-to-this-file}
180
187
  để sinh PRD từ Product Definition này.
181
188
  -->