@educa-corp/sdd-framework 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/build.js +113 -19
- package/bin/gate-trace.js +487 -0
- package/bin/index.js +445 -146
- package/bin/lint-trace.js +643 -0
- package/bin/self-check.js +804 -2
- package/bin/trace-schema.json +621 -10
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/README.md +20 -0
- package/core/commands/amend-prd.md +518 -0
- package/core/commands/debug.md +123 -511
- package/core/commands/define-product.md +86 -510
- package/core/commands/dev-gen-test.md +86 -510
- package/core/commands/dev-run-test.md +133 -519
- package/core/commands/dev-smoke-test.md +86 -510
- package/core/commands/extend-prd.md +128 -522
- package/core/commands/fix-bug.md +118 -509
- package/core/commands/generate-architecture.md +94 -515
- package/core/commands/generate-bdd.md +128 -513
- package/core/commands/generate-code.md +119 -510
- package/core/commands/generate-design-spec.md +86 -510
- package/core/commands/generate-prd.md +89 -510
- package/core/commands/generate-spec-manifest.md +86 -510
- package/core/commands/generate-tech-docs.md +120 -512
- package/core/commands/learn.md +172 -496
- package/core/commands/map-testids.md +86 -510
- package/core/commands/propose-scenario.md +86 -510
- package/core/commands/qc-analyze.md +86 -510
- package/core/commands/qc-design-test.md +86 -510
- package/core/commands/qc-plan.md +86 -510
- package/core/commands/qc-report.md +86 -510
- package/core/commands/qc-review.md +86 -510
- package/core/commands/qc-run-test.md +115 -513
- package/core/commands/refine-prd.md +112 -522
- package/core/commands/report-bug.md +86 -510
- package/core/commands/review-code.md +123 -511
- package/core/commands/review-context.md +136 -522
- package/core/commands/review-tech-docs.md +90 -511
- package/core/commands/setup-ai-first.md +166 -138
- package/core/commands/sync.md +155 -107
- package/core/commands/update-framework.md +16 -103
- package/core/commands/validate-traces.md +426 -511
- package/core/hooks/data-guard.js +174 -83
- package/core/hooks/settings.json +2 -1
- package/core/rules/workflow.md +64 -4
- package/core/steps/capture-lesson.md +34 -1
- package/core/steps/context-loader.md +50 -8
- package/core/steps/gate.md +92 -35
- package/core/steps/report-footer.md +23 -0
- package/core/templates/README.md +24 -1
- package/core/templates/ci/trace-gate.yml +146 -0
- package/core/templates/feature.template +1 -1
- package/core/templates/hooks/pre-push +61 -0
- package/docs/02-concepts/architecture.md +61 -6
- package/docs/02-concepts/traceability.md +57 -0
- package/docs/03-guides/architect.md +63 -0
- package/docs/04-reference/commands.md +148 -134
- package/docs/04-reference/model-selection.md +32 -19
- package/docs/04-reference/trace-schema.md +39 -0
- package/docs/explain/02b-extend-prd.md +1 -1
- package/docs/explain/02c-amend-prd.md +152 -0
- package/docs/explain/21-validate-traces.md +2 -1
- package/docs/explain/27-learn.md +5 -3
- package/docs/explain/28-sync.md +25 -0
- package/docs/explain/README.md +136 -135
- package/package.json +5 -9
- package/commands/debug.md +0 -917
- package/commands/debug.tmpl +0 -257
- package/commands/define-product.md +0 -862
- package/commands/define-product.tmpl +0 -225
- package/commands/dev-gen-test.md +0 -1124
- package/commands/dev-gen-test.tmpl +0 -490
- package/commands/dev-run-test.md +0 -859
- package/commands/dev-run-test.tmpl +0 -225
- package/commands/dev-smoke-test.md +0 -798
- package/commands/dev-smoke-test.tmpl +0 -217
- package/commands/extend-prd.md +0 -907
- package/commands/extend-prd.tmpl +0 -270
- package/commands/fix-bug.md +0 -910
- package/commands/fix-bug.tmpl +0 -197
- package/commands/generate-architecture.md +0 -775
- package/commands/generate-architecture.tmpl +0 -194
- package/commands/generate-bdd.md +0 -1347
- package/commands/generate-bdd.tmpl +0 -590
- package/commands/generate-code.md +0 -1283
- package/commands/generate-code.tmpl +0 -649
- package/commands/generate-design-spec.md +0 -1161
- package/commands/generate-design-spec.tmpl +0 -524
- package/commands/generate-prd.md +0 -1143
- package/commands/generate-prd.tmpl +0 -223
- package/commands/generate-spec-manifest.md +0 -745
- package/commands/generate-spec-manifest.tmpl +0 -164
- package/commands/generate-tech-docs.md +0 -1344
- package/commands/generate-tech-docs.tmpl +0 -273
- package/commands/learn.md +0 -723
- package/commands/learn.tmpl +0 -63
- package/commands/map-testids.md +0 -662
- package/commands/map-testids.tmpl +0 -81
- package/commands/propose-scenario.md +0 -783
- package/commands/propose-scenario.tmpl +0 -202
- package/commands/qc-analyze.md +0 -693
- package/commands/qc-analyze.tmpl +0 -112
- package/commands/qc-design-test.md +0 -650
- package/commands/qc-design-test.tmpl +0 -69
- package/commands/qc-plan.md +0 -630
- package/commands/qc-plan.tmpl +0 -49
- package/commands/qc-report.md +0 -641
- package/commands/qc-report.tmpl +0 -60
- package/commands/qc-review.md +0 -634
- package/commands/qc-review.tmpl +0 -53
- package/commands/qc-run-test.md +0 -750
- package/commands/qc-run-test.tmpl +0 -116
- package/commands/refine-prd.md +0 -1074
- package/commands/refine-prd.tmpl +0 -278
- package/commands/report-bug.md +0 -729
- package/commands/report-bug.tmpl +0 -148
- package/commands/review-code.md +0 -803
- package/commands/review-code.tmpl +0 -143
- package/commands/review-context.md +0 -1323
- package/commands/review-context.tmpl +0 -527
- package/commands/review-tech-docs.md +0 -982
- package/commands/review-tech-docs.tmpl +0 -401
- package/commands/setup-ai-first.md +0 -574
- package/commands/setup-ai-first.tmpl +0 -378
- package/commands/sync.md +0 -486
- package/commands/sync.tmpl +0 -384
- package/commands/update-framework.md +0 -290
- package/commands/update-framework.tmpl +0 -188
- package/commands/validate-traces.md +0 -1435
- package/commands/validate-traces.tmpl +0 -854
- package/hooks/data-guard.js +0 -141
- package/hooks/settings.json +0 -18
- package/modules/android-compose/module.yaml +0 -13
- package/modules/android-compose/stack-profile.yaml +0 -57
- package/modules/angular/architecture-snippets/component-patterns.md +0 -187
- package/modules/angular/module.yaml +0 -6
- package/modules/angular/stack-profile.yaml +0 -38
- package/modules/context-engineering/architecture-snippets/context-design.md +0 -119
- package/modules/context-engineering/module.yaml +0 -9
- package/modules/context-engineering/stack-profile.yaml +0 -61
- package/modules/dotnet/architecture-snippets/clean-arch.md +0 -160
- package/modules/dotnet/module.yaml +0 -6
- package/modules/dotnet/stack-profile.yaml +0 -50
- package/modules/flutter/module.yaml +0 -14
- package/modules/flutter/stack-profile.yaml +0 -59
- package/modules/golang/architecture-snippets/domain-layout.md +0 -283
- package/modules/golang/module.yaml +0 -6
- package/modules/golang/stack-profile.yaml +0 -40
- package/modules/ios-swiftui/module.yaml +0 -13
- package/modules/ios-swiftui/stack-profile.yaml +0 -55
- package/modules/java-spring/architecture-snippets/layered-arch.md +0 -201
- package/modules/java-spring/module.yaml +0 -15
- package/modules/java-spring/stack-profile.yaml +0 -28
- package/modules/nextjs/architecture-snippets/app-router-patterns.md +0 -269
- package/modules/nextjs/module.yaml +0 -14
- package/modules/nextjs/stack-profile.yaml +0 -74
- package/modules/nuxt/module.yaml +0 -14
- package/modules/nuxt/stack-profile.yaml +0 -58
- package/modules/phaser-game/architecture-snippets/phaser-scene-patterns.md +0 -646
- package/modules/phaser-game/module.yaml +0 -15
- package/modules/phaser-game/stack-profile.yaml +0 -90
- package/modules/php-laravel/architecture-snippets/service-repository.md +0 -302
- package/modules/php-laravel/module.yaml +0 -15
- package/modules/php-laravel/stack-profile.yaml +0 -56
- package/modules/qc-playwright/stack-profile.yaml +0 -66
- package/modules/react/architecture-snippets/hooks-query-patterns.md +0 -254
- package/modules/react/module.yaml +0 -14
- package/modules/react/stack-profile.yaml +0 -63
- package/modules/react-native/module.yaml +0 -14
- package/modules/react-native/stack-profile.yaml +0 -56
- package/modules/vue/module.yaml +0 -14
- package/modules/vue/stack-profile.yaml +0 -65
- package/rules/data-protection.md +0 -80
- package/rules/workflow.md +0 -73
- package/scripts/init.sh +0 -49
- package/scripts/upgrade.sh +0 -94
- package/skills/code/SKILL.md +0 -19
- package/skills/code/SKILL.tmpl +0 -19
- package/skills/debug/SKILL.md +0 -19
- package/skills/debug/SKILL.tmpl +0 -19
- package/skills/design-spec/SKILL.md +0 -11
- package/skills/design-spec/SKILL.tmpl +0 -11
- package/skills/discovery/SKILL.md +0 -14
- package/skills/discovery/SKILL.tmpl +0 -14
- package/skills/prd/SKILL.md +0 -19
- package/skills/prd/SKILL.tmpl +0 -19
- package/skills/qc/qa-analyst/DOC_GAPS.template.md +0 -63
- package/skills/qc/qa-analyst/acceptance-criteria.md +0 -60
- package/skills/qc/qa-analyst/business-rules.md +0 -59
- package/skills/qc/qa-analyst/data-flow.md +0 -64
- package/skills/qc/qa-analyst/spec-breakdown.md +0 -61
- package/skills/qc/qa-designer/e2e/journey.md +0 -41
- package/skills/qc/qa-designer/exploratory/charter.md +0 -68
- package/skills/qc/qa-designer/exploratory/explore-to-functional.md +0 -43
- package/skills/qc/qa-designer/functional/api.md +0 -45
- package/skills/qc/qa-designer/functional/gui-feature.md +0 -46
- package/skills/qc/qa-designer/functional/gui-screen.md +0 -52
- package/skills/qc/qa-designer/integration/api.md +0 -42
- package/skills/qc/qa-designer/integration/db.md +0 -39
- package/skills/qc/qa-designer/integration/gui.md +0 -40
- package/skills/qc/qa-designer/integration/kafka.md +0 -40
- package/skills/qc/qa-designer/non-functional.md +0 -40
- package/skills/qc/qa-planner/test-plan.md +0 -120
- package/skills/qc/qa-reviewer/script/e2e.md +0 -87
- package/skills/qc/qa-reviewer/script/exploratory.md +0 -45
- package/skills/qc/qa-reviewer/script/functional.md +0 -101
- package/skills/qc/qa-reviewer/script/integration.md +0 -91
- package/skills/qc/qa-reviewer/script/non-functional.md +0 -126
- package/skills/qc/qa-reviewer/test-case/e2e.md +0 -73
- package/skills/qc/qa-reviewer/test-case/exploratory.md +0 -43
- package/skills/qc/qa-reviewer/test-case/functional.md +0 -76
- package/skills/qc/qa-reviewer/test-case/integration.md +0 -69
- package/skills/qc/qa-reviewer/test-case/non-functional.md +0 -73
- package/skills/qc/qa-runner/e2e.md +0 -49
- package/skills/qc/qa-runner/exploratory/session.md +0 -36
- package/skills/qc/qa-runner/functional/api.md +0 -35
- package/skills/qc/qa-runner/functional/gui-feature.md +0 -51
- package/skills/qc/qa-runner/functional/gui-screen.md +0 -55
- package/skills/qc/qa-runner/integration.md +0 -47
- package/skills/qc/qa-runner/non-functional.md +0 -49
- package/skills/qc/qa-runner/report/report.md +0 -37
- package/skills/setup-ai-first/SKILL.md +0 -19
- package/skills/setup-ai-first/SKILL.tmpl +0 -19
- package/skills/spec/SKILL.md +0 -19
- package/skills/spec/SKILL.tmpl +0 -19
- package/skills/test/SKILL.md +0 -18
- package/skills/test/SKILL.tmpl +0 -18
- package/steps/business-language.md +0 -56
- package/steps/capture-lesson.md +0 -79
- package/steps/context-loader.md +0 -385
- package/steps/gate.md +0 -94
- package/steps/report-footer.md +0 -102
- package/steps/review-fanout.md +0 -159
- package/steps/spawn-agent.md +0 -129
- package/steps/trace-mirror.md +0 -53
- package/templates/README.md +0 -47
- package/templates/architecture.template.md +0 -394
- package/templates/design-spec.template.md +0 -217
- package/templates/feature.template +0 -123
- package/templates/platform-guide.template.md +0 -145
- package/templates/prd.template.md +0 -283
- package/templates/product-definition.template.md +0 -188
- package/templates/project-context.yaml +0 -212
- package/templates/tech-design.template.md +0 -490
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
# ============================================================
|
|
2
|
-
# @trace.id: {TICKET-ID}-UC{N}
|
|
3
|
-
# @trace.title: <Feature name>
|
|
4
|
-
# @trace.revision: 1 ← field tĩnh; version theo dõi bằng @trace.bdd_version
|
|
5
|
-
# @trace.domain: <domain>
|
|
6
|
-
# @trace.platform: {active_platform — web | app | system} ← BẮT BUỘC mọi mode; phải khớp segment bdd/{platform}/ của path
|
|
7
|
-
# @trace.service: {active_service — BẮT BUỘC mọi mode. "—" ở single-service/spec repo mode; "multi" nếu chưa chốt; "unresolved" nếu routing sai. Nguồn của cột TSV `service` — trace gộp không tách theo service nên đây là chỗ DUY NHẤT mang thông tin sở hữu}
|
|
8
|
-
# @trace.module: {active_module trong umbrella mode; "unknown" trong spec repo mode}
|
|
9
|
-
# @trace.status: draft
|
|
10
|
-
# @trace.author: AI-generated
|
|
11
|
-
# @trace.created_at: {YYYY-MM-DD}
|
|
12
|
-
# @trace.prd: {TICKET-ID}
|
|
13
|
-
# @trace.prd_version: {đọc từ metadata PRD "| **Version** |"}
|
|
14
|
-
# @trace.bdd_version: {cấp FILE — 1.0 nếu gen mới; tăng 0.1 khi gen lại. Khác @trace.sc_version (cấp từng SC) bên dưới}
|
|
15
|
-
# @trace.business_rules: {TICKET-ID}-UC{N}-BR{m}, {TICKET-ID}-UC{N}-BR{m+1} ← {m} lấy NGUYÊN từ PRD §3: BR đánh số LIÊN TỤC toàn PRD, KHÔNG reset theo UC
|
|
16
|
-
# @trace.dataset: {domain}.testdata.yaml
|
|
17
|
-
# ============================================================
|
|
18
|
-
|
|
19
|
-
# === CONTEXT ===
|
|
20
|
-
# Actor: <vai trò thực hiện hành động, vd: Consumer, Staff, System>
|
|
21
|
-
# Screens: <các màn liên quan, vd: Cart → Confirm Order → Order Detail>
|
|
22
|
-
# Entities: <business entity, vd: Order, OrderItem, Consumer>
|
|
23
|
-
# Pre-state: <state dùng chung trước khi vào các scenario>
|
|
24
|
-
|
|
25
|
-
# === SCOPE ===
|
|
26
|
-
# In: <UC này phủ gì>
|
|
27
|
-
# Out: <cái gì KHÔNG thuộc UC này — link tới UC/feature khác (R10)>
|
|
28
|
-
|
|
29
|
-
# === BUSINESS DEFINITION ===
|
|
30
|
-
# Tham chiếu nhanh các term dùng trong feature này. Chi tiết SoT: business-dictionary.md
|
|
31
|
-
# <Term 1>: <định nghĩa ngắn>
|
|
32
|
-
# <Term 2>: <định nghĩa ngắn>
|
|
33
|
-
#
|
|
34
|
-
# --- Popup/Modal Lifecycle (tùy chọn — BẮT BUỘC nếu feature là popup/modal; Pre-merge yêu cầu) ---
|
|
35
|
-
# - Open trigger: <khi nào popup hiển thị, vd: click menu sidebar>
|
|
36
|
-
# - Close trigger: <khi nào popup đóng, vd: F5 / click X / ESC / navigate away>
|
|
37
|
-
# - Refresh model: <data refresh khi nào, vd: mỗi lần open (NO CACHE) / persisted / polling>
|
|
38
|
-
# - State reset: <state nào reset khi đóng/mở lại, vd: pagination, expand, dropdown selection>
|
|
39
|
-
#
|
|
40
|
-
# --- Display Logic Matrix (tùy chọn — BẮT BUỘC nếu display logic phụ thuộc ≥2 chiều; Pre-merge yêu cầu) ---
|
|
41
|
-
# Liệt kê đủ ma trận N×M case + map mỗi case → SC. Tên SC theo pattern `<cấu trúc>: <outcome>` (KHÔNG dùng "(Case X)").
|
|
42
|
-
# | # | Dim1 | Dim2 | Format hiển thị | SC |
|
|
43
|
-
# |---|------|------|------------------------|------|
|
|
44
|
-
# | 1 | 0 | 0 | `Tên hàng` | SC{} |
|
|
45
|
-
# | 2 | 0 | 1 | `Tên hàng (đơn vị)` | SC{} |
|
|
46
|
-
# | ... | ... | ... | ... | ... |
|
|
47
|
-
|
|
48
|
-
Feature: <Feature name>
|
|
49
|
-
As a <role>
|
|
50
|
-
I want to <action>
|
|
51
|
-
So that <business value>
|
|
52
|
-
|
|
53
|
-
Background:
|
|
54
|
-
Given <precondition dùng chung — dùng alias từ dataset, không phải ID kỹ thuật>
|
|
55
|
-
|
|
56
|
-
# ==========================================================
|
|
57
|
-
# NHÓM 1: <Business theme> (<BR refs>)
|
|
58
|
-
# ==========================================================
|
|
59
|
-
|
|
60
|
-
# Side-effects: <liệt kê ngắn các Then side-effect cần verify>
|
|
61
|
-
# @trace.scenario: {TICKET-ID}-UC{N}-SC1
|
|
62
|
-
# @trace.sc_version: 1.0 ← cấp SCENARIO. Sửa thân SC này (tên/step/table/side-effect) thì +0.1, nếu không code cũ mãi hiện OK
|
|
63
|
-
# @trace.business_rules: {TICKET-ID}-UC{N}-BR{m}
|
|
64
|
-
@happy
|
|
65
|
-
Scenario: <mô tả business outcome — dùng động từ chính xác: create/receive/assign/block>
|
|
66
|
-
Given <input state — alias từ dataset>
|
|
67
|
-
When <single action>
|
|
68
|
-
Then <main observable outcome>
|
|
69
|
-
And <side-effect 1 khai báo trong header>
|
|
70
|
-
|
|
71
|
-
# Side-effects: <...>
|
|
72
|
-
# @trace.scenario: {TICKET-ID}-UC{N}-SC2
|
|
73
|
-
# @trace.sc_version: 1.0
|
|
74
|
-
# @trace.business_rules: {TICKET-ID}-UC{N}-BR{m}
|
|
75
|
-
@happy @alternative
|
|
76
|
-
Scenario: <cùng theme NHÓM 1 nhưng path khác — vd: giá trị enum khác>
|
|
77
|
-
Given <state>
|
|
78
|
-
When <action>
|
|
79
|
-
Then <outcome>
|
|
80
|
-
|
|
81
|
-
# ==========================================================
|
|
82
|
-
# NHÓM 2: <Business theme 2> (<BR refs>)
|
|
83
|
-
# ==========================================================
|
|
84
|
-
|
|
85
|
-
# Side-effects: <...>
|
|
86
|
-
# @trace.scenario: {TICKET-ID}-UC{N}-SC3
|
|
87
|
-
# @trace.sc_version: 1.0
|
|
88
|
-
# @trace.business_rules: {TICKET-ID}-UC{N}-BR{m+2}
|
|
89
|
-
@edge
|
|
90
|
-
Scenario: <scenario boundary / error>
|
|
91
|
-
Given <state>
|
|
92
|
-
When <action>
|
|
93
|
-
Then <expected error handling>
|
|
94
|
-
|
|
95
|
-
# === PRD COVERAGE (C.1 + C.2) ===
|
|
96
|
-
# AC mapping:
|
|
97
|
-
# AC1 (...) → SC1, SC2
|
|
98
|
-
# AC2 (...) → SC3
|
|
99
|
-
# BR mapping (mỗi bullet PHẢI có ≥1 SC — C.2):
|
|
100
|
-
# {TICKET-ID}-UC{N}-BR{m} (...) → SC1, SC2
|
|
101
|
-
# {TICKET-ID}-UC{N}-BR{m+2} (...) → SC3
|
|
102
|
-
# Wireframe mapping (mỗi component/action ≥1 SC — C.1):
|
|
103
|
-
# Screen "<screen name>":
|
|
104
|
-
# [x] <action 1> → SC1
|
|
105
|
-
# [x] <action 2> → SC2
|
|
106
|
-
# [ ] <action 3> → MISSING ← BLOCK MERGE
|
|
107
|
-
# Design Spec coverage (chỉ FE/App — C.1 mở rộng; bỏ khối này nếu không nạp design-spec):
|
|
108
|
-
# Screen "<screen>": loading → SC?, error → SC?, empty → SC?
|
|
109
|
-
# AC-UI behavioral: AC-UI3 (lỗi+khôi phục) → SC?, AC-UI4 (empty CTA) → SC?
|
|
110
|
-
# (bỏ AC-UI visual thuần: AC-UI1 khớp Figma, AC-UI5 WCAG — Designer/QA review riêng)
|
|
111
|
-
|
|
112
|
-
# === PRE-MERGE CHECKLIST ===
|
|
113
|
-
# - [ ] Mỗi SC có Side-effects + @trace.scenario + @trace.sc_version + @trace.business_rules
|
|
114
|
-
# - [ ] SỬA nội dung một SC (tên / step / data table / side-effect) → đã bump @trace.sc_version của
|
|
115
|
-
# CHÍNH SC đó (+0.1). Quên bump = code sinh từ SC cũ vẫn hiện OK, không ai biết phải regen.
|
|
116
|
-
# (Đổi @trace.business_rules / tag / comment → KHÔNG bump: không đổi hành vi cần implement.)
|
|
117
|
-
# - [ ] Coverage Matrix: 0 dòng MISSING (C.1)
|
|
118
|
-
# - [ ] FE/App: mỗi Screen State (≠default) + AC-UI behavioral của design-spec có ≥1 SC (C.1 mở rộng)
|
|
119
|
-
# - [ ] Mỗi AC/BR map tới ≥1 SC (C.2)
|
|
120
|
-
# - [ ] 0 banned term (C.4) — grep file trước khi merge
|
|
121
|
-
# - [ ] Feature ≥3 SC có NHÓM grouping theo business theme (C.5)
|
|
122
|
-
# - [ ] Nếu popup/modal: khai báo Popup/Modal Lifecycle trong BUSINESS DEFINITION
|
|
123
|
-
# - [ ] Nếu display logic ≥2 chiều: Display Logic Matrix trong BUSINESS DEFINITION
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
# Platform Guide — {{SERVICE_NAME}}
|
|
2
|
-
|
|
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
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# §1. Service Overview
|
|
10
|
-
|
|
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
|
-
**Team**: {{TEAM_NAME}}
|
|
15
|
-
**Repository**: {{REPO_URL}}
|
|
16
|
-
|
|
17
|
-
Trách nhiệm chính:
|
|
18
|
-
- {{RESPONSIBILITY_1}}
|
|
19
|
-
- {{RESPONSIBILITY_2}}
|
|
20
|
-
- {{RESPONSIBILITY_3}}
|
|
21
|
-
|
|
22
|
-
Service này KHÔNG xử lý:
|
|
23
|
-
- {{OUT_OF_SCOPE_1}} # vd: "Xử lý payment → xem payment-service"
|
|
24
|
-
- {{OUT_OF_SCOPE_2}}
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
# §2. Domain Model
|
|
29
|
-
|
|
30
|
-
Các entity chính và quan hệ của chúng:
|
|
31
|
-
|
|
32
|
-
```
|
|
33
|
-
{{ENTITY_1}} (aggregate root)
|
|
34
|
-
├── {{CHILD_ENTITY_1}} (value object / child entity)
|
|
35
|
-
└── {{CHILD_ENTITY_2}}
|
|
36
|
-
|
|
37
|
-
{{ENTITY_2}}
|
|
38
|
-
└── references {{ENTITY_1}} by ID
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
**{{ENTITY_1}}**:
|
|
42
|
-
- Field chính: {{KEY_FIELDS}}
|
|
43
|
-
- Vòng đời status: {{STATUS_1}} → {{STATUS_2}} → {{STATUS_3}}
|
|
44
|
-
- Business rule: {{KEY_RULE_1}}
|
|
45
|
-
|
|
46
|
-
**{{ENTITY_2}}**:
|
|
47
|
-
- Field chính: {{KEY_FIELDS}}
|
|
48
|
-
- Quan hệ: {{RELATIONSHIP_DESCRIPTION}}
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
# §3. Common Patterns
|
|
53
|
-
|
|
54
|
-
Các pattern riêng của service này (bổ sung cho chuẩn toàn dự án trong CLAUDE.md):
|
|
55
|
-
|
|
56
|
-
## {{PATTERN_NAME_1}}
|
|
57
|
-
```
|
|
58
|
-
// Khi nào dùng: {{USE_CASE}}
|
|
59
|
-
// Ví dụ:
|
|
60
|
-
{{CODE_EXAMPLE}}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## {{PATTERN_NAME_2}}
|
|
64
|
-
```
|
|
65
|
-
// Khi nào dùng: {{USE_CASE}}
|
|
66
|
-
// Ví dụ:
|
|
67
|
-
{{CODE_EXAMPLE}}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
# §4. Integration Points
|
|
73
|
-
|
|
74
|
-
## Upstream Dependencies (service này gọi các bên dưới)
|
|
75
|
-
|
|
76
|
-
| Service / System | Cái ta gọi | Protocol | Auth |
|
|
77
|
-
|------------------|--------------|----------|------|
|
|
78
|
-
| {{UPSTREAM_1}} | {{WHAT}} | REST/gRPC/Event | {{AUTH_METHOD}} |
|
|
79
|
-
| {{UPSTREAM_2}} | {{WHAT}} | REST/gRPC/Event | {{AUTH_METHOD}} |
|
|
80
|
-
|
|
81
|
-
## Downstream Consumers (các bên dưới gọi ta hoặc tiêu thụ event của ta)
|
|
82
|
-
|
|
83
|
-
| Consumer | Cái họ dùng | Protocol |
|
|
84
|
-
|----------|---------------|----------|
|
|
85
|
-
| {{DOWNSTREAM_1}} | {{WHAT}} | REST/Event |
|
|
86
|
-
| {{DOWNSTREAM_2}} | {{WHAT}} | REST/Event |
|
|
87
|
-
|
|
88
|
-
## Event phát ra (Produced)
|
|
89
|
-
|
|
90
|
-
| Tên event | Trigger | Tóm tắt payload |
|
|
91
|
-
|------------|---------|-----------------|
|
|
92
|
-
| {{EVENT_1}} | {{WHEN}} | {{PAYLOAD_FIELDS}} |
|
|
93
|
-
| {{EVENT_2}} | {{WHEN}} | {{PAYLOAD_FIELDS}} |
|
|
94
|
-
|
|
95
|
-
## Event tiêu thụ (Consumed)
|
|
96
|
-
|
|
97
|
-
| Tên event | Từ service | Ta làm gì với nó |
|
|
98
|
-
|------------|-------------|-------------------|
|
|
99
|
-
| {{EVENT_1}} | {{SOURCE}} | {{HANDLER_ACTION}} |
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
# §5. Known Constraints
|
|
104
|
-
|
|
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
|
-
- {{PERF_CONSTRAINT_2}}
|
|
108
|
-
|
|
109
|
-
## Ràng buộc business rule
|
|
110
|
-
- {{BUSINESS_CONSTRAINT_1}} # vd: "Không thể huỷ order sau khi đã ship"
|
|
111
|
-
- {{BUSINESS_CONSTRAINT_2}}
|
|
112
|
-
|
|
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
|
-
- {{EXTERNAL_DEP_2}}
|
|
116
|
-
|
|
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
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
# §6. Directory Structure
|
|
123
|
-
|
|
124
|
-
```
|
|
125
|
-
{{SERVICE_ROOT}}/
|
|
126
|
-
├── {{SOURCE_DIR}}/ # Code nguồn chính
|
|
127
|
-
│ ├── {{LAYER_1}}/ # vd: controller/ hoặc handler/
|
|
128
|
-
│ │ └── {{EXAMPLE_FILE}}
|
|
129
|
-
│ ├── {{LAYER_2}}/ # vd: service/ hoặc usecase/
|
|
130
|
-
│ │ └── {{EXAMPLE_FILE}}
|
|
131
|
-
│ ├── {{LAYER_3}}/ # vd: repository/ hoặc repo/
|
|
132
|
-
│ │ └── {{EXAMPLE_FILE}}
|
|
133
|
-
│ └── {{LAYER_4}}/ # vd: model/ hoặc domain/
|
|
134
|
-
│ └── {{EXAMPLE_FILE}}
|
|
135
|
-
├── {{TEST_DIR}}/ # Test phản chiếu cấu trúc src
|
|
136
|
-
├── specs/ # File BDD feature
|
|
137
|
-
│ └── bdd/
|
|
138
|
-
│ └── {{DOMAIN}}/
|
|
139
|
-
│ └── {{UC-ID}}-{{slug}}.feature
|
|
140
|
-
└── {{CONFIG_FILE}} # vd: application.yaml / appsettings.json
|
|
141
|
-
```
|
|
142
|
-
|
|
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,283 +0,0 @@
|
|
|
1
|
-
# {TICKET}-{N} {Feature Name}
|
|
2
|
-
|
|
3
|
-
<!--
|
|
4
|
-
Template này được sử dụng bởi workflow /generate-prd.
|
|
5
|
-
AI Agent sẽ điền các section dựa trên input từ PO.
|
|
6
|
-
Các placeholder {…} cần được thay thế bằng nội dung thực tế.
|
|
7
|
-
|
|
8
|
-
FORMAT BR: MẶC ĐỊNH bảng 3 cột — ID | Business Rule | Business Logic
|
|
9
|
-
(KHÔNG tách Business Logic ra khối riêng).
|
|
10
|
-
NGOẠI LỆ — MỞ CỘT: nếu MỌI BR trong một UC chia sẻ cùng một bộ thuộc tính lặp lại
|
|
11
|
-
(vd trigger / data / tần suất), promote các thuộc tính đó thành CỘT RIÊNG —
|
|
12
|
-
một bản ghi = một DÒNG. Dấu hiệu tự phát hiện: đang phải dùng <br/> để nhồi
|
|
13
|
-
NHIỀU HƠN MỘT bản ghi cùng cấu trúc vào một ô. Chi tiết + cảnh báo BR ID churn:
|
|
14
|
-
xem §3 "Business Rule" của template và mục "Hình dạng bảng Business Rule" của lệnh.
|
|
15
|
-
|
|
16
|
-
TERMINOLOGY:
|
|
17
|
-
- Tuân thủ 100% từ điển project: specs/domain-knowledge/business-dictionary.md
|
|
18
|
-
(KHÔNG dùng từ điển của project khác). Thay banned term bằng canonical term;
|
|
19
|
-
nếu phát hiện banned term trong input PO → thay + ghi chú trong "Giả định AI".
|
|
20
|
-
- Status/Enum values → tham chiếu core-entities.md (Enum Registry).
|
|
21
|
-
|
|
22
|
-
CROSS-REFERENCE (BẮT BUỘC): Bất kỳ chỗ nào nhắc đến một tính năng/ticket khác
|
|
23
|
-
(pre-condition, business rule, giả định, AC, hay bất kỳ section nào) → PHẢI gắn inline link:
|
|
24
|
-
[TICKET-ID khác](../{prd-slug-khác}/{TICKET-ID-khác}-{prd-slug-khác}.md)
|
|
25
|
-
Không để TICKET-ID dạng plain text nếu tồn tại file PRD tương ứng. (Mỗi PRD nằm trong feature-package riêng nên link trỏ sang folder anh em `../{prd-slug-khác}/`.)
|
|
26
|
-
Ngoài ra, ghi rõ quan hệ phụ thuộc trong "Tài liệu tham khảo" ở Appendix.
|
|
27
|
-
|
|
28
|
-
NEW TERM DETECTION: Nếu input PO xuất hiện thuật ngữ CHƯA CÓ trong business-dictionary.md
|
|
29
|
-
và lặp lại ≥ 2 lần → DỪNG lại, hỏi PO confirm trước khi tiếp tục:
|
|
30
|
-
+ Thuật ngữ đó nghĩa gì trong ngữ cảnh hệ thống?
|
|
31
|
-
+ English term chuẩn nên dùng là gì?
|
|
32
|
-
+ Có cần bổ sung vào business-dictionary.md không?
|
|
33
|
-
Sau khi PO confirm → cập nhật business-dictionary.md (nếu PO đồng ý) rồi mới tiếp tục.
|
|
34
|
-
|
|
35
|
-
NUMBERING:
|
|
36
|
-
- UC ID: {TICKET}-{N}-UC{n} (n bắt đầu từ 1, tăng theo từng use case)
|
|
37
|
-
- 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)
|
|
38
|
-
-->
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## Metadata
|
|
43
|
-
|
|
44
|
-
| Field | Value |
|
|
45
|
-
|---------------|------------------------------------------|
|
|
46
|
-
| **PRD ID** | {TICKET}-{N} |
|
|
47
|
-
| **Version** | 1.0 |
|
|
48
|
-
| **Status** | draft |
|
|
49
|
-
| **Author** | AI-assisted |
|
|
50
|
-
| **PO** | {tên PO} |
|
|
51
|
-
| **Domain** | {domain} |
|
|
52
|
-
| **Created** | {date} |
|
|
53
|
-
| **Updated** | {date} |
|
|
54
|
-
| **Ticket** | {TICKET}-{N}{ — nếu PO có link tracker thật, thêm bên cạnh: `{TICKET}-{N} ([Jira]({tracker_url}))`} |
|
|
55
|
-
| **API Source** | *(để trống nếu greenfield — chỉ điền `existing` khi PRD bọc một API đã chạy production)* |
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
# Feature
|
|
60
|
-
|
|
61
|
-
**{Feature Name}**
|
|
62
|
-
|
|
63
|
-
{Đ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.}
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
# 1. Tổng quan
|
|
68
|
-
|
|
69
|
-
## a. User Story
|
|
70
|
-
|
|
71
|
-
- **Là một (As a)** {persona}
|
|
72
|
-
- **Tôi muốn (I want to)** {action}
|
|
73
|
-
- **Để (So that)** {benefit}
|
|
74
|
-
|
|
75
|
-
## b. Phạm vi
|
|
76
|
-
|
|
77
|
-
> **Scope = ranh giới, KHÔNG phải đặc tả.** Mỗi mục một dòng ngắn "làm gì / không làm gì". Đừng nhét **cơ chế** (retry/timeout/nhánh lỗi → BR/BL) hay **định nghĩa thuật ngữ** (vd "điểm khởi tạo = …" → Business Definition / business-dictionary) vào đây.
|
|
78
|
-
|
|
79
|
-
**In Scope**
|
|
80
|
-
- {hạng mục trong phạm vi 1}
|
|
81
|
-
- {hạng mục trong phạm vi 2}
|
|
82
|
-
|
|
83
|
-
**Out of Scope** *(chỉ thêm khi có ranh giới cần nói rõ)*
|
|
84
|
-
- {hạng mục ngoài phạm vi + lý do / chủ sở hữu}
|
|
85
|
-
|
|
86
|
-
## c. Phụ thuộc liên service *(mức nghiệp vụ — KHÔNG mô tả API/event/kỹ thuật)*
|
|
87
|
-
|
|
88
|
-
> Kế thừa từ Product Definition Phase 1 ("Phụ thuộc liên service"). Nếu contract do đối tác phát triển song song (xem `API Source`), ghi phụ thuộc partner vào đây.
|
|
89
|
-
|
|
90
|
-
- {Cần {dữ liệu/năng lực} từ {feature/team/partner} — vì {lý do nghiệp vụ}} — hoặc "Không có"
|
|
91
|
-
|
|
92
|
-
## d. Quy ước *(TUỲ CHỌN — chỉ thêm khi tài liệu có quy ước áp dụng xuyên suốt; nếu không có → XOÁ HẲN section này)*
|
|
93
|
-
|
|
94
|
-
> Khai báo **MỘT LẦN** các quy ước áp dụng cho **mọi BR** ở §3. BR **KHÔNG** lặp lại nội dung đã khai ở đây,
|
|
95
|
-
> AC §2 **trỏ tới** quy ước thay vì chép lại. Đây là nơi chứa định nghĩa dùng chung, giá trị mặc định,
|
|
96
|
-
> và cách đọc các cột của bảng BR — những thứ trước đây bị xé nhỏ và lặp trong từng dòng.
|
|
97
|
-
>
|
|
98
|
-
> Phân biệt với **§1b Phạm vi** (ranh giới làm/không làm) và **business-dictionary** (định nghĩa thuật ngữ
|
|
99
|
-
> cấp domain, dùng chung nhiều PRD): §1d chỉ chứa quy ước **cục bộ của tài liệu này**.
|
|
100
|
-
|
|
101
|
-
- **{Tên quy ước}**: {nội dung áp dụng cho mọi BR bên dưới}
|
|
102
|
-
- **{Giá trị mặc định dùng chung}**: {…}
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
# 2. Acceptance Criteria
|
|
107
|
-
|
|
108
|
-
> Mỗi AC kế thừa liên kết "Bắt nguồn từ BR" của Product Definition (Phase 6), remap sang BR ID của PRD. Vì BR ID đã chứa số UC nên ref BR truy ngược được tới đúng UC.
|
|
109
|
-
>
|
|
110
|
-
> **1 AC = 1 tiêu chí NGHIỆM THU (outcome quan sát/kiểm được) + ref BR.** KHÔNG viết cơ chế trong AC (số lần retry, timeout, tên/chủ cờ, nhánh lỗi chi tiết) — cái đó thuộc **BR/BL** ở §3, AC chỉ trỏ tới. Nếu tiêu chí có **nhiều nhánh** → tách **bullet con** (mỗi ý một dòng), đừng dồn thành câu dài. Khi `/refine-prd` làm rõ thêm: chi tiết cơ chế → đẩy sang BR/BL; ở tầng AC thì tách bullet/AC mới — KHÔNG nối mệnh đề vào câu cũ (tránh AC thành "đoạn văn" và trùng BR).
|
|
111
|
-
|
|
112
|
-
**AC1:** {Tiêu chí nghiệm thu, văn xuôi, kiểm chứng được.} _(BR: {TICKET}-{N}-UC{n}-BR{m})_
|
|
113
|
-
|
|
114
|
-
**AC2:** {Tiêu chí có nhiều nhánh — tách bullet:} _(BR: {TICKET}-{N}-UC{n}-BR{m})_
|
|
115
|
-
- {nhánh/điều kiện 1 → kết quả kỳ vọng}
|
|
116
|
-
- {nhánh/điều kiện 2 → kết quả kỳ vọng}
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
# 3. Use Case
|
|
121
|
-
|
|
122
|
-
#### {TICKET}-{N}-UC1: {Tên use case}
|
|
123
|
-
|
|
124
|
-
**Actor:** {actor}
|
|
125
|
-
|
|
126
|
-
**Description:** {mô tả luồng}
|
|
127
|
-
|
|
128
|
-
**Pre-condition:**
|
|
129
|
-
- {điều kiện trước 1}
|
|
130
|
-
|
|
131
|
-
**Post-condition:**
|
|
132
|
-
- {kết quả sau 1}
|
|
133
|
-
|
|
134
|
-
**AC liên quan:** AC{x}, AC{y} *(các AC mà UC này thoả — phải đúng bằng tập AC có ref BR trỏ về UC này ở §2)*
|
|
135
|
-
|
|
136
|
-
**Business Rule**
|
|
137
|
-
|
|
138
|
-
> **Hình dạng bảng — mặc định 3 cột.** Dùng dạng này khi Business Logic là **văn xuôi** (mô tả luật bằng câu).
|
|
139
|
-
|
|
140
|
-
| ID | Business Rule | Business Logic |
|
|
141
|
-
|----|---------------|----------------|
|
|
142
|
-
| {TICKET}-{N}-UC1-BR1 | {luật ngắn gọn} | - {logic chi tiết, xuống dòng bằng `<br/>`}<br/>- {…} |
|
|
143
|
-
| {TICKET}-{N}-UC1-BR2 | {…} | - {…} |
|
|
144
|
-
|
|
145
|
-
<!--
|
|
146
|
-
NGOẠI LỆ — MỞ CỘT (dùng THAY cho bảng 3 cột ở trên, KHÔNG dùng cả hai):
|
|
147
|
-
|
|
148
|
-
Điều kiện kích hoạt: MỌI BR trong UC này chia sẻ CÙNG một bộ thuộc tính lặp lại.
|
|
149
|
-
Dấu hiệu tự phát hiện: đang phải dùng <br/> để nhồi NHIỀU HƠN MỘT bản ghi cùng
|
|
150
|
-
cấu trúc vào một ô Business Logic.
|
|
151
|
-
|
|
152
|
-
Khi kích hoạt: promote thuộc tính thành CỘT, một bản ghi = một DÒNG:
|
|
153
|
-
|
|
154
|
-
| ID | Business Rule | {Thuộc tính 1} | {Thuộc tính 2} | {Thuộc tính 3} |
|
|
155
|
-
|-----|---------------|----------------|----------------|----------------|
|
|
156
|
-
| BR1 | {luật ngắn} | {giá trị} | {giá trị} | {giá trị} |
|
|
157
|
-
| BR2 | {luật ngắn} | {giá trị} | {giá trị} | {giá trị} |
|
|
158
|
-
|
|
159
|
-
Hai cột ID + Business Rule LUÔN giữ (traceability phụ thuộc chúng). Chỉ cột
|
|
160
|
-
Business Logic được tách thành N cột. Giá trị dùng chung cho mọi dòng → đưa lên
|
|
161
|
-
§1d Quy ước, ĐỪNG lặp trong từng ô.
|
|
162
|
-
|
|
163
|
-
⚠️ CẢNH BÁO BR ID CHURN — đọc trước khi mở cột trên PRD ĐÃ TỒN TẠI:
|
|
164
|
-
Mở cột đúng nghĩa = một bản ghi một dòng ⇒ số BR TĂNG. Vì BR ID tăng liên tục
|
|
165
|
-
trên toàn PRD, chèn dòng ở giữa sẽ ĐÁNH SỐ LẠI mọi BR phía sau. Nếu PRD này đã có
|
|
166
|
-
BDD downstream, mọi tag `@trace.business_rules` trong .feature sẽ trỏ SAI trong im lặng.
|
|
167
|
-
→ Trước khi mở cột trên PRD đã có: kiểm tra `{specs_dir}/{domain}/{prd-slug}/bdd/`.
|
|
168
|
-
- Chưa có BDD → mở cột tự do.
|
|
169
|
-
- ĐÃ có BDD → DỪNG, báo người dùng: cần re-gen BDD sau khi đổi, hoặc giữ nguyên hình dạng cũ.
|
|
170
|
-
PRD sinh MỚI không bị ảnh hưởng (chưa có downstream).
|
|
171
|
-
-->
|
|
172
|
-
|
|
173
|
-
> **Note {BR ref}:** *(TUỲ CHỌN)* {giải thích **quyết định đã chốt** — vì sao luật này như vậy, ràng buộc
|
|
174
|
-
> nào dẫn tới nó, biên nào đã cân nhắc}. Đặt ngay sau bảng, cạnh nơi phát sinh.
|
|
175
|
-
>
|
|
176
|
-
> **Ranh giới với "Giả định AI" (Appendix):** Note = quyết định **đã chốt**, giải thích cho người đọc sau.
|
|
177
|
-
> Giả định AI = **độ vênh CẦN PO chốt**. Note **KHÔNG** được nuốt Giả định AI — nghi ngờ thì để ở Giả định AI.
|
|
178
|
-
|
|
179
|
-
---
|
|
180
|
-
|
|
181
|
-
#### {TICKET}-{N}-UC2: {Tên use case}
|
|
182
|
-
|
|
183
|
-
{lặp cấu trúc UC như trên; BR đánh số tiếp tục BR3, BR4…}
|
|
184
|
-
|
|
185
|
-
---
|
|
186
|
-
|
|
187
|
-
# 4. UI/UX Guidelines
|
|
188
|
-
|
|
189
|
-
## a. User Flow
|
|
190
|
-
|
|
191
|
-
```mermaid
|
|
192
|
-
flowchart TD
|
|
193
|
-
START(["{điểm bắt đầu}"]) --> A{"{điểm quyết định}"}
|
|
194
|
-
A -->|{nhánh}| B["{bước}"]
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
## b. Wireframe
|
|
198
|
-
|
|
199
|
-
> **KHÔNG nhân bản §3.** Wireframe liệt kê **màn + thành phần + hành động** — nó là nguồn coverage màn hình
|
|
200
|
-
> cho `/generate-bdd` (C.1), KHÔNG phải bản sao thứ hai của bảng Business Rule.
|
|
201
|
-
> Nếu một dòng Wireframe không thêm thông tin nào ngoài BR đã có → **tham chiếu BR ID, đừng chép nội dung**.
|
|
202
|
-
> Nếu cả §4b không thêm gì mới so với §3 → **xoá hẳn §4b** (hai nguồn sự thật cho cùng một dữ liệu sẽ lệch nhau
|
|
203
|
-
> ngay lần sửa đầu tiên).
|
|
204
|
-
|
|
205
|
-
### Screen 1: {Tên màn}
|
|
206
|
-
|
|
207
|
-
| Thành phần | Chi tiết |
|
|
208
|
-
|------------|----------|
|
|
209
|
-
| **Screen** | {tên/ngữ cảnh màn} |
|
|
210
|
-
| **Components** | - {thành phần 1}<br/>- {thành phần 2} |
|
|
211
|
-
| **Actions** | - {hành động 1 → kết quả}<br/>- {hành động 2 → kết quả} |
|
|
212
|
-
|
|
213
|
-
---
|
|
214
|
-
|
|
215
|
-
### Screen 2: {Tên màn}
|
|
216
|
-
|
|
217
|
-
{lặp bảng như trên cho từng màn}
|
|
218
|
-
|
|
219
|
-
---
|
|
220
|
-
|
|
221
|
-
# Appendix
|
|
222
|
-
|
|
223
|
-
## Input gốc từ PO
|
|
224
|
-
|
|
225
|
-
> {Trích nguyên văn input/ghi chú gốc của PO + đường dẫn product-definition nguồn.}
|
|
226
|
-
|
|
227
|
-
## Tài liệu tham khảo
|
|
228
|
-
|
|
229
|
-
- [{TICKET liên quan}](../{prd-slug-khác}/{TICKET-ID-khác}-{prd-slug-khác}.md) — {quan hệ: pre-condition / overlapping / related…}
|
|
230
|
-
- BDD: [`./bdd/`](./bdd/)
|
|
231
|
-
- Design spec: [`./design-spec/`](./design-spec/) — không áp dụng với feature thuần backend (không có màn hình)
|
|
232
|
-
- Từ điển nghiệp vụ: [`specs/domain-knowledge/business-dictionary.md`](../../domain-knowledge/business-dictionary.md)
|
|
233
|
-
- Domain knowledge: [`specs/domain-knowledge/{domain}.md`](../../domain-knowledge/{domain}.md)
|
|
234
|
-
|
|
235
|
-
## Existing API Contract *(CHỈ brownfield — điền khi API Source = existing; greenfield BỎ QUA cả section này)*
|
|
236
|
-
|
|
237
|
-
<!--
|
|
238
|
-
Chỉ dùng khi PRD bọc một API đã tồn tại trên hệ thống. PO ghi lại contract để:
|
|
239
|
-
- /generate-bdd (system) dùng trực tiếp làm input — không cần tổng hợp từ FE/App BDD;
|
|
240
|
-
- /generate-tech-docs chạy mode reverse-document (mô tả lại as-is, không design mới);
|
|
241
|
-
- /review-tech-docs bỏ qua cổng T7 cross-team sign-off (contract đã cố định).
|
|
242
|
-
Nếu greenfield (thiết kế mới) → xoá toàn bộ section này.
|
|
243
|
-
-->
|
|
244
|
-
|
|
245
|
-
| Method | Path | Auth | Request | Response |
|
|
246
|
-
|--------|------|------|---------|----------|
|
|
247
|
-
| {GET/POST/PUT/DELETE} | {/api/v1/path} | {Bearer / none} | `{ field: type }` | `{ field: type }` |
|
|
248
|
-
|
|
249
|
-
**Error responses:**
|
|
250
|
-
|
|
251
|
-
| HTTP Status | Error Code | Khi nào xảy ra |
|
|
252
|
-
|-------------|------------|----------------|
|
|
253
|
-
| {4xx/5xx} | {ERR_CODE} | {condition} |
|
|
254
|
-
|
|
255
|
-
## Giả định AI
|
|
256
|
-
|
|
257
|
-
> {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.}
|
|
258
|
-
|
|
259
|
-
- **Q1 — [AI DRAFT] {tiêu đề}:** {mô tả độ vênh + nguồn}. **Cần PO chốt {điều gì}.**
|
|
260
|
-
|
|
261
|
-
_(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.")_
|
|
262
|
-
|
|
263
|
-
---
|
|
264
|
-
|
|
265
|
-
# Change Log
|
|
266
|
-
|
|
267
|
-
> Hiện tại: **v1.0** ({date}) · Lịch sử đầy đủ → [changelog](./changelog/{TICKET}-{N}-{slug}.changelog.md) *(file kho chỉ tạo khi changelog vượt 5 version)*
|
|
268
|
-
|
|
269
|
-
<!-- Bảng phẳng, MỘT dòng/version, MỚI NHẤT TRÊN CÙNG. Chỉ giữ tối đa 5 version gần nhất ở đây;
|
|
270
|
-
cũ hơn → /refine-prd & /review-context tự dồn (rollover) sang file changelog/ ở link trên. -->
|
|
271
|
-
|
|
272
|
-
| Version | Date | Changes (UC/AC/BR bị ảnh hưởng) |
|
|
273
|
-
|---------|------|---------------------------------|
|
|
274
|
-
| 1.0 | {date} | Bản đầu — sinh từ product-definition. |
|
|
275
|
-
|
|
276
|
-
---
|
|
277
|
-
|
|
278
|
-
<!--
|
|
279
|
-
NEXT STEPS:
|
|
280
|
-
Khi PRD được approve (status: approved), chạy:
|
|
281
|
-
/generate-bdd "specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md"
|
|
282
|
-
để sinh BDD feature specs từ PRD này.
|
|
283
|
-
-->
|