@educa-corp/sdd-framework 0.4.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/build.js +113 -19
- package/bin/gate-trace.js +464 -0
- package/bin/index.js +418 -146
- package/bin/lint-trace.js +602 -0
- package/bin/self-check.js +499 -6
- package/bin/trace-schema.json +1449 -692
- package/commands/debug.md +123 -510
- package/commands/debug.tmpl +3 -0
- package/commands/define-product.md +86 -509
- package/commands/dev-gen-test.md +120 -516
- package/commands/dev-run-test.md +120 -516
- package/commands/dev-smoke-test.md +86 -509
- package/commands/extend-prd.md +486 -0
- package/commands/extend-prd.tmpl +273 -0
- package/commands/fix-bug.md +152 -515
- package/commands/generate-architecture.md +94 -514
- package/commands/generate-architecture.tmpl +3 -0
- package/commands/generate-bdd.md +138 -519
- package/commands/generate-bdd.tmpl +18 -3
- package/commands/generate-code.md +156 -523
- package/commands/generate-code.tmpl +36 -7
- package/commands/generate-design-spec.md +86 -509
- package/commands/generate-prd.md +114 -509
- package/commands/generate-prd.tmpl +28 -0
- package/commands/generate-spec-manifest.md +86 -509
- package/commands/generate-tech-docs.md +86 -509
- package/commands/learn.md +172 -495
- package/commands/learn.tmpl +70 -3
- package/commands/map-testids.md +86 -509
- package/commands/propose-scenario.md +136 -508
- package/commands/propose-scenario.tmpl +52 -1
- package/commands/qc-analyze.md +86 -509
- package/commands/qc-design-test.md +87 -509
- package/commands/qc-design-test.tmpl +1 -0
- package/commands/qc-plan.md +86 -509
- package/commands/qc-report.md +86 -509
- package/commands/qc-review.md +86 -509
- package/commands/qc-run-test.md +133 -517
- package/commands/qc-run-test.tmpl +13 -1
- package/commands/refine-prd.md +99 -519
- package/commands/refine-prd.tmpl +3 -0
- package/commands/report-bug.md +86 -509
- package/commands/review-code.md +127 -513
- package/commands/review-code.tmpl +7 -3
- package/commands/review-context.md +96 -515
- package/commands/review-context.tmpl +6 -2
- package/commands/review-tech-docs.md +90 -510
- package/commands/review-tech-docs.tmpl +3 -0
- package/commands/setup-ai-first.md +166 -137
- package/commands/setup-ai-first.tmpl +72 -0
- package/commands/sync.md +86 -118
- package/commands/sync.tmpl +84 -16
- package/commands/update-framework.md +16 -102
- package/commands/update-framework.tmpl +14 -0
- package/commands/validate-traces.md +458 -531
- package/commands/validate-traces.tmpl +381 -31
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/README.md +20 -0
- package/core/commands/debug.md +123 -510
- package/core/commands/define-product.md +86 -509
- package/core/commands/dev-gen-test.md +120 -516
- package/core/commands/dev-run-test.md +120 -516
- package/core/commands/dev-smoke-test.md +86 -509
- package/core/commands/extend-prd.md +486 -0
- package/core/commands/fix-bug.md +152 -515
- package/core/commands/generate-architecture.md +94 -514
- package/core/commands/generate-bdd.md +138 -519
- package/core/commands/generate-code.md +156 -523
- package/core/commands/generate-design-spec.md +86 -509
- package/core/commands/generate-prd.md +114 -509
- package/core/commands/generate-spec-manifest.md +86 -509
- package/core/commands/generate-tech-docs.md +86 -509
- package/core/commands/learn.md +172 -495
- package/core/commands/map-testids.md +86 -509
- package/core/commands/propose-scenario.md +136 -508
- package/core/commands/qc-analyze.md +86 -509
- package/core/commands/qc-design-test.md +87 -509
- package/core/commands/qc-plan.md +86 -509
- package/core/commands/qc-report.md +86 -509
- package/core/commands/qc-review.md +86 -509
- package/core/commands/qc-run-test.md +133 -517
- package/core/commands/refine-prd.md +99 -519
- package/core/commands/report-bug.md +86 -509
- package/core/commands/review-code.md +127 -513
- package/core/commands/review-context.md +96 -515
- package/core/commands/review-tech-docs.md +90 -510
- package/core/commands/setup-ai-first.md +166 -137
- package/core/commands/sync.md +86 -118
- package/core/commands/update-framework.md +16 -102
- package/core/commands/validate-traces.md +458 -531
- package/core/hooks/data-guard.js +174 -83
- package/core/hooks/settings.json +2 -1
- package/core/rules/workflow.md +48 -4
- package/core/steps/capture-lesson.md +34 -1
- package/core/steps/context-loader.md +24 -3
- package/core/steps/gate.md +92 -35
- package/core/steps/report-footer.md +26 -2
- package/core/steps/trace-mirror.md +34 -7
- package/core/templates/README.md +24 -1
- package/core/templates/ci/trace-gate.yml +146 -0
- package/core/templates/feature.template +1 -1
- package/core/templates/hooks/pre-push +61 -0
- package/docs/01-getting-started/installation.md +18 -1
- package/docs/01-getting-started/what-is-sdd.md +4 -2
- package/docs/02-concepts/architecture.md +48 -5
- 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 +183 -117
- package/docs/03-guides/architect.md +63 -0
- 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/model-selection.md +32 -19
- package/docs/04-reference/trace-schema.md +26 -9
- 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 +75 -68
- package/docs/explain/23-fix-bug.md +19 -3
- package/docs/explain/26-propose-scenario.md +70 -63
- package/docs/explain/27-learn.md +5 -3
- package/docs/explain/README.md +135 -134
- package/hooks/data-guard.js +174 -83
- package/hooks/settings.json +2 -1
- package/package.json +53 -50
- package/rules/workflow.md +48 -4
- package/steps/capture-lesson.md +34 -1
- package/steps/context-loader.md +24 -3
- package/steps/gate.md +92 -35
- package/steps/report-footer.md +26 -2
- package/steps/trace-mirror.md +34 -7
- package/templates/README.md +24 -1
- package/templates/ci/trace-gate.yml +146 -0
- package/templates/feature.template +1 -1
- package/templates/hooks/pre-push +61 -0
- package/scripts/init.sh +0 -49
- package/scripts/upgrade.sh +0 -94
|
@@ -1,94 +1,146 @@
|
|
|
1
|
-
[← Reference](./) · [Concepts › Architecture](../02-concepts/architecture.md)
|
|
2
|
-
|
|
3
|
-
# Reference · Configuration
|
|
4
|
-
|
|
5
|
-
> Hai file cấu hình chính. `/update-framework` **không** đụng chúng — đây là nội dung của bạn.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 1. `project-context.yaml`
|
|
10
|
-
|
|
11
|
-
**Single source of truth** cho paths/mode/routing. Nằm ở `.agent/project-context.yaml`, sinh từ `templates/project-context.yaml` qua token substitution khi init. Mọi workflow đọc file này để biết **WHERE** tìm mọi thứ.
|
|
12
|
-
|
|
13
|
-
### Cấu trúc chính
|
|
14
|
-
|
|
15
|
-
```yaml
|
|
16
|
-
project:
|
|
17
|
-
name: "..."
|
|
18
|
-
description: "..."
|
|
19
|
-
|
|
20
|
-
paths:
|
|
21
|
-
specs_dir: "specs" # gốc mọi spec artifact
|
|
22
|
-
trace_dir: ".trace" # trace state .tsv
|
|
23
|
-
qc_dir: "docs" # working docs của QC
|
|
24
|
-
qc_skills_dir: ".agent/skills/qc" # nơi qc-* nạp skill (override sang repo QC riêng)
|
|
25
|
-
refinement_dir: ".agent/review" # findings review
|
|
26
|
-
|
|
27
|
-
setup:
|
|
28
|
-
mode: single | umbrella
|
|
29
|
-
spec_source: "..." # (umbrella) spec repo dùng chung
|
|
30
|
-
|
|
31
|
-
services: # (multi/umbrella) map domain → service
|
|
32
|
-
# dạng phẳng: {domain}: { path, module }
|
|
33
|
-
# dạng map-theo-platform: {domain}: { web: {path,module}, app: {...}, system: {...} }
|
|
34
|
-
|
|
35
|
-
conventions:
|
|
36
|
-
build_command: "..." # lệnh build verify (≤3 retry)
|
|
37
|
-
test_command: "..."
|
|
38
|
-
|
|
39
|
-
tech_stack:
|
|
40
|
-
database: "..." # vd PostgreSQL
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### Bố cục feature-package (path resolution)
|
|
44
|
-
|
|
45
|
-
Mọi artifact của một feature nằm chung `specs/{domain}/{prd-slug}/`:
|
|
46
|
-
|
|
47
|
-
```
|
|
48
|
-
specs/{domain}/{prd-slug}/
|
|
49
|
-
├── {TICKET-ID}-{prd-slug}.md # PRD (file .md duy nhất ở gốc)
|
|
50
|
-
├── bdd/{web|app|system}/*.feature # BDD
|
|
51
|
-
├── tech-docs/{TICKET-ID}-tech-design.md
|
|
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
|
+
[← Reference](./) · [Concepts › Architecture](../02-concepts/architecture.md)
|
|
2
|
+
|
|
3
|
+
# Reference · Configuration
|
|
4
|
+
|
|
5
|
+
> Hai file cấu hình chính. `/update-framework` **không** đụng chúng — đây là nội dung của bạn.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. `project-context.yaml`
|
|
10
|
+
|
|
11
|
+
**Single source of truth** cho paths/mode/routing. Nằm ở `.agent/project-context.yaml`, sinh từ `templates/project-context.yaml` qua token substitution khi init. Mọi workflow đọc file này để biết **WHERE** tìm mọi thứ.
|
|
12
|
+
|
|
13
|
+
### Cấu trúc chính
|
|
14
|
+
|
|
15
|
+
```yaml
|
|
16
|
+
project:
|
|
17
|
+
name: "..."
|
|
18
|
+
description: "..."
|
|
19
|
+
|
|
20
|
+
paths:
|
|
21
|
+
specs_dir: "specs" # gốc mọi spec artifact
|
|
22
|
+
trace_dir: ".trace" # trace state .tsv
|
|
23
|
+
qc_dir: "docs" # working docs của QC
|
|
24
|
+
qc_skills_dir: ".agent/skills/qc" # nơi qc-* nạp skill (override sang repo QC riêng)
|
|
25
|
+
refinement_dir: ".agent/review" # findings review
|
|
26
|
+
|
|
27
|
+
setup:
|
|
28
|
+
mode: single | umbrella
|
|
29
|
+
spec_source: "..." # (umbrella) spec repo dùng chung
|
|
30
|
+
|
|
31
|
+
services: # (multi/umbrella) map domain → service
|
|
32
|
+
# dạng phẳng: {domain}: { path, module }
|
|
33
|
+
# dạng map-theo-platform: {domain}: { web: {path,module}, app: {...}, system: {...} }
|
|
34
|
+
|
|
35
|
+
conventions:
|
|
36
|
+
build_command: "..." # lệnh build verify (≤3 retry)
|
|
37
|
+
test_command: "..."
|
|
38
|
+
|
|
39
|
+
tech_stack:
|
|
40
|
+
database: "..." # vd PostgreSQL
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Bố cục feature-package (path resolution)
|
|
44
|
+
|
|
45
|
+
Mọi artifact của một feature nằm chung `specs/{domain}/{prd-slug}/`:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
specs/{domain}/{prd-slug}/
|
|
49
|
+
├── {TICKET-ID}-{prd-slug}.md # PRD (file .md duy nhất ở gốc)
|
|
50
|
+
├── bdd/{web|app|system}/*.feature # BDD — subfolder platform LUÔN có
|
|
51
|
+
├── tech-docs/{TICKET-ID}-tech-design.md # MỘT doc gộp cho cả PRD
|
|
52
|
+
├── design-spec/{TICKET-ID}*.md # FE/App
|
|
53
|
+
└── changelog/{TICKET-ID}-{prd-slug}.changelog.md # chỉ tạo khi changelog vượt 5 version
|
|
54
|
+
.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv # MỘT sổ / UC × platform (24 cột)
|
|
55
|
+
.trace/{domain}/{prd-slug}/_seams.tsv # sổ seam/stub — nguồn 2 cờ 🔴 chặn PR
|
|
56
|
+
.trace/trace-report.json # snapshot cho panel — GHI ĐÈ mỗi lần chạy
|
|
57
|
+
.trace/trace-history.jsonl # nhật ký append-only — PHẢI commit
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
- `{domain}` = segment đầu sau `specs_dir`.
|
|
61
|
+
- `{prd-slug}` = segment kế tiếp (folder feature-package) — **không** phải folder cha trực tiếp của file lồng sâu.
|
|
62
|
+
- **Segment `{platform}` không optional** — mọi mode, kể cả umbrella. `web` và `system` của cùng một UC là hai file khác nhau; bỏ segment thì chúng va tên và **ghi đè nhau**. Trace tách theo platform nên bố cục spec phải khớp.
|
|
63
|
+
*Project còn ở bố cục phẳng: `npx @educa-corp/sdd-framework --migrate-bdd-platform` (dry-run mặc định).*
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 2. `CLAUDE.md` (phân tầng)
|
|
68
|
+
|
|
69
|
+
Instruction cho AI agent — AI *follow* file này thay vì *invent*.
|
|
70
|
+
|
|
71
|
+
| Tầng | Nội dung |
|
|
72
|
+
|------|----------|
|
|
73
|
+
| **root** `CLAUDE.md` | Luật chung dự án/umbrella |
|
|
74
|
+
| **overlay** `{service}/CLAUDE.md` | §2 kiến trúc & thứ tự layer & package strategy · §3 coding standards · §5 error handling — **theo stack** |
|
|
75
|
+
|
|
76
|
+
> Service overlay **thắng** root khi mâu thuẫn. context-loader nạp cả hai, đặt ở **cuối** context (Lost-in-the-Middle: "follow style này").
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 3. Single vs Umbrella
|
|
81
|
+
|
|
82
|
+
| | Single | Umbrella |
|
|
83
|
+
|---|--------|----------|
|
|
84
|
+
| `setup.mode` | `single` | `umbrella` |
|
|
85
|
+
| Spec ở đâu | Cùng repo | **Spec repo dùng chung** (`spec_source`) |
|
|
86
|
+
| Code ở đâu | Cùng repo | Service submodule (chỉ code + tooling) |
|
|
87
|
+
| Trace/feedback/findings | Cùng repo | Trong spec repo (một nơi authoritative) |
|
|
88
|
+
| Đồng bộ | — | `/sync` (pull + submodule + nổi feedback + Living Docs) |
|
|
89
|
+
|
|
90
|
+
Khi `spec_source` được đặt, **mọi** PRD/BDD/tech-doc/design-spec/`.trace`/`.agent/review`/`feedback` route về spec repo — vì đều là **artifact liên team**.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Vùng nào bị ghi đè khi update
|
|
95
|
+
|
|
96
|
+
`.agent/` là **mirror sinh ra**: `/update-framework` chạy `npx … --init`, và `--init` copy `core/` → `.agent/` **vô điều kiện**.
|
|
97
|
+
|
|
98
|
+
| Đường dẫn | Sửa được? | Vì sao |
|
|
99
|
+
|---|:---:|---|
|
|
100
|
+
| `CLAUDE.md` | ✅ | ngoài `.agent/` |
|
|
101
|
+
| `.agent/project-context.yaml` | ✅ | file **duy nhất trong `.agent/`** có guard: chỉ tạo nếu chưa tồn tại |
|
|
102
|
+
| `.agent/project-lessons.md` · `.agent/review/` | ✅ | không nằm trong `core/` nên nâng cấp không đụng |
|
|
103
|
+
| `specs/domain-knowledge/` · `.trace/` · `feedback/` | ✅ | ngoài `.agent/` |
|
|
104
|
+
| `.agent/commands` `steps` `rules` `skills` `hooks` `templates` `modules` | ❌ | copy từ repo framework, **ghi đè mỗi lần nâng cấp** |
|
|
105
|
+
|
|
106
|
+
**Nếu bạn đã sửa gì trong vùng ❌** — từ v0.4.2 `--init` tự cứu:
|
|
107
|
+
|
|
108
|
+
- bản cũ copy sang `.agent/.overwritten-{version}-{YYYYMMDD}/` (giữ nguyên cây thư mục)
|
|
109
|
+
- danh sách file bị ghi đè in ra ngay sau bước cài
|
|
110
|
+
- `.agent/.install-manifest.json` ghi hash của **đúng những gì lần cài trước đã viết** — nhờ đó lệnh phân biệt được *bạn sửa file* với *framework tự đổi file giữa hai version* (một phép so nội dung thuần sẽ flag cả hai và báo oan hàng chục file mỗi lần nâng cấp)
|
|
111
|
+
|
|
112
|
+
Thêm vào `.gitignore` của project:
|
|
113
|
+
|
|
114
|
+
```gitignore
|
|
115
|
+
.agent/.overwritten-*/
|
|
116
|
+
.agent/.install-manifest.json
|
|
117
|
+
.trace-mirror/ # bản sao cho panel VS Code — sinh lại được
|
|
118
|
+
.living-docs/ # report gộp — sinh lại được (đặt trong .gitignore của spec repo)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
> ### ⚠️ `.trace/` **KHÔNG** được gitignore
|
|
122
|
+
>
|
|
123
|
+
> Đây là chỗ dễ mất dữ liệu nhất trong toàn framework.
|
|
124
|
+
>
|
|
125
|
+
> | Đường dẫn | Vai trò | Git |
|
|
126
|
+
> |---|---|---|
|
|
127
|
+
> | `{paths.trace_dir}` (`.trace/`) | **AUTHORITATIVE** — `.tsv` + `trace-history.jsonl`. **Không regenerate được** | **PHẢI commit** |
|
|
128
|
+
> | `.trace-mirror/` | bản sao cho panel VS Code | gitignore |
|
|
129
|
+
> | `.living-docs/` | report gộp | gitignore |
|
|
130
|
+
>
|
|
131
|
+
> **Trước v0.4.3 cả hai cùng tên `.trace`.** Khi dev mở thẳng spec repo làm workspace thì hai đường dẫn **bằng nhau** — và `/sync` (bản cũ) gợi ý gitignore theo **tên**, không theo vai trò. Làm theo là **mất sổ gốc, im lặng**: máy vẫn chạy, dashboard vẫn có số; chỉ người thứ hai clone về mới phát hiện, và lúc đó lịch sử đã mất vĩnh viễn.
|
|
132
|
+
>
|
|
133
|
+
> **Kiểm dự án đang chạy:**
|
|
134
|
+
> ```bash
|
|
135
|
+
> git -C {spec_source} check-ignore .trace # trả về kết quả = ĐANG DÍNH
|
|
136
|
+
> ```
|
|
137
|
+
> Dính thì gỡ dòng khớp `.trace` khỏi `.gitignore` rồi `git add -f .trace && git commit`.
|
|
138
|
+
> Từ v0.4.3 `/sync` Step 4b tự kiểm và báo động 🔴 nếu phát hiện.
|
|
139
|
+
|
|
140
|
+
> Muốn thay đổi **bền vững** thì sửa trong repo framework rồi phát hành. Tuỳ biến riêng của một project thuộc về `CLAUDE.md`, `.agent/project-context.yaml`, hoặc `.agent/project-lessons.md` — cả ba đều không bị ghi đè. Ranh giới đầy đủ: `.agent/README.md`.
|
|
141
|
+
>
|
|
142
|
+
> **Template `.feature`/PRD không cấu hình được.** Skeleton được `{{include}}` nướng cứng vào file lệnh lúc build, nên sửa `.agent/templates/` **không có tác dụng** (và sẽ bị ghi đè). Đổi cấu trúc artifact = sửa `templates/*` trong repo framework rồi `npm run build`. Chi tiết: `.agent/templates/README.md`.
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
→ [Architecture › Configuration](../02-concepts/architecture.md#configuration-2-file) · [Modules](modules.md)
|
|
@@ -2,33 +2,46 @@
|
|
|
2
2
|
|
|
3
3
|
# Reference · Model Selection
|
|
4
4
|
|
|
5
|
-
> Framework **không ràng buộc model cứng** —
|
|
5
|
+
> Framework **không ràng buộc model cứng** — nó **khai báo** model đang chạy ở report cuối. Giả định LLM đủ năng lực reasoning.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
## Model
|
|
9
|
+
## Model được KHAI BÁO, không bị hỏi *(từ v0.5.1)*
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Gate Bước 0-B ghi nhận model agent đang chạy; `report-footer` in ra ở cuối mỗi lệnh:
|
|
12
12
|
|
|
13
13
|
```
|
|
14
|
-
|
|
15
|
-
Recommended : claude-opus (model Opus mới nhất)
|
|
16
|
-
Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
|
|
17
|
-
suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
|
|
18
|
-
|
|
19
|
-
Đang chạy claude-opus?
|
|
20
|
-
Y — đúng → tiếp tục
|
|
21
|
-
S — bỏ qua (chấp nhận rủi ro chất lượng thấp hơn)
|
|
22
|
-
N — dừng, đổi model rồi chạy lại
|
|
14
|
+
Model: claude-opus-5
|
|
23
15
|
```
|
|
24
16
|
|
|
25
|
-
|
|
26
|
-
|---------|---------|
|
|
27
|
-
| **Y** | Tiếp tục |
|
|
28
|
-
| **S** | Tiếp tục, thêm ⚠️ vào report cuối (người dùng chấp nhận rủi ro) |
|
|
29
|
-
| **N** / khác | **Dừng** — đổi sang Opus rồi chạy lại |
|
|
17
|
+
Nếu agent biết mình không phải một model Opus:
|
|
30
18
|
|
|
31
|
-
|
|
19
|
+
```
|
|
20
|
+
Model: claude-haiku-4-5 ⚠️ lệnh này khuyến nghị Opus — model nhỏ hơn dễ bỏ sót
|
|
21
|
+
edge case, phân tích spec thiếu sót, vi phạm kiến trúc.
|
|
22
|
+
Cân nhắc chạy lại với /model → Opus trước khi dùng kết quả.
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Không có prompt nào. Không chờ. Không dừng.**
|
|
26
|
+
|
|
27
|
+
### Vì sao bỏ prompt cũ (GAPS-v3 G41)
|
|
28
|
+
|
|
29
|
+
Bản trước hiện một khối `⚙️ MODEL CHECK` rồi chờ `Y/S/N` ở **mọi** lệnh. Ba vấn đề:
|
|
30
|
+
|
|
31
|
+
| | |
|
|
32
|
+
|---|---|
|
|
33
|
+
| Hỏi sai người | Nó hỏi **người dùng** thứ mà **agent đã biết chính xác** |
|
|
34
|
+
| Không kiểm chứng được | Gõ `Y` xong vẫn đang chạy Haiku thì không gì phát hiện |
|
|
35
|
+
| Không chặn được ai | **Cả `Y` lẫn `S` đều đi tiếp** — cách duy nhất để nó dừng là tự nguyện gõ `N` |
|
|
36
|
+
|
|
37
|
+
Cái giá: một lần chặn ở mọi lệnh. Một feature đi hết pipeline dùng **20 lệnh** — 20 lần bấm
|
|
38
|
+
cho một tín hiệu tự-khai không kiểm chứng được. Và chính cái giá đó **làm mòn CHECKPOINT**,
|
|
39
|
+
cổng có giá trị thật ngay sau nó: bấm `Y` 40 lần một feature thì `Y` thành phản xạ.
|
|
40
|
+
|
|
41
|
+
Khai báo ở footer **mạnh hơn** hỏi: đúng nguồn (agent tự khai), và nằm **cạnh kết quả** để
|
|
42
|
+
người đọc cân nhắc có nên tin, thay vì nằm trước khi có kết quả để bấm cho xong.
|
|
43
|
+
|
|
44
|
+
> Sub-agent (`_agent_mode`) bỏ qua bước này — orchestrator đã ghi nhận rồi.
|
|
32
45
|
|
|
33
46
|
---
|
|
34
47
|
|
|
@@ -56,7 +69,7 @@ Model Claude mới nhất tại thời điểm viết:
|
|
|
56
69
|
|
|
57
70
|
| Model | ID |
|
|
58
71
|
|-------|-----|
|
|
59
|
-
| Opus
|
|
72
|
+
| Opus 5 | `claude-opus-5` |
|
|
60
73
|
| Sonnet 5 | `claude-sonnet-5` |
|
|
61
74
|
| Haiku 4.5 | `claude-haiku-4-5-20251001` |
|
|
62
75
|
| Fable 5 | `claude-fable-5` |
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
// @trace.prd_version=1.2
|
|
47
47
|
// @trace.bdd_version=1.4
|
|
48
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
|
|
49
50
|
// @trace.source=specs/segment/scoring/bdd/system/SEG01-UC1-scoring.feature
|
|
50
51
|
public ScoreDto calculate(...) { }
|
|
51
52
|
```
|
|
@@ -54,9 +55,12 @@ public ScoreDto calculate(...) { }
|
|
|
54
55
|
|-----|---------|
|
|
55
56
|
| `@trace.implements` | SC mà method này hiện thực |
|
|
56
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ờ |
|
|
57
59
|
| `@trace.source` | `.feature` nguồn — **phải gồm segment `{platform}`** |
|
|
58
60
|
|
|
59
|
-
> **
|
|
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ó.
|
|
60
64
|
|
|
61
65
|
### Code — chỗ chưa implement (sổ `_seams.tsv`)
|
|
62
66
|
|
|
@@ -107,7 +111,7 @@ Shared code dò qua **import chain** từ boundary → tránh tag explosion.
|
|
|
107
111
|
|
|
108
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.
|
|
109
113
|
|
|
110
|
-
**
|
|
114
|
+
**24 cột, tab-separated:**
|
|
111
115
|
|
|
112
116
|
| # | Cột | Ý nghĩa | Chủ ghi |
|
|
113
117
|
|---|-----|---------|---------|
|
|
@@ -118,10 +122,10 @@ Shared code dò qua **import chain** từ boundary → tránh tag explosion.
|
|
|
118
122
|
| 5 | `implemented_by` | `{Class}.{method}` (`—` nếu chưa) | generate-code |
|
|
119
123
|
| 6 | `test_count` | số test phủ SC | dev-gen-test · fix-bug |
|
|
120
124
|
| 7 | `test_classes` | tên test class / describe | dev-gen-test · fix-bug |
|
|
121
|
-
| 8 | `dev_selftest` | `pass`/`fail`/`not_run` — **dev tự chạy** | dev-run-test |
|
|
122
|
-
| 9 | `dev_selftest_at` | ngày |
|
|
123
|
-
| 10 | `qc_status` | `pass`/`fail`/`skip`/`not_run` — **QC chính thức** | qc-run-test |
|
|
124
|
-
| 11 | `qc_run_at` | ngày |
|
|
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 |
|
|
125
129
|
| 12 | `qc_owner` | SC đang chờ ai: `dev` / `po` | qc-run-test · report-bug |
|
|
126
130
|
| 13 | `qc_blocked_by` | `BUG-{id}` / `GAP-{id}` | qc-run-test · report-bug |
|
|
127
131
|
| 14 | `prd_version` | version PRD lúc sinh BDD | generate-bdd |
|
|
@@ -133,10 +137,16 @@ Shared code dò qua **import chain** từ boundary → tránh tag explosion.
|
|
|
133
137
|
| 20 | `fe_phase` | `ui` / `integrated` / `—` | generate-code `--phase` |
|
|
134
138
|
| 21 | `status` | tổng hợp — xem bảng dưới | validate-traces |
|
|
135
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 |
|
|
136
142
|
|
|
137
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*.
|
|
138
144
|
|
|
139
|
-
>
|
|
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.
|
|
140
150
|
|
|
141
151
|
---
|
|
142
152
|
|
|
@@ -162,16 +172,23 @@ Shared code dò qua **import chain** từ boundary → tránh tag explosion.
|
|
|
162
172
|
|
|
163
173
|
| Cờ | Nguồn | Nghĩa |
|
|
164
174
|
|---|---|---|
|
|
165
|
-
| `PRD_DRIFT` | Step 4 |
|
|
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` |
|
|
166
177
|
| `BDD_DRIFT` | Step 5c | code mang `@trace.bdd_version` cũ hơn `.feature` |
|
|
167
|
-
| `TECHDOC_DRIFT` · `FE_TECHDOC_DRIFT` | Step 5 | code sinh từ revision tech-doc cũ hơn |
|
|
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` |
|
|
168
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 |
|
|
169
182
|
| `TRACE_ORPHAN` 🔴 | Step 2b | tag `@trace.implements`/`@trace.verifies` trỏ SC không tồn tại **và** không có row TSV |
|
|
170
183
|
| `SEAM_UNWIRED` 🔴 | Step 5b | hàng thật đã có nhưng consumer còn wire vào stub |
|
|
171
184
|
| `STUB_UNRESOLVED` 🔴 | Step 5b | method còn trắng dù owner đã gen / có hàm song song |
|
|
172
185
|
| `SEAM_PENDING` · `STUB_PENDING` | Step 5b | owner UC chưa gen — **bình thường**, chỉ nhắc |
|
|
173
186
|
|
|
174
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.
|
|
175
192
|
|
|
176
193
|
---
|
|
177
194
|
|
|
@@ -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**.
|