@edupia-tutor/spec-driven-docs 0.14.7 → 0.14.9
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/generate-bdd.md +76 -8
- package/commands/generate-bdd.tmpl +56 -108
- package/commands/generate-code.md +18 -1
- package/commands/generate-code.tmpl +18 -1
- package/commands/generate-design-spec.md +35 -5
- package/commands/generate-design-spec.tmpl +35 -5
- package/commands/generate-prd.md +15 -5
- package/commands/generate-prd.tmpl +1 -0
- package/commands/generate-tech-docs.md +1 -0
- package/commands/generate-tech-docs.tmpl +1 -0
- package/commands/propose-scenario.md +6 -2
- package/commands/propose-scenario.tmpl +6 -2
- package/commands/qc-analyze.md +14 -0
- package/commands/qc-analyze.tmpl +14 -0
- package/commands/refine-prd.md +25 -6
- package/commands/refine-prd.tmpl +18 -6
- package/commands/review-context.md +27 -12
- package/commands/review-context.tmpl +20 -12
- package/commands/validate-traces.md +1 -0
- package/commands/validate-traces.tmpl +1 -0
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/generate-bdd.md +76 -8
- package/core/commands/generate-code.md +18 -1
- package/core/commands/generate-design-spec.md +35 -5
- package/core/commands/generate-prd.md +15 -5
- package/core/commands/generate-tech-docs.md +1 -0
- package/core/commands/propose-scenario.md +6 -2
- package/core/commands/qc-analyze.md +14 -0
- package/core/commands/refine-prd.md +25 -6
- package/core/commands/review-context.md +27 -12
- package/core/commands/validate-traces.md +1 -0
- package/core/skills/code/SKILL.md +7 -759
- package/core/skills/debug/SKILL.md +9 -859
- package/core/skills/design-spec/SKILL.md +3 -582
- package/core/skills/prd/SKILL.md +5 -464
- package/core/skills/setup-ai-first/SKILL.md +3 -208
- package/core/skills/spec/SKILL.md +7 -450
- package/core/skills/test/SKILL.md +10 -1290
- package/core/steps/review-fanout.md +7 -0
- package/core/steps/spawn-agent.md +12 -7
- package/core/templates/feature.template +83 -222
- package/core/templates/prd.template.md +14 -5
- package/core/templates/project-context.yaml +1 -1
- package/docs/01-getting-started/core-concepts.md +2 -2
- package/docs/01-getting-started/quickstart.md +4 -3
- package/docs/02-guides/bdd-input-checklist.md +68 -0
- package/docs/02-guides/developer/README.md +3 -0
- package/docs/02-guides/developer/bdd-and-trace.md +1 -0
- package/docs/02-guides/developer/commands.md +3 -3
- package/docs/02-guides/developer/pr-checklist.md +1 -0
- package/docs/02-guides/developer/workflow.md +2 -2
- package/docs/02-guides/prd-input-checklist.md +94 -0
- package/docs/02-guides/product-owner/README.md +3 -1
- package/docs/02-guides/product-owner/commands.md +1 -1
- package/docs/02-guides/tech-docs-input-checklist.md +82 -0
- package/docs/02-guides/tester/README.md +1 -1
- package/docs/02-guides/tester/bug-reporting.md +1 -1
- package/docs/02-guides/tester/qc-automation.md +1 -1
- package/docs/03-concepts/README.md +1 -0
- package/docs/03-concepts/mechanisms-explained.md +57 -0
- package/docs/03-concepts/pipeline.md +12 -9
- package/docs/03-concepts/traceability.md +4 -1
- package/docs/04-operations/bug-flow.md +2 -0
- package/docs/05-reference/command-cheatsheet.md +8 -8
- package/docs/05-reference/commands.md +12 -10
- package/docs/05-reference/trace-schema.md +2 -1
- package/package.json +1 -1
- package/skills/code/SKILL.md +7 -759
- package/skills/code/SKILL.tmpl +7 -164
- package/skills/debug/SKILL.md +9 -859
- package/skills/debug/SKILL.tmpl +9 -252
- package/skills/design-spec/SKILL.md +3 -582
- package/skills/design-spec/SKILL.tmpl +3 -87
- package/skills/prd/SKILL.md +5 -464
- package/skills/prd/SKILL.tmpl +5 -63
- package/skills/setup-ai-first/SKILL.md +3 -208
- package/skills/setup-ai-first/SKILL.tmpl +3 -108
- package/skills/spec/SKILL.md +7 -450
- package/skills/spec/SKILL.tmpl +7 -162
- package/skills/test/SKILL.md +10 -1290
- package/skills/test/SKILL.tmpl +10 -288
- package/steps/review-fanout.md +7 -0
- package/steps/spawn-agent.md +12 -7
- package/templates/feature.template +83 -222
- package/templates/prd.template.md +14 -5
- package/templates/project-context.yaml +1 -1
|
@@ -112,6 +112,13 @@ mới**, hoặc tới cap cứng **3 vòng**, cái nào đến trước:
|
|
|
112
112
|
List ONLY real, additional issues NOT already in the list — gaps, ambiguities,
|
|
113
113
|
contradictions, missing edge/negative paths, coverage holes, terminology drift,
|
|
114
114
|
structural omissions, and any issue that a fix to an existing finding would expose.
|
|
115
|
+
ALSO flag ROLE-BOUNDARY / altitude violations (you are NOT limited to adding detail):
|
|
116
|
+
content sitting in the WRONG section — detailed mechanism (retry counts, timeouts, flag
|
|
117
|
+
names/owners, error branches) written INSIDE an acceptance criterion or a scope line
|
|
118
|
+
instead of the Business Rule/Logic section; an AC that merely restates its referenced BR
|
|
119
|
+
(same content, converged); a term definition crammed into In/Out Scope. For these, the
|
|
120
|
+
suggestion must be to MOVE the detail to its proper section (AC keeps only the observable
|
|
121
|
+
outcome + BR ref) — NOT to delete it, and NOT to add more detail.
|
|
115
122
|
Do NOT repeat anything already listed. Return the same finding JSON shape, or [] if
|
|
116
123
|
nothing new.
|
|
117
124
|
```
|
|
@@ -71,14 +71,18 @@ Dựng payload và gọi Agent tool cho từng UC:
|
|
|
71
71
|
```json
|
|
72
72
|
{
|
|
73
73
|
"_agent_mode": true,
|
|
74
|
-
"command":
|
|
75
|
-
"uc_id":
|
|
76
|
-
"target_file":
|
|
77
|
-
"uc_section":
|
|
78
|
-
"context":
|
|
74
|
+
"command": "generate-bdd",
|
|
75
|
+
"uc_id": "{TICKET-ID}-UC{N}",
|
|
76
|
+
"target_file": "{đường dẫn tuyệt đối tới PRD hoặc feature file}",
|
|
77
|
+
"uc_section": { "line_start": {N}, "line_end": {N} },
|
|
78
|
+
"context": { "<context gọn từ Bước A>" },
|
|
79
|
+
"active_platform": "{web|app|system — platform orchestrator đã chọn ở Platform Selection}",
|
|
80
|
+
"design_coverage": { "<Screen States + AC-UI behavioral orchestrator đã trích ở 'Design Spec — Gate & Load' (B1); rỗng nếu BE / không có design-spec>" }
|
|
79
81
|
}
|
|
80
82
|
```
|
|
81
83
|
|
|
84
|
+
> **Truyền state orchestrator đã phân giải (quan trọng):** orchestrator (session chính) đã chạy các Guard + chọn platform + nạp design-spec MỘT LẦN *trước* khi spawn. Phải kèm `active_platform` và `design_coverage` vào payload để sub-agent áp đúng (đặc biệt phủ Screen States + AC-UI cho FE/App). KHÔNG kèm → sub-agent sinh BDD thiếu phần design (PRD lớn mất B1).
|
|
85
|
+
|
|
82
86
|
> **Phạm vi lệnh**: Chỉ `/generate-bdd` khởi động chế độ orchestration. `/generate-code` và `/dev-gen-test` có thể chạy như sub-agent (chúng tôn trọng `_agent_mode: true` từ Gate Bước 0), nhưng không spawn thêm sub-agent — phạm vi của chúng vốn đã là một UC duy nhất.
|
|
83
87
|
|
|
84
88
|
Serialize JSON này và truyền làm `$ARGUMENTS` khi gọi lệnh sub-agent.
|
|
@@ -108,8 +112,9 @@ Khi `gate.md Bước 0` phát hiện `_agent_mode: true`:
|
|
|
108
112
|
2. **Bỏ qua context-loader.md** — dùng trực tiếp `payload.context`
|
|
109
113
|
3. **Chỉ giới hạn ở `payload.uc_id`** — không xử lý các UC khác trong file
|
|
110
114
|
4. Chỉ đọc section PRD giữa `payload.uc_section.line_start` và `line_end`
|
|
111
|
-
5.
|
|
112
|
-
6.
|
|
115
|
+
5. **Dùng state orchestrator đã phân giải:** `active_platform` = `payload.active_platform`; `design_coverage` = `payload.design_coverage`. **KHÔNG chạy lại** các Guard (PRD approved / Design-Spec) hay tự nạp lại design-spec / hỏi platform — orchestrator đã làm một lần ở session chính.
|
|
116
|
+
6. Thực thi logic thường của lệnh cho riêng UC này (dùng `design_coverage` từ payload để phủ Screen States + AC-UI)
|
|
117
|
+
7. Trả về JSON kết quả có cấu trúc (định dạng Bước E ở trên)
|
|
113
118
|
|
|
114
119
|
---
|
|
115
120
|
|
|
@@ -1,259 +1,120 @@
|
|
|
1
1
|
# ============================================================
|
|
2
|
-
#
|
|
2
|
+
# @trace.id: {TICKET-ID}-UC{N}
|
|
3
|
+
# @trace.title: <Feature name>
|
|
4
|
+
# @trace.revision: 1 ← field tĩnh; dùng @trace.bdd_version để theo dõi version (tăng bởi /review-context --fix hoặc --resume)
|
|
5
|
+
# @trace.domain: <domain>
|
|
6
|
+
# @trace.platform: {active_platform — web | app | system | (bỏ trong umbrella mode)}
|
|
7
|
+
# @trace.service: {active_service — bỏ trong spec repo mode}
|
|
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: {1.0 nếu gen mới; tăng 0.1 khi gen lại — vd 1.0 → 1.1}
|
|
15
|
+
# @trace.business_rules: {TICKET-ID}-UC{N}-BR1, {TICKET-ID}-UC{N}-BR2
|
|
16
|
+
# @trace.dataset: {domain}.testdata.yaml
|
|
3
17
|
# ============================================================
|
|
4
|
-
# Instructions:
|
|
5
|
-
# 1. Copy this file và rename: {TICKET_ID}-UC{N}-feature-name.feature
|
|
6
|
-
# 2. Điền @trace metadata (required)
|
|
7
|
-
# 3. Khai báo Context của UC (1 lần, đầu file)
|
|
8
|
-
# 4. Tạo/cập nhật dataset YAML cùng domain: specs/features/{domain}.testdata.yaml
|
|
9
|
-
# 5. Viết Scenario — mỗi SC PHẢI có dòng `# Side-effects:` ngay trên
|
|
10
|
-
# 6. Đặt file ở: specs/features/{domain}/
|
|
11
|
-
# 7. Chạy: /generate-code
|
|
12
|
-
# ============================================================
|
|
13
|
-
#
|
|
14
|
-
# RULE VIẾT BDD BẮT BUỘC (xem bdd-writing-guide.md PART A + C):
|
|
15
|
-
# R1 Given/When/Then Semantics — Given=state, When=action, Then=outcome (mỗi SC đủ G/W/T)
|
|
16
|
-
# R2 One Behavior Per Scenario — 1 SC = 1 behavior; KHÔNG chain When-Then
|
|
17
|
-
# R3 Ubiquitous Language — KHÔNG dùng UI selector / API name / tech term
|
|
18
|
-
# R4 Outside-in Naming — Tên SC mô tả business outcome, KHÔNG có "click"/"(Case X)"/component name
|
|
19
|
-
# R5 Declarative over Imperative — Mô tả WHAT (intent business), KHÔNG HOW (UI mechanic)
|
|
20
|
-
# R6 Observable Outcomes Only — Then assert outcome quan sát được, KHÔNG UI trung gian/internal state
|
|
21
|
-
# R7 Key Examples / Concrete — Dùng concrete values, KHÔNG "hợp lệ" chung chung
|
|
22
|
-
# R8 Independence — SC chạy độc lập, KHÔNG phụ thuộc state SC khác
|
|
23
|
-
# R9 Test Data Completeness — Data table có đủ field external system để derive expected Then
|
|
24
|
-
# R10 Scope Boundary Explicit — Cross-UC reference dùng wording navigation + Note comment
|
|
25
|
-
# PROJECT COMPLIANCE (must-pass, fail review nếu thiếu):
|
|
26
|
-
# C.1 Wireframe Coverage — Mọi component/action wireframe có ≥1 SC
|
|
27
|
-
# C.2 PRD Traceability — Mọi AC/BR (kèm bullet) map về ≥1 SC
|
|
28
|
-
# C.3 Business Dictionary — Dùng đúng term, đề xuất term mới qua DICTIONARY-SUGGESTION
|
|
29
|
-
# C.4 Banned Terms Compliance — 0 banned term (auto-grep): SKU/Customer/JS SDK/Cửa hàng/...
|
|
30
|
-
# C.5 NHÓM Grouping Convention — Scenarios gom theo CHỦ ĐỀ NGHIỆP VỤ (NHÓM N) — xem §NHÓM GROUPING CONVENTION dưới
|
|
31
|
-
# ============================================================
|
|
32
|
-
|
|
33
|
-
# --- TRACE METADATA (REQUIRED) ---
|
|
34
|
-
# @trace.id: {TICKET_ID}-UC{N}
|
|
35
|
-
# @trace.title: <Tên tính năng bằng tiếng Việt>
|
|
36
|
-
# @trace.revision: 1
|
|
37
|
-
# @trace.domain: <identity|loyalty|membership|messaging|store-management>
|
|
38
|
-
# @trace.service: <KVLoyalty.Identity|KVLoyalty.Loyalty|...>
|
|
39
|
-
# @trace.status: draft|review|approved
|
|
40
|
-
# @trace.author: <tên tác giả>
|
|
41
|
-
# @trace.created_at: <YYYY-MM-DD>
|
|
42
|
-
# @trace.prd: <TICKET-ID hoặc để trống>
|
|
43
|
-
# @trace.prd_version: <version PRD tại thời điểm viết — để drift-detector so sánh>
|
|
44
|
-
# @trace.business_rules: <{TICKET_ID}-UC{N}-BR{M}, ...>
|
|
45
|
-
# @trace.dataset: <{domain}.testdata.yaml — bắt buộc nếu BDD reference dataset>
|
|
46
18
|
|
|
47
|
-
# === CONTEXT
|
|
19
|
+
# === CONTEXT ===
|
|
48
20
|
# Actor: <vai trò thực hiện hành động, vd: Consumer, Staff, System>
|
|
49
21
|
# Screens: <các màn liên quan, vd: Cart → Confirm Order → Order Detail>
|
|
50
|
-
# Entities: <entity
|
|
51
|
-
# Pre-state: <state chung trước khi vào các scenario>
|
|
22
|
+
# Entities: <business entity, vd: Order, OrderItem, Consumer>
|
|
23
|
+
# Pre-state: <state dùng chung trước khi vào các scenario>
|
|
52
24
|
|
|
53
25
|
# === SCOPE ===
|
|
54
|
-
# In: <
|
|
55
|
-
# Out: <
|
|
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)>
|
|
56
28
|
|
|
57
|
-
# === BUSINESS DEFINITION
|
|
58
|
-
#
|
|
59
|
-
#
|
|
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>
|
|
60
33
|
#
|
|
61
|
-
#
|
|
62
|
-
# <Term 2>: <định nghĩa>
|
|
63
|
-
# ...
|
|
64
|
-
#
|
|
65
|
-
# === Test data convention (R9) ===
|
|
66
|
-
# Khai báo default value khi data table không có cột tương ứng.
|
|
67
|
-
# VD: "SC không khai báo cột customerOrdered → ngầm hiểu customerOrdered = 0 (chưa có khách đặt)"
|
|
68
|
-
# VD: "SC không khai báo cột toggle → ngầm hiểu toggle = Hiện (default Ẩn/Hiện trạng thái)"
|
|
69
|
-
#
|
|
70
|
-
# === Popup/Modal Lifecycle (B.2.4 — bắt buộc nếu feature là popup/modal) ===
|
|
34
|
+
# --- Popup/Modal Lifecycle (tùy chọn — BẮT BUỘC nếu feature là popup/modal; Pre-merge yêu cầu) ---
|
|
71
35
|
# - Open trigger: <khi nào popup hiển thị, vd: click menu sidebar>
|
|
72
36
|
# - Close trigger: <khi nào popup đóng, vd: F5 / click X / ESC / navigate away>
|
|
73
37
|
# - Refresh model: <data refresh khi nào, vd: mỗi lần open (NO CACHE) / persisted / polling>
|
|
74
38
|
# - State reset: <state nào reset khi đóng/mở lại, vd: pagination, expand, dropdown selection>
|
|
75
|
-
|
|
76
|
-
# === DISPLAY LOGIC MATRIX (optional — bắt buộc nếu display logic phụ thuộc ≥2 dimension, B.1.7) ===
|
|
77
|
-
# Enumerate full matrix N×M case + map mỗi case → SC.
|
|
78
|
-
# Tên SC theo pattern: `<cấu trúc>: <outcome>` — KHÔNG dùng "(Case X)" suffix.
|
|
79
|
-
# VD ma trận `{số thuộc tính: 0/1/≥2} × {số đơn vị tính: 0/1/≥2}` = 9 case:
|
|
80
39
|
#
|
|
81
|
-
#
|
|
82
|
-
#
|
|
83
|
-
# |
|
|
84
|
-
#
|
|
85
|
-
# |
|
|
86
|
-
|
|
87
|
-
#
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
# - <Term 2> (xem dictionary line {M})
|
|
94
|
-
# - ...
|
|
95
|
-
|
|
96
|
-
Feature: <Tên tính năng bằng tiếng Việt>
|
|
97
|
-
Với vai trò là <vai trò>
|
|
98
|
-
Tôi muốn <hành động>
|
|
99
|
-
Để <lợi ích nghiệp vụ>
|
|
100
|
-
|
|
101
|
-
# --- DATASET REFERENCE CONVENTION ---
|
|
102
|
-
# Ưu tiên dùng ALIAS (tiếng Việt) thay vì ID kỹ thuật, để BDD dễ đọc.
|
|
103
|
-
# Backtick ID chỉ dùng khi cần precision (vd: assertion về mã đơn).
|
|
104
|
-
#
|
|
105
|
-
# Ví dụ:
|
|
106
|
-
# ✅ Given đơn hàng draft "Đơn COD giao hàng — 2× áo + 1× quần, total 650K"
|
|
107
|
-
# ✅ Then đơn được gán mã `ZMA{id}` nhận từ Retail
|
|
108
|
-
# ❌ Given đơn hàng draft là `ORD_COD_DRAFT_001` ← khó đọc, hạn chế
|
|
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>
|
|
109
52
|
|
|
110
53
|
Background:
|
|
111
|
-
Given
|
|
112
|
-
# Ví dụ: Given consumer "Khách mới đã cấp quyền Zalo" ở màn "Xác nhận đơn hàng"
|
|
113
|
-
# của gian hàng "Cửa hàng Thời Trang (đang kích hoạt)"
|
|
114
|
-
|
|
115
|
-
# ============================================================
|
|
116
|
-
# § NHÓM GROUPING CONVENTION (C.5 — bắt buộc cho mọi feature ≥3 SCs)
|
|
117
|
-
# ============================================================
|
|
118
|
-
# Mục đích: organize scenarios theo CHỦ ĐỀ NGHIỆP VỤ để dễ navigate + scope-awareness, KHÔNG
|
|
119
|
-
# theo phân loại happy/negative/edge (deprecated section markers HAPPY-PATH / NEGATIVE-CASE / EDGE-CASE).
|
|
120
|
-
#
|
|
121
|
-
# Quy tắc:
|
|
122
|
-
# 1. **Gom theo chủ đề business** — mỗi NHÓM = 1 business theme (flow / state / behavior subset).
|
|
123
|
-
# ✅ NHÓM 1: Khởi tạo gian hàng thành công với dữ liệu mặc định (BR1, BR2)
|
|
124
|
-
# ✅ NHÓM 2: Resume khi onboarding bị gián đoạn (BR1 resume)
|
|
125
|
-
# ✅ NHÓM 3: Xử lý lỗi khởi tạo (BR3)
|
|
126
|
-
# ❌ NHÓM 1: HAPPY-PATH ← chia theo loại path, không phải chủ đề
|
|
127
|
-
# ❌ NHÓM 1: COD scenarios ← UI feature, không phải business theme
|
|
128
|
-
#
|
|
129
|
-
# 2. **Mỗi NHÓM có thể chứa cả @happy + @edge + @negative SCs cùng chủ đề** — KHÔNG tách happy/edge ra 2 NHÓM riêng.
|
|
130
|
-
# Ví dụ: NHÓM "Xử lý lỗi khi khởi tạo" chứa SC happy retry + SC edge X close + SC negative no retry.
|
|
131
|
-
# Tag taxonomy (@happy/@edge/@cross-system per B.2.3) áp dụng ở SC level — KHÔNG ở NHÓM level.
|
|
132
|
-
#
|
|
133
|
-
# 3. **Format NHÓM header** (3 dòng comment box):
|
|
134
|
-
# # ==========================================================
|
|
135
|
-
# # NHÓM N: <Chủ đề> (<BR refs nếu áp dụng>)
|
|
136
|
-
# # ==========================================================
|
|
137
|
-
# Indent 2 spaces (cùng level với Background + Scenario).
|
|
138
|
-
#
|
|
139
|
-
# 4. **Đánh số NHÓM tuần tự** từ 1 → N. Không skip số. Reorder NHÓM được — KHÔNG ảnh hưởng SC IDs.
|
|
140
|
-
#
|
|
141
|
-
# 5. **SC trong NHÓM KHÔNG cần theo thứ tự ID** — VD NHÓM 2 có thể chứa SC8, SC4, SC11 nếu cùng chủ đề.
|
|
142
|
-
# SC IDs tuần tự theo lifecycle (skill §3.4), KHÔNG theo NHÓM ordering.
|
|
143
|
-
#
|
|
144
|
-
# 6. **Khi nào skip NHÓM**: feature có <3 SCs → có thể bỏ NHÓM headers (không value to organize so few).
|
|
145
|
-
# Đơn giản đặt SCs nối tiếp sau Background. Feature ≥3 SCs → BẮT BUỘC NHÓM.
|
|
146
|
-
#
|
|
147
|
-
# Pattern thường gặp (gợi ý theme — tuỳ chỉnh per UC):
|
|
148
|
-
# - "Khởi tạo / Lưu thành công — các tổ hợp data hợp lệ" (gom happy + alternative)
|
|
149
|
-
# - "Validation / Chặn lưu khi không hợp lệ" (gom negative + edge validation)
|
|
150
|
-
# - "Xử lý lỗi — API fail / system error" (gom negative + recovery)
|
|
151
|
-
# - "Hủy thay đổi / Đóng modal không lưu" (gom edge UX)
|
|
152
|
-
# - "Hành vi popup / dialog — multi-select / persist / boundary" (gom edge UX behavior)
|
|
153
|
-
# - "Hiệu ứng cross-system / Consumer view" (gom @cross-system SCs)
|
|
154
|
-
# - "Idempotency & Concurrency" (gom edge concurrency)
|
|
155
|
-
# - "State transition / Recovery completion" (gom @cross-UC behavior chains)
|
|
156
|
-
#
|
|
157
|
-
# Ví dụ NHÓM structure cho UC có 9 SCs (LOYAL-32-UC1 reference):
|
|
158
|
-
# NHÓM 1: Lưu cấu hình thành công — các tổ hợp PTTT hợp lệ (BR1, BR2) → SC1, SC2, SC3, SC4
|
|
159
|
-
# NHÓM 2: Chặn lưu khi cấu hình không hợp lệ (BR1, BR2) + lỗi hệ thống → SC5, SC6, SC7
|
|
160
|
-
# NHÓM 3: Hủy thay đổi — đóng Modal không lưu → SC8
|
|
161
|
-
# NHÓM 4: Initial State — Modal phản ánh cấu hình hiện tại → SC10
|
|
54
|
+
Given <precondition dùng chung — dùng alias từ dataset, không phải ID kỹ thuật>
|
|
162
55
|
|
|
163
56
|
# ==========================================================
|
|
164
|
-
# NHÓM 1: <
|
|
57
|
+
# NHÓM 1: <Business theme> (<BR refs>)
|
|
165
58
|
# ==========================================================
|
|
166
59
|
|
|
167
|
-
# Side-effects: <liệt kê
|
|
168
|
-
# @trace.scenario: {
|
|
60
|
+
# Side-effects: <liệt kê ngắn các Then side-effect cần verify>
|
|
61
|
+
# @trace.scenario: {TICKET-ID}-UC{N}-SC1
|
|
169
62
|
# @trace.sc_version: 1.0
|
|
170
|
-
# @trace.business_rules: {
|
|
63
|
+
# @trace.business_rules: {TICKET-ID}-UC{N}-BR1
|
|
171
64
|
@happy
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
And <side-effect 1 đã khai báo ở header>
|
|
178
|
-
And <side-effect 2 đã khai báo ở header>
|
|
179
|
-
# ... đủ với danh sách Side-effects ở trên (Rule R2)
|
|
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>
|
|
180
70
|
|
|
181
71
|
# Side-effects: <...>
|
|
182
|
-
# @trace.scenario: {
|
|
72
|
+
# @trace.scenario: {TICKET-ID}-UC{N}-SC2
|
|
183
73
|
# @trace.sc_version: 1.0
|
|
184
|
-
# @trace.business_rules: {
|
|
74
|
+
# @trace.business_rules: {TICKET-ID}-UC{N}-BR1
|
|
185
75
|
@happy @alternative
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
Then <kết quả>
|
|
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>
|
|
191
80
|
|
|
192
81
|
# ==========================================================
|
|
193
|
-
# NHÓM 2: <
|
|
82
|
+
# NHÓM 2: <Business theme 2> (<BR refs>)
|
|
194
83
|
# ==========================================================
|
|
195
84
|
|
|
196
85
|
# Side-effects: <...>
|
|
197
|
-
# @trace.scenario: {
|
|
86
|
+
# @trace.scenario: {TICKET-ID}-UC{N}-SC3
|
|
198
87
|
# @trace.sc_version: 1.0
|
|
199
|
-
# @trace.business_rules: {
|
|
88
|
+
# @trace.business_rules: {TICKET-ID}-UC{N}-BR2
|
|
200
89
|
@edge
|
|
90
|
+
Scenario: <scenario boundary / error>
|
|
91
|
+
Given <state>
|
|
92
|
+
When <action>
|
|
93
|
+
Then <expected error handling>
|
|
201
94
|
|
|
202
|
-
|
|
203
|
-
Given <state đầu vào>
|
|
204
|
-
When <hành động>
|
|
205
|
-
Then <xử lý lỗi mong đợi>
|
|
206
|
-
|
|
207
|
-
# ==========================================================
|
|
208
|
-
# NHÓM 3: <Chủ đề business 3 — VD: Cross-system / Hiệu ứng downstream> (<BR refs>)
|
|
209
|
-
# ==========================================================
|
|
210
|
-
|
|
211
|
-
# Side-effects: <...>
|
|
212
|
-
# @trace.scenario: {TICKET_ID}-UC{N}-SC4
|
|
213
|
-
# @trace.sc_version: 1.0
|
|
214
|
-
# @trace.business_rules: {TICKET_ID}-UC{N}-BR{M}
|
|
215
|
-
@happy @cross-system
|
|
216
|
-
|
|
217
|
-
Scenario: <Scenario span ≥2 service hoặc hiệu ứng đồng bộ cross-UC>
|
|
218
|
-
Given <state đầu vào>
|
|
219
|
-
When <hành động>
|
|
220
|
-
Then <kết quả tại service A>
|
|
221
|
-
And <kết quả đồng bộ sang service B>
|
|
222
|
-
|
|
223
|
-
# === TECHNICAL HINTS (optional, giúp AI gen code chính xác hơn) ===
|
|
224
|
-
# Dependencies: <UC/service phụ thuộc, vd: LOYAL-28 upstream>
|
|
225
|
-
# Entities: <Entity1, Entity2>
|
|
226
|
-
# Events: <EventName> (publish to <topic>)
|
|
227
|
-
# Cache: <cache invalidation notes>
|
|
228
|
-
# Validation: <validation rules>
|
|
229
|
-
|
|
230
|
-
# === PRD COVERAGE (C.1 + C.2 — wireframe action + AC/BR checklist) ===
|
|
95
|
+
# === PRD COVERAGE (C.1 + C.2) ===
|
|
231
96
|
# AC mapping:
|
|
232
97
|
# AC1 (...) → SC1, SC2
|
|
233
98
|
# AC2 (...) → SC3
|
|
234
|
-
# BR mapping (mỗi bullet
|
|
235
|
-
# BR1 (...) → SC1
|
|
236
|
-
# BR2 (...) →
|
|
237
|
-
# Wireframe mapping (
|
|
238
|
-
# Screen "<
|
|
239
|
-
# [x]
|
|
240
|
-
# [x]
|
|
241
|
-
# [ ]
|
|
242
|
-
#
|
|
243
|
-
#
|
|
244
|
-
#
|
|
245
|
-
#
|
|
246
|
-
|
|
247
|
-
# ===
|
|
248
|
-
#
|
|
249
|
-
#
|
|
250
|
-
|
|
251
|
-
#
|
|
252
|
-
# - [ ]
|
|
253
|
-
# - [ ]
|
|
254
|
-
# - [ ]
|
|
255
|
-
# - [ ]
|
|
256
|
-
# - [ ] Nếu là popup/modal: Popup/Modal Lifecycle khai báo trong BUSINESS DEFINITION (B.2.4)
|
|
257
|
-
# - [ ] Nếu display logic ≥2 dimension: Display Logic Matrix enumerated (B.1.7)
|
|
258
|
-
# - [ ] Feature ≥3 SCs có NHÓM grouping theo chủ đề business (C.5) — KHÔNG dùng section markers cũ HAPPY-PATH/NEGATIVE-CASE/EDGE-CASE
|
|
259
|
-
# - [ ] /review-context score ≥90 (project gate)
|
|
99
|
+
# BR mapping (mỗi bullet PHẢI có ≥1 SC — C.2):
|
|
100
|
+
# {TICKET-ID}-UC{N}-BR1 (...) → SC1, SC2
|
|
101
|
+
# {TICKET-ID}-UC{N}-BR2 (...) → 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
|
+
# - [ ] Coverage Matrix: 0 dòng MISSING (C.1)
|
|
115
|
+
# - [ ] FE/App: mỗi Screen State (≠default) + AC-UI behavioral của design-spec có ≥1 SC (C.1 mở rộng)
|
|
116
|
+
# - [ ] Mỗi AC/BR map tới ≥1 SC (C.2)
|
|
117
|
+
# - [ ] 0 banned term (C.4) — grep file trước khi merge
|
|
118
|
+
# - [ ] Feature ≥3 SC có NHÓM grouping theo business theme (C.5)
|
|
119
|
+
# - [ ] Nếu popup/modal: khai báo Popup/Modal Lifecycle trong BUSINESS DEFINITION
|
|
120
|
+
# - [ ] Nếu display logic ≥2 chiều: Display Logic Matrix trong BUSINESS DEFINITION
|
|
@@ -69,6 +69,8 @@
|
|
|
69
69
|
|
|
70
70
|
## b. Phạm vi
|
|
71
71
|
|
|
72
|
+
> **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.
|
|
73
|
+
|
|
72
74
|
**In Scope**
|
|
73
75
|
- {hạng mục trong phạm vi 1}
|
|
74
76
|
- {hạng mục trong phạm vi 2}
|
|
@@ -87,10 +89,14 @@
|
|
|
87
89
|
# 2. Acceptance Criteria
|
|
88
90
|
|
|
89
91
|
> 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.
|
|
92
|
+
>
|
|
93
|
+
> **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).
|
|
90
94
|
|
|
91
95
|
**AC1:** {Tiêu chí nghiệm thu, văn xuôi, kiểm chứng được.} _(BR: {TICKET}-{N}-UC{n}-BR{m})_
|
|
92
96
|
|
|
93
|
-
**AC2:** {
|
|
97
|
+
**AC2:** {Tiêu chí có nhiều nhánh — tách bullet:} _(BR: {TICKET}-{N}-UC{n}-BR{m})_
|
|
98
|
+
- {nhánh/điều kiện 1 → kết quả kỳ vọng}
|
|
99
|
+
- {nhánh/điều kiện 2 → kết quả kỳ vọng}
|
|
94
100
|
|
|
95
101
|
---
|
|
96
102
|
|
|
@@ -197,11 +203,14 @@ _(Nếu không có độ vênh: ghi "Không có — toàn bộ nội dung đã
|
|
|
197
203
|
|
|
198
204
|
# Change Log
|
|
199
205
|
|
|
200
|
-
|
|
206
|
+
> 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)*
|
|
207
|
+
|
|
208
|
+
<!-- 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;
|
|
209
|
+
cũ hơn → /refine-prd & /review-context tự dồn (rollover) sang file changelog/ ở link trên. -->
|
|
201
210
|
|
|
202
|
-
|
|
|
203
|
-
|
|
204
|
-
|
|
|
211
|
+
| Version | Date | Changes (UC/AC/BR bị ảnh hưởng) |
|
|
212
|
+
|---------|------|---------------------------------|
|
|
213
|
+
| 1.0 | {date} | Bản đầu — sinh từ product-definition. |
|
|
205
214
|
|
|
206
215
|
---
|
|
207
216
|
|
|
@@ -35,7 +35,7 @@ paths:
|
|
|
35
35
|
# prd-slug is derived from the PRD folder path — not a separate config variable.
|
|
36
36
|
specs_dir: "specs"
|
|
37
37
|
templates_dir: "specs/templates"
|
|
38
|
-
feature_template: "
|
|
38
|
+
feature_template: ".agent/templates/feature.template" # SoT skeleton .feature (dùng bởi /generate-bdd qua {{include}})
|
|
39
39
|
bdd_writing_guide: "specs/templates/bdd-writing-guide.md"
|
|
40
40
|
trace_report: "specs/.trace/trace-report.md"
|
|
41
41
|
|
|
@@ -18,7 +18,7 @@ Các khái niệm cốt lõi trong 5 phút. Đào sâu hơn ở [../03-concepts]
|
|
|
18
18
|
|
|
19
19
|
- Con người định nghĩa *WHAT* — acceptance criteria, business rules, platform requirements.
|
|
20
20
|
- AI sinh ra *HOW* — BDD scenarios, tech design, code, tests — thích ứng theo platform.
|
|
21
|
-
- Mỗi artifact được review trước khi sang phase kế tiếp
|
|
21
|
+
- Mỗi artifact được review (AI tìm findings) rồi **người duyệt** (đặt `Status` / `@trace.status: approved`) trước khi sang phase kế tiếp; sửa nội dung sau khi duyệt → tự về `draft`. Lệnh tiêu thụ **cảnh báo mềm** nếu nguồn chưa approved.
|
|
22
22
|
- Mỗi dòng code truy ngược về một scenario trong file `.feature`.
|
|
23
23
|
|
|
24
24
|
**PRD platform-agnostic (Option C):** một PRD phục vụ mọi platform — chỉ mô tả nghiệp vụ, không có chi tiết UI hay API. FE/App đọc PRD → Design Spec → BDD; BE đọc PRD trực tiếp → BDD. Thêm platform mới sau không cần sửa PRD.
|
|
@@ -50,7 +50,7 @@ Mỗi artifact link tới artifact khác qua `@trace.*` tags:
|
|
|
50
50
|
|
|
51
51
|
```
|
|
52
52
|
product-definition.md
|
|
53
|
-
└─► PRD.md (Service, Module
|
|
53
|
+
└─► PRD.md (Domain, Status, Service, Module — bảng Metadata)
|
|
54
54
|
└─► specs/{domain}/{prd-slug}/bdd/{web|app|system}/{UC-ID}.feature (@trace.prd_version)
|
|
55
55
|
└─► specs/{domain}/{prd-slug}/tech-docs/{UC-ID}-tech-design*.md (@trace.bdd_version)
|
|
56
56
|
└─► src/ code — service submodule (@trace.implements)
|
|
@@ -45,16 +45,17 @@ Discovery → PRD → BDD → Tech Design → Code → Dev self-check:
|
|
|
45
45
|
→ specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md
|
|
46
46
|
/refine-prd specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md # AI suggestions → Review Board
|
|
47
47
|
/refine-prd --resume specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md # apply + bump version
|
|
48
|
-
/review-context specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md # quality gate (
|
|
48
|
+
/review-context specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md # quality gate (P0–P5)
|
|
49
49
|
/review-context --resume specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md
|
|
50
|
-
→ ✅
|
|
50
|
+
→ ✅ 0 critical → PO đặt | **Status** | approved | trong Metadata → tiếp Phase 3
|
|
51
51
|
|
|
52
52
|
# PHASE 3 — SPEC & DESIGN
|
|
53
53
|
# (FE/App only) /generate-design-spec specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md → designer + PO sign-off
|
|
54
54
|
/generate-bdd specs/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md
|
|
55
55
|
→ specs/{domain}/{prd-slug}/bdd/{UC-ID}.feature
|
|
56
56
|
/review-context specs/{domain}/{prd-slug}/bdd/{UC-ID}.feature
|
|
57
|
-
/review-context --resume specs/{domain}/{prd-slug}/bdd/{UC-ID}.feature # apply + bump bdd_version
|
|
57
|
+
/review-context --resume specs/{domain}/{prd-slug}/bdd/{UC-ID}.feature # apply + bump bdd_version + reset @trace.status draft
|
|
58
|
+
→ ✅ 0 critical → đặt # @trace.status: approved trong .feature → tiếp Tech Design
|
|
58
59
|
/generate-tech-docs specs/{domain}/{prd-slug}/bdd/{UC-ID}.feature
|
|
59
60
|
→ specs/{domain}/{prd-slug}/tech-docs/{UC-ID}-tech-design.md
|
|
60
61
|
/review-tech-docs specs/{domain}/{prd-slug}/tech-docs/{UC-ID}-tech-design.md
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
[📚 Docs](../README.md) › [Guides](README.md) › Checklist Input BDD (System/BE)
|
|
2
|
+
|
|
3
|
+
# Checklist Input BDD (System / BE) — Để BDD Chuẩn Ngay Lần Đầu
|
|
4
|
+
|
|
5
|
+
> Áp cho `/generate-bdd` khi chọn platform **`system`** (BDD cho BE). Chuẩn bị đúng đầu vào để không phải sinh lại.
|
|
6
|
+
|
|
7
|
+
## Hiểu trước cho đúng: System BDD có HAI kiểu sinh
|
|
8
|
+
|
|
9
|
+
Khi chọn platform `system`, lệnh tự phân loại:
|
|
10
|
+
|
|
11
|
+
- **BE thuần** (feature không có web/app) → System BDD **sinh thẳng từ PRD** (AC / Business Rules / Business Logic).
|
|
12
|
+
- **BE trong feature đa-platform** → System BDD **tổng hợp từ web + app BDD đã có** (BE suy ra để phục vụ các luồng client).
|
|
13
|
+
|
|
14
|
+
→ Biết mình ở kiểu nào mới chuẩn bị đúng.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Phần CHUNG — cả hai kiểu đều cần
|
|
19
|
+
|
|
20
|
+
**1. PRD đã duyệt + Luật/AC rõ ràng** *(đòn bẩy số 1)*
|
|
21
|
+
System BDD phủ **mỗi AC và mỗi Business Rule → ít nhất 1 scenario**. PRD mơ hồ ở Business Rules / Logic = BDD mơ hồ. Đây là chỗ quyết định nhiều nhất.
|
|
22
|
+
|
|
23
|
+
**2. Loại API đã chốt đúng trong PRD**
|
|
24
|
+
- **"Đã có sẵn"** (brownfield) → bảng **Existing API Contract trong PRD phải đầy đủ**, không còn dấu "⛔ còn thiếu". Lệnh dùng bảng này làm chuẩn và **bỏ qua bước tổng hợp**. Còn thiếu = BDD dễ bịa / sai shape.
|
|
25
|
+
- **"Tự làm mới"** → contract thiết kế sau; BDD chỉ tả hành vi nghiệp vụ.
|
|
26
|
+
|
|
27
|
+
**3. Từ điển + danh sách thực thể đã cập nhật**
|
|
28
|
+
System BDD viết bằng **ngôn ngữ sự kiện nghiệp vụ** ("hệ thống nhận X → trả về Y"), **không** dùng từ giao diện (click/tap), **không** chốt cứng shape JSON kỹ thuật. Tên thực thể / trường / enum phải đúng `core-entities.md`.
|
|
29
|
+
|
|
30
|
+
**4. Domain khớp cấu hình service** *(chế độ umbrella)*
|
|
31
|
+
Domain trong PRD phải khớp một service trong config; lệch là lệnh **dừng**.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Phần RIÊNG theo kiểu
|
|
36
|
+
|
|
37
|
+
### Nếu BE trong feature đa-platform (tổng hợp)
|
|
38
|
+
|
|
39
|
+
**5. Đã sinh web + app BDD TRƯỚC — đúng thứ tự outside-in**
|
|
40
|
+
Nếu sinh `system` khi **chưa có** web/app BDD → lệnh tưởng là "BE thuần", sinh từ PRD và **bỏ lỡ** các kỳ vọng client thật (token, profile, redirect…). Phải theo thứ tự **web → app → system**.
|
|
41
|
+
|
|
42
|
+
**6. Sẵn sàng quyết "xung đột cross-platform"**
|
|
43
|
+
Nếu web và app **kỳ vọng khác nhau** (response / lỗi / luật) → lệnh **dừng ở CHECKPOINT** bắt PO chọn cách hoà: gộp chung / phân biệt theo platform / tách endpoint. Web+app BDD nên nhất quán, hoặc PO sẵn sàng quyết ngay — nếu không sẽ tắc.
|
|
44
|
+
|
|
45
|
+
### Nếu BE thuần
|
|
46
|
+
|
|
47
|
+
Bỏ qua câu 5–6. Dồn lực vào câu 1–3: PRD Business Rules / Logic + contract + thực thể.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Checklist nhanh — trước khi `/generate-bdd` (system)
|
|
52
|
+
|
|
53
|
+
- [ ] PRD `approved`, mỗi AC/BR đủ rõ để suy ra scenario
|
|
54
|
+
- [ ] Loại API đã chốt; brownfield → bảng Existing API Contract **đầy đủ** (hết ⛔)
|
|
55
|
+
- [ ] `business-dictionary` + `core-entities` cập nhật (sự kiện / thực thể)
|
|
56
|
+
- [ ] Domain khớp cấu hình service (umbrella)
|
|
57
|
+
- [ ] *(đa-platform)* web + app BDD đã sinh + review **trước** system
|
|
58
|
+
- [ ] *(đa-platform)* sẵn sàng quyết xung đột cross-platform
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Sau khi sinh BDD
|
|
63
|
+
|
|
64
|
+
`/review-context` (BDD) bắt nốt sạn (coverage, Gherkin R1–R10, thuật ngữ); khi 0 critical → người duyệt đặt `# @trace.status: approved` rồi mới sang Tech Docs / Code / QC. Chuẩn bị tốt checklist trên thì bước review nhẹ.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
← [Guides](README.md) · Liên quan: [Checklist Input PRD](prd-input-checklist.md) · [Checklist Input Tech-Docs (BE)](tech-docs-input-checklist.md)
|
|
@@ -10,6 +10,8 @@ Tài liệu dành cho **Developer (FE / BE / App)** — vai trò, commands, trac
|
|
|
10
10
|
|---|---|
|
|
11
11
|
| [Commands](commands.md) | Bảng lệnh cho dev · project lessons · xử lý feedback tester · khi nào dùng `--phase` |
|
|
12
12
|
| [BDD & Trace System](bdd-and-trace.md) | Tại sao BDD quan trọng với dev · `@trace.*` fields · trace chain · khi nào `/validate-traces` |
|
|
13
|
+
| [Checklist input BDD (System/BE)](../bdd-input-checklist.md) | Chuẩn bị để `/generate-bdd` (system) chuẩn ngay lần đầu |
|
|
14
|
+
| [Checklist input Tech-Docs (BE)](../tech-docs-input-checklist.md) | BDD khác tech-doc thế nào · chuẩn bị để `/generate-tech-docs` (BE) ra API contract chuẩn lần đầu |
|
|
13
15
|
| [Workflow](workflow.md) | Luồng làm việc cơ bản từ nhận PRD đến tạo PR |
|
|
14
16
|
| [Tình huống thực tế](scenarios.md) | 8 scenario: nhận PRD mới, đọc System/Web BDD, PRD đổi, API sign-off, bug từ tester, design spec, brownfield, umbrella, validate-traces |
|
|
15
17
|
| [Checklist trước khi tạo PR](pr-checklist.md) | Checklist verify trước khi mở PR |
|
|
@@ -34,6 +36,7 @@ PO/BA Dev
|
|
|
34
36
|
- Đọc và hiểu PRD + BDD từ spec submodule trước khi bắt đầu
|
|
35
37
|
- **KHÔNG tự generate BDD** — BDD đã được PO generate trong spec repo
|
|
36
38
|
- Đảm bảo code trace về đúng BDD scenario, BDD trace về đúng PRD
|
|
39
|
+
- **Duyệt BDD:** sau khi `/review-context` (BDD) sạch critical, Dev-lead/SA đặt `# @trace.status: approved` trong `.feature` (cổng trước tech-docs / code / QC)
|
|
37
40
|
- Báo PO/BA khi PRD hoặc BDD có gì không rõ hoặc mâu thuẫn — không tự suy diễn
|
|
38
41
|
|
|
39
42
|
**Dev KHÔNG làm:**
|
|
@@ -62,6 +62,7 @@ Framework dùng metadata `@trace.*` để liên kết PRD → BDD → Code. (Chi
|
|
|
62
62
|
| `@trace.prd` | BDD / Tech Doc header | Link về PRD gốc |
|
|
63
63
|
| `@trace.bdd` | Code comment / test | Link về BDD scenario |
|
|
64
64
|
| `Status` | bảng Metadata PRD | `draft` / `approved` — chỉ code khi `approved` |
|
|
65
|
+
| `@trace.status` | BDD `.feature` header | `draft` / `approved` — Dev-lead/SA đặt approved sau review-context BDD sạch; mirror → `uc_status` (dashboard) |
|
|
65
66
|
| `dev_selftest` | Trace TSV | `pass` / `fail` / `not_run` — kết quả dev self-check, set bởi `/dev-run-test`. Surfaced trong Living Docs để QC biết dev đã chạy self-check — **KHÔNG phải coverage chính thức** |
|
|
66
67
|
| `dev_selftest_at` | Trace TSV | Timestamp lần chạy `/dev-run-test` gần nhất |
|
|
67
68
|
| `qc_status` | Trace TSV | `pass` / `fail` / `skip` / `not_run` — kết quả **QC chính thức**, set bởi `/qc-run-test` (do QC chạy, KHÔNG phải dev). Orthogonal với `dev_selftest` và với coverage `status` |
|
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
| `/update-framework` | Nâng cấp **bản thân framework** (`.agent/commands/`, steps/, modules/) từ npm | Khi có version framework mới — không đụng project-context/CLAUDE.md |
|
|
9
9
|
| `/review-context {prd-file}` | Đọc + xác nhận PRD + BDD đủ rõ trước khi code — fan-out review dimension thành sub-agent song song + completeness-critic loop, findings file đầy đủ ngay trong 1 lần chạy | **Bước đầu tiên** khi nhận PRD mới |
|
|
10
10
|
| `/generate-tech-docs {feature-file}` | **Platform-aware.** BE (`system`): API contract (endpoints, DB, caching). FE/App (`web`/`app`): client design (components, state, API-integration map theo BE contract, routing) — **GATED**: cần System BDD + BE contract approved trước, nếu thiếu sẽ HALT | BE: sau khi đọc System BDD. FE: sau `--phase=ui`, khi BE contract đã approved |
|
|
11
|
-
| `/generate-code {bdd-file}` | Sinh code — BE hoặc FE khi API đã sẵn sàng | Sau khi tech docs `approved` |
|
|
11
|
+
| `/generate-code {bdd-file}` | Sinh code — BE hoặc FE khi API đã sẵn sàng. Guard mềm: BDD `@trace.status` approved; FE/App design-spec approved+fresh+sanity | Sau khi tech docs `approved` |
|
|
12
12
|
| `/generate-code {bdd-file} --phase=ui` | FE: gen UI + mock adapter. Mock **shape** từ BE contract nếu có (chuẩn) → else infer từ System BDD + warn (`mock_source=contract\|system-bdd`); fixture values luôn từ System BDD | Ngay sau khi đọc BDD (BE chưa cần deploy API) |
|
|
13
13
|
| `/generate-code {bdd-file} --phase=integration` | FE: wire API thật thay mock | Sau khi sign-off gate `approved` |
|
|
14
14
|
| `/dev-gen-test {bdd-file}` | **Dev self-check** — sinh test cases từ BDD để dev tự verify code mình vừa gen (KHÔNG phải bộ test chính thức của QC/dev-team) | Song song hoặc sau generate-code |
|
|
15
|
-
| `/review-code {file}` | Review code theo 4
|
|
15
|
+
| `/review-code {file}` | Review code theo 4 lăng kính (Traceability/Layer/Coding Standards/Spec Compliance) | Trước khi tạo PR |
|
|
16
16
|
| `/review-tech-docs {tech-doc-file}` | Review chất lượng Tech Docs | Sau generate-tech-docs |
|
|
17
17
|
| `/dev-run-test` | **Dev self-check** — chạy test do dev tự gen để xác nhận code mình hoạt động (smoke/self-verify, KHÔNG phải coverage chính thức) — *umbrella mode: tự `cd` vào service_root, dùng service's `test_command`*. Ghi `dev_selftest` (pass/fail) vào trace TSV | Sau khi code + tests sẵn sàng |
|
|
18
18
|
| `/fix-bug {issue}` | Phân tích + fix bug có trace | Khi có bug report |
|
|
@@ -53,7 +53,7 @@ Tester gửi bug report (`/report-bug`) và đề xuất scenario (`/propose-sce
|
|
|
53
53
|
|
|
54
54
|
Dev hành động theo phân loại:
|
|
55
55
|
- **Bug report** → `/fix-bug {BUG-ID}` (report đã có sẵn spec-context + AC bị vi phạm + layer)
|
|
56
|
-
- **Scenario proposal map vào AC sẵn có** →
|
|
56
|
+
- **Scenario proposal map vào AC sẵn có** → đặt `Status: accepted` trong file proposal → `/generate-bdd` tự chèn vào `.feature` rồi lưu trữ (`incorporated`); hoặc thêm tay. Rồi `/generate-code` + `/dev-gen-test`
|
|
57
57
|
- **Proposal là yêu cầu mới (PRD change request)** → chuyển PO sửa PRD trước
|
|
58
58
|
|
|
59
59
|
> Bug reports có thể đến từ hai nguồn: Tester dùng `/report-bug` trực tiếp, **hoặc** từ kết quả QC automation (`qc_status: fail` trong `.trace/*.tsv` → QC (hoặc tester) chạy `/report-bug` → `/sync` → dev thấy tại đây). Cả hai đều dùng cùng luồng `/fix-bug`.
|