@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
@@ -44,23 +44,23 @@ Hiển thị và chờ phản hồi:
44
44
  ```
45
45
  ⚙️ MODEL CHECK
46
46
  ──────────────────────────────────────────────────────────────────
47
- Recommended : claude-opus-4 (hoặc model Opus mới nhất)
47
+ Recommended : model Opus mới nhất
48
48
  Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
49
- suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
49
+ suy luận sâu. Model nhỏ hơn (Haiku/Sonnet) dễ bỏ sót edge case.
50
50
 
51
51
  Cách đổi trong Claude Code:
52
- SettingsModel chọn "claude-opus"
53
- • hoặc: /modelchọn claude-opus
52
+ /modelchọn model Opus
53
+ • hoặc: SettingsModel
54
54
 
55
- Đang chạy claude-opus?
56
- Y — đúng, đang dùng claude-opus → tiếp tục
55
+ Đang chạy một model Opus?
56
+ Y — đúng → tiếp tục
57
57
  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)
58
58
  ──────────────────────────────────────────────────────────────────
59
59
  ```
60
60
 
61
61
  - "Y" → tiếp tục sang Bước 1.
62
62
  - "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).
63
- - "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."
63
+ - "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."
64
64
 
65
65
  ## Bước 1 — Xác định Target File
66
66
 
@@ -69,7 +69,12 @@ Hiển thị và chờ phản hồi:
69
69
  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/`):
70
70
  - **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 đó.
71
71
  - **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.)*
72
- - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
72
+ - **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:
73
+ - `$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`.
74
+ - `$ARGUMENTS` là **TICKET-ID** → glob trực tiếp như trên.
75
+ - Chưa biết domain → `{specs_dir}/*/*/tech-docs/{TICKET-ID}-tech-design.md`.
76
+ - 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.
77
+ *(Đừ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`.)*
73
78
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
74
79
 
75
80
  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.
@@ -514,7 +519,7 @@ Tiếp tục sang bước kế tiếp của lệnh đang gọi.
514
519
  - feature `web/` và/hoặc `app/` → sinh/mở rộng block **client §4.5** cho platform đó, và thêm flow của platform đó vào lane **§5** (5.B/5.C).
515
520
  - batch không có feature client → không có việc §4.5 lần này (lần chạy sau trỏ vào BDD `web/`·`app/` sẽ append).
516
521
  - **batch không có feature `system/` (PRD chỉ client):** **đừng** bịa BE contract. §4.1 chỉ liệt kê các endpoint mà client **tiêu thụ** (external / bên thứ ba / của team khác / existing), reverse-document từ mệnh đề Then của client BDD + PRD và đánh dấu "consumed (external)"; nếu feature không gọi mạng → §4 = "N/A — client-only, không backend". §4.5.4 map tới bất cứ gì §4.1 liệt kê (hoặc không có).
517
- - Ghi `@trace.bdd_version` dưới dạng **map theo platform** (vd `system=1.5, web=1.9`) từ chính `@trace.bdd_version` của mỗi feature — đừng làm phẳng về một số.
522
+ - Ghi `@trace.bdd_versions` (**số nhiều** map theo platform, vd `system=1.5, web=1.9`) từ `@trace.bdd_version` (**số ít**, scalar) của mỗi feature — đừng làm phẳng về một số. *(Tên khác nhau là cố ý: cùng một tên cho hai kiểu dữ liệu sẽ làm vỡ mọi parser generic.)*
518
523
  6. Đường dẫn output — doc **duy nhất** của PRD:
