@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
|
@@ -4,54 +4,104 @@
|
|
|
4
4
|
|
|
5
5
|
> Field metadata `@trace.*` và cột file `.tsv`. Giải thích khái niệm → [Traceability](../02-concepts/traceability.md).
|
|
6
6
|
|
|
7
|
+
> ⚙️ **Bản máy đọc: `bin/trace-schema.json`.** File đó là nguồn-sự-thật mà `bin/self-check.js`
|
|
8
|
+
> đối chiếu với `commands/*.tmpl` + `steps/*.md` mỗi lần `npm run build` — build **fail** nếu
|
|
9
|
+
> lệnh lệch schema. Đổi contract thì sửa file JSON **trước**, rồi sửa lệnh, rồi cập nhật trang này.
|
|
10
|
+
|
|
7
11
|
---
|
|
8
12
|
|
|
9
13
|
## Trace tags theo artifact
|
|
10
14
|
|
|
11
|
-
### BDD
|
|
15
|
+
### BDD — header file (`.feature`)
|
|
16
|
+
|
|
17
|
+
| Tag | Ý nghĩa | Bắt buộc |
|
|
18
|
+
|-----|---------|:--------:|
|
|
19
|
+
| `@trace.id` | UC-ID — `{TICKET-ID}-UC{N}` (vd `SEG01-UC1`) | ✅ |
|
|
20
|
+
| `@trace.platform` | `web` / `app` / `system` — **mọi mode, kể cả umbrella** | ✅ |
|
|
21
|
+
| `@trace.domain` | Domain nghiệp vụ | ✅ |
|
|
22
|
+
| `@trace.prd` | TICKET-ID của PRD nguồn | ✅ |
|
|
23
|
+
| `@trace.prd_version` | Version PRD lúc sinh BDD | ✅ |
|
|
24
|
+
| `@trace.bdd_version` | Version **cả file** — tăng 0.1 mỗi lần gen lại / `--fix` | ✅ |
|
|
25
|
+
| `@trace.status` | `draft` / `in-review` / `approved` — cổng duyệt BDD | ✅ |
|
|
26
|
+
| `@trace.title` · `@trace.revision` · `@trace.author` · `@trace.created_at` · `@trace.business_rules` · `@trace.dataset` | thông tin | ⚪ |
|
|
27
|
+
| `@trace.service` · `@trace.module` | chỉ **umbrella mode**; vắng ở spec repo mode là đúng | ⚪ có điều kiện |
|
|
28
|
+
| `@trace.api_source` | `existing` — chỉ khi `platform = system` và PRD brownfield | ⚪ có điều kiện |
|
|
29
|
+
|
|
30
|
+
> **`@trace.platform` là field load-bearing nhất.** Thiếu nó: `/generate-code` không quyết được BE/FE (và **cấm** fallback sang `platform_type`), không định vị được sổ trace `{UC-ID}-{platform}.tsv`, không tìm được design-spec. Nó phải **khớp** segment `{platform}` của đường dẫn file.
|
|
31
|
+
|
|
32
|
+
### BDD — mỗi scenario
|
|
12
33
|
|
|
13
34
|
| Tag | Ý nghĩa |
|
|
14
35
|
|-----|---------|
|
|
15
|
-
| `@trace.
|
|
16
|
-
|
|
|
17
|
-
| `@trace.business_rules` | BR liên quan
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
| `@trace.status` | `draft` / `in-review` / `approved` (gate) |
|
|
21
|
-
| `@trace.platform` | `web` / `app` / `system` |
|
|
22
|
-
| `@trace.domain` | Domain nghiệp vụ |
|
|
36
|
+
| `@trace.scenario` | SC-ID — `{UC-ID}-SC{N}` (vd `SEG01-UC1-SC3`) |
|
|
37
|
+
| **`@trace.sc_version`** | Version **của riêng scenario này**. Tăng 0.1 khi **thân SC** đổi (tên · step · data table · side-effect). |
|
|
38
|
+
| `@trace.business_rules` | BR liên quan — `{TICKET-ID}-UC{N}-BR{m}` |
|
|
39
|
+
|
|
40
|
+
> **`sc_version` vs `bdd_version`:** `sc_version` là tín hiệu **duy nhất** cho `DRIFT` (`spec_ver != gen_ver`). `bdd_version` bắt thay đổi cấp file mà `sc_version` không thấy (Background, dataset, Business Definition, Coverage Matrix). Quên bump `sc_version` = code sinh từ scenario cũ **vĩnh viễn** hiện `OK`.
|
|
23
41
|
|
|
24
|
-
### Code (boundary only)
|
|
42
|
+
### Code — entry-point (boundary only)
|
|
43
|
+
|
|
44
|
+
```java
|
|
45
|
+
// @trace.implements=SEG01-UC1-SC3
|
|
46
|
+
// @trace.prd_version=1.2
|
|
47
|
+
// @trace.bdd_version=1.4
|
|
48
|
+
// @trace.tech_doc_revision=3
|
|
49
|
+
// @trace.design_spec_version=1.5 ← CHỈ FE/App; bỏ hẳn dòng này với system/backend
|
|
50
|
+
// @trace.source=specs/segment/scoring/bdd/system/SEG01-UC1-scoring.feature
|
|
51
|
+
public ScoreDto calculate(...) { }
|
|
52
|
+
```
|
|
25
53
|
|
|
26
54
|
| Tag | Ý nghĩa |
|
|
27
55
|
|-----|---------|
|
|
28
56
|
| `@trace.implements` | SC mà method này hiện thực |
|
|
29
|
-
| `@trace.
|
|
57
|
+
| `@trace.prd_version` · `@trace.bdd_version` · `@trace.tech_doc_revision` | version của từng artifact upstream **tại thời điểm codegen** — nguồn của `PRD_DRIFT` / `BDD_DRIFT` / `TECHDOC_DRIFT` |
|
|
58
|
+
| `@trace.design_spec_version` | *(chỉ FE/App)* version design-spec lúc codegen — nguồn của `DESIGNSPEC_DRIFT`. Design-spec điều khiển cả BDD FE/App lẫn code FE, nhưng từng là artifact upstream **duy nhất** không có cột, không có tag, không có cờ |
|
|
59
|
+
| `@trace.source` | `.feature` nguồn — **phải gồm segment `{platform}`** |
|
|
60
|
+
|
|
61
|
+
> **5 tag bắt buộc — 6 với FE/App.** `/review-code` lăng kính Traceability gác: thiếu tag nào = `major`; riêng `@trace.design_spec_version` bất đối xứng — thiếu ở FE = `major`, **có** ở backend = `minor` (tag thừa, không có design-spec để so).
|
|
62
|
+
|
|
63
|
+
> **File phủ nhiều UC → lặp CẢ BLOCK theo từng method.** Không gộp về một header file, không trỏ thư mục. 4 tag version là scalar **theo từng UC**; gộp lại thì không diễn đạt được "UC1 ở bdd v1.4, UC3 ở v2.1" → drift báo oan hoặc mù. Và các lệnh tra tag bằng **khớp chuỗi chính xác**, nên `@trace.source` trỏ thư mục sẽ ra 0 kết quả → UC rơi về `UNTRACKED` dù code đã có.
|
|
30
64
|
|
|
31
|
-
|
|
65
|
+
### Code — chỗ chưa implement (sổ `_seams.tsv`)
|
|
66
|
+
|
|
67
|
+
| Tag | Đặt ở đâu | Ý nghĩa |
|
|
68
|
+
|-----|---|---------|
|
|
69
|
+
| `@trace.stub` · `@trace.stub_owner` · `@trace.stub_for` | method trắng | logic thuộc BDD **khác của cùng feature** — ai để trắng / ai sẽ lấp / trách nhiệm gì |
|
|
70
|
+
| `@trace.seam_pending` · `@trace.seam_port` | class stub | port **cross-UC** do UC khác sở hữu, hàng thật chưa có |
|
|
32
71
|
|
|
33
72
|
### Test
|
|
34
73
|
|
|
35
74
|
| Tag | Ý nghĩa |
|
|
36
75
|
|-----|---------|
|
|
37
|
-
| `@trace.verifies` | SC mà test kiểm chứng
|
|
38
|
-
| `@trace.covers` | Phạm vi phủ |
|
|
76
|
+
| `@trace.verifies` | SC mà test kiểm chứng — `{UC-ID}-SC{N}` |
|
|
39
77
|
|
|
40
78
|
### Bug fix
|
|
41
79
|
|
|
42
80
|
| Tag | Ý nghĩa |
|
|
43
81
|
|-----|---------|
|
|
44
|
-
| `@trace.fixes` |
|
|
82
|
+
| `@trace.fixes` | `{BUG-ID}` nếu fix từ bug report đã file, else TICKET_ID |
|
|
45
83
|
| `@trace.root_cause` | Nguyên nhân gốc |
|
|
46
84
|
| `@trace.regression` | Test regression thêm vào |
|
|
47
85
|
|
|
86
|
+
### Tech-doc gộp (header, cấp PRD)
|
|
87
|
+
|
|
88
|
+
| Tag | Ý nghĩa |
|
|
89
|
+
|-----|---------|
|
|
90
|
+
| `@trace.id` · `@trace.domain` · `@trace.prd` | định danh |
|
|
91
|
+
| `@trace.ucs` | **danh sách** UC mà doc này phủ |
|
|
92
|
+
| `@trace.platforms` | platform có mặt |
|
|
93
|
+
| `@trace.bdd_versions` | **map theo platform** (`system=1.5, web=1.9`). Tên **số nhiều** để phân biệt với `@trace.bdd_version` (scalar) của `.feature` — cùng tên cho hai kiểu dữ liệu sẽ làm vỡ parser generic. |
|
|
94
|
+
| `@trace.revision` | integer, bump mỗi lần sửa — nguồn của `TECHDOC_DRIFT` |
|
|
95
|
+
| `@trace.status` | `draft` / `in-review` / `approved` — cổng của `/generate-code` DS3 |
|
|
96
|
+
| `@trace.api_source` | `existing` → chế độ reverse-document, bỏ cổng T7 |
|
|
97
|
+
|
|
48
98
|
---
|
|
49
99
|
|
|
50
100
|
## Boundary-only tagging
|
|
51
101
|
|
|
52
102
|
| ✅ Tag | ❌ Không tag |
|
|
53
103
|
|--------|-------------|
|
|
54
|
-
| Controller · Handler · Middleware · Steps file | Entity · Repository · DTO · Interface · Base class |
|
|
104
|
+
| Controller · Handler · Middleware · Consumer · Steps file | Entity · Repository · DTO · Interface · Base class |
|
|
55
105
|
|
|
56
106
|
Shared code dò qua **import chain** từ boundary → tránh tag explosion.
|
|
57
107
|
|
|
@@ -59,34 +109,92 @@ Shared code dò qua **import chain** từ boundary → tránh tag explosion.
|
|
|
59
109
|
|
|
60
110
|
## Trace state — `.tsv`
|
|
61
111
|
|
|
62
|
-
Đường dẫn: `.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv`
|
|
112
|
+
Đường dẫn: `.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv` — **một sổ cho mỗi UC × platform** (`sc_id` chỉ độc nhất trong phạm vi đó; `web-SC1` và `system-SC1` là hai scenario khác nhau). Ở umbrella + `spec_source`, sổ nằm trong spec repo.
|
|
113
|
+
|
|
114
|
+
**24 cột, tab-separated:**
|
|
115
|
+
|
|
116
|
+
| # | Cột | Ý nghĩa | Chủ ghi |
|
|
117
|
+
|---|-----|---------|---------|
|
|
118
|
+
| 1 | `sc_id` | `{UC-ID}-SC{N}` | generate-bdd |
|
|
119
|
+
| 2 | `sc_title` | tiêu đề scenario | generate-bdd |
|
|
120
|
+
| 3 | `spec_ver` | gương của `@trace.sc_version` hiện tại | generate-bdd · validate-traces |
|
|
121
|
+
| 4 | `gen_ver` | `spec_ver` **tại thời điểm codegen** | generate-code |
|
|
122
|
+
| 5 | `implemented_by` | `{Class}.{method}` (`—` nếu chưa) | generate-code |
|
|
123
|
+
| 6 | `test_count` | số test phủ SC | dev-gen-test · fix-bug |
|
|
124
|
+
| 7 | `test_classes` | tên test class / describe | dev-gen-test · fix-bug |
|
|
125
|
+
| 8 | `dev_selftest` | `pass`/`fail`/`not_run` — **dev tự chạy** | **chủ:** dev-run-test · *hạ hiệu lực:* generate-bdd · generate-code · fix-bug |
|
|
126
|
+
| 9 | `dev_selftest_at` | ngày | như trên |
|
|
127
|
+
| 10 | `qc_status` | `pass`/`fail`/`skip`/`not_run` — **QC chính thức** | **chủ:** qc-run-test · *hạ hiệu lực:* generate-bdd · generate-code |
|
|
128
|
+
| 11 | `qc_run_at` | ngày | như trên |
|
|
129
|
+
| 12 | `qc_owner` | SC đang chờ ai: `dev` / `po` | qc-run-test · report-bug |
|
|
130
|
+
| 13 | `qc_blocked_by` | `BUG-{id}` / `GAP-{id}` | qc-run-test · report-bug |
|
|
131
|
+
| 14 | `prd_version` | version PRD lúc sinh BDD | generate-bdd |
|
|
132
|
+
| 15 | `bdd_version` | version `.feature` | generate-bdd · review-context |
|
|
133
|
+
| 16 | `tech_doc_revision` | `@trace.revision` của tech-doc | generate-code · review-tech-docs |
|
|
134
|
+
| 17 | `fe_tech_doc_revision` | revision lúc FE wire adapter thật (§4.5.4) | generate-code |
|
|
135
|
+
| 18 | `prd_status` | gương của PRD Metadata `Status` | generate-bdd · validate-traces |
|
|
136
|
+
| 19 | `uc_status` | gương của `@trace.status` (`.feature`) | generate-bdd · validate-traces |
|
|
137
|
+
| 20 | `fe_phase` | `ui` / `integrated` / `—` | generate-code `--phase` |
|
|
138
|
+
| 21 | `status` | tổng hợp — xem bảng dưới | validate-traces |
|
|
139
|
+
| 22 | `last_updated` | `YYYY-MM-DD` | mọi lệnh ghi row |
|
|
140
|
+
| 23 | `service` | đội/submodule sở hữu — `multi`/`unresolved`/`—` | generate-bdd *(từ `@trace.service`)* |
|
|
141
|
+
| 24 | `design_spec_version` | version design-spec lúc sinh BDD — `—` cho backend | generate-bdd |
|
|
142
|
+
|
|
143
|
+
> `dev_selftest` (dev smoke) và `qc_status` (QC chính thức) là **hai tín hiệu riêng**, không bao giờ gộp. Cả hai **trực giao** với `status` — `status` đo *coverage*, chúng đo *kết quả chạy*.
|
|
144
|
+
|
|
145
|
+
> **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**. 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ố).
|
|
146
|
+
|
|
147
|
+
> Giá trị rỗng trong TSV là `—`. Khi xuất JSON: `implemented_by`→`null`, `test_count`→`0`, `test_classes`→`[]`, `tech_doc_revision`/`fe_tech_doc_revision`→`0`, `dev_selftest`/`qc_status`→`"not_run"`, `service`/`design_spec_version`→`null`.
|
|
148
|
+
|
|
149
|
+
> **Backward-compat:** TSV cũ thiếu cột mới → đọc thành giá trị rỗng, **không báo lỗi**. Đọc theo **tên cột ở header row**, không theo vị trí. Header tự nâng lên 24 cột ở lần `/generate-bdd` gen lại kế tiếp — không cần script migration.
|
|
150
|
+
|
|
151
|
+
---
|
|
63
152
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
|
67
|
-
|
|
68
|
-
|
|
|
69
|
-
|
|
|
70
|
-
|
|
|
71
|
-
| `
|
|
72
|
-
|
|
|
73
|
-
|
|
74
|
-
|
|
153
|
+
## Phân loại `status` (thứ tự ưu tiên, first-match-wins)
|
|
154
|
+
|
|
155
|
+
| # | Trạng thái | Điều kiện | Hành động |
|
|
156
|
+
|---|-----------|-----------|-----------|
|
|
157
|
+
| 0 | **ORPHANED** | SC **không còn trong `.feature`** nhưng `implemented_by != —` | Người quyết định: xoá code+test, hoặc đưa scenario trở lại |
|
|
158
|
+
| 1 | **UNTRACKED** | `implemented_by == —` | `/generate-code` |
|
|
159
|
+
| 2 | **DRIFT** | có code **và** `spec_ver != gen_ver` | regen **trước khi** test |
|
|
160
|
+
| 3 | **GAP** | có code **và** `test_count == —`/`0` | `/dev-gen-test` |
|
|
161
|
+
| 4 | **OK** | version khớp, có code, có test | đủ phủ |
|
|
162
|
+
|
|
163
|
+
`code_coverage = (rows where implemented_by != —) / total_scs` — **`total_scs` loại row `ORPHANED`** (không còn là scope; tính vào sẽ bóp méo coverage vì thứ không ai cần implement).
|
|
164
|
+
|
|
165
|
+
> **ORPHANED là Rule 0** vì 4 rule kia đều giả định scenario **còn tồn tại**. Để rule khác thắng thì mỗi giá trị route người dùng sang một lệnh vô nghĩa: `GAP`→sinh test cho SC không tồn tại · `DRIFT`→regen từ SC đã xoá · `OK`→cho tạo PR.
|
|
166
|
+
>
|
|
167
|
+
> **DRIFT xét trước 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 và test lại sinh trên code cũ.
|
|
75
168
|
|
|
76
169
|
---
|
|
77
170
|
|
|
78
|
-
##
|
|
171
|
+
## Cờ audit (không phải cột — do `/validate-traces` tính)
|
|
172
|
+
|
|
173
|
+
| Cờ | Nguồn | Nghĩa |
|
|
174
|
+
|---|---|---|
|
|
175
|
+
| `PRD_DRIFT` | Step 4 | version PRD lệch **và** changelog **có** nêu UC này → nội dung đổi thật |
|
|
176
|
+
| `PRD_STALE_REF` ⓘ | Step 4 | version lệch nhưng changelog **không** nêu UC này → chỉ con trỏ cũ. `--realign-prd-version` |
|
|
177
|
+
| `BDD_DRIFT` | Step 5c | code mang `@trace.bdd_version` cũ hơn `.feature` |
|
|
178
|
+
| `TECHDOC_DRIFT` · `FE_TECHDOC_DRIFT` | Step 5 | code sinh từ revision tech-doc cũ hơn, **và** changelog nêu UC này |
|
|
179
|
+
| `TECHDOC_STALE_REF` ⓘ | Step 5 | đối xứng `PRD_STALE_REF`. `--realign-techdoc-revision` |
|
|
180
|
+
| `TECHDOC_STALE_VS_BDD` | Step 5c | tech-doc dựng từ BDD cũ hơn `.feature` hiện tại |
|
|
181
|
+
| `DESIGNSPEC_DRIFT` · `DESIGNSPEC_STALE_VS_BDD` | Step 5d | *(chỉ FE/App)* code / BDD dựng từ design-spec cũ hơn bản hiện tại |
|
|
182
|
+
| `TRACE_ORPHAN` 🔴 | Step 2b | tag `@trace.implements`/`@trace.verifies` trỏ SC không tồn tại **và** không có row TSV |
|
|
183
|
+
| `SEAM_UNWIRED` 🔴 | Step 5b | hàng thật đã có nhưng consumer còn wire vào stub |
|
|
184
|
+
| `STUB_UNRESOLVED` 🔴 | Step 5b | method còn trắng dù owner đã gen / có hàm song song |
|
|
185
|
+
| `SEAM_PENDING` · `STUB_PENDING` | Step 5b | owner UC chưa gen — **bình thường**, chỉ nhắc |
|
|
186
|
+
|
|
187
|
+
> 🔴 = **chặn PR**. Build xanh, test từng-UC xanh, coverage đẹp — nhưng luồng ghép chạy vào no-op hoặc code trỏ vào scenario đã bị xoá.
|
|
188
|
+
>
|
|
189
|
+
> ⓘ = **không phải lỗi.** Hai cờ `*_STALE_REF` tồn tại vì version PRD/tech-doc là **MỘT số cho cả tài liệu nhiều UC** — thêm một UC làm mọi UC cũ lệch số dù không đổi một chữ. Không lọc thì cả loạt UC ăn cờ đỏ oan, và làm theo hướng dẫn cũng không tắt được (`/generate-code` skip row đang `OK`). Sạch bằng `--realign-*`: chỉ sửa dòng `@trace.*`, **không đụng logic**, và **từ chối chạy** nếu UC đó đang thật sự `DRIFT`/`ORPHANED`.
|
|
190
|
+
>
|
|
191
|
+
> **Mọi cờ đều PHẢI có counter `{flag}_count`** trong Step 7 + `summary` của `trace-report.json` — `bin/self-check.js` R7 ép, không có ngoại lệ. Thiếu counter = cờ vô hình với dashboard.
|
|
79
192
|
|
|
80
|
-
|
|
81
|
-
|---|-----------|-----------|
|
|
82
|
-
| 1 | **UNTRACKED** | `gen_ver == —` |
|
|
83
|
-
| 2 | **DRIFT** | `implemented_by != —` AND `spec_ver != gen_ver` |
|
|
84
|
-
| 3 | **GAP** | `implemented_by != —` AND (`test_count == —` OR `0`) |
|
|
85
|
-
| 4 | **OK** | `spec_ver == gen_ver` AND `implemented_by != —` AND `test_count > 0` |
|
|
193
|
+
---
|
|
86
194
|
|
|
87
|
-
|
|
195
|
+
## Xuất JSON cho panel
|
|
88
196
|
|
|
89
|
-
|
|
197
|
+
`trace-report.json` giữ enum `status` **đúng 4 giá trị** `OK`/`DRIFT`/`GAP`/`UNTRACKED` — VS Code extension "Spec Driven Docs Tools" sống ngoài repo framework và switch trên field này. Row `ORPHANED` xuất ra là `"status": "DRIFT"` + `"orphaned": true`; panel cũ hiện nó như DRIFT (đúng nghĩa, không im lặng), panel mới đọc `orphaned` để hiện nhãn riêng. **TSV giữ nguyên chữ `ORPHANED`** — TSV là nguồn-sự-thật.
|
|
90
198
|
|
|
91
199
|
---
|
|
92
200
|
|
|
@@ -1,78 +1,80 @@
|
|
|
1
|
-
[← /define-product](01-define-product.md) · [Explain Home](README.md) · [Next: /
|
|
2
|
-
|
|
3
|
-
# 02 · `/generate-prd` — Sinh Product Requirements Document
|
|
4
|
-
|
|
5
|
-
> **Một câu.** Biến `product-definition` (8 phase Q&A) thành một **PRD chuẩn nghiệp vụ** đúng template, với đánh số UC/BR và traceability AC↔BR↔UC.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Vấn đề giải quyết
|
|
10
|
-
|
|
11
|
-
`product-definition` là bản ghi buổi discovery — chưa phải tài liệu chính thức. `/generate-prd` chuyển nó thành **PRD** có cấu trúc cố định (Metadata, AC, UC, BR, Wireframe, Change Log), đánh số nhất quán, và **link traceability** — làm hợp đồng nghiệp vụ để phân rã xuống BDD.
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## Vị trí & tiền đề
|
|
16
|
-
|
|
17
|
-
- **Vị trí:** Phase Specification (đầu).
|
|
18
|
-
- **Tiền đề:** có `product-definition/{TICKET-ID}-{slug}.md`.
|
|
19
|
-
- **Gate ra:** PRD sinh với `Status: draft` — cần `/refine-prd` + `/review-context` + PO approve.
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## Input / Output
|
|
24
|
-
|
|
25
|
-
**Input:** file product-definition + bảng **Chuẩn hoá thuật ngữ** (Phase 0) + business-dictionary + core-entities.
|
|
26
|
-
|
|
27
|
-
**Output:** `{specs_dir}/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md` — **một** file PRD ở gốc feature folder (KHÔNG đặt tên `prd.md`).
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## Các bước xử lý (chi tiết)
|
|
32
|
-
|
|
33
|
-
Sau Gate + Context-Loader + Business Language Guard:
|
|
34
|
-
|
|
35
|
-
1. **Áp Terminology Map từ product-definition** — mỗi cặp `thuật ngữ PO → chuẩn` dùng bản chuẩn khi viết PRD (ưu tiên kể cả khi dictionary vắng).
|
|
36
|
-
2. **Thay banned term + chỉ dùng canonical term.**
|
|
37
|
-
3. **NEW TERM DETECTION (lưới an toàn)** — nếu vẫn còn thuật ngữ lặp ≥2 lần không có trong dictionary → **DỪNG hỏi PO** (nghĩa là gì, English canonical, bổ sung dictionary?).
|
|
38
|
-
4. **Quy tắc Cross-Reference** — mọi TICKET-ID khác được nhắc → phải là inline link tới folder anh em `../{prd-slug-khác}/…`, không để plain text.
|
|
39
|
-
5. **Đánh số UC/BR:**
|
|
40
|
-
- UC: `{TICKET}-UC{n}` (n từ 1).
|
|
41
|
-
- BR: `{TICKET}-UC{n}-BR{m}` — **m tăng liên tục toàn PRD, KHÔNG reset theo UC**.
|
|
42
|
-
6. **Traceability AC↔BR↔UC (2 chiều bắt buộc):**
|
|
43
|
-
- Mỗi AC remap ref BR từ discovery → BR ID của PRD; mỗi AC có ≥1 ref BR.
|
|
44
|
-
- Mỗi UC liệt kê "AC liên quan"; hai chiều phải **khớp đúng** (lệch = lỗi traceability, sửa trước khi ghi).
|
|
45
|
-
7. **Platform Strategy** — PRD thuần WHAT nghiệp vụ; cho phép Wireframe mức nghiệp vụ; chi tiết visual → Design Spec, contract kỹ thuật → Tech Docs.
|
|
46
|
-
- **Ngoại lệ brownfield:** `API Source: existing` → Appendix "Existing API Contract" được chứa chi tiết kỹ thuật (trích as-is).
|
|
47
|
-
8. **Generate** — ghi PRD theo template: Metadata (Version 1.0, Status draft, Domain, Ticket, API Source) · Feature · §1 Tổng quan (User Story, Scope, Phụ thuộc liên service) · §2 AC · §3 UC (BR table 3 cột: ID | Business Rule | Business Logic) · Wireframe · Change Log.
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## Checkpoint & Gate
|
|
52
|
-
|
|
53
|
-
- Không checkpoint riêng ngoài Gate chung + DỪNG khi NEW TERM.
|
|
54
|
-
- Output `Status: draft` — **chưa** mở khoá downstream.
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## Cơ chế đặc biệt
|
|
59
|
-
|
|
60
|
-
- **BR đánh số liên tục toàn PRD** (không reset) — để BR ID tự mang thông tin UC, suy ngược traceability.
|
|
61
|
-
- **AC↔BR↔UC nhất quán 2 chiều** — self-check ngay khi sinh.
|
|
62
|
-
- **Business Rule = bảng 3 cột** (không tách Business Logic ra khối riêng) — giữ altitude.
|
|
63
|
-
- **Brownfield exception** — chỉ Appendix "Existing API Contract" được chứa kỹ thuật.
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## 👓 Góc nhìn tối ưu
|
|
68
|
-
|
|
69
|
-
- **NEW TERM detection lặp lại** ở cả `/define-product` (Phase 0/3) lẫn đây (lưới an toàn). Nếu discovery làm tốt, bước này hiếm khi kích hoạt — nhưng vẫn tốn prompt. Cân nhắc: đây là redundancy có chủ đích (an toàn) hay dư thừa?
|
|
70
|
-
- **Traceability 2 chiều tự kiểm** là điểm mạnh — có thể là mẫu để nhân sang các artifact khác.
|
|
71
|
-
- **Phụ thuộc chất lượng product-definition** — nếu discovery sơ sài, PRD sẽ mỏng; `/generate-prd` không tự bù bằng Q&A (đó là việc `/refine-prd`).
|
|
72
|
-
- **Business Language Guard chạy lại** ở đây dù đã chạy ở discovery — chi phí lặp.
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
## Kết nối
|
|
77
|
-
|
|
78
|
-
**Trước:** [`/define-product`](01-define-product.md) · **Sau:** [`/refine-prd`](03-refine-prd.md) → [`/review-context`](04-review-context.md).
|
|
1
|
+
[← /define-product](01-define-product.md) · [Explain Home](README.md) · [Next: /extend-prd →](02b-extend-prd.md)
|
|
2
|
+
|
|
3
|
+
# 02 · `/generate-prd` — Sinh Product Requirements Document
|
|
4
|
+
|
|
5
|
+
> **Một câu.** Biến `product-definition` (8 phase Q&A) thành một **PRD chuẩn nghiệp vụ** đúng template, với đánh số UC/BR và traceability AC↔BR↔UC.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Vấn đề giải quyết
|
|
10
|
+
|
|
11
|
+
`product-definition` là bản ghi buổi discovery — chưa phải tài liệu chính thức. `/generate-prd` chuyển nó thành **PRD** có cấu trúc cố định (Metadata, AC, UC, BR, Wireframe, Change Log), đánh số nhất quán, và **link traceability** — làm hợp đồng nghiệp vụ để phân rã xuống BDD.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Vị trí & tiền đề
|
|
16
|
+
|
|
17
|
+
- **Vị trí:** Phase Specification (đầu).
|
|
18
|
+
- **Tiền đề:** có `product-definition/{TICKET-ID}-{slug}.md`.
|
|
19
|
+
- **Gate ra:** PRD sinh với `Status: draft` — cần `/refine-prd` + `/review-context` + PO approve.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Input / Output
|
|
24
|
+
|
|
25
|
+
**Input:** file product-definition + bảng **Chuẩn hoá thuật ngữ** (Phase 0) + business-dictionary + core-entities.
|
|
26
|
+
|
|
27
|
+
**Output:** `{specs_dir}/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md` — **một** file PRD ở gốc feature folder (KHÔNG đặt tên `prd.md`).
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Các bước xử lý (chi tiết)
|
|
32
|
+
|
|
33
|
+
Sau Gate + Context-Loader + Business Language Guard:
|
|
34
|
+
|
|
35
|
+
1. **Áp Terminology Map từ product-definition** — mỗi cặp `thuật ngữ PO → chuẩn` dùng bản chuẩn khi viết PRD (ưu tiên kể cả khi dictionary vắng).
|
|
36
|
+
2. **Thay banned term + chỉ dùng canonical term.**
|
|
37
|
+
3. **NEW TERM DETECTION (lưới an toàn)** — nếu vẫn còn thuật ngữ lặp ≥2 lần không có trong dictionary → **DỪNG hỏi PO** (nghĩa là gì, English canonical, bổ sung dictionary?).
|
|
38
|
+
4. **Quy tắc Cross-Reference** — mọi TICKET-ID khác được nhắc → phải là inline link tới folder anh em `../{prd-slug-khác}/…`, không để plain text.
|
|
39
|
+
5. **Đánh số UC/BR:**
|
|
40
|
+
- UC: `{TICKET}-UC{n}` (n từ 1).
|
|
41
|
+
- BR: `{TICKET}-UC{n}-BR{m}` — **m tăng liên tục toàn PRD, KHÔNG reset theo UC**.
|
|
42
|
+
6. **Traceability AC↔BR↔UC (2 chiều bắt buộc):**
|
|
43
|
+
- Mỗi AC remap ref BR từ discovery → BR ID của PRD; mỗi AC có ≥1 ref BR.
|
|
44
|
+
- Mỗi UC liệt kê "AC liên quan"; hai chiều phải **khớp đúng** (lệch = lỗi traceability, sửa trước khi ghi).
|
|
45
|
+
7. **Platform Strategy** — PRD thuần WHAT nghiệp vụ; cho phép Wireframe mức nghiệp vụ; chi tiết visual → Design Spec, contract kỹ thuật → Tech Docs.
|
|
46
|
+
- **Ngoại lệ brownfield:** `API Source: existing` → Appendix "Existing API Contract" được chứa chi tiết kỹ thuật (trích as-is).
|
|
47
|
+
8. **Generate** — ghi PRD theo template: Metadata (Version 1.0, Status draft, Domain, Ticket, API Source) · Feature · §1 Tổng quan (User Story, Scope, Phụ thuộc liên service) · §2 AC · §3 UC (BR table 3 cột: ID | Business Rule | Business Logic) · Wireframe · Change Log.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Checkpoint & Gate
|
|
52
|
+
|
|
53
|
+
- Không checkpoint riêng ngoài Gate chung + DỪNG khi NEW TERM.
|
|
54
|
+
- Output `Status: draft` — **chưa** mở khoá downstream.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Cơ chế đặc biệt
|
|
59
|
+
|
|
60
|
+
- **BR đánh số liên tục toàn PRD** (không reset) — để BR ID tự mang thông tin UC, suy ngược traceability.
|
|
61
|
+
- **AC↔BR↔UC nhất quán 2 chiều** — self-check ngay khi sinh.
|
|
62
|
+
- **Business Rule = bảng 3 cột** (không tách Business Logic ra khối riêng) — giữ altitude.
|
|
63
|
+
- **Brownfield exception** — chỉ Appendix "Existing API Contract" được chứa kỹ thuật.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 👓 Góc nhìn tối ưu
|
|
68
|
+
|
|
69
|
+
- **NEW TERM detection lặp lại** ở cả `/define-product` (Phase 0/3) lẫn đây (lưới an toàn). Nếu discovery làm tốt, bước này hiếm khi kích hoạt — nhưng vẫn tốn prompt. Cân nhắc: đây là redundancy có chủ đích (an toàn) hay dư thừa?
|
|
70
|
+
- **Traceability 2 chiều tự kiểm** là điểm mạnh — có thể là mẫu để nhân sang các artifact khác.
|
|
71
|
+
- **Phụ thuộc chất lượng product-definition** — nếu discovery sơ sài, PRD sẽ mỏng; `/generate-prd` không tự bù bằng Q&A (đó là việc `/refine-prd`).
|
|
72
|
+
- **Business Language Guard chạy lại** ở đây dù đã chạy ở discovery — chi phí lặp.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Kết nối
|
|
77
|
+
|
|
78
|
+
**Trước:** [`/define-product`](01-define-product.md) · **Sau:** [`/refine-prd`](03-refine-prd.md) → [`/review-context`](04-review-context.md).
|
|
79
|
+
|
|
80
|
+
> **PRD đã tồn tại?** Lệnh này **từ chối chạy** — dùng [`/extend-prd`](02b-extend-prd.md). Ghi đè sẽ mất `# Change Log` + rollover, Version/Status thật, và **đánh số lại BR từ đầu** (phá mọi `@trace.business_rules` trong `bdd/` đã sinh). Ba mất mát đều không hoàn tác được từ trong lệnh → dừng hẳn, **không hỏi Y/N**.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
[← /generate-prd](02-generate-prd.md) · [Explain Home](README.md) · [Next: /refine-prd →](03-refine-prd.md)
|
|
2
|
+
|
|
3
|
+
# 02b · `/extend-prd` — Thêm yêu cầu vào PRD đã duyệt
|
|
4
|
+
|
|
5
|
+
> **Một câu.** Thêm UC/AC/BR mới vào một PRD **đã ship**, đánh số **nối tiếp** (không bao giờ đánh lại), ghi **add-only** kèm guard sau-ghi, và drain hàng đợi `feedback/prd-change-requests/`.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Vấn đề giải quyết
|
|
10
|
+
|
|
11
|
+
Đây là bước **xảy ra nhiều nhất sau khi sản phẩm đã sống** — và trước v0.4.3 là bước **duy nhất trong toàn pipeline không có lệnh**.
|
|
12
|
+
|
|
13
|
+
Ba lệnh chạm PRD đều không dùng được:
|
|
14
|
+
|
|
15
|
+
| Lệnh | Vì sao không |
|
|
16
|
+
|---|---|
|
|
17
|
+
| `/generate-prd` | Sinh PRD **mới** từ discovery. **Ghi đè** bản cũ, không có gì chặn |
|
|
18
|
+
| `/refine-prd` | Chỉ áp findings từ review, và **tự cấm** đụng section ngoài findings. Findings sinh từ việc soi PRD hiện có → **không có đường nào để một yêu cầu MỚI đi vào** |
|
|
19
|
+
| `/define-product` | Bắt đi hết **cả 7 phase** mọi lần; resume chỉ chạy khi `Completed Phase < 7` nên file `completed` không có gì để resume |
|
|
20
|
+
|
|
21
|
+
Nên PM phải làm tay **5 bước, đều là contract, đều không ai kiểm** — trong đó bước viết dòng changelog là contract **thật**: `/generate-bdd` đọc nó để quyết cập nhật hẹp hay gen lại toàn bộ, và `/validate-traces` đọc nó để lọc báo động oan.
|
|
22
|
+
|
|
23
|
+
Đây là chỗ framework **thôi bảo vệ bạn** — đúng lúc rủi ro cao nhất: sửa tài liệu đã ký duyệt của một feature đang chạy production.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Vị trí & tiền đề
|
|
28
|
+
|
|
29
|
+
- **Vị trí:** Phase Specification — nhánh *"PRD đã tồn tại"*.
|
|
30
|
+
- **Tiền đề:** có PRD. Không có → dùng `/generate-prd` (feature mới đi từ discovery).
|
|
31
|
+
- **Song hành:** `/generate-prd` giờ **từ chối chạy** trên PRD đã có và chỉ sang đây.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Input / Output
|
|
36
|
+
|
|
37
|
+
**Input:** file PRD + `feedback/prd-change-requests/*.md` (tuỳ chọn) + PO.
|
|
38
|
+
|
|
39
|
+
**Output:** PRD `v+1` với UC/AC/BR **nối tiếp**, `Status → draft`, row changelog nêu rõ scope; request đã xử → `archived/` + `Status: incorporated`.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Các bước xử lý (chi tiết)
|
|
44
|
+
|
|
45
|
+
### Bước 1 — Nạp trạng thái
|
|
46
|
+
`max_uc` · `max_br` · `max_ac` · danh sách UC hiện có · changelog · `bdd_generated`. Hai guard mềm: PRD đang `draft` (trộn hai việc) · BDD đã sinh (nêu rõ liên kết cũ **không** bị ảnh hưởng vì chỉ đánh số nối tiếp).
|
|
47
|
+
|
|
48
|
+
### Bước 2 — Drain hàng đợi
|
|
49
|
+
Quét `prd-change-requests/`, lọc theo TICKET-ID.
|
|
50
|
+
|
|
51
|
+
| Status | Xử lý |
|
|
52
|
+
|---|---|
|
|
53
|
+
| `accepted` | Thành **nguyên liệu** cho Bước 3 — **không** chèn thẳng vào PRD (yêu cầu nghiệp vụ phải qua PO chốt AC/BR đúng tầng) |
|
|
54
|
+
| `Open` | Trình PO ở CHECKPOINT kèm **số ngày chờ**; PO chọn từng cái |
|
|
55
|
+
| `rejected` / `incorporated` | Bỏ qua |
|
|
56
|
+
|
|
57
|
+
### Bước 3 — Discovery delta
|
|
58
|
+
Tái dùng Phase 1/4/5/6 của `/define-product` (bỏ Phase 0/2/7 vốn là toàn-feature), **cộng phase kiểm va chạm** — phase mà `/define-product` không có, vì lúc discovery lần đầu chưa có gì để va chạm:
|
|
59
|
+
|
|
60
|
+
| Câu hỏi | Kết quả |
|
|
61
|
+
|---|---|
|
|
62
|
+
| Phần thêm làm một BR cũ **sai đi** không? | → đây là **sửa** BR cũ, không phải thêm mới → bump **major** |
|
|
63
|
+
| Đã có UC/AC nào **phủ một phần** chưa? | → hỏi PO: mở rộng UC cũ hay tạo mới. **Không tự quyết** |
|
|
64
|
+
| Cần dữ liệu/năng lực từ đâu khác? | → §1c Phụ thuộc liên service |
|
|
65
|
+
|
|
66
|
+
Vẫn áp **Discovery Contract**: input của PO (kể cả nội dung request) là **nguyên liệu thô**, không phải câu trả lời thay phỏng vấn.
|
|
67
|
+
|
|
68
|
+
### Bước 4 — Đánh số nối tiếp
|
|
69
|
+
`UC{max+1}` · `BR{max+1}` *(tính trên **toàn PRD**, không reset theo UC)* · `AC{max+1}`.
|
|
70
|
+
|
|
71
|
+
### Bước 5 — Ghi add-only
|
|
72
|
+
Đọc lại file ngay trước khi ghi · **cấm Write cả file** · output là **superset chặt** · **guard sau-ghi** đối chiếu mọi UC/AC/BR/changelog row cũ còn nguyên, mất cái nào → **khôi phục + dừng**.
|
|
73
|
+
|
|
74
|
+
### Bước 6 — Bump + changelog
|
|
75
|
+
Tái dùng **nguyên** `/refine-prd` Phase 3: bump · `Status → draft` · row changelog · rollover >5 row sang `changelog/`.
|
|
76
|
+
|
|
77
|
+
### Bước 6.5 — Đóng dấu request
|
|
78
|
+
`Status: incorporated` + `Incorporated into: v{new}` + chuyển `archived/` + commit spec repo. Request PO **không** chốt → giữ `Open`, `/validate-traces` tiếp tục nhắc.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Checkpoint & Gate
|
|
83
|
+
|
|
84
|
+
- 🛑 **CHECKPOINT trước khi ghi** — hiện: PRD hiện tại · phần thêm · **cái cũ bị sửa** · request được đưa vào · version mới · **BDD ảnh hưởng**.
|
|
85
|
+
- 🛑 **Guard sau-ghi** — mất bất kỳ ID cũ nào là **chặn cứng**, khôi phục file.
|
|
86
|
+
- `Status` reset về `draft` → bắt buộc qua `/review-context` + PO duyệt lại. Không có đường đi tắt.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Cơ chế đặc biệt
|
|
91
|
+
|
|
92
|
+
### Hai ràng buộc cứng
|
|
93
|
+
|
|
94
|
+
**① Không đánh lại BẤT KỲ ID cũ nào.** Đánh lại — kể cả "cho gọn" — sẽ phá `@trace.business_rules` trong mọi `.feature` đã sinh, dòng "AC liên quan" của từng UC, và mọi cross-reference từ PRD khác trỏ tới AC/BR cụ thể.
|
|
95
|
+
|
|
96
|
+
Số bị bỏ trống (do UC bị xoá ở version trước) **để trống vĩnh viễn** — ID đã từng tồn tại có thể còn bị tham chiếu ở BDD, code, bug report, hoặc PRD khác.
|
|
97
|
+
|
|
98
|
+
**② Dòng changelog phải nêu rõ UC/AC/BR.**
|
|
99
|
+
|
|
100
|
+
| | |
|
|
101
|
+
|---|---|
|
|
102
|
+
| ✅ **Đúng** | `thêm UC7 (xuất nhiều file): AC12-AC14, BR21-BR23; sửa BR8 (nâng giới hạn 5→20)` |
|
|
103
|
+
| ❌ **Sai** | `cập nhật theo yêu cầu mới` |
|
|
104
|
+
|
|
105
|
+
Dòng mơ hồ làm **mất cả hai** bộ lọc cùng lúc: `/generate-bdd` khuyến nghị gen lại **toàn bộ**, **và** `/validate-traces` gắn `PRD_DRIFT` 🟠 cho **mọi** UC thay vì chỉ UC mới.
|
|
106
|
+
|
|
107
|
+
### Vì sao là lệnh riêng, không phải `/generate-prd --extend`
|
|
108
|
+
|
|
109
|
+
Hai chế độ **ngược nhau về thao tác ghi**: `/generate-prd` **Write cả file**, lệnh này **chỉ Edit add-only**. Trộn vào một file là một file hai hành vi — người đọc chọn nhầm.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 👓 Góc nhìn tối ưu
|
|
114
|
+
|
|
115
|
+
- **Bề mặt mới lớn nhất, nhưng phần mới thật chỉ có 4:** nạp trạng thái · drain hàng đợi · đánh số nối tiếp · kỷ luật add-only. Gate, context-loader, business-language guard, discovery phases, version-bump, report-footer đều **tái dùng** thứ đã chạy.
|
|
116
|
+
- **Kỷ luật add-only copy nguyên từ `/generate-code`** — cùng bài toán (thêm vào artifact chung mà không xoá phần của người khác), nên copy giải pháp đã kiểm chứng thay vì phát minh lại.
|
|
117
|
+
- **Chất lượng changelog là điểm yếu duy nhất** — nó quyết định chất lượng của hai bộ lọc downstream. Đáng đo: dòng changelog thực tế có nêu đủ scope không?
|
|
118
|
+
- **Ranh giới với `/refine-prd`** dễ lẫn nếu không đọc header: *"PRD có **vấn đề** gì"* vs *"PRD **thiếu** cái gì mới"*.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Kết nối
|
|
123
|
+
|
|
124
|
+
**Trước:** [`/propose-scenario`](26-propose-scenario.md) Case B (ghi request) · hoặc PO trực tiếp.
|
|
125
|
+
**Sau:** [`/refine-prd`](03-refine-prd.md) → [`/review-context`](04-review-context.md) → PO duyệt → [`/generate-bdd`](06-generate-bdd.md) **chỉ cho UC MỚI**; UC cũ dùng `/validate-traces --realign-prd-version {UC-ID}`.
|