@educa-corp/sdd-framework 0.5.0 → 0.7.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 (243) hide show
  1. package/bin/build.js +113 -19
  2. package/bin/gate-trace.js +487 -0
  3. package/bin/index.js +445 -146
  4. package/bin/lint-trace.js +643 -0
  5. package/bin/self-check.js +804 -2
  6. package/bin/trace-schema.json +621 -10
  7. package/core/FRAMEWORK_VERSION +1 -1
  8. package/core/README.md +20 -0
  9. package/core/commands/amend-prd.md +518 -0
  10. package/core/commands/debug.md +123 -511
  11. package/core/commands/define-product.md +86 -510
  12. package/core/commands/dev-gen-test.md +86 -510
  13. package/core/commands/dev-run-test.md +133 -519
  14. package/core/commands/dev-smoke-test.md +86 -510
  15. package/core/commands/extend-prd.md +128 -522
  16. package/core/commands/fix-bug.md +118 -509
  17. package/core/commands/generate-architecture.md +94 -515
  18. package/core/commands/generate-bdd.md +128 -513
  19. package/core/commands/generate-code.md +119 -510
  20. package/core/commands/generate-design-spec.md +86 -510
  21. package/core/commands/generate-prd.md +89 -510
  22. package/core/commands/generate-spec-manifest.md +86 -510
  23. package/core/commands/generate-tech-docs.md +120 -512
  24. package/core/commands/learn.md +172 -496
  25. package/core/commands/map-testids.md +86 -510
  26. package/core/commands/propose-scenario.md +86 -510
  27. package/core/commands/qc-analyze.md +86 -510
  28. package/core/commands/qc-design-test.md +86 -510
  29. package/core/commands/qc-plan.md +86 -510
  30. package/core/commands/qc-report.md +86 -510
  31. package/core/commands/qc-review.md +86 -510
  32. package/core/commands/qc-run-test.md +115 -513
  33. package/core/commands/refine-prd.md +112 -522
  34. package/core/commands/report-bug.md +86 -510
  35. package/core/commands/review-code.md +123 -511
  36. package/core/commands/review-context.md +136 -522
  37. package/core/commands/review-tech-docs.md +90 -511
  38. package/core/commands/setup-ai-first.md +166 -138
  39. package/core/commands/sync.md +155 -107
  40. package/core/commands/update-framework.md +16 -103
  41. package/core/commands/validate-traces.md +426 -511
  42. package/core/hooks/data-guard.js +174 -83
  43. package/core/hooks/settings.json +2 -1
  44. package/core/rules/workflow.md +64 -4
  45. package/core/steps/capture-lesson.md +34 -1
  46. package/core/steps/context-loader.md +50 -8
  47. package/core/steps/gate.md +92 -35
  48. package/core/steps/report-footer.md +23 -0
  49. package/core/templates/README.md +24 -1
  50. package/core/templates/ci/trace-gate.yml +146 -0
  51. package/core/templates/feature.template +1 -1
  52. package/core/templates/hooks/pre-push +61 -0
  53. package/docs/02-concepts/architecture.md +61 -6
  54. package/docs/02-concepts/traceability.md +57 -0
  55. package/docs/03-guides/architect.md +63 -0
  56. package/docs/04-reference/commands.md +148 -134
  57. package/docs/04-reference/model-selection.md +32 -19
  58. package/docs/04-reference/trace-schema.md +39 -0
  59. package/docs/explain/02b-extend-prd.md +1 -1
  60. package/docs/explain/02c-amend-prd.md +152 -0
  61. package/docs/explain/21-validate-traces.md +2 -1
  62. package/docs/explain/27-learn.md +5 -3
  63. package/docs/explain/28-sync.md +25 -0
  64. package/docs/explain/README.md +136 -135
  65. package/package.json +5 -9
  66. package/commands/debug.md +0 -917
  67. package/commands/debug.tmpl +0 -257
  68. package/commands/define-product.md +0 -862
  69. package/commands/define-product.tmpl +0 -225
  70. package/commands/dev-gen-test.md +0 -1124
  71. package/commands/dev-gen-test.tmpl +0 -490
  72. package/commands/dev-run-test.md +0 -859
  73. package/commands/dev-run-test.tmpl +0 -225
  74. package/commands/dev-smoke-test.md +0 -798
  75. package/commands/dev-smoke-test.tmpl +0 -217
  76. package/commands/extend-prd.md +0 -907
  77. package/commands/extend-prd.tmpl +0 -270
  78. package/commands/fix-bug.md +0 -910
  79. package/commands/fix-bug.tmpl +0 -197
  80. package/commands/generate-architecture.md +0 -775
  81. package/commands/generate-architecture.tmpl +0 -194
  82. package/commands/generate-bdd.md +0 -1347
  83. package/commands/generate-bdd.tmpl +0 -590
  84. package/commands/generate-code.md +0 -1283
  85. package/commands/generate-code.tmpl +0 -649
  86. package/commands/generate-design-spec.md +0 -1161
  87. package/commands/generate-design-spec.tmpl +0 -524
  88. package/commands/generate-prd.md +0 -1143
  89. package/commands/generate-prd.tmpl +0 -223
  90. package/commands/generate-spec-manifest.md +0 -745
  91. package/commands/generate-spec-manifest.tmpl +0 -164
  92. package/commands/generate-tech-docs.md +0 -1344
  93. package/commands/generate-tech-docs.tmpl +0 -273
  94. package/commands/learn.md +0 -723
  95. package/commands/learn.tmpl +0 -63
  96. package/commands/map-testids.md +0 -662
  97. package/commands/map-testids.tmpl +0 -81
  98. package/commands/propose-scenario.md +0 -783
  99. package/commands/propose-scenario.tmpl +0 -202
  100. package/commands/qc-analyze.md +0 -693
  101. package/commands/qc-analyze.tmpl +0 -112
  102. package/commands/qc-design-test.md +0 -650
  103. package/commands/qc-design-test.tmpl +0 -69
  104. package/commands/qc-plan.md +0 -630
  105. package/commands/qc-plan.tmpl +0 -49
  106. package/commands/qc-report.md +0 -641
  107. package/commands/qc-report.tmpl +0 -60
  108. package/commands/qc-review.md +0 -634
  109. package/commands/qc-review.tmpl +0 -53
  110. package/commands/qc-run-test.md +0 -750
  111. package/commands/qc-run-test.tmpl +0 -116
  112. package/commands/refine-prd.md +0 -1074
  113. package/commands/refine-prd.tmpl +0 -278
  114. package/commands/report-bug.md +0 -729
  115. package/commands/report-bug.tmpl +0 -148
  116. package/commands/review-code.md +0 -803
  117. package/commands/review-code.tmpl +0 -143
  118. package/commands/review-context.md +0 -1323
  119. package/commands/review-context.tmpl +0 -527
  120. package/commands/review-tech-docs.md +0 -982
  121. package/commands/review-tech-docs.tmpl +0 -401
  122. package/commands/setup-ai-first.md +0 -574
  123. package/commands/setup-ai-first.tmpl +0 -378
  124. package/commands/sync.md +0 -486
  125. package/commands/sync.tmpl +0 -384
  126. package/commands/update-framework.md +0 -290
  127. package/commands/update-framework.tmpl +0 -188
  128. package/commands/validate-traces.md +0 -1435
  129. package/commands/validate-traces.tmpl +0 -854
  130. package/hooks/data-guard.js +0 -141
  131. package/hooks/settings.json +0 -18
  132. package/modules/android-compose/module.yaml +0 -13
  133. package/modules/android-compose/stack-profile.yaml +0 -57
  134. package/modules/angular/architecture-snippets/component-patterns.md +0 -187
  135. package/modules/angular/module.yaml +0 -6
  136. package/modules/angular/stack-profile.yaml +0 -38
  137. package/modules/context-engineering/architecture-snippets/context-design.md +0 -119
  138. package/modules/context-engineering/module.yaml +0 -9
  139. package/modules/context-engineering/stack-profile.yaml +0 -61
  140. package/modules/dotnet/architecture-snippets/clean-arch.md +0 -160
  141. package/modules/dotnet/module.yaml +0 -6
  142. package/modules/dotnet/stack-profile.yaml +0 -50
  143. package/modules/flutter/module.yaml +0 -14
  144. package/modules/flutter/stack-profile.yaml +0 -59
  145. package/modules/golang/architecture-snippets/domain-layout.md +0 -283
  146. package/modules/golang/module.yaml +0 -6
  147. package/modules/golang/stack-profile.yaml +0 -40
  148. package/modules/ios-swiftui/module.yaml +0 -13
  149. package/modules/ios-swiftui/stack-profile.yaml +0 -55
  150. package/modules/java-spring/architecture-snippets/layered-arch.md +0 -201
  151. package/modules/java-spring/module.yaml +0 -15
  152. package/modules/java-spring/stack-profile.yaml +0 -28
  153. package/modules/nextjs/architecture-snippets/app-router-patterns.md +0 -269
  154. package/modules/nextjs/module.yaml +0 -14
  155. package/modules/nextjs/stack-profile.yaml +0 -74
  156. package/modules/nuxt/module.yaml +0 -14
  157. package/modules/nuxt/stack-profile.yaml +0 -58
  158. package/modules/phaser-game/architecture-snippets/phaser-scene-patterns.md +0 -646
  159. package/modules/phaser-game/module.yaml +0 -15
  160. package/modules/phaser-game/stack-profile.yaml +0 -90
  161. package/modules/php-laravel/architecture-snippets/service-repository.md +0 -302
  162. package/modules/php-laravel/module.yaml +0 -15
  163. package/modules/php-laravel/stack-profile.yaml +0 -56
  164. package/modules/qc-playwright/stack-profile.yaml +0 -66
  165. package/modules/react/architecture-snippets/hooks-query-patterns.md +0 -254
  166. package/modules/react/module.yaml +0 -14
  167. package/modules/react/stack-profile.yaml +0 -63
  168. package/modules/react-native/module.yaml +0 -14
  169. package/modules/react-native/stack-profile.yaml +0 -56
  170. package/modules/vue/module.yaml +0 -14
  171. package/modules/vue/stack-profile.yaml +0 -65
  172. package/rules/data-protection.md +0 -80
  173. package/rules/workflow.md +0 -73
  174. package/scripts/init.sh +0 -49
  175. package/scripts/upgrade.sh +0 -94
  176. package/skills/code/SKILL.md +0 -19
  177. package/skills/code/SKILL.tmpl +0 -19
  178. package/skills/debug/SKILL.md +0 -19
  179. package/skills/debug/SKILL.tmpl +0 -19
  180. package/skills/design-spec/SKILL.md +0 -11
  181. package/skills/design-spec/SKILL.tmpl +0 -11
  182. package/skills/discovery/SKILL.md +0 -14
  183. package/skills/discovery/SKILL.tmpl +0 -14
  184. package/skills/prd/SKILL.md +0 -19
  185. package/skills/prd/SKILL.tmpl +0 -19
  186. package/skills/qc/qa-analyst/DOC_GAPS.template.md +0 -63
  187. package/skills/qc/qa-analyst/acceptance-criteria.md +0 -60
  188. package/skills/qc/qa-analyst/business-rules.md +0 -59
  189. package/skills/qc/qa-analyst/data-flow.md +0 -64
  190. package/skills/qc/qa-analyst/spec-breakdown.md +0 -61
  191. package/skills/qc/qa-designer/e2e/journey.md +0 -41
  192. package/skills/qc/qa-designer/exploratory/charter.md +0 -68
  193. package/skills/qc/qa-designer/exploratory/explore-to-functional.md +0 -43
  194. package/skills/qc/qa-designer/functional/api.md +0 -45
  195. package/skills/qc/qa-designer/functional/gui-feature.md +0 -46
  196. package/skills/qc/qa-designer/functional/gui-screen.md +0 -52
  197. package/skills/qc/qa-designer/integration/api.md +0 -42
  198. package/skills/qc/qa-designer/integration/db.md +0 -39
  199. package/skills/qc/qa-designer/integration/gui.md +0 -40
  200. package/skills/qc/qa-designer/integration/kafka.md +0 -40
  201. package/skills/qc/qa-designer/non-functional.md +0 -40
  202. package/skills/qc/qa-planner/test-plan.md +0 -120
  203. package/skills/qc/qa-reviewer/script/e2e.md +0 -87
  204. package/skills/qc/qa-reviewer/script/exploratory.md +0 -45
  205. package/skills/qc/qa-reviewer/script/functional.md +0 -101
  206. package/skills/qc/qa-reviewer/script/integration.md +0 -91
  207. package/skills/qc/qa-reviewer/script/non-functional.md +0 -126
  208. package/skills/qc/qa-reviewer/test-case/e2e.md +0 -73
  209. package/skills/qc/qa-reviewer/test-case/exploratory.md +0 -43
  210. package/skills/qc/qa-reviewer/test-case/functional.md +0 -76
  211. package/skills/qc/qa-reviewer/test-case/integration.md +0 -69
  212. package/skills/qc/qa-reviewer/test-case/non-functional.md +0 -73
  213. package/skills/qc/qa-runner/e2e.md +0 -49
  214. package/skills/qc/qa-runner/exploratory/session.md +0 -36
  215. package/skills/qc/qa-runner/functional/api.md +0 -35
  216. package/skills/qc/qa-runner/functional/gui-feature.md +0 -51
  217. package/skills/qc/qa-runner/functional/gui-screen.md +0 -55
  218. package/skills/qc/qa-runner/integration.md +0 -47
  219. package/skills/qc/qa-runner/non-functional.md +0 -49
  220. package/skills/qc/qa-runner/report/report.md +0 -37
  221. package/skills/setup-ai-first/SKILL.md +0 -19
  222. package/skills/setup-ai-first/SKILL.tmpl +0 -19
  223. package/skills/spec/SKILL.md +0 -19
  224. package/skills/spec/SKILL.tmpl +0 -19
  225. package/skills/test/SKILL.md +0 -18
  226. package/skills/test/SKILL.tmpl +0 -18
  227. package/steps/business-language.md +0 -56
  228. package/steps/capture-lesson.md +0 -79
  229. package/steps/context-loader.md +0 -385
  230. package/steps/gate.md +0 -94
  231. package/steps/report-footer.md +0 -102
  232. package/steps/review-fanout.md +0 -159
  233. package/steps/spawn-agent.md +0 -129
  234. package/steps/trace-mirror.md +0 -53
  235. package/templates/README.md +0 -47
  236. package/templates/architecture.template.md +0 -394
  237. package/templates/design-spec.template.md +0 -217
  238. package/templates/feature.template +0 -123
  239. package/templates/platform-guide.template.md +0 -145
  240. package/templates/prd.template.md +0 -283
  241. package/templates/product-definition.template.md +0 -188
  242. package/templates/project-context.yaml +0 -212
  243. package/templates/tech-design.template.md +0 -490