519
524
  ```
520
525
  {paths.tech_docs_dir}/{domain}/{prd-slug}/tech-docs/{TICKET-ID}-tech-design.md
@@ -664,7 +669,7 @@ Ghi/mở rộng `{output_path}` dùng template dưới đây, chỉ sinh **nội
664
669
  - **§1/§2** (Overview/Actors, Architecture) là cấp PRD: viết ở lần chạy đầu; các lần sau chỉ mở rộng nếu batch thêm actor/integration thật sự mới.
665
670
  - **§10 UC Coverage** — một row UC (có cột Platforms) + bảng con coverage-scenario khoá theo **(platform, SC)** — mỗi platform×SC một row, vì cùng số SC ở platform khác nhau là scenario khác nhau. Đây là mỏ neo mà chế độ APPEND đọc. Luôn cập nhật nó cho (các) UC/platform của batch.
666
671
 
667
- **Chế độ APPEND (doc đã tồn tại):** **đừng** viết lại section có sẵn. Chèn diagram §5 của UC batch **vào đúng lane platform** (5.A/5.B/5.C, đánh số sau cái cuối trong lane đó, tiêu đề `platform · SC`), các row mới ở §3/§4.3/§8/§9; với §4.5 — platform mới → nhóm `### 4.5 — {platform}` mới, ngược lại thêm sub-block `§4.5.1.x {Screen} — {UC}` + row vào §4.5.6 dùng chung của nhóm (không lặp nhóm); rồi cập nhật §10 (row khoá theo platform×SC) và thêm một row Changelog. Bump `@trace.revision` và làm mới `@trace.ucs` / `@trace.platforms` ở header, và cập nhật entry của platform vừa đụng trong map `@trace.bdd_version` (vd set `web=2.0`, giữ nguyên `system`).
672
+ **Chế độ APPEND (doc đã tồn tại):** **đừng** viết lại section có sẵn. Chèn diagram §5 của UC batch **vào đúng lane platform** (5.A/5.B/5.C, đánh số sau cái cuối trong lane đó, tiêu đề `platform · SC`), các row mới ở §3/§4.3/§8/§9; với §4.5 — platform mới → nhóm `### 4.5 — {platform}` mới, ngược lại thêm sub-block `§4.5.1.x {Screen} — {UC}` + row vào §4.5.6 dùng chung của nhóm (không lặp nhóm); rồi cập nhật §10 (row khoá theo platform×SC) và thêm một row Changelog. Bump `@trace.revision` và làm mới `@trace.ucs` / `@trace.platforms` ở header, và cập nhật entry của platform vừa đụng trong map `@trace.bdd_versions` (vd set `web=2.0`, giữ nguyên `system`).
668
673
 
669
674
  <!--
670
675
  ════════════════════════════════════════════════════════════════════════════
@@ -708,7 +713,7 @@ Ghi/mở rộng `{output_path}` dùng template dưới đây, chỉ sinh **nội
708
713
  @trace.service: {service — từ header BDD @trace.service}
709
714
  @trace.module: {module liên quan — vd dotnet, angular}
710
715
  @trace.platforms: {system | web | app — tuỳ thư mục BDD nào tồn tại}
711
- @trace.bdd_version: {map theo từng platform — vd system=1.5, web=1.9, app=1.7; chỉ platform có mặt. Mỗi feature mang bdd_version riêng; đừng gộp về một số.}
716
+ @trace.bdd_versions: {MAP theo từng platform — số nhiều, KHÁC @trace.bdd_version (scalar) của .feature — vd system=1.5, web=1.9, app=1.7; chỉ platform có mặt. Mỗi feature mang bdd_version riêng; đừng gộp về một số.}
712
717
  @trace.api_source: {existing | —}
713
718
  @trace.revision: 1
714
719
  @trace.status: draft
@@ -1257,7 +1262,7 @@ Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **pha
1257
1262
  | Phase | Commands |
1258
1263
  |-------|----------|
1259
1264
  | Discovery | `/define-product` |
1260
- | PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
1265
+ | PRD | `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` (PRD) |
1261
1266
  | Design Spec | `/generate-design-spec` |
1262
1267
  | BDD | `/generate-bdd` · `/review-context` (BDD) |
1263
1268
  | Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
@@ -1282,6 +1287,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
1282
1287
  | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
1283
1288
  | /define-product | `/generate-prd {product-definition-file}` |
1284
1289
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
1290
+ | /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}` |
1285
1291
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
1286
1292
  | /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) |
1287
1293
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
@@ -1294,6 +1300,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
1294
1300
  | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
1295
1301
  | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
1296
1302
  | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
1303
+ | /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
1297
1304
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
1298
1305
  | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
1299
1306
  | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
@@ -1302,11 +1309,11 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
1302
1309
  | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
1303
1310
  | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
1304
1311
  | /dev-smoke-test | Tạo PR và link tới ticket |
1305
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK tạo PR |
1306
- | /fix-bug | Tạo PR link tới ticket |
1312
+ | /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** |
1313
+ | /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 |
1307
1314
  | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
1308
1315
  | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
1309
- | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
1316
+ | /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` |
1310
1317
  | /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
