@educa-corp/sdd-framework 0.4.0 → 0.5.0

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 (158) hide show
  1. package/bin/build.js +9 -0
  2. package/bin/index.js +115 -4
  3. package/bin/self-check.js +354 -0
  4. package/bin/trace-schema.json +1199 -0
  5. package/commands/debug.md +19 -12
  6. package/commands/define-product.md +19 -12
  7. package/commands/dev-gen-test.md +53 -19
  8. package/commands/dev-run-test.md +55 -20
  9. package/commands/dev-run-test.tmpl +2 -1
  10. package/commands/dev-smoke-test.md +19 -12
  11. package/commands/extend-prd.md +907 -0
  12. package/commands/extend-prd.tmpl +270 -0
  13. package/commands/fix-bug.md +101 -15
  14. package/commands/fix-bug.tmpl +29 -3
  15. package/commands/generate-architecture.md +19 -12
  16. package/commands/generate-bdd.md +174 -48
  17. package/commands/generate-bdd.tmpl +107 -18
  18. package/commands/generate-code.md +122 -29
  19. package/commands/generate-code.tmpl +69 -10
  20. package/commands/generate-design-spec.md +19 -12
  21. package/commands/generate-prd.md +44 -12
  22. package/commands/generate-prd.tmpl +25 -0
  23. package/commands/generate-spec-manifest.md +19 -12
  24. package/commands/generate-tech-docs.md +22 -15
  25. package/commands/generate-tech-docs.tmpl +2 -2
  26. package/commands/learn.md +19 -12
  27. package/commands/map-testids.md +19 -12
  28. package/commands/propose-scenario.md +91 -15
  29. package/commands/propose-scenario.tmpl +72 -3
  30. package/commands/qc-analyze.md +19 -12
  31. package/commands/qc-design-test.md +20 -12
  32. package/commands/qc-design-test.tmpl +1 -0
  33. package/commands/qc-plan.md +19 -12
  34. package/commands/qc-report.md +19 -12
  35. package/commands/qc-review.md +19 -12
  36. package/commands/qc-run-test.md +88 -22
  37. package/commands/qc-run-test.tmpl +35 -3
  38. package/commands/refine-prd.md +19 -12
  39. package/commands/report-bug.md +19 -12
  40. package/commands/review-code.md +60 -14
  41. package/commands/review-code.tmpl +41 -2
  42. package/commands/review-context.md +62 -16
  43. package/commands/review-context.tmpl +43 -4
  44. package/commands/review-tech-docs.md +50 -14
  45. package/commands/review-tech-docs.tmpl +31 -2
  46. package/commands/setup-ai-first.md +26 -16
  47. package/commands/setup-ai-first.tmpl +7 -4
  48. package/commands/sync.md +43 -18
  49. package/commands/sync.tmpl +37 -14
  50. package/commands/update-framework.md +43 -4
  51. package/commands/update-framework.tmpl +37 -0
  52. package/commands/validate-traces.md +481 -49
  53. package/commands/validate-traces.tmpl +462 -37
  54. package/core/FRAMEWORK_VERSION +1 -1
  55. package/core/README.md +56 -0
  56. package/core/commands/debug.md +19 -12
  57. package/core/commands/define-product.md +19 -12
  58. package/core/commands/dev-gen-test.md +53 -19
  59. package/core/commands/dev-run-test.md +55 -20
  60. package/core/commands/dev-smoke-test.md +19 -12
  61. package/core/commands/extend-prd.md +907 -0
  62. package/core/commands/fix-bug.md +101 -15
  63. package/core/commands/generate-architecture.md +19 -12
  64. package/core/commands/generate-bdd.md +174 -48
  65. package/core/commands/generate-code.md +122 -29
  66. package/core/commands/generate-design-spec.md +19 -12
  67. package/core/commands/generate-prd.md +44 -12
  68. package/core/commands/generate-spec-manifest.md +19 -12
  69. package/core/commands/generate-tech-docs.md +22 -15
  70. package/core/commands/learn.md +19 -12
  71. package/core/commands/map-testids.md +19 -12
  72. package/core/commands/propose-scenario.md +91 -15
  73. package/core/commands/qc-analyze.md +19 -12
  74. package/core/commands/qc-design-test.md +20 -12
  75. package/core/commands/qc-plan.md +19 -12
  76. package/core/commands/qc-report.md +19 -12
  77. package/core/commands/qc-review.md +19 -12
  78. package/core/commands/qc-run-test.md +88 -22
  79. package/core/commands/refine-prd.md +19 -12
  80. package/core/commands/report-bug.md +19 -12
  81. package/core/commands/review-code.md +60 -14
  82. package/core/commands/review-context.md +62 -16
  83. package/core/commands/review-tech-docs.md +50 -14
  84. package/core/commands/setup-ai-first.md +26 -16
  85. package/core/commands/sync.md +43 -18
  86. package/core/commands/update-framework.md +43 -4
  87. package/core/commands/validate-traces.md +481 -49
  88. package/core/modules/android-compose/stack-profile.yaml +1 -1
  89. package/core/modules/flutter/stack-profile.yaml +1 -1
  90. package/core/modules/ios-swiftui/stack-profile.yaml +1 -1
  91. package/core/modules/java-spring/stack-profile.yaml +1 -1
  92. package/core/modules/nextjs/stack-profile.yaml +1 -1
  93. package/core/modules/nuxt/stack-profile.yaml +1 -1
  94. package/core/modules/phaser-game/stack-profile.yaml +1 -1
  95. package/core/modules/php-laravel/stack-profile.yaml +1 -1
  96. package/core/modules/qc-playwright/stack-profile.yaml +1 -1
  97. package/core/modules/react/stack-profile.yaml +1 -1
  98. package/core/modules/react-native/stack-profile.yaml +1 -1
  99. package/core/modules/vue/stack-profile.yaml +1 -1
  100. package/core/rules/workflow.md +29 -0
  101. package/core/steps/gate.md +13 -8
  102. package/core/steps/report-footer.md +6 -4
  103. package/core/steps/trace-mirror.md +34 -7
  104. package/core/templates/README.md +47 -0
  105. package/core/templates/feature.template +14 -11
  106. package/core/templates/project-context.yaml +26 -14
  107. package/core/templates/tech-design.template.md +1 -1
  108. package/docs/01-getting-started/installation.md +18 -1
  109. package/docs/01-getting-started/what-is-sdd.md +4 -2
  110. package/docs/02-concepts/architecture.md +27 -3
  111. package/docs/02-concepts/pipeline-steps/02-specification.md +39 -3
  112. package/docs/02-concepts/pipeline-steps/04-bdd.md +24 -2
  113. package/docs/02-concepts/pipeline-steps/05-tech-docs.md +18 -1
  114. package/docs/02-concepts/pipeline-steps/06-code.md +35 -4
  115. package/docs/02-concepts/pipeline-steps/09-validate-traces.md +137 -12
  116. package/docs/02-concepts/pipeline-steps/10-feedback-loop.md +59 -3
  117. package/docs/02-concepts/roles-and-hitl.md +1 -1
  118. package/docs/02-concepts/traceability.md +126 -94
  119. package/docs/03-guides/developer.md +20 -4
  120. package/docs/03-guides/product-owner.md +72 -68
  121. package/docs/03-guides/tester-qa.md +81 -70
  122. package/docs/04-reference/commands.md +134 -105
  123. package/docs/04-reference/configuration.md +146 -94
  124. package/docs/04-reference/trace-schema.md +145 -37
  125. package/docs/explain/02-generate-prd.md +80 -78
  126. package/docs/explain/02b-extend-prd.md +125 -0
  127. package/docs/explain/03-refine-prd.md +86 -86
  128. package/docs/explain/04-review-context.md +18 -1
  129. package/docs/explain/06-generate-bdd.md +23 -0
  130. package/docs/explain/08-review-tech-docs.md +20 -5
  131. package/docs/explain/10-review-code.md +36 -2
  132. package/docs/explain/19-qc-run-test.md +87 -67
  133. package/docs/explain/21-validate-traces.md +74 -68
  134. package/docs/explain/23-fix-bug.md +19 -3
  135. package/docs/explain/26-propose-scenario.md +70 -63
  136. package/docs/explain/README.md +135 -134
  137. package/modules/android-compose/stack-profile.yaml +1 -1
  138. package/modules/flutter/stack-profile.yaml +1 -1
  139. package/modules/ios-swiftui/stack-profile.yaml +1 -1
  140. package/modules/java-spring/stack-profile.yaml +1 -1
  141. package/modules/nextjs/stack-profile.yaml +1 -1
  142. package/modules/nuxt/stack-profile.yaml +1 -1
  143. package/modules/phaser-game/stack-profile.yaml +1 -1
  144. package/modules/php-laravel/stack-profile.yaml +1 -1
  145. package/modules/qc-playwright/stack-profile.yaml +1 -1
  146. package/modules/react/stack-profile.yaml +1 -1
  147. package/modules/react-native/stack-profile.yaml +1 -1
  148. package/modules/vue/stack-profile.yaml +1 -1
  149. package/package.json +5 -4
  150. package/rules/workflow.md +29 -0
  151. package/scripts/migrate-bdd-platform.js +286 -0
  152. package/steps/gate.md +13 -8
  153. package/steps/report-footer.md +6 -4
  154. package/steps/trace-mirror.md +34 -7
  155. package/templates/README.md +47 -0
  156. package/templates/feature.template +14 -11
  157. package/templates/project-context.yaml +26 -14
  158. package/templates/tech-design.template.md +1 -1
