@educa-corp/sdd-framework 0.4.0 → 0.5.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 +9 -0
- package/bin/index.js +115 -4
- package/bin/self-check.js +354 -0
- package/bin/trace-schema.json +1199 -0
- package/commands/debug.md +19 -12
- package/commands/define-product.md +19 -12
- package/commands/dev-gen-test.md +53 -19
- package/commands/dev-run-test.md +55 -20
- package/commands/dev-run-test.tmpl +2 -1
- package/commands/dev-smoke-test.md +19 -12
- package/commands/extend-prd.md +907 -0
- package/commands/extend-prd.tmpl +270 -0
- package/commands/fix-bug.md +101 -15
- package/commands/fix-bug.tmpl +29 -3
- package/commands/generate-architecture.md +19 -12
- package/commands/generate-bdd.md +174 -48
- package/commands/generate-bdd.tmpl +107 -18
- package/commands/generate-code.md +122 -29
- package/commands/generate-code.tmpl +69 -10
- package/commands/generate-design-spec.md +19 -12
- package/commands/generate-prd.md +44 -12
- package/commands/generate-prd.tmpl +25 -0
- package/commands/generate-spec-manifest.md +19 -12
- package/commands/generate-tech-docs.md +22 -15
- package/commands/generate-tech-docs.tmpl +2 -2
- package/commands/learn.md +19 -12
- package/commands/map-testids.md +19 -12
- package/commands/propose-scenario.md +91 -15
- package/commands/propose-scenario.tmpl +72 -3
- package/commands/qc-analyze.md +19 -12
- package/commands/qc-design-test.md +20 -12
- package/commands/qc-design-test.tmpl +1 -0
- package/commands/qc-plan.md +19 -12
- package/commands/qc-report.md +19 -12
- package/commands/qc-review.md +19 -12
- package/commands/qc-run-test.md +88 -22
- package/commands/qc-run-test.tmpl +35 -3
- package/commands/refine-prd.md +19 -12
- package/commands/report-bug.md +19 -12
- package/commands/review-code.md +60 -14
- package/commands/review-code.tmpl +41 -2
- package/commands/review-context.md +62 -16
- package/commands/review-context.tmpl +43 -4
- package/commands/review-tech-docs.md +50 -14
- package/commands/review-tech-docs.tmpl +31 -2
- package/commands/setup-ai-first.md +26 -16
- package/commands/setup-ai-first.tmpl +7 -4
- package/commands/sync.md +43 -18
- package/commands/sync.tmpl +37 -14
- package/commands/update-framework.md +43 -4
- package/commands/update-framework.tmpl +37 -0
- package/commands/validate-traces.md +481 -49
- package/commands/validate-traces.tmpl +462 -37
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/README.md +56 -0
- package/core/commands/debug.md +19 -12
- package/core/commands/define-product.md +19 -12
- package/core/commands/dev-gen-test.md +53 -19
- package/core/commands/dev-run-test.md +55 -20
- package/core/commands/dev-smoke-test.md +19 -12
- package/core/commands/extend-prd.md +907 -0
- package/core/commands/fix-bug.md +101 -15
- package/core/commands/generate-architecture.md +19 -12
- package/core/commands/generate-bdd.md +174 -48
- package/core/commands/generate-code.md +122 -29
- package/core/commands/generate-design-spec.md +19 -12
- package/core/commands/generate-prd.md +44 -12
- package/core/commands/generate-spec-manifest.md +19 -12
- package/core/commands/generate-tech-docs.md +22 -15
- package/core/commands/learn.md +19 -12
- package/core/commands/map-testids.md +19 -12
- package/core/commands/propose-scenario.md +91 -15
- package/core/commands/qc-analyze.md +19 -12
- package/core/commands/qc-design-test.md +20 -12
- package/core/commands/qc-plan.md +19 -12
- package/core/commands/qc-report.md +19 -12
- package/core/commands/qc-review.md +19 -12
- package/core/commands/qc-run-test.md +88 -22
- package/core/commands/refine-prd.md +19 -12
- package/core/commands/report-bug.md +19 -12
- package/core/commands/review-code.md +60 -14
- package/core/commands/review-context.md +62 -16
- package/core/commands/review-tech-docs.md +50 -14
- package/core/commands/setup-ai-first.md +26 -16
- package/core/commands/sync.md +43 -18
- package/core/commands/update-framework.md +43 -4
- package/core/commands/validate-traces.md +481 -49
- package/core/modules/android-compose/stack-profile.yaml +1 -1
- package/core/modules/flutter/stack-profile.yaml +1 -1
- package/core/modules/ios-swiftui/stack-profile.yaml +1 -1
- package/core/modules/java-spring/stack-profile.yaml +1 -1
- package/core/modules/nextjs/stack-profile.yaml +1 -1
- package/core/modules/nuxt/stack-profile.yaml +1 -1
- package/core/modules/phaser-game/stack-profile.yaml +1 -1
- package/core/modules/php-laravel/stack-profile.yaml +1 -1
- package/core/modules/qc-playwright/stack-profile.yaml +1 -1
- package/core/modules/react/stack-profile.yaml +1 -1
- package/core/modules/react-native/stack-profile.yaml +1 -1
- package/core/modules/vue/stack-profile.yaml +1 -1
- package/core/rules/workflow.md +29 -0
- package/core/steps/gate.md +13 -8
- package/core/steps/report-footer.md +6 -4
- package/core/steps/trace-mirror.md +34 -7
- package/core/templates/README.md +47 -0
- package/core/templates/feature.template +14 -11
- package/core/templates/project-context.yaml +26 -14
- package/core/templates/tech-design.template.md +1 -1
- package/docs/01-getting-started/installation.md +18 -1
- package/docs/01-getting-started/what-is-sdd.md +4 -2
- package/docs/02-concepts/architecture.md +27 -3
- package/docs/02-concepts/pipeline-steps/02-specification.md +39 -3
- package/docs/02-concepts/pipeline-steps/04-bdd.md +24 -2
- package/docs/02-concepts/pipeline-steps/05-tech-docs.md +18 -1
- package/docs/02-concepts/pipeline-steps/06-code.md +35 -4
- package/docs/02-concepts/pipeline-steps/09-validate-traces.md +137 -12
- package/docs/02-concepts/pipeline-steps/10-feedback-loop.md +59 -3
- package/docs/02-concepts/roles-and-hitl.md +1 -1
- package/docs/02-concepts/traceability.md +126 -94
- package/docs/03-guides/developer.md +20 -4
- package/docs/03-guides/product-owner.md +72 -68
- package/docs/03-guides/tester-qa.md +81 -70
- package/docs/04-reference/commands.md +134 -105
- package/docs/04-reference/configuration.md +146 -94
- package/docs/04-reference/trace-schema.md +145 -37
- package/docs/explain/02-generate-prd.md +80 -78
- package/docs/explain/02b-extend-prd.md +125 -0
- package/docs/explain/03-refine-prd.md +86 -86
- package/docs/explain/04-review-context.md +18 -1
- package/docs/explain/06-generate-bdd.md +23 -0
- package/docs/explain/08-review-tech-docs.md +20 -5
- package/docs/explain/10-review-code.md +36 -2
- package/docs/explain/19-qc-run-test.md +87 -67
- package/docs/explain/21-validate-traces.md +74 -68
- package/docs/explain/23-fix-bug.md +19 -3
- package/docs/explain/26-propose-scenario.md +70 -63
- package/docs/explain/README.md +135 -134
- package/modules/android-compose/stack-profile.yaml +1 -1
- package/modules/flutter/stack-profile.yaml +1 -1
- package/modules/ios-swiftui/stack-profile.yaml +1 -1
- package/modules/java-spring/stack-profile.yaml +1 -1
- package/modules/nextjs/stack-profile.yaml +1 -1
- package/modules/nuxt/stack-profile.yaml +1 -1
- package/modules/phaser-game/stack-profile.yaml +1 -1
- package/modules/php-laravel/stack-profile.yaml +1 -1
- package/modules/qc-playwright/stack-profile.yaml +1 -1
- package/modules/react/stack-profile.yaml +1 -1
- package/modules/react-native/stack-profile.yaml +1 -1
- package/modules/vue/stack-profile.yaml +1 -1
- package/package.json +5 -4
- package/rules/workflow.md +29 -0
- package/scripts/migrate-bdd-platform.js +286 -0
- package/steps/gate.md +13 -8
- package/steps/report-footer.md +6 -4
- package/steps/trace-mirror.md +34 -7
- package/templates/README.md +47 -0
- package/templates/feature.template +14 -11
- package/templates/project-context.yaml +26 -14
- package/templates/tech-design.template.md +1 -1
|
@@ -1,94 +1,126 @@
|
|
|
1
|
-
[← Roles & HITL](roles-and-hitl.md) · [Concepts](./) · [Architecture →](architecture.md)
|
|
2
|
-
|
|
3
|
-
# Traceability — Truy vết đầu-cuối (End-to-end Trace)
|
|
4
|
-
|
|
5
|
-
> Từ scenario nhìn xuống biết code nào hiện thực; từ code nhìn lên biết scenario nào yêu cầu. Đây là một trong ba "trái tim" của framework.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Trace tags theo artifact
|
|
10
|
-
|
|
11
|
-
| Artifact | Trace tag |
|
|
12
|
-
|----------|-----------|
|
|
13
|
-
| **BDD
|
|
14
|
-
| **
|
|
15
|
-
| **
|
|
16
|
-
| **
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
|
41
|
-
|
|
42
|
-
| `
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
|
|
1
|
+
[← Roles & HITL](roles-and-hitl.md) · [Concepts](./) · [Architecture →](architecture.md)
|
|
2
|
+
|
|
3
|
+
# Traceability — Truy vết đầu-cuối (End-to-end Trace)
|
|
4
|
+
|
|
5
|
+
> Từ scenario nhìn xuống biết code nào hiện thực; từ code nhìn lên biết scenario nào yêu cầu. Đây là một trong ba "trái tim" của framework.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Trace tags theo artifact
|
|
10
|
+
|
|
11
|
+
| Artifact | Trace tag |
|
|
12
|
+
|----------|-----------|
|
|
13
|
+
| **BDD file** (header) | `@trace.id` · **`@trace.platform`** · **`@trace.service`** · `@trace.module` · `@trace.domain` · `@trace.prd` · `@trace.prd_version` · `@trace.bdd_version` · `@trace.status` · `@trace.dataset` |
|
|
14
|
+
| **BDD scenario** (mỗi SC) | `@trace.scenario` · **`@trace.sc_version`** · `@trace.business_rules` |
|
|
15
|
+
| **Code** (boundary only) | `@trace.implements` · `@trace.source` · **`@trace.prd_version` · `@trace.bdd_version` · `@trace.tech_doc_revision`** · **`@trace.design_spec_version`** *(chỉ FE/App)* — lặp cả block theo **từng UC** trong file đa-UC |
|
|
16
|
+
| **Code** (chỗ chưa implement) | `@trace.stub` · `@trace.stub_owner` · `@trace.stub_for` · `@trace.seam_pending` · `@trace.seam_port` |
|
|
17
|
+
| **Test** | `@trace.verifies` |
|
|
18
|
+
| **Bug fix** | `@trace.fixes` · `@trace.root_cause` · `@trace.regression` |
|
|
19
|
+
|
|
20
|
+
→ Đầy đủ field & format: [Reference › Trace Schema](../04-reference/trace-schema.md).
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Boundary-only tagging
|
|
25
|
+
|
|
26
|
+
Chỉ tag `@trace` ở **boundary**, không tag mọi file → tránh **tag explosion**:
|
|
27
|
+
|
|
28
|
+
| ✅ Tag | ❌ Không tag |
|
|
29
|
+
|--------|-------------|
|
|
30
|
+
| Controller / Handler / Middleware / Steps file | Entity / Repository / DTO / Interface / Base class |
|
|
31
|
+
|
|
32
|
+
> Shared code (entity, repo) được dò qua **import chain** từ boundary — không cần tag riêng.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Trace state — file `.tsv`
|
|
37
|
+
|
|
38
|
+
`.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv` — mỗi UC × platform một sổ. Trong umbrella, nằm ở **spec repo dùng chung** (một nơi authoritative để PM/PO quản lý).
|
|
39
|
+
|
|
40
|
+
| Cột | Chủ sở hữu | Ý nghĩa |
|
|
41
|
+
|-----|-----------|---------|
|
|
42
|
+
| `status` | `/generate-code`, `/validate-traces` | OK / GAP / DRIFT / UNTRACKED |
|
|
43
|
+
| `implemented_by` | `/generate-code` | File code hiện thực SC |
|
|
44
|
+
| `dev_selftest` | `/dev-run-test` | Smoke của **dev** |
|
|
45
|
+
| `qc_status` | `/qc-run-test`, `/report-bug` | Trạng thái QC **chính thức** (Playwright) |
|
|
46
|
+
| `bdd_version` / `spec_ver` | spec | Version để phát hiện drift |
|
|
47
|
+
| `service` *(cột 23)* | `/generate-bdd` | Đội/submodule sở hữu SC — nguồn của `by_service` trên dashboard |
|
|
48
|
+
| `design_spec_version` *(cột 24)* | `/generate-bdd` | Version design-spec lúc sinh BDD *(FE/App; `—` cho backend)* |
|
|
49
|
+
|
|
50
|
+
**24 cột.** TSV cũ thiếu cột mới → đọc thành giá trị rỗng, **không báo lỗi**; header tự nâng ở lần `/generate-bdd` gen lại kế tiếp. Đọc theo **tên cột ở header row**, không theo vị trí.
|
|
51
|
+
|
|
52
|
+
> **Làm mất hiệu lực ≠ ghi đè.** Chủ sở hữu là người **duy nhất** ghi giá trị **khẳng định** (`pass`/`fail`/số lượng). Nhưng lệnh nào làm giá trị đó **hết đúng** (spec đổi, code đổi) **bắt buộc** hạ nó về `not_run`/`—`. Giữ một `pass` sinh ra từ spec đã bị sửa là **báo cáo sai**, không phải tôn trọng quyền sở hữu cột. Ngoại lệ có chủ ý: `qc_owner`/`qc_blocked_by` (con trỏ bug vẫn còn giá trị) và `test_count`/`test_classes` (test vẫn trên đĩa — **cảnh báo**, không hạ số, để tỷ lệ coverage không nhảy loạn).
|
|
53
|
+
| `gen_ver` | `/generate-code` | Version lúc sinh code (so với `spec_ver`) |
|
|
54
|
+
| `test_count` | test | Số test phủ SC |
|
|
55
|
+
| `last_updated` | nhiều | Mốc cập nhật |
|
|
56
|
+
|
|
57
|
+
> **`dev_selftest` ≠ `qc_status`.** Dev smoke (nhanh, tự kiểm) và QC chính thức (Playwright, evidence) là **hai trục độc lập** — không lấn quyền nhau.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Phân loại coverage (Coverage Status)
|
|
62
|
+
|
|
63
|
+
`/validate-traces` phân loại mỗi SC theo **thứ tự ưu tiên** (rule sớm thắng):
|
|
64
|
+
|
|
65
|
+
| # | Trạng thái | Điều kiện | Hành động |
|
|
66
|
+
|---|-----------|-----------|-----------|
|
|
67
|
+
| 1 | **UNTRACKED** | `gen_ver == —` | Chưa sinh code → `/generate-code` |
|
|
68
|
+
| 2 | **DRIFT** | có code **và** `spec_ver != gen_ver` | Spec đổi → **regen trước khi test** |
|
|
69
|
+
| 3 | **GAP** | có code **và** `test_count == — / 0` | Có code, chưa test → bù test |
|
|
70
|
+
| 4 | **OK** | version khớp, có code, có test | Đủ phủ |
|
|
71
|
+
|
|
72
|
+
> **DRIFT xét trước GAP:** SC có code + chưa test + spec vừa drift phải hiện `DRIFT` (không phải `GAP`) — vì `/generate-code` xử GAP = "skip codegen" còn DRIFT = "regenerate". Nếu GAP thắng, code lỗi thời bị bỏ qua.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Version sống ở đâu — và vì sao code CŨNG mang version
|
|
77
|
+
|
|
78
|
+
**Spec là SSOT của "version hiện tại". Code mang version của "lúc tôi được sinh ra".** Hai thứ khác nhau, nên không phải dual SSOT.
|
|
79
|
+
|
|
80
|
+
| Nơi | Ghi cái gì | Ai ghi |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| `.feature` / PRD / tech-doc | version **hiện tại** của spec — SSOT | tác giả spec |
|
|
83
|
+
| `.tsv` `spec_ver` | gương của `@trace.sc_version` hiện tại | `/generate-bdd`, `/validate-traces` |
|
|
84
|
+
| `.tsv` `gen_ver` | version scenario **tại thời điểm codegen**, theo từng SC | `/generate-code` |
|
|
85
|
+
| **Code** `@trace.prd_version` · `@trace.bdd_version` · `@trace.tech_doc_revision` · `@trace.design_spec_version` | version của **từng artifact upstream** tại thời điểm codegen, theo từng **method** | `/generate-code` |
|
|
86
|
+
|
|
87
|
+
Drift = **so các mốc này với nhau**; sự lệch nhau chính là tín hiệu, không phải lỗi dữ liệu:
|
|
88
|
+
|
|
89
|
+
- `spec_ver != gen_ver` → `DRIFT` (scenario đổi sau khi sinh code)
|
|
90
|
+
- `@trace.prd_version` trong code < Version PRD hiện tại → `PRD_DRIFT`
|
|
91
|
+
- `@trace.bdd_version` trong code < `.feature` hiện tại → `BDD_DRIFT`
|
|
92
|
+
- `@trace.tech_doc_revision` trong code < `@trace.revision` của tech-doc → `TECHDOC_DRIFT`
|
|
93
|
+
- `@trace.design_spec_version` trong code FE < Version design-spec → `DESIGNSPEC_DRIFT`
|
|
94
|
+
|
|
95
|
+
> **Lệch version KHÔNG luôn là drift.** PRD và tech-doc là tài liệu **gộp** phủ nhiều UC nhưng chỉ có **một** số version. Thêm UC7 làm mọi UC cũ lệch số dù không đổi một chữ. Nên `/validate-traces` **lọc theo scope của row changelog**: UC có trong danh sách bị ảnh hưởng → `PRD_DRIFT` 🟠; không có → `PRD_STALE_REF` ⓘ (chỉ con trỏ cũ, sạch bằng `--realign-prd-version`); row changelog **mơ hồ** → 🟠 cho mọi UC (lưới an toàn).
|
|
96
|
+
|
|
97
|
+
**Vì sao không thể bỏ tag version trong code và chỉ dựa vào `.tsv`:**
|
|
98
|
+
|
|
99
|
+
1. **Độ phân giải khác nhau.** `.tsv` là một sổ cho mỗi UC × platform. Một **file code** có thể phục vụ nhiều UC, mỗi UC ở một version khác nhau — chỉ tag đặt cạnh từng method mới diễn đạt được "UC1 ở bdd v1.4, UC3 ở v2.1".
|
|
100
|
+
2. **Vòng đời khác nhau.** `.tsv` là artifact **sinh ra**, có thể regen/xoá/mirror; ở chế độ umbrella nó còn nằm ở **repo khác** (spec submodule) với code. Tag trong code là bản ghi duy nhất **đi cùng** code qua mọi lần copy/move/merge.
|
|
101
|
+
3. **Sự lệch nhau là thứ ta muốn đo.** Nếu chỉ có một bản ghi thì không có gì để so — đó mới là lúc drift trở nên không phát hiện được.
|
|
102
|
+
|
|
103
|
+
> ⚠️ **Đừng "tối ưu" bằng cách gỡ tag version khỏi code.** `/validate-traces` Step 4/5/5c **đọc chính các tag đó**; gỡ đi là làm drift detection mù **im lặng** — build vẫn xanh, dashboard vẫn đẹp. `/review-code` lăng kính 1 gắn cờ **major** cho mỗi block `@trace.implements` thiếu tag version đi kèm.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Luồng truy vết (Trace Flow)
|
|
108
|
+
|
|
109
|
+
```mermaid
|
|
110
|
+
flowchart LR
|
|
111
|
+
PRD["PRD<br/>prd_version"] --> BDD["Scenario<br/>@trace.id + bdd_version"]
|
|
112
|
+
BDD --> CODE["Code boundary<br/>@trace.implements/source"]
|
|
113
|
+
CODE --> TEST["Test<br/>@trace.verifies"]
|
|
114
|
+
BDD -.-> TSV[".tsv state<br/>status/gen_ver/qc_status"]
|
|
115
|
+
CODE -.-> TSV
|
|
116
|
+
TEST -.-> TSV
|
|
117
|
+
TSV --> VM["/validate-traces<br/>Coverage Matrix"]
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Đọc tiếp (Next)
|
|
123
|
+
|
|
124
|
+
- [Architecture](architecture.md) — 3 lớp & context-loader
|
|
125
|
+
- [Pipeline › Validate Traces](pipeline-steps/09-validate-traces.md) — dùng ma trận coverage
|
|
126
|
+
- [Reference › Trace Schema](../04-reference/trace-schema.md) — field đầy đủ
|
|
@@ -34,11 +34,22 @@ flowchart LR
|
|
|
34
34
|
## Nguyên tắc sống còn cho Dev
|
|
35
35
|
|
|
36
36
|
1. **Không sinh code cho file không có `.feature` backing** (ngoài fix-bug/debug).
|
|
37
|
-
2. **Boundary-only tagging** — tag `@trace
|
|
37
|
+
2. **Boundary-only tagging** — tag `@trace` ở controller/handler, không tag entity/repo. Nhưng ở boundary thì phải **đủ block 5 tag** (dưới).
|
|
38
38
|
3. **Scope Lock** — chỉ implement UC target; code UC khác trong file dùng chung là **bất khả xâm phạm**. Đọc `@trace.implements` để bảo toàn, đừng xoá.
|
|
39
|
-
4. **
|
|
40
|
-
5. **
|
|
41
|
-
6.
|
|
39
|
+
4. **Code CŨNG mang version** — `@trace.prd_version` · `@trace.bdd_version` · `@trace.tech_doc_revision` ghi *"tôi được sinh theo bản nào"*, còn spec giữ *"bản hiện tại"*. Sự **lệch nhau** giữa hai mốc chính là tín hiệu drift. Đừng "tối ưu" bằng cách gỡ chúng — `/validate-traces` đọc đúng các tag đó.
|
|
40
|
+
5. **File phủ nhiều UC → lặp cả block theo từng method.** Không gộp header, không trỏ `@trace.source` vào thư mục.
|
|
41
|
+
6. **Sửa scenario thì bump `@trace.sc_version`** của chính SC đó — nếu bạn sửa `.feature` bằng tay. Quên bump = code cũ vĩnh viễn hiện `OK`.
|
|
42
|
+
7. **Build phải pass** trước commit (`{conventions.build_command}`, ≤3 retry).
|
|
43
|
+
8. `CLAUDE.md` (§2 layer/package, §3 coding standards, §5 error handling) là nguồn — AI *follow*, bạn giữ nó cập nhật.
|
|
44
|
+
|
|
45
|
+
```java
|
|
46
|
+
// @trace.implements=AUTH-UC1-SC3
|
|
47
|
+
// @trace.prd_version=1.2 @trace.bdd_version=1.4 @trace.tech_doc_revision=3
|
|
48
|
+
// @trace.source=specs/auth/login/bdd/system/AUTH-UC1-login.feature
|
|
49
|
+
public TokenDto login(...) { }
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
→ Lý do đầy đủ (vì sao **không** phải dual-SSOT): [Traceability](../02-concepts/traceability.md)
|
|
42
53
|
|
|
43
54
|
---
|
|
44
55
|
|
|
@@ -67,8 +78,13 @@ flowchart LR
|
|
|
67
78
|
|
|
68
79
|
- ❌ Tag `@trace` mọi file → tag explosion.
|
|
69
80
|
- ❌ Tái tạo file dùng chung "chỉ gồm scenario UC này" → xoá nhầm nghiệp vụ UC khác.
|
|
81
|
+
- ❌ Gộp tag của nhiều UC về một header file, hoặc trỏ `@trace.source` vào thư mục → drift báo oan hoặc mù; UC rơi về `UNTRACKED` dù đã có code.
|
|
82
|
+
- ❌ Gỡ tag version khỏi code cho "gọn" → `/validate-traces` mù, **im lặng**.
|
|
70
83
|
- ❌ Coi `dev_selftest` thay QC chính thức.
|
|
71
84
|
- ❌ Để AI tự review code nó vừa sinh.
|
|
85
|
+
- ❌ Tạo PR khi `/validate-traces` còn cờ 🔴 (`SEAM_UNWIRED` · `STUB_UNRESOLVED` · `ORPHANED` · `TRACE_ORPHAN`) — build xanh không chứng minh luồng ghép chạy đúng.
|
|
86
|
+
- ❌ Coi FE `fe_phase = ui` là xong vì status đã `OK` — test đang chạy trên **mock**.
|
|
87
|
+
- ❌ Tự đóng bug mình vừa fix — `/fix-bug` chỉ đặt `🟡 Fixed`; `🟢 Closed` là của `/qc-run-test`.
|
|
72
88
|
|
|
73
89
|
---
|
|
74
90
|
|
|
@@ -1,68 +1,72 @@
|
|
|
1
|
-
[← Docs Home](../README.md) · [Guides](./)
|
|
2
|
-
|
|
3
|
-
# Guide · Product Owner / BA
|
|
4
|
-
|
|
5
|
-
> Bạn **định nghĩa cái gì đáng làm**. Vai trò của bạn nặng nhất ở **thượng nguồn** (Discovery → PRD → BDD) — nơi sai một ly đi một dặm.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Chuỗi bước của bạn (Your path)
|
|
10
|
-
|
|
11
|
-
```mermaid
|
|
12
|
-
flowchart LR
|
|
13
|
-
A["/define-product<br/>🟢 Lead"] --> B["/generate-prd<br/>🟢 Lead"]
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
| [
|
|
31
|
-
| [
|
|
32
|
-
| [
|
|
33
|
-
| [
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
- ❌
|
|
60
|
-
- ❌
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
1
|
+
[← Docs Home](../README.md) · [Guides](./)
|
|
2
|
+
|
|
3
|
+
# Guide · Product Owner / BA
|
|
4
|
+
|
|
5
|
+
> Bạn **định nghĩa cái gì đáng làm**. Vai trò của bạn nặng nhất ở **thượng nguồn** (Discovery → PRD → BDD) — nơi sai một ly đi một dặm.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Chuỗi bước của bạn (Your path)
|
|
10
|
+
|
|
11
|
+
```mermaid
|
|
12
|
+
flowchart LR
|
|
13
|
+
A["/define-product<br/>🟢 Lead"] --> B["/generate-prd<br/>🟢 Lead"]
|
|
14
|
+
B2["/extend-prd<br/>🟢 Lead — PRD đã có"] --> C
|
|
15
|
+
B --> C["/refine-prd<br/>🟢 accept findings"]
|
|
16
|
+
C --> D["/review-context PRD<br/>🔒 approve"]
|
|
17
|
+
D --> E["/generate-design-spec<br/>🟡 review (FE/App)"]
|
|
18
|
+
E --> F["/generate-bdd<br/>🟢 UC decomposition"]
|
|
19
|
+
F --> G["/review-context BDD<br/>🔒 approve"]
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Sau khi BDD `approved`, bạn bàn giao xuống Dev/SA — nhưng vẫn nhận **product-gap** từ QC.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Việc của bạn ở mỗi bước
|
|
27
|
+
|
|
28
|
+
| Bước | Bạn làm gì | Quyết định |
|
|
29
|
+
|------|-----------|------------|
|
|
30
|
+
| [Discovery](../02-concepts/pipeline-steps/01-discovery.md) | Trả lời Q&A 8 chặng, **chốt từng chặng** | Vấn đề, user, UC, BR, AC, edge case, scope |
|
|
31
|
+
| [Specification](../02-concepts/pipeline-steps/02-specification.md) | Duyệt PRD draft; **accept/reject từng finding** của `/refine-prd`; đặt `Status: approved` | Scope & terminology đúng chưa |
|
|
32
|
+
| [Design-Spec](../02-concepts/pipeline-steps/03-design-spec.md) | Review spec visual bám Figma (FE/App) | Visual khớp intent |
|
|
33
|
+
| [BDD](../02-concepts/pipeline-steps/04-bdd.md) | Chốt **UC decomposition**; đặt `@trace.status: approved` | Cấu trúc UC/SC đúng |
|
|
34
|
+
| [QC](../02-concepts/pipeline-steps/08-qc-automation.md) | Nhận **product-gap**, quyết ưu tiên sửa | Gap nào là lỗi sản phẩm |
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Nguyên tắc sống còn cho PO
|
|
39
|
+
|
|
40
|
+
1. **Viết thuần ngôn ngữ nghiệp vụ** — đừng nhét API/retry/timeout vào PRD/BDD. Business Language Guard sẽ chặn, nhưng bạn nên tự giữ altitude.
|
|
41
|
+
2. **Bốn ngăn không lộn**: AC (nghiệm thu) · BR/BL (cơ chế) · Scope (ranh giới) · Dictionary (định nghĩa).
|
|
42
|
+
3. **Gate là trạng thái, không phải lệnh** — "duyệt" = bạn tự đặt `| Status | approved |`. Chỉ đặt khi **sạch finding critical**.
|
|
43
|
+
4. **Chốt từng chặng, đừng "để AI tự hiểu"** — AI sẽ suy diễn và bạn trả giá ở downstream.
|
|
44
|
+
5. Khi bạn sửa cùng một kiểu nhiều lần → gợi ý team `/learn` để ghi lesson.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Câu hỏi bạn cần trả lời được
|
|
49
|
+
|
|
50
|
+
- Tính năng này giải quyết pain point gì? Cho ai?
|
|
51
|
+
- Gồm những UC/BR/AC nào? Edge case nào?
|
|
52
|
+
- Cái gì **trong** scope, cái gì **ngoài**?
|
|
53
|
+
- Mỗi scenario BDD có phủ đúng một AC/BR không?
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Anti-pattern
|
|
58
|
+
|
|
59
|
+
- ❌ Đặt `approved` khi còn finding critical → phá gate, code rác.
|
|
60
|
+
- ❌ Bỏ `/refine-prd` "vì PRD trông ổn".
|
|
61
|
+
- ❌ Chạy `/generate-prd` lại trên PRD đã có để "cập nhật" — nó **từ chối chạy**, và đúng vậy: ghi đè sẽ mất changelog + đánh số lại BR (phá liên kết ở mọi `.feature` đã sinh). Thêm yêu cầu thì dùng **`/extend-prd`**.
|
|
62
|
+
- ❌ Viết dòng changelog kiểu `"cập nhật theo yêu cầu mới"` — dòng đó là **contract**. Mơ hồ thì `/generate-bdd` gen lại **toàn bộ**, và `/validate-traces` báo động oan cho **mọi** UC thay vì chỉ UC vừa đổi. Luôn nêu **UC/AC/BR bị ảnh hưởng**.
|
|
63
|
+
- ❌ Để `feedback/prd-change-requests/` chất đống — đó là yêu cầu thật tester phát hiện từ sản phẩm chạy thật, và **không cờ trace nào bắt được** (chưa có AC thì theo mọi thước đo coverage nó *không tồn tại*). `/validate-traces` nhắc kèm số ngày chờ; xử bằng `/extend-prd`.
|
|
64
|
+
- ❌ Nhảy từ ý tưởng thẳng sang yêu cầu Dev code.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Lệnh của bạn (Your commands)
|
|
69
|
+
|
|
70
|
+
`/define-product` · `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` · `/generate-design-spec` · `/generate-bdd`
|
|
71
|
+
|
|
72
|
+
→ [Bảng lệnh đầy đủ](../04-reference/commands.md) · [Glossary](../02-concepts/glossary.md)
|
|
@@ -1,70 +1,81 @@
|
|
|
1
|
-
[← Docs Home](../README.md) · [Guides](./)
|
|
2
|
-
|
|
3
|
-
# Guide · Tester / QA
|
|
4
|
-
|
|
5
|
-
> Bạn **chạy kiểm thử chính thức** (dây chuyền `/qc-*`, Playwright) và là **kênh feedback** đưa bug/scenario ngược về spec. Bạn ghi `qc_status` — trạng thái QC chính thức, có evidence.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Chuỗi bước của bạn (Your path)
|
|
10
|
-
|
|
11
|
-
```mermaid
|
|
12
|
-
flowchart LR
|
|
13
|
-
A["/qc-analyze"] --> P["/qc-plan"] --> D["/qc-design-test"]
|
|
14
|
-
D --> R["/qc-review<br/>🛑 cổng"] --> RUN["/qc-run-test<br/>ghi qc_status"] --> REP["/qc-report<br/>product-gap"]
|
|
15
|
-
REP --> FB["/report-bug · /propose-scenario"]
|
|
16
|
-
FB --> SYNC["/sync"]
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Việc của bạn ở mỗi bước
|
|
22
|
-
|
|
23
|
-
| Trạm | Bạn làm gì |
|
|
24
|
-
|------|-----------|
|
|
25
|
-
| [`/qc-analyze`](../02-concepts/pipeline-steps/08-qc-automation.md) | Phân rã yêu cầu + phát hiện **gap tài liệu** |
|
|
26
|
-
| `/qc-plan` | Đánh giá rủi ro + câu hỏi cho dev |
|
|
27
|
-
| `/qc-design-test` | Thiết kế test case Markdown (`*.Test.md`) |
|
|
28
|
-
| `/qc-review` | 🛑 **Cổng review** case & script trước khi chạy |
|
|
29
|
-
| `/qc-run-test` | Chạy pytest-playwright, ghi **`qc_status`**; phân loại FAIL |
|
|
30
|
-
| `/qc-report` | Report + evidence, đẩy **product-gap** về PO/Dev |
|
|
31
|
-
| [Feedback](../02-concepts/pipeline-steps/10-feedback-loop.md) | `/report-bug`, `/propose-scenario` — kênh có hồ sơ spec |
|
|
32
|
-
|
|
33
|
-
Bạn cũng dùng `/validate-traces` để thấy **gap chưa phủ** (spec ↔ code ↔ test).
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## Nguyên tắc sống còn cho QA
|
|
38
|
-
|
|
39
|
-
1. **`qc_status` ≠ `dev_selftest`** — bạn ghi QC chính thức (Playwright, evidence); dev smoke là trục độc lập.
|
|
40
|
-
2. **Không bao giờ fake-pass** — FAIL do product-gap thì **giữ FAIL + evidence**, đẩy về PO/Dev. Chỉ sửa script khi là script-bug (selector/logic).
|
|
41
|
-
3. **Không chạy test kém** — phải qua cổng `/qc-review` trước `/qc-run-test`.
|
|
42
|
-
4. **Bug phải spec-anchored** — `/report-bug` gắn `@trace` tới UC/SC để truy vết & regression.
|
|
43
|
-
5.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
1
|
+
[← Docs Home](../README.md) · [Guides](./)
|
|
2
|
+
|
|
3
|
+
# Guide · Tester / QA
|
|
4
|
+
|
|
5
|
+
> Bạn **chạy kiểm thử chính thức** (dây chuyền `/qc-*`, Playwright) và là **kênh feedback** đưa bug/scenario ngược về spec. Bạn ghi `qc_status` — trạng thái QC chính thức, có evidence.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Chuỗi bước của bạn (Your path)
|
|
10
|
+
|
|
11
|
+
```mermaid
|
|
12
|
+
flowchart LR
|
|
13
|
+
A["/qc-analyze"] --> P["/qc-plan"] --> D["/qc-design-test"]
|
|
14
|
+
D --> R["/qc-review<br/>🛑 cổng"] --> RUN["/qc-run-test<br/>ghi qc_status"] --> REP["/qc-report<br/>product-gap"]
|
|
15
|
+
REP --> FB["/report-bug · /propose-scenario"]
|
|
16
|
+
FB --> SYNC["/sync"]
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Việc của bạn ở mỗi bước
|
|
22
|
+
|
|
23
|
+
| Trạm | Bạn làm gì |
|
|
24
|
+
|------|-----------|
|
|
25
|
+
| [`/qc-analyze`](../02-concepts/pipeline-steps/08-qc-automation.md) | Phân rã yêu cầu + phát hiện **gap tài liệu** |
|
|
26
|
+
| `/qc-plan` | Đánh giá rủi ro + câu hỏi cho dev |
|
|
27
|
+
| `/qc-design-test` | Thiết kế test case Markdown (`*.Test.md`) |
|
|
28
|
+
| `/qc-review` | 🛑 **Cổng review** case & script trước khi chạy |
|
|
29
|
+
| `/qc-run-test` | Chạy pytest-playwright, ghi **`qc_status`**; phân loại FAIL |
|
|
30
|
+
| `/qc-report` | Report + evidence, đẩy **product-gap** về PO/Dev |
|
|
31
|
+
| [Feedback](../02-concepts/pipeline-steps/10-feedback-loop.md) | `/report-bug`, `/propose-scenario` — kênh có hồ sơ spec |
|
|
32
|
+
|
|
33
|
+
Bạn cũng dùng `/validate-traces` để thấy **gap chưa phủ** (spec ↔ code ↔ test).
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Nguyên tắc sống còn cho QA
|
|
38
|
+
|
|
39
|
+
1. **`qc_status` ≠ `dev_selftest`** — bạn ghi QC chính thức (Playwright, evidence); dev smoke là trục độc lập.
|
|
40
|
+
2. **Không bao giờ fake-pass** — FAIL do product-gap thì **giữ FAIL + evidence**, đẩy về PO/Dev. Chỉ sửa script khi là script-bug (selector/logic).
|
|
41
|
+
3. **Không chạy test kém** — phải qua cổng `/qc-review` trước `/qc-run-test`.
|
|
42
|
+
4. **Bug phải spec-anchored** — `/report-bug` gắn `@trace` tới UC/SC để truy vết & regression.
|
|
43
|
+
5. **Bạn là người ĐÓNG bug** — `/fix-bug` của dev chỉ đặt `🟡 Fixed`; `🟢 Closed` do `/qc-run-test` đặt khi `qc_status` của SC liên kết flip `pass`. Dev không tự đóng bug của mình.
|
|
44
|
+
- Ngoại lệ: SC pass mà bug còn `🟢 Open` (chưa ai fix) → **không đóng**, giữ `Open` + kiểm tra lại test. Test pass trên bug chưa fix là dấu hiệu **test sai**.
|
|
45
|
+
6. **`/propose-scenario` dùng đúng bộ tag canonical** — `@trace.scenario` (placeholder `SC?`, `/generate-bdd` gán số khi chèn) · `@trace.sc_version: 1.0` · `@trace.business_rules`. AC ghi thành comment `# Covers:`, **không** phải trace key. Thiếu `@trace.scenario`/`sc_version` thì scenario vào BDD mà **không có row trace** → vô hình với coverage.
|
|
46
|
+
7. Stack QC cố định: Python + pytest-playwright + Page Object (module `qc-playwright`), **độc lập** module của dev.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Câu hỏi bạn cần trả lời được
|
|
51
|
+
|
|
52
|
+
- Yêu cầu phân rã thành test case nào? Tài liệu có gap gì?
|
|
53
|
+
- Rủi ro nào cao? Cần hỏi dev gì?
|
|
54
|
+
- SC nào PASS/FAIL chính thức? FAIL là **script-bug** hay **product-gap**?
|
|
55
|
+
- Bug này gắn với scenario/spec nào?
|
|
56
|
+
- Scenario nào còn thiếu cần đề xuất (`/propose-scenario`)?
|
|
57
|
+
- Hành vi phát hiện được có **AC nào phủ** không? → quyết định Case A hay Case B:
|
|
58
|
+
|
|
59
|
+
| | Đi đâu | Ai xử |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| **Case A** — thiếu scenario cho AC **đã có** | `feedback/bdd-proposals/` | `/generate-bdd` tự chèn khi bạn đặt `Status: accepted` |
|
|
62
|
+
| **Case B** — requirement **MỚI**, không AC nào phủ | `feedback/prd-change-requests/` | PO chạy `/extend-prd` |
|
|
63
|
+
|
|
64
|
+
Case B **không tự vào BDD được** — scenario chưa có AC để trace tới. Và vì chưa có AC, **không cờ trace nào bắt được** thiếu sót đó. `/validate-traces` sẽ nhắc lại kèm **số ngày chờ** chừng nào request còn `Open`.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Anti-pattern
|
|
69
|
+
|
|
70
|
+
- ❌ Sửa script cho "xanh" khi thực chất là product-gap → giấu lỗi sản phẩm.
|
|
71
|
+
- ❌ Chạy `/qc-run-test` khi chưa qua `/qc-review`.
|
|
72
|
+
- ❌ Lẫn `qc_status` với `dev_selftest`.
|
|
73
|
+
- ❌ Bug không gắn spec → khó truy vết, khó regression.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Lệnh của bạn (Your commands)
|
|
78
|
+
|
|
79
|
+
`/qc-analyze` · `/qc-plan` · `/qc-design-test` · `/qc-review` · `/qc-run-test` · `/qc-report` · `/report-bug` · `/propose-scenario` · `/validate-traces`
|
|
80
|
+
|
|
81
|
+
→ [Bảng lệnh đầy đủ](../04-reference/commands.md) · [Traceability](../02-concepts/traceability.md)
|