@educa-corp/sdd-framework 0.2.5 → 0.2.7
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/commands/debug.md +4 -1
- package/commands/define-product.md +4 -1
- package/commands/dev-gen-test.md +4 -1
- package/commands/dev-run-test.md +4 -1
- package/commands/dev-smoke-test.md +4 -1
- package/commands/fix-bug.md +4 -1
- package/commands/generate-architecture.md +4 -1
- package/commands/generate-bdd.md +4 -1
- package/commands/generate-code.md +97 -31
- package/commands/generate-code.tmpl +93 -30
- package/commands/generate-design-spec.md +4 -1
- package/commands/generate-prd.md +4 -1
- package/commands/generate-spec-manifest.md +4 -1
- package/commands/generate-tech-docs.md +244 -247
- package/commands/generate-tech-docs.tmpl +2 -0
- package/commands/learn.md +4 -1
- package/commands/map-testids.md +4 -1
- package/commands/propose-scenario.md +4 -1
- package/commands/qc-analyze.md +4 -1
- package/commands/qc-design-test.md +4 -1
- package/commands/qc-plan.md +4 -1
- package/commands/qc-report.md +4 -1
- package/commands/qc-review.md +4 -1
- package/commands/qc-run-test.md +4 -1
- package/commands/refine-prd.md +4 -1
- package/commands/report-bug.md +4 -1
- package/commands/review-code.md +4 -1
- package/commands/review-context.md +4 -1
- package/commands/review-tech-docs.md +4 -1
- package/commands/setup-ai-first.md +2 -1
- package/commands/validate-traces.md +4 -1
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +4 -1
- package/core/commands/define-product.md +4 -1
- package/core/commands/dev-gen-test.md +4 -1
- package/core/commands/dev-run-test.md +4 -1
- package/core/commands/dev-smoke-test.md +4 -1
- package/core/commands/fix-bug.md +4 -1
- package/core/commands/generate-architecture.md +4 -1
- package/core/commands/generate-bdd.md +4 -1
- package/core/commands/generate-code.md +97 -31
- package/core/commands/generate-design-spec.md +4 -1
- package/core/commands/generate-prd.md +4 -1
- package/core/commands/generate-spec-manifest.md +4 -1
- package/core/commands/generate-tech-docs.md +244 -247
- package/core/commands/learn.md +4 -1
- package/core/commands/map-testids.md +4 -1
- package/core/commands/propose-scenario.md +4 -1
- package/core/commands/qc-analyze.md +4 -1
- package/core/commands/qc-design-test.md +4 -1
- package/core/commands/qc-plan.md +4 -1
- package/core/commands/qc-report.md +4 -1
- package/core/commands/qc-review.md +4 -1
- package/core/commands/qc-run-test.md +4 -1
- package/core/commands/refine-prd.md +4 -1
- package/core/commands/report-bug.md +4 -1
- package/core/commands/review-code.md +4 -1
- package/core/commands/review-context.md +4 -1
- package/core/commands/review-tech-docs.md +4 -1
- package/core/commands/setup-ai-first.md +2 -1
- package/core/commands/validate-traces.md +4 -1
- package/core/steps/context-loader.md +2 -0
- package/core/steps/gate.md +2 -1
- package/core/templates/project-context.yaml +6 -0
- package/core/templates/tech-design.template.md +238 -246
- package/docs/02-concepts/pipeline-steps/06-code.md +7 -4
- package/docs/03-guides/developer.md +6 -3
- package/docs/explain/09-generate-code.md +41 -3
- package/package.json +1 -1
- package/steps/context-loader.md +2 -0
- package/steps/gate.md +2 -1
- package/templates/project-context.yaml +6 -0
- package/templates/tech-design.template.md +238 -246
|
@@ -1,307 +1,299 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
════════════════════════════════════════════════════════════════════════════
|
|
3
|
-
TEMPLATE:
|
|
4
|
-
|
|
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
5
|
════════════════════════════════════════════════════════════════════════════
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
- A section that does not apply to this PRD: keep the heading and write
|
|
31
|
-
"N/A — {reason}" rather than deleting it, so the shape stays predictable.
|
|
32
|
-
- Every sequence diagram / API / rule should be traceable back to a scenario:
|
|
33
|
-
reference the SC id (e.g. UC1-SC3) it serves.
|
|
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ụ.
|
|
34
30
|
-->
|
|
35
31
|
|
|
36
|
-
# {Feature Area} — {PRD Title}
|
|
32
|
+
# {Feature Area} — Tài liệu Thiết kế Kỹ thuật: {PRD Title}
|
|
37
33
|
|
|
38
|
-
<!-- @trace
|
|
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. -->
|
|
39
35
|
---
|
|
40
36
|
@trace.id: {TICKET-ID}
|
|
41
37
|
@trace.domain: {domain}
|
|
42
38
|
@trace.prd: {TICKET-ID}
|
|
43
39
|
@trace.ucs: {TICKET-ID}-UC1, {TICKET-ID}-UC2{, …}
|
|
44
|
-
@trace.service: {service —
|
|
45
|
-
@trace.module: {module
|
|
46
|
-
@trace.platforms: {system | web | app —
|
|
47
|
-
@trace.bdd_version: {
|
|
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_version: {map theo từng platform — vd system=1.5, web=1.9, app=1.7; chỉ platform có mặt. Mỗi feature mang bdd_version riêng; đừng gộp về một số.}
|
|
48
44
|
@trace.api_source: {existing | —}
|
|
49
45
|
@trace.revision: 1
|
|
50
46
|
@trace.status: draft
|
|
51
47
|
@trace.generated_at: {YYYY-MM-DD}
|
|
52
48
|
---
|
|
53
49
|
|
|
54
|
-
> **
|
|
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ó.
|
|
55
51
|
|
|
56
|
-
## 1. Overview
|
|
52
|
+
## 1. Tổng quan (Overview)
|
|
57
53
|
|
|
58
|
-
<!-- 2–4
|
|
59
|
-
|
|
60
|
-
|
|
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. -->
|
|
61
57
|
|
|
62
|
-
{
|
|
63
|
-
|
|
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.}
|
|
64
60
|
|
|
65
|
-
### Goals
|
|
61
|
+
### Mục tiêu (Goals)
|
|
66
62
|
|
|
67
|
-
<!--
|
|
68
|
-
|
|
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. -->
|
|
69
65
|
|
|
70
|
-
- {
|
|
71
|
-
- {
|
|
66
|
+
- {Mục tiêu 1}
|
|
67
|
+
- {Mục tiêu 2}
|
|
72
68
|
|
|
73
|
-
### Business Actors
|
|
69
|
+
### Tác nhân nghiệp vụ (Business Actors)
|
|
74
70
|
|
|
75
|
-
|
|
|
71
|
+
| Tác nhân | Mô tả | Kênh |
|
|
76
72
|
|-------|-------------|---------|
|
|
77
|
-
| {Actor} | {
|
|
73
|
+
| {Actor} | {vai trò & quyền} | {đường vào, vd App → Widget → Portal → API} |
|
|
78
74
|
|
|
79
75
|
---
|
|
80
76
|
|
|
81
|
-
## 2. Architecture Overview
|
|
77
|
+
## 2. Tổng quan Kiến trúc (Architecture Overview)
|
|
82
78
|
|
|
83
|
-
### 2.1 High-level Architecture
|
|
79
|
+
### 2.1 Kiến trúc tổng thể (High-level Architecture)
|
|
84
80
|
|
|
85
|
-
<!-- ASCII (
|
|
86
|
-
client → gateway → service(s) → data
|
|
87
|
-
|
|
88
|
-
project-context.yaml (services, stack). -->
|
|
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). -->
|
|
89
84
|
|
|
90
85
|
```
|
|
91
|
-
{ASCII
|
|
86
|
+
{Sơ đồ ASCII hoặc mermaid các component feature này chạm tới}
|
|
92
87
|
```
|
|
93
88
|
|
|
94
|
-
> **
|
|
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ó.}
|
|
95
90
|
|
|
96
|
-
### 2.2 Communication Patterns
|
|
91
|
+
### 2.2 Mẫu giao tiếp (Communication Patterns)
|
|
97
92
|
|
|
98
|
-
|
|
|
93
|
+
| Mẫu | Dùng cho | Phạm vi (UC/SC) |
|
|
99
94
|
|---------|-------|---------------|
|
|
100
95
|
| {Client → Gateway → API} | {auth / action} | {UC1} |
|
|
101
|
-
| {API →
|
|
96
|
+
| {API → API ngoài} | {lấy gì, cache TTL} | {UC1-SC…} |
|
|
102
97
|
|
|
103
98
|
---
|
|
104
99
|
|
|
105
|
-
## 3. Data Model
|
|
100
|
+
## 3. Mô hình Dữ liệu (Data Model)
|
|
106
101
|
|
|
107
|
-
<!--
|
|
108
|
-
|
|
109
|
-
|
|
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. -->
|
|
110
105
|
|
|
111
|
-
### 3.1 Entity Design
|
|
106
|
+
### 3.1 Thiết kế Entity (Entity Design)
|
|
112
107
|
|
|
113
|
-
#### {EntityName} ({DB entity | API
|
|
108
|
+
#### {EntityName} ({DB entity | POCO nguồn-API})
|
|
114
109
|
|
|
115
|
-
{
|
|
110
|
+
{Một dòng: nó biểu diễn gì, và được lưu hay lấy live.}
|
|
116
111
|
|
|
117
|
-
| Field |
|
|
112
|
+
| Field | Kiểu | Dùng trong {TICKET-ID} |
|
|
118
113
|
|-------|------|----------------------|
|
|
119
|
-
| `{field}` | `{type}` | {
|
|
114
|
+
| `{field}` | `{type}` | {feature này dùng thế nào — đọc/ghi, SC nào} |
|
|
120
115
|
|
|
121
|
-
<!--
|
|
122
|
-
|
|
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. -->
|
|
123
118
|
|
|
124
|
-
**
|
|
119
|
+
**Chuyển trạng thái (nếu có):**
|
|
125
120
|
|
|
126
121
|
```
|
|
127
|
-
{state A}: {
|
|
128
|
-
{state B}: {
|
|
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ả}
|
|
129
124
|
```
|
|
130
125
|
|
|
131
|
-
**
|
|
132
|
-
- {invariant
|
|
126
|
+
**Ràng buộc:**
|
|
127
|
+
- {invariant enforce ở tầng application/DB, vd đúng một primary cho mỗi tenant}
|
|
133
128
|
|
|
134
|
-
### 3.2 Entity Relationships
|
|
129
|
+
### 3.2 Quan hệ Entity (Entity Relationships)
|
|
135
130
|
|
|
136
131
|
```
|
|
137
|
-
{
|
|
132
|
+
{sơ đồ quan hệ — cardinality, khoá join, field nào read-only vs sở hữu}
|
|
138
133
|
```
|
|
139
134
|
|
|
140
|
-
### 3.3 Data Source Boundaries
|
|
135
|
+
### 3.3 Ranh giới Nguồn dữ liệu (Data Source Boundaries)
|
|
141
136
|
|
|
142
|
-
<!--
|
|
143
|
-
|
|
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. -->
|
|
144
139
|
|
|
145
|
-
**{TICKET-ID}
|
|
140
|
+
**Phạm vi {TICKET-ID}: {ĐỌC … / GHI …}.**
|
|
146
141
|
|
|
147
|
-
|
|
|
142
|
+
| Trách nhiệm | Trong phạm vi? | Do ai xử lý |
|
|
148
143
|
|----------------|-----------|-----------|
|
|
149
|
-
| {
|
|
150
|
-
| {
|
|
151
|
-
| {
|
|
152
|
-
| {
|
|
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} |
|
|
153
148
|
|
|
154
149
|
### 3.4 Multi-tenant & Sharding
|
|
155
150
|
|
|
156
|
-
<!--
|
|
151
|
+
<!-- Chỉ khi dự án multi-tenant. Nếu không, viết "N/A — single tenant". -->
|
|
157
152
|
|
|
158
|
-
- {tenant
|
|
153
|
+
- {khoá tenant trên entity, cách ly bằng query-filter, phân giải shard — từ architecture.md}
|
|
159
154
|
|
|
160
155
|
---
|
|
161
156
|
|
|
162
|
-
## 4. API Contracts
|
|
157
|
+
## 4. Hợp đồng API (API Contracts)
|
|
163
158
|
|
|
164
|
-
<!--
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
CLIENT
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
methods to whatever §4.1 lists (or none). -->
|
|
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ó). -->
|
|
174
168
|
|
|
175
169
|
|
|
176
170
|
### 4.1 Endpoints
|
|
177
171
|
|
|
178
172
|
```
|
|
179
|
-
{METHOD} {/path} # NEW | REUSE ({
|
|
173
|
+
{METHOD} {/path} # NEW | REUSE ({nguồn}) — {mục đích một dòng}
|
|
180
174
|
```
|
|
181
175
|
|
|
182
|
-
### 4.2 Request/Response Models
|
|
176
|
+
### 4.2 Model Request/Response (Request/Response Models)
|
|
183
177
|
|
|
184
|
-
<!--
|
|
185
|
-
external API. -->
|
|
178
|
+
<!-- Thể hiện shape DTO theo idiom của stack. Ghi rõ field nào đến từ DB vs API ngoài. -->
|
|
186
179
|
|
|
187
180
|
```{lang}
|
|
188
|
-
{DTO
|
|
181
|
+
{định nghĩa DTO kèm comment nguồn từng field}
|
|
189
182
|
```
|
|
190
183
|
|
|
191
|
-
### 4.3 Validation & Error Codes
|
|
184
|
+
### 4.3 Validation & Mã lỗi (Validation & Error Codes)
|
|
192
185
|
|
|
193
|
-
**
|
|
186
|
+
**Quy tắc validation:**
|
|
194
187
|
|
|
195
188
|
```{lang}
|
|
196
|
-
{validation
|
|
189
|
+
{quy tắc validation, theo idiom stack (vd FluentValidation / class-validator)}
|
|
197
190
|
```
|
|
198
191
|
|
|
199
|
-
| Code | HTTP Status |
|
|
192
|
+
| Code | HTTP Status | Mô tả | Trace |
|
|
200
193
|
|------|-------------|-------------|-------|
|
|
201
|
-
| `{ERROR_CODE}` | {4xx/5xx} | {
|
|
194
|
+
| `{ERROR_CODE}` | {4xx/5xx} | {khi nào phát sinh} | {UC1-SC…} |
|
|
202
195
|
|
|
203
|
-
### 4.4 Handler
|
|
196
|
+
### 4.4 Logic Handler (endpoint chính)
|
|
204
197
|
|
|
205
|
-
<!--
|
|
206
|
-
transaction → commit/rollback → return).
|
|
207
|
-
the code aligned. -->
|
|
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. -->
|
|
208
200
|
|
|
209
201
|
**{HandlerName}:**
|
|
210
|
-
1. {
|
|
211
|
-
2. {
|
|
202
|
+
1. {bước}
|
|
203
|
+
2. {bước — ranh giới transaction nếu có}
|
|
212
204
|
|
|
213
|
-
### 4.5 UI Component Mapping — {platform} ({framework})
|
|
205
|
+
### 4.5 Ánh xạ Component UI (UI Component Mapping) — {platform} ({framework})
|
|
214
206
|
|
|
215
|
-
<!-- CLIENT
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
• §4.5.1 Component
|
|
220
|
-
"#### 4.5.1.x {Screen} — {UC}".
|
|
221
|
-
|
|
222
|
-
• §4.5.2–§4.5.5 —
|
|
223
|
-
• §4.5.6 Test Selectors —
|
|
224
|
-
"
|
|
225
|
-
Append:
|
|
226
|
-
|
|
227
|
-
|
|
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. -->
|
|
228
220
|
|
|
229
|
-
> **
|
|
230
|
-
> **Stack:** {framework, state primitive, component
|
|
231
|
-
> <!-- @figma.url: {
|
|
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} -->
|
|
232
224
|
|
|
233
|
-
#### 4.5.1 Component Hierarchy — {Screen} ({UC})
|
|
225
|
+
#### 4.5.1 Cây Component (Component Hierarchy) — {Screen} ({UC})
|
|
234
226
|
|
|
235
|
-
<!--
|
|
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 …). -->
|
|
236
228
|
|
|
237
229
|
```
|
|
238
|
-
{component
|
|
230
|
+
{cây component — container vs presentational, con có điều kiện}
|
|
239
231
|
```
|
|
240
232
|
|
|
241
|
-
#### 4.5.2 Component File Mapping
|
|
233
|
+
#### 4.5.2 Ánh xạ file Component (Component File Mapping)
|
|
242
234
|
|
|
243
|
-
| Component | Path |
|
|
235
|
+
| Component | Path | Loại | Trách nhiệm |
|
|
244
236
|
|-----------|------|------|---------|
|
|
245
|
-
| `{Component}` | `{path}` | {Feature/Child} | {
|
|
237
|
+
| `{Component}` | `{path}` | {Feature/Child} | {trách nhiệm} |
|
|
246
238
|
|
|
247
|
-
#### 4.5.3 State Management ({state primitive})
|
|
239
|
+
#### 4.5.3 Quản lý State (State Management) ({state primitive})
|
|
248
240
|
|
|
249
|
-
<!--
|
|
250
|
-
|
|
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. -->
|
|
251
243
|
|
|
252
244
|
```{lang}
|
|
253
|
-
{state
|
|
245
|
+
{khai báo state kèm comment nguồn (mỗi cái map tới field BDD / field BE nào)}
|
|
254
246
|
```
|
|
255
247
|
|
|
256
|
-
#### 4.5.4 API Integration Layer
|
|
248
|
+
#### 4.5.4 Tầng tích hợp API (API Integration Layer — port/adapter)
|
|
257
249
|
|
|
258
|
-
<!--
|
|
259
|
-
|
|
260
|
-
|
|
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. -->
|
|
261
253
|
|
|
262
|
-
|
|
|
254
|
+
| Method client | Endpoint (§4.1) | Map request | Response → model | Lỗi → UI |
|
|
263
255
|
|---------------|-----------------|-------------|------------------|-----------|
|
|
264
256
|
| {svc.getX()} | {GET /…} | {params} | {DTO → ViewModel} | {4xx → state/toast} |
|
|
265
257
|
|
|
266
|
-
#### 4.5.5 Figma → Design System
|
|
258
|
+
#### 4.5.5 Ánh xạ Figma → Design System
|
|
267
259
|
|
|
268
|
-
| Figma
|
|
260
|
+
| Element Figma | Class/token design system | Ghi chú |
|
|
269
261
|
|---------------|---------------------------|-------|
|
|
270
|
-
| {element} | {class / token} | {size,
|
|
262
|
+
| {element} | {class / token} | {size, màu, state} |
|
|
271
263
|
|
|
272
|
-
#### 4.5.6 Test Selectors — element
|
|
264
|
+
#### 4.5.6 Test Selectors — id element cho phần tử có action (hợp đồng QC)
|
|
273
265
|
|
|
274
|
-
<!--
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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). -->
|
|
283
275
|
|
|
284
|
-
| Test-ID | Element | Component (§4.5.1.x) | Action |
|
|
276
|
+
| Test-ID | Element | Component (§4.5.1.x) | Action | Phục vụ SC (UC · SC) |
|
|
285
277
|
|---------|---------|----------------------|--------|---------------------|
|
|
286
|
-
| `{uc}-{screen}-{element}-{type}` | {
|
|
278
|
+
| `{uc}-{screen}-{element}-{type}` | {Nút submit} | {Component} | {submit} | {UC1 · SC1, UC1 · SC3} |
|
|
287
279
|
|
|
288
280
|
---
|
|
289
281
|
|
|
290
|
-
## 5. Key Flows
|
|
282
|
+
## 5. Luồng chính (Key Flows — Sequence Diagrams)
|
|
291
283
|
|
|
292
|
-
<!--
|
|
293
|
-
client
|
|
294
|
-
⚠ SC
|
|
295
|
-
`{UC}-SC1`
|
|
296
|
-
(5.A system · 5.B web · 5.C app)
|
|
297
|
-
|
|
298
|
-
|
|
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. -->
|
|
299
291
|
|
|
300
|
-
### 5.A System
|
|
292
|
+
### 5.A Luồng System
|
|
301
293
|
|
|
302
|
-
<!--
|
|
294
|
+
<!-- Một diagram cho mỗi scenario system-BDD. Bỏ lane này nếu không có BDD system/. -->
|
|
303
295
|
|
|
304
|
-
#### 5.A.1 {
|
|
296
|
+
#### 5.A.1 {tên} (system · {UC}-SC…)
|
|
305
297
|
|
|
306
298
|
```mermaid
|
|
307
299
|
sequenceDiagram
|
|
@@ -309,147 +301,147 @@ sequenceDiagram
|
|
|
309
301
|
{…}
|
|
310
302
|
```
|
|
311
303
|
|
|
312
|
-
### 5.B Web
|
|
304
|
+
### 5.B Luồng Web
|
|
313
305
|
|
|
314
|
-
<!--
|
|
306
|
+
<!-- Một diagram cho mỗi scenario web-BDD. Bỏ lane này nếu không có BDD web/. -->
|
|
315
307
|
|
|
316
|
-
#### 5.B.1 {
|
|
308
|
+
#### 5.B.1 {tên} (web · {UC}-SC…)
|
|
317
309
|
|
|
318
310
|
```mermaid
|
|
319
311
|
sequenceDiagram
|
|
320
312
|
{…}
|
|
321
313
|
```
|
|
322
314
|
|
|
323
|
-
### 5.C App
|
|
315
|
+
### 5.C Luồng App
|
|
324
316
|
|
|
325
|
-
<!--
|
|
317
|
+
<!-- Một diagram cho mỗi scenario app-BDD. Bỏ lane này nếu không có BDD app/. -->
|
|
326
318
|
|
|
327
|
-
#### 5.C.1 {
|
|
319
|
+
#### 5.C.1 {tên} (app · {UC}-SC…)
|
|
328
320
|
|
|
329
321
|
```mermaid
|
|
330
322
|
sequenceDiagram
|
|
331
323
|
{…}
|
|
332
324
|
```
|
|
333
325
|
|
|
334
|
-
<!--
|
|
335
|
-
|
|
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})". -->
|
|
336
328
|
|
|
337
|
-
|
|
329
|
+
**Điểm tích hợp chính (bảng tuỳ chọn cho mỗi luồng):**
|
|
338
330
|
|
|
339
|
-
|
|
|
331
|
+
| Bước | Chuyển trạng thái | Verify bởi (platform · SC) |
|
|
340
332
|
|------|------------------|-----------------------------|
|
|
341
|
-
| {
|
|
333
|
+
| {bước} | {trước → sau} | {web · UC1-SC…} |
|
|
342
334
|
|
|
343
335
|
---
|
|
344
336
|
|
|
345
|
-
## 6. Integration Points
|
|
337
|
+
## 6. Điểm tích hợp (Integration Points)
|
|
346
338
|
|
|
347
|
-
|
|
|
339
|
+
| Tích hợp | Chiều | Phương thức | Mô tả |
|
|
348
340
|
|-------------|-----------|--------|-------------|
|
|
349
|
-
| {Client → API} | Outbound (client) | {REST/Bearer} | {
|
|
350
|
-
| {API →
|
|
341
|
+
| {Client → API} | Outbound (client) | {REST/Bearer} | {gì} |
|
|
342
|
+
| {API → Ngoài} | Outbound (server) | {REST + header} | {gì, cache TTL} |
|
|
351
343
|
|
|
352
344
|
### 6.1 Event Bus / Messaging
|
|
353
345
|
|
|
354
|
-
<!-- Kafka/queue
|
|
346
|
+
<!-- Event Kafka/queue mà feature này produce/consume. "N/A — no events" nếu không có. -->
|
|
355
347
|
|
|
356
|
-
{events,
|
|
348
|
+
{events, hoặc N/A}
|
|
357
349
|
|
|
358
|
-
### 6.2 Cross-Service Dependencies
|
|
350
|
+
### 6.2 Phụ thuộc Cross-Service (Cross-Service Dependencies)
|
|
359
351
|
|
|
360
|
-
|
|
|
352
|
+
| Service phụ thuộc | Cần gì | Contract | Trạng thái |
|
|
361
353
|
|-------------------|---------------|----------|--------|
|
|
362
|
-
| {service} | {
|
|
354
|
+
| {service} | {cần} | {endpoint} | {✅ Có / ⚠️ pending} |
|
|
363
355
|
|
|
364
356
|
---
|
|
365
357
|
|
|
366
|
-
## 7. Security & Authorization
|
|
358
|
+
## 7. Bảo mật & Phân quyền (Security & Authorization)
|
|
367
359
|
|
|
368
|
-
### 7.1 Authentication
|
|
360
|
+
### 7.1 Xác thực (Authentication)
|
|
369
361
|
|
|
370
|
-
{
|
|
362
|
+
{Luồng auth + loại token/TTL. Nguồn: auth PRD + rule dự án.}
|
|
371
363
|
|
|
372
|
-
### 7.2 Authorization Rules
|
|
364
|
+
### 7.2 Quy tắc Phân quyền (Authorization Rules)
|
|
373
365
|
|
|
374
|
-
| Action |
|
|
366
|
+
| Action | Role/quyền yêu cầu | Mô tả | Trace |
|
|
375
367
|
|--------|--------------------------|-------------|-------|
|
|
376
|
-
| {action} | {role} | {
|
|
368
|
+
| {action} | {role} | {enforce thế nào, ở đâu} | {UC1-SC… / ngoài phạm vi} |
|
|
377
369
|
|
|
378
370
|
---
|
|
379
371
|
|
|
380
|
-
## 8. Error Handling & Edge Cases
|
|
372
|
+
## 8. Xử lý lỗi & Trường hợp biên (Error Handling & Edge Cases)
|
|
381
373
|
|
|
382
|
-
<!--
|
|
383
|
-
|
|
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. -->
|
|
384
376
|
|
|
385
|
-
| Scenario |
|
|
377
|
+
| Scenario | Chiến lược | Chi tiết | Trace |
|
|
386
378
|
|----------|----------|---------|-------|
|
|
387
|
-
| {
|
|
379
|
+
| {điều kiện} | {cách xử lý} | {hành vi, message, side effect} | {UC1-SC…, BR…} |
|
|
388
380
|
|
|
389
381
|
---
|
|
390
382
|
|
|
391
|
-
## 9. Design Decisions
|
|
383
|
+
## 9. Quyết định Thiết kế (Design Decisions)
|
|
392
384
|
|
|
393
|
-
<!--
|
|
394
|
-
|
|
395
|
-
|
|
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ế. -->
|
|
396
388
|
|
|
397
|
-
| # |
|
|
389
|
+
| # | Quyết định | Lý do | Phương án đã cân nhắc |
|
|
398
390
|
|---|----------|-----------|-------------------------|
|
|
399
|
-
| 1 | **{
|
|
391
|
+
| 1 | **{quyết định}** | {vì sao} | {phương án — vì sao loại} |
|
|
400
392
|
|
|
401
|
-
### NFR-to-Design Mapping
|
|
393
|
+
### Ánh xạ NFR → Thiết kế (NFR-to-Design Mapping)
|
|
402
394
|
|
|
403
|
-
| NFR
|
|
395
|
+
| Nhóm NFR | Yêu cầu PRD | Quyết định thiết kế |
|
|
404
396
|
|--------------|-----------------|-----------------|
|
|
405
|
-
| {
|
|
397
|
+
| {vd Cách ly multi-tenant} | {yêu cầu} | {cơ chế} |
|
|
406
398
|
|
|
407
399
|
---
|
|
408
400
|
|
|
409
|
-
## 10. UC Coverage
|
|
401
|
+
## 10. Độ phủ UC (UC Coverage)
|
|
410
402
|
|
|
411
|
-
<!--
|
|
412
|
-
|
|
413
|
-
- /generate-tech-docs
|
|
414
|
-
- /generate-code, /map-testids, /qc-*
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
⚠
|
|
419
|
-
|
|
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. -->
|
|
420
412
|
|
|
421
|
-
| UC | Feature | Platforms |
|
|
413
|
+
| UC | Feature | Platforms | Section phủ | Trạng thái |
|
|
422
414
|
|----|---------|-----------|------------------|--------|
|
|
423
415
|
| {TICKET-ID}-UC1 | {title} | {system, web, app} | §… | ✅ Covered |
|
|
424
416
|
|
|
425
|
-
###
|
|
417
|
+
### Độ phủ Scenario UC1
|
|
426
418
|
|
|
427
|
-
<!--
|
|
428
|
-
|
|
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. -->
|
|
429
421
|
|
|
430
422
|
| Platform | Scenario | Section | Business rule |
|
|
431
423
|
|----------|----------|---------|---------------|
|
|
432
|
-
| system | {UC}-SC1: {
|
|
433
|
-
| web | {UC}-SC1: {
|
|
424
|
+
| system | {UC}-SC1: {tên} | §5.A.1 | {BR…} |
|
|
425
|
+
| web | {UC}-SC1: {tên} | §4.5 (web), §5.B.1 | {BR…} |
|
|
434
426
|
|
|
435
|
-
<!--
|
|
427
|
+
<!-- Lặp một khối scenario-coverage cho mỗi UC. -->
|
|
436
428
|
|
|
437
429
|
---
|
|
438
430
|
|
|
439
|
-
## 11. Cross-cutting &
|
|
431
|
+
## 11. Cross-cutting & Giả định (Tham chiếu ngoài phạm vi)
|
|
440
432
|
|
|
441
|
-
<!--
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
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. -->
|
|
445
437
|
|
|
446
|
-
### 11.1 {
|
|
438
|
+
### 11.1 {Mối lo}
|
|
447
439
|
|
|
448
|
-
> {
|
|
440
|
+
> {Trích câu BDD/PRD đã scope nó ra ngoài.}
|
|
449
441
|
|
|
450
|
-
{
|
|
442
|
+
{Giải thích ranh giới + một sequence diagram tham chiếu nếu hữu ích.}
|
|
451
443
|
|
|
452
|
-
**
|
|
444
|
+
**Sở hữu bởi:** {team / module}. Xem {link}.
|
|
453
445
|
|
|
454
446
|
---
|
|
455
447
|
|
|
@@ -482,9 +474,9 @@ sequenceDiagram
|
|
|
482
474
|
|
|
483
475
|
---
|
|
484
476
|
|
|
485
|
-
## Figma Design References
|
|
477
|
+
## Tham chiếu Thiết kế Figma (Figma Design References)
|
|
486
478
|
|
|
487
|
-
<!-- @figma.url: {
|
|
479
|
+
<!-- @figma.url: {url figma cấp node cho mỗi màn hình} -->
|
|
488
480
|
- {Screen}: [Figma — {frame}]({url})
|
|
489
481
|
- Exported: {YYYY-MM-DD}
|
|
490
482
|
|
|
@@ -492,7 +484,7 @@ sequenceDiagram
|
|
|
492
484
|
|
|
493
485
|
## Changelog
|
|
494
486
|
|
|
495
|
-
| Revision |
|
|
487
|
+
| Revision | Ngày | Thay đổi |
|
|
496
488
|
|----------|------|---------|
|
|
497
|
-
| 1 | {YYYY-MM-DD} |
|
|
498
|
-
<!--
|
|
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}" -->
|