1311
1318
  | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
1312
1319
  | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
@@ -40,7 +40,7 @@
40
40
  - feature `web/` và/hoặc `app/` → sinh/mở rộng block **client §4.5** cho platform đó, và thêm flow của platform đó vào lane **§5** (5.B/5.C).
41
41
  - batch không có feature client → không có việc §4.5 lần này (lần chạy sau trỏ vào BDD `web/`·`app/` sẽ append).
42
42
  - **batch không có feature `system/` (PRD chỉ client):** **đừng** bịa BE contract. §4.1 chỉ liệt kê các endpoint mà client **tiêu thụ** (external / bên thứ ba / của team khác / existing), reverse-document từ mệnh đề Then của client BDD + PRD và đánh dấu "consumed (external)"; nếu feature không gọi mạng → §4 = "N/A — client-only, không backend". §4.5.4 map tới bất cứ gì §4.1 liệt kê (hoặc không có).
43
- - Ghi `@trace.bdd_version` dưới dạng **map theo platform** (vd `system=1.5, web=1.9`) từ chính `@trace.bdd_version` của mỗi feature — đừng làm phẳng về một số.
43
+ - Ghi `@trace.bdd_versions` (**số nhiều** map theo platform, vd `system=1.5, web=1.9`) từ `@trace.bdd_version` (**số ít**, scalar) của mỗi feature — đừng làm phẳng về một số. *(Tên khác nhau là cố ý: cùng một tên cho hai kiểu dữ liệu sẽ làm vỡ mọi parser generic.)*
44
44
  6. Đường dẫn output — doc **duy nhất** của PRD:
45
45
  ```
46
46
  {paths.tech_docs_dir}/{domain}/{prd-slug}/tech-docs/{TICKET-ID}-tech-design.md
@@ -190,7 +190,7 @@ Ghi/mở rộng `{output_path}` dùng template dưới đây, chỉ sinh **nội
190
190
  - **§1/§2** (Overview/Actors, Architecture) là cấp PRD: viết ở lần chạy đầu; các lần sau chỉ mở rộng nếu batch thêm actor/integration thật sự mới.
191
191
  - **§10 UC Coverage** — một row UC (có cột Platforms) + bảng con coverage-scenario khoá theo **(platform, SC)** — mỗi platform×SC một row, vì cùng số SC ở platform khác nhau là scenario khác nhau. Đây là mỏ neo mà chế độ APPEND đọc. Luôn cập nhật nó cho (các) UC/platform của batch.
192
192
 
193
- **Chế độ APPEND (doc đã tồn tại):** **đừng** viết lại section có sẵn. Chèn diagram §5 của UC batch **vào đúng lane platform** (5.A/5.B/5.C, đánh số sau cái cuối trong lane đó, tiêu đề `platform · SC`), các row mới ở §3/§4.3/§8/§9; với §4.5 — platform mới → nhóm `### 4.5 — {platform}` mới, ngược lại thêm sub-block `§4.5.1.x {Screen} — {UC}` + row vào §4.5.6 dùng chung của nhóm (không lặp nhóm); rồi cập nhật §10 (row khoá theo platform×SC) và thêm một row Changelog. Bump `@trace.revision` và làm mới `@trace.ucs` / `@trace.platforms` ở header, và cập nhật entry của platform vừa đụng trong map `@trace.bdd_version` (vd set `web=2.0`, giữ nguyên `system`).
193
+ **Chế độ APPEND (doc đã tồn tại):** **đừng** viết lại section có sẵn. Chèn diagram §5 của UC batch **vào đúng lane platform** (5.A/5.B/5.C, đánh số sau cái cuối trong lane đó, tiêu đề `platform · SC`), các row mới ở §3/§4.3/§8/§9; với §4.5 — platform mới → nhóm `### 4.5 — {platform}` mới, ngược lại thêm sub-block `§4.5.1.x {Screen} — {UC}` + row vào §4.5.6 dùng chung của nhóm (không lặp nhóm); rồi cập nhật §10 (row khoá theo platform×SC) và thêm một row Changelog. Bump `@trace.revision` và làm mới `@trace.ucs` / `@trace.platforms` ở header, và cập nhật entry của platform vừa đụng trong map `@trace.bdd_versions` (vd set `web=2.0`, giữ nguyên `system`).
194
194
 
