@educa-corp/sdd-framework 0.6.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.
- package/bin/gate-trace.js +25 -2
- package/bin/index.js +32 -5
- package/bin/lint-trace.js +41 -0
- package/bin/self-check.js +430 -3
- package/bin/trace-schema.json +391 -30
- package/core/FRAMEWORK_VERSION +1 -1
- package/{commands/extend-prd.md → core/commands/amend-prd.md} +205 -173
- package/core/commands/dev-run-test.md +47 -9
- package/core/commands/extend-prd.md +39 -12
- package/core/commands/generate-bdd.md +43 -4
- package/core/commands/generate-code.md +33 -0
- package/core/commands/generate-tech-docs.md +34 -2
- package/core/commands/qc-run-test.md +29 -3
- package/core/commands/refine-prd.md +13 -2
- package/core/commands/review-context.md +43 -8
- package/core/commands/sync.md +105 -1
- package/core/commands/validate-traces.md +284 -11
- package/core/rules/workflow.md +34 -0
- package/core/steps/context-loader.md +26 -5
- package/core/templates/feature.template +1 -1
- package/docs/02-concepts/architecture.md +36 -0
- package/docs/04-reference/commands.md +148 -134
- package/docs/04-reference/trace-schema.md +39 -0
- package/docs/explain/02b-extend-prd.md +1 -1
- package/docs/explain/02c-amend-prd.md +152 -0
- package/docs/explain/28-sync.md +25 -0
- package/docs/explain/README.md +136 -135
- package/package.json +1 -8
- package/commands/debug.md +0 -529
- package/commands/debug.tmpl +0 -260
- package/commands/define-product.md +0 -438
- package/commands/define-product.tmpl +0 -225
- package/commands/dev-gen-test.md +0 -700
- package/commands/dev-gen-test.tmpl +0 -490
- package/commands/dev-run-test.md +0 -435
- package/commands/dev-run-test.tmpl +0 -225
- package/commands/dev-smoke-test.md +0 -374
- package/commands/dev-smoke-test.tmpl +0 -217
- package/commands/extend-prd.tmpl +0 -273
- package/commands/fix-bug.md +0 -519
- package/commands/fix-bug.tmpl +0 -197
- package/commands/generate-architecture.md +0 -354
- package/commands/generate-architecture.tmpl +0 -197
- package/commands/generate-bdd.md +0 -923
- package/commands/generate-bdd.tmpl +0 -590
- package/commands/generate-code.md +0 -859
- package/commands/generate-code.tmpl +0 -649
- package/commands/generate-design-spec.md +0 -737
- package/commands/generate-design-spec.tmpl +0 -524
- package/commands/generate-prd.md +0 -722
- package/commands/generate-prd.tmpl +0 -226
- package/commands/generate-spec-manifest.md +0 -321
- package/commands/generate-spec-manifest.tmpl +0 -164
- package/commands/generate-tech-docs.md +0 -920
- package/commands/generate-tech-docs.tmpl +0 -273
- package/commands/learn.md +0 -399
- package/commands/learn.tmpl +0 -130
- package/commands/map-testids.md +0 -238
- package/commands/map-testids.tmpl +0 -81
- package/commands/propose-scenario.md +0 -359
- package/commands/propose-scenario.tmpl +0 -202
- package/commands/qc-analyze.md +0 -269
- package/commands/qc-analyze.tmpl +0 -112
- package/commands/qc-design-test.md +0 -226
- package/commands/qc-design-test.tmpl +0 -69
- package/commands/qc-plan.md +0 -206
- package/commands/qc-plan.tmpl +0 -49
- package/commands/qc-report.md +0 -217
- package/commands/qc-report.tmpl +0 -60
- package/commands/qc-review.md +0 -210
- package/commands/qc-review.tmpl +0 -53
- package/commands/qc-run-test.md +0 -326
- package/commands/qc-run-test.tmpl +0 -116
- package/commands/refine-prd.md +0 -653
- package/commands/refine-prd.tmpl +0 -281
- package/commands/report-bug.md +0 -305
- package/commands/report-bug.tmpl +0 -148
- package/commands/review-code.md +0 -415
- package/commands/review-code.tmpl +0 -146
- package/commands/review-context.md +0 -902
- package/commands/review-context.tmpl +0 -530
- package/commands/review-tech-docs.md +0 -561
- package/commands/review-tech-docs.tmpl +0 -404
- package/commands/setup-ai-first.md +0 -602
- package/commands/setup-ai-first.tmpl +0 -450
- package/commands/sync.md +0 -430
- package/commands/sync.tmpl +0 -429
- package/commands/update-framework.md +0 -203
- package/commands/update-framework.tmpl +0 -202
- package/commands/validate-traces.md +0 -1077
- package/commands/validate-traces.tmpl +0 -920
- package/hooks/data-guard.js +0 -232
- package/hooks/settings.json +0 -19
- package/modules/android-compose/module.yaml +0 -13
- package/modules/android-compose/stack-profile.yaml +0 -57
- package/modules/angular/architecture-snippets/component-patterns.md +0 -187
- package/modules/angular/module.yaml +0 -6
- package/modules/angular/stack-profile.yaml +0 -38
- package/modules/context-engineering/architecture-snippets/context-design.md +0 -119
- package/modules/context-engineering/module.yaml +0 -9
- package/modules/context-engineering/stack-profile.yaml +0 -61
- package/modules/dotnet/architecture-snippets/clean-arch.md +0 -160
- package/modules/dotnet/module.yaml +0 -6
- package/modules/dotnet/stack-profile.yaml +0 -50
- package/modules/flutter/module.yaml +0 -14
- package/modules/flutter/stack-profile.yaml +0 -59
- package/modules/golang/architecture-snippets/domain-layout.md +0 -283
- package/modules/golang/module.yaml +0 -6
- package/modules/golang/stack-profile.yaml +0 -40
- package/modules/ios-swiftui/module.yaml +0 -13
- package/modules/ios-swiftui/stack-profile.yaml +0 -55
- package/modules/java-spring/architecture-snippets/layered-arch.md +0 -201
- package/modules/java-spring/module.yaml +0 -15
- package/modules/java-spring/stack-profile.yaml +0 -28
- package/modules/nextjs/architecture-snippets/app-router-patterns.md +0 -269
- package/modules/nextjs/module.yaml +0 -14
- package/modules/nextjs/stack-profile.yaml +0 -74
- package/modules/nuxt/module.yaml +0 -14
- package/modules/nuxt/stack-profile.yaml +0 -58
- package/modules/phaser-game/architecture-snippets/phaser-scene-patterns.md +0 -646
- package/modules/phaser-game/module.yaml +0 -15
- package/modules/phaser-game/stack-profile.yaml +0 -90
- package/modules/php-laravel/architecture-snippets/service-repository.md +0 -302
- package/modules/php-laravel/module.yaml +0 -15
- package/modules/php-laravel/stack-profile.yaml +0 -56
- package/modules/qc-playwright/stack-profile.yaml +0 -66
- package/modules/react/architecture-snippets/hooks-query-patterns.md +0 -254
- package/modules/react/module.yaml +0 -14
- package/modules/react/stack-profile.yaml +0 -63
- package/modules/react-native/module.yaml +0 -14
- package/modules/react-native/stack-profile.yaml +0 -56
- package/modules/vue/module.yaml +0 -14
- package/modules/vue/stack-profile.yaml +0 -65
- package/rules/data-protection.md +0 -80
- package/rules/workflow.md +0 -99
- package/skills/code/SKILL.md +0 -19
- package/skills/code/SKILL.tmpl +0 -19
- package/skills/debug/SKILL.md +0 -19
- package/skills/debug/SKILL.tmpl +0 -19
- package/skills/design-spec/SKILL.md +0 -11
- package/skills/design-spec/SKILL.tmpl +0 -11
- package/skills/discovery/SKILL.md +0 -14
- package/skills/discovery/SKILL.tmpl +0 -14
- package/skills/prd/SKILL.md +0 -19
- package/skills/prd/SKILL.tmpl +0 -19
- package/skills/qc/qa-analyst/DOC_GAPS.template.md +0 -63
- package/skills/qc/qa-analyst/acceptance-criteria.md +0 -60
- package/skills/qc/qa-analyst/business-rules.md +0 -59
- package/skills/qc/qa-analyst/data-flow.md +0 -64
- package/skills/qc/qa-analyst/spec-breakdown.md +0 -61
- package/skills/qc/qa-designer/e2e/journey.md +0 -41
- package/skills/qc/qa-designer/exploratory/charter.md +0 -68
- package/skills/qc/qa-designer/exploratory/explore-to-functional.md +0 -43
- package/skills/qc/qa-designer/functional/api.md +0 -45
- package/skills/qc/qa-designer/functional/gui-feature.md +0 -46
- package/skills/qc/qa-designer/functional/gui-screen.md +0 -52
- package/skills/qc/qa-designer/integration/api.md +0 -42
- package/skills/qc/qa-designer/integration/db.md +0 -39
- package/skills/qc/qa-designer/integration/gui.md +0 -40
- package/skills/qc/qa-designer/integration/kafka.md +0 -40
- package/skills/qc/qa-designer/non-functional.md +0 -40
- package/skills/qc/qa-planner/test-plan.md +0 -120
- package/skills/qc/qa-reviewer/script/e2e.md +0 -87
- package/skills/qc/qa-reviewer/script/exploratory.md +0 -45
- package/skills/qc/qa-reviewer/script/functional.md +0 -101
- package/skills/qc/qa-reviewer/script/integration.md +0 -91
- package/skills/qc/qa-reviewer/script/non-functional.md +0 -126
- package/skills/qc/qa-reviewer/test-case/e2e.md +0 -73
- package/skills/qc/qa-reviewer/test-case/exploratory.md +0 -43
- package/skills/qc/qa-reviewer/test-case/functional.md +0 -76
- package/skills/qc/qa-reviewer/test-case/integration.md +0 -69
- package/skills/qc/qa-reviewer/test-case/non-functional.md +0 -73
- package/skills/qc/qa-runner/e2e.md +0 -49
- package/skills/qc/qa-runner/exploratory/session.md +0 -36
- package/skills/qc/qa-runner/functional/api.md +0 -35
- package/skills/qc/qa-runner/functional/gui-feature.md +0 -51
- package/skills/qc/qa-runner/functional/gui-screen.md +0 -55
- package/skills/qc/qa-runner/integration.md +0 -47
- package/skills/qc/qa-runner/non-functional.md +0 -49
- package/skills/qc/qa-runner/report/report.md +0 -37
- package/skills/setup-ai-first/SKILL.md +0 -19
- package/skills/setup-ai-first/SKILL.tmpl +0 -19
- package/skills/spec/SKILL.md +0 -19
- package/skills/spec/SKILL.tmpl +0 -19
- package/skills/test/SKILL.md +0 -18
- package/skills/test/SKILL.tmpl +0 -18
- package/steps/business-language.md +0 -56
- package/steps/capture-lesson.md +0 -112
- package/steps/context-loader.md +0 -406
- package/steps/gate.md +0 -151
- package/steps/report-footer.md +0 -125
- package/steps/review-fanout.md +0 -159
- package/steps/spawn-agent.md +0 -129
- package/steps/trace-mirror.md +0 -53
- package/templates/README.md +0 -70
- package/templates/architecture.template.md +0 -394
- package/templates/ci/trace-gate.yml +0 -146
- package/templates/design-spec.template.md +0 -217
- package/templates/feature.template +0 -123
- package/templates/hooks/pre-push +0 -61
- package/templates/platform-guide.template.md +0 -145
- package/templates/prd.template.md +0 -283
- package/templates/product-definition.template.md +0 -188
- package/templates/project-context.yaml +0 -212
- package/templates/tech-design.template.md +0 -490
|
@@ -1,490 +0,0 @@
|
|
|
1
|
-
<!--
|
|
2
|
-
════════════════════════════════════════════════════════════════════════════
|
|
3
|
-
TEMPLATE: Tài liệu Thiết kế Kỹ thuật (per-PRD, full-stack, gộp)
|
|
4
|
-
Dùng bởi: /generate-tech-docs
|
|
5
|
-
════════════════════════════════════════════════════════════════════════════
|
|
6
|
-
|
|
7
|
-
MÔ HÌNH PHẠM VI
|
|
8
|
-
- MỘT tài liệu cho mỗi PRD (không phải per-UC). Nó bao phủ MỌI use case của PRD
|
|
9
|
-
trong một thiết kế full-stack gộp: backend (API, mô hình dữ liệu, DB) VÀ client
|
|
10
|
-
(component, state, tích hợp API) đặt cạnh nhau, nối bằng sequence diagram xuyên
|
|
11
|
-
tầng. Đây là "bản vẽ thi công" mà bất kỳ dev nào mở ra để implement cả feature.
|
|
12
|
-
- ĐẦU VÀO là các file BDD của PRD (web/ · app/ · system/), KHÔNG phải văn xuôi PRD.
|
|
13
|
-
PRD chỉ nạp để lấy bối cảnh Overview/Goals/Actors.
|
|
14
|
-
|
|
15
|
-
TĂNG DẦN / APPEND
|
|
16
|
-
- Khi BDD mới được thêm vào cùng PRD về sau, tài liệu này được MỞ RỘNG, không sinh
|
|
17
|
-
lại: thêm section + sequence diagram của UC mới, cập nhật ma trận Độ phủ UC (§10)
|
|
18
|
-
và Changelog. KHÔNG bao giờ đè nội dung có sẵn hay chỉnh tay.
|
|
19
|
-
|
|
20
|
-
QUY TẮC ĐIỀN
|
|
21
|
-
- Thay MỌI placeholder {…} bằng nội dung thật. Xoá các comment hướng dẫn.
|
|
22
|
-
- THUẬT NGỮ: tuân 100% từ điển dự án (specs/domain-knowledge/business-dictionary.md).
|
|
23
|
-
Giá trị status/enum → core-entities.md (Enum Registry). Entity → core-entities.md.
|
|
24
|
-
- Giữ code/DTO/DB mẫu theo idiom stack của dự án (xem stack-profile của module đang
|
|
25
|
-
dùng). Snippet C#/Angular bên dưới chỉ MANG TÍNH MINH HOẠ — thay bằng stack thật.
|
|
26
|
-
- Section không áp dụng cho PRD này: GIỮ heading và viết "N/A — {lý do}" thay vì
|
|
27
|
-
xoá, để cấu trúc luôn nhất quán, dễ đoán.
|
|
28
|
-
- Mọi sequence diagram / API / rule phải truy vết được về một scenario: tham chiếu
|
|
29
|
-
id SC (vd UC1-SC3) mà nó phục vụ.
|
|
30
|
-
-->
|
|
31
|
-
|
|
32
|
-
# {Feature Area} — Tài liệu Thiết kế Kỹ thuật: {PRD Title}
|
|
33
|
-
|
|
34
|
-
<!-- Khối @trace (cấp PRD). ucs = mọi UC mà doc này phủ; nối thêm id khi thêm UC. GIỮ NGUYÊN key @trace.* — máy đọc. -->
|
|
35
|
-
---
|
|
36
|
-
@trace.id: {TICKET-ID}
|
|
37
|
-
@trace.domain: {domain}
|
|
38
|
-
@trace.prd: {TICKET-ID}
|
|
39
|
-
@trace.ucs: {TICKET-ID}-UC1, {TICKET-ID}-UC2{, …}
|
|
40
|
-
@trace.service: {service — từ header BDD @trace.service}
|
|
41
|
-
@trace.module: {module liên quan — vd dotnet, angular}
|
|
42
|
-
@trace.platforms: {system | web | app — tuỳ thư mục BDD nào tồn tại}
|
|
43
|
-
@trace.bdd_versions: {MAP theo từng platform — số nhiều, KHÁC @trace.bdd_version (scalar) của .feature — vd system=1.5, web=1.9, app=1.7; chỉ platform có mặt. Mỗi feature mang bdd_version riêng; đừng gộp về một số.}
|
|
44
|
-
@trace.api_source: {existing | —}
|
|
45
|
-
@trace.revision: 1
|
|
46
|
-
@trace.status: draft
|
|
47
|
-
@trace.generated_at: {YYYY-MM-DD}
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
> **Tài liệu liên quan:** {link các PRD / tech-design anh em mà doc này phụ thuộc, vd [OTHER-TICKET](../{other-slug}/tech-docs/{OTHER-TICKET}-tech-design.md)}. Xoá nếu không có.
|
|
51
|
-
|
|
52
|
-
## 1. Tổng quan (Overview)
|
|
53
|
-
|
|
54
|
-
<!-- 2–4 câu: feature làm gì, ai dùng, hình dạng kỹ thuật cốt lõi (nguồn dữ liệu,
|
|
55
|
-
side effect chính). Nêu rõ dữ liệu đến từ đâu (DB vs API ngoài) và thao tác ghi
|
|
56
|
-
chính. Nguồn: PRD + system BDD. -->
|
|
57
|
-
|
|
58
|
-
{Feature làm gì, tác nhân chính, và cơ chế kỹ thuật cốt lõi. Nêu rõ dữ liệu nào được
|
|
59
|
-
sở hữu (DB) vs lấy live (API ngoài), và thao tác ghi chính.}
|
|
60
|
-
|
|
61
|
-
### Mục tiêu (Goals)
|
|
62
|
-
|
|
63
|
-
<!-- Liệt kê mục tiêu kỹ thuật — suy từ mục tiêu PRD, diễn đạt thành thứ hệ thống
|
|
64
|
-
phải đảm bảo. -->
|
|
65
|
-
|
|
66
|
-
- {Mục tiêu 1}
|
|
67
|
-
- {Mục tiêu 2}
|
|
68
|
-
|
|
69
|
-
### Tác nhân nghiệp vụ (Business Actors)
|
|
70
|
-
|
|
71
|
-
| Tác nhân | Mô tả | Kênh |
|
|
72
|
-
|-------|-------------|---------|
|
|
73
|
-
| {Actor} | {vai trò & quyền} | {đường vào, vd App → Widget → Portal → API} |
|
|
74
|
-
|
|
75
|
-
---
|
|
76
|
-
|
|
77
|
-
## 2. Tổng quan Kiến trúc (Architecture Overview)
|
|
78
|
-
|
|
79
|
-
### 2.1 Kiến trúc tổng thể (High-level Architecture)
|
|
80
|
-
|
|
81
|
-
<!-- ASCII (hoặc mermaid) topology thể hiện các hệ thống feature này chạm tới:
|
|
82
|
-
client → gateway → service(s) → data store / API ngoài. Chỉ giữ các component
|
|
83
|
-
mà PRD NÀY thực sự dùng. Nguồn: architecture.md / project-context.yaml (services, stack). -->
|
|
84
|
-
|
|
85
|
-
```
|
|
86
|
-
{Sơ đồ ASCII hoặc mermaid các component feature này chạm tới}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
> **Lưu ý:** {chỉ ra dữ liệu nào lấy live từ API ngoài vs lưu trong DB sở hữu, và lớp cache + TTL nếu có.}
|
|
90
|
-
|
|
91
|
-
### 2.2 Mẫu giao tiếp (Communication Patterns)
|
|
92
|
-
|
|
93
|
-
| Mẫu | Dùng cho | Phạm vi (UC/SC) |
|
|
94
|
-
|---------|-------|---------------|
|
|
95
|
-
| {Client → Gateway → API} | {auth / action} | {UC1} |
|
|
96
|
-
| {API → API ngoài} | {lấy gì, cache TTL} | {UC1-SC…} |
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## 3. Mô hình Dữ liệu (Data Model)
|
|
101
|
-
|
|
102
|
-
<!-- Nguồn: core-entities.md (entity sở hữu) + mệnh đề Then của BDD (state) + PRD.
|
|
103
|
-
Phân biệt entity SỞ HỮU (trong DB) với model NGUỒN-API (lấy live, không lưu).
|
|
104
|
-
Chỉ liệt kê field mà PRD này đọc hoặc ghi. -->
|
|
105
|
-
|
|
106
|
-
### 3.1 Thiết kế Entity (Entity Design)
|
|
107
|
-
|
|
108
|
-
#### {EntityName} ({DB entity | POCO nguồn-API})
|
|
109
|
-
|
|
110
|
-
{Một dòng: nó biểu diễn gì, và được lưu hay lấy live.}
|
|
111
|
-
|
|
112
|
-
| Field | Kiểu | Dùng trong {TICKET-ID} |
|
|
113
|
-
|-------|------|----------------------|
|
|
114
|
-
| `{field}` | `{type}` | {feature này dùng thế nào — đọc/ghi, SC nào} |
|
|
115
|
-
|
|
116
|
-
<!-- Lặp lại cho mỗi entity. Nếu feature có chuyển trạng thái đáng kể, thêm bảng/sơ đồ
|
|
117
|
-
state nhỏ như dưới. -->
|
|
118
|
-
|
|
119
|
-
**Chuyển trạng thái (nếu có):**
|
|
120
|
-
|
|
121
|
-
```
|
|
122
|
-
{state A}: {điều kiện} → {kết quả / tín hiệu UI}
|
|
123
|
-
{state B}: {điều kiện} → {kết quả}
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
**Ràng buộc:**
|
|
127
|
-
- {invariant enforce ở tầng application/DB, vd đúng một primary cho mỗi tenant}
|
|
128
|
-
|
|
129
|
-
### 3.2 Quan hệ Entity (Entity Relationships)
|
|
130
|
-
|
|
131
|
-
```
|
|
132
|
-
{sơ đồ quan hệ — cardinality, khoá join, field nào read-only vs sở hữu}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
### 3.3 Ranh giới Nguồn dữ liệu (Data Source Boundaries)
|
|
136
|
-
|
|
137
|
-
<!-- Phát biểu gọn PRD NÀY đọc gì vs ghi gì, và cái gì được uỷ thác nơi khác.
|
|
138
|
-
Chống lem phạm vi. -->
|
|
139
|
-
|
|
140
|
-
**Phạm vi {TICKET-ID}: {ĐỌC … / GHI …}.**
|
|
141
|
-
|
|
142
|
-
| Trách nhiệm | Trong phạm vi? | Do ai xử lý |
|
|
143
|
-
|----------------|-----------|-----------|
|
|
144
|
-
| {đọc list đã gộp} | ✅ Có | {endpoint / service} |
|
|
145
|
-
| {ghi cờ X} | ✅ Có | {service} |
|
|
146
|
-
| {dữ liệu gốc} | ❌ Read-only | {API ngoài + cache} |
|
|
147
|
-
| {mối lo module khác} | ❌ Không | {module/team} |
|
|
148
|
-
|
|
149
|
-
### 3.4 Multi-tenant & Sharding
|
|
150
|
-
|
|
151
|
-
<!-- Chỉ khi dự án multi-tenant. Nếu không, viết "N/A — single tenant". -->
|
|
152
|
-
|
|
153
|
-
- {khoá tenant trên entity, cách ly bằng query-filter, phân giải shard — từ architecture.md}
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
## 4. Hợp đồng API (API Contracts)
|
|
158
|
-
|
|
159
|
-
<!-- Contract backend. Greenfield: thiết kế endpoint từ scenario BDD. Brownfield
|
|
160
|
-
(@trace.api_source = existing): reverse-document API đang chạy as-is và ghi chú
|
|
161
|
-
gap so với kỳ vọng BDD. Đánh dấu REUSE vs NEW rõ ràng.
|
|
162
|
-
PRD CHỈ-CLIENT (không có BDD system/ — feature này không sở hữu backend): ĐỪNG
|
|
163
|
-
bịa contract BE. §4.1 khi đó liệt kê các endpoint mà client TIÊU THỤ (ngoài /
|
|
164
|
-
bên thứ ba / của team khác / có sẵn), đánh dấu "consumed (external)",
|
|
165
|
-
reverse-document từ mệnh đề Then của BDD client + PRD; chỉ điền §4.2/§4.3 nếu
|
|
166
|
-
biết shape. Nếu feature không gọi mạng gì cả → viết "N/A — client-only, no backend".
|
|
167
|
-
§4.5.4 ánh xạ method client tới bất cứ gì §4.1 liệt kê (hoặc không có). -->
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
### 4.1 Endpoints
|
|
171
|
-
|
|
172
|
-
```
|
|
173
|
-
{METHOD} {/path} # NEW | REUSE ({nguồn}) — {mục đích một dòng}
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
### 4.2 Model Request/Response (Request/Response Models)
|
|
177
|
-
|
|
178
|
-
<!-- Thể hiện shape DTO theo idiom của stack. Ghi rõ field nào đến từ DB vs API ngoài. -->
|
|
179
|
-
|
|
180
|
-
```{lang}
|
|
181
|
-
{định nghĩa DTO kèm comment nguồn từng field}
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
### 4.3 Validation & Mã lỗi (Validation & Error Codes)
|
|
185
|
-
|
|
186
|
-
**Quy tắc validation:**
|
|
187
|
-
|
|
188
|
-
```{lang}
|
|
189
|
-
{quy tắc validation, theo idiom stack (vd FluentValidation / class-validator)}
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
| Code | HTTP Status | Mô tả | Trace |
|
|
193
|
-
|------|-------------|-------------|-------|
|
|
194
|
-
| `{ERROR_CODE}` | {4xx/5xx} | {khi nào phát sinh} | {UC1-SC…} |
|
|
195
|
-
|
|
196
|
-
### 4.4 Logic Handler (endpoint chính)
|
|
197
|
-
|
|
198
|
-
<!-- Với các thao tác ghi không tầm thường, viết rõ các bước có thứ tự (validation →
|
|
199
|
-
transaction → commit/rollback → return). Giữ sequence diagram và code khớp nhau. -->
|
|
200
|
-
|
|
201
|
-
**{HandlerName}:**
|
|
202
|
-
1. {bước}
|
|
203
|
-
2. {bước — ranh giới transaction nếu có}
|
|
204
|
-
|
|
205
|
-
### 4.5 Ánh xạ Component UI (UI Component Mapping) — {platform} ({framework})
|
|
206
|
-
|
|
207
|
-
<!-- Thiết kế CLIENT, NHÓM THEO PLATFORM: một section "### 4.5 … — {platform}" cho mỗi
|
|
208
|
-
platform client có trong BDD (một nhóm web, một nhóm app). ĐỪNG đặt tên heading
|
|
209
|
-
này theo màn hình — màn hình/UC nằm ở các sub-block bên dưới.
|
|
210
|
-
Bên trong một nhóm platform:
|
|
211
|
-
• §4.5.1 Cây Component — lặp sub-block theo màn hình/UC:
|
|
212
|
-
"#### 4.5.1.x {Screen} — {UC}". Một PRD nhiều màn hình/UC → nhiều sub-block
|
|
213
|
-
trong CÙNG nhóm platform (không bao giờ tạo nhóm 4.5 thứ hai cho cùng platform).
|
|
214
|
-
• §4.5.2–§4.5.5 — tương tự theo màn hình/UC ở chỗ chúng khác nhau.
|
|
215
|
-
• §4.5.6 Test Selectors — MỘT bảng dùng chung cho cả nhóm platform; cột
|
|
216
|
-
"Phục vụ SC" mang (UC · SC) để consumer per-UC lọc row của mình.
|
|
217
|
-
Append: platform mới → nhóm "### 4.5 — {platform}" mới; màn hình/UC mới trong
|
|
218
|
-
platform đã có → thêm sub-block + row vào §4.5.6 (đừng lặp nhóm).
|
|
219
|
-
Bỏ hẳn §4.5 với PRD backend-only. -->
|
|
220
|
-
|
|
221
|
-
> **Nguồn:** {file Figma + node id, từ design-spec}
|
|
222
|
-
> **Stack:** {framework, state primitive, thư viện component}
|
|
223
|
-
> <!-- @figma.url: {url figma cấp node} -->
|
|
224
|
-
|
|
225
|
-
#### 4.5.1 Cây Component (Component Hierarchy) — {Screen} ({UC})
|
|
226
|
-
|
|
227
|
-
<!-- Lặp sub-block này theo màn hình/UC trong nhóm platform này (4.5.1.a, 4.5.1.b …). -->
|
|
228
|
-
|
|
229
|
-
```
|
|
230
|
-
{cây component — container vs presentational, con có điều kiện}
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
#### 4.5.2 Ánh xạ file Component (Component File Mapping)
|
|
234
|
-
|
|
235
|
-
| Component | Path | Loại | Trách nhiệm |
|
|
236
|
-
|-----------|------|------|---------|
|
|
237
|
-
| `{Component}` | `{path}` | {Feature/Child} | {trách nhiệm} |
|
|
238
|
-
|
|
239
|
-
#### 4.5.3 Quản lý State (State Management) ({state primitive})
|
|
240
|
-
|
|
241
|
-
<!-- Shape state suy từ mệnh đề Then của System BDD + shape response từ §4.2.
|
|
242
|
-
Thể hiện giá trị dẫn xuất/tính toán và input của chúng. -->
|
|
243
|
-
|
|
244
|
-
```{lang}
|
|
245
|
-
{khai báo state kèm comment nguồn (mỗi cái map tới field BDD / field BE nào)}
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
#### 4.5.4 Tầng tích hợp API (API Integration Layer — port/adapter)
|
|
249
|
-
|
|
250
|
-
<!-- Cấu hình modal/route + bản đồ tích hợp API: mỗi method service client → một
|
|
251
|
-
endpoint THẬT từ §4.1 (đừng bịa endpoint). Lỗi → state UI theo từng SC.
|
|
252
|
-
Bảng này là thứ /generate-code --phase=integration đọc để wire adapter thật. -->
|
|
253
|
-
|
|
254
|
-
| Method client | Endpoint (§4.1) | Map request | Response → model | Lỗi → UI |
|
|
255
|
-
|---------------|-----------------|-------------|------------------|-----------|
|
|
256
|
-
| {svc.getX()} | {GET /…} | {params} | {DTO → ViewModel} | {4xx → state/toast} |
|
|
257
|
-
|
|
258
|
-
#### 4.5.5 Ánh xạ Figma → Design System
|
|
259
|
-
|
|
260
|
-
| Element Figma | Class/token design system | Ghi chú |
|
|
261
|
-
|---------------|---------------------------|-------|
|
|
262
|
-
| {element} | {class / token} | {size, màu, state} |
|
|
263
|
-
|
|
264
|
-
#### 4.5.6 Test Selectors — id element cho phần tử có action (hợp đồng QC)
|
|
265
|
-
|
|
266
|
-
<!-- Test-id ổn định cho mỗi element tương tác để QC định vị trực tiếp (không scan
|
|
267
|
-
runtime). Quy ước: {uc-lower}-{screen}-{element}-{type}; ĐỪNG nhúng số scenario.
|
|
268
|
-
Attribute theo platform: web data-testid · RN testID · Flutter Key/Semantics ·
|
|
269
|
-
iOS accessibilityIdentifier. Dùng lại CÙNG giá trị id trên web/app cho cùng một
|
|
270
|
-
element logic.
|
|
271
|
-
MỘT bảng dùng chung cho cả nhóm platform (phủ mọi màn hình/UC của platform này).
|
|
272
|
-
Cột "Phục vụ SC" mang (UC · SC) để consumer per-UC (generate-code / qc) lọc row
|
|
273
|
-
của mình qua §10. Nhóm §4.5 này vốn đã theo platform, nên platform là ngầm định
|
|
274
|
-
(khối web → web · SC). -->
|
|
275
|
-
|
|
276
|
-
| Test-ID | Element | Component (§4.5.1.x) | Action | Phục vụ SC (UC · SC) |
|
|
277
|
-
|---------|---------|----------------------|--------|---------------------|
|
|
278
|
-
| `{uc}-{screen}-{element}-{type}` | {Nút submit} | {Component} | {submit} | {UC1 · SC1, UC1 · SC3} |
|
|
279
|
-
|
|
280
|
-
---
|
|
281
|
-
|
|
282
|
-
## 5. Luồng chính (Key Flows — Sequence Diagrams)
|
|
283
|
-
|
|
284
|
-
<!-- MỘT mermaid sequence diagram cho mỗi scenario đáng kể. Participant xuyên tầng:
|
|
285
|
-
component client → service → API → API ngoài → DB.
|
|
286
|
-
⚠ id SC chỉ duy nhất trong phạm vi (UC × platform): `{UC}-SC1` ở `system` và
|
|
287
|
-
`{UC}-SC1` ở `web` là HAI scenario KHÁC nhau. Nên gom luồng vào các LANE PLATFORM
|
|
288
|
-
(5.A system · 5.B web · 5.C app) và LUÔN ghi kèm platform với SC, vd
|
|
289
|
-
"(web · UC1-SC1)". Đừng bao giờ viết "UC1-SC1" trơ ở đây — mơ hồ.
|
|
290
|
-
Chỉ đưa các lane có BDD tồn tại trong PRD này. -->
|
|
291
|
-
|
|
292
|
-
### 5.A Luồng System
|
|
293
|
-
|
|
294
|
-
<!-- Một diagram cho mỗi scenario system-BDD. Bỏ lane này nếu không có BDD system/. -->
|
|
295
|
-
|
|
296
|
-
#### 5.A.1 {tên} (system · {UC}-SC…)
|
|
297
|
-
|
|
298
|
-
```mermaid
|
|
299
|
-
sequenceDiagram
|
|
300
|
-
participant {A} as {Actor}
|
|
301
|
-
{…}
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
### 5.B Luồng Web
|
|
305
|
-
|
|
306
|
-
<!-- Một diagram cho mỗi scenario web-BDD. Bỏ lane này nếu không có BDD web/. -->
|
|
307
|
-
|
|
308
|
-
#### 5.B.1 {tên} (web · {UC}-SC…)
|
|
309
|
-
|
|
310
|
-
```mermaid
|
|
311
|
-
sequenceDiagram
|
|
312
|
-
{…}
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
### 5.C Luồng App
|
|
316
|
-
|
|
317
|
-
<!-- Một diagram cho mỗi scenario app-BDD. Bỏ lane này nếu không có BDD app/. -->
|
|
318
|
-
|
|
319
|
-
#### 5.C.1 {tên} (app · {UC}-SC…)
|
|
320
|
-
|
|
321
|
-
```mermaid
|
|
322
|
-
sequenceDiagram
|
|
323
|
-
{…}
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
<!-- Đánh số trong từng lane: 5.A.1, 5.A.2 … / 5.B.1 … / 5.C.1 …. Với scenario mà
|
|
327
|
-
hiệu ứng lấn sang module khác, ghi "(covered by {OTHER-UC})". -->
|
|
328
|
-
|
|
329
|
-
**Điểm tích hợp chính (bảng tuỳ chọn cho mỗi luồng):**
|
|
330
|
-
|
|
331
|
-
| Bước | Chuyển trạng thái | Verify bởi (platform · SC) |
|
|
332
|
-
|------|------------------|-----------------------------|
|
|
333
|
-
| {bước} | {trước → sau} | {web · UC1-SC…} |
|
|
334
|
-
|
|
335
|
-
---
|
|
336
|
-
|
|
337
|
-
## 6. Điểm tích hợp (Integration Points)
|
|
338
|
-
|
|
339
|
-
| Tích hợp | Chiều | Phương thức | Mô tả |
|
|
340
|
-
|-------------|-----------|--------|-------------|
|
|
341
|
-
| {Client → API} | Outbound (client) | {REST/Bearer} | {gì} |
|
|
342
|
-
| {API → Ngoài} | Outbound (server) | {REST + header} | {gì, cache TTL} |
|
|
343
|
-
|
|
344
|
-
### 6.1 Event Bus / Messaging
|
|
345
|
-
|
|
346
|
-
<!-- Event Kafka/queue mà feature này produce/consume. "N/A — no events" nếu không có. -->
|
|
347
|
-
|
|
348
|
-
{events, hoặc N/A}
|
|
349
|
-
|
|
350
|
-
### 6.2 Phụ thuộc Cross-Service (Cross-Service Dependencies)
|
|
351
|
-
|
|
352
|
-
| Service phụ thuộc | Cần gì | Contract | Trạng thái |
|
|
353
|
-
|-------------------|---------------|----------|--------|
|
|
354
|
-
| {service} | {cần} | {endpoint} | {✅ Có / ⚠️ pending} |
|
|
355
|
-
|
|
356
|
-
---
|
|
357
|
-
|
|
358
|
-
## 7. Bảo mật & Phân quyền (Security & Authorization)
|
|
359
|
-
|
|
360
|
-
### 7.1 Xác thực (Authentication)
|
|
361
|
-
|
|
362
|
-
{Luồng auth + loại token/TTL. Nguồn: auth PRD + rule dự án.}
|
|
363
|
-
|
|
364
|
-
### 7.2 Quy tắc Phân quyền (Authorization Rules)
|
|
365
|
-
|
|
366
|
-
| Action | Role/quyền yêu cầu | Mô tả | Trace |
|
|
367
|
-
|--------|--------------------------|-------------|-------|
|
|
368
|
-
| {action} | {role} | {enforce thế nào, ở đâu} | {UC1-SC… / ngoài phạm vi} |
|
|
369
|
-
|
|
370
|
-
---
|
|
371
|
-
|
|
372
|
-
## 8. Xử lý lỗi & Trường hợp biên (Error Handling & Edge Cases)
|
|
373
|
-
|
|
374
|
-
<!-- Một row cho mỗi scenario lỗi / biên / âm trong BDD. Phải khớp với mã lỗi §4.3
|
|
375
|
-
và các sequence diagram lỗi §5. -->
|
|
376
|
-
|
|
377
|
-
| Scenario | Chiến lược | Chi tiết | Trace |
|
|
378
|
-
|----------|----------|---------|-------|
|
|
379
|
-
| {điều kiện} | {cách xử lý} | {hành vi, message, side effect} | {UC1-SC…, BR…} |
|
|
380
|
-
|
|
381
|
-
---
|
|
382
|
-
|
|
383
|
-
## 9. Quyết định Thiết kế (Design Decisions)
|
|
384
|
-
|
|
385
|
-
<!-- Cái "vì sao" đằng sau các lựa chọn không hiển nhiên, kèm phương án đã cân nhắc.
|
|
386
|
-
Nguồn: alternatives/assumptions của PRD + lập luận lúc sinh. Đây là thứ giúp
|
|
387
|
-
reviewer tin tưởng thiết kế. -->
|
|
388
|
-
|
|
389
|
-
| # | Quyết định | Lý do | Phương án đã cân nhắc |
|
|
390
|
-
|---|----------|-----------|-------------------------|
|
|
391
|
-
| 1 | **{quyết định}** | {vì sao} | {phương án — vì sao loại} |
|
|
392
|
-
|
|
393
|
-
### Ánh xạ NFR → Thiết kế (NFR-to-Design Mapping)
|
|
394
|
-
|
|
395
|
-
| Nhóm NFR | Yêu cầu PRD | Quyết định thiết kế |
|
|
396
|
-
|--------------|-----------------|-----------------|
|
|
397
|
-
| {vd Cách ly multi-tenant} | {yêu cầu} | {cơ chế} |
|
|
398
|
-
|
|
399
|
-
---
|
|
400
|
-
|
|
401
|
-
## 10. Độ phủ UC (UC Coverage)
|
|
402
|
-
|
|
403
|
-
<!-- ĐIỂM NEO ĐỂ APPEND **và là MỤC LỤC cho consumer per-UC**. Mọi UC của PRD có một
|
|
404
|
-
row; mọi scenario map tới (các) section thiết kế nó.
|
|
405
|
-
- /generate-tech-docs dùng nó để phát hiện cái gì đã phủ vs còn thiếu.
|
|
406
|
-
- /generate-code, /map-testids, /qc-* làm việc trên MỘT UC của doc cấp-PRD — chúng
|
|
407
|
-
tra UC này Ở ĐÂY trước để định vị scenario của nó → các section/lane-§5 (và do đó
|
|
408
|
-
các endpoint §4.1 mà luồng §5 của nó gọi) thuộc về nó. Đừng lấy
|
|
409
|
-
endpoint/section của UC khác.
|
|
410
|
-
⚠ Độ phủ scenario khoá theo (platform, SC) vì id SC lặp giữa các platform —
|
|
411
|
-
cột Platform để phân biệt. -->
|
|
412
|
-
|
|
413
|
-
| UC | Feature | Platforms | Section phủ | Trạng thái |
|
|
414
|
-
|----|---------|-----------|------------------|--------|
|
|
415
|
-
| {TICKET-ID}-UC1 | {title} | {system, web, app} | §… | ✅ Covered |
|
|
416
|
-
|
|
417
|
-
### Độ phủ Scenario UC1
|
|
418
|
-
|
|
419
|
-
<!-- Một row cho mỗi (platform, SC). Cùng số SC ở platform khác nhau = scenario khác
|
|
420
|
-
nhau → row riêng. -->
|
|
421
|
-
|
|
422
|
-
| Platform | Scenario | Section | Business rule |
|
|
423
|
-
|----------|----------|---------|---------------|
|
|
424
|
-
| system | {UC}-SC1: {tên} | §5.A.1 | {BR…} |
|
|
425
|
-
| web | {UC}-SC1: {tên} | §4.5 (web), §5.B.1 | {BR…} |
|
|
426
|
-
|
|
427
|
-
<!-- Lặp một khối scenario-coverage cho mỗi UC. -->
|
|
428
|
-
|
|
429
|
-
---
|
|
430
|
-
|
|
431
|
-
## 11. Cross-cutting & Giả định (Tham chiếu ngoài phạm vi)
|
|
432
|
-
|
|
433
|
-
<!-- Các mối lo upstream mà PRD này PHỤ THUỘC VÀO nhưng không implement (cổng admin,
|
|
434
|
-
UI downstream ở module khác, snapshot đơn hàng…). Giữ để có bối cảnh liên team.
|
|
435
|
-
Tham chiếu UC/team sở hữu + doc. Nguồn: out-of-scope của PRD + ghi chú BR
|
|
436
|
-
"out of scope" trong BDD. -->
|
|
437
|
-
|
|
438
|
-
### 11.1 {Mối lo}
|
|
439
|
-
|
|
440
|
-
> {Trích câu BDD/PRD đã scope nó ra ngoài.}
|
|
441
|
-
|
|
442
|
-
{Giải thích ranh giới + một sequence diagram tham chiếu nếu hữu ích.}
|
|
443
|
-
|
|
444
|
-
**Sở hữu bởi:** {team / module}. Xem {link}.
|
|
445
|
-
|
|
446
|
-
---
|
|
447
|
-
|
|
448
|
-
## 12. GAP Register — ẩn số thiết kế chưa chốt
|
|
449
|
-
|
|
450
|
-
<!--
|
|
451
|
-
Mọi [GAP: Gn] / [ASSUMPTION: An] đánh dấu inline trong doc PHẢI có đúng MỘT dòng ở đây
|
|
452
|
-
(và ngược lại — không marker mồ côi, không dòng thừa). Đây là sổ quản lý vòng đời ẩn số.
|
|
453
|
-
|
|
454
|
-
- Loại:
|
|
455
|
-
• nội tại — BE tự quyết (đóng: BE điền giá trị, thay marker)
|
|
456
|
-
• cross-service — cần team/partner khác (đóng: qua T7 sign-off của owner)
|
|
457
|
-
• spec-defect — BDD/PRD sai/thiếu (KHÔNG tự đóng: escalate PO sửa .feature/PRD → regen; xem §9 Conflict)
|
|
458
|
-
- Severity:
|
|
459
|
-
• 🔴 blocker — code BẮT BUỘC phải có mới đúng → CHẶN approve
|
|
460
|
-
• 🟢 non-blocker — đoán tạm chạy được, chỉ cần confirm → không chặn
|
|
461
|
-
(Nhãn GAP/ASSUMPTION KHÔNG tự quyết severity — một ASSUMPTION vẫn có thể là blocker nếu đoán sai sẽ vỡ.)
|
|
462
|
-
- Status: open → resolved (owner điền giá trị thật → thay marker inline → bump @trace.revision).
|
|
463
|
-
|
|
464
|
-
GATE: còn ≥1 🔴 blocker ở trạng thái `open` → @trace.status KHÔNG được lên `approved`
|
|
465
|
-
(giữ `in-review`) → generate-code bị chặn. Cùng pattern design-spec giữ `draft` khi còn ❌ Missing.
|
|
466
|
-
-->
|
|
467
|
-
|
|
468
|
-
| id | Dùng ở (§) | Điều chưa biết | Loại | Owner confirm | Severity | Status | Đóng thế nào |
|
|
469
|
-
|----|-----------|----------------|------|---------------|----------|--------|--------------|
|
|
470
|
-
| G1 | {§4.3} | {shape lỗi khi partner từ chối} | cross-service | {team-payment} | 🔴 blocker | open | {T7 sign-off — owner cung cấp contract} |
|
|
471
|
-
| A1 | {§4.1} | {timeout mặc định 30s} | nội tại | {BE lead} | 🟢 non-blocker | open | {BE xác nhận, thay giá trị} |
|
|
472
|
-
|
|
473
|
-
> Nếu doc **không có** ẩn số nào → ghi "Không có — mọi thiết kế đều có nguồn." **KHÔNG** bịa dòng để lấp trống.
|
|
474
|
-
|
|
475
|
-
---
|
|
476
|
-
|
|
477
|
-
## Tham chiếu Thiết kế Figma (Figma Design References)
|
|
478
|
-
|
|
479
|
-
<!-- @figma.url: {url figma cấp node cho mỗi màn hình} -->
|
|
480
|
-
- {Screen}: [Figma — {frame}]({url})
|
|
481
|
-
- Exported: {YYYY-MM-DD}
|
|
482
|
-
|
|
483
|
-
---
|
|
484
|
-
|
|
485
|
-
## Changelog
|
|
486
|
-
|
|
487
|
-
| Revision | Ngày | Thay đổi |
|
|
488
|
-
|----------|------|---------|
|
|
489
|
-
| 1 | {YYYY-MM-DD} | Sinh lần đầu từ BDD {TICKET-ID} (v{bdd_version}): {liệt kê UC đã phủ} |
|
|
490
|
-
<!-- Khi append: thêm một row cho mỗi lần mở rộng, vd "2 | {ngày} | Thêm UC3 (§5.9, §10) từ BDD mới v{n}" -->
|