@edupia-tutor/spec-driven-docs 0.14.0 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commands/debug.md +435 -435
- package/commands/debug.tmpl +111 -111
- package/commands/define-product.md +330 -327
- package/commands/define-product.tmpl +50 -47
- package/commands/dev-gen-test.md +364 -364
- package/commands/dev-gen-test.tmpl +63 -63
- package/commands/dev-run-test.md +375 -375
- package/commands/dev-run-test.tmpl +74 -74
- package/commands/dev-smoke-test.md +340 -340
- package/commands/dev-smoke-test.tmpl +60 -60
- package/commands/fix-bug.md +402 -402
- package/commands/fix-bug.tmpl +78 -78
- package/commands/generate-bdd.md +512 -512
- package/commands/generate-bdd.tmpl +211 -211
- package/commands/generate-code.md +480 -482
- package/commands/generate-code.tmpl +179 -181
- package/commands/generate-design-spec.md +495 -495
- package/commands/generate-design-spec.tmpl +219 -219
- package/commands/generate-prd.md +445 -396
- package/commands/generate-prd.tmpl +45 -198
- package/commands/generate-spec-manifest.md +337 -337
- package/commands/generate-spec-manifest.tmpl +57 -57
- package/commands/generate-tech-docs.md +364 -364
- package/commands/generate-tech-docs.tmpl +84 -84
- package/commands/learn.md +346 -346
- package/commands/learn.tmpl +22 -22
- package/commands/map-testids.md +321 -321
- package/commands/map-testids.tmpl +41 -41
- package/commands/propose-scenario.md +334 -334
- package/commands/propose-scenario.tmpl +54 -54
- package/commands/qc-analyze.md +322 -323
- package/commands/qc-analyze.tmpl +42 -43
- package/commands/qc-design-test.md +303 -303
- package/commands/qc-design-test.tmpl +23 -23
- package/commands/qc-plan.md +296 -296
- package/commands/qc-plan.tmpl +16 -16
- package/commands/qc-report.md +301 -301
- package/commands/qc-report.tmpl +21 -21
- package/commands/qc-review.md +297 -297
- package/commands/qc-review.tmpl +17 -17
- package/commands/qc-run-test.md +336 -336
- package/commands/qc-run-test.tmpl +35 -35
- package/commands/refine-prd.md +426 -428
- package/commands/refine-prd.tmpl +61 -61
- package/commands/report-bug.md +350 -350
- package/commands/report-bug.tmpl +70 -70
- package/commands/review-code.md +363 -363
- package/commands/review-code.tmpl +39 -39
- package/commands/review-context.md +577 -579
- package/commands/review-context.tmpl +212 -212
- package/commands/review-tech-docs.md +426 -426
- package/commands/review-tech-docs.tmpl +146 -146
- package/commands/setup-ai-first.md +237 -237
- package/commands/setup-ai-first.tmpl +131 -131
- package/commands/sync.md +145 -145
- package/commands/sync.tmpl +93 -93
- package/commands/update-framework.md +88 -88
- package/commands/update-framework.tmpl +36 -36
- package/commands/validate-traces.md +379 -379
- package/commands/validate-traces.tmpl +99 -99
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +435 -435
- package/core/commands/define-product.md +330 -327
- package/core/commands/dev-gen-test.md +364 -364
- package/core/commands/dev-run-test.md +375 -375
- package/core/commands/dev-smoke-test.md +340 -340
- package/core/commands/fix-bug.md +402 -402
- package/core/commands/generate-bdd.md +512 -512
- package/core/commands/generate-code.md +480 -482
- package/core/commands/generate-design-spec.md +495 -495
- package/core/commands/generate-prd.md +445 -396
- package/core/commands/generate-spec-manifest.md +337 -337
- package/core/commands/generate-tech-docs.md +364 -364
- package/core/commands/learn.md +346 -346
- package/core/commands/map-testids.md +321 -321
- package/core/commands/propose-scenario.md +334 -334
- package/core/commands/qc-analyze.md +322 -323
- package/core/commands/qc-design-test.md +303 -303
- package/core/commands/qc-plan.md +296 -296
- package/core/commands/qc-report.md +301 -301
- package/core/commands/qc-review.md +297 -297
- package/core/commands/qc-run-test.md +336 -336
- package/core/commands/refine-prd.md +426 -428
- package/core/commands/report-bug.md +350 -350
- package/core/commands/review-code.md +363 -363
- package/core/commands/review-context.md +577 -579
- package/core/commands/review-tech-docs.md +426 -426
- package/core/commands/setup-ai-first.md +237 -237
- package/core/commands/sync.md +145 -145
- package/core/commands/update-framework.md +88 -88
- package/core/commands/validate-traces.md +379 -379
- package/core/skills/code/SKILL.md +388 -388
- package/core/skills/debug/SKILL.md +390 -390
- package/core/skills/design-spec/SKILL.md +316 -316
- package/core/skills/discovery/SKILL.md +7 -547
- package/core/skills/prd/SKILL.md +298 -394
- package/core/skills/setup-ai-first/SKILL.md +79 -79
- package/core/skills/spec/SKILL.md +176 -176
- package/core/skills/test/SKILL.md +602 -602
- package/core/steps/capture-lesson.md +44 -44
- package/core/steps/context-loader.md +174 -174
- package/core/steps/gate.md +54 -54
- package/core/steps/report-footer.md +52 -52
- package/core/steps/review-fanout.md +85 -87
- package/core/steps/spawn-agent.md +45 -45
- package/core/steps/trace-mirror.md +21 -21
- package/core/templates/architecture.template.md +37 -37
- package/core/templates/design-spec.template.md +77 -77
- package/core/templates/platform-guide.template.md +47 -47
- package/core/templates/prd.template.md +106 -231
- package/core/templates/product-definition.template.md +101 -88
- package/docs/04-operations/publishing.md +20 -3
- package/package.json +1 -1
- package/skills/code/SKILL.md +388 -388
- package/skills/code/SKILL.tmpl +56 -56
- package/skills/debug/SKILL.md +390 -390
- package/skills/debug/SKILL.tmpl +60 -60
- package/skills/design-spec/SKILL.md +316 -316
- package/skills/design-spec/SKILL.tmpl +36 -36
- package/skills/discovery/SKILL.md +7 -547
- package/skills/discovery/SKILL.tmpl +7 -140
- package/skills/prd/SKILL.md +298 -394
- package/skills/prd/SKILL.tmpl +40 -151
- package/skills/setup-ai-first/SKILL.md +79 -79
- package/skills/setup-ai-first/SKILL.tmpl +27 -27
- package/skills/spec/SKILL.md +176 -176
- package/skills/spec/SKILL.tmpl +18 -18
- package/skills/test/SKILL.md +602 -602
- package/skills/test/SKILL.tmpl +44 -44
- package/steps/capture-lesson.md +44 -44
- package/steps/context-loader.md +174 -174
- package/steps/gate.md +54 -54
- package/steps/report-footer.md +52 -52
- package/steps/review-fanout.md +85 -87
- package/steps/spawn-agent.md +45 -45
- package/steps/trace-mirror.md +21 -21
- package/templates/architecture.template.md +37 -37
- package/templates/design-spec.template.md +77 -77
- package/templates/platform-guide.template.md +47 -47
- package/templates/prd.template.md +106 -231
- package/templates/product-definition.template.md +101 -88
|
@@ -1,33 +1,33 @@
|
|
|
1
1
|
# Platform Guide — {{SERVICE_NAME}}
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
5
|
-
>
|
|
3
|
+
> Guide này cung cấp context mà Claude dùng khi làm việc trong service/repository NÀY.
|
|
4
|
+
> Giữ ngắn gọn và đúng sự thật. Cập nhật khi kiến trúc hoặc domain model thay đổi.
|
|
5
|
+
> Tham chiếu: CLAUDE.md cho chuẩn toàn dự án. File này phủ context riêng của service.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# §1. Service Overview
|
|
10
10
|
|
|
11
|
-
**
|
|
12
|
-
**
|
|
13
|
-
**Bounded context**: {{BOUNDED_CONTEXT}} #
|
|
11
|
+
**Tên service**: {{SERVICE_NAME}}
|
|
12
|
+
**Mục đích**: {{ONE_SENTENCE_PURPOSE}}
|
|
13
|
+
**Bounded context**: {{BOUNDED_CONTEXT}} # vd: "Sở hữu toàn bộ logic vòng đời order. KHÔNG sở hữu payment hay inventory."
|
|
14
14
|
**Team**: {{TEAM_NAME}}
|
|
15
15
|
**Repository**: {{REPO_URL}}
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
Trách nhiệm chính:
|
|
18
18
|
- {{RESPONSIBILITY_1}}
|
|
19
19
|
- {{RESPONSIBILITY_2}}
|
|
20
20
|
- {{RESPONSIBILITY_3}}
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
- {{OUT_OF_SCOPE_1}} #
|
|
22
|
+
Service này KHÔNG xử lý:
|
|
23
|
+
- {{OUT_OF_SCOPE_1}} # vd: "Xử lý payment → xem payment-service"
|
|
24
24
|
- {{OUT_OF_SCOPE_2}}
|
|
25
25
|
|
|
26
26
|
---
|
|
27
27
|
|
|
28
28
|
# §2. Domain Model
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
Các entity chính và quan hệ của chúng:
|
|
31
31
|
|
|
32
32
|
```
|
|
33
33
|
{{ENTITY_1}} (aggregate root)
|
|
@@ -39,31 +39,31 @@ Key entities and their relationships:
|
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
**{{ENTITY_1}}**:
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
- Business
|
|
42
|
+
- Field chính: {{KEY_FIELDS}}
|
|
43
|
+
- Vòng đời status: {{STATUS_1}} → {{STATUS_2}} → {{STATUS_3}}
|
|
44
|
+
- Business rule: {{KEY_RULE_1}}
|
|
45
45
|
|
|
46
46
|
**{{ENTITY_2}}**:
|
|
47
|
-
-
|
|
48
|
-
-
|
|
47
|
+
- Field chính: {{KEY_FIELDS}}
|
|
48
|
+
- Quan hệ: {{RELATIONSHIP_DESCRIPTION}}
|
|
49
49
|
|
|
50
50
|
---
|
|
51
51
|
|
|
52
52
|
# §3. Common Patterns
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
Các pattern riêng của service này (bổ sung cho chuẩn toàn dự án trong CLAUDE.md):
|
|
55
55
|
|
|
56
56
|
## {{PATTERN_NAME_1}}
|
|
57
57
|
```
|
|
58
|
-
//
|
|
59
|
-
//
|
|
58
|
+
// Khi nào dùng: {{USE_CASE}}
|
|
59
|
+
// Ví dụ:
|
|
60
60
|
{{CODE_EXAMPLE}}
|
|
61
61
|
```
|
|
62
62
|
|
|
63
63
|
## {{PATTERN_NAME_2}}
|
|
64
64
|
```
|
|
65
|
-
//
|
|
66
|
-
//
|
|
65
|
+
// Khi nào dùng: {{USE_CASE}}
|
|
66
|
+
// Ví dụ:
|
|
67
67
|
{{CODE_EXAMPLE}}
|
|
68
68
|
```
|
|
69
69
|
|
|
@@ -71,30 +71,30 @@ Patterns specific to this service (supplement the project-wide standards in CLAU
|
|
|
71
71
|
|
|
72
72
|
# §4. Integration Points
|
|
73
73
|
|
|
74
|
-
## Upstream Dependencies (
|
|
74
|
+
## Upstream Dependencies (service này gọi các bên dưới)
|
|
75
75
|
|
|
76
|
-
| Service / System |
|
|
76
|
+
| Service / System | Cái ta gọi | Protocol | Auth |
|
|
77
77
|
|------------------|--------------|----------|------|
|
|
78
78
|
| {{UPSTREAM_1}} | {{WHAT}} | REST/gRPC/Event | {{AUTH_METHOD}} |
|
|
79
79
|
| {{UPSTREAM_2}} | {{WHAT}} | REST/gRPC/Event | {{AUTH_METHOD}} |
|
|
80
80
|
|
|
81
|
-
## Downstream Consumers (
|
|
81
|
+
## Downstream Consumers (các bên dưới gọi ta hoặc tiêu thụ event của ta)
|
|
82
82
|
|
|
83
|
-
| Consumer |
|
|
83
|
+
| Consumer | Cái họ dùng | Protocol |
|
|
84
84
|
|----------|---------------|----------|
|
|
85
85
|
| {{DOWNSTREAM_1}} | {{WHAT}} | REST/Event |
|
|
86
86
|
| {{DOWNSTREAM_2}} | {{WHAT}} | REST/Event |
|
|
87
87
|
|
|
88
|
-
##
|
|
88
|
+
## Event phát ra (Produced)
|
|
89
89
|
|
|
90
|
-
|
|
|
90
|
+
| Tên event | Trigger | Tóm tắt payload |
|
|
91
91
|
|------------|---------|-----------------|
|
|
92
92
|
| {{EVENT_1}} | {{WHEN}} | {{PAYLOAD_FIELDS}} |
|
|
93
93
|
| {{EVENT_2}} | {{WHEN}} | {{PAYLOAD_FIELDS}} |
|
|
94
94
|
|
|
95
|
-
##
|
|
95
|
+
## Event tiêu thụ (Consumed)
|
|
96
96
|
|
|
97
|
-
|
|
|
97
|
+
| Tên event | Từ service | Ta làm gì với nó |
|
|
98
98
|
|------------|-------------|-------------------|
|
|
99
99
|
| {{EVENT_1}} | {{SOURCE}} | {{HANDLER_ACTION}} |
|
|
100
100
|
|
|
@@ -102,20 +102,20 @@ Patterns specific to this service (supplement the project-wide standards in CLAU
|
|
|
102
102
|
|
|
103
103
|
# §5. Known Constraints
|
|
104
104
|
|
|
105
|
-
## Performance
|
|
106
|
-
- {{PERF_CONSTRAINT_1}} #
|
|
105
|
+
## Ràng buộc hiệu năng (Performance)
|
|
106
|
+
- {{PERF_CONSTRAINT_1}} # vd: "Endpoint danh sách order phải phản hồi < 200ms cho tới 1000 order"
|
|
107
107
|
- {{PERF_CONSTRAINT_2}}
|
|
108
108
|
|
|
109
|
-
##
|
|
110
|
-
- {{BUSINESS_CONSTRAINT_1}} #
|
|
109
|
+
## Ràng buộc business rule
|
|
110
|
+
- {{BUSINESS_CONSTRAINT_1}} # vd: "Không thể huỷ order sau khi đã ship"
|
|
111
111
|
- {{BUSINESS_CONSTRAINT_2}}
|
|
112
112
|
|
|
113
|
-
## External
|
|
114
|
-
- {{EXTERNAL_DEP_1}} #
|
|
113
|
+
## Phụ thuộc bên ngoài (External)
|
|
114
|
+
- {{EXTERNAL_DEP_1}} # vd: "Cần inventory-service sẵn sàng để tạo order"
|
|
115
115
|
- {{EXTERNAL_DEP_2}}
|
|
116
116
|
|
|
117
|
-
##
|
|
118
|
-
- {{TECH_DEBT_1}} #
|
|
117
|
+
## Technical Debt đã biết
|
|
118
|
+
- {{TECH_DEBT_1}} # vd: "OrderItem.price bị nhân bản từ catalog — đồng bộ qua job hằng đêm"
|
|
119
119
|
|
|
120
120
|
---
|
|
121
121
|
|
|
@@ -123,23 +123,23 @@ Patterns specific to this service (supplement the project-wide standards in CLAU
|
|
|
123
123
|
|
|
124
124
|
```
|
|
125
125
|
{{SERVICE_ROOT}}/
|
|
126
|
-
├── {{SOURCE_DIR}}/ #
|
|
127
|
-
│ ├── {{LAYER_1}}/ #
|
|
126
|
+
├── {{SOURCE_DIR}}/ # Code nguồn chính
|
|
127
|
+
│ ├── {{LAYER_1}}/ # vd: controller/ hoặc handler/
|
|
128
128
|
│ │ └── {{EXAMPLE_FILE}}
|
|
129
|
-
│ ├── {{LAYER_2}}/ #
|
|
129
|
+
│ ├── {{LAYER_2}}/ # vd: service/ hoặc usecase/
|
|
130
130
|
│ │ └── {{EXAMPLE_FILE}}
|
|
131
|
-
│ ├── {{LAYER_3}}/ #
|
|
131
|
+
│ ├── {{LAYER_3}}/ # vd: repository/ hoặc repo/
|
|
132
132
|
│ │ └── {{EXAMPLE_FILE}}
|
|
133
|
-
│ └── {{LAYER_4}}/ #
|
|
133
|
+
│ └── {{LAYER_4}}/ # vd: model/ hoặc domain/
|
|
134
134
|
│ └── {{EXAMPLE_FILE}}
|
|
135
|
-
├── {{TEST_DIR}}/ #
|
|
136
|
-
├── specs/ # BDD feature
|
|
135
|
+
├── {{TEST_DIR}}/ # Test phản chiếu cấu trúc src
|
|
136
|
+
├── specs/ # File BDD feature
|
|
137
137
|
│ └── bdd/
|
|
138
138
|
│ └── {{DOMAIN}}/
|
|
139
139
|
│ └── {{UC-ID}}-{{slug}}.feature
|
|
140
|
-
└── {{CONFIG_FILE}} #
|
|
140
|
+
└── {{CONFIG_FILE}} # vd: application.yaml / appsettings.json
|
|
141
141
|
```
|
|
142
142
|
|
|
143
|
-
**
|
|
144
|
-
- {{CONVENTION_1}} #
|
|
145
|
-
- {{CONVENTION_2}} #
|
|
143
|
+
**Convention chính của repo này:**
|
|
144
|
+
- {{CONVENTION_1}} # vd: "Mọi DTO nằm trong package api/, không trộn với domain model"
|
|
145
|
+
- {{CONVENTION_2}} # vd: "Integration test nằm ở src/test/java/.../integration/ với @Tag(\"integration\")"
|
|
@@ -1,90 +1,60 @@
|
|
|
1
|
-
# {TICKET-
|
|
1
|
+
# {TICKET}-{N} {Feature Name}
|
|
2
2
|
|
|
3
3
|
<!--
|
|
4
4
|
Template này được sử dụng bởi workflow /generate-prd.
|
|
5
5
|
AI Agent sẽ điền các section dựa trên input từ PO.
|
|
6
6
|
Các placeholder {…} cần được thay thế bằng nội dung thực tế.
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
│ Merchant / Tenant │ Merchant = nghiệp vụ, Tenant = kỹ thuật│
|
|
20
|
-
│ Online Storefront │ Tính năng bán hàng trên Zalo Mini App │
|
|
21
|
-
│ Branch │ Chi nhánh vật lý (projection từ KVS) │
|
|
22
|
-
│ Loyalty Member │ Quan hệ Consumer ↔ Merchant │
|
|
23
|
-
│ Order │ Đơn hàng (chỉ completed → Loyalty) │
|
|
24
|
-
│ OrderItem │ Chi tiết dòng hàng trong Order │
|
|
25
|
-
│ Product │ Hàng hóa (projection từ KVS) │
|
|
26
|
-
│ ProductCategory │ Nhóm hàng (hierarchical) │
|
|
27
|
-
│ ProductAttribute │ Định nghĩa loại thuộc tính │
|
|
28
|
-
│ ProductAttributeMap │ Mapping thuộc tính → sản phẩm cụ thể │
|
|
29
|
-
│ ProductImage │ Hình ảnh sản phẩm (nhiều ảnh, có rank) │
|
|
30
|
-
│ Address │ Địa chỉ đa hình (polymorphic) │
|
|
31
|
-
│ SourceSystem │ Hệ thống partner (map → X-App-Id) │
|
|
32
|
-
│ ExternalId │ ID tham chiếu từ hệ thống nguồn (KVS) │
|
|
33
|
-
│ Onboarding │ Quy trình khởi tạo gian hàng lần đầu │
|
|
34
|
-
│ revision │ Row version — delta sync │
|
|
35
|
-
│ KVLoyalty Widget │ Thư viện tích hợp frontend (JS qua CDN) │
|
|
36
|
-
└─────────────────────────┴──────────────────────────────────────────┘
|
|
37
|
-
|
|
38
|
-
THUẬT NGỮ BỊ CẤM — TUYỆT ĐỐI KHÔNG xuất hiện trong PRD:
|
|
39
|
-
┌─────────────────────────┬─────────────────────────────────────────────────┐
|
|
40
|
-
│ ❌ KHÔNG dùng │ ✅ Thay thế bằng │
|
|
41
|
-
├─────────────────────────┼─────────────────────────────────────────────────┤
|
|
42
|
-
│ Customer │ Consumer │
|
|
43
|
-
│ SKU │ Product + ProductAttribute + ProductAttributeMap│
|
|
44
|
-
│ JS SDK / JavaScript SDK │ KVLoyalty Widget │
|
|
45
|
-
│ CDC │ Event bus (Kafka) │
|
|
46
|
-
│ primaryBranchId │ Branch.isPrimary │
|
|
47
|
-
│ Cửa hàng (= storefront)│ Online Storefront / Gian hàng online │
|
|
48
|
-
└─────────────────────────┴─────────────────────────────────────────────────┘
|
|
49
|
-
|
|
50
|
-
QUY TẮC BỔ SUNG:
|
|
51
|
-
- Luôn dùng SourceSystem cho partners, ExternalId cho external references.
|
|
52
|
-
- Status/Enum values → tham chiếu core-entities.md Global Enum Registry.
|
|
53
|
-
- Khi nhắc "SKU" → diễn giải bằng Product con (masterProductId) + ProductAttributeMap.
|
|
54
|
-
- Consumer là global entity — 1 Consumer có thể mua hàng ở nhiều Merchant.
|
|
55
|
-
- Nếu phát hiện banned term trong input PO → thay thế bằng term chuẩn và ghi chú trong "Giả định AI".
|
|
56
|
-
- CROSS-REFERENCE (BẮT BUỘC): Bất kỳ chỗ nào trong tài liệu có nhắc đến một tính năng/ticket khác
|
|
57
|
-
(dù là pre-condition, business rule, giả định, AC, hay bất kỳ section nào) → PHẢI gắn inline link:
|
|
8
|
+
FORMAT CHUẨN: Business Rule = bảng 3 cột
|
|
9
|
+
ID | Business Rule | Business Logic (KHÔNG tách Business Logic ra khối riêng).
|
|
10
|
+
|
|
11
|
+
TERMINOLOGY:
|
|
12
|
+
- Tuân thủ 100% từ điển project: specs/domain-knowledge/business-dictionary.md
|
|
13
|
+
(KHÔNG dùng từ điển của project khác). Thay banned term bằng canonical term;
|
|
14
|
+
nếu phát hiện banned term trong input PO → thay + ghi chú trong "Giả định AI".
|
|
15
|
+
- Status/Enum values → tham chiếu core-entities.md (Enum Registry).
|
|
16
|
+
|
|
17
|
+
CROSS-REFERENCE (BẮT BUỘC): Bất kỳ chỗ nào nhắc đến một tính năng/ticket khác
|
|
18
|
+
(pre-condition, business rule, giả định, AC, hay bất kỳ section nào) → PHẢI gắn inline link:
|
|
58
19
|
[TICKET-ID](./TICKET-ID-slug.md)
|
|
59
|
-
Không
|
|
20
|
+
Không để TICKET-ID dạng plain text nếu tồn tại file PRD tương ứng.
|
|
60
21
|
Ngoài ra, ghi rõ quan hệ phụ thuộc trong "Tài liệu tham khảo" ở Appendix.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
22
|
+
|
|
23
|
+
NEW TERM DETECTION: Nếu input PO xuất hiện thuật ngữ CHƯA CÓ trong business-dictionary.md
|
|
24
|
+
và lặp lại ≥ 2 lần → DỪNG lại, hỏi PO confirm trước khi tiếp tục:
|
|
25
|
+
+ Thuật ngữ đó nghĩa gì trong ngữ cảnh hệ thống?
|
|
64
26
|
+ English term chuẩn nên dùng là gì?
|
|
65
27
|
+ Có cần bổ sung vào business-dictionary.md không?
|
|
66
|
-
Sau khi PO confirm → cập nhật business-dictionary.md (nếu PO đồng ý) rồi mới tiếp tục
|
|
28
|
+
Sau khi PO confirm → cập nhật business-dictionary.md (nếu PO đồng ý) rồi mới tiếp tục.
|
|
29
|
+
|
|
30
|
+
NUMBERING:
|
|
31
|
+
- UC ID: {TICKET}-{N}-UC{n} (n bắt đầu từ 1, tăng theo từng use case)
|
|
32
|
+
- BR ID: {TICKET}-{N}-UC{n}-BR{m} (m tăng LIÊN TỤC xuyên suốt PRD, KHÔNG reset mỗi UC)
|
|
67
33
|
-->
|
|
68
34
|
|
|
69
35
|
---
|
|
70
36
|
|
|
71
37
|
## Metadata
|
|
72
38
|
|
|
73
|
-
| Field | Value
|
|
74
|
-
|
|
75
|
-
| **PRD ID** | {TICKET-
|
|
76
|
-
| **Version** | 1.0
|
|
77
|
-
| **Status** | draft
|
|
78
|
-
| **Author** |
|
|
79
|
-
| **Domain** | {domain
|
|
80
|
-
| **Created** | {
|
|
81
|
-
| **Updated** | {
|
|
39
|
+
| Field | Value |
|
|
40
|
+
|---------------|------------------------------------------|
|
|
41
|
+
| **PRD ID** | {TICKET}-{N} |
|
|
42
|
+
| **Version** | 1.0 |
|
|
43
|
+
| **Status** | draft |
|
|
44
|
+
| **Author** | AI-assisted |
|
|
45
|
+
| **Domain** | {domain} |
|
|
46
|
+
| **Created** | {date} |
|
|
47
|
+
| **Updated** | {date} |
|
|
48
|
+
| **Jira Ticket** | [{TICKET}-{N}]({ticket_url}) |
|
|
49
|
+
| **API Source** | *(để trống nếu greenfield — chỉ điền `existing` khi PRD bọc một API đã chạy production)* |
|
|
82
50
|
|
|
83
51
|
---
|
|
84
52
|
|
|
85
53
|
# Feature
|
|
86
54
|
|
|
87
|
-
{
|
|
55
|
+
**{Feature Name}**
|
|
56
|
+
|
|
57
|
+
{Đoạn mô tả tổng quan: feature làm gì, cho ai, giải quyết vấn đề gì — lấy từ product-definition.}
|
|
88
58
|
|
|
89
59
|
---
|
|
90
60
|
|
|
@@ -92,184 +62,83 @@
|
|
|
92
62
|
|
|
93
63
|
## a. User Story
|
|
94
64
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
QUY TẮC VIẾT:
|
|
100
|
-
- {User role} → Vai trò người dùng (ví dụ: Consumer, Merchant Admin, Cashier)
|
|
101
|
-
- {User goal} → Mục tiêu người dùng muốn đạt được (hành động/chức năng cụ thể)
|
|
102
|
-
- {Business value}→ Giá trị nghiệp vụ mang lại (lý do tại sao người dùng cần điều này)
|
|
103
|
-
-->
|
|
104
|
-
|
|
105
|
-
- **As a** {User role}
|
|
106
|
-
- **I want to** {User goal}
|
|
107
|
-
- **So that** {Business value}
|
|
65
|
+
- **Là một (As a)** {persona}
|
|
66
|
+
- **Tôi muốn (I want to)** {action}
|
|
67
|
+
- **Để (So that)** {benefit}
|
|
108
68
|
|
|
109
69
|
## b. Phạm vi
|
|
110
70
|
|
|
111
|
-
<!--
|
|
112
|
-
ĐỊNH NGHĨA: Liệt kê danh sách các chức năng thuộc feature này.
|
|
113
|
-
Trả lời câu hỏi: "Feature này làm gì?" — giúp xác định ranh giới, tránh scope creep.
|
|
114
|
-
|
|
115
|
-
QUY TẮC VIẾT:
|
|
116
|
-
- Mỗi dòng là một chức năng/capability cụ thể mà feature này cung cấp.
|
|
117
|
-
- Chỉ liệt kê những gì được làm trong ticket này. Nếu có chức năng liên quan nhưng
|
|
118
|
-
KHÔNG thuộc ticket này → KHÔNG đưa vào danh sách.
|
|
119
|
-
- Viết ngắn gọn, súc tích, đủ để người đọc hiểu mà không cần giải thích thêm.
|
|
120
|
-
-->
|
|
121
|
-
|
|
122
71
|
**In Scope**
|
|
72
|
+
- {hạng mục trong phạm vi 1}
|
|
73
|
+
- {hạng mục trong phạm vi 2}
|
|
123
74
|
|
|
124
|
-
|
|
75
|
+
**Out of Scope** *(chỉ thêm khi có ranh giới cần nói rõ)*
|
|
76
|
+
- {hạng mục ngoài phạm vi + lý do / chủ sở hữu}
|
|
125
77
|
|
|
126
78
|
---
|
|
127
79
|
|
|
128
80
|
# 2. Acceptance Criteria
|
|
129
81
|
|
|
130
|
-
|
|
131
|
-
ĐỊNH NGHĨA: Danh sách điều kiện cần thỏa mãn để tính năng được coi là hoàn thành.
|
|
132
|
-
Trả lời câu hỏi: "Khi nào thì feature này được coi là DONE?" — tiêu chí để QA kiểm thử và PO sign-off.
|
|
133
|
-
|
|
134
|
-
QUY TẮC VIẾT:
|
|
135
|
-
- Viết theo góc nhìn người dùng: "Người dùng có thể...", "Hệ thống cho phép..."
|
|
136
|
-
- Mỗi AC phải testable (có thể kiểm tra được — pass hoặc fail rõ ràng).
|
|
137
|
-
- Chỉ ghi các tiêu chí CỐT LÕI — khi tính năng đạt được những điều này thì người dùng
|
|
138
|
-
đã có thể sử dụng được. Không ghi tiêu chí phụ hoặc edge case nhỏ.
|
|
139
|
-
|
|
140
|
-
KHÔNG viết AC về:
|
|
141
|
-
- UI/UX (màu sắc, vị trí nút, font chữ, animation) → thuộc Wireframe.
|
|
142
|
-
- Chi tiết kỹ thuật hoặc logic xử lý nội bộ → thuộc Business Rule / Business Logic.
|
|
143
|
-
-->
|
|
82
|
+
**AC1:** {Tiêu chí nghiệm thu, văn xuôi, kiểm chứng được.}
|
|
144
83
|
|
|
145
|
-
|
|
146
|
-
- **AC2:** {Điều kiện chấp nhận}
|
|
147
|
-
- **AC3:** {Điều kiện chấp nhận}
|
|
84
|
+
**AC2:** {…}
|
|
148
85
|
|
|
149
86
|
---
|
|
150
87
|
|
|
151
88
|
# 3. Use Case
|
|
152
89
|
|
|
153
|
-
|
|
154
|
-
ĐỊNH NGHĨA — USE CASE (UC):
|
|
155
|
-
Mô tả một kịch bản nghiệp vụ cụ thể từ góc nhìn người dùng tương tác với hệ thống.
|
|
156
|
-
Trả lời câu hỏi: "Người dùng tương tác với hệ thống như thế nào trong từng tình huống?"
|
|
157
|
-
- Actor → Ai thực hiện hành động trong kịch bản này
|
|
158
|
-
- Description → Tóm tắt kịch bản bằng 1 câu
|
|
159
|
-
- Pre-condition → Điều kiện PHẢI đúng TRƯỚC KHI Use Case bắt đầu (trạng thái hệ thống, quyền, dữ liệu)
|
|
160
|
-
- Post-condition→ Trạng thái/kết quả SAU KHI Use Case hoàn thành thành công
|
|
161
|
-
|
|
162
|
-
ĐỊNH NGHĨA — BUSINESS RULE (BR):
|
|
163
|
-
Quy tắc nghiệp vụ mà hệ thống bắt buộc phải tuân theo — viết thành một câu rõ ràng, ngắn gọn, dễ hiểu.
|
|
164
|
-
Trả lời câu hỏi: "Hệ thống PHẢI làm gì / KHÔNG được làm gì?" (WHAT)
|
|
165
|
-
- Là ràng buộc không thể thương lượng, xuất phát từ yêu cầu nghiệp vụ.
|
|
166
|
-
- Mỗi BR chỉ phát biểu MỘT quy tắc duy nhất, không gộp nhiều quy tắc vào một dòng.
|
|
167
|
-
|
|
168
|
-
ĐỊNH NGHĨA — BUSINESS LOGIC (BL):
|
|
169
|
-
Cách thực thi cụ thể của một Business Rule — mô tả các điều kiện và logic chi tiết.
|
|
170
|
-
Trả lời câu hỏi: "Hệ thống thực hiện quy tắc đó cụ thể như thế nào?" (HOW)
|
|
171
|
-
- Các điều kiện rẽ nhánh (if/else, trường hợp A / trường hợp B)
|
|
172
|
-
- Công thức tính toán hoặc quy tắc áp dụng theo từng trường hợp
|
|
173
|
-
- Thứ tự xử lý, ưu tiên, các trường hợp ngoại lệ
|
|
174
|
-
- Đây là input trực tiếp để developer implement.
|
|
175
|
-
|
|
176
|
-
NUMBERING CONVENTION:
|
|
177
|
-
- UC ID: format {TICKET_ID}-UC{N}
|
|
178
|
-
+ {TICKET_ID} = Jira Ticket ID (e.g., LOYAL-29)
|
|
179
|
-
+ {N} = UC number within this PRD (1, 2, 3, ...)
|
|
180
|
-
+ E.g.: LOYAL-29-UC1, LOYAL-29-UC2, LOYAL-29-UC3, ...
|
|
181
|
-
- BR ID: format {TICKET_ID}-UC{N}-BR{M}
|
|
182
|
-
+ {M} = BR number incrementing from 1 across the PRD (not reset per UC, not global)
|
|
183
|
-
+ E.g.: LOYAL-29-UC1-BR1, LOYAL-29-UC1-BR2, LOYAL-29-UC2-BR3, ...
|
|
184
|
-
-->
|
|
90
|
+
#### {TICKET}-{N}-UC1: {Tên use case}
|
|
185
91
|
|
|
186
|
-
|
|
92
|
+
**Actor:** {actor}
|
|
187
93
|
|
|
188
|
-
|
|
189
|
-
- **Description:** {Mô tả ngắn gọn kịch bản nghiệp vụ}
|
|
190
|
-
- **Pre-condition:** {Điều kiện cần trước khi Use Case bắt đầu}
|
|
191
|
-
- **Post-condition:** {Kết quả sau khi Use Case hoàn thành}
|
|
94
|
+
**Description:** {mô tả luồng}
|
|
192
95
|
|
|
193
|
-
**
|
|
96
|
+
**Pre-condition:**
|
|
97
|
+
- {điều kiện trước 1}
|
|
194
98
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
| {TICKET_ID}-UC1-BR1 | |
|
|
99
|
+
**Post-condition:**
|
|
100
|
+
- {kết quả sau 1}
|
|
198
101
|
|
|
199
|
-
**Business
|
|
102
|
+
**Business Rule**
|
|
200
103
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
-
|
|
204
|
-
-
|
|
104
|
+
| ID | Business Rule | Business Logic |
|
|
105
|
+
|----|---------------|----------------|
|
|
106
|
+
| {TICKET}-{N}-UC1-BR1 | {luật ngắn gọn} | - {logic chi tiết, xuống dòng bằng `<br/>`}<br/>- {…} |
|
|
107
|
+
| {TICKET}-{N}-UC1-BR2 | {…} | - {…} |
|
|
205
108
|
|
|
206
109
|
---
|
|
207
110
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
## a. User Flow
|
|
111
|
+
#### {TICKET}-{N}-UC2: {Tên use case}
|
|
211
112
|
|
|
212
|
-
|
|
213
|
-
ĐỊNH NGHĨA: Sơ đồ trực quan mô tả trình tự các bước và nhánh quyết định mà người dùng đi qua.
|
|
214
|
-
Trả lời câu hỏi: "Người dùng đi qua những bước nào và hệ thống phản hồi ra sao?"
|
|
113
|
+
{lặp cấu trúc UC như trên; BR đánh số tiếp tục BR3, BR4…}
|
|
215
114
|
|
|
216
|
-
|
|
217
|
-
- Start/Entry → Điểm vào: người dùng bắt đầu từ đâu (màn hình nào, hành động nào)
|
|
218
|
-
- Process → Bước xử lý: hình chữ nhật [ ] — hành động hoặc hiển thị của hệ thống
|
|
219
|
-
- Decision → Điểm rẽ nhánh: hình thoi { } — điều kiện dẫn đến kết quả khác nhau
|
|
220
|
-
- End State → Trạng thái kết thúc: kết quả cuối cùng người dùng nhận được
|
|
115
|
+
---
|
|
221
116
|
|
|
222
|
-
|
|
223
|
-
Bao gồm cả luồng lỗi / luồng ngoại lệ quan trọng (không chỉ happy path).
|
|
224
|
-
-->
|
|
117
|
+
# 4. UI/UX Guidelines
|
|
225
118
|
|
|
226
|
-
|
|
119
|
+
## a. User Flow
|
|
227
120
|
|
|
228
121
|
```mermaid
|
|
229
122
|
flowchart TD
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
C -->|Có| D[Bước 3a: ...]
|
|
233
|
-
C -->|Không| E[Bước 3b: ...]
|
|
123
|
+
START(["{điểm bắt đầu}"]) --> A{"{điểm quyết định}"}
|
|
124
|
+
A -->|{nhánh}| B["{bước}"]
|
|
234
125
|
```
|
|
235
126
|
|
|
236
127
|
## b. Wireframe
|
|
237
128
|
|
|
238
|
-
|
|
239
|
-
ĐỊNH NGHĨA: Mô tả bố cục và thành phần UI của từng màn hình.
|
|
240
|
-
Trả lời câu hỏi: "Màn hình trông như thế nào và người dùng tương tác với nó ra sao?"
|
|
241
|
-
Là cầu nối giữa nghiệp vụ và thiết kế UI. Có thể kèm link Figma hoặc ảnh mockup.
|
|
242
|
-
|
|
243
|
-
CẤU TRÚC BẢNG CHUẨN (3 thành phần chính):
|
|
244
|
-
- Screen → Tên màn hình / modal / trạng thái đang mô tả
|
|
245
|
-
- Components → Danh sách các thành phần UI hiển thị (button, label, list, input, bar...)
|
|
246
|
-
- Actions → Hành động người dùng thực hiện và kết quả/màn hình tiếp theo tương ứng
|
|
247
|
-
|
|
248
|
-
LƯU Ý — CẤU TRÚC LINH HOẠT THEO ĐỘ PHỨC TẠP:
|
|
249
|
-
Với màn đơn giản → dùng bảng 3 cột chuẩn (Screen / Components / Actions) là đủ.
|
|
250
|
-
Với màn phức tạp (nhiều trạng thái, nhiều modal, nhiều luồng lỗi) → có thể mở rộng:
|
|
251
|
-
- Tách riêng từng màn / modal / trạng thái thay vì gộp chung một bảng.
|
|
252
|
-
- Thêm các field chi tiết hơn nếu cần (UI Pattern, Header, Footer, Toast, Entry Point...).
|
|
253
|
-
Nguyên tắc: ưu tiên sự rõ ràng hơn tuân thủ cứng nhắc cấu trúc —
|
|
254
|
-
miễn là designer, dev, QA đọc vào hiểu đúng ý định của màn hình đó.
|
|
255
|
-
-->
|
|
256
|
-
|
|
257
|
-
**Screen N: {Tên màn hình}**
|
|
258
|
-
|
|
259
|
-
**Screen:** {Tên màn hình}
|
|
129
|
+
### Screen 1: {Tên màn}
|
|
260
130
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
- {
|
|
131
|
+
| Thành phần | Chi tiết |
|
|
132
|
+
|------------|----------|
|
|
133
|
+
| **Screen** | {tên/ngữ cảnh màn} |
|
|
134
|
+
| **Components** | - {thành phần 1}<br/>- {thành phần 2} |
|
|
135
|
+
| **Actions** | - {hành động 1 → kết quả}<br/>- {hành động 2 → kết quả} |
|
|
265
136
|
|
|
266
|
-
|
|
267
|
-
- {Hành động 1} → {Kết quả}
|
|
268
|
-
- {Hành động 2} → {Kết quả}
|
|
137
|
+
---
|
|
269
138
|
|
|
270
|
-
|
|
139
|
+
### Screen 2: {Tên màn}
|
|
271
140
|
|
|
272
|
-
|
|
141
|
+
{lặp bảng như trên cho từng màn}
|
|
273
142
|
|
|
274
143
|
---
|
|
275
144
|
|
|
@@ -277,51 +146,57 @@ flowchart TD
|
|
|
277
146
|
|
|
278
147
|
## Input gốc từ PO
|
|
279
148
|
|
|
280
|
-
>
|
|
281
|
-
|
|
282
|
-
{Paste original input here}
|
|
149
|
+
> {Trích nguyên văn input/ghi chú gốc của PO + đường dẫn product-definition nguồn.}
|
|
283
150
|
|
|
284
151
|
## Tài liệu tham khảo
|
|
285
152
|
|
|
153
|
+
- [{TICKET liên quan}](./{file}.md) — {quan hệ: pre-condition / overlapping / related…}
|
|
154
|
+
- Từ điển nghiệp vụ: `{path}/business-dictionary.md`
|
|
155
|
+
- Domain knowledge: `{path}/{domain}.md`
|
|
156
|
+
|
|
157
|
+
## Existing API Contract *(CHỈ brownfield — điền khi API Source = existing; greenfield BỎ QUA cả section này)*
|
|
158
|
+
|
|
286
159
|
<!--
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
-
|
|
290
|
-
-
|
|
160
|
+
Chỉ dùng khi PRD bọc một API đã tồn tại trên hệ thống. PO ghi lại contract để:
|
|
161
|
+
- /generate-bdd (system) dùng trực tiếp làm input — không cần tổng hợp từ FE/App BDD;
|
|
162
|
+
- /generate-tech-docs chạy mode reverse-document (mô tả lại as-is, không design mới);
|
|
163
|
+
- /review-tech-docs bỏ qua cổng T7 cross-team sign-off (contract đã cố định).
|
|
164
|
+
Nếu greenfield (thiết kế mới) → xoá toàn bộ section này.
|
|
291
165
|
-->
|
|
292
166
|
|
|
293
|
-
|
|
167
|
+
| Method | Path | Auth | Request | Response |
|
|
168
|
+
|--------|------|------|---------|----------|
|
|
169
|
+
| {GET/POST/PUT/DELETE} | {/api/v1/path} | {Bearer / none} | `{ field: type }` | `{ field: type }` |
|
|
170
|
+
|
|
171
|
+
**Error responses:**
|
|
172
|
+
|
|
173
|
+
| HTTP Status | Error Code | Khi nào xảy ra |
|
|
174
|
+
|-------------|------------|----------------|
|
|
175
|
+
| {4xx/5xx} | {ERR_CODE} | {condition} |
|
|
294
176
|
|
|
295
177
|
## Giả định AI
|
|
296
178
|
|
|
297
|
-
>
|
|
298
|
-
> Mỗi giả định cần được PO review và confirm.
|
|
179
|
+
> {Giả định / độ vênh AI phát hiện khi đối chiếu product-definition với domain-knowledge — cần PO review. AI KHÔNG tự hoà giải.}
|
|
299
180
|
|
|
300
|
-
-
|
|
301
|
-
- {Giả định 2 — [AI DRAFT]}
|
|
181
|
+
- **Q1 — [AI DRAFT] {tiêu đề}:** {mô tả độ vênh + nguồn}. **Cần PO chốt {điều gì}.**
|
|
302
182
|
|
|
303
|
-
|
|
183
|
+
_(Nếu không có độ vênh: ghi "Không có — toàn bộ nội dung đã được PO xác nhận qua Product Definition.")_
|
|
304
184
|
|
|
305
|
-
|
|
185
|
+
---
|
|
306
186
|
|
|
307
|
-
|
|
308
|
-
Version history — mỗi lần PRD được cập nhật (qua /refine-prd --resume hoặc PO tự sửa)
|
|
309
|
-
→ thêm 1 dòng mới vào đầu bảng này với version mới.
|
|
187
|
+
# Change Log
|
|
310
188
|
|
|
311
|
-
|
|
312
|
-
- Major (X.0 → X+1.0): thêm/xoá Use Case, thay đổi scope lớn, breaking BR change
|
|
313
|
-
- Minor (x.Y → x.Y+1): làm rõ AC/BR, thêm edge case, cập nhật wording
|
|
189
|
+
### v1.0 — {mô tả} ({date})
|
|
314
190
|
|
|
315
|
-
|
|
316
|
-
|
|
191
|
+
| Mục | Thay đổi |
|
|
192
|
+
|-----|----------|
|
|
193
|
+
| — | Bản đầu — sinh từ product-definition. |
|
|
317
194
|
|
|
318
|
-
|
|
319
|
-
|---------|------|---------|
|
|
320
|
-
| 1.0 | {YYYY-MM-DD} | Initial version |
|
|
195
|
+
---
|
|
321
196
|
|
|
322
|
-
<!--
|
|
197
|
+
<!--
|
|
323
198
|
NEXT STEPS:
|
|
324
199
|
Khi PRD được approve (status: approved), chạy:
|
|
325
|
-
/generate-bdd "
|
|
200
|
+
/generate-bdd "specs/{domain}/{prd-slug}/prd.md"
|
|
326
201
|
để sinh BDD feature specs từ PRD này.
|
|
327
202
|
-->
|