@@ -1,102 +0,0 @@
1
- # Report Footer — Định dạng output chuẩn cho mọi lệnh
2
-
3
- Mọi report của lệnh phải kết thúc bằng section footer chuẩn này.
4
-
5
- ## Status Badge
6
-
7
- Chọn một theo kết quả:
8
- - `✅ Complete` — mọi bước thành công, không có vấn đề
9
- - `❌ Failed` — lệnh không hoàn thành được do lỗi chặn
10
- - `⚠️ Warnings` — hoàn thành nhưng có vấn đề không chặn, nên review lại
11
-
12
- ## Output Artifacts
13
-
14
- Liệt kê mọi file được tạo hoặc sửa bởi lệnh này:
15
- ```
16
- Output Artifacts:
17
- {created|updated} {file-path} ({mô tả ngắn})
18
- {created|updated} {file-path} ({mô tả ngắn})
19
- ```
20
-
21
- Nếu không ghi file nào (vd: lệnh review hoặc phân tích) → ghi `Output Artifacts: none (read-only)`.
22
-
23
- ## Pipeline Position
24
-
25
- In một sơ đồ pipeline một dòng, đánh dấu phase của lệnh HIỆN TẠI bằng `◀ bạn ở đây`,
26
- để người dùng luôn thấy lệnh này nằm ở đâu trong luồng end-to-end:
27
-
28
- ```
29
- Discovery → PRD → [Design Spec] → BDD → Tech Design → Code → Dev Self-Check → QC → Trace Audit
30
- ```
31
-
32
- Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **phase của nó** trong sơ đồ trên:
33
-
34
- | Phase | Commands |
35
- |-------|----------|
36
- | Discovery | `/define-product` |
37
- | PRD | `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` (PRD) |
38
- | Design Spec | `/generate-design-spec` |
39
- | BDD | `/generate-bdd` · `/review-context` (BDD) |
40
- | Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
41
- | Code | `/generate-code` · `/review-code` |
42
- | Dev Self-Check | `/dev-gen-test` · `/dev-run-test` · `/dev-smoke-test` |
43
- | QC | `/qc-analyze` · `/qc-plan` · `/qc-design-test` · `/qc-review` · `/qc-run-test` · `/qc-report` |
44
- | Trace Audit | `/validate-traces` |
45
-
46
- Với **lệnh review**, thêm vòng review 3 bước và đánh dấu bước hiện tại, vd:
47
- `Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume`.
48
-
49
- **Lệnh xuyên suốt** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
50
- `/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) nằm ngoài pipeline tuyến tính —
51
- **bỏ hẳn dòng Pipeline** cho các lệnh này (đừng cố nhét chúng vào sơ đồ).
52
-
53
- ## Gợi ý lệnh tiếp theo
54
-
55
- Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
56
-
57
- | Lệnh hiện tại | Gợi ý lệnh tiếp theo |
58
- |-------------------------|-----------------------------------------------|
59
- | /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
60
- | /define-product | `/generate-prd {product-definition-file}` |
61
- | /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
62
- | /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}` |
63
- | /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
64
- | /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) |
65
- | /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
66
- | /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
67
- | /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
68
- | /qc-analyze | `/qc-plan {UC-ID}` (xử lý các gap blocker 🔴 trước) |
69
- | /qc-plan | `/qc-design-test {UC-ID}` |
70
- | /qc-design-test | `/qc-review {UC-ID}` (review test-case) |
71
- | /qc-review (test-case) | `/qc-run-test {UC-ID}` nếu APPROVED; sửa TC nếu NEEDS_FIX |
72
- | /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
73
- | /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
74
- | /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
75
- | /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
76
- | /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
77
- | /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
78
- | /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
79
- | /dev-gen-test | `/dev-run-test {UC-ID}` |
80
- | /dev-run-test (passing) | `/review-code {UC-ID}` |
81
- | /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
82
- | /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
83
- | /dev-smoke-test | Tạo PR và link tới ticket |
84
- | /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** |
85
- | /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 |
86
- | /debug | `/fix-bug {ticket-id}` nếu cần sửa |
87
- | /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
88
- | /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` |
89
- | /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
90
- | /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
91
- | /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
92
-
93
- Định dạng footer như sau:
94
- ```
95
- ---
96
- Status : {badge}
97
- {khối Output Artifacts}
98
- Pipeline : Discovery → PRD → [BDD ◀ bạn ở đây] → Tech Design → Code → Dev Self-Check → QC → Trace Audit
99
- (lệnh review) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
100
- Next : {lệnh gợi ý kèm ví dụ tham số}
101
- ```
102
- *(Bỏ dòng `Pipeline` cho các lệnh xuyên suốt liệt kê ở trên.)*
@@ -1,159 +0,0 @@
1
- # Review Fan-Out toàn diện + Hội tụ về độ đầy đủ
2
-
3
- **Vì sao có cái này:** Một lượt review đơn không bao giờ liệt kê hết mọi vấn đề cùng lúc — model
4
- dừng ở mức "đủ" findings, nên mỗi vòng review sau lại lòi ra vấn đề *mới*
5
- (đập chuột chũi). Quy trình này ép review **hội tụ trong một lần chạy lệnh**:
6
- fan out song song theo các chiều review, rồi lặp một critic độ-đầy-đủ cho tới khi một
7
- vòng không sinh thêm gì mới, *trước khi* ghi file findings.
8
-
9
- Lệnh gọi cung cấp hai thứ bắt buộc + hai tuỳ chọn:
10
- - **DIMENSIONS** — danh sách các chiều review để fan out
11
- (`/refine-prd` → 3 lăng kính; `/review-context` → các P-check hoặc B-check).
12
- - **FINDINGS SCHEMA** — dạng YAML mà mỗi finding phải theo (định nghĩa trong lệnh).
13
- - **GRANULARITY** *(tuỳ chọn, mặc định `auto`)* — `auto`: chọn độ mịn fan-out theo bảng ngưỡng kích thước ở Phase 1 (hành vi cũ). `per-uc`: **LUÔN** fan-out theo từng UC, **bỏ qua ngưỡng** — dùng cho review cần độ đầy đủ cao (`/refine-prd` truyền cái này để lần đầu đã quét sâu). Lệnh không truyền → `auto` → hành vi không đổi.
14
- - **CHANGED_SCOPE** *(tuỳ chọn)* — danh sách UC/section đã thay đổi (review **delta**). Nếu được truyền, Phase 1 chỉ fan-out trên các phạm vi này + PRD-global; Phase 2 critic vẫn quét **toàn doc** làm lưới an toàn. Không truyền → quét toàn bộ như thường.
15
-
16
- > **Bỏ qua ở chế độ sub-agent:** Nếu Gate Bước 0 đã set `_agent_mode: true`, toàn bộ
17
- > quy trình này bị **bỏ qua** — orchestrator đã chạy sẵn một dimension/UC cho mỗi
18
- > sub-agent. Chạy các check của lệnh trực tiếp trên section đã giới hạn và trả về findings.
19
-
20
- ---
21
-
22
- ## Phase 1 — Quét dimension song song
23
-
24
- **Bao nhiêu sub-agent:** *số lượng* agent không phải là đòn bẩy độ đầy đủ — bề rộng được
25
- cố định bởi taxonomy DIMENSION (thêm agent vào cùng một dimension chỉ tìm lại cùng vấn đề),
26
- còn *độ sâu* thuộc về vòng lặp critic ở Phase 2.
27
-
28
- **Nếu `GRANULARITY = per-uc`:** **bỏ qua bảng ngưỡng dưới đây**, luôn dùng độ mịn **DIMENSION × phạm vi UC** (kể cả PRD nhỏ) — đảm bảo quét sâu, không bỏ sót ngay lần đầu. (Cái giá: nhiều agent hơn cho PRD nhỏ — chấp nhận để lần đầu đầy đủ.)
29
-
30
- **Nếu `GRANULARITY = auto`** (mặc định): chọn **độ mịn fan-out** theo kích thước target, tái dùng ngưỡng của `steps/spawn-agent.md`:
31
-
32
- | Kích thước target | Độ mịn | Số agent |
33
- |-------------|-------------|-------------|
34
- | ≤ 3 UC **và** ≤ 300 dòng | một agent cho mỗi DIMENSION trên cả file | = số dimension |
35
- | > 3 UC **hoặc** > 300 dòng | một agent cho mỗi **DIMENSION × phạm vi UC** (các UC + một phạm vi PRD-global), gom batch để vừa giới hạn agent | `dimensions × (UCs + 1)`, có cap (xem dưới) |
36
-
37
- Độ mịn lớn hơn giữ context của mỗi sub-agent nhỏ và quét nó vét cạn trên một
38
- UC duy nhất — chính là điều ngăn bỏ sót trên các PRD lớn.
39
-
40
- > **Các section global (không thuộc UC) — bắt buộc ở chế độ `DIMENSION × UC`.** Mỗi agent per-UC chỉ
41
- > thấy một UC, nên các section toàn-PRD không thuộc UC nào (scope, success metric,
42
- > problem statement, terminology, glossary, changelog) sẽ không được quét. Khi nào
43
- > fan out theo UC, cũng phải thêm một phạm vi **"PRD-global"** (các section không thuộc UC, finding nhận
44
- > `uc_id: ""`) bên cạnh danh sách UC. Nên số agent tự nhiên là `dimensions × (UCs + 1)`.
45
- > (Không cần ở chế độ whole-file — ở đó mỗi agent đã thấy các section global rồi.)
46
-
47
- ### Agent cap — gom batch các UC khi fan-out quá rộng
48
-
49
- `dimensions × (UCs + 1)` có thể bùng nổ trên PRD lớn (vd 6 check × (8 UC + 1) = 54
50
- agent). Giới hạn mỗi wave ở **`AGENT_CAP = 12`** agent và gom batch các phạm vi UC cho vừa:
51
-
52
- 1. Dựng danh sách phạm vi = `[UC1, UC2, …, UCn, PRD-global]` (độ dài `UCs + 1`).
53
- - **Nếu `CHANGED_SCOPE` được truyền (review delta):** danh sách phạm vi = `[các UC trong CHANGED_SCOPE] + [PRD-global]` (chỉ các UC đã đổi + global), KHÔNG phải tất cả UC. Số agent tụt theo đó.
54
- 2. Tính số-phạm-vi-mỗi-bucket: `groups = max(1, floor(AGENT_CAP / dimensions))`.
55
- - Nếu `groups ≥ UCs + 1` → không cần batch, chạy một agent cho mỗi `DIMENSION × scope`.
56
- - Else chia danh sách phạm vi thành `groups` bucket liền kề kích thước xấp xỉ bằng nhau
57
- (giữ `PRD-global` ở bucket riêng nếu vừa; nếu không thì gắn vào bucket cuối).
58
- Mỗi agent khi đó xử lý **một DIMENSION trên một bucket UC**.
59
- 3. Kích thước wave kết quả = `dimensions × groups ≤ AGENT_CAP`.
60
-
61
- Một agent đã batch review nhiều UC cùng lúc — vẫn giới hạn chặt hơn nhiều so với cả
62
- file, nên độ phủ vẫn cao. `AGENT_CAP` là núm chỉnh duy nhất; tăng nếu host cho phép
63
- concurrency nhiều hơn, giảm để tiết kiệm token. Chế độ whole-file (≤ 3 UC) không bao giờ chạm cap.
64
-
65
- Spawn các sub-agent đã chọn bằng Agent tool (gửi trong một message duy nhất để chúng
66
- chạy đồng thời). Mỗi sub-agent nhận một **context window mới** và quét phạm vi của nó
67
- chỉ qua **một** dimension duy nhất — độ phủ sâu hơn một session phải tung hứng mọi
68
- dimension cùng lúc (tránh lost-in-the-middle).
69
-
70
- Template prompt cho sub-agent (điền vào các ngoặc):
71
-
72
- ```
73
- You are a {DIMENSION_NAME} reviewer. Read the full target file at {target_file}.
74
- Scope: review ONLY through the {DIMENSION_NAME} lens/check — {DIMENSION_DESCRIPTION}.
75
- Be exhaustive: scan every section, every UC, every AC/BR/scenario. Do not stop early.
76
- Project context (terminology, entities, architecture):
77
- {slim_context — banned terms, canonical entities, layer order, domains}
78
-
79
- Return a JSON array of findings, each:
80
- { "dimension": "{DIMENSION_NAME}", "severity": "critical|major|minor",
81
- "section": "...", "uc_id": "...", "quote": "<verbatim ≤120 chars>",
82
- "finding": "...", "suggestion": "...", "auto_fixable": true|false }
83
- Return [] if this dimension is clean. Return ONLY the JSON array.
84
- ```
85
-
86
- Gom mảng findings của mọi sub-agent vào một danh sách hợp nhất `ALL_FINDINGS`.
87
-
88
- ---
89
-
90
- ## Phase 2 — Vòng lặp hội tụ critic độ-đầy-đủ
91
-
92
- Đây là bước chống đập-chuột-chũi. Lặp cho tới khi **hai vòng liên tiếp thêm 0 finding
93
- mới**, hoặc tới cap cứng **3 vòng**, cái nào đến trước:
94
-
95
- > **Lưu ý delta:** kể cả khi `CHANGED_SCOPE` giới hạn Phase 1 vào các UC đã đổi, completeness-critic ở Phase 2 **vẫn đọc TOÀN bộ doc** — đây là lưới an toàn bắt các vấn đề mà một fix ở UC đã đổi có thể làm lộ ra ở chỗ khác.
96
-
97
- 1. Spawn một sub-agent **completeness-critic** bằng Agent tool. Cho nó:
98
- - toàn bộ target file (`{target_file}`),
99
- - danh sách findings đã ghi nhận dưới dạng **slim JSON** — chỉ 3 fields cốt lõi
100
- đủ để critic nhận ra trùng lặp (không cần `quote`, `suggestion`, `auto_fixable`, `severity`):
101
- ```json
102
- [
103
- { "uc_id": "...", "section": "...", "finding": "..." },
104
- ...
105
- ]
106
- ```
107
- Nếu `ALL_FINDINGS` vượt 60 items, rút gọn `finding` xuống còn 80 ký tự đầu mỗi item.
108
- - cùng slim context (banned terms, canonical entities, layer order, domains).
109
- Prompt nó:
110
- ```
111
- Here is a document and a list of issues already found. Read the WHOLE document.
112
- List ONLY real, additional issues NOT already in the list — gaps, ambiguities,
113
- contradictions, missing edge/negative paths, coverage holes, terminology drift,
114
- structural omissions, and any issue that a fix to an existing finding would expose.
115
- ALSO flag ROLE-BOUNDARY / altitude violations (you are NOT limited to adding detail):
116
- content sitting in the WRONG section — detailed mechanism (retry counts, timeouts, flag
117
- names/owners, error branches) written INSIDE an acceptance criterion or a scope line
118
- instead of the Business Rule/Logic section; an AC that merely restates its referenced BR
119
- (same content, converged); a term definition crammed into In/Out Scope. For these, the
120
- suggestion must be to MOVE the detail to its proper section (AC keeps only the observable
121
- outcome + BR ref) — NOT to delete it, and NOT to add more detail.
122
- Do NOT repeat anything already listed. Return the same finding JSON shape, or [] if
123
- nothing new.
124
- ```
125
- 2. Thêm bất kỳ finding thực sự mới (chưa có trong `ALL_FINDINGS`) vào danh sách.
126
- 3. Nếu vòng này trả 0 finding mới → tăng bộ đếm dry-round; ngược lại reset về 0.
127
- 4. Dừng khi bộ đếm dry-round đạt 2, hoặc sau tổng cộng 3 vòng.
128
-
129
- Ghi lại `convergence_rounds` (số vòng critic đã chạy) cho report.
130
-
131
- ---
132
-
133
- ## Phase 3 — Dedup, giải quyết xung đột, merge
134
-
135
- Các sub-agent chạy **mù với nhau** (độc lập = độ phủ đa dạng). Chúng không bao giờ
136
- trao đổi hay điều hoà giữa chúng — mọi xử lý trùng/xung đột diễn ra **ở đây trong
137
- orchestrator**, nơi thấy toàn bộ tập findings.
138
-
139
- 1. **Khử trùng lặp** `ALL_FINDINGS`: hai finding là trùng nếu cùng nhắm tới cùng
140
- `section` + `uc_id` và mô tả cùng một vấn đề gốc. Giữ cái có `suggestion`
141
- phong phú hơn; nếu khác nhau về severity, giữ severity **cao hơn**.
142
- 2. **Giải quyết xung đột** — nhóm các finding còn lại theo `section` + `uc_id` và kiểm tra
143
- mâu thuẫn (hai finding có `suggestion` không thể cùng áp dụng, hoặc đề xuất sửa ngược nhau cho cùng một chỗ):
144
- - Nếu hai đề xuất có thể **merge** thành một bản sửa mạch lạc → merge thành một finding duy nhất.
145
- - Nếu chúng **loại trừ lẫn nhau** → phát ra **một** finding nêu cả hai phương án
146
- và set `auto_fixable: false` với `status: "needs_discussion"` (PRD) /
147
- `status: "pending"` (review) để con người chọn — không bao giờ âm thầm bỏ một bên.
148
- - Nếu một finding bị **vô hiệu** bởi finding khác (vd một finding cấu trúc nói một section
149
- bị thiếu, nhưng một finding khác trích dẫn nội dung từ chính section đó) → bỏ cái không hợp lệ.
150
- 3. **Sắp xếp** theo severity (critical → major → minor), rồi theo thứ tự `section` trong file.
151
- 4. **Gán ID ổn định** `F001, F002, …` theo thứ tự đã sắp đó.
152
- 5. Map `dimension` của mỗi finding vào field schema của lệnh
153
- (`lens` cho `/refine-prd`; `check_id` cho `/review-context`).
154
- 6. Ghi **một** file findings duy nhất theo FINDINGS SCHEMA mà lệnh định nghĩa.
155
-
156
- Trong report cuối của lệnh, thêm một dòng:
157
- ```
158
- Convergence: {convergence_rounds} vòng critic — file findings đã đầy đủ; chạy lại sẽ lòi ra 0 vấn đề mới.
159
- ```
@@ -1,129 +0,0 @@
1
- # Pattern điều phối Sub-Agent
2
-
3
- Dùng bởi các lệnh nặng khi target vượt ngưỡng phức tạp.
4
- Session chính trở thành một **orchestrator nhẹ** — chỉ điều phối.
5
- Mỗi đơn vị công việc chạy trong sub-agent riêng với context window mới.
6
-
7
- ---
8
-
9
- ## Ngưỡng phức tạp
10
-
11
- | Tín hiệu | Ngưỡng | Hành động |
12
- |--------|-----------|--------|
13
- | Số UC trong PRD | > 3 UC | spawn 1 agent cho mỗi UC |
14
- | Độ dài PRD | > 300 dòng | spawn agent bất kể số UC |
15
-
16
- Nếu vượt **một trong hai** ngưỡng → chuyển sang chế độ orchestration.
17
-
18
- ---
19
-
20
- ## Các bước của Orchestrator (session chính)
21
-
22
- ### Bước A — Dựng context gọn
23
-
24
- Chỉ trích xuất những gì sub-agent cần — KHÔNG truyền nguyên CLAUDE.md hay nguyên business-dictionary:
25
-
26
- ```json
27
- {
28
- "project_name": "{project.name}",
29
- "tech_stack": {
30
- "language": "{tech_stack.language}",
31
- "framework": "{tech_stack.framework}",
32
- "build_tool": "{tech_stack.build_tool}",
33
- "test_framework": "{tech_stack.test_framework}",
34
- "database": "{tech_stack.database}",
35
- "module": "{tech_stack.module}"
36
- },
37
- "conventions": {
38
- "build_command": "{conventions.build_command}",
39
- "commit_format": "{conventions.commit_format}"
40
- },
41
- "paths": {
42
- "specs_dir": "{paths.specs_dir}",
43
- "trace_dir": "{paths.trace_dir}",
44
- "tech_docs_dir": "{paths.tech_docs_dir}"
45
- },
46
- "architecture_summary": "<3-5 gạch đầu dòng: thứ tự layer + quy tắc chính>",
47
- "domains": ["{domain1}", "{domain2}"],
48
- "banned_terms": ["{term1}", "{term2}"]
49
- }
50
- ```
51
-
52
- ### Bước B — Trích danh sách UC
53
-
54
- Quét PRD target tìm các heading `#### {TICKET-ID}-UC{N}:`.
55
- Dựng list: `[ { uc_id, uc_name, line_start, line_end } ]`
56
-
57
- ### Bước C — Công bố kế hoạch
58
-
59
- ```
60
- Phát hiện độ phức tạp cao — {N} UC / {L} dòng trong {prd_file}
61
- Đang spawn {N} sub-agent (1 cho mỗi UC)...
62
- Agent 1 → {TICKET-ID}-UC1: {tên UC}
63
- Agent 2 → {TICKET-ID}-UC2: {tên UC}
64
- ...
65
- ```
66
-
67
- ### Bước D — Spawn một sub-agent cho mỗi UC
68
-
69
- Dựng payload và gọi Agent tool cho từng UC:
70
-
71
- ```json
72
- {
73
- "_agent_mode": true,
74
- "command": "generate-bdd",
75
- "uc_id": "{TICKET-ID}-UC{N}",
76
- "target_file": "{đường dẫn tuyệt đối tới PRD hoặc feature file}",
77
- "uc_section": { "line_start": {N}, "line_end": {N} },
78
- "context": { "<context gọn từ Bước A>" },
79
- "active_platform": "{web|app|system — platform orchestrator đã chọn ở Platform Selection}",
80
- "design_coverage": { "<Screen States + AC-UI behavioral orchestrator đã trích ở 'Design Spec — Gate & Load' (B1); rỗng nếu BE / không có design-spec>" }
81
- }
82
- ```
83
-
84
- > **Truyền state orchestrator đã phân giải (quan trọng):** orchestrator (session chính) đã chạy các Guard + chọn platform + nạp design-spec MỘT LẦN *trước* khi spawn. Phải kèm `active_platform` và `design_coverage` vào payload để sub-agent áp đúng (đặc biệt phủ Screen States + AC-UI cho FE/App). KHÔNG kèm → sub-agent sinh BDD thiếu phần design (PRD lớn mất B1).
85
-
86
- > **Phạm vi lệnh**: Chỉ `/generate-bdd` khởi động chế độ orchestration. `/generate-code` và `/dev-gen-test` có thể chạy như sub-agent (chúng tôn trọng `_agent_mode: true` từ Gate Bước 0), nhưng không spawn thêm sub-agent — phạm vi của chúng vốn đã là một UC duy nhất.
87
-
88
- Serialize JSON này và truyền làm `$ARGUMENTS` khi gọi lệnh sub-agent.
89
-
90
- ### Bước E — Thu thập và merge kết quả
91
-
92
- Mỗi sub-agent trả về:
93
- ```json
94
- {
95
- "uc_id": "{TICKET-ID}-UC{N}",
96
- "files_created": ["path/to/file1", "path/to/file2"],
97
- "status": "success | error",
98
- "errors": []
99
- }
100
- ```
101
-
102
- Merge vào một report duy nhất (theo định dạng report-footer.md).
103
- Nếu có sub-agent lỗi → liệt kê rõ ràng và đề xuất chạy lại riêng UC đó.
104
-
105
- ---
106
-
107
- ## Điểm vào của Sub-Agent (các lệnh được gọi)
108
-
109
- Khi `gate.md Bước 0` phát hiện `_agent_mode: true`:
110
-
111
- 1. Parse toàn bộ payload từ `$ARGUMENTS`
112
- 2. **Bỏ qua context-loader.md** — dùng trực tiếp `payload.context`
113
- 3. **Chỉ giới hạn ở `payload.uc_id`** — không xử lý các UC khác trong file
114
- 4. Chỉ đọc section PRD giữa `payload.uc_section.line_start` và `line_end`
115
- 5. **Dùng state orchestrator đã phân giải:** `active_platform` = `payload.active_platform`; `design_coverage` = `payload.design_coverage`. **KHÔNG chạy lại** các Guard (PRD approved / Design-Spec) hay tự nạp lại design-spec / hỏi platform — orchestrator đã làm một lần ở session chính.
116
- 6. Thực thi logic thường của lệnh cho riêng UC này (dùng `design_coverage` từ payload để phủ Screen States + AC-UI)
117
- 7. Trả về JSON kết quả có cấu trúc (định dạng Bước E ở trên)
118
-
119
- ---
120
-
121
- ## Tiết kiệm Context Window
122
-
123
- | Chế độ | Nạp gì mỗi session |
124
- |------|------------------------|
125
- | Single session (≤ 3 UC) | Full context + full PRD + tất cả UC |
126
- | Orchestrator | Context gọn + chỉ các heading UC |
127
- | Mỗi sub-agent | Context gọn + **chỉ 1 section UC** |
128
-
129
- PRD càng lớn, mức tiết kiệm trên mỗi sub-agent càng nhiều.
@@ -1,53 +0,0 @@
1
- # Làm mới panel mirror của Living Docs *(local)*
2
-
3
- > **Hai vị trí, HAI TÊN KHÁC NHAU — đọc trước khi sửa gì ở đây.**
4
- >
5
- > | Đường dẫn | Vai trò | Git |
6
- > |---|---|---|
7
- > | `{paths.trace_dir}` (`.trace/` hoặc `{spec_source}/.trace/`) | **AUTHORITATIVE** — TSV + `trace-history.jsonl`. Không regenerate được. | **PHẢI commit** |
8
- > | `./.trace-mirror/` ở gốc workspace hiện tại | **MIRROR** — bản sao tiện cho panel VS Code. Sinh lại được bất cứ lúc nào. | **Luôn gitignore** |
9
- >
10
- > Trước v0.4.3 cả hai đều tên `.trace`, nên một luật gitignore theo tên có thể **xoá sạch sổ gốc**
11
- > khi dev mở thẳng spec repo làm workspace (lúc đó hai path bằng nhau). Hai tên khác nhau làm
12
- > luật git đọc được bằng mắt và **không còn ca nhập nhằng nào**: `.trace-mirror/` không bao giờ
13
- > commit, `.trace/` không bao giờ gitignore.
14
-
15
- ## Khi nào CÓ mirror
16
-
17
- Mirror chỉ tồn tại khi **`{paths.trace_dir}` nằm NGOÀI workspace hiện tại** — panel đọc từ workspace đang mở nên cần một bản sao ở đây.
18
-
19
- | Tình huống | `{paths.trace_dir}` | Có mirror? |
20
- |---|---|---|
21
- | Single-service | `./.trace` — **trong** workspace | ❌ Không. Panel đọc thẳng `.trace/trace-report.json`. Bỏ qua cả file này. |
22
- | Dev mở thẳng **spec repo** | `./.trace` — **trong** workspace | ❌ Không. Như trên. |
23
- | Umbrella + `spec_source`, dev đứng ở umbrella hoặc service submodule | `{spec_source}/.trace` — **ngoài** workspace | ✅ Có |
24
- | Umbrella legacy (không `spec_source`) | `.trace` theo từng service | ✅ Có |
25
-
26
- Quy tắc một dòng: **phân giải `panel_mirror = ./.trace-mirror` ở gốc workspace hiện tại; nếu `{paths.trace_dir}` đã nằm trong workspace này thì bỏ qua toàn bộ bước mirror.**
27
-
28
- ---
29
-
30
- Sau khi cập nhật TSV authoritative tại `{paths.trace_dir}`:
31
-
32
- **Khi `setup.spec_source` được đặt (trace gộp — trường hợp phổ biến):**
33
- `{paths.trace_dir}` phân giải về `{spec_source}/.trace` — vị trí authoritative duy nhất.
34
- Lệnh này chạy từ `service_root`, nên thao tác ghi là **liên-repo vào spec submodule**;
35
- commit/push spec submodule cho lần cập nhật trace (giống như `feedback/`).
36
-
37
- 1. Phân giải `panel_mirror = ./.trace-mirror` tại **gốc workspace hiện tại**.
38
- 2. Nếu `{paths.trace_dir}` **không** nằm trong workspace hiện tại, copy mỗi
39
- `{UC-ID}-{platform}.tsv` vừa cập nhật → `{panel_mirror}/{UC-ID}-{platform}.tsv` (tạo thư mục; ghi đè).
40
- Không namespace theo service — chỉ có một bộ trace; service sở hữu được mang ở
41
- **cột `service` (cột 23)** của chính từng row, do `/generate-bdd` ghi từ `@trace.service`.
42
- 3. **KHÔNG copy `trace-history.jsonl`.** Nó là dữ liệu tích luỹ, không phải thứ sinh lại được —
43
- nhân bản nó ra một thư mục gitignore là tạo hai lịch sử lệch nhau rồi mất bản thật.
44
-
45
- **Legacy (không có `spec_source` — trace theo service):**
46
- Copy mỗi `{UC-ID}-{platform}.tsv` vừa cập nhật → `{panel_mirror}/{service-name}/{UC-ID}-{platform}.tsv`
47
- (namespace theo `active_service`).
48
-
49
- Cách này giữ panel Living Docs của workspace đang mở luôn mới **giữa các lần sync** — nó chỉ là
50
- một **mirror tiện lợi cục bộ**. File `trace-report.json` đã merge (canonical, trong
51
- `{spec_source}/.living-docs/`) được build lại bởi `/sync` hoặc `/validate-traces`. Với các lệnh
52
- được orchestrate, làm việc này một lần trong orchestrator sau khi tất cả sub-agent trả về — không phải
53
- bên trong từng sub-agent.
@@ -1,47 +0,0 @@
1
- # templates/ — build-time skeletons
2
-
3
- > **Nếu bạn đang mở thư mục này ở `.agent/templates/` trong một project: sửa file ở đây KHÔNG có tác dụng.**
4
-
5
- ## Vì sao
6
-
7
- Các skeleton trong thư mục này được `{{include}}` **nướng cứng vào file lệnh lúc `npm run build`**:
8
-
9
- ```
10
- templates/feature.template
11
- ↓ {{include:templates/feature.template}} ← bin/build.js, thay thế văn bản lúc build
12
- commands/generate-bdd.md
13
- ↓ copy vào core/ → mirror sang .agent/
14
- .agent/commands/generate-bdd.md ← LỆNH THẬT SỰ CHẠY (đã chứa sẵn skeleton)
15
- .agent/templates/feature.template ← bản tham khảo, KHÔNG lệnh nào đọc
16
- ```
17
-
18
- Không lệnh nào đọc một path template lúc chạy. `paths.feature_template` / `paths.prd_template` từng tồn tại trong `project-context.yaml` nhưng chưa bao giờ có tác dụng — đã được gỡ bỏ (xem `GAPS.md` G9).
19
-
20
- **Thêm nữa:** `.agent/` là vùng bị ghi đè. `/update-framework` chạy `npx … --init`, và `--init` copy `core/` → `.agent/` **vô điều kiện** (`bin/index.js` → `copyDirRecursive`, không có existence check, không backup). File duy nhất được giữ lại là `.agent/project-context.yaml`. Nên mọi chỉnh sửa ở `.agent/templates/` sẽ **biến mất im lặng** ở lần nâng cấp kế tiếp.
21
-
22
- ## Muốn đổi cấu trúc artifact sinh ra thì làm gì
23
-
24
- Sửa file trong **repo framework** rồi build lại:
25
-
26
- ```bash
27
- # trong repo sdd-framework
28
- vim templates/feature.template # hoặc prd.template.md, tech-design.template.md, …
29
- npm run build # inline lại vào commands/*.md + core/ + .agent/
30
- ```
31
-
32
- Rồi phát hành version mới; project chạy `/update-framework` để nhận.
33
-
34
- ## File nào ở đây đi vào đâu
35
-
36
- | Template | Được include vào | Trở thành |
37
- |---|---|---|
38
- | `feature.template` | `commands/generate-bdd.tmpl` | mỗi file `.feature` |
39
- | `prd.template.md` | `commands/generate-prd.tmpl` | mỗi PRD |
40
- | `tech-design.template.md` | `commands/generate-tech-docs.tmpl` | tech-doc gộp / PRD |
41
- | `design-spec.template.md` | `commands/generate-design-spec.tmpl` | design-spec / platform |
42
- | `architecture.template.md` | `commands/generate-architecture.tmpl` | tài liệu kiến trúc |
43
- | `product-definition.template.md` | `commands/define-product.tmpl` | product definition |
44
- | `platform-guide.template.md` | (tham khảo) | — |
45
- | `project-context.yaml` | **không** include — được copy thẳng làm file config khởi tạo | `.agent/project-context.yaml` |
46
-
47
- > Lưu ý `project-context.yaml` là ngoại lệ duy nhất: nó **được** copy ra làm file thật của project, và **được bảo vệ** khỏi ghi đè khi nâng cấp (chỉ tạo nếu chưa tồn tại).