@educa-corp/sdd-framework 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/bin/gate-trace.js +25 -2
  2. package/bin/index.js +32 -5
  3. package/bin/lint-trace.js +41 -0
  4. package/bin/self-check.js +430 -3
  5. package/bin/trace-schema.json +418 -31
  6. package/core/FRAMEWORK_VERSION +1 -1
  7. package/{commands/extend-prd.md → core/commands/amend-prd.md} +206 -173
  8. package/core/commands/dev-run-test.md +48 -10
  9. package/core/commands/extend-prd.md +39 -12
  10. package/core/commands/generate-bdd.md +52 -10
  11. package/core/commands/generate-code.md +35 -2
  12. package/core/commands/generate-tech-docs.md +36 -4
  13. package/core/commands/map-testids.md +1 -1
  14. package/core/commands/qc-run-test.md +29 -3
  15. package/core/commands/refine-prd.md +13 -2
  16. package/core/commands/review-context.md +43 -8
  17. package/core/commands/sync.md +105 -1
  18. package/core/commands/validate-traces.md +289 -16
  19. package/core/rules/workflow.md +34 -0
  20. package/core/steps/context-loader.md +27 -6
  21. package/core/templates/feature.template +1 -1
  22. package/core/templates/project-context.yaml +3 -3
  23. package/core/templates/tech-design.template.md +2 -2
  24. package/docs/02-concepts/architecture.md +37 -1
  25. package/docs/02-concepts/overview.md +1 -1
  26. package/docs/02-concepts/pipeline-steps/02-specification.md +13 -7
  27. package/docs/02-concepts/pipeline-steps/07-dev-selftest.md +2 -0
  28. package/docs/02-concepts/pipeline-steps/08-qc-automation.md +1 -0
  29. package/docs/02-concepts/pipeline-steps/09-validate-traces.md +34 -3
  30. package/docs/02-concepts/pipeline-steps/10-feedback-loop.md +10 -1
  31. package/docs/02-concepts/traceability.md +187 -183
  32. package/docs/03-guides/architect.md +13 -4
  33. package/docs/03-guides/developer.md +1 -0
  34. package/docs/03-guides/product-owner.md +89 -72
  35. package/docs/03-guides/tester-qa.md +81 -81
  36. package/docs/04-reference/commands.md +148 -134
  37. package/docs/04-reference/trace-schema.md +45 -1
  38. package/docs/explain/02b-extend-prd.md +1 -1
  39. package/docs/explain/02c-amend-prd.md +152 -0
  40. package/docs/explain/06-generate-bdd.md +1 -1
  41. package/docs/explain/13-dev-run-test.md +15 -1
  42. package/docs/explain/19-qc-run-test.md +91 -87
  43. package/docs/explain/21-validate-traces.md +79 -75
  44. package/docs/explain/28-sync.md +25 -0
  45. package/docs/explain/README.md +136 -135
  46. package/package.json +1 -8
  47. package/commands/debug.md +0 -529
  48. package/commands/debug.tmpl +0 -260
  49. package/commands/define-product.md +0 -438
  50. package/commands/define-product.tmpl +0 -225
  51. package/commands/dev-gen-test.md +0 -700
  52. package/commands/dev-gen-test.tmpl +0 -490
  53. package/commands/dev-run-test.md +0 -435
  54. package/commands/dev-run-test.tmpl +0 -225
  55. package/commands/dev-smoke-test.md +0 -374
  56. package/commands/dev-smoke-test.tmpl +0 -217
  57. package/commands/extend-prd.tmpl +0 -273
  58. package/commands/fix-bug.md +0 -519
  59. package/commands/fix-bug.tmpl +0 -197
  60. package/commands/generate-architecture.md +0 -354
  61. package/commands/generate-architecture.tmpl +0 -197
  62. package/commands/generate-bdd.md +0 -923
  63. package/commands/generate-bdd.tmpl +0 -590
  64. package/commands/generate-code.md +0 -859
  65. package/commands/generate-code.tmpl +0 -649
  66. package/commands/generate-design-spec.md +0 -737
  67. package/commands/generate-design-spec.tmpl +0 -524
  68. package/commands/generate-prd.md +0 -722
  69. package/commands/generate-prd.tmpl +0 -226
  70. package/commands/generate-spec-manifest.md +0 -321
  71. package/commands/generate-spec-manifest.tmpl +0 -164
  72. package/commands/generate-tech-docs.md +0 -920
  73. package/commands/generate-tech-docs.tmpl +0 -273
  74. package/commands/learn.md +0 -399
  75. package/commands/learn.tmpl +0 -130
  76. package/commands/map-testids.md +0 -238
  77. package/commands/map-testids.tmpl +0 -81
  78. package/commands/propose-scenario.md +0 -359
  79. package/commands/propose-scenario.tmpl +0 -202
  80. package/commands/qc-analyze.md +0 -269
  81. package/commands/qc-analyze.tmpl +0 -112
  82. package/commands/qc-design-test.md +0 -226
  83. package/commands/qc-design-test.tmpl +0 -69
  84. package/commands/qc-plan.md +0 -206
  85. package/commands/qc-plan.tmpl +0 -49
  86. package/commands/qc-report.md +0 -217
  87. package/commands/qc-report.tmpl +0 -60
  88. package/commands/qc-review.md +0 -210
  89. package/commands/qc-review.tmpl +0 -53
  90. package/commands/qc-run-test.md +0 -326
  91. package/commands/qc-run-test.tmpl +0 -116
  92. package/commands/refine-prd.md +0 -653
  93. package/commands/refine-prd.tmpl +0 -281
  94. package/commands/report-bug.md +0 -305
  95. package/commands/report-bug.tmpl +0 -148
  96. package/commands/review-code.md +0 -415
  97. package/commands/review-code.tmpl +0 -146
  98. package/commands/review-context.md +0 -902
  99. package/commands/review-context.tmpl +0 -530
  100. package/commands/review-tech-docs.md +0 -561
  101. package/commands/review-tech-docs.tmpl +0 -404
  102. package/commands/setup-ai-first.md +0 -602
  103. package/commands/setup-ai-first.tmpl +0 -450
  104. package/commands/sync.md +0 -430
  105. package/commands/sync.tmpl +0 -429
  106. package/commands/update-framework.md +0 -203
  107. package/commands/update-framework.tmpl +0 -202
  108. package/commands/validate-traces.md +0 -1077
  109. package/commands/validate-traces.tmpl +0 -920
  110. package/hooks/data-guard.js +0 -232
  111. package/hooks/settings.json +0 -19
  112. package/modules/android-compose/module.yaml +0 -13
  113. package/modules/android-compose/stack-profile.yaml +0 -57
  114. package/modules/angular/architecture-snippets/component-patterns.md +0 -187
  115. package/modules/angular/module.yaml +0 -6
  116. package/modules/angular/stack-profile.yaml +0 -38
  117. package/modules/context-engineering/architecture-snippets/context-design.md +0 -119
  118. package/modules/context-engineering/module.yaml +0 -9
  119. package/modules/context-engineering/stack-profile.yaml +0 -61
  120. package/modules/dotnet/architecture-snippets/clean-arch.md +0 -160
  121. package/modules/dotnet/module.yaml +0 -6
  122. package/modules/dotnet/stack-profile.yaml +0 -50
  123. package/modules/flutter/module.yaml +0 -14
  124. package/modules/flutter/stack-profile.yaml +0 -59
  125. package/modules/golang/architecture-snippets/domain-layout.md +0 -283
  126. package/modules/golang/module.yaml +0 -6
  127. package/modules/golang/stack-profile.yaml +0 -40
  128. package/modules/ios-swiftui/module.yaml +0 -13
  129. package/modules/ios-swiftui/stack-profile.yaml +0 -55
  130. package/modules/java-spring/architecture-snippets/layered-arch.md +0 -201
  131. package/modules/java-spring/module.yaml +0 -15
  132. package/modules/java-spring/stack-profile.yaml +0 -28
  133. package/modules/nextjs/architecture-snippets/app-router-patterns.md +0 -269
  134. package/modules/nextjs/module.yaml +0 -14
  135. package/modules/nextjs/stack-profile.yaml +0 -74
  136. package/modules/nuxt/module.yaml +0 -14
  137. package/modules/nuxt/stack-profile.yaml +0 -58
  138. package/modules/phaser-game/architecture-snippets/phaser-scene-patterns.md +0 -646
  139. package/modules/phaser-game/module.yaml +0 -15
  140. package/modules/phaser-game/stack-profile.yaml +0 -90
  141. package/modules/php-laravel/architecture-snippets/service-repository.md +0 -302
  142. package/modules/php-laravel/module.yaml +0 -15
  143. package/modules/php-laravel/stack-profile.yaml +0 -56
  144. package/modules/qc-playwright/stack-profile.yaml +0 -66
  145. package/modules/react/architecture-snippets/hooks-query-patterns.md +0 -254
  146. package/modules/react/module.yaml +0 -14
  147. package/modules/react/stack-profile.yaml +0 -63
  148. package/modules/react-native/module.yaml +0 -14
  149. package/modules/react-native/stack-profile.yaml +0 -56
  150. package/modules/vue/module.yaml +0 -14
  151. package/modules/vue/stack-profile.yaml +0 -65
  152. package/rules/data-protection.md +0 -80
  153. package/rules/workflow.md +0 -99
  154. package/skills/code/SKILL.md +0 -19
  155. package/skills/code/SKILL.tmpl +0 -19
  156. package/skills/debug/SKILL.md +0 -19
  157. package/skills/debug/SKILL.tmpl +0 -19
  158. package/skills/design-spec/SKILL.md +0 -11
  159. package/skills/design-spec/SKILL.tmpl +0 -11
  160. package/skills/discovery/SKILL.md +0 -14
  161. package/skills/discovery/SKILL.tmpl +0 -14
  162. package/skills/prd/SKILL.md +0 -19
  163. package/skills/prd/SKILL.tmpl +0 -19
  164. package/skills/qc/qa-analyst/DOC_GAPS.template.md +0 -63
  165. package/skills/qc/qa-analyst/acceptance-criteria.md +0 -60
  166. package/skills/qc/qa-analyst/business-rules.md +0 -59
  167. package/skills/qc/qa-analyst/data-flow.md +0 -64
  168. package/skills/qc/qa-analyst/spec-breakdown.md +0 -61
  169. package/skills/qc/qa-designer/e2e/journey.md +0 -41
  170. package/skills/qc/qa-designer/exploratory/charter.md +0 -68
  171. package/skills/qc/qa-designer/exploratory/explore-to-functional.md +0 -43
  172. package/skills/qc/qa-designer/functional/api.md +0 -45
  173. package/skills/qc/qa-designer/functional/gui-feature.md +0 -46
  174. package/skills/qc/qa-designer/functional/gui-screen.md +0 -52
  175. package/skills/qc/qa-designer/integration/api.md +0 -42
  176. package/skills/qc/qa-designer/integration/db.md +0 -39
  177. package/skills/qc/qa-designer/integration/gui.md +0 -40
  178. package/skills/qc/qa-designer/integration/kafka.md +0 -40
  179. package/skills/qc/qa-designer/non-functional.md +0 -40
  180. package/skills/qc/qa-planner/test-plan.md +0 -120
  181. package/skills/qc/qa-reviewer/script/e2e.md +0 -87
  182. package/skills/qc/qa-reviewer/script/exploratory.md +0 -45
  183. package/skills/qc/qa-reviewer/script/functional.md +0 -101
  184. package/skills/qc/qa-reviewer/script/integration.md +0 -91
  185. package/skills/qc/qa-reviewer/script/non-functional.md +0 -126
  186. package/skills/qc/qa-reviewer/test-case/e2e.md +0 -73
  187. package/skills/qc/qa-reviewer/test-case/exploratory.md +0 -43
  188. package/skills/qc/qa-reviewer/test-case/functional.md +0 -76
  189. package/skills/qc/qa-reviewer/test-case/integration.md +0 -69
  190. package/skills/qc/qa-reviewer/test-case/non-functional.md +0 -73
  191. package/skills/qc/qa-runner/e2e.md +0 -49
  192. package/skills/qc/qa-runner/exploratory/session.md +0 -36
  193. package/skills/qc/qa-runner/functional/api.md +0 -35
  194. package/skills/qc/qa-runner/functional/gui-feature.md +0 -51
  195. package/skills/qc/qa-runner/functional/gui-screen.md +0 -55
  196. package/skills/qc/qa-runner/integration.md +0 -47
  197. package/skills/qc/qa-runner/non-functional.md +0 -49
  198. package/skills/qc/qa-runner/report/report.md +0 -37
  199. package/skills/setup-ai-first/SKILL.md +0 -19
  200. package/skills/setup-ai-first/SKILL.tmpl +0 -19
  201. package/skills/spec/SKILL.md +0 -19
  202. package/skills/spec/SKILL.tmpl +0 -19
  203. package/skills/test/SKILL.md +0 -18
  204. package/skills/test/SKILL.tmpl +0 -18
  205. package/steps/business-language.md +0 -56
  206. package/steps/capture-lesson.md +0 -112
  207. package/steps/context-loader.md +0 -406
  208. package/steps/gate.md +0 -151
  209. package/steps/report-footer.md +0 -125
  210. package/steps/review-fanout.md +0 -159
  211. package/steps/spawn-agent.md +0 -129
  212. package/steps/trace-mirror.md +0 -53
  213. package/templates/README.md +0 -70
  214. package/templates/architecture.template.md +0 -394
  215. package/templates/ci/trace-gate.yml +0 -146
  216. package/templates/design-spec.template.md +0 -217
  217. package/templates/feature.template +0 -123
  218. package/templates/hooks/pre-push +0 -61
  219. package/templates/platform-guide.template.md +0 -145
  220. package/templates/prd.template.md +0 -283
  221. package/templates/product-definition.template.md +0 -188
  222. package/templates/project-context.yaml +0 -212
  223. package/templates/tech-design.template.md +0 -490