@@ -54,7 +54,16 @@ Ghi vào `{paths.prd_change_requests_dir}/{UC-ID}-{slug}.md` (phân giải về
54
54
 
55
55
  **Requested behavior:** {description}
56
56
  **Suggested AC (draft cho PO):** "{draft AC text}"
57
- **Route to PO:** thêm/mở rộng một AC trong {prd_path} → `/refine-prd` → chạy lại `/generate-bdd` → dev `/generate-code`.
57
+ **Route to PO:**
58
+ 1. Đặt `Status: accepted` trong file này nếu nhận yêu cầu.
59
+ 2. Chạy **`/extend-prd {prd_path}`** — nó tự nhặt request `accepted`, hỏi PO chốt AC/BR đúng
60
+ tầng, đánh số **nối tiếp** (không đụng ID cũ), bump version + ghi changelog nêu rõ scope,
61
+ rồi đóng dấu `incorporated` + chuyển file này sang `archived/`.
62
+ 3. `/refine-prd` → `/review-context` → PO đặt `approved` → `/generate-bdd` **chỉ cho UC MỚI**.
63
+
64
+ ⚠️ **KHÔNG dùng `/refine-prd` để thêm AC mới.** Nó chỉ áp findings từ review và có luật cấm
65
+ đụng section nào không được finding tham chiếu. **KHÔNG dùng `/generate-prd`** — nó từ chối
66
+ chạy trên PRD đã có (ghi đè sẽ mất changelog + đánh số lại BR).
58
67
  ```
59
68
  Rồi sang Step 5 (handoff áp dụng cho file này luôn). Skip Step 3–4 (không có BDD scenario cho Case B).
60
69
 
@@ -64,8 +73,21 @@ Nếu không chắc case nào → hiện danh sách AC và hỏi tester nó map
64
73
 
65
74
  Viết Gherkin nhất quán với convention của `/generate-bdd` cho `active_platform`:
66
75
  - Dùng vocabulary platform (web: clicks/sees; app: taps/sees; system: business event)
67
- - Gồm tag `@trace`: `@trace.uc={UC-ID}`, `@trace.ac={AC-N}`, cùng `@proposed @from-test`
68
76
  - Một scenario tập trung; Given/When/Then cụ thể; không chi tiết implementation
77
+ - **Dùng ĐÚNG bộ tag canonical của `.feature`** (giống `templates/feature.template`) — vì scenario này sẽ được `/generate-bdd` chèn thẳng vào BDD canonical:
78
+
79
+ ```gherkin
80
+ # Side-effects: {liệt kê side-effect quan sát được, hoặc "—"}
81
+ # @trace.scenario: {UC-ID}-SC? ← "?" = số do /generate-bdd gán lúc chèn (tester không biết số kế tiếp)
82
+ # @trace.sc_version: 1.0
83
+ # @trace.business_rules: {BR-ID nếu xác định được, else —}
84
+ # Covers: AC{N} ← comment thường, KHÔNG phải @trace (AC không phải trace key)
85
+ # Nguồn: proposal {file} · {BUG-ID nếu có}
86
+ @proposed @from-test @edge
87
+ Scenario: {business outcome}
88
+ ```
89
+
90
+ > **KHÔNG dùng `@trace.uc=` / `@trace.ac=`.** Hai key đó không tồn tại trong contract `.feature` ở bất kỳ đâu khác — scenario mang chúng mà thiếu `@trace.scenario`/`@trace.sc_version` sẽ **không sinh được row trace** khi vào `.feature`: không có `sc_id`, không có `spec_ver`, nên vô hình với toàn bộ coverage/drift. Số UC đã nằm sẵn trong `sc_id`.
69
91
 
70
92
  ## Step 4 — Ghi Proposal
71
93
 
@@ -104,6 +126,14 @@ git push # → PO/Dev thấy nó ở lần /sync tiếp the
104
126
 
105
127
  {{include:steps/report-footer.md}}
106
128
 
129
+ > **Hai khối report — chọn theo case đã chốt ở Step 2. In ĐÚNG MỘT khối.**
130
+ > Case A và Case B tạo ra hai loại artifact khác nhau, ở hai thư mục khác nhau, và đi hai
131
+ > đường xử lý khác nhau. In khối Case A cho một request Case B là báo cáo sai việc vừa làm:
132
+ > nó chỉ sai thư mục, in một scenario không tồn tại, và bảo người dùng chờ `/generate-bdd`
133
+ > nhặt — trong khi lệnh đó **không bao giờ** đọc `prd-change-requests/`.
134
+
135
+ ### Khối Case A — scenario proposal *(behavior nằm trong một AC có sẵn)*
136
+
107
137
  ```
108
138
  📝 Scenario proposal → {paths.bdd_proposals_dir}/{UC-ID}-{slug}.md
109
139
 
@@ -112,7 +142,12 @@ Maps to AC : {AC-N} — "{AC text}"
112
142
  Source : {BUG-ID nếu có | quan sát tester}
113
143
 
114
144
  Scenario đề xuất (DRAFT — chờ PO/Dev review):
115
- @proposed @from-test @trace.uc={UC-ID} @trace.ac={AC-N}
145
+ # Side-effects: {}
146
+ # @trace.scenario: {UC-ID}-SC?
147
+ # @trace.sc_version: 1.0
148
+ # @trace.business_rules: {BR-ID | —}
149
+ # Covers: AC{N}
150
+ @proposed @from-test @edge
116
151
  Scenario: {title}
117
152
  Given {…}
118
153
  When {…}
@@ -131,3 +166,37 @@ Status : ✅ Complete (read-only trên BDD canonical — chỉ proposal)
131
166
  Output Artifacts: created {paths.bdd_proposals_dir}/{UC-ID}-{slug}.md (pushed to shared spec repo)
132
167
  Next : PO/Dev thấy nó ở lần /sync tiếp theo → review & promote
133
168
  ```
169
+
170
+ ### Khối Case B — PRD change request *(requirement mới, không AC nào phủ)*
171
+
172
+ ```
173
+ 📋 PRD change request → {paths.prd_change_requests_dir}/{UC-ID}-{slug}.md
174
+
175
+ UC : {UC-ID} ({active_platform})
176
+ Loại : requirement MỚI — không AC nào phủ (KHÔNG phải coverage gap)
177
+ PRD : {prd_path} (v{prd_version})
178
+ Source : {BUG-ID nếu có | quan sát tester/QC}
179
+ Behavior : {description}
180
+ Draft AC : "{draft AC text}" ← đề xuất cho PO cân nhắc, PO chốt lại
181
+
182
+ ⚠️ Lệnh này KHÔNG sinh BDD scenario nào — scenario chưa có AC để trace tới.
183
+ Nó chỉ xuất hiện SAU KHI PO đưa requirement vào PRD rồi chạy lại /generate-bdd.
184
+ Và vì chưa có AC, KHÔNG cờ trace nào bắt được thiếu sót này: theo mọi thước đo
185
+ coverage hiện tại thì hành vi bạn vừa phát hiện không tồn tại.
186
+
187
+ Để PO xử lý:
188
+ [ ] Đọc request, quyết định nhận hay không
189
+ [ ] Nhận → đặt Status: accepted trong file request
190
+ [ ] /extend-prd {prd-file} ← nhặt request, chốt AC/BR với PO, đánh số nối tiếp,
191
+ bump version + changelog, tự đóng dấu incorporated
192
+ [ ] /refine-prd → /review-context {prd-file} ← soi + kiểm phần vừa thêm
193
+ [ ] PO đặt Status: approved → /generate-bdd {prd-file} (CHỈ UC mới) → /generate-code
194
+
195
+ Handoff : {✅ committed + pushed to spec repo | ⚠️ chạy git command ở trên / mở PR}
196
+
197
+ ---
198
+ Status : ✅ Complete (không đụng BDD — đây là yêu cầu đổi tài liệu, không phải scenario)
199
+ Output Artifacts: created {paths.prd_change_requests_dir}/{UC-ID}-{slug}.md (pushed to shared spec repo)
200
+ Next : PO thấy nó ở lần /sync tiếp theo. Nếu chưa xử, /validate-traces sẽ nhắc lại
201
+ (kèm số ngày chờ) mỗi lần chạy, chừng nào Status còn Open.
202
+ ```
@@ -40,23 +40,23 @@ Hiển thị và chờ phản hồi:
40
40
  ```
41
41
  ⚙️ MODEL CHECK
42
42
  ──────────────────────────────────────────────────────────────────
43
- Recommended : claude-opus-4 (hoặc model Opus mới nhất)
43
+ Recommended : model Opus mới nhất
44
44
  Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
45
- suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
45
+ suy luận sâu. Model nhỏ hơn (Haiku/Sonnet) dễ bỏ sót edge case.
46
46
 
47
47
  Cách đổi trong Claude Code:
48
- SettingsModel chọn "claude-opus"
49
- • hoặc: /modelchọn claude-opus
48
+ /modelchọn model Opus
49
+ • hoặc: SettingsModel
50
50
 
51
- Đang chạy claude-opus?
52
- Y — đúng, đang dùng claude-opus → tiếp tục
51
+ Đang chạy một model Opus?
52
+ Y — đúng → tiếp tục
53
53
  S — bỏ qua kiểm tra (tôi chấp nhận rủi ro chất lượng thấp hơn với model hiện tại)
54
54
  ──────────────────────────────────────────────────────────────────
55
55
  ```
56
56
 
57
57
  - "Y" → tiếp tục sang Bước 1.
58
58
  - "S" → tiếp tục sang Bước 1 (người dùng chấp nhận rủi ro, thêm ⚠️ vào report cuối).
59
- - "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang claude-opus rồi chạy lại lệnh này."
59
+ - "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang một model Opus (`/model`) rồi chạy lại lệnh này."
60
60
 
61
61
  ## Bước 1 — Xác định Target File
62
62
 
@@ -65,7 +65,12 @@ Hiển thị và chờ phản hồi:
65
65
  2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có path) → phân giải thành file bằng cách glob theo bố cục feature-package. `{prd-slug}` lúc này **chưa biết**, nên dùng wildcard `*` cho segment đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
66
66
  - **Lệnh BDD** (target là `.feature`): `{specs_dir}/{domain}/*/bdd/**/{UC-ID}*.feature` — hoặc `{specs_dir}/*/*/bdd/**/{UC-ID}*.feature` nếu domain cũng chưa biết. Nếu lệnh ngụ ý một platform/scope cụ thể (vd: system tech-doc cần BDD `system/`), ưu tiên kết quả trong thư mục con platform đó.
67
67
  - **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
68
- - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
68
+ - **Lệnh tech-docs** — target là tech-doc **gộp cấp PRD** `{TICKET-ID}-tech-design.md` (MỘT doc phủ nhiều UC; danh sách UC nằm ở `@trace.ucs`). Vì tên file mang `{TICKET-ID}` chứ **không** mang `{UC-ID}`, phải tách trước khi glob:
69
+ - `$ARGUMENTS` là **UC-ID** (`{TICKET-ID}-UC{N}`) → lấy `{TICKET-ID}` = phần **trước** `-UC`, rồi glob `{specs_dir}/{domain}/*/tech-docs/{TICKET-ID}-tech-design.md`.
70
+ - `$ARGUMENTS` là **TICKET-ID** → glob trực tiếp như trên.
71
+ - Chưa biết domain → `{specs_dir}/*/*/tech-docs/{TICKET-ID}-tech-design.md`.
72
+ - Vẫn không khớp → glob rộng `{specs_dir}/*/*/tech-docs/*tech-design*.md` rồi liệt kê để người dùng chọn.
73
+ *(Đừng glob `{UC-ID}*-tech-design*.md` — nó nở thành `FT-001-UC1*-tech-design*.md` và **không bao giờ** khớp `FT-001-tech-design.md`.)*
69
74
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
70
75
 
71
76
  Khi một file khớp: đặt nó làm target **và** ghi lại `domain` + `prd_slug` từ path của nó (theo quy tắc trích xuất trong `context-loader.md` Bước 1 — `prd_slug` = segment đầu tiên sau `{specs_dir}/{domain}/`). Mọi path mà lệnh đọc/ghi về sau (BDD/tech-docs/design-spec/trace cùng cấp) đều dùng **`prd_slug` đã phân giải đó**, nên tất cả artifact nằm chung một feature package. Nếu nhiều file khớp (vd: nhiều platform), chọn theo platform/scope của lệnh hoặc liệt kê ra và hỏi.
@@ -610,7 +615,7 @@ Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **pha
610
615
  | Phase | Commands |
611
616
  |-------|----------|
612
617
  | Discovery | `/define-product` |
613
- | PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
618
+ | PRD | `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` (PRD) |
614
619
  | Design Spec | `/generate-design-spec` |
615
620
  | BDD | `/generate-bdd` · `/review-context` (BDD) |
616
621
  | Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
@@ -635,6 +640,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
635
640
  | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
636
641
  | /define-product | `/generate-prd {product-definition-file}` |
637
642
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
643
+ | /extend-prd | `/refine-prd {prd-file}` (soi phần vừa thêm) rồi `/review-context {prd-file}` → PO duyệt → `/generate-bdd` **chỉ cho UC MỚI**; UC cũ dùng `/validate-traces --realign-prd-version {UC-ID}` |
638
644
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
639
645
  | /review-context (PRD) | Khi 0 critical → PO đặt `Status: approved`, rồi FE/App: `/generate-design-spec {prd-file}` (→ design sign-off → BDD); BE: `/generate-bdd {prd-file}`. Còn critical/NEEDS_FIX → sửa PRD (giữ draft) |
640
646
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
@@ -647,6 +653,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
647
653
  | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
648
654
  | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
649
655
  | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
656
+ | /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
650
657
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
651
658
  | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
652
659
  | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
@@ -655,11 +662,11 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
655
662
  | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
656
663
  | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
657
664
  | /dev-smoke-test | Tạo PR và link tới ticket |
658
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK tạo PR |
659
- | /fix-bug | Tạo PR link tới ticket |
665
+ | /validate-traces | **Cờ 🔴 trước (chặn PR):** SEAM_UNWIRED → nối binding sang class thật, xoá/thay stub · STUB_UNRESOLVED → `/generate-code {owner_uc}` (lấp logic tại chỗ + xoá hàm song song) · ORPHANED/TRACE_ORPHAN → quyết định thủ công (xoá code+test, đưa scenario trở lại `.feature`, hoặc sửa `sc_id` của tag). **Rồi:** DRIFT/UNTRACKED → `/generate-code {UC-ID}` · BDD_DRIFT → `/generate-code {feature-file}` · tech-doc lỗi thời vs BDD → `/generate-tech-docs` → `/review-tech-docs` · PRD drift → `/generate-bdd {prd-file}` · GAP → `/dev-gen-test {UC-ID}`. **Chỉ tạo PR khi mọi cờ 🔴 = 0** |
666
+ | /fix-bug | `/dev-run-test {UC-ID}` (dev_selftest vừa reset về not_run) → tạo PR; nếu fix một `{BUG-ID}` → QC chạy `/qc-run-test {UC-ID}` để verify + đóng bug |
660
667
  | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
661
668
  | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
662
- | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
669
+ | /propose-scenario | **Case A** (thiếu scenario cho AC có sẵn) → báo PO/Dev review trong `feedback/bdd-proposals/`; `/generate-bdd` tự chèn khi `Status: accepted`. **Case B** (requirement mới) → `feedback/prd-change-requests/` — PO phải đưa vào PRD trước, KHÔNG tự vào BDD được; `/validate-traces` nhắc lại kèm số ngày chờ chừng nào `Status: Open` |
663
670
  | /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
664
671
  | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
665
672
  | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
@@ -40,23 +40,23 @@ Hiển thị và chờ phản hồi:
40
40
  ```
41
41
  ⚙️ MODEL CHECK
42
42
  ──────────────────────────────────────────────────────────────────
43
- Recommended : claude-opus-4 (hoặc model Opus mới nhất)
43
+ Recommended : model Opus mới nhất
44
44
  Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
45
- suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
45
+ suy luận sâu. Model nhỏ hơn (Haiku/Sonnet) dễ bỏ sót edge case.
46
46
 
47
47
  Cách đổi trong Claude Code:
48
- SettingsModel chọn "claude-opus"
49
- • hoặc: /modelchọn claude-opus
48
+ /modelchọn model Opus
49
+ • hoặc: SettingsModel
50
50
 
51
- Đang chạy claude-opus?
52
- Y — đúng, đang dùng claude-opus → tiếp tục
51
+ Đang chạy một model Opus?
52
+ Y — đúng → tiếp tục
53
53
  S — bỏ qua kiểm tra (tôi chấp nhận rủi ro chất lượng thấp hơn với model hiện tại)
54
54
  ──────────────────────────────────────────────────────────────────
55
55
  ```
56
56
 
57
57
  - "Y" → tiếp tục sang Bước 1.
58
58
  - "S" → tiếp tục sang Bước 1 (người dùng chấp nhận rủi ro, thêm ⚠️ vào report cuối).
59
- - "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang claude-opus rồi chạy lại lệnh này."
59
+ - "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang một model Opus (`/model`) rồi chạy lại lệnh này."
60
60
 
61
61
  ## Bước 1 — Xác định Target File
62
62
 
@@ -65,7 +65,12 @@ Hiển thị và chờ phản hồi:
65
65
  2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có path) → phân giải thành file bằng cách glob theo bố cục feature-package. `{prd-slug}` lúc này **chưa biết**, nên dùng wildcard `*` cho segment đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
66
66
  - **Lệnh BDD** (target là `.feature`): `{specs_dir}/{domain}/*/bdd/**/{UC-ID}*.feature` — hoặc `{specs_dir}/*/*/bdd/**/{UC-ID}*.feature` nếu domain cũng chưa biết. Nếu lệnh ngụ ý một platform/scope cụ thể (vd: system tech-doc cần BDD `system/`), ưu tiên kết quả trong thư mục con platform đó.
67
67
  - **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
68
- - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
68
+ - **Lệnh tech-docs** — target là tech-doc **gộp cấp PRD** `{TICKET-ID}-tech-design.md` (MỘT doc phủ nhiều UC; danh sách UC nằm ở `@trace.ucs`). Vì tên file mang `{TICKET-ID}` chứ **không** mang `{UC-ID}`, phải tách trước khi glob:
69
+ - `$ARGUMENTS` là **UC-ID** (`{TICKET-ID}-UC{N}`) → lấy `{TICKET-ID}` = phần **trước** `-UC`, rồi glob `{specs_dir}/{domain}/*/tech-docs/{TICKET-ID}-tech-design.md`.
70
+ - `$ARGUMENTS` là **TICKET-ID** → glob trực tiếp như trên.
71
+ - Chưa biết domain → `{specs_dir}/*/*/tech-docs/{TICKET-ID}-tech-design.md`.
72
+ - Vẫn không khớp → glob rộng `{specs_dir}/*/*/tech-docs/*tech-design*.md` rồi liệt kê để người dùng chọn.
73
+ *(Đừng glob `{UC-ID}*-tech-design*.md` — nó nở thành `FT-001-UC1*-tech-design*.md` và **không bao giờ** khớp `FT-001-tech-design.md`.)*
69
74
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
70
75
 
71
76
  Khi một file khớp: đặt nó làm target **và** ghi lại `domain` + `prd_slug` từ path của nó (theo quy tắc trích xuất trong `context-loader.md` Bước 1 — `prd_slug` = segment đầu tiên sau `{specs_dir}/{domain}/`). Mọi path mà lệnh đọc/ghi về sau (BDD/tech-docs/design-spec/trace cùng cấp) đều dùng **`prd_slug` đã phân giải đó**, nên tất cả artifact nằm chung một feature package. Nếu nhiều file khớp (vd: nhiều platform), chọn theo platform/scope của lệnh hoặc liệt kê ra và hỏi.
@@ -517,6 +522,7 @@ qc-review. Bạn **không** viết Python.
517
522
  - Priority `P0/P1/P2`; Tags (`smoke regression happy-path negative ui …`); Status `Draft → In Progress → Pass/Fail/Skip`.
518
523
  - Một TC bị block bởi gap vẫn được viết + đánh dấu `🚫 Block: GAP-xx`.
519
524
  - **Tham chiếu test-id, không phải gợi ý hình ảnh.** Với mỗi step GUI tác động lên một element, trích test-id ổn định từ bảng §4.5.6 của tech-doc gộp (vd "click `ft001-login-submit-btn`") để qc-run-test dựng locator từ contract. Nếu một element có action không có test-id trong §4.5.6, ghi chú lại (qc-run-test sẽ fallback về locator role/text chậm hơn).
525
+ - **Ghi `@trace.testid_attr` vào đầu `.Test.md`.** Đọc field này từ header tech-doc gộp (do `/map-testids` ghi) và ghi lại một dòng ở phần metadata của file test-case: `Test-ID attribute: {attr}`. Lý do: §4.5.6 chỉ cho **giá trị** test-id, còn đây là **tên thuộc tính** chứa chúng — `/qc-run-test` cần nó để cấu hình locator, và `/qc-review` cần nó để biết selector trong script có đúng contract không. Thiếu field trong tech-doc → ghi `Test-ID attribute: — (thiếu @trace.testid_attr, chạy /map-testids)` thay vì bỏ trống hoặc tự đoán.
520
526
  - Cuối file: Trace matrix + bảng TC bị block.
521
527
 
522
528
  ## Trace mapping (bắt buộc)
@@ -568,7 +574,7 @@ Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **pha
568
574
  | Phase | Commands |
569
575
  |-------|----------|
570
576
  | Discovery | `/define-product` |
571
- | PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
577
+ | PRD | `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` (PRD) |
572
578
  | Design Spec | `/generate-design-spec` |
573
579
  | BDD | `/generate-bdd` · `/review-context` (BDD) |
574
580
  | Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
@@ -593,6 +599,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
593
599
  | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
594
600
  | /define-product | `/generate-prd {product-definition-file}` |
595
601
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
602
+ | /extend-prd | `/refine-prd {prd-file}` (soi phần vừa thêm) rồi `/review-context {prd-file}` → PO duyệt → `/generate-bdd` **chỉ cho UC MỚI**; UC cũ dùng `/validate-traces --realign-prd-version {UC-ID}` |
596
603
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
597
604
  | /review-context (PRD) | Khi 0 critical → PO đặt `Status: approved`, rồi FE/App: `/generate-design-spec {prd-file}` (→ design sign-off → BDD); BE: `/generate-bdd {prd-file}`. Còn critical/NEEDS_FIX → sửa PRD (giữ draft) |
598
605
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
@@ -605,6 +612,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
605
612
  | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
606
613
  | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
607
614
  | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
615
+ | /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
608
616
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
609
617
  | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
610
618
  | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
@@ -613,11 +621,11 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
613
621
  | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
614
622
  | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
615
623
  | /dev-smoke-test | Tạo PR và link tới ticket |
616
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK tạo PR |
617
- | /fix-bug | Tạo PR link tới ticket |
624
+ | /validate-traces | **Cờ 🔴 trước (chặn PR):** SEAM_UNWIRED → nối binding sang class thật, xoá/thay stub · STUB_UNRESOLVED → `/generate-code {owner_uc}` (lấp logic tại chỗ + xoá hàm song song) · ORPHANED/TRACE_ORPHAN → quyết định thủ công (xoá code+test, đưa scenario trở lại `.feature`, hoặc sửa `sc_id` của tag). **Rồi:** DRIFT/UNTRACKED → `/generate-code {UC-ID}` · BDD_DRIFT → `/generate-code {feature-file}` · tech-doc lỗi thời vs BDD → `/generate-tech-docs` → `/review-tech-docs` · PRD drift → `/generate-bdd {prd-file}` · GAP → `/dev-gen-test {UC-ID}`. **Chỉ tạo PR khi mọi cờ 🔴 = 0** |
625
+ | /fix-bug | `/dev-run-test {UC-ID}` (dev_selftest vừa reset về not_run) → tạo PR; nếu fix một `{BUG-ID}` → QC chạy `/qc-run-test {UC-ID}` để verify + đóng bug |
618
626
  | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
619
627
  | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
620
- | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
628
+ | /propose-scenario | **Case A** (thiếu scenario cho AC có sẵn) → báo PO/Dev review trong `feedback/bdd-proposals/`; `/generate-bdd` tự chèn khi `Status: accepted`. **Case B** (requirement mới) → `feedback/prd-change-requests/` — PO phải đưa vào PRD trước, KHÔNG tự vào BDD được; `/validate-traces` nhắc lại kèm số ngày chờ chừng nào `Status: Open` |
621
629
  | /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
622
630
  | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
623
631
  | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
@@ -43,6 +43,7 @@ qc-review. Bạn **không** viết Python.
43
43
  - Priority `P0/P1/P2`; Tags (`smoke regression happy-path negative ui …`); Status `Draft → In Progress → Pass/Fail/Skip`.
44
44
  - Một TC bị block bởi gap vẫn được viết + đánh dấu `🚫 Block: GAP-xx`.
45
45
  - **Tham chiếu test-id, không phải gợi ý hình ảnh.** Với mỗi step GUI tác động lên một element, trích test-id ổn định từ bảng §4.5.6 của tech-doc gộp (vd "click `ft001-login-submit-btn`") để qc-run-test dựng locator từ contract. Nếu một element có action không có test-id trong §4.5.6, ghi chú lại (qc-run-test sẽ fallback về locator role/text chậm hơn).
46
+ - **Ghi `@trace.testid_attr` vào đầu `.Test.md`.** Đọc field này từ header tech-doc gộp (do `/map-testids` ghi) và ghi lại một dòng ở phần metadata của file test-case: `Test-ID attribute: {attr}`. Lý do: §4.5.6 chỉ cho **giá trị** test-id, còn đây là **tên thuộc tính** chứa chúng — `/qc-run-test` cần nó để cấu hình locator, và `/qc-review` cần nó để biết selector trong script có đúng contract không. Thiếu field trong tech-doc → ghi `Test-ID attribute: — (thiếu @trace.testid_attr, chạy /map-testids)` thay vì bỏ trống hoặc tự đoán.
46
47
  - Cuối file: Trace matrix + bảng TC bị block.
47
48
 
48
49
  ## Trace mapping (bắt buộc)
@@ -40,23 +40,23 @@ Hiển thị và chờ phản hồi:
40
40
  ```
41
41
  ⚙️ MODEL CHECK
42
42
  ──────────────────────────────────────────────────────────────────
43
- Recommended : claude-opus-4 (hoặc model Opus mới nhất)
43
+ Recommended : model Opus mới nhất
44
44
  Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
45
- suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
45
+ suy luận sâu. Model nhỏ hơn (Haiku/Sonnet) dễ bỏ sót edge case.
46
46
 
47
47
  Cách đổi trong Claude Code:
48
- SettingsModel chọn "claude-opus"
49
- • hoặc: /modelchọn claude-opus
48
+ /modelchọn model Opus
49
+ • hoặc: SettingsModel
50
50
 
51
- Đang chạy claude-opus?
52
- Y — đúng, đang dùng claude-opus → tiếp tục
51
+ Đang chạy một model Opus?
52
+ Y — đúng → tiếp tục
53
53
  S — bỏ qua kiểm tra (tôi chấp nhận rủi ro chất lượng thấp hơn với model hiện tại)
54
54
  ──────────────────────────────────────────────────────────────────
55
55
  ```
56
56
 
57
57
  - "Y" → tiếp tục sang Bước 1.
58
58
  - "S" → tiếp tục sang Bước 1 (người dùng chấp nhận rủi ro, thêm ⚠️ vào report cuối).
59
- - "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang claude-opus rồi chạy lại lệnh này."
59
+ - "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang một model Opus (`/model`) rồi chạy lại lệnh này."
60
60
 
61
61
  ## Bước 1 — Xác định Target File
62
62
 
@@ -65,7 +65,12 @@ Hiển thị và chờ phản hồi:
65
65
  2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có path) → phân giải thành file bằng cách glob theo bố cục feature-package. `{prd-slug}` lúc này **chưa biết**, nên dùng wildcard `*` cho segment đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
66
66
  - **Lệnh BDD** (target là `.feature`): `{specs_dir}/{domain}/*/bdd/**/{UC-ID}*.feature` — hoặc `{specs_dir}/*/*/bdd/**/{UC-ID}*.feature` nếu domain cũng chưa biết. Nếu lệnh ngụ ý một platform/scope cụ thể (vd: system tech-doc cần BDD `system/`), ưu tiên kết quả trong thư mục con platform đó.
67
67
  - **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
68
- - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
68
+ - **Lệnh tech-docs** — target là tech-doc **gộp cấp PRD** `{TICKET-ID}-tech-design.md` (MỘT doc phủ nhiều UC; danh sách UC nằm ở `@trace.ucs`). Vì tên file mang `{TICKET-ID}` chứ **không** mang `{UC-ID}`, phải tách trước khi glob:
69
+ - `$ARGUMENTS` là **UC-ID** (`{TICKET-ID}-UC{N}`) → lấy `{TICKET-ID}` = phần **trước** `-UC`, rồi glob `{specs_dir}/{domain}/*/tech-docs/{TICKET-ID}-tech-design.md`.
70
+ - `$ARGUMENTS` là **TICKET-ID** → glob trực tiếp như trên.
71
+ - Chưa biết domain → `{specs_dir}/*/*/tech-docs/{TICKET-ID}-tech-design.md`.
72
+ - Vẫn không khớp → glob rộng `{specs_dir}/*/*/tech-docs/*tech-design*.md` rồi liệt kê để người dùng chọn.
73
+ *(Đừng glob `{UC-ID}*-tech-design*.md` — nó nở thành `FT-001-UC1*-tech-design*.md` và **không bao giờ** khớp `FT-001-tech-design.md`.)*
69
74
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
70
75
 
71
76
  Khi một file khớp: đặt nó làm target **và** ghi lại `domain` + `prd_slug` từ path của nó (theo quy tắc trích xuất trong `context-loader.md` Bước 1 — `prd_slug` = segment đầu tiên sau `{specs_dir}/{domain}/`). Mọi path mà lệnh đọc/ghi về sau (BDD/tech-docs/design-spec/trace cùng cấp) đều dùng **`prd_slug` đã phân giải đó**, nên tất cả artifact nằm chung một feature package. Nếu nhiều file khớp (vd: nhiều platform), chọn theo platform/scope của lệnh hoặc liệt kê ra và hỏi.
@@ -549,7 +554,7 @@ Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **pha
549
554
  | Phase | Commands |
550
555
  |-------|----------|
551
556
  | Discovery | `/define-product` |
552
- | PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
557
+ | PRD | `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` (PRD) |
553
558
  | Design Spec | `/generate-design-spec` |
554
559
  | BDD | `/generate-bdd` · `/review-context` (BDD) |
555
560
  | Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
@@ -574,6 +579,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
574
579
  | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
575
580
  | /define-product | `/generate-prd {product-definition-file}` |
576
581
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
582
+ | /extend-prd | `/refine-prd {prd-file}` (soi phần vừa thêm) rồi `/review-context {prd-file}` → PO duyệt → `/generate-bdd` **chỉ cho UC MỚI**; UC cũ dùng `/validate-traces --realign-prd-version {UC-ID}` |
577
583
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
578
584
  | /review-context (PRD) | Khi 0 critical → PO đặt `Status: approved`, rồi FE/App: `/generate-design-spec {prd-file}` (→ design sign-off → BDD); BE: `/generate-bdd {prd-file}`. Còn critical/NEEDS_FIX → sửa PRD (giữ draft) |
579
585
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
@@ -586,6 +592,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
586
592
  | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
587
593
  | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
588
594
  | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
595
+ | /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
589
596
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
590
597
  | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
591
598
  | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
@@ -594,11 +601,11 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
594
601
  | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
595
602
  | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
596
603
  | /dev-smoke-test | Tạo PR và link tới ticket |
597
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK tạo PR |
598
- | /fix-bug | Tạo PR link tới ticket |
604
+ | /validate-traces | **Cờ 🔴 trước (chặn PR):** SEAM_UNWIRED → nối binding sang class thật, xoá/thay stub · STUB_UNRESOLVED → `/generate-code {owner_uc}` (lấp logic tại chỗ + xoá hàm song song) · ORPHANED/TRACE_ORPHAN → quyết định thủ công (xoá code+test, đưa scenario trở lại `.feature`, hoặc sửa `sc_id` của tag). **Rồi:** DRIFT/UNTRACKED → `/generate-code {UC-ID}` · BDD_DRIFT → `/generate-code {feature-file}` · tech-doc lỗi thời vs BDD → `/generate-tech-docs` → `/review-tech-docs` · PRD drift → `/generate-bdd {prd-file}` · GAP → `/dev-gen-test {UC-ID}`. **Chỉ tạo PR khi mọi cờ 🔴 = 0** |
605
+ | /fix-bug | `/dev-run-test {UC-ID}` (dev_selftest vừa reset về not_run) → tạo PR; nếu fix một `{BUG-ID}` → QC chạy `/qc-run-test {UC-ID}` để verify + đóng bug |
599
606
  | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
600
607
  | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
601
- | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
608
+ | /propose-scenario | **Case A** (thiếu scenario cho AC có sẵn) → báo PO/Dev review trong `feedback/bdd-proposals/`; `/generate-bdd` tự chèn khi `Status: accepted`. **Case B** (requirement mới) → `feedback/prd-change-requests/` — PO phải đưa vào PRD trước, KHÔNG tự vào BDD được; `/validate-traces` nhắc lại kèm số ngày chờ chừng nào `Status: Open` |
602
609
  | /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
603
610
  | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
604
611
  | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
@@ -40,23 +40,23 @@ Hiển thị và chờ phản hồi:
40
40
  ```
41
41
  ⚙️ MODEL CHECK
42
42
  ──────────────────────────────────────────────────────────────────
43
- Recommended : claude-opus-4 (hoặc model Opus mới nhất)
43
+ Recommended : model Opus mới nhất
44
44
  Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
45
- suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
45
+ suy luận sâu. Model nhỏ hơn (Haiku/Sonnet) dễ bỏ sót edge case.
46
46
 
47
47
  Cách đổi trong Claude Code:
48
- SettingsModel chọn "claude-opus"
49
- • hoặc: /modelchọn claude-opus
48
+ /modelchọn model Opus
49
+ • hoặc: SettingsModel
50
50
 
51
- Đang chạy claude-opus?
52
- Y — đúng, đang dùng claude-opus → tiếp tục
51
+ Đang chạy một model Opus?
52
+ Y — đúng → tiếp tục
53
53
  S — bỏ qua kiểm tra (tôi chấp nhận rủi ro chất lượng thấp hơn với model hiện tại)
54
54
  ──────────────────────────────────────────────────────────────────
55
55
  ```
56
56
 
57
57
  - "Y" → tiếp tục sang Bước 1.
58
58
  - "S" → tiếp tục sang Bước 1 (người dùng chấp nhận rủi ro, thêm ⚠️ vào report cuối).
59
- - "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang claude-opus rồi chạy lại lệnh này."
59
+ - "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang một model Opus (`/model`) rồi chạy lại lệnh này."
60
60
 
61
61
  ## Bước 1 — Xác định Target File
62
62
 
@@ -65,7 +65,12 @@ Hiển thị và chờ phản hồi:
65
65
  2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có path) → phân giải thành file bằng cách glob theo bố cục feature-package. `{prd-slug}` lúc này **chưa biết**, nên dùng wildcard `*` cho segment đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
66
66
  - **Lệnh BDD** (target là `.feature`): `{specs_dir}/{domain}/*/bdd/**/{UC-ID}*.feature` — hoặc `{specs_dir}/*/*/bdd/**/{UC-ID}*.feature` nếu domain cũng chưa biết. Nếu lệnh ngụ ý một platform/scope cụ thể (vd: system tech-doc cần BDD `system/`), ưu tiên kết quả trong thư mục con platform đó.
67
67
  - **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
68
- - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
68
+ - **Lệnh tech-docs** — target là tech-doc **gộp cấp PRD** `{TICKET-ID}-tech-design.md` (MỘT doc phủ nhiều UC; danh sách UC nằm ở `@trace.ucs`). Vì tên file mang `{TICKET-ID}` chứ **không** mang `{UC-ID}`, phải tách trước khi glob:
69
+ - `$ARGUMENTS` là **UC-ID** (`{TICKET-ID}-UC{N}`) → lấy `{TICKET-ID}` = phần **trước** `-UC`, rồi glob `{specs_dir}/{domain}/*/tech-docs/{TICKET-ID}-tech-design.md`.
70
+ - `$ARGUMENTS` là **TICKET-ID** → glob trực tiếp như trên.
71
+ - Chưa biết domain → `{specs_dir}/*/*/tech-docs/{TICKET-ID}-tech-design.md`.
72
+ - Vẫn không khớp → glob rộng `{specs_dir}/*/*/tech-docs/*tech-design*.md` rồi liệt kê để người dùng chọn.
73
+ *(Đừng glob `{UC-ID}*-tech-design*.md` — nó nở thành `FT-001-UC1*-tech-design*.md` và **không bao giờ** khớp `FT-001-tech-design.md`.)*
69
74
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
70
75
 
71
76
  Khi một file khớp: đặt nó làm target **và** ghi lại `domain` + `prd_slug` từ path của nó (theo quy tắc trích xuất trong `context-loader.md` Bước 1 — `prd_slug` = segment đầu tiên sau `{specs_dir}/{domain}/`). Mọi path mà lệnh đọc/ghi về sau (BDD/tech-docs/design-spec/trace cùng cấp) đều dùng **`prd_slug` đã phân giải đó**, nên tất cả artifact nằm chung một feature package. Nếu nhiều file khớp (vd: nhiều platform), chọn theo platform/scope của lệnh hoặc liệt kê ra và hỏi.
@@ -554,7 +559,7 @@ Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **pha
554
559
  | Phase | Commands |
555
560
  |-------|----------|
556
561
  | Discovery | `/define-product` |
557
- | PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
562
+ | PRD | `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` (PRD) |
558
563
  | Design Spec | `/generate-design-spec` |
559
564
  | BDD | `/generate-bdd` · `/review-context` (BDD) |
560
565
  | Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
@@ -579,6 +584,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
579
584
  | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
580
585
  | /define-product | `/generate-prd {product-definition-file}` |
581
586
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
587
+ | /extend-prd | `/refine-prd {prd-file}` (soi phần vừa thêm) rồi `/review-context {prd-file}` → PO duyệt → `/generate-bdd` **chỉ cho UC MỚI**; UC cũ dùng `/validate-traces --realign-prd-version {UC-ID}` |
582
588
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
583
589
  | /review-context (PRD) | Khi 0 critical → PO đặt `Status: approved`, rồi FE/App: `/generate-design-spec {prd-file}` (→ design sign-off → BDD); BE: `/generate-bdd {prd-file}`. Còn critical/NEEDS_FIX → sửa PRD (giữ draft) |
584
590
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
@@ -591,6 +597,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
591
597
  | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
592
598
  | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
593
599
  | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
600
+ | /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
594
601
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
595
602
  | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
596
603
  | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
@@ -599,11 +606,11 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
599
606
  | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
600
607
  | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
601
608
  | /dev-smoke-test | Tạo PR và link tới ticket |
602
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK tạo PR |
603
- | /fix-bug | Tạo PR link tới ticket |
609
+ | /validate-traces | **Cờ 🔴 trước (chặn PR):** SEAM_UNWIRED → nối binding sang class thật, xoá/thay stub · STUB_UNRESOLVED → `/generate-code {owner_uc}` (lấp logic tại chỗ + xoá hàm song song) · ORPHANED/TRACE_ORPHAN → quyết định thủ công (xoá code+test, đưa scenario trở lại `.feature`, hoặc sửa `sc_id` của tag). **Rồi:** DRIFT/UNTRACKED → `/generate-code {UC-ID}` · BDD_DRIFT → `/generate-code {feature-file}` · tech-doc lỗi thời vs BDD → `/generate-tech-docs` → `/review-tech-docs` · PRD drift → `/generate-bdd {prd-file}` · GAP → `/dev-gen-test {UC-ID}`. **Chỉ tạo PR khi mọi cờ 🔴 = 0** |
610
+ | /fix-bug | `/dev-run-test {UC-ID}` (dev_selftest vừa reset về not_run) → tạo PR; nếu fix một `{BUG-ID}` → QC chạy `/qc-run-test {UC-ID}` để verify + đóng bug |
604
611
  | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
605
612
  | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
606
- | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
613
+ | /propose-scenario | **Case A** (thiếu scenario cho AC có sẵn) → báo PO/Dev review trong `feedback/bdd-proposals/`; `/generate-bdd` tự chèn khi `Status: accepted`. **Case B** (requirement mới) → `feedback/prd-change-requests/` — PO phải đưa vào PRD trước, KHÔNG tự vào BDD được; `/validate-traces` nhắc lại kèm số ngày chờ chừng nào `Status: Open` |
607
614
  | /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
608
615
  | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
609
616
  | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
@@ -40,23 +40,23 @@ Hiển thị và chờ phản hồi:
40
40
  ```
41
41
  ⚙️ MODEL CHECK
42
42
  ──────────────────────────────────────────────────────────────────
43
- Recommended : claude-opus-4 (hoặc model Opus mới nhất)
43
+ Recommended : model Opus mới nhất
44
44
  Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
45
- suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
45
+ suy luận sâu. Model nhỏ hơn (Haiku/Sonnet) dễ bỏ sót edge case.
46
46
 
47
47
  Cách đổi trong Claude Code:
48
- SettingsModel chọn "claude-opus"
49
- • hoặc: /modelchọn claude-opus
48
+ /modelchọn model Opus
49
+ • hoặc: SettingsModel
50
50
 
51
- Đang chạy claude-opus?
52
- Y — đúng, đang dùng claude-opus → tiếp tục
51
+ Đang chạy một model Opus?
52
+ Y — đúng → tiếp tục
53
53
  S — bỏ qua kiểm tra (tôi chấp nhận rủi ro chất lượng thấp hơn với model hiện tại)
54
54
  ──────────────────────────────────────────────────────────────────
55
55
  ```
56
56
 
57
57
  - "Y" → tiếp tục sang Bước 1.
58
58
  - "S" → tiếp tục sang Bước 1 (người dùng chấp nhận rủi ro, thêm ⚠️ vào report cuối).
59
- - "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang claude-opus rồi chạy lại lệnh này."
59
+ - "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang một model Opus (`/model`) rồi chạy lại lệnh này."
60
60
 
61
61
  ## Bước 1 — Xác định Target File
62
62
 
@@ -65,7 +65,12 @@ Hiển thị và chờ phản hồi:
65
65
  2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có path) → phân giải thành file bằng cách glob theo bố cục feature-package. `{prd-slug}` lúc này **chưa biết**, nên dùng wildcard `*` cho segment đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
66
66
  - **Lệnh BDD** (target là `.feature`): `{specs_dir}/{domain}/*/bdd/**/{UC-ID}*.feature` — hoặc `{specs_dir}/*/*/bdd/**/{UC-ID}*.feature` nếu domain cũng chưa biết. Nếu lệnh ngụ ý một platform/scope cụ thể (vd: system tech-doc cần BDD `system/`), ưu tiên kết quả trong thư mục con platform đó.
67
67
  - **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
68
- - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
68
+ - **Lệnh tech-docs** — target là tech-doc **gộp cấp PRD** `{TICKET-ID}-tech-design.md` (MỘT doc phủ nhiều UC; danh sách UC nằm ở `@trace.ucs`). Vì tên file mang `{TICKET-ID}` chứ **không** mang `{UC-ID}`, phải tách trước khi glob:
69
+ - `$ARGUMENTS` là **UC-ID** (`{TICKET-ID}-UC{N}`) → lấy `{TICKET-ID}` = phần **trước** `-UC`, rồi glob `{specs_dir}/{domain}/*/tech-docs/{TICKET-ID}-tech-design.md`.
70
+ - `$ARGUMENTS` là **TICKET-ID** → glob trực tiếp như trên.
71
+ - Chưa biết domain → `{specs_dir}/*/*/tech-docs/{TICKET-ID}-tech-design.md`.
72
+ - Vẫn không khớp → glob rộng `{specs_dir}/*/*/tech-docs/*tech-design*.md` rồi liệt kê để người dùng chọn.
73
+ *(Đừng glob `{UC-ID}*-tech-design*.md` — nó nở thành `FT-001-UC1*-tech-design*.md` và **không bao giờ** khớp `FT-001-tech-design.md`.)*
69
74
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
70
75
 
71
76
  Khi một file khớp: đặt nó làm target **và** ghi lại `domain` + `prd_slug` từ path của nó (theo quy tắc trích xuất trong `context-loader.md` Bước 1 — `prd_slug` = segment đầu tiên sau `{specs_dir}/{domain}/`). Mọi path mà lệnh đọc/ghi về sau (BDD/tech-docs/design-spec/trace cùng cấp) đều dùng **`prd_slug` đã phân giải đó**, nên tất cả artifact nằm chung một feature package. Nếu nhiều file khớp (vd: nhiều platform), chọn theo platform/scope của lệnh hoặc liệt kê ra và hỏi.
@@ -552,7 +557,7 @@ Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **pha
552
557
  | Phase | Commands |
553
558
  |-------|----------|
554
559
  | Discovery | `/define-product` |
555
- | PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
560
+ | PRD | `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` (PRD) |
556
561
  | Design Spec | `/generate-design-spec` |
557
562
  | BDD | `/generate-bdd` · `/review-context` (BDD) |
558
563
  | Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
@@ -577,6 +582,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
577
582
  | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
578
583
  | /define-product | `/generate-prd {product-definition-file}` |
579
584
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
585
+ | /extend-prd | `/refine-prd {prd-file}` (soi phần vừa thêm) rồi `/review-context {prd-file}` → PO duyệt → `/generate-bdd` **chỉ cho UC MỚI**; UC cũ dùng `/validate-traces --realign-prd-version {UC-ID}` |
580
586
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
581
587
  | /review-context (PRD) | Khi 0 critical → PO đặt `Status: approved`, rồi FE/App: `/generate-design-spec {prd-file}` (→ design sign-off → BDD); BE: `/generate-bdd {prd-file}`. Còn critical/NEEDS_FIX → sửa PRD (giữ draft) |
582
588
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
@@ -589,6 +595,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
589
595
  | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
590
596
  | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
591
597
  | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
598
+ | /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
592
599
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
593
600
  | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
594
601
  | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
@@ -597,11 +604,11 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
597
604
  | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
598
605
  | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
599
606
  | /dev-smoke-test | Tạo PR và link tới ticket |
600
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK tạo PR |
601
- | /fix-bug | Tạo PR link tới ticket |
607
+ | /validate-traces | **Cờ 🔴 trước (chặn PR):** SEAM_UNWIRED → nối binding sang class thật, xoá/thay stub · STUB_UNRESOLVED → `/generate-code {owner_uc}` (lấp logic tại chỗ + xoá hàm song song) · ORPHANED/TRACE_ORPHAN → quyết định thủ công (xoá code+test, đưa scenario trở lại `.feature`, hoặc sửa `sc_id` của tag). **Rồi:** DRIFT/UNTRACKED → `/generate-code {UC-ID}` · BDD_DRIFT → `/generate-code {feature-file}` · tech-doc lỗi thời vs BDD → `/generate-tech-docs` → `/review-tech-docs` · PRD drift → `/generate-bdd {prd-file}` · GAP → `/dev-gen-test {UC-ID}`. **Chỉ tạo PR khi mọi cờ 🔴 = 0** |
608
+ | /fix-bug | `/dev-run-test {UC-ID}` (dev_selftest vừa reset về not_run) → tạo PR; nếu fix một `{BUG-ID}` → QC chạy `/qc-run-test {UC-ID}` để verify + đóng bug |
602
609
  | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
603
610
  | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
604
- | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
611
+ | /propose-scenario | **Case A** (thiếu scenario cho AC có sẵn) → báo PO/Dev review trong `feedback/bdd-proposals/`; `/generate-bdd` tự chèn khi `Status: accepted`. **Case B** (requirement mới) → `feedback/prd-change-requests/` — PO phải đưa vào PRD trước, KHÔNG tự vào BDD được; `/validate-traces` nhắc lại kèm số ngày chờ chừng nào `Status: Open` |
605
612
  | /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
606
613
  | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
607
614
  | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |