@educa-corp/sdd-framework 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/bin/gate-trace.js +25 -2
  2. package/bin/index.js +32 -5
  3. package/bin/lint-trace.js +41 -0
  4. package/bin/self-check.js +430 -3
  5. package/bin/trace-schema.json +418 -31
  6. package/core/FRAMEWORK_VERSION +1 -1
  7. package/{commands/extend-prd.md → core/commands/amend-prd.md} +206 -173
  8. package/core/commands/dev-run-test.md +48 -10
  9. package/core/commands/extend-prd.md +39 -12
  10. package/core/commands/generate-bdd.md +52 -10
  11. package/core/commands/generate-code.md +35 -2
  12. package/core/commands/generate-tech-docs.md +36 -4
  13. package/core/commands/map-testids.md +1 -1
  14. package/core/commands/qc-run-test.md +29 -3
  15. package/core/commands/refine-prd.md +13 -2
  16. package/core/commands/review-context.md +43 -8
  17. package/core/commands/sync.md +105 -1
  18. package/core/commands/validate-traces.md +289 -16
  19. package/core/rules/workflow.md +34 -0
  20. package/core/steps/context-loader.md +27 -6
  21. package/core/templates/feature.template +1 -1
  22. package/core/templates/project-context.yaml +3 -3
  23. package/core/templates/tech-design.template.md +2 -2
  24. package/docs/02-concepts/architecture.md +37 -1
  25. package/docs/02-concepts/overview.md +1 -1
  26. package/docs/02-concepts/pipeline-steps/02-specification.md +13 -7
  27. package/docs/02-concepts/pipeline-steps/07-dev-selftest.md +2 -0
  28. package/docs/02-concepts/pipeline-steps/08-qc-automation.md +1 -0
  29. package/docs/02-concepts/pipeline-steps/09-validate-traces.md +34 -3
  30. package/docs/02-concepts/pipeline-steps/10-feedback-loop.md +10 -1
  31. package/docs/02-concepts/traceability.md +187 -183
  32. package/docs/03-guides/architect.md +13 -4
  33. package/docs/03-guides/developer.md +1 -0
  34. package/docs/03-guides/product-owner.md +89 -72
  35. package/docs/03-guides/tester-qa.md +81 -81
  36. package/docs/04-reference/commands.md +148 -134
  37. package/docs/04-reference/trace-schema.md +45 -1
  38. package/docs/explain/02b-extend-prd.md +1 -1
  39. package/docs/explain/02c-amend-prd.md +152 -0
  40. package/docs/explain/06-generate-bdd.md +1 -1
  41. package/docs/explain/13-dev-run-test.md +15 -1
  42. package/docs/explain/19-qc-run-test.md +91 -87
  43. package/docs/explain/21-validate-traces.md +79 -75
  44. package/docs/explain/28-sync.md +25 -0
  45. package/docs/explain/README.md +136 -135
  46. package/package.json +1 -8
  47. package/commands/debug.md +0 -529
  48. package/commands/debug.tmpl +0 -260
  49. package/commands/define-product.md +0 -438
  50. package/commands/define-product.tmpl +0 -225
  51. package/commands/dev-gen-test.md +0 -700
  52. package/commands/dev-gen-test.tmpl +0 -490
  53. package/commands/dev-run-test.md +0 -435
  54. package/commands/dev-run-test.tmpl +0 -225
  55. package/commands/dev-smoke-test.md +0 -374
  56. package/commands/dev-smoke-test.tmpl +0 -217
  57. package/commands/extend-prd.tmpl +0 -273
  58. package/commands/fix-bug.md +0 -519
  59. package/commands/fix-bug.tmpl +0 -197
  60. package/commands/generate-architecture.md +0 -354
  61. package/commands/generate-architecture.tmpl +0 -197
  62. package/commands/generate-bdd.md +0 -923
  63. package/commands/generate-bdd.tmpl +0 -590
  64. package/commands/generate-code.md +0 -859
  65. package/commands/generate-code.tmpl +0 -649
  66. package/commands/generate-design-spec.md +0 -737
  67. package/commands/generate-design-spec.tmpl +0 -524
  68. package/commands/generate-prd.md +0 -722
  69. package/commands/generate-prd.tmpl +0 -226
  70. package/commands/generate-spec-manifest.md +0 -321
  71. package/commands/generate-spec-manifest.tmpl +0 -164
  72. package/commands/generate-tech-docs.md +0 -920
  73. package/commands/generate-tech-docs.tmpl +0 -273
  74. package/commands/learn.md +0 -399
  75. package/commands/learn.tmpl +0 -130
  76. package/commands/map-testids.md +0 -238
  77. package/commands/map-testids.tmpl +0 -81
  78. package/commands/propose-scenario.md +0 -359
  79. package/commands/propose-scenario.tmpl +0 -202
  80. package/commands/qc-analyze.md +0 -269
  81. package/commands/qc-analyze.tmpl +0 -112
  82. package/commands/qc-design-test.md +0 -226
  83. package/commands/qc-design-test.tmpl +0 -69
  84. package/commands/qc-plan.md +0 -206
  85. package/commands/qc-plan.tmpl +0 -49
  86. package/commands/qc-report.md +0 -217
  87. package/commands/qc-report.tmpl +0 -60
  88. package/commands/qc-review.md +0 -210
  89. package/commands/qc-review.tmpl +0 -53
  90. package/commands/qc-run-test.md +0 -326
  91. package/commands/qc-run-test.tmpl +0 -116
  92. package/commands/refine-prd.md +0 -653
  93. package/commands/refine-prd.tmpl +0 -281
  94. package/commands/report-bug.md +0 -305
  95. package/commands/report-bug.tmpl +0 -148
  96. package/commands/review-code.md +0 -415
  97. package/commands/review-code.tmpl +0 -146
  98. package/commands/review-context.md +0 -902
  99. package/commands/review-context.tmpl +0 -530
  100. package/commands/review-tech-docs.md +0 -561
  101. package/commands/review-tech-docs.tmpl +0 -404
  102. package/commands/setup-ai-first.md +0 -602
  103. package/commands/setup-ai-first.tmpl +0 -450
  104. package/commands/sync.md +0 -430
  105. package/commands/sync.tmpl +0 -429
  106. package/commands/update-framework.md +0 -203
  107. package/commands/update-framework.tmpl +0 -202
  108. package/commands/validate-traces.md +0 -1077
  109. package/commands/validate-traces.tmpl +0 -920
  110. package/hooks/data-guard.js +0 -232
  111. package/hooks/settings.json +0 -19
  112. package/modules/android-compose/module.yaml +0 -13
  113. package/modules/android-compose/stack-profile.yaml +0 -57
  114. package/modules/angular/architecture-snippets/component-patterns.md +0 -187
  115. package/modules/angular/module.yaml +0 -6
  116. package/modules/angular/stack-profile.yaml +0 -38
  117. package/modules/context-engineering/architecture-snippets/context-design.md +0 -119
  118. package/modules/context-engineering/module.yaml +0 -9
  119. package/modules/context-engineering/stack-profile.yaml +0 -61
  120. package/modules/dotnet/architecture-snippets/clean-arch.md +0 -160
  121. package/modules/dotnet/module.yaml +0 -6
  122. package/modules/dotnet/stack-profile.yaml +0 -50
  123. package/modules/flutter/module.yaml +0 -14
  124. package/modules/flutter/stack-profile.yaml +0 -59
  125. package/modules/golang/architecture-snippets/domain-layout.md +0 -283
  126. package/modules/golang/module.yaml +0 -6
  127. package/modules/golang/stack-profile.yaml +0 -40
  128. package/modules/ios-swiftui/module.yaml +0 -13
  129. package/modules/ios-swiftui/stack-profile.yaml +0 -55
  130. package/modules/java-spring/architecture-snippets/layered-arch.md +0 -201
  131. package/modules/java-spring/module.yaml +0 -15
  132. package/modules/java-spring/stack-profile.yaml +0 -28
  133. package/modules/nextjs/architecture-snippets/app-router-patterns.md +0 -269
  134. package/modules/nextjs/module.yaml +0 -14
  135. package/modules/nextjs/stack-profile.yaml +0 -74
  136. package/modules/nuxt/module.yaml +0 -14
  137. package/modules/nuxt/stack-profile.yaml +0 -58
  138. package/modules/phaser-game/architecture-snippets/phaser-scene-patterns.md +0 -646
  139. package/modules/phaser-game/module.yaml +0 -15
  140. package/modules/phaser-game/stack-profile.yaml +0 -90
  141. package/modules/php-laravel/architecture-snippets/service-repository.md +0 -302
  142. package/modules/php-laravel/module.yaml +0 -15
  143. package/modules/php-laravel/stack-profile.yaml +0 -56
  144. package/modules/qc-playwright/stack-profile.yaml +0 -66
  145. package/modules/react/architecture-snippets/hooks-query-patterns.md +0 -254
  146. package/modules/react/module.yaml +0 -14
  147. package/modules/react/stack-profile.yaml +0 -63
  148. package/modules/react-native/module.yaml +0 -14
  149. package/modules/react-native/stack-profile.yaml +0 -56
  150. package/modules/vue/module.yaml +0 -14
  151. package/modules/vue/stack-profile.yaml +0 -65
  152. package/rules/data-protection.md +0 -80
  153. package/rules/workflow.md +0 -99
  154. package/skills/code/SKILL.md +0 -19
  155. package/skills/code/SKILL.tmpl +0 -19
  156. package/skills/debug/SKILL.md +0 -19
  157. package/skills/debug/SKILL.tmpl +0 -19
  158. package/skills/design-spec/SKILL.md +0 -11
  159. package/skills/design-spec/SKILL.tmpl +0 -11
  160. package/skills/discovery/SKILL.md +0 -14
  161. package/skills/discovery/SKILL.tmpl +0 -14
  162. package/skills/prd/SKILL.md +0 -19
  163. package/skills/prd/SKILL.tmpl +0 -19
  164. package/skills/qc/qa-analyst/DOC_GAPS.template.md +0 -63
  165. package/skills/qc/qa-analyst/acceptance-criteria.md +0 -60
  166. package/skills/qc/qa-analyst/business-rules.md +0 -59
  167. package/skills/qc/qa-analyst/data-flow.md +0 -64
  168. package/skills/qc/qa-analyst/spec-breakdown.md +0 -61
  169. package/skills/qc/qa-designer/e2e/journey.md +0 -41
  170. package/skills/qc/qa-designer/exploratory/charter.md +0 -68
  171. package/skills/qc/qa-designer/exploratory/explore-to-functional.md +0 -43
  172. package/skills/qc/qa-designer/functional/api.md +0 -45
  173. package/skills/qc/qa-designer/functional/gui-feature.md +0 -46
  174. package/skills/qc/qa-designer/functional/gui-screen.md +0 -52
  175. package/skills/qc/qa-designer/integration/api.md +0 -42
  176. package/skills/qc/qa-designer/integration/db.md +0 -39
  177. package/skills/qc/qa-designer/integration/gui.md +0 -40
  178. package/skills/qc/qa-designer/integration/kafka.md +0 -40
  179. package/skills/qc/qa-designer/non-functional.md +0 -40
  180. package/skills/qc/qa-planner/test-plan.md +0 -120
  181. package/skills/qc/qa-reviewer/script/e2e.md +0 -87
  182. package/skills/qc/qa-reviewer/script/exploratory.md +0 -45
  183. package/skills/qc/qa-reviewer/script/functional.md +0 -101
  184. package/skills/qc/qa-reviewer/script/integration.md +0 -91
  185. package/skills/qc/qa-reviewer/script/non-functional.md +0 -126
  186. package/skills/qc/qa-reviewer/test-case/e2e.md +0 -73
  187. package/skills/qc/qa-reviewer/test-case/exploratory.md +0 -43
  188. package/skills/qc/qa-reviewer/test-case/functional.md +0 -76
  189. package/skills/qc/qa-reviewer/test-case/integration.md +0 -69
  190. package/skills/qc/qa-reviewer/test-case/non-functional.md +0 -73
  191. package/skills/qc/qa-runner/e2e.md +0 -49
  192. package/skills/qc/qa-runner/exploratory/session.md +0 -36
  193. package/skills/qc/qa-runner/functional/api.md +0 -35
  194. package/skills/qc/qa-runner/functional/gui-feature.md +0 -51
  195. package/skills/qc/qa-runner/functional/gui-screen.md +0 -55
  196. package/skills/qc/qa-runner/integration.md +0 -47
  197. package/skills/qc/qa-runner/non-functional.md +0 -49
  198. package/skills/qc/qa-runner/report/report.md +0 -37
  199. package/skills/setup-ai-first/SKILL.md +0 -19
  200. package/skills/setup-ai-first/SKILL.tmpl +0 -19
  201. package/skills/spec/SKILL.md +0 -19
  202. package/skills/spec/SKILL.tmpl +0 -19
  203. package/skills/test/SKILL.md +0 -18
  204. package/skills/test/SKILL.tmpl +0 -18
  205. package/steps/business-language.md +0 -56
  206. package/steps/capture-lesson.md +0 -112
  207. package/steps/context-loader.md +0 -406
  208. package/steps/gate.md +0 -151
  209. package/steps/report-footer.md +0 -125
  210. package/steps/review-fanout.md +0 -159
  211. package/steps/spawn-agent.md +0 -129
  212. package/steps/trace-mirror.md +0 -53
  213. package/templates/README.md +0 -70
  214. package/templates/architecture.template.md +0 -394
  215. package/templates/ci/trace-gate.yml +0 -146
  216. package/templates/design-spec.template.md +0 -217
  217. package/templates/feature.template +0 -123
  218. package/templates/hooks/pre-push +0 -61
  219. package/templates/platform-guide.template.md +0 -145
  220. package/templates/prd.template.md +0 -283
  221. package/templates/product-definition.template.md +0 -188
  222. package/templates/project-context.yaml +0 -212
  223. package/templates/tech-design.template.md +0 -490
@@ -1,359 +0,0 @@
1
- # /propose-scenario — Đề xuất một BDD Scenario mới (cho Tester & QC)
2
-
3
- Dành cho **tester và QC** phát hiện edge case chưa được BDD hiện tại phủ (vd một gap missing-coverage
4
- `DOC_GAPS` từ `/qc-analyze`). Draft một Gherkin scenario vào **khu proposal** để
5
- PO/Dev review và promote.
6
-
7
- **KHÔNG sửa file `.feature` canonical.** BDD do PO/Dev sở hữu — lệnh này chỉ ghi
8
- một proposal. Promote vào BDD thật là hành động của PO/Dev.
9
-
10
- Usage: `/propose-scenario {UC-ID} {mô tả edge case}`
11
- Ví dụ: `/propose-scenario FT-001 login với email có space ở cuối vẫn nên thành công`
12
-
13
- ## Gate
14
- # Gate — Quy trình vào chuẩn cho mọi lệnh
15
-
16
- Mọi lệnh PHẢI chạy gate này trước khi thực thi phần logic riêng của nó.
17
-
18
- ## Bước 0 — Kiểm tra chế độ Sub-Agent
19
-
20
- Trước tiên, kiểm tra xem `$ARGUMENTS` có phải là payload JSON từ một orchestrator hay không:
21
-
22
- 1. Thử parse `$ARGUMENTS` dưới dạng JSON.
23
- 2. Nếu parse thành công **và** chứa `"_agent_mode": true`:
24
- - **Bỏ qua hoàn toàn Bước 1, 2 và 3 của Gate này.**
25
- - Đặt target file = `payload.target_file`
26
- - Đặt loaded context = `payload.context` (KHÔNG chạy context-loader.md)
27
- - Đặt phạm vi UC = `payload.uc_id` (chỉ xử lý UC này)
28
- - Đặt line range = `payload.uc_section` (chỉ đọc đúng section đó của PRD)
29
- - Đặt dimension = `payload.dimension` nếu có (lệnh review per-UC: chỉ review đúng lăng kính này)
30
- - Đi thẳng tới phần logic riêng của lệnh.
31
- 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).
32
-
33
- ## Bước 0-B — Ghi nhận Model *(KHÔNG chặn)*
34
-
35
- *Bỏ qua nếu `_agent_mode: true` (sub-agent — orchestrator đã ghi nhận rồi).*
36
-
37
- Ghi lại **model mà bạn — agent đang chạy lệnh này — thực sự đang dùng**, rồi mang nó vào
38
- dòng `Model:` của report cuối (xem `report-footer`). Nếu bạn biết mình **không** phải một
39
- model Opus, gắn thêm cảnh báo ngay ở dòng đó.
40
-
41
- **KHÔNG hỏi người dùng. KHÔNG chờ. KHÔNG dừng.**
42
-
43
- > **Vì sao bước này từng là prompt chặn, và vì sao bỏ (GAPS-v3 G41):** bản cũ hiện khối
44
- > `⚙️ MODEL CHECK` rồi chờ `Y/S/N`. Ba vấn đề cùng chỉ một hướng:
45
- > **(1)** nó hỏi người dùng thứ mà **agent đã biết chính xác**;
46
- > **(2)** câu trả lời **không kiểm chứng được** — gõ `Y` xong vẫn đang chạy Haiku thì không
47
- > gì phát hiện;
48
- > **(3)** **cả `Y` lẫn `S` đều đi tiếp** — cách duy nhất để nó dừng là tự nguyện gõ `N`.
49
- > Tức nó **không chặn được ai**, mà tốn một lần chặn ở **mọi** lệnh. Một feature đi hết
50
- > pipeline dùng 20 lệnh; 30/32 lệnh chạy gate. Hai mươi lần bấm cho một tín hiệu tự-khai
51
- > không kiểm chứng được — và chính cái giá đó làm mòn CHECKPOINT ở Bước 3, cổng có giá trị thật.
52
- >
53
- > Khai báo trong report **mạnh hơn** hỏi: đúng nguồn (agent, không phải người), và nằm
54
- > **cạnh kết quả** để cân nhắc, thay vì nằm trước khi có kết quả để bấm cho xong.
55
-
56
- **Vẫn khuyến nghị Opus:** phân tích spec, review kiến trúc và sinh code đòi hỏi suy luận sâu;
57
- model nhỏ hơn dễ bỏ sót edge case và vi phạm kiến trúc. Đổi: `/model` → chọn Opus.
58
-
59
- ## Bước 1 — Xác định Target File
60
-
61
- 0. **Tách cờ trước khi resolve target.** `$ARGUMENTS` có thể lẫn các `--flag` (vd `--phase=integration`, `--comment`, `--fix`). **Loại bỏ mọi token bắt đầu bằng `--`** ra khỏi phần dùng để tìm target — chỉ giữ phần path/UC-ID/ticket. (Các flag đó do phần logic riêng của lệnh parse ở bước sau, KHÔNG phải tên file.)
62
- 1. Nếu `$ARGUMENTS` (đã tách cờ) được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
63
- 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/`):
64
- - **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 đó.
65
- - **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.)*
66
- - **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:
67
- - `$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`.
68
- - `$ARGUMENTS` là **TICKET-ID** → glob trực tiếp như trên.
69
- - Chưa biết domain → `{specs_dir}/*/*/tech-docs/{TICKET-ID}-tech-design.md`.
70
- - 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.
71
- *(Đừ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`.)*
72
- - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
73
-
74
- 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.
75
- 3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
76
- - Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs/*/*/*.md` — file PRD ở gốc mỗi feature folder — cho lệnh PRD, `specs/*/*/bdd/**/*.feature` cho lệnh BDD).
77
- - Hiển thị danh sách cho người dùng và hỏi: "Bạn muốn làm việc với file nào? (Nhập số thứ tự hoặc tên file)"
78
- - Chờ người dùng chọn rồi mới tiếp tục.
79
-
80
- ## Bước 2 — Chạy Context Loader
81
-
82
- Nạp toàn bộ context của dự án bằng cách làm theo quy trình trong `steps/context-loader.md`.
83
- Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phiên làm việc của lệnh.
84
-
85
- ## Bước 3 — CHECKPOINT
86
-
87
- *Bỏ qua nếu `_agent_mode: true`.*
88
-
89
- ### 3a — Lệnh này có phải chặn không?
90
-
91
- | Mức | Lệnh nào | `--yes` bỏ qua được? |
92
- |---|---|:---:|
93
- | **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
94
- | **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
95
- | **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
96
-
97
- `--yes` trong `$ARGUMENTS` → bỏ qua CHECKPOINT mức *chặn thường*. (Bước 1 đã tách mọi token
98
- `--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
99
- headless: `claude -p "/generate-code UC1 --yes"`.
100
-
101
- > **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
102
- > ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
103
- > **nghĩa là gì**.
104
- > Nguồn máy đọc: `bin/trace-schema.json` → `gate.checkpoint_levels`; `self-check` **R11** fail
105
- > build nếu nhãn trong file lệnh lệch với schema, hoặc nếu một lệnh `hard`/`none` thiếu nhãn.
106
- > *(Lệnh không có dòng nào = mức **chặn thường**, mặc định.)*
107
-
108
- > **Mức *không chặn* là thực thi đúng miễn trừ mà `rules/workflow.md` đã cấp từ trước** —
109
- > trước G41 file đó viết *"read-only commands may skip CHECKPOINT"* còn gate thì luôn đòi.
110
- > Hai file cùng được nạp vào mọi lệnh mà nói ngược nhau; agent theo cái nào là tuỳ lúc.
111
-
112
- ### 3b — In gì
113
-
114
- **KHÔNG lặp lại những gì `[CTX LOADED]` vừa in.** Recap của context-loader (Bước 7) đã hiện
115
- Stack · Platform · Layers · CLAUDE.md · Dict · Entities · Lessons · Service · Status ngay phía
116
- trên. CHECKPOINT chỉ thêm **một** thông tin mới là `Target`.
117
-
118
- **Mọi thứ sạch** — recap báo `Status: FULL`, không cờ nào bật → in đúng hai dòng:
119
-
120
- ```
121
- CHECKPOINT — Target: {resolved file path}
122
- Tiếp tục? (Y/N)
123
- ```
124
-
125
- **Có bất thường** → thêm một dòng cho **mỗi** trạng thái, nặng nhất lên đầu:
126
-
127
- ```
128
- CHECKPOINT
129
- 🔴 Service : unresolved — {lý do context-loader đã ghi}
130
- ⚠️ CLAUDE.md: service overlay THIẾU — dùng root (code sinh ra có thể sai stack)
131
- ⚠️ Target : resolve bằng wildcard — {n} file khớp, chọn {file}
132
- ⚠️ Module : not configured — code sinh ra sẽ dùng default
133
- Status : PARTIAL — thiếu: {danh sách}
134
- Target : {resolved file path}
135
- Tiếp tục? (Y/N)
136
- ```
137
-
138
- ### 3c — Cờ nào bật, cờ nào KHÔNG
139
-
140
- Mỗi dòng ⚠️/🔴 phải ứng với một trạng thái **context-loader đã tính rồi** — không phát minh
141
- điều kiện mới, chỉ mang thứ đang bị giấu lên chỗ người dùng phải quyết định:
142
-
143
- | Bật cờ khi | Nguồn | Mức |
144
- |---|---|:---:|
145
- | `active_service = unresolved` | context-loader Bước 2b/2c/Fallback | 🔴 |
146
- | `Status = MINIMAL` | recap Bước 7 | 🔴 |
147
- | `Status = PARTIAL` | recap Bước 7 | ⚠️ |
148
- | CLAUDE.md thiếu, hoặc service overlay thiếu | context-loader Bước 3 | ⚠️ |
149
- | Target resolve qua wildcard, hoặc nhiều file khớp mà lệnh tự chọn | Bước 1 ở trên | ⚠️ |
150
- | `module` không cấu hình | recap Bước 7 | ⚠️ |
151
-
152
- **KHÔNG bật cờ cho:** `Lessons: chưa có` · `Dict: missing` · `Entities: missing`. Đó là
153
- *"dự án chưa điền"*, không phải *"có gì đó sai"* — chúng ở lại trong recap.
154
-
155
- > **Nguyên tắc một câu:** cờ dành cho thứ **framework không chắc chắn hoặc đã phải đoán**,
156
- > không dành cho thứ **người dùng chưa làm**. Đẩy hết mọi thứ lên thì CHECKPOINT lại đầy như
157
- > cũ, và ta quay về đúng chỗ xuất phát: một cổng luôn giống nhau thì bị lướt qua.
158
-
159
- ### 3d — Chờ trả lời
160
-
161
- - "Y" → tiếp tục sang các bước riêng của lệnh.
162
- - "N" → dừng, hỏi người dùng muốn thay đổi gì.
163
- - Có `--yes` và mức *chặn thường* → coi như "Y", **nhưng vẫn IN khối CHECKPOINT** nếu có cờ
164
- 🔴/⚠️ (không chặn ≠ không báo — người đọc log sau này vẫn cần thấy).
165
-
166
-
167
- *Lưu ý: Với lệnh này, target ở Bước 1 là một UC-ID từ `$ARGUMENTS`. Phân giải file `.feature` của nó (để lấy vocabulary + scenario có sẵn) và PRD của nó.*
168
-
169
- ## Context
170
- **BẮT BUỘC — đọc `.agent/steps/context-loader.md` và thực thi TOÀN BỘ quy trình trong đó**,
171
- rồi mới tiếp tục phần bên dưới.
172
-
173
- Bỏ qua bước này thì `{paths.*}`, `{tech_stack.*}`, `{conventions.*}`, guardrail từ
174
- `project-lessons`, và routing service (chế độ umbrella) đều **chưa được phân giải** — mọi
175
- placeholder bên dưới sẽ rỗng và lệnh sẽ đọc/ghi sai chỗ.
176
-
177
- ---
178
-
179
- ## Step 1 — Phân giải UC + Platform
180
-
181
- Định vị (qua `spec-manifest.yaml` nếu có, else `paths`):
182
- - `prd_path` + danh sách acceptance criteria của UC
183
- - `bdd_path` + `active_platform` (web / app / system) — để khớp vocabulary scenario và tag `@trace`
184
- - các tiêu đề scenario có sẵn của UC này (để tránh đề xuất trùng)
185
-
186
- ## Step 2 — Quyết định Coverage (CRITICAL)
187
-
188
- Một BDD scenario phải trace tới một PRD acceptance criterion. Xác định case nào áp dụng:
189
-
190
- **Case A — behavior NẰM TRONG một AC có sẵn** (AC ngụ ý nó, BDD chỉ thiếu scenario):
191
- → Đây là coverage gap. Tiếp tục draft scenario (Step 3), map tới AC đó.
192
-
193
- **Case B — behavior KHÔNG nằm trong AC nào** (requirement thực sự mới):
194
- → **Đừng** draft BDD proposal (scenario sẽ không có gì để trace). Thay vào đó **ghi một
195
- file PRD change request** để PO thực sự thấy nó trên `/sync` (đừng chỉ in ra):
196
-
197
- Ghi vào `{paths.prd_change_requests_dir}/{UC-ID}-{slug}.md` (phân giải về
198
- `{spec_source}/feedback/prd-change-requests/` ở umbrella mode; tạo dir nếu cần):
199
- ```
200
- # PRD Change Request — {UC-ID}: {short title}
201
-
202
- > ⚠️ Requirement mới phát hiện trong test — KHÔNG được PRD AC nào phủ (không phải coverage gap).
203
- | Field | Value |
204
- |---|---|
205
- | UC / Ticket | {UC-ID} |
206
- | PRD | {prd_path} (v{prd_version}) |
207
- | Source | {BUG-ID nếu có | quan sát của tester/QC} |
208
- | Requested by | tester/QC |
209
- | Status | Open |
210
-
211
- **Requested behavior:** {description}
212
- **Suggested AC (draft cho PO):** "{draft AC text}"
213
- **Route to PO:**
214
- 1. Đặt `Status: accepted` trong file này nếu nhận yêu cầu.
215
- 2. Chạy **`/extend-prd {prd_path}`** — nó tự nhặt request `accepted`, hỏi PO chốt AC/BR đúng
216
- tầng, đánh số **nối tiếp** (không đụng ID cũ), bump version + ghi changelog nêu rõ scope,
217
- rồi đóng dấu `incorporated` + chuyển file này sang `archived/`.
218
- 3. `/refine-prd` → `/review-context` → PO đặt `approved` → `/generate-bdd` **chỉ cho UC MỚI**.
219
-
220
- ⚠️ **KHÔNG dùng `/refine-prd` để thêm AC mới.** Nó chỉ áp findings từ review và có luật cấm
221
- đụng section nào không được finding tham chiếu. **KHÔNG dùng `/generate-prd`** — nó từ chối
222
- chạy trên PRD đã có (ghi đè sẽ mất changelog + đánh số lại BR).
223
- ```
224
- 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).
225
-
226
- Nếu không chắc case nào → hiện danh sách AC và hỏi tester nó map tới AC nào, hoặc confirm nó là mới.
227
-
228
- ## Step 3 — Draft Scenario (chỉ Case A)
229
-
230
- Viết Gherkin nhất quán với convention của `/generate-bdd` cho `active_platform`:
231
- - Dùng vocabulary platform (web: clicks/sees; app: taps/sees; system: business event)
232
- - Một scenario tập trung; Given/When/Then cụ thể; không chi tiết implementation
233
- - **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:
234
-
235
- ```gherkin
236
- # Side-effects: {liệt kê side-effect quan sát được, hoặc "—"}
237
- # @trace.scenario: {UC-ID}-SC? ← "?" = số do /generate-bdd gán lúc chèn (tester không biết số kế tiếp)
238
- # @trace.sc_version: 1.0
239
- # @trace.business_rules: {BR-ID nếu xác định được, else —}
240
- # Covers: AC{N} ← comment thường, KHÔNG phải @trace (AC không phải trace key)
241
- # Nguồn: proposal {file} · {BUG-ID nếu có}
242
- @proposed @from-test @edge
243
- Scenario: {business outcome}
244
- ```
245
-
246
- > **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`.
247
-
248
- ## Step 4 — Ghi Proposal
249
-
250
- Ghi vào `{paths.bdd_proposals_dir}/{UC-ID}-{slug}.md` (phân giải về `{spec_source}/feedback/bdd-proposals/` ở umbrella mode; tạo dir nếu cần).
251
- KHÔNG đụng `.feature` canonical. Doc proposal chứa draft + metadata review
252
- (xem Output), **gồm dòng `Status: proposed`**. Nếu nguồn là một bug, tham chiếu `BUG-ID` của nó.
253
-
254
- > **Vòng đời proposal** (máy đọc được để `/generate-bdd` intake đúng):
255
- > `proposed` → PO/Dev duyệt đặt `accepted` (hoặc `rejected`) → `/generate-bdd` chèn cái `accepted` vào `.feature` rồi đặt `incorporated` + lưu trữ. **Chỉ `accepted` mới được đưa vào BDD.**
256
-
257
- ## Step 5 — Handoff (để PO/Dev thực sự thấy)
258
-
259
- Một proposal chỉ tới PO/Dev nếu được **commit và push lên spec repo dùng chung**.
260
-
261
- ```bash
262
- cd {spec_source} # umbrella: spec submodule; single-service: bỏ
263
- git add feedback/bdd-proposals/{UC-ID}-{slug}.md
264
- git commit -m "qa(proposal): {UC-ID} — {title}"
265
- git push # → PO/Dev thấy nó ở lần /sync tiếp theo
266
- ```
267
-
268
- - Không có quyền push spec repo → mở PR / MR thay vì. In fallback này.
269
- - Với **PRD change request** (Case B), commit file request thay vì:
270
- ```bash
271
- cd {spec_source}
272
- git add feedback/prd-change-requests/{UC-ID}-{slug}.md
273
- git commit -m "qa(prd-change): {UC-ID} — {title}"
274
- git push
275
- ```
276
-
277
- > PO/Dev được thông báo qua routine bình thường: `/sync` liệt kê các proposal vừa pull về.
278
-
279
- ---
280
-
281
- ## Output
282
-
283
- **Đọc `.agent/steps/report-footer.md`** và áp đúng khuôn footer trong đó (Status Badge ·
284
- Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
285
-
286
- > **Hai khối report — chọn theo case đã chốt ở Step 2. In ĐÚNG MỘT khối.**
287
- > 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
288
- > đườ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:
289
- > 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`
290
- > nhặt — trong khi lệnh đó **không bao giờ** đọc `prd-change-requests/`.
291
-
292
- ### Khối Case A — scenario proposal *(behavior nằm trong một AC có sẵn)*
293
-
294
- ```
295
- 📝 Scenario proposal → {paths.bdd_proposals_dir}/{UC-ID}-{slug}.md
296
-
297
- UC : {UC-ID} ({active_platform})
298
- Maps to AC : {AC-N} — "{AC text}"
299
- Source : {BUG-ID nếu có | quan sát tester}
300
-
301
- Scenario đề xuất (DRAFT — chờ PO/Dev review):
302
- # Side-effects: {…}
303
- # @trace.scenario: {UC-ID}-SC?
304
- # @trace.sc_version: 1.0
305
- # @trace.business_rules: {BR-ID | —}
306
- # Covers: AC{N}
307
- @proposed @from-test @edge
308
- Scenario: {title}
309
- Given {…}
310
- When {…}
311
- Then {…}
312
-
313
- Để PO/Dev promote:
314
- [ ] AC mapping đúng? (hoặc cập nhật PRD nếu requirement thực sự mới)
315
- [ ] Đặt `Status: accepted` trong file proposal (để /generate-bdd đưa vào)
316
- [ ] Chạy lại /generate-bdd {UC-ID} — nó tự chèn proposal `accepted` vào .feature rồi lưu trữ
317
- [ ] Rồi: /generate-code {UC-ID} + /dev-gen-test {UC-ID}
318
-
319
- Handoff : {✅ committed + pushed to spec repo | ⚠️ chạy git command ở trên / mở PR}
320
-
321
- ---
322
- Status : ✅ Complete (read-only trên BDD canonical — chỉ proposal)
323
- Output Artifacts: created {paths.bdd_proposals_dir}/{UC-ID}-{slug}.md (pushed to shared spec repo)
324
- Next : PO/Dev thấy nó ở lần /sync tiếp theo → review & promote
325
- ```
326
-
327
- ### Khối Case B — PRD change request *(requirement mới, không AC nào phủ)*
328
-
329
- ```
330
- 📋 PRD change request → {paths.prd_change_requests_dir}/{UC-ID}-{slug}.md
331
-
332
- UC : {UC-ID} ({active_platform})
333
- Loại : requirement MỚI — không AC nào phủ (KHÔNG phải coverage gap)
334
- PRD : {prd_path} (v{prd_version})
335
- Source : {BUG-ID nếu có | quan sát tester/QC}
336
- Behavior : {description}
337
- Draft AC : "{draft AC text}" ← đề xuất cho PO cân nhắc, PO chốt lại
338
-
339
- ⚠️ Lệnh này KHÔNG sinh BDD scenario nào — scenario chưa có AC để trace tới.
340
- Nó chỉ xuất hiện SAU KHI PO đưa requirement vào PRD rồi chạy lại /generate-bdd.
341
- 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
342
- coverage hiện tại thì hành vi bạn vừa phát hiện không tồn tại.
343
-
344
- Để PO xử lý:
345
- [ ] Đọc request, quyết định nhận hay không
346
- [ ] Nhận → đặt Status: accepted trong file request
347
- [ ] /extend-prd {prd-file} ← nhặt request, chốt AC/BR với PO, đánh số nối tiếp,
348
- bump version + changelog, tự đóng dấu incorporated
349
- [ ] /refine-prd → /review-context {prd-file} ← soi + kiểm phần vừa thêm
350
- [ ] PO đặt Status: approved → /generate-bdd {prd-file} (CHỈ UC mới) → /generate-code
351
-
352
- Handoff : {✅ committed + pushed to spec repo | ⚠️ chạy git command ở trên / mở PR}
353
-
354
- ---
355
- Status : ✅ Complete (không đụng BDD — đây là yêu cầu đổi tài liệu, không phải scenario)
356
- Output Artifacts: created {paths.prd_change_requests_dir}/{UC-ID}-{slug}.md (pushed to shared spec repo)
357
- Next : PO thấy nó ở lần /sync tiếp theo. Nếu chưa xử, /validate-traces sẽ nhắc lại
358
- (kèm số ngày chờ) mỗi lần chạy, chừng nào Status còn Open.
359
- ```
@@ -1,202 +0,0 @@
1
- # /propose-scenario — Đề xuất một BDD Scenario mới (cho Tester & QC)
2
-
3
- Dành cho **tester và QC** phát hiện edge case chưa được BDD hiện tại phủ (vd một gap missing-coverage
4
- `DOC_GAPS` từ `/qc-analyze`). Draft một Gherkin scenario vào **khu proposal** để
5
- PO/Dev review và promote.
6
-
7
- **KHÔNG sửa file `.feature` canonical.** BDD do PO/Dev sở hữu — lệnh này chỉ ghi
8
- một proposal. Promote vào BDD thật là hành động của PO/Dev.
9
-
10
- Usage: `/propose-scenario {UC-ID} {mô tả edge case}`
11
- Ví dụ: `/propose-scenario FT-001 login với email có space ở cuối vẫn nên thành công`
12
-
13
- ## Gate
14
- {{include:steps/gate.md}}
15
-
16
- *Lưu ý: Với lệnh này, target ở Bước 1 là một UC-ID từ `$ARGUMENTS`. Phân giải file `.feature` của nó (để lấy vocabulary + scenario có sẵn) và PRD của nó.*
17
-
18
- ## Context
19
- {{include:steps/context-loader.md}}
20
-
21
- ---
22
-
23
- ## Step 1 — Phân giải UC + Platform
24
-
25
- Định vị (qua `spec-manifest.yaml` nếu có, else `paths`):
26
- - `prd_path` + danh sách acceptance criteria của UC
27
- - `bdd_path` + `active_platform` (web / app / system) — để khớp vocabulary scenario và tag `@trace`
28
- - các tiêu đề scenario có sẵn của UC này (để tránh đề xuất trùng)
29
-
30
- ## Step 2 — Quyết định Coverage (CRITICAL)
31
-
32
- Một BDD scenario phải trace tới một PRD acceptance criterion. Xác định case nào áp dụng:
33
-
34
- **Case A — behavior NẰM TRONG một AC có sẵn** (AC ngụ ý nó, BDD chỉ thiếu scenario):
35
- → Đây là coverage gap. Tiếp tục draft scenario (Step 3), map tới AC đó.
36
-
37
- **Case B — behavior KHÔNG nằm trong AC nào** (requirement thực sự mới):
38
- → **Đừng** draft BDD proposal (scenario sẽ không có gì để trace). Thay vào đó **ghi một
39
- file PRD change request** để PO thực sự thấy nó trên `/sync` (đừng chỉ in ra):
40
-
41
- Ghi vào `{paths.prd_change_requests_dir}/{UC-ID}-{slug}.md` (phân giải về
42
- `{spec_source}/feedback/prd-change-requests/` ở umbrella mode; tạo dir nếu cần):
43
- ```
44
- # PRD Change Request — {UC-ID}: {short title}
45
-
46
- > ⚠️ Requirement mới phát hiện trong test — KHÔNG được PRD AC nào phủ (không phải coverage gap).
47
- | Field | Value |
48
- |---|---|
49
- | UC / Ticket | {UC-ID} |
50
- | PRD | {prd_path} (v{prd_version}) |
51
- | Source | {BUG-ID nếu có | quan sát của tester/QC} |
52
- | Requested by | tester/QC |
53
- | Status | Open |
54
-
55
- **Requested behavior:** {description}
56
- **Suggested AC (draft cho PO):** "{draft AC text}"
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).
67
- ```
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).
69
-
70
- Nếu không chắc case nào → hiện danh sách AC và hỏi tester nó map tới AC nào, hoặc confirm nó là mới.
71
-
72
- ## Step 3 — Draft Scenario (chỉ Case A)
73
-
74
- Viết Gherkin nhất quán với convention của `/generate-bdd` cho `active_platform`:
75
- - Dùng vocabulary platform (web: clicks/sees; app: taps/sees; system: business event)
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`.
91
-
92
- ## Step 4 — Ghi Proposal
93
-
94
- Ghi vào `{paths.bdd_proposals_dir}/{UC-ID}-{slug}.md` (phân giải về `{spec_source}/feedback/bdd-proposals/` ở umbrella mode; tạo dir nếu cần).
95
- KHÔNG đụng `.feature` canonical. Doc proposal chứa draft + metadata review
96
- (xem Output), **gồm dòng `Status: proposed`**. Nếu nguồn là một bug, tham chiếu `BUG-ID` của nó.
97
-
98
- > **Vòng đời proposal** (máy đọc được để `/generate-bdd` intake đúng):
99
- > `proposed` → PO/Dev duyệt đặt `accepted` (hoặc `rejected`) → `/generate-bdd` chèn cái `accepted` vào `.feature` rồi đặt `incorporated` + lưu trữ. **Chỉ `accepted` mới được đưa vào BDD.**
100
-
101
- ## Step 5 — Handoff (để PO/Dev thực sự thấy)
102
-
103
- Một proposal chỉ tới PO/Dev nếu được **commit và push lên spec repo dùng chung**.
104
-
105
- ```bash
106
- cd {spec_source} # umbrella: spec submodule; single-service: bỏ
107
- git add feedback/bdd-proposals/{UC-ID}-{slug}.md
108
- git commit -m "qa(proposal): {UC-ID} — {title}"
109
- git push # → PO/Dev thấy nó ở lần /sync tiếp theo
110
- ```
111
-
112
- - Không có quyền push spec repo → mở PR / MR thay vì. In fallback này.
113
- - Với **PRD change request** (Case B), commit file request thay vì:
114
- ```bash
115
- cd {spec_source}
116
- git add feedback/prd-change-requests/{UC-ID}-{slug}.md
117
- git commit -m "qa(prd-change): {UC-ID} — {title}"
118
- git push
119
- ```
120
-
121
- > PO/Dev được thông báo qua routine bình thường: `/sync` liệt kê các proposal vừa pull về.
122
-
123
- ---
124
-
125
- ## Output
126
-
127
- {{include:steps/report-footer.md}}
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
-
137
- ```
138
- 📝 Scenario proposal → {paths.bdd_proposals_dir}/{UC-ID}-{slug}.md
139
-
140
- UC : {UC-ID} ({active_platform})
141
- Maps to AC : {AC-N} — "{AC text}"
142
- Source : {BUG-ID nếu có | quan sát tester}
143
-
144
- Scenario đề xuất (DRAFT — chờ PO/Dev review):
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
151
- Scenario: {title}
152
- Given {…}
153
- When {…}
154
- Then {…}
155
-
156
- Để PO/Dev promote:
157
- [ ] AC mapping đúng? (hoặc cập nhật PRD nếu requirement thực sự mới)
158
- [ ] Đặt `Status: accepted` trong file proposal (để /generate-bdd đưa vào)
159
- [ ] Chạy lại /generate-bdd {UC-ID} — nó tự chèn proposal `accepted` vào .feature rồi lưu trữ
160
- [ ] Rồi: /generate-code {UC-ID} + /dev-gen-test {UC-ID}
161
-
162
- Handoff : {✅ committed + pushed to spec repo | ⚠️ chạy git command ở trên / mở PR}
163
-
164
- ---
165
- Status : ✅ Complete (read-only trên BDD canonical — chỉ proposal)
166
- Output Artifacts: created {paths.bdd_proposals_dir}/{UC-ID}-{slug}.md (pushed to shared spec repo)
167
- Next : PO/Dev thấy nó ở lần /sync tiếp theo → review & promote
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
- ```