195
195
  {{include:templates/tech-design.template.md}}
196
196
 
package/commands/learn.md CHANGED
@@ -41,23 +41,23 @@ Hiển thị và chờ phản hồi:
41
41
  ```
42
42
  ⚙️ MODEL CHECK
43
43
  ──────────────────────────────────────────────────────────────────
44
- Recommended : claude-opus-4 (hoặc model Opus mới nhất)
44
+ Recommended : model Opus mới nhất
45
45
  Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
46
- suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
46
+ suy luận sâu. Model nhỏ hơn (Haiku/Sonnet) dễ bỏ sót edge case.
47
47
 
48
48
  Cách đổi trong Claude Code:
49
- SettingsModel chọn "claude-opus"
50
- • hoặc: /modelchọn claude-opus
49
+ /modelchọn model Opus
50
+ • hoặc: SettingsModel
51
51
 
52
- Đang chạy claude-opus?
53
- Y — đúng, đang dùng claude-opus → tiếp tục
52
+ Đang chạy một model Opus?
53
+ Y — đúng → tiếp tục
54
54
  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)
55
55
  ──────────────────────────────────────────────────────────────────
56
56
  ```
57
57
 
58
58
  - "Y" → tiếp tục sang Bước 1.
59
59
  - "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).
60
- - "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."
60
+ - "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."
61
61
 
62
62
  ## Bước 1 — Xác định Target File
63
63
 
@@ -66,7 +66,12 @@ Hiển thị và chờ phản hồi:
66
66
  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/`):
67
67
  - **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 đó.
68
68
  - **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.)*
69
- - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
69
+ - **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:
70
+ - `$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`.
71
+ - `$ARGUMENTS` là **TICKET-ID** → glob trực tiếp như trên.
72
+ - Chưa biết domain → `{specs_dir}/*/*/tech-docs/{TICKET-ID}-tech-design.md`.
73
+ - 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.
74
+ *(Đừ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`.)*
70
75
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
71
76
 
72
77
  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.
@@ -632,7 +637,7 @@ Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **pha
632
637
  | Phase | Commands |
633
638
  |-------|----------|
634
639
  | Discovery | `/define-product` |
635
- | PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
640
+ | PRD | `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` (PRD) |
636
641
  | Design Spec | `/generate-design-spec` |
637
642
  | BDD | `/generate-bdd` · `/review-context` (BDD) |
638
643
  | Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
@@ -657,6 +662,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
657
662
  | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
658
663
  | /define-product | `/generate-prd {product-definition-file}` |
659
664
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
665
+ | /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}` |
660
666
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
661
667
  | /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) |
662
668
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
@@ -669,6 +675,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
669
675
  | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
670
676
  | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
671
677
  | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
678
+ | /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
672
679
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
673
680
  | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
674
681
  | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
@@ -677,11 +684,11 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
677
684
  | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
678
685
  | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
679
686
  | /dev-smoke-test | Tạo PR và link tới ticket |
680
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK tạo PR |
681
- | /fix-bug | Tạo PR link tới ticket |
687
+ | /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** |
688
+ | /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 |
682
689
  | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
683
690
  | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
684
- | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
691
+ | /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` |
685
692
  | /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
686
693
  | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
687
694
  | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
@@ -42,23 +42,23 @@ Hiển thị và chờ phản hồi:
42
42
  ```
43
43
  ⚙️ MODEL CHECK
44
44
  ──────────────────────────────────────────────────────────────────
45
- Recommended : claude-opus-4 (hoặc model Opus mới nhất)
45
+ Recommended : model Opus mới nhất
46
46
  Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
47
- suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
47
+ suy luận sâu. Model nhỏ hơn (Haiku/Sonnet) dễ bỏ sót edge case.
48
48
 
49
49
  Cách đổi trong Claude Code:
50
- SettingsModel chọn "claude-opus"
51
- • hoặc: /modelchọn claude-opus
50
+ /modelchọn model Opus
51
+ • hoặc: SettingsModel
52
52
 
53
- Đang chạy claude-opus?
54
- Y — đúng, đang dùng claude-opus → tiếp tục
53
+ Đang chạy một model Opus?
54
+ Y — đúng → tiếp tục
55
55
  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)
56
56
  ──────────────────────────────────────────────────────────────────
57
57
  ```
58
58
 
59
59
  - "Y" → tiếp tục sang Bước 1.
60
60
  - "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).
61
- - "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."
61
+ - "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."
62
62
 
63
63
  ## Bước 1 — Xác định Target File
64
64
 
@@ -67,7 +67,12 @@ Hiển thị và chờ phản hồi:
67
67
  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/`):
68
68
  - **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 đó.
69
69
  - **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.)*
70
- - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
70
+ - **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:
71
+ - `$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`.
72
+ - `$ARGUMENTS` là **TICKET-ID** → glob trực tiếp như trên.
73
+ - Chưa biết domain → `{specs_dir}/*/*/tech-docs/{TICKET-ID}-tech-design.md`.
74
+ - 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.
75
+ *(Đừ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`.)*
71
76
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
72
77
 
73
78
  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.
@@ -579,7 +584,7 @@ Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **pha
579
584
  | Phase | Commands |
580
585
  |-------|----------|
581
586
  | Discovery | `/define-product` |
582
- | PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
587
+ | PRD | `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` (PRD) |
583
588
  | Design Spec | `/generate-design-spec` |
584
589
  | BDD | `/generate-bdd` · `/review-context` (BDD) |
585
590
  | Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
@@ -604,6 +609,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
604
609
  | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
605
610
  | /define-product | `/generate-prd {product-definition-file}` |
606
611
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
612
+ | /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}` |
607
613
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
608
614
  | /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) |
609
615
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
@@ -616,6 +622,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
616
622
  | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
617
623
  | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
618
624
  | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
625
+ | /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
619
626
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
620
627
  | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
621
628
  | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
@@ -624,11 +631,11 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
624
631
  | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
625
632
  | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
626
633
  | /dev-smoke-test | Tạo PR và link tới ticket |
627
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK tạo PR |
628
- | /fix-bug | Tạo PR link tới ticket |
634
+ | /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** |
635
+ | /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 |
629
636
  | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
630
637
  | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
631
- | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
638
+ | /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` |
632
639
  | /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
633
640
  | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
634
641
  | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
@@ -42,23 +42,23 @@ Hiển thị và chờ phản hồi:
42
42
  ```
43
43
  ⚙️ MODEL CHECK
44
44
  ──────────────────────────────────────────────────────────────────
45
- Recommended : claude-opus-4 (hoặc model Opus mới nhất)
45
+ Recommended : model Opus mới nhất
46
46
  Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
47
- suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
47
+ suy luận sâu. Model nhỏ hơn (Haiku/Sonnet) dễ bỏ sót edge case.
48
48
 
49
49
  Cách đổi trong Claude Code:
50
- SettingsModel chọn "claude-opus"
51
- • hoặc: /modelchọn claude-opus
50
+ /modelchọn model Opus
51
+ • hoặc: SettingsModel
52
52
 
53
- Đang chạy claude-opus?
54
- Y — đúng, đang dùng claude-opus → tiếp tục
53
+ Đang chạy một model Opus?
54
+ Y — đúng → tiếp tục
55
55
  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)
56
56
  ──────────────────────────────────────────────────────────────────
57
57
  ```
58
58
 
59
59
  - "Y" → tiếp tục sang Bước 1.
60
60
  - "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).
61
- - "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."
61
+ - "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."
62
62
 
63
63
  ## Bước 1 — Xác định Target File
64
64
 
@@ -67,7 +67,12 @@ Hiển thị và chờ phản hồi:
67
67
  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/`):
68
68
  - **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 đó.
69
69
  - **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.)*
70
- - **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
70
+ - **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:
71
+ - `$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`.
72
+ - `$ARGUMENTS` là **TICKET-ID** → glob trực tiếp như trên.
73
+ - Chưa biết domain → `{specs_dir}/*/*/tech-docs/{TICKET-ID}-tech-design.md`.
74
+ - 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.
75
+ *(Đừ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`.)*
71
76
  - **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
72
77
 
73
78
  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.
