@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,401 +0,0 @@
1
- # /review-tech-docs — Review Technical Design Document
2
-
3
- **Chế độ phân tích READ-ONLY — ghi file findings, KHÔNG sửa target.**
4
- **Dùng `--resume` để áp dụng các finding được chấp nhận.**
5
-
6
- ## Gate
7
- {{include:steps/gate.md}}
8
-
9
- *Lưu ý: Với lệnh này, target ở Bước 1 là **file tech-design gộp của PRD** `{paths.tech_docs_dir}/{domain}/{prd-slug}/tech-docs/{TICKET-ID}-tech-design.md` — MỘT doc full-stack phủ mọi UC của PRD (không còn per-UC / per-platform). Review chạy trên cả doc; findings gom theo từng UC (đọc §10 UC Coverage để biết finding thuộc UC nào).
10
- Nếu `$ARGUMENTS` chứa `--resume` → bỏ qua sang Resume Mode bên dưới.*
11
-
12
- ## Context
13
- {{include:steps/context-loader.md}}
14
-
15
- ---
16
-
17
- ## Nạp tài liệu Review
18
-
19
- Sau khi nạp context nền, đọc các thứ sau theo thứ tự:
20
-
21
- 1. **Tech-doc target** — đọc đầy đủ. Trích từ header:
22
- - `@trace.ucs` → danh sách UC mà doc phủ (đối chiếu §10 UC Coverage)
23
- - `@trace.domain` → domain
24
- - `@trace.prd` → TICKET-ID của PRD nguồn
25
- - `@trace.platforms` → các platform có mặt (system / web / app)
26
- - `@trace.status` → status hiện tại (draft / in-review / approved)
27
-
28
- 2. **Các file BDD nguồn** — nạp **mọi** feature của PRD này: `{paths.specs_dir}/{domain}/{prd-slug}/bdd/**/*.feature` (system/web/app). Đây là nguồn đối chiếu cho T3/T7 — mỗi UC trong doc phải trace về scenario BDD tương ứng.
29
-
30
- 3. **Index endpoint cho T4 (KHÔNG nạp full doc khác)** — trích danh sách endpoint (§4.1) + entity chính của doc target. T4 sẽ `grep` các path đó trong `{paths.tech_docs_dir}/{domain}/*/tech-docs/*-tech-design.md` (các PRD khác) và chỉ nạp đoạn liên quan **khi có va chạm** — xem T4.
31
-
32
- 4. **Tham chiếu kiến trúc** — xác nhận lại CLAUDE.md §2: thứ tự layer, quy tắc kiến trúc.
33
-
34
- 5. **Core entities** — đã nạp trong context (Bước 6 của context-loader).
35
-
36
- 6. **PRD nguồn — §Business Rules (cho T8)** — nạp file PRD `{paths.specs_dir}/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md`, trích bảng Business Rule/Business Logic của các UC mà doc phủ. Đây là nguồn đối chiếu-ngược của **T8** (BR nào yêu cầu nguồn/sự kiện/generic-contract mà doc bỏ sót). Chỉ đọc §BR + §AC liên quan — KHÔNG cần toàn PRD.
37
-
38
- Suy ra tên file findings (per-PRD):
39
- `{paths.refinement_dir}/{TICKET-ID}-tech-review-findings.yaml`
40
-
41
- ---
42
-
43
- ## Review Dimensions
44
-
45
- ### T1 — Architecture Alignment *(luôn CRITICAL nếu vi phạm)*
46
-
47
- Đối chiếu design đề xuất với quy tắc CLAUDE.md §2:
48
-
49
- | Loại vi phạm | Severity |
50
- |----------------|----------|
51
- | Controller gọi Repository trực tiếp (skip layer) | Critical |
52
- | Business logic trong Controller hoặc DTO | Critical |
53
- | Pattern bị cấm từ §3 | Critical |
54
- | Phụ thuộc đi ngược upstream (Service → Controller DTO) | Critical |
55
- | Annotation transaction sai layer | Major |
56
- | Thiếu tách lớp (không có Facade khi kiến trúc yêu cầu) | Major |
57
-
58
- Với mỗi finding:
59
- ```
60
- Component: {tên class hoặc method}
61
- Violates: "{rule text}" (CLAUDE.md §2)
62
- Fix: {layer/component nào nên sở hữu cái này}
63
- ```
64
- → **Không auto-fix.** Người phải quyết định fix cấu trúc. Bắt buộc note trong Review Board.
65
-
66
- ### T2 — Entity Consistency
67
-
68
- Dùng catalog core-entities đã nạp:
69
-
70
- | Vấn đề | Severity | Auto-fixable? |
71
- |-------|----------|---------------|
72
- | Entity được nhắc nhưng không có trong core-entities.md | Major | No — người confirm là DTO hay domain entity |
73
- | Tên field khác core-entities.md | Major | Yes — đổi về canonical |
74
- | Quan hệ được mô tả khác đi | Major | No — người quyết định |
75
- | Entity mới được đưa ra nhưng chưa có trong core-entities.md | Minor | No — thêm vào core-entities trước |
76
-
77
- ### T3 — BDD Traceability
78
-
79
- Đối chiếu với **mọi** feature BDD của PRD (system/web/app). Với mỗi UC trong §10 UC Coverage, kiểm tra design khớp scenario **2 chiều**.
80
-
81
- > ⚠ **SC scope theo platform:** `{UC}-SC{N}` chỉ unique trong (UC × platform) — `system UC1-SC1` và `web UC1-SC1` là **hai scenario khác nhau**. Khi đối chiếu, match SC **trong đúng lane platform** (system SC ↔ system BDD, web SC ↔ web BDD, app SC ↔ app BDD). KHÔNG so chéo platform. §5 phải để mỗi SC trong lane 5.A/5.B/5.C của nó; §10 mỗi dòng có cột Platform.
82
-
83
- | Vấn đề | Severity | Auto-fixable? |
84
- |-------|----------|---------------|
85
- | Tech-doc đề xuất behavior không có trong scenario BDD nào (cùng platform) | Major | No — tạo scenario trước |
86
- | Tech-doc mâu thuẫn một scenario BDD | Critical | No — giải quyết conflict trước |
87
- | Scenario (platform, SC) không có design tương ứng (thiếu ở §5 lane hoặc §10) | Minor | Yes — thêm design note còn thiếu |
88
- | §10 UC Coverage sót một (platform, SC) đã có BDD | Major | Yes — thêm dòng coverage + section tương ứng |
89
- | SC ghi trong §5/§10 **không kèm platform** (bare `UC1-SC1`) → nhập nhằng | Major | Yes — gắn platform vào SC ref |
90
-
91
- ### T3b — BDD Freshness *(tech-doc còn khớp BDD hiện tại không)*
92
-
93
- *T3 kiểm **nội dung** khớp không. T3b kiểm **độ tươi**: doc này dựng từ BDD version nào, BDD giờ ở version nào. Đây là lỗ hổng cũ — không lệnh nào so hai giá trị này, nên tech-doc âm thầm lỗi thời mà vẫn giữ `@trace.status: approved`.*
94
-
95
- Header tech-doc mang `@trace.bdd_versions` (**số nhiều** — map theo platform, vd `system=1.5, web=1.9`). Với **mỗi** entry trong map, đọc `@trace.bdd_version` (**số ít**, scalar) của `.feature` tương ứng (`{paths.specs_dir}/{domain}/{prd-slug}/bdd/{platform}/{TICKET-ID}-UC*.feature`):
96
-
97
- | Điều kiện | Severity | Auto-fixable? |
98
- |---|---|---|
99
- | Map khớp `.feature` | *(sạch)* | — |
100
- | `.feature` **mới hơn** map | **Major** | **No** — cần người review §4/§4.5 rồi bump `@trace.revision` |
101
- | Platform có `.feature` nhưng **vắng** trong map | **Major** | Yes — thêm entry sau khi xác nhận §4 đã phủ platform đó |
102
- | Map có platform mà **không** có `.feature` | Minor | Yes — xoá entry (BDD đã bỏ platform đó) |
103
-
104
- Prose của finding "`.feature` mới hơn": *"tech-doc dựng từ BDD {platform}=v{old}, BDD giờ v{new} — §4 contract có thể đã lệch so với behavior đã chốt. Review lại §4.1–4.3 (+ §4.5 nếu FE) rồi bump `@trace.revision`."*
105
-
106
- > **Vì sao là Major chứ không phải Minor:** `/generate-code` DS3 thấy tech-doc `@trace.status: approved` + 0 blocker-GAP thì lấy shape DTO/endpoint/error ở §4 **nguyên văn** làm contract "đã chốt". Contract dựng từ BDD cũ sẽ lan **thẳng** vào code, không cảnh báo. Đây là ca tệ hơn drift-về-code vì nó sai từ nguồn.
107
-
108
- **Cổng chặn `approved` (chặn MỀM — đồng bộ với DS3/DS4 của `/generate-code`, không chặn cứng):** còn ≥1 finding T3b Major ở trạng thái `open` → khi người dùng định đặt `@trace.status: approved`, hiện CHECKPOINT:
109
- ```
110
- ⚠️ {n} platform có BDD mới hơn bản mà tech-doc này dựng từ:
111
- {platform}: doc dựng từ v{old} · .feature giờ v{new}
112
- Duyệt doc bây giờ = chốt một contract có thể đã lệch behavior.
113
- Vẫn đặt approved? (Y/N)
114
- ```
115
- Chỉ tiếp khi `Y`. *(Khác GATE của §12 blocker-GAP — cái đó chặn cứng. Ở đây chặn mềm vì BDD có thể bump vì lý do không chạm contract, vd sửa từ ngữ step; người review là người biết.)*
116
-
117
- ### T4 — Cross-PRD Endpoint Conflict Check *(targeted, load-on-hit)*
118
-
119
- Mỗi PRD giờ chỉ 1 doc → xung đột TRONG doc đã do **T5** lo. T4 chỉ soi xung đột **liên-PRD** theo cách rẻ, KHÔNG nạp full doc khác:
120
-
121
- 1. Trích danh sách endpoint (method + path, §4.1) + entity chính của doc target.
122
- 2. `grep` từng path/entity đó trong `{paths.tech_docs_dir}/{domain}/*/tech-docs/*-tech-design.md` (trừ target) — chỉ đọc dòng match.
123
- 3. **Chỉ khi có va chạm** (một path/entity xuất hiện ở doc PRD khác) → nạp đúng đoạn §4.1/§4.2 (hoặc §3) của doc đó để so shape.
124
-
125
- | Vấn đề *(chỉ khi grep dính)* | Severity | Auto-fixable? |
126
- |-------|----------|---------------|
127
- | Cùng endpoint path, request/response khác shape giữa 2 PRD | Critical | No — người giải quyết |
128
- | Cùng service method với behavior khác | Critical | No — người giải quyết |
129
- | Status transition của cùng entity khác nhau giữa các doc PRD | Critical | No — người giải quyết |
130
- | Trách nhiệm chồng lấn (2 PRD cùng nhận sở hữu 1 endpoint/logic) | Major | No — người giải quyết |
131
-
132
- Không có va chạm grep → T4 pass, không nạp thêm gì.
133
-
134
- ### T5 — Internal Consistency
135
-
136
- Trong nội bộ tech-doc:
137
-
138
- | Check | Severity | Auto-fixable? |
139
- |-------|----------|---------------|
140
- | Sequence diagram thể hiện flow khác phần mô tả viết | Major | No |
141
- | API spec return type khác code sketch | Major | Yes — căn chỉnh cái này theo cái kia |
142
- | Section tham chiếu một component/concept không bao giờ được định nghĩa sau đó | Minor | Yes — thêm định nghĩa |
143
- | Assumption được nêu nhưng không design nào xử lý nó | Minor | Yes — thêm note hoặc bỏ assumption |
144
-
145
- ### T6 — Structural Completeness
146
-
147
- Kiểm tra tất cả section chuẩn có mặt và không rỗng:
148
-
149
- | Section | Missing severity |
150
- |---------|-----------------|
151
- | Header (`@trace.prd`, `@trace.ucs`, `@trace.domain`, `@trace.status`) | Major |
152
- | Overview / Context | Major |
153
- | Architecture Decision kèm lý do | Major |
154
- | Component Diagram hoặc Layer Description | Major |
155
- | Sequence Diagram hoặc Flow Steps | Major |
156
- | API Contract (nếu hướng HTTP) | Major |
157
- | Data Model Changes (nếu entity đổi) | Major |
158
- | Error Handling Strategy | Major |
159
- | Open Questions / Assumptions | Minor |
160
-
161
- → Mọi finding section-thiếu T6 đều **auto-fixable**: AI thêm skeleton section kèm prompt.
162
-
163
- ### T7 — Cross-Team API Contract Review
164
-
165
- *Chỉ áp dụng khi TẤT CẢ điều sau đúng:*
166
- *1. Doc có phần backend/API (`@trace.platforms` gồm `system`, tức PRD có System BDD).*
167
- *2. Header tech-doc KHÔNG có `@trace.api_source: existing`.*
168
-
169
- *Nếu `@trace.api_source: existing` → **skip T7 hoàn toàn**. Contract đã được PO xác định trong PRD — không có API design mới để đồng thuận.*
170
-
171
- Dimension này đảm bảo team FE, App, và BE đều đồng thuận API contract trước khi bắt đầu implement.
172
-
173
- **Step 1 — Check status sign-off trong header tech-doc:**
174
-
175
- Đọc block `@trace.sign_off` trong header tech doc. Nếu vắng → thêm như một finding (auto-fixable: thêm skeleton).
176
-
177
- ```yaml
178
- # @trace.sign_off:
179
- # be_team: pending # author — set "done" khi BE hài lòng với design
180
- # fe_team: pending # FE/Web — phải confirm contract khớp expectation của web BDD
181
- # app_team: pending # App — phải confirm contract khớp expectation của app BDD (nếu áp dụng)
182
- # sa: pending # SA/Tech Lead — approval cuối
183
- ```
184
-
185
- **Step 2 — Contract vs BDD cross-check:**
186
-
187
- Nạp web và app BDD cho TICKET-ID này (từ `{paths.specs_dir}/{domain}/{prd-slug}/bdd/web/` và `{paths.specs_dir}/{domain}/{prd-slug}/bdd/app/` trong spec submodule hoặc spec repo).
188
-
189
- Với mỗi platform BDD, kiểm tra API contract của tech doc có thoả các mệnh đề `Then` của BDD không:
190
-
191
- | Check | Severity |
192
- |---|---|
193
- | Field response trong API contract không phủ những gì web BDD `Then` mong | Critical |
194
- | Field response trong API contract không phủ những gì app BDD `Then` mong | Critical |
195
- | Shape error response không khớp những gì các platform BDD mong | Major |
196
- | Annotation `@system.resolution` của System BDD mâu thuẫn với design API contract | Critical |
197
-
198
- **Step 3 — Report sign-off pending:**
199
-
200
- Sau review, liệt kê các sign-off còn `pending`:
201
-
202
- ```
203
- ⏳ Sign-off pending trước khi tech docs được approve:
204
- fe_team — team FE/Web phải confirm API contract khớp expectation web BDD
205
- app_team — team App phải confirm API contract khớp expectation app BDD
206
- sa — SA/Tech Lead approval cuối
207
-
208
- Khi thu đủ sign-off → cập nhật @trace.sign_off trong header tech doc, rồi chạy lại /review-tech-docs.
209
- Tech docs không thể set "approved" khi còn bất kỳ sign-off bắt buộc nào pending.
210
- ```
211
-
212
- **Approval gate:**
213
- - Nếu `be_team: done` VÀ `fe_team: done` VÀ `app_team: done` (hoặc N/A) VÀ `sa: done` → tech docs có thể set `approved`
214
- - Ngược lại → `@trace.status` giữ `in-review` — `generate-code` bị chặn
215
-
216
- ### T8 — Reconciliation & Completeness
217
-
218
- *Bắt lỗi "đóng kín" + "coverage ≠ completeness" — cái mà Self-Review Gate của `generate-tech-docs` (Cổng 1/4) đáng lẽ chặn. Đối chiếu doc với PRD Business Rules, core-entities, và seam UC anh em (đọc-ngược có giới hạn — không kéo toàn bộ BDD của PRD).*
219
-
220
- > **Nguyên tắc:** "mọi SC được map" (T3) là *cần*, KHÔNG *đủ*. T8 fail một doc dù T3 pass, nếu nó thiếu/mâu thuẫn ở tầng rộng hơn lát BDD.
221
-
222
- > **Thuật ngữ cross-service (đọc nhanh):** *dedup* = cùng event tới ≥2 lần chỉ xử lý 1 lần (idempotency key) · *ordering* = event đúng thứ tự phát ra, hoặc bên nhận chịu được lệch · *ack path* = bên nhận xong báo lại bên gửi để ngừng gửi lại (thiếu → mất event / gửi lại vô hạn) · *cross-field invariant* = ràng buộc luôn đúng giữa nhiều field (vd `paid ⇒ paid_at ≠ null`).
223
-
224
- | Vấn đề | Severity | Auto-fixable? |
225
- |---|---|---|
226
- | Enum/trạng thái dùng trong doc nhưng **không có producer** (không luồng nào sinh giá trị đó) | Major | No — người xác định owner |
227
- | Cột/field ghi nhưng **không có writer** (không luồng nào set) | Major | No |
228
- | **PRD Business Rule** yêu cầu một nguồn/sự kiện mà doc **bỏ sót** | Critical | No — thêm design trước |
229
- | PRD-BR đưa **hợp đồng chung** (generic envelope) nhưng doc tự làm **typed-per-thing** | Major | No |
230
- | **Leak boundary** — kéo định danh nội bộ của service khác vào lookup của mình thay vì abstraction tầng mình | Major | No |
231
- | Cross-service **không tách** bên nào own dedup/ordering, hoặc thiếu **ack path** | Major | No |
232
- | **Cross-field invariant** giữa các field/entity không được nêu | Minor | Yes — thêm note |
233
-
234
- ### T9 — Gap Honesty & Constants
235
-
236
- *Bắt "bịa lặng" + "hard-code" + "happy-only" — cái mà Self-Review Gate Cổng 2/3/4 đáng lẽ chặn.*
237
-
238
- | Vấn đề | Severity | Auto-fixable? |
239
- |---|---|---|
240
- | Policy/type/giá trị nêu **như fact không nguồn** (bịa), lẽ ra phải là `[GAP]`/`[ASSUMPTION]` | Critical | No — người xác nhận nguồn hoặc giữ GAP |
241
- | Chỗ đáng lẽ khai gap lại **bỏ trắng / chép hình dạng ở boundary** | Major | No |
242
- | **Constant/literal inline** như luật (chưa vào catalog / chưa đặt tên) | Major | Yes — tách vào bảng constants/enum |
243
- | **Happy-only** — API/flow thiếu partial + error case + rollback | Major | No — thiết kế nhánh lỗi trước |
244
- | **Hàm cốt lõi** được đặt tên nhưng **không tả** điều kiện chọn / nhánh / kết quả (dừng ở tên hàm + sequence-diagram) | Major | No — cần người bổ sung impl-spec |
245
- | BDD **mâu thuẫn** invariant kiến trúc mà doc **lặng chép** thay vì ghi conflict + escalate PO sửa `.feature` | Critical | No — escalate, không tự quyết |
246
- | Citation/tham chiếu **không resolve** (trỏ tới thứ không được định nghĩa) / policy nêu như fact | Minor | Yes — thêm định nghĩa hoặc bỏ ref |
247
- | `[GAP]`/`[ASSUMPTION]` inline **mồ côi** — không có dòng ở §12 GAP Register (hoặc dòng §12 không có marker inline) | Major | Yes — đồng bộ register ↔ marker |
248
- | §12 GAP Register còn **🔴 blocker `open`** (chưa đóng) | Critical | No — chặn approve tới khi owner đóng. *(GAP đã khai đúng KHÔNG tính là "bịa" — đây là finding về gate, không phạt trung thực)* |
249
-
250
- > **T8/T9 phản chiếu Self-Review Gate** (4 cổng) của `generate-tech-docs` và `project-lessons` **L-012** — nếu gen bỏ lọt, cổng review bắt lại. Đặt trong nguồn `.tmpl` nên bền qua `/update-framework`.
251
-
252
- ---
253
-
254
- ## Ghi File Findings
255
-
256
- Sau khi chạy hết các check, ghi findings vào `{paths.refinement_dir}/{TICKET-ID}-tech-review-findings.yaml`:
257
-
258
- ```yaml
259
- source_file: "{absolute path to tech-doc}"
260
- prd_id: "{TICKET-ID}"
261
- ucs: [{UC-ID list phủ bởi doc}]
262
- domain: "{domain}"
263
- generated_at: "{ISO datetime}"
264
- review_type: "tech-design"
265
- status: "pending_review"
266
- is_system_bdd: {true | false} # true nếu doc có phần backend (@trace.platforms gồm system)
267
-
268
- sign_off: # chỉ có khi is_system_bdd: true
269
- be_team: pending # đọc từ @trace.sign_off trong header tech-doc
270
- fe_team: pending
271
- app_team: pending # "n/a" nếu dự án không có platform app
272
- sa: pending
273
- sign_off_gate: blocked # blocked | ready — "ready" chỉ khi tất cả bắt buộc là "done"
274
-
275
- findings:
276
- - id: "F001"
277
- check_id: "T1" # T1 · T2 · T3 · T3b · T4 · T5 · T6 · T7 · T8 · T9
278
- severity: "critical" # critical | major | minor
279
- section: "{section heading hoặc tên component nơi tìm thấy lỗi}"
280
- uc_id: "{UC-ID}" # UC mà finding này thuộc về (một trong `ucs`; đọc §10 để xác định)
281
- quote: "{trích đoạn nguyên văn copy CHÍNH XÁC từ tech-doc tại vị trí lỗi, ≤120 ký tự}"
282
- finding: "{mô tả rõ ràng vi phạm hoặc gap}"
283
- suggestion: "{bản fix cụ thể — AI áp dụng khi --resume nếu được chấp nhận}"
284
- auto_fixable: false # true = AI áp dụng được; false = người phải ghi quyết định trong note
285
- status: "pending" # pending | accepted | modified | rejected | deferred
286
-
287
- summary:
288
- total_findings: {N}
289
- by_severity: { critical: {N}, major: {N}, minor: {N} }
290
- auto_fixable: {N}
291
- requires_human_decision: {N}
292
- recommendation: "APPROVED | NEEDS_REVISION | BLOCKED"
293
- sign_off_gate: "{blocked — pending: fe_team, app_team, sa | ready}"
294
- ```
295
-
296
- > **Field định vị (`quote` + `uc_id`) — bắt buộc cho source-jump của Review Board.**
297
- > Với mỗi finding, copy một đoạn `quote` **nguyên văn** thẳng từ tech-doc tại đúng chỗ
298
- > lỗi xảy ra — KHÔNG diễn giải lại; nó được so khớp với tài liệu để định vị dòng.
299
- > Field này cho phép reviewer click một finding trong Review Board và nhảy tới đúng vị trí nguồn.
300
-
301
- ## Report
302
-
303
- {{include:steps/report-footer.md}}
304
-
305
- ```
306
- /review-tech-docs Hoàn tất — {target file}
307
- PRD: {TICKET-ID} | UCs: {UC list} | Domain: {domain}
308
- Findings: {total} | 🔴 Critical: {N} | 🟡 Major: {N} | 🟢 Minor: {N}
309
- Auto-fixable: {N} | Needs human decision: {N}
310
-
311
- GAP Register (§12): {open_blocker} 🔴 blocker open / {total_open} open / {total} tracked
312
- {🔒 còn blocker open → chặn approve | ✅ 0 blocker open}
313
-
314
- Sign-off gate (chỉ system BDD):
315
- be_team : {done | pending}
316
- fe_team : {done | pending} ← {name / "needs sign-off" }
317
- app_team : {done | pending | n/a}
318
- sa : {done | pending}
319
- Gate : {🔒 BLOCKED — pending: fe_team, sa | ✅ READY}
320
-
321
- File findings: {paths.refinement_dir}/{TICKET-ID}-tech-review-findings.yaml
322
- Next: Mở trong Review Board → Accept/Modify/Reject từng finding
323
- Rồi chạy: /review-tech-docs --resume {tech-design-file}
324
- Sau khi thu đủ sign-off → cập nhật @trace.sign_off trong tech doc, chạy lại review
325
- ```
326
-
327
- ---
328
-
329
- ## Resume Mode — Áp dụng các Finding được chấp nhận
330
-
331
- *Kích hoạt khi `$ARGUMENTS` chứa `--resume`.*
332
- *Ví dụ: `/review-tech-docs --resume {paths.tech_docs_dir}/payment/{prd-slug}/tech-docs/PAY-123-tech-design.md`*
333
-
334
- ### Phase 1 — Đọc các finding được chấp nhận
335
-
336
- 1. Suy ra file findings từ target: `{paths.refinement_dir}/{TICKET-ID}-tech-review-findings.yaml`
337
- 2. Đọc file. Gom các finding có `status: "accepted"` hoặc `status: "modified"`.
338
- 3. Nếu không có → báo "No accepted findings. File unchanged." và dừng.
339
-
340
- ### Phase 2 — Áp dụng fix
341
-
342
- Áp dụng theo thứ tự: critical → major → minor.
343
-
344
- | check_id | Làm gì |
345
- |----------|-----------|
346
- | T1 (Architecture) | Áp dụng fix cấu trúc từ note finding — chuyển logic về đúng layer, cập nhật mô tả component |
347
- | T2 (Tên field) | Đổi field về tên canonical từ core-entities.md xuyên suốt tài liệu |
348
- | T3 (Thiếu design note) | Thêm design decision note cho scenario chưa phủ |
349
- | T3b (map bdd_version) | **Chỉ 2 ca auto-fixable:** platform vắng trong map → thêm entry `{platform}={bdd_version hiện tại}`; platform không còn `.feature` → xoá entry. Ca **`.feature` mới hơn** thì KHÔNG được chỉ sửa số trong map — làm vậy là dán nhãn "đã đồng bộ" lên một contract chưa ai review. Chỉ cập nhật entry sau khi note của reviewer xác nhận §4 đã được đối chiếu lại. |
350
- | T5 (Internal inconsistency) | Căn chỉnh các section mâu thuẫn theo quyết định nêu trong note |
351
- | T6 (Thiếu section) | Thêm skeleton section với prompt placeholder cho tech lead điền |
352
- | T8 (cross-field invariant) | Thêm note invariant còn thiếu *(chỉ mục minor auto-fixable; enum mồ côi / PRD-BR bỏ sót / leak boundary cần người)* |
353
- | T9 (constant / citation) | Tách constant inline vào bảng catalog/enum; thêm định nghĩa cho citation không resolve |
354
-
355
- **Finding T1, T2, T4 và các mục Critical/Major của T8/T9 có `auto_fixable: false`:** cần một resolution do người viết trong
356
- note "Modify" của Review Board (enum mồ côi, PRD-BR bỏ sót, leak boundary, bịa-lặng, happy-only, BDD↔kiến trúc mâu thuẫn — không tự đoán). Áp dụng đúng những gì note nói. Đừng bịa fix.
357
-
358
- ### Phase 3 — Cập nhật header + TSV + Report
359
-
360
- Sửa file tech-doc trực tiếp:
361
- 1. Tìm `@trace.revision:` trong header — tăng giá trị integer lên 1.
362
- 2. Tìm `@trace.status:` trong header. Set `approved` **chỉ khi CẢ HAI**:
363
- - (a) sign_off_gate = `ready` (tất cả sign-off done; hoặc doc không có phần system → không cần sign-off), **VÀ**
364
- - (b) §12 GAP Register **không còn 🔴 blocker nào ở trạng thái `open`** (đếm ở T9).
365
- Thiếu (a) hoặc (b) → set `in-review` (chặn `/generate-code`); ghi rõ lý do vào report (sign-off pending / còn N blocker-GAP open).
366
- **Ngoài ra — cổng T3b (chặn MỀM):** còn ≥1 finding T3b Major `open` (`.feature` mới hơn map `@trace.bdd_versions`) → hiện CHECKPOINT ở T3b và chỉ set `approved` khi người dùng chọn `Y`; chọn `N` → `in-review` + nêu lý do.
367
- 3. **Làm mới map `@trace.bdd_versions`** — chỉ cho các platform mà finding T3b đã được **giải quyết** (reviewer xác nhận §4 đã đối chiếu lại, hoặc là ca thêm/xoá entry auto-fixable). Platform còn finding `open` thì **giữ nguyên số cũ**: để nó lệch chính là thứ giữ cờ `TECHDOC_STALE_VS_BDD` của `/validate-traces` sáng đèn.
368
- 4. Nếu block `@trace.sign_off` vắng và đây là tech doc system BDD → thêm nó với tất cả giá trị `pending`.
369
-
370
- Ghi cả hai thay đổi vào file.
371
-
372
- Rồi cập nhật TSV cho **mọi UC mà doc phủ** (`@trace.ucs`) — doc gộp có một `@trace.revision` chung cho cả BE và client:
373
- - Với mỗi UC trong `@trace.ucs`: glob **mọi sổ platform** `{paths.trace_dir}/{domain}/{prd-slug}/{UC-ID}-*.tsv` (system/web/app), và set `tech_doc_revision` thành integer `@trace.revision` mới cho mọi row trong từng sổ đó.
374
- - **KHÔNG** đụng `fe_tech_doc_revision` ở đây — cột đó do `/generate-code --phase=integration` ghi khi FE thực sự wire adapter theo §4.5.4 (drift-detect riêng cho FE integration).
375
- - Set `last_updated` thành ngày hôm nay (`YYYY-MM-DD`) cho các row vừa chạm.
376
-
377
- In report sau khi hoàn tất mọi lần ghi file.
378
-
379
- ```
380
- /review-tech-docs --resume Đã áp dụng — {target file}
381
- PRD: {TICKET-ID} | UCs: {UC list}
382
-
383
- Applied : {N} findings ({critical} critical, {major} major, {minor} minor)
384
- Skipped : {N} rejected/deferred
385
-
386
- Changes:
387
- - {change 1}
388
- - {change 2}
389
-
390
- Revision : {old} → {new}
391
- Status : {approved | in-review}
392
-
393
- Sign-off : {✅ Tất cả done — status set approved
394
- | 🔒 Pending: fe_team, sa — status set in-review
395
- Cập nhật @trace.sign_off trong tech doc khi mỗi team confirm, rồi chạy lại /review-tech-docs}
396
-
397
- Chạy lại /review-tech-docs {file} để xác nhận 0 finding critical còn lại.
398
- Next: {/generate-code {feature-file} ← chỉ khi status = approved
399
- | Thu các sign-off pending → cập nhật @trace.sign_off → chạy lại /review-tech-docs}
400
- → nếu tech-doc sống trong spec repo dùng chung: commit + push lên spec submodule để FE/App `/sync` contract đã cập nhật
401
- ```