@@ -1,404 +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
-
8
- *Checkpoint: **không chặn** — read-only (ghi findings vào .agent/review/). Gate Bước 3 bỏ qua CHECKPOINT (Bước 3a).*
9
-
10
- {{include:steps/gate.md}}
11
-
12
- *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).
13
- Nếu `$ARGUMENTS` chứa `--resume` → bỏ qua sang Resume Mode bên dưới.*
14
-
15
- ## Context
16
- {{include:steps/context-loader.md}}
17
-
18
- ---
19
-
20
- ## Nạp tài liệu Review
21
-
22
- Sau khi nạp context nền, đọc các thứ sau theo thứ tự:
23
-
24
- 1. **Tech-doc target** — đọc đầy đủ. Trích từ header:
25
- - `@trace.ucs` → danh sách UC mà doc phủ (đối chiếu §10 UC Coverage)
26
- - `@trace.domain` → domain
27
- - `@trace.prd` → TICKET-ID của PRD nguồn
28
- - `@trace.platforms` → các platform có mặt (system / web / app)
29
- - `@trace.status` → status hiện tại (draft / in-review / approved)
30
-
31
- 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.
32
-
33
- 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.
34
-
35
- 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.
36
-
37
- 5. **Core entities** — đã nạp trong context (Bước 6 của context-loader).
38
-
39
- 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.
40
-
41
- Suy ra tên file findings (per-PRD):
42
- `{paths.refinement_dir}/{TICKET-ID}-tech-review-findings.yaml`
43
-
44
- ---
45
-
46
- ## Review Dimensions
47
-
48
- ### T1 — Architecture Alignment *(luôn CRITICAL nếu vi phạm)*
49
-
50
- Đối chiếu design đề xuất với quy tắc CLAUDE.md §2:
51
-
52
- | Loại vi phạm | Severity |
53
- |----------------|----------|
54
- | Controller gọi Repository trực tiếp (skip layer) | Critical |
55
- | Business logic trong Controller hoặc DTO | Critical |
56
- | Pattern bị cấm từ §3 | Critical |
57
- | Phụ thuộc đi ngược upstream (Service → Controller DTO) | Critical |
58
- | Annotation transaction sai layer | Major |
59
- | Thiếu tách lớp (không có Facade khi kiến trúc yêu cầu) | Major |
60
-
61
- Với mỗi finding:
62
- ```
63
- Component: {tên class hoặc method}
64
- Violates: "{rule text}" (CLAUDE.md §2)
65
- Fix: {layer/component nào nên sở hữu cái này}
66
- ```
67
- → **Không auto-fix.** Người phải quyết định fix cấu trúc. Bắt buộc note trong Review Board.
68
-
69
- ### T2 — Entity Consistency
70
-
71
- Dùng catalog core-entities đã nạp:
72
-
73
- | Vấn đề | Severity | Auto-fixable? |
74
- |-------|----------|---------------|
75
- | Entity được nhắc nhưng không có trong core-entities.md | Major | No — người confirm là DTO hay domain entity |
76
- | Tên field khác core-entities.md | Major | Yes — đổi về canonical |
77
- | Quan hệ được mô tả khác đi | Major | No — người quyết định |
78
- | 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 |
79
-
80
- ### T3 — BDD Traceability
81
-
82
- Đố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**.
83
-
84
- > ⚠ **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.
85
-
86
- | Vấn đề | Severity | Auto-fixable? |
87
- |-------|----------|---------------|
88
- | Tech-doc đề xuất behavior không có trong scenario BDD nào (cùng platform) | Major | No — tạo scenario trước |
89
- | Tech-doc mâu thuẫn một scenario BDD | Critical | No — giải quyết conflict trước |
90
- | 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 |
91
- | §10 UC Coverage sót một (platform, SC) đã có BDD | Major | Yes — thêm dòng coverage + section tương ứng |
92
- | 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 |
93
-
94
- ### T3b — BDD Freshness *(tech-doc còn khớp BDD hiện tại không)*
95
-
96
- *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`.*
97
-
98
- 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`):
99
-
100
- | Điều kiện | Severity | Auto-fixable? |
101
- |---|---|---|
102
- | Map khớp `.feature` | *(sạch)* | — |
103
- | `.feature` **mới hơn** map | **Major** | **No** — cần người review §4/§4.5 rồi bump `@trace.revision` |
104
- | Platform có `.feature` nhưng **vắng** trong map | **Major** | Yes — thêm entry sau khi xác nhận §4 đã phủ platform đó |
105
- | Map có platform mà **không** có `.feature` | Minor | Yes — xoá entry (BDD đã bỏ platform đó) |
106
-
107
- 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`."*
108
-
109
- > **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.
110
-
111
- **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:
112
- ```
113
- ⚠️ {n} platform có BDD mới hơn bản mà tech-doc này dựng từ:
114
- {platform}: doc dựng từ v{old} · .feature giờ v{new}
115
- Duyệt doc bây giờ = chốt một contract có thể đã lệch behavior.
116
- Vẫn đặt approved? (Y/N)
117
- ```
118
- 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.)*
119
-
120
- ### T4 — Cross-PRD Endpoint Conflict Check *(targeted, load-on-hit)*
121
-
122
- 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:
123
-
124
- 1. Trích danh sách endpoint (method + path, §4.1) + entity chính của doc target.
125
- 2. `grep` từng path/entity đó trong `{paths.tech_docs_dir}/{domain}/*/tech-docs/*-tech-design.md` (trừ target) — chỉ đọc dòng match.
126
- 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.
127
-
128
- | Vấn đề *(chỉ khi grep dính)* | Severity | Auto-fixable? |
129
- |-------|----------|---------------|
130
- | Cùng endpoint path, request/response khác shape giữa 2 PRD | Critical | No — người giải quyết |
131
- | Cùng service method với behavior khác | Critical | No — người giải quyết |
132
- | Status transition của cùng entity khác nhau giữa các doc PRD | Critical | No — người giải quyết |
133
- | 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 |
134
-
135
- Không có va chạm grep → T4 pass, không nạp thêm gì.
136
-
137
- ### T5 — Internal Consistency
138
-
139
- Trong nội bộ tech-doc:
140
-
141
- | Check | Severity | Auto-fixable? |
142
- |-------|----------|---------------|
143
- | Sequence diagram thể hiện flow khác phần mô tả viết | Major | No |
144
- | API spec return type khác code sketch | Major | Yes — căn chỉnh cái này theo cái kia |
145
- | Section tham chiếu một component/concept không bao giờ được định nghĩa sau đó | Minor | Yes — thêm định nghĩa |
146
- | Assumption được nêu nhưng không design nào xử lý nó | Minor | Yes — thêm note hoặc bỏ assumption |
147
-
148
- ### T6 — Structural Completeness
149
-
150
- Kiểm tra tất cả section chuẩn có mặt và không rỗng:
151
-
152
- | Section | Missing severity |
153
- |---------|-----------------|
154
- | Header (`@trace.prd`, `@trace.ucs`, `@trace.domain`, `@trace.status`) | Major |
155
- | Overview / Context | Major |
156
- | Architecture Decision kèm lý do | Major |
157
- | Component Diagram hoặc Layer Description | Major |
158
- | Sequence Diagram hoặc Flow Steps | Major |
159
- | API Contract (nếu hướng HTTP) | Major |
160
- | Data Model Changes (nếu entity đổi) | Major |
161
- | Error Handling Strategy | Major |
162
- | Open Questions / Assumptions | Minor |
163
-
164
- → Mọi finding section-thiếu T6 đều **auto-fixable**: AI thêm skeleton section kèm prompt.
165
-
166
- ### T7 — Cross-Team API Contract Review
167
-
168
- *Chỉ áp dụng khi TẤT CẢ điều sau đúng:*
169
- *1. Doc có phần backend/API (`@trace.platforms` gồm `system`, tức PRD có System BDD).*
170
- *2. Header tech-doc KHÔNG có `@trace.api_source: existing`.*
171
-
172
- *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.*
173
-
174
- Dimension này đảm bảo team FE, App, và BE đều đồng thuận API contract trước khi bắt đầu implement.
175
-
176
- **Step 1 — Check status sign-off trong header tech-doc:**
177
-
178
- Đọc block `@trace.sign_off` trong header tech doc. Nếu vắng → thêm như một finding (auto-fixable: thêm skeleton).
179
-
180
- ```yaml
181
- # @trace.sign_off:
182
- # be_team: pending # author — set "done" khi BE hài lòng với design
183
- # fe_team: pending # FE/Web — phải confirm contract khớp expectation của web BDD
184
- # app_team: pending # App — phải confirm contract khớp expectation của app BDD (nếu áp dụng)
185
- # sa: pending # SA/Tech Lead — approval cuối
186
- ```
187
-
188
- **Step 2 — Contract vs BDD cross-check:**
189
-
190
- 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).
191
-
192
- 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:
193
-
194
- | Check | Severity |
195
- |---|---|
196
- | Field response trong API contract không phủ những gì web BDD `Then` mong | Critical |
197
- | Field response trong API contract không phủ những gì app BDD `Then` mong | Critical |
198
- | Shape error response không khớp những gì các platform BDD mong | Major |
199
- | Annotation `@system.resolution` của System BDD mâu thuẫn với design API contract | Critical |
200
-
201
- **Step 3 — Report sign-off pending:**
202
-
203
- Sau review, liệt kê các sign-off còn `pending`:
204
-
205
- ```
206
- ⏳ Sign-off pending trước khi tech docs được approve:
207
- fe_team — team FE/Web phải confirm API contract khớp expectation web BDD
208
- app_team — team App phải confirm API contract khớp expectation app BDD
209
- sa — SA/Tech Lead approval cuối
210
-
211
- Khi thu đủ sign-off → cập nhật @trace.sign_off trong header tech doc, rồi chạy lại /review-tech-docs.
212
- Tech docs không thể set "approved" khi còn bất kỳ sign-off bắt buộc nào pending.
213
- ```
214
-
215
- **Approval gate:**
216
- - 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`
217
- - Ngược lại → `@trace.status` giữ `in-review` — `generate-code` bị chặn
218
-
219
- ### T8 — Reconciliation & Completeness
220
-
221
- *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).*
222
-
223
- > **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.
224
-
225
- > **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`).
226
-
227
- | Vấn đề | Severity | Auto-fixable? |
228
- |---|---|---|
229
- | 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 |
230
- | Cột/field ghi nhưng **không có writer** (không luồng nào set) | Major | No |
231
- | **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 |
232
- | PRD-BR đưa **hợp đồng chung** (generic envelope) nhưng doc tự làm **typed-per-thing** | Major | No |
233
- | **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 |
234
- | Cross-service **không tách** bên nào own dedup/ordering, hoặc thiếu **ack path** | Major | No |
235
- | **Cross-field invariant** giữa các field/entity không được nêu | Minor | Yes — thêm note |
236
-
237
- ### T9 — Gap Honesty & Constants
238
-
239
- *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.*
240
-
241
- | Vấn đề | Severity | Auto-fixable? |
242
- |---|---|---|
243
- | 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 |
244
- | Chỗ đáng lẽ khai gap lại **bỏ trắng / chép hình dạng ở boundary** | Major | No |
245
- | **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 |
246
- | **Happy-only** — API/flow thiếu partial + error case + rollback | Major | No — thiết kế nhánh lỗi trước |
247
- | **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 |
248
- | 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 |
249
- | 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 |
250
- | `[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 |
251
- | §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)* |
252
-
253
- > **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`.
254
-
255
- ---
256
-
257
- ## Ghi File Findings
258
-
259
- Sau khi chạy hết các check, ghi findings vào `{paths.refinement_dir}/{TICKET-ID}-tech-review-findings.yaml`:
260
-
261
- ```yaml
262
- source_file: "{absolute path to tech-doc}"
263
- prd_id: "{TICKET-ID}"
264
- ucs: [{UC-ID list phủ bởi doc}]
265
- domain: "{domain}"
266
- generated_at: "{ISO datetime}"
267
- review_type: "tech-design"
268
- status: "pending_review"
269
- is_system_bdd: {true | false} # true nếu doc có phần backend (@trace.platforms gồm system)
270
-
271
- sign_off: # chỉ có khi is_system_bdd: true
272
- be_team: pending # đọc từ @trace.sign_off trong header tech-doc
273
- fe_team: pending
274
- app_team: pending # "n/a" nếu dự án không có platform app
275
- sa: pending
276
- sign_off_gate: blocked # blocked | ready — "ready" chỉ khi tất cả bắt buộc là "done"
277
-
278
- findings:
279
- - id: "F001"
280
- check_id: "T1" # T1 · T2 · T3 · T3b · T4 · T5 · T6 · T7 · T8 · T9
281
- severity: "critical" # critical | major | minor
282
- section: "{section heading hoặc tên component nơi tìm thấy lỗi}"
283
- uc_id: "{UC-ID}" # UC mà finding này thuộc về (một trong `ucs`; đọc §10 để xác định)
284
- 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ự}"
285
- finding: "{mô tả rõ ràng vi phạm hoặc gap}"
286
- suggestion: "{bản fix cụ thể — AI áp dụng khi --resume nếu được chấp nhận}"
287
- auto_fixable: false # true = AI áp dụng được; false = người phải ghi quyết định trong note
288
- status: "pending" # pending | accepted | modified | rejected | deferred
289
-
290
- summary:
291
- total_findings: {N}
292
- by_severity: { critical: {N}, major: {N}, minor: {N} }
293
- auto_fixable: {N}
294
- requires_human_decision: {N}
295
- recommendation: "APPROVED | NEEDS_REVISION | BLOCKED"
296
- sign_off_gate: "{blocked — pending: fe_team, app_team, sa | ready}"
297
- ```
298
-
299
- > **Field định vị (`quote` + `uc_id`) — bắt buộc cho source-jump của Review Board.**
300
- > Với mỗi finding, copy một đoạn `quote` **nguyên văn** thẳng từ tech-doc tại đúng chỗ
301
- > 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.
302
- > Field này cho phép reviewer click một finding trong Review Board và nhảy tới đúng vị trí nguồn.
303
-
304
- ## Report
305
-
306
- {{include:steps/report-footer.md}}
307
-
308
- ```
309
- /review-tech-docs Hoàn tất — {target file}
310
- PRD: {TICKET-ID} | UCs: {UC list} | Domain: {domain}
311
- Findings: {total} | 🔴 Critical: {N} | 🟡 Major: {N} | 🟢 Minor: {N}
312
- Auto-fixable: {N} | Needs human decision: {N}
313
-
314
- GAP Register (§12): {open_blocker} 🔴 blocker open / {total_open} open / {total} tracked
315
- {🔒 còn blocker open → chặn approve | ✅ 0 blocker open}
316
-
317
- Sign-off gate (chỉ system BDD):
318
- be_team : {done | pending}
319
- fe_team : {done | pending} ← {name / "needs sign-off" }
320
- app_team : {done | pending | n/a}
321
- sa : {done | pending}
322
- Gate : {🔒 BLOCKED — pending: fe_team, sa | ✅ READY}
323
-
324
- File findings: {paths.refinement_dir}/{TICKET-ID}-tech-review-findings.yaml
325
- Next: Mở trong Review Board → Accept/Modify/Reject từng finding
326
- Rồi chạy: /review-tech-docs --resume {tech-design-file}
327
- Sau khi thu đủ sign-off → cập nhật @trace.sign_off trong tech doc, chạy lại review
328
- ```
329
-
330
- ---
331
-
332
- ## Resume Mode — Áp dụng các Finding được chấp nhận
333
-
334
- *Kích hoạt khi `$ARGUMENTS` chứa `--resume`.*
335
- *Ví dụ: `/review-tech-docs --resume {paths.tech_docs_dir}/payment/{prd-slug}/tech-docs/PAY-123-tech-design.md`*
336
-
337
- ### Phase 1 — Đọc các finding được chấp nhận
338
-
339
- 1. Suy ra file findings từ target: `{paths.refinement_dir}/{TICKET-ID}-tech-review-findings.yaml`
340
- 2. Đọc file. Gom các finding có `status: "accepted"` hoặc `status: "modified"`.
341
- 3. Nếu không có → báo "No accepted findings. File unchanged." và dừng.
342
-
343
- ### Phase 2 — Áp dụng fix
344
-
345
- Áp dụng theo thứ tự: critical → major → minor.
346
-
347
- | check_id | Làm gì |
348
- |----------|-----------|
349
- | 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 |
350
- | T2 (Tên field) | Đổi field về tên canonical từ core-entities.md xuyên suốt tài liệu |
351
- | T3 (Thiếu design note) | Thêm design decision note cho scenario chưa phủ |
352
- | 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. |
353
- | T5 (Internal inconsistency) | Căn chỉnh các section mâu thuẫn theo quyết định nêu trong note |
354
- | T6 (Thiếu section) | Thêm skeleton section với prompt placeholder cho tech lead điền |
355
- | 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)* |
356
- | T9 (constant / citation) | Tách constant inline vào bảng catalog/enum; thêm định nghĩa cho citation không resolve |
357
-
358
- **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
359
- 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.
360
-
361
- ### Phase 3 — Cập nhật header + TSV + Report
362
-
363
- Sửa file tech-doc trực tiếp:
364
- 1. Tìm `@trace.revision:` trong header — tăng giá trị integer lên 1.
365
- 2. Tìm `@trace.status:` trong header. Set `approved` **chỉ khi CẢ HAI**:
366
- - (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À**
367
- - (b) §12 GAP Register **không còn 🔴 blocker nào ở trạng thái `open`** (đếm ở T9).
368
- 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).
369
- **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.
370
- 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.
371
- 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`.
372
-
373
- Ghi cả hai thay đổi vào file.
374
-
375
- 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:
376
- - 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ổ đó.
377
- - **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).
378
- - Set `last_updated` thành ngày hôm nay (`YYYY-MM-DD`) cho các row vừa chạm.
379
-
380
- In report sau khi hoàn tất mọi lần ghi file.
381
-
382
- ```
383
- /review-tech-docs --resume Đã áp dụng — {target file}
384
- PRD: {TICKET-ID} | UCs: {UC list}
385
-
386
- Applied : {N} findings ({critical} critical, {major} major, {minor} minor)
387
- Skipped : {N} rejected/deferred
388
-
389
- Changes:
390
- - {change 1}
391
- - {change 2}
392
-
393
- Revision : {old} → {new}
394
- Status : {approved | in-review}
395
-
396
- Sign-off : {✅ Tất cả done — status set approved
397
- | 🔒 Pending: fe_team, sa — status set in-review
398
- Cập nhật @trace.sign_off trong tech doc khi mỗi team confirm, rồi chạy lại /review-tech-docs}
399
-
400
- Chạy lại /review-tech-docs {file} để xác nhận 0 finding critical còn lại.
401
- Next: {/generate-code {feature-file} ← chỉ khi status = approved
402
- | Thu các sign-off pending → cập nhật @trace.sign_off → chạy lại /review-tech-docs}
403
- → 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
404
- ```