@@ -528,7 +533,16 @@ Ghi vào `{paths.prd_change_requests_dir}/{UC-ID}-{slug}.md` (phân giải về
528
533
 
529
534
  **Requested behavior:** {description}
530
535
  **Suggested AC (draft cho PO):** "{draft AC text}"
531
- **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`.
536
+ **Route to PO:**
537
+ 1. Đặt `Status: accepted` trong file này nếu nhận yêu cầu.
538
+ 2. Chạy **`/extend-prd {prd_path}`** — nó tự nhặt request `accepted`, hỏi PO chốt AC/BR đúng
539
+ tầng, đánh số **nối tiếp** (không đụng ID cũ), bump version + ghi changelog nêu rõ scope,
540
+ rồi đóng dấu `incorporated` + chuyển file này sang `archived/`.
541
+ 3. `/refine-prd` → `/review-context` → PO đặt `approved` → `/generate-bdd` **chỉ cho UC MỚI**.
542
+
543
+ ⚠️ **KHÔNG dùng `/refine-prd` để thêm AC mới.** Nó chỉ áp findings từ review và có luật cấm
544
+ đụng section nào không được finding tham chiếu. **KHÔNG dùng `/generate-prd`** — nó từ chối
545
+ chạy trên PRD đã có (ghi đè sẽ mất changelog + đánh số lại BR).
532
546
  ```
533
547
  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).
534
548
 
@@ -538,8 +552,21 @@ Nếu không chắc case nào → hiện danh sách AC và hỏi tester nó map
538
552
 
539
553
  Viết Gherkin nhất quán với convention của `/generate-bdd` cho `active_platform`:
540
554
  - Dùng vocabulary platform (web: clicks/sees; app: taps/sees; system: business event)
541
- - Gồm tag `@trace`: `@trace.uc={UC-ID}`, `@trace.ac={AC-N}`, cùng `@proposed @from-test`
542
555
  - Một scenario tập trung; Given/When/Then cụ thể; không chi tiết implementation
556
+ - **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:
557
+
558
+ ```gherkin
559
+ # Side-effects: {liệt kê side-effect quan sát được, hoặc "—"}
560
+ # @trace.scenario: {UC-ID}-SC? ← "?" = số do /generate-bdd gán lúc chèn (tester không biết số kế tiếp)
561
+ # @trace.sc_version: 1.0
562
+ # @trace.business_rules: {BR-ID nếu xác định được, else —}
563
+ # Covers: AC{N} ← comment thường, KHÔNG phải @trace (AC không phải trace key)
564
+ # Nguồn: proposal {file} · {BUG-ID nếu có}
565
+ @proposed @from-test @edge
566
+ Scenario: {business outcome}
567
+ ```
568
+
569
+ > **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`.
543
570
 
544
571
  ## Step 4 — Ghi Proposal
545
572
 
@@ -612,7 +639,7 @@ Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **pha
612
639
  | Phase | Commands |
613
640
  |-------|----------|
614
641
  | Discovery | `/define-product` |
615
- | PRD | `/generate-prd` · `/refine-prd` · `/review-context` (PRD) |
642
+ | PRD | `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` (PRD) |
616
643
  | Design Spec | `/generate-design-spec` |
617
644
  | BDD | `/generate-bdd` · `/review-context` (BDD) |
618
645
  | Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
@@ -637,6 +664,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
637
664
  | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
638
665
  | /define-product | `/generate-prd {product-definition-file}` |
639
666
  | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
667
+ | /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}` |
640
668
  | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
641
669
  | /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) |
642
670
  | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
@@ -649,6 +677,7 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
649
677
  | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
650
678
  | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
651
679
  | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
680
+ | /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
652
681
  | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
653
682
  | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
654
683
  | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
@@ -657,11 +686,11 @@ Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
657
686
  | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
658
687
  | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
659
688
  | /dev-smoke-test | Tạo PR và link tới ticket |
660
- | /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK tạo PR |
661
- | /fix-bug | Tạo PR link tới ticket |
689
+ | /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** |
690
+ | /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 |
662
691
  | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
663
692
  | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
