@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
|
@@ -64,7 +64,8 @@ Hiển thị và chờ phản hồi:
|
|
|
64
64
|
|
|
65
65
|
## Bước 1 — Xác định Target File
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
0. **Tách cờ trước khi resolve target.** `$ARGUMENTS` có thể lẫn các `--flag` (vd `--phase=integration`, `--comment`, `--fix`). **Loại bỏ mọi token bắt đầu bằng `--`** ra khỏi phần dùng để tìm target — chỉ giữ phần path/UC-ID/ticket. (Các flag đó do phần logic riêng của lệnh parse ở bước sau, KHÔNG phải tên file.)
|
|
68
|
+
1. Nếu `$ARGUMENTS` (đã tách cờ) được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
|
|
68
69
|
2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có path) → phân giải thành file bằng cách glob theo bố cục feature-package. `{prd-slug}` lúc này **chưa biết**, nên dùng wildcard `*` cho segment đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
|
|
69
70
|
- **Lệnh BDD** (target là `.feature`): `{specs_dir}/{domain}/*/bdd/**/{UC-ID}*.feature` — hoặc `{specs_dir}/*/*/bdd/**/{UC-ID}*.feature` nếu domain cũng chưa biết. Nếu lệnh ngụ ý một platform/scope cụ thể (vd: system tech-doc cần BDD `system/`), ưu tiên kết quả trong thư mục con platform đó.
|
|
70
71
|
- **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
|
|
@@ -150,6 +151,7 @@ Thực hiện các bước theo đúng thứ tự. Lưu mọi thứ vào bộ nh
|
|
|
150
151
|
- `paths.business_dictionary` → path tới business-dictionary.md
|
|
151
152
|
- `paths.core_entities` → path tới core-entities.md
|
|
152
153
|
- `paths.tech_docs_dir` → gốc tài liệu kỹ thuật (gộp với specs_dir trong bố cục feature-package — tech-docs nằm dưới `{specs_dir}/{domain}/{prd-slug}/tech-docs/`)
|
|
154
|
+
- `paths.src_dir` → gốc mã nguồn (nơi generate-code đặt & quét code; nguồn chính cho FE + phạm vi reuse-scan của DS5)
|
|
153
155
|
- `paths.trace_dir` → thư mục trạng thái trace; cấu trúc: `.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv` (mỗi UC × platform một sổ)
|
|
154
156
|
|
|
155
157
|
Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
@@ -162,6 +164,7 @@ Nếu không có section `paths`, dùng các giá trị mặc định:
|
|
|
162
164
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
163
165
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
164
166
|
- `tech_docs_dir` = `specs`
|
|
167
|
+
- `src_dir` = `src`
|
|
165
168
|
- `trace_dir` = `.trace`
|
|
166
169
|
|
|
167
170
|
Lưu ý: Trong bố cục feature-package, `specs_dir` là gốc thống nhất. Mọi loại spec artifact (PRD, BDD, tech-docs, design-spec) đều nằm dưới `{specs_dir}/{domain}/{prd-slug}/`. `prd-slug` là tên folder feature-package, không phải một biến config riêng.
|
|
@@ -606,308 +609,300 @@ Ghi/mở rộng `{output_path}` dùng template dưới đây, chỉ sinh **nội
|
|
|
606
609
|
|
|
607
610
|
<!--
|
|
608
611
|
════════════════════════════════════════════════════════════════════════════
|
|
609
|
-
TEMPLATE:
|
|
610
|
-
|
|
612
|
+
TEMPLATE: Tài liệu Thiết kế Kỹ thuật (per-PRD, full-stack, gộp)
|
|
613
|
+
Dùng bởi: /generate-tech-docs
|
|
611
614
|
════════════════════════════════════════════════════════════════════════════
|
|
612
615
|
|
|
613
|
-
|
|
614
|
-
-
|
|
615
|
-
|
|
616
|
-
(
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
- A section that does not apply to this PRD: keep the heading and write
|
|
637
|
-
"N/A — {reason}" rather than deleting it, so the shape stays predictable.
|
|
638
|
-
- Every sequence diagram / API / rule should be traceable back to a scenario:
|
|
639
|
-
reference the SC id (e.g. UC1-SC3) it serves.
|
|
616
|
+
MÔ HÌNH PHẠM VI
|
|
617
|
+
- 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
|
|
618
|
+
trong một thiết kế full-stack gộp: backend (API, mô hình dữ liệu, DB) VÀ client
|
|
619
|
+
(component, state, tích hợp API) đặt cạnh nhau, nối bằng sequence diagram xuyên
|
|
620
|
+
tầng. Đây là "bản vẽ thi công" mà bất kỳ dev nào mở ra để implement cả feature.
|
|
621
|
+
- ĐẦU VÀO là các file BDD của PRD (web/ · app/ · system/), KHÔNG phải văn xuôi PRD.
|
|
622
|
+
PRD chỉ nạp để lấy bối cảnh Overview/Goals/Actors.
|
|
623
|
+
|
|
624
|
+
TĂNG DẦN / APPEND
|
|
625
|
+
- 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
|
|
626
|
+
lại: thêm section + sequence diagram của UC mới, cập nhật ma trận Độ phủ UC (§10)
|
|
627
|
+
và Changelog. KHÔNG bao giờ đè nội dung có sẵn hay chỉnh tay.
|
|
628
|
+
|
|
629
|
+
QUY TẮC ĐIỀN
|
|
630
|
+
- Thay MỌI placeholder {…} bằng nội dung thật. Xoá các comment hướng dẫn.
|
|
631
|
+
- THUẬT NGỮ: tuân 100% từ điển dự án (specs/domain-knowledge/business-dictionary.md).
|
|
632
|
+
Giá trị status/enum → core-entities.md (Enum Registry). Entity → core-entities.md.
|
|
633
|
+
- Giữ code/DTO/DB mẫu theo idiom stack của dự án (xem stack-profile của module đang
|
|
634
|
+
dùng). Snippet C#/Angular bên dưới chỉ MANG TÍNH MINH HOẠ — thay bằng stack thật.
|
|
635
|
+
- Section không áp dụng cho PRD này: GIỮ heading và viết "N/A — {lý do}" thay vì
|
|
636
|
+
xoá, để cấu trúc luôn nhất quán, dễ đoán.
|
|
637
|
+
- Mọi sequence diagram / API / rule phải truy vết được về một scenario: tham chiếu
|
|
638
|
+
id SC (vd UC1-SC3) mà nó phục vụ.
|
|
640
639
|
-->
|
|
641
640
|
|
|
642
|
-
# {Feature Area} — {PRD Title}
|
|
641
|
+
# {Feature Area} — Tài liệu Thiết kế Kỹ thuật: {PRD Title}
|
|
643
642
|
|
|
644
|
-
<!-- @trace
|
|
643
|
+
<!-- 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. -->
|
|
645
644
|
---
|
|
646
645
|
@trace.id: {TICKET-ID}
|
|
647
646
|
@trace.domain: {domain}
|
|
648
647
|
@trace.prd: {TICKET-ID}
|
|
649
648
|
@trace.ucs: {TICKET-ID}-UC1, {TICKET-ID}-UC2{, …}
|
|
650
|
-
@trace.service: {service —
|
|
651
|
-
@trace.module: {module
|
|
652
|
-
@trace.platforms: {system | web | app —
|
|
653
|
-
@trace.bdd_version: {
|
|
649
|
+
@trace.service: {service — từ header BDD @trace.service}
|
|
650
|
+
@trace.module: {module liên quan — vd dotnet, angular}
|
|
651
|
+
@trace.platforms: {system | web | app — tuỳ thư mục BDD nào tồn tại}
|
|
652
|
+
@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ố.}
|
|
654
653
|
@trace.api_source: {existing | —}
|
|
655
654
|
@trace.revision: 1
|
|
656
655
|
@trace.status: draft
|
|
657
656
|
@trace.generated_at: {YYYY-MM-DD}
|
|
658
657
|
---
|
|
659
658
|
|
|
660
|
-
> **
|
|
659
|
+
> **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ó.
|
|
661
660
|
|
|
662
|
-
## 1. Overview
|
|
661
|
+
## 1. Tổng quan (Overview)
|
|
663
662
|
|
|
664
|
-
<!-- 2–4
|
|
665
|
-
|
|
666
|
-
|
|
663
|
+
<!-- 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,
|
|
664
|
+
side effect chính). Nêu rõ dữ liệu đến từ đâu (DB vs API ngoài) và thao tác ghi
|
|
665
|
+
chính. Nguồn: PRD + system BDD. -->
|
|
667
666
|
|
|
668
|
-
{
|
|
669
|
-
|
|
667
|
+
{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
|
|
668
|
+
sở hữu (DB) vs lấy live (API ngoài), và thao tác ghi chính.}
|
|
670
669
|
|
|
671
|
-
### Goals
|
|
670
|
+
### Mục tiêu (Goals)
|
|
672
671
|
|
|
673
|
-
<!--
|
|
674
|
-
|
|
672
|
+
<!-- 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
|
|
673
|
+
phải đảm bảo. -->
|
|
675
674
|
|
|
676
|
-
- {
|
|
677
|
-
- {
|
|
675
|
+
- {Mục tiêu 1}
|
|
676
|
+
- {Mục tiêu 2}
|
|
678
677
|
|
|
679
|
-
### Business Actors
|
|
678
|
+
### Tác nhân nghiệp vụ (Business Actors)
|
|
680
679
|
|
|
681
|
-
|
|
|
680
|
+
| Tác nhân | Mô tả | Kênh |
|
|
682
681
|
|-------|-------------|---------|
|
|
683
|
-
| {Actor} | {
|
|
682
|
+
| {Actor} | {vai trò & quyền} | {đường vào, vd App → Widget → Portal → API} |
|
|
684
683
|
|
|
685
684
|
---
|
|
686
685
|
|
|
687
|
-
## 2. Architecture Overview
|
|
686
|
+
## 2. Tổng quan Kiến trúc (Architecture Overview)
|
|
688
687
|
|
|
689
|
-
### 2.1 High-level Architecture
|
|
688
|
+
### 2.1 Kiến trúc tổng thể (High-level Architecture)
|
|
690
689
|
|
|
691
|
-
<!-- ASCII (
|
|
692
|
-
client → gateway → service(s) → data
|
|
693
|
-
|
|
694
|
-
project-context.yaml (services, stack). -->
|
|
690
|
+
<!-- ASCII (hoặc mermaid) topology thể hiện các hệ thống feature này chạm tới:
|
|
691
|
+
client → gateway → service(s) → data store / API ngoài. Chỉ giữ các component
|
|
692
|
+
mà PRD NÀY thực sự dùng. Nguồn: architecture.md / project-context.yaml (services, stack). -->
|
|
695
693
|
|
|
696
694
|
```
|
|
697
|
-
{ASCII
|
|
695
|
+
{Sơ đồ ASCII hoặc mermaid các component feature này chạm tới}
|
|
698
696
|
```
|
|
699
697
|
|
|
700
|
-
> **
|
|
698
|
+
> **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ó.}
|
|
701
699
|
|
|
702
|
-
### 2.2 Communication Patterns
|
|
700
|
+
### 2.2 Mẫu giao tiếp (Communication Patterns)
|
|
703
701
|
|
|
704
|
-
|
|
|
702
|
+
| Mẫu | Dùng cho | Phạm vi (UC/SC) |
|
|
705
703
|
|---------|-------|---------------|
|
|
706
704
|
| {Client → Gateway → API} | {auth / action} | {UC1} |
|
|
707
|
-
| {API →
|
|
705
|
+
| {API → API ngoài} | {lấy gì, cache TTL} | {UC1-SC…} |
|
|
708
706
|
|
|
709
707
|
---
|
|
710
708
|
|
|
711
|
-
## 3. Data Model
|
|
709
|
+
## 3. Mô hình Dữ liệu (Data Model)
|
|
712
710
|
|
|
713
|
-
<!--
|
|
714
|
-
|
|
715
|
-
|
|
711
|
+
<!-- Nguồn: core-entities.md (entity sở hữu) + mệnh đề Then của BDD (state) + PRD.
|
|
712
|
+
Phân biệt entity SỞ HỮU (trong DB) với model NGUỒN-API (lấy live, không lưu).
|
|
713
|
+
Chỉ liệt kê field mà PRD này đọc hoặc ghi. -->
|
|
716
714
|
|
|
717
|
-
### 3.1 Entity Design
|
|
715
|
+
### 3.1 Thiết kế Entity (Entity Design)
|
|
718
716
|
|
|
719
|
-
#### {EntityName} ({DB entity | API
|
|
717
|
+
#### {EntityName} ({DB entity | POCO nguồn-API})
|
|
720
718
|
|
|
721
|
-
{
|
|
719
|
+
{Một dòng: nó biểu diễn gì, và được lưu hay lấy live.}
|
|
722
720
|
|
|
723
|
-
| Field |
|
|
721
|
+
| Field | Kiểu | Dùng trong {TICKET-ID} |
|
|
724
722
|
|-------|------|----------------------|
|
|
725
|
-
| `{field}` | `{type}` | {
|
|
723
|
+
| `{field}` | `{type}` | {feature này dùng thế nào — đọc/ghi, SC nào} |
|
|
726
724
|
|
|
727
|
-
<!--
|
|
728
|
-
|
|
725
|
+
<!-- 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ơ đồ
|
|
726
|
+
state nhỏ như dưới. -->
|
|
729
727
|
|
|
730
|
-
**
|
|
728
|
+
**Chuyển trạng thái (nếu có):**
|
|
731
729
|
|
|
732
730
|
```
|
|
733
|
-
{state A}: {
|
|
734
|
-
{state B}: {
|
|
731
|
+
{state A}: {điều kiện} → {kết quả / tín hiệu UI}
|
|
732
|
+
{state B}: {điều kiện} → {kết quả}
|
|
735
733
|
```
|
|
736
734
|
|
|
737
|
-
**
|
|
738
|
-
- {invariant
|
|
735
|
+
**Ràng buộc:**
|
|
736
|
+
- {invariant enforce ở tầng application/DB, vd đúng một primary cho mỗi tenant}
|
|
739
737
|
|
|
740
|
-
### 3.2 Entity Relationships
|
|
738
|
+
### 3.2 Quan hệ Entity (Entity Relationships)
|
|
741
739
|
|
|
742
740
|
```
|
|
743
|
-
{
|
|
741
|
+
{sơ đồ quan hệ — cardinality, khoá join, field nào read-only vs sở hữu}
|
|
744
742
|
```
|
|
745
743
|
|
|
746
|
-
### 3.3 Data Source Boundaries
|
|
744
|
+
### 3.3 Ranh giới Nguồn dữ liệu (Data Source Boundaries)
|
|
747
745
|
|
|
748
|
-
<!--
|
|
749
|
-
|
|
746
|
+
<!-- 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.
|
|
747
|
+
Chống lem phạm vi. -->
|
|
750
748
|
|
|
751
|
-
**{TICKET-ID}
|
|
749
|
+
**Phạm vi {TICKET-ID}: {ĐỌC … / GHI …}.**
|
|
752
750
|
|
|
753
|
-
|
|
|
751
|
+
| Trách nhiệm | Trong phạm vi? | Do ai xử lý |
|
|
754
752
|
|----------------|-----------|-----------|
|
|
755
|
-
| {
|
|
756
|
-
| {
|
|
757
|
-
| {
|
|
758
|
-
| {
|
|
753
|
+
| {đọc list đã gộp} | ✅ Có | {endpoint / service} |
|
|
754
|
+
| {ghi cờ X} | ✅ Có | {service} |
|
|
755
|
+
| {dữ liệu gốc} | ❌ Read-only | {API ngoài + cache} |
|
|
756
|
+
| {mối lo module khác} | ❌ Không | {module/team} |
|
|
759
757
|
|
|
760
758
|
### 3.4 Multi-tenant & Sharding
|
|
761
759
|
|
|
762
|
-
<!--
|
|
760
|
+
<!-- Chỉ khi dự án multi-tenant. Nếu không, viết "N/A — single tenant". -->
|
|
763
761
|
|
|
764
|
-
- {tenant
|
|
762
|
+
- {khoá tenant trên entity, cách ly bằng query-filter, phân giải shard — từ architecture.md}
|
|
765
763
|
|
|
766
764
|
---
|
|
767
765
|
|
|
768
|
-
## 4. API Contracts
|
|
766
|
+
## 4. Hợp đồng API (API Contracts)
|
|
769
767
|
|
|
770
|
-
<!--
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
CLIENT
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
methods to whatever §4.1 lists (or none). -->
|
|
768
|
+
<!-- Contract backend. Greenfield: thiết kế endpoint từ scenario BDD. Brownfield
|
|
769
|
+
(@trace.api_source = existing): reverse-document API đang chạy as-is và ghi chú
|
|
770
|
+
gap so với kỳ vọng BDD. Đánh dấu REUSE vs NEW rõ ràng.
|
|
771
|
+
PRD CHỈ-CLIENT (không có BDD system/ — feature này không sở hữu backend): ĐỪNG
|
|
772
|
+
bịa contract BE. §4.1 khi đó liệt kê các endpoint mà client TIÊU THỤ (ngoài /
|
|
773
|
+
bên thứ ba / của team khác / có sẵn), đánh dấu "consumed (external)",
|
|
774
|
+
reverse-document từ mệnh đề Then của BDD client + PRD; chỉ điền §4.2/§4.3 nếu
|
|
775
|
+
biết shape. Nếu feature không gọi mạng gì cả → viết "N/A — client-only, no backend".
|
|
776
|
+
§4.5.4 ánh xạ method client tới bất cứ gì §4.1 liệt kê (hoặc không có). -->
|
|
780
777
|
|
|
781
778
|
|
|
782
779
|
### 4.1 Endpoints
|
|
783
780
|
|
|
784
781
|
```
|
|
785
|
-
{METHOD} {/path} # NEW | REUSE ({
|
|
782
|
+
{METHOD} {/path} # NEW | REUSE ({nguồn}) — {mục đích một dòng}
|
|
786
783
|
```
|
|
787
784
|
|
|
788
|
-
### 4.2 Request/Response Models
|
|
785
|
+
### 4.2 Model Request/Response (Request/Response Models)
|
|
789
786
|
|
|
790
|
-
<!--
|
|
791
|
-
external API. -->
|
|
787
|
+
<!-- Thể hiện shape DTO theo idiom của stack. Ghi rõ field nào đến từ DB vs API ngoài. -->
|
|
792
788
|
|
|
793
789
|
```{lang}
|
|
794
|
-
{DTO
|
|
790
|
+
{định nghĩa DTO kèm comment nguồn từng field}
|
|
795
791
|
```
|
|
796
792
|
|
|
797
|
-
### 4.3 Validation & Error Codes
|
|
793
|
+
### 4.3 Validation & Mã lỗi (Validation & Error Codes)
|
|
798
794
|
|
|
799
|
-
**
|
|
795
|
+
**Quy tắc validation:**
|
|
800
796
|
|
|
801
797
|
```{lang}
|
|
802
|
-
{validation
|
|
798
|
+
{quy tắc validation, theo idiom stack (vd FluentValidation / class-validator)}
|
|
803
799
|
```
|
|
804
800
|
|
|
805
|
-
| Code | HTTP Status |
|
|
801
|
+
| Code | HTTP Status | Mô tả | Trace |
|
|
806
802
|
|------|-------------|-------------|-------|
|
|
807
|
-
| `{ERROR_CODE}` | {4xx/5xx} | {
|
|
803
|
+
| `{ERROR_CODE}` | {4xx/5xx} | {khi nào phát sinh} | {UC1-SC…} |
|
|
808
804
|
|
|
809
|
-
### 4.4 Handler
|
|
805
|
+
### 4.4 Logic Handler (endpoint chính)
|
|
810
806
|
|
|
811
|
-
<!--
|
|
812
|
-
transaction → commit/rollback → return).
|
|
813
|
-
the code aligned. -->
|
|
807
|
+
<!-- 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 →
|
|
808
|
+
transaction → commit/rollback → return). Giữ sequence diagram và code khớp nhau. -->
|
|
814
809
|
|
|
815
810
|
**{HandlerName}:**
|
|
816
|
-
1. {
|
|
817
|
-
2. {
|
|
811
|
+
1. {bước}
|
|
812
|
+
2. {bước — ranh giới transaction nếu có}
|
|
818
813
|
|
|
819
|
-
### 4.5 UI Component Mapping — {platform} ({framework})
|
|
814
|
+
### 4.5 Ánh xạ Component UI (UI Component Mapping) — {platform} ({framework})
|
|
820
815
|
|
|
821
|
-
<!-- CLIENT
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
• §4.5.1 Component
|
|
826
|
-
"#### 4.5.1.x {Screen} — {UC}".
|
|
827
|
-
|
|
828
|
-
• §4.5.2–§4.5.5 —
|
|
829
|
-
• §4.5.6 Test Selectors —
|
|
830
|
-
"
|
|
831
|
-
Append:
|
|
832
|
-
|
|
833
|
-
|
|
816
|
+
<!-- Thiết kế CLIENT, NHÓM THEO PLATFORM: một section "### 4.5 … — {platform}" cho mỗi
|
|
817
|
+
platform client có trong BDD (một nhóm web, một nhóm app). ĐỪNG đặt tên heading
|
|
818
|
+
này theo màn hình — màn hình/UC nằm ở các sub-block bên dưới.
|
|
819
|
+
Bên trong một nhóm platform:
|
|
820
|
+
• §4.5.1 Cây Component — lặp sub-block theo màn hình/UC:
|
|
821
|
+
"#### 4.5.1.x {Screen} — {UC}". Một PRD nhiều màn hình/UC → nhiều sub-block
|
|
822
|
+
trong CÙNG nhóm platform (không bao giờ tạo nhóm 4.5 thứ hai cho cùng platform).
|
|
823
|
+
• §4.5.2–§4.5.5 — tương tự theo màn hình/UC ở chỗ chúng khác nhau.
|
|
824
|
+
• §4.5.6 Test Selectors — MỘT bảng dùng chung cho cả nhóm platform; cột
|
|
825
|
+
"Phục vụ SC" mang (UC · SC) để consumer per-UC lọc row của mình.
|
|
826
|
+
Append: platform mới → nhóm "### 4.5 — {platform}" mới; màn hình/UC mới trong
|
|
827
|
+
platform đã có → thêm sub-block + row vào §4.5.6 (đừng lặp nhóm).
|
|
828
|
+
Bỏ hẳn §4.5 với PRD backend-only. -->
|
|
834
829
|
|
|
835
|
-
> **
|
|
836
|
-
> **Stack:** {framework, state primitive, component
|
|
837
|
-
> <!-- @figma.url: {
|
|
830
|
+
> **Nguồn:** {file Figma + node id, từ design-spec}
|
|
831
|
+
> **Stack:** {framework, state primitive, thư viện component}
|
|
832
|
+
> <!-- @figma.url: {url figma cấp node} -->
|
|
838
833
|
|
|
839
|
-
#### 4.5.1 Component Hierarchy — {Screen} ({UC})
|
|
834
|
+
#### 4.5.1 Cây Component (Component Hierarchy) — {Screen} ({UC})
|
|
840
835
|
|
|
841
|
-
<!--
|
|
836
|
+
<!-- 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 …). -->
|
|
842
837
|
|
|
843
838
|
```
|
|
844
|
-
{component
|
|
839
|
+
{cây component — container vs presentational, con có điều kiện}
|
|
845
840
|
```
|
|
846
841
|
|
|
847
|
-
#### 4.5.2 Component File Mapping
|
|
842
|
+
#### 4.5.2 Ánh xạ file Component (Component File Mapping)
|
|
848
843
|
|
|
849
|
-
| Component | Path |
|
|
844
|
+
| Component | Path | Loại | Trách nhiệm |
|
|
850
845
|
|-----------|------|------|---------|
|
|
851
|
-
| `{Component}` | `{path}` | {Feature/Child} | {
|
|
846
|
+
| `{Component}` | `{path}` | {Feature/Child} | {trách nhiệm} |
|
|
852
847
|
|
|
853
|
-
#### 4.5.3 State Management ({state primitive})
|
|
848
|
+
#### 4.5.3 Quản lý State (State Management) ({state primitive})
|
|
854
849
|
|
|
855
|
-
<!--
|
|
856
|
-
|
|
850
|
+
<!-- Shape state suy từ mệnh đề Then của System BDD + shape response từ §4.2.
|
|
851
|
+
Thể hiện giá trị dẫn xuất/tính toán và input của chúng. -->
|
|
857
852
|
|
|
858
853
|
```{lang}
|
|
859
|
-
{state
|
|
854
|
+
{khai báo state kèm comment nguồn (mỗi cái map tới field BDD / field BE nào)}
|
|
860
855
|
```
|
|
861
856
|
|
|
862
|
-
#### 4.5.4 API Integration Layer
|
|
857
|
+
#### 4.5.4 Tầng tích hợp API (API Integration Layer — port/adapter)
|
|
863
858
|
|
|
864
|
-
<!--
|
|
865
|
-
|
|
866
|
-
|
|
859
|
+
<!-- Cấu hình modal/route + bản đồ tích hợp API: mỗi method service client → một
|
|
860
|
+
endpoint THẬT từ §4.1 (đừng bịa endpoint). Lỗi → state UI theo từng SC.
|
|
861
|
+
Bảng này là thứ /generate-code --phase=integration đọc để wire adapter thật. -->
|
|
867
862
|
|
|
868
|
-
|
|
|
863
|
+
| Method client | Endpoint (§4.1) | Map request | Response → model | Lỗi → UI |
|
|
869
864
|
|---------------|-----------------|-------------|------------------|-----------|
|
|
870
865
|
| {svc.getX()} | {GET /…} | {params} | {DTO → ViewModel} | {4xx → state/toast} |
|
|
871
866
|
|
|
872
|
-
#### 4.5.5 Figma → Design System
|
|
867
|
+
#### 4.5.5 Ánh xạ Figma → Design System
|
|
873
868
|
|
|
874
|
-
| Figma
|
|
869
|
+
| Element Figma | Class/token design system | Ghi chú |
|
|
875
870
|
|---------------|---------------------------|-------|
|
|
876
|
-
| {element} | {class / token} | {size,
|
|
871
|
+
| {element} | {class / token} | {size, màu, state} |
|
|
877
872
|
|
|
878
|
-
#### 4.5.6 Test Selectors — element
|
|
873
|
+
#### 4.5.6 Test Selectors — id element cho phần tử có action (hợp đồng QC)
|
|
879
874
|
|
|
880
|
-
<!--
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
875
|
+
<!-- Test-id ổn định cho mỗi element tương tác để QC định vị trực tiếp (không scan
|
|
876
|
+
runtime). Quy ước: {uc-lower}-{screen}-{element}-{type}; ĐỪNG nhúng số scenario.
|
|
877
|
+
Attribute theo platform: web data-testid · RN testID · Flutter Key/Semantics ·
|
|
878
|
+
iOS accessibilityIdentifier. Dùng lại CÙNG giá trị id trên web/app cho cùng một
|
|
879
|
+
element logic.
|
|
880
|
+
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).
|
|
881
|
+
Cột "Phục vụ SC" mang (UC · SC) để consumer per-UC (generate-code / qc) lọc row
|
|
882
|
+
của mình qua §10. Nhóm §4.5 này vốn đã theo platform, nên platform là ngầm định
|
|
883
|
+
(khối web → web · SC). -->
|
|
889
884
|
|
|
890
|
-
| Test-ID | Element | Component (§4.5.1.x) | Action |
|
|
885
|
+
| Test-ID | Element | Component (§4.5.1.x) | Action | Phục vụ SC (UC · SC) |
|
|
891
886
|
|---------|---------|----------------------|--------|---------------------|
|
|
892
|
-
| `{uc}-{screen}-{element}-{type}` | {
|
|
887
|
+
| `{uc}-{screen}-{element}-{type}` | {Nút submit} | {Component} | {submit} | {UC1 · SC1, UC1 · SC3} |
|
|
893
888
|
|
|
894
889
|
---
|
|
895
890
|
|
|
896
|
-
## 5. Key Flows
|
|
891
|
+
## 5. Luồng chính (Key Flows — Sequence Diagrams)
|
|
897
892
|
|
|
898
|
-
<!--
|
|
899
|
-
client
|
|
900
|
-
⚠ SC
|
|
901
|
-
`{UC}-SC1`
|
|
902
|
-
(5.A system · 5.B web · 5.C app)
|
|
903
|
-
|
|
904
|
-
|
|
893
|
+
<!-- MỘT mermaid sequence diagram cho mỗi scenario đáng kể. Participant xuyên tầng:
|
|
894
|
+
component client → service → API → API ngoài → DB.
|
|
895
|
+
⚠ id SC chỉ duy nhất trong phạm vi (UC × platform): `{UC}-SC1` ở `system` và
|
|
896
|
+
`{UC}-SC1` ở `web` là HAI scenario KHÁC nhau. Nên gom luồng vào các LANE PLATFORM
|
|
897
|
+
(5.A system · 5.B web · 5.C app) và LUÔN ghi kèm platform với SC, vd
|
|
898
|
+
"(web · UC1-SC1)". Đừng bao giờ viết "UC1-SC1" trơ ở đây — mơ hồ.
|
|
899
|
+
Chỉ đưa các lane có BDD tồn tại trong PRD này. -->
|
|
905
900
|
|
|
906
|
-
### 5.A System
|
|
901
|
+
### 5.A Luồng System
|
|
907
902
|
|
|
908
|
-
<!--
|
|
903
|
+
<!-- Một diagram cho mỗi scenario system-BDD. Bỏ lane này nếu không có BDD system/. -->
|
|
909
904
|
|
|
910
|
-
#### 5.A.1 {
|
|
905
|
+
#### 5.A.1 {tên} (system · {UC}-SC…)
|
|
911
906
|
|
|
912
907
|
```mermaid
|
|
913
908
|
sequenceDiagram
|
|
@@ -915,147 +910,147 @@ sequenceDiagram
|
|
|
915
910
|
{…}
|
|
916
911
|
```
|
|
917
912
|
|
|
918
|
-
### 5.B Web
|
|
913
|
+
### 5.B Luồng Web
|
|
919
914
|
|
|
920
|
-
<!--
|
|
915
|
+
<!-- Một diagram cho mỗi scenario web-BDD. Bỏ lane này nếu không có BDD web/. -->
|
|
921
916
|
|
|
922
|
-
#### 5.B.1 {
|
|
917
|
+
#### 5.B.1 {tên} (web · {UC}-SC…)
|
|
923
918
|
|
|
924
919
|
```mermaid
|
|
925
920
|
sequenceDiagram
|
|
926
921
|
{…}
|
|
927
922
|
```
|
|
928
923
|
|
|
929
|
-
### 5.C App
|
|
924
|
+
### 5.C Luồng App
|
|
930
925
|
|
|
931
|
-
<!--
|
|
926
|
+
<!-- Một diagram cho mỗi scenario app-BDD. Bỏ lane này nếu không có BDD app/. -->
|
|
932
927
|
|
|
933
|
-
#### 5.C.1 {
|
|
928
|
+
#### 5.C.1 {tên} (app · {UC}-SC…)
|
|
934
929
|
|
|
935
930
|
```mermaid
|
|
936
931
|
sequenceDiagram
|
|
937
932
|
{…}
|
|
938
933
|
```
|
|
939
934
|
|
|
940
|
-
<!--
|
|
941
|
-
|
|
935
|
+
<!-- Đánh số trong từng lane: 5.A.1, 5.A.2 … / 5.B.1 … / 5.C.1 …. Với scenario mà
|
|
936
|
+
hiệu ứng lấn sang module khác, ghi "(covered by {OTHER-UC})". -->
|
|
942
937
|
|
|
943
|
-
|
|
938
|
+
**Điểm tích hợp chính (bảng tuỳ chọn cho mỗi luồng):**
|
|
944
939
|
|
|
945
|
-
|
|
|
940
|
+
| Bước | Chuyển trạng thái | Verify bởi (platform · SC) |
|
|
946
941
|
|------|------------------|-----------------------------|
|
|
947
|
-
| {
|
|
942
|
+
| {bước} | {trước → sau} | {web · UC1-SC…} |
|
|
948
943
|
|
|
949
944
|
---
|
|
950
945
|
|
|
951
|
-
## 6. Integration Points
|
|
946
|
+
## 6. Điểm tích hợp (Integration Points)
|
|
952
947
|
|
|
953
|
-
|
|
|
948
|
+
| Tích hợp | Chiều | Phương thức | Mô tả |
|
|
954
949
|
|-------------|-----------|--------|-------------|
|
|
955
|
-
| {Client → API} | Outbound (client) | {REST/Bearer} | {
|
|
956
|
-
| {API →
|
|
950
|
+
| {Client → API} | Outbound (client) | {REST/Bearer} | {gì} |
|
|
951
|
+
| {API → Ngoài} | Outbound (server) | {REST + header} | {gì, cache TTL} |
|
|
957
952
|
|
|
958
953
|
### 6.1 Event Bus / Messaging
|
|
959
954
|
|
|
960
|
-
<!-- Kafka/queue
|
|
955
|
+
<!-- Event Kafka/queue mà feature này produce/consume. "N/A — no events" nếu không có. -->
|
|
961
956
|
|
|
962
|
-
{events,
|
|
957
|
+
{events, hoặc N/A}
|
|
963
958
|
|
|
964
|
-
### 6.2 Cross-Service Dependencies
|
|
959
|
+
### 6.2 Phụ thuộc Cross-Service (Cross-Service Dependencies)
|
|
965
960
|
|
|
966
|
-
|
|
|
961
|
+
| Service phụ thuộc | Cần gì | Contract | Trạng thái |
|
|
967
962
|
|-------------------|---------------|----------|--------|
|
|
968
|
-
| {service} | {
|
|
963
|
+
| {service} | {cần} | {endpoint} | {✅ Có / ⚠️ pending} |
|
|
969
964
|
|
|
970
965
|
---
|
|
971
966
|
|
|
972
|
-
## 7. Security & Authorization
|
|
967
|
+
## 7. Bảo mật & Phân quyền (Security & Authorization)
|
|
973
968
|
|
|
974
|
-
### 7.1 Authentication
|
|
969
|
+
### 7.1 Xác thực (Authentication)
|
|
975
970
|
|
|
976
|
-
{
|
|
971
|
+
{Luồng auth + loại token/TTL. Nguồn: auth PRD + rule dự án.}
|
|
977
972
|
|
|
978
|
-
### 7.2 Authorization Rules
|
|
973
|
+
### 7.2 Quy tắc Phân quyền (Authorization Rules)
|
|
979
974
|
|
|
980
|
-
| Action |
|
|
975
|
+
| Action | Role/quyền yêu cầu | Mô tả | Trace |
|
|
981
976
|
|--------|--------------------------|-------------|-------|
|
|
982
|
-
| {action} | {role} | {
|
|
977
|
+
| {action} | {role} | {enforce thế nào, ở đâu} | {UC1-SC… / ngoài phạm vi} |
|
|
983
978
|
|
|
984
979
|
---
|
|
985
980
|
|
|
986
|
-
## 8. Error Handling & Edge Cases
|
|
981
|
+
## 8. Xử lý lỗi & Trường hợp biên (Error Handling & Edge Cases)
|
|
987
982
|
|
|
988
|
-
<!--
|
|
989
|
-
|
|
983
|
+
<!-- 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
|
|
984
|
+
và các sequence diagram lỗi §5. -->
|
|
990
985
|
|
|
991
|
-
| Scenario |
|
|
986
|
+
| Scenario | Chiến lược | Chi tiết | Trace |
|
|
992
987
|
|----------|----------|---------|-------|
|
|
993
|
-
| {
|
|
988
|
+
| {điều kiện} | {cách xử lý} | {hành vi, message, side effect} | {UC1-SC…, BR…} |
|
|
994
989
|
|
|
995
990
|
---
|
|
996
991
|
|
|
997
|
-
## 9. Design Decisions
|
|
992
|
+
## 9. Quyết định Thiết kế (Design Decisions)
|
|
998
993
|
|
|
999
|
-
<!--
|
|
1000
|
-
|
|
1001
|
-
|
|
994
|
+
<!-- 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.
|
|
995
|
+
Nguồn: alternatives/assumptions của PRD + lập luận lúc sinh. Đây là thứ giúp
|
|
996
|
+
reviewer tin tưởng thiết kế. -->
|
|
1002
997
|
|
|
1003
|
-
| # |
|
|
998
|
+
| # | Quyết định | Lý do | Phương án đã cân nhắc |
|
|
1004
999
|
|---|----------|-----------|-------------------------|
|
|
1005
|
-
| 1 | **{
|
|
1000
|
+
| 1 | **{quyết định}** | {vì sao} | {phương án — vì sao loại} |
|
|
1006
1001
|
|
|
1007
|
-
### NFR-to-Design Mapping
|
|
1002
|
+
### Ánh xạ NFR → Thiết kế (NFR-to-Design Mapping)
|
|
1008
1003
|
|
|
1009
|
-
| NFR
|
|
1004
|
+
| Nhóm NFR | Yêu cầu PRD | Quyết định thiết kế |
|
|
1010
1005
|
|--------------|-----------------|-----------------|
|
|
1011
|
-
| {
|
|
1006
|
+
| {vd Cách ly multi-tenant} | {yêu cầu} | {cơ chế} |
|
|
1012
1007
|
|
|
1013
1008
|
---
|
|
1014
1009
|
|
|
1015
|
-
## 10. UC Coverage
|
|
1010
|
+
## 10. Độ phủ UC (UC Coverage)
|
|
1016
1011
|
|
|
1017
|
-
<!--
|
|
1018
|
-
|
|
1019
|
-
- /generate-tech-docs
|
|
1020
|
-
- /generate-code, /map-testids, /qc-*
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
⚠
|
|
1025
|
-
|
|
1012
|
+
<!-- ĐIỂM NEO ĐỂ APPEND **và là MỤC LỤC cho consumer per-UC**. Mọi UC của PRD có một
|
|
1013
|
+
row; mọi scenario map tới (các) section thiết kế nó.
|
|
1014
|
+
- /generate-tech-docs dùng nó để phát hiện cái gì đã phủ vs còn thiếu.
|
|
1015
|
+
- /generate-code, /map-testids, /qc-* làm việc trên MỘT UC của doc cấp-PRD — chúng
|
|
1016
|
+
tra UC này Ở ĐÂY trước để định vị scenario của nó → các section/lane-§5 (và do đó
|
|
1017
|
+
các endpoint §4.1 mà luồng §5 của nó gọi) thuộc về nó. Đừng lấy
|
|
1018
|
+
endpoint/section của UC khác.
|
|
1019
|
+
⚠ Độ phủ scenario khoá theo (platform, SC) vì id SC lặp giữa các platform —
|
|
1020
|
+
cột Platform để phân biệt. -->
|
|
1026
1021
|
|
|
1027
|
-
| UC | Feature | Platforms |
|
|
1022
|
+
| UC | Feature | Platforms | Section phủ | Trạng thái |
|
|
1028
1023
|
|----|---------|-----------|------------------|--------|
|
|
1029
1024
|
| {TICKET-ID}-UC1 | {title} | {system, web, app} | §… | ✅ Covered |
|
|
1030
1025
|
|
|
1031
|
-
###
|
|
1026
|
+
### Độ phủ Scenario UC1
|
|
1032
1027
|
|
|
1033
|
-
<!--
|
|
1034
|
-
|
|
1028
|
+
<!-- Một row cho mỗi (platform, SC). Cùng số SC ở platform khác nhau = scenario khác
|
|
1029
|
+
nhau → row riêng. -->
|
|
1035
1030
|
|
|
1036
1031
|
| Platform | Scenario | Section | Business rule |
|
|
1037
1032
|
|----------|----------|---------|---------------|
|
|
1038
|
-
| system | {UC}-SC1: {
|
|
1039
|
-
| web | {UC}-SC1: {
|
|
1033
|
+
| system | {UC}-SC1: {tên} | §5.A.1 | {BR…} |
|
|
1034
|
+
| web | {UC}-SC1: {tên} | §4.5 (web), §5.B.1 | {BR…} |
|
|
1040
1035
|
|
|
1041
|
-
<!--
|
|
1036
|
+
<!-- Lặp một khối scenario-coverage cho mỗi UC. -->
|
|
1042
1037
|
|
|
1043
1038
|
---
|
|
1044
1039
|
|
|
1045
|
-
## 11. Cross-cutting &
|
|
1040
|
+
## 11. Cross-cutting & Giả định (Tham chiếu ngoài phạm vi)
|
|
1046
1041
|
|
|
1047
|
-
<!--
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1042
|
+
<!-- Các mối lo upstream mà PRD này PHỤ THUỘC VÀO nhưng không implement (cổng admin,
|
|
1043
|
+
UI downstream ở module khác, snapshot đơn hàng…). Giữ để có bối cảnh liên team.
|
|
1044
|
+
Tham chiếu UC/team sở hữu + doc. Nguồn: out-of-scope của PRD + ghi chú BR
|
|
1045
|
+
"out of scope" trong BDD. -->
|
|
1051
1046
|
|
|
1052
|
-
### 11.1 {
|
|
1047
|
+
### 11.1 {Mối lo}
|
|
1053
1048
|
|
|
1054
|
-
> {
|
|
1049
|
+
> {Trích câu BDD/PRD đã scope nó ra ngoài.}
|
|
1055
1050
|
|
|
1056
|
-
{
|
|
1051
|
+
{Giải thích ranh giới + một sequence diagram tham chiếu nếu hữu ích.}
|
|
1057
1052
|
|
|
1058
|
-
**
|
|
1053
|
+
**Sở hữu bởi:** {team / module}. Xem {link}.
|
|
1059
1054
|
|
|
1060
1055
|
---
|
|
1061
1056
|
|
|
@@ -1088,9 +1083,9 @@ sequenceDiagram
|
|
|
1088
1083
|
|
|
1089
1084
|
---
|
|
1090
1085
|
|
|
1091
|
-
## Figma Design References
|
|
1086
|
+
## Tham chiếu Thiết kế Figma (Figma Design References)
|
|
1092
1087
|
|
|
1093
|
-
<!-- @figma.url: {
|
|
1088
|
+
<!-- @figma.url: {url figma cấp node cho mỗi màn hình} -->
|
|
1094
1089
|
- {Screen}: [Figma — {frame}]({url})
|
|
1095
1090
|
- Exported: {YYYY-MM-DD}
|
|
1096
1091
|
|
|
@@ -1098,10 +1093,10 @@ sequenceDiagram
|
|
|
1098
1093
|
|
|
1099
1094
|
## Changelog
|
|
1100
1095
|
|
|
1101
|
-
| Revision |
|
|
1096
|
+
| Revision | Ngày | Thay đổi |
|
|
1102
1097
|
|----------|------|---------|
|
|
1103
|
-
| 1 | {YYYY-MM-DD} |
|
|
1104
|
-
<!--
|
|
1098
|
+
| 1 | {YYYY-MM-DD} | Sinh lần đầu từ BDD {TICKET-ID} (v{bdd_version}): {liệt kê UC đã phủ} |
|
|
1099
|
+
<!-- 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}" -->
|
|
1105
1100
|
|
|
1106
1101
|
|
|
1107
1102
|
---
|
|
@@ -1119,6 +1114,8 @@ Trước khi finalize/append doc, **tự phản biện bản nháp** qua 4 cổn
|
|
|
1119
1114
|
**Cổng 2 — GAP-or-FLAG (trung thực, không bịa).**
|
|
1120
1115
|
Cần một type/giá trị/policy (auth, config, event, error code) mà **không có nguồn** → **không** chép hình dạng ở boundary, **không** bịa: ghi `[GAP]` hoặc `[ASSUMPTION: {owner} confirm]`. Nếu doc định thiết kế endpoint/flow mà **BDD không định nghĩa nghiệp vụ** (design vượt BDD) → khai GAP + escalate, đừng âm thầm hợp thức hoá.
|
|
1121
1116
|
|
|
1117
|
+
**Cổng 2b — Client integration (§4.5.4) cũng phải đủ, không chỉ contract BE.** Với MỖI client method mà một màn hình/UC cần, §4.5.4 phải map đủ: **endpoint thật ở §4.1 · nguồn field request/response · error→UI**. Bất kỳ mảnh nào không suy được từ nguồn → khai `[GAP]` + một dòng §12 (đừng để §4.5.4 khuyết một phần rồi lọt xuống `/generate-code --phase=integration` — đó chính là chỗ FE bị hỏi live). **Severity blocker (🔴)** nếu màn hình không render/hoạt động được khi thiếu mapping đó (→ giữ `@trace.status: in-review`, chặn code-gen tới khi đóng); non-blocker (🟢) nếu chỉ là chi tiết phụ đoán tạm được. Đối xứng với contract BE: front-load ẩn số client về tech-docs, đừng đẩy sang lúc wire adapter.
|
|
1118
|
+
|
|
1122
1119
|
**Cổng 3 — CATALOG (không hard-code).**
|
|
1123
1120
|
Literal & constant rải rác như luật → gom lại: **generic envelope** (đừng typed-per-thing khi PRD-BR đã đưa hợp đồng chung) + bảng catalog (vd `signal_type × source`) + constants **đặt tên**. Fail nếu còn hằng số/enum inline chưa vào catalog.
|
|
1124
1121
|
|