664
- | /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
693
+ | /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` |
665
694
  | /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
666
695
  | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
667
696
  | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
@@ -678,6 +707,14 @@ Next : {lệnh gợi ý kèm ví dụ tham số}
678
707
  *(Bỏ dòng `Pipeline` cho các lệnh xuyên suốt liệt kê ở trên.)*
679
708
 
680
709
 
710
+ > **Hai khối report — chọn theo case đã chốt ở Step 2. In ĐÚNG MỘT khối.**
711
+ > 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
712
+ > đườ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:
713
+ > 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`
714
+ > nhặt — trong khi lệnh đó **không bao giờ** đọc `prd-change-requests/`.
715
+
716
+ ### Khối Case A — scenario proposal *(behavior nằm trong một AC có sẵn)*
717
+
681
718
  ```
682
719
  📝 Scenario proposal → {paths.bdd_proposals_dir}/{UC-ID}-{slug}.md
683
720
 
@@ -686,7 +723,12 @@ Maps to AC : {AC-N} — "{AC text}"
686
723
  Source : {BUG-ID nếu có | quan sát tester}
687
724
 
688
725
  Scenario đề xuất (DRAFT — chờ PO/Dev review):
689
- @proposed @from-test @trace.uc={UC-ID} @trace.ac={AC-N}
726
+ # Side-effects: {}
727
+ # @trace.scenario: {UC-ID}-SC?
728
+ # @trace.sc_version: 1.0
729
+ # @trace.business_rules: {BR-ID | —}
730
+ # Covers: AC{N}
731
+ @proposed @from-test @edge
690
732
  Scenario: {title}
691
733
  Given {…}
692
734
  When {…}
@@ -705,3 +747,37 @@ Status : ✅ Complete (read-only trên BDD canonical — chỉ proposal)
705
747
  Output Artifacts: created {paths.bdd_proposals_dir}/{UC-ID}-{slug}.md (pushed to shared spec repo)
706
748
  Next : PO/Dev thấy nó ở lần /sync tiếp theo → review & promote
707
749
  ```
750
+
751
+ ### Khối Case B — PRD change request *(requirement mới, không AC nào phủ)*
752
+
753
+ ```
754
+ 📋 PRD change request → {paths.prd_change_requests_dir}/{UC-ID}-{slug}.md
755
+
756
+ UC : {UC-ID} ({active_platform})
757
+ Loại : requirement MỚI — không AC nào phủ (KHÔNG phải coverage gap)
758
+ PRD : {prd_path} (v{prd_version})
759
+ Source : {BUG-ID nếu có | quan sát tester/QC}
760
+ Behavior : {description}
761
+ Draft AC : "{draft AC text}" ← đề xuất cho PO cân nhắc, PO chốt lại
762
+
763
+ ⚠️ Lệnh này KHÔNG sinh BDD scenario nào — scenario chưa có AC để trace tới.
764
+ Nó chỉ xuất hiện SAU KHI PO đưa requirement vào PRD rồi chạy lại /generate-bdd.
765
+ 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
766
+ coverage hiện tại thì hành vi bạn vừa phát hiện không tồn tại.
767
+
768
+ Để PO xử lý:
769
+ [ ] Đọc request, quyết định nhận hay không
770
+ [ ] Nhận → đặt Status: accepted trong file request
771
+ [ ] /extend-prd {prd-file} ← nhặt request, chốt AC/BR với PO, đánh số nối tiếp,
772
+ bump version + changelog, tự đóng dấu incorporated
773
+ [ ] /refine-prd → /review-context {prd-file} ← soi + kiểm phần vừa thêm
774
+ [ ] PO đặt Status: approved → /generate-bdd {prd-file} (CHỈ UC mới) → /generate-code
775
+
776
+ Handoff : {✅ committed + pushed to spec repo | ⚠️ chạy git command ở trên / mở PR}
777
+
778
+ ---
779
+ Status : ✅ Complete (không đụng BDD — đây là yêu cầu đổi tài liệu, không phải scenario)
780
+ Output Artifacts: created {paths.prd_change_requests_dir}/{UC-ID}-{slug}.md (pushed to shared spec repo)
781
+ Next : PO thấy nó ở lần /sync tiếp theo. Nếu chưa xử, /validate-traces sẽ nhắc lại
782
+ (kèm số ngày chờ) mỗi lần chạy, chừng nào Status còn Open.
783
+ ```