@educa-corp/sdd-framework 0.6.0 → 0.7.1
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/gate-trace.js +25 -2
- package/bin/index.js +32 -5
- package/bin/lint-trace.js +41 -0
- package/bin/self-check.js +430 -3
- package/bin/trace-schema.json +418 -31
- package/core/FRAMEWORK_VERSION +1 -1
- package/{commands/extend-prd.md → core/commands/amend-prd.md} +206 -173
- package/core/commands/dev-run-test.md +48 -10
- package/core/commands/extend-prd.md +39 -12
- package/core/commands/generate-bdd.md +52 -10
- package/core/commands/generate-code.md +35 -2
- package/core/commands/generate-tech-docs.md +36 -4
- package/core/commands/map-testids.md +1 -1
- package/core/commands/qc-run-test.md +29 -3
- package/core/commands/refine-prd.md +13 -2
- package/core/commands/review-context.md +43 -8
- package/core/commands/sync.md +105 -1
- package/core/commands/validate-traces.md +289 -16
- package/core/rules/workflow.md +34 -0
- package/core/steps/context-loader.md +27 -6
- package/core/templates/feature.template +1 -1
- package/core/templates/project-context.yaml +3 -3
- package/core/templates/tech-design.template.md +2 -2
- package/docs/02-concepts/architecture.md +37 -1
- package/docs/02-concepts/overview.md +1 -1
- package/docs/02-concepts/pipeline-steps/02-specification.md +13 -7
- package/docs/02-concepts/pipeline-steps/07-dev-selftest.md +2 -0
- package/docs/02-concepts/pipeline-steps/08-qc-automation.md +1 -0
- package/docs/02-concepts/pipeline-steps/09-validate-traces.md +34 -3
- package/docs/02-concepts/pipeline-steps/10-feedback-loop.md +10 -1
- package/docs/02-concepts/traceability.md +187 -183
- package/docs/03-guides/architect.md +13 -4
- package/docs/03-guides/developer.md +1 -0
- package/docs/03-guides/product-owner.md +89 -72
- package/docs/03-guides/tester-qa.md +81 -81
- package/docs/04-reference/commands.md +148 -134
- package/docs/04-reference/trace-schema.md +45 -1
- package/docs/explain/02b-extend-prd.md +1 -1
- package/docs/explain/02c-amend-prd.md +152 -0
- package/docs/explain/06-generate-bdd.md +1 -1
- package/docs/explain/13-dev-run-test.md +15 -1
- package/docs/explain/19-qc-run-test.md +91 -87
- package/docs/explain/21-validate-traces.md +79 -75
- package/docs/explain/28-sync.md +25 -0
- package/docs/explain/README.md +136 -135
- package/package.json +1 -8
- package/commands/debug.md +0 -529
- package/commands/debug.tmpl +0 -260
- package/commands/define-product.md +0 -438
- package/commands/define-product.tmpl +0 -225
- package/commands/dev-gen-test.md +0 -700
- package/commands/dev-gen-test.tmpl +0 -490
- package/commands/dev-run-test.md +0 -435
- package/commands/dev-run-test.tmpl +0 -225
- package/commands/dev-smoke-test.md +0 -374
- package/commands/dev-smoke-test.tmpl +0 -217
- package/commands/extend-prd.tmpl +0 -273
- package/commands/fix-bug.md +0 -519
- package/commands/fix-bug.tmpl +0 -197
- package/commands/generate-architecture.md +0 -354
- package/commands/generate-architecture.tmpl +0 -197
- package/commands/generate-bdd.md +0 -923
- package/commands/generate-bdd.tmpl +0 -590
- package/commands/generate-code.md +0 -859
- package/commands/generate-code.tmpl +0 -649
- package/commands/generate-design-spec.md +0 -737
- package/commands/generate-design-spec.tmpl +0 -524
- package/commands/generate-prd.md +0 -722
- package/commands/generate-prd.tmpl +0 -226
- package/commands/generate-spec-manifest.md +0 -321
- package/commands/generate-spec-manifest.tmpl +0 -164
- package/commands/generate-tech-docs.md +0 -920
- package/commands/generate-tech-docs.tmpl +0 -273
- package/commands/learn.md +0 -399
- package/commands/learn.tmpl +0 -130
- package/commands/map-testids.md +0 -238
- package/commands/map-testids.tmpl +0 -81
- package/commands/propose-scenario.md +0 -359
- package/commands/propose-scenario.tmpl +0 -202
- package/commands/qc-analyze.md +0 -269
- package/commands/qc-analyze.tmpl +0 -112
- package/commands/qc-design-test.md +0 -226
- package/commands/qc-design-test.tmpl +0 -69
- package/commands/qc-plan.md +0 -206
- package/commands/qc-plan.tmpl +0 -49
- package/commands/qc-report.md +0 -217
- package/commands/qc-report.tmpl +0 -60
- package/commands/qc-review.md +0 -210
- package/commands/qc-review.tmpl +0 -53
- package/commands/qc-run-test.md +0 -326
- package/commands/qc-run-test.tmpl +0 -116
- package/commands/refine-prd.md +0 -653
- package/commands/refine-prd.tmpl +0 -281
- package/commands/report-bug.md +0 -305
- package/commands/report-bug.tmpl +0 -148
- package/commands/review-code.md +0 -415
- package/commands/review-code.tmpl +0 -146
- package/commands/review-context.md +0 -902
- package/commands/review-context.tmpl +0 -530
- package/commands/review-tech-docs.md +0 -561
- package/commands/review-tech-docs.tmpl +0 -404
- package/commands/setup-ai-first.md +0 -602
- package/commands/setup-ai-first.tmpl +0 -450
- package/commands/sync.md +0 -430
- package/commands/sync.tmpl +0 -429
- package/commands/update-framework.md +0 -203
- package/commands/update-framework.tmpl +0 -202
- package/commands/validate-traces.md +0 -1077
- package/commands/validate-traces.tmpl +0 -920
- package/hooks/data-guard.js +0 -232
- package/hooks/settings.json +0 -19
- package/modules/android-compose/module.yaml +0 -13
- package/modules/android-compose/stack-profile.yaml +0 -57
- package/modules/angular/architecture-snippets/component-patterns.md +0 -187
- package/modules/angular/module.yaml +0 -6
- package/modules/angular/stack-profile.yaml +0 -38
- package/modules/context-engineering/architecture-snippets/context-design.md +0 -119
- package/modules/context-engineering/module.yaml +0 -9
- package/modules/context-engineering/stack-profile.yaml +0 -61
- package/modules/dotnet/architecture-snippets/clean-arch.md +0 -160
- package/modules/dotnet/module.yaml +0 -6
- package/modules/dotnet/stack-profile.yaml +0 -50
- package/modules/flutter/module.yaml +0 -14
- package/modules/flutter/stack-profile.yaml +0 -59
- package/modules/golang/architecture-snippets/domain-layout.md +0 -283
- package/modules/golang/module.yaml +0 -6
- package/modules/golang/stack-profile.yaml +0 -40
- package/modules/ios-swiftui/module.yaml +0 -13
- package/modules/ios-swiftui/stack-profile.yaml +0 -55
- package/modules/java-spring/architecture-snippets/layered-arch.md +0 -201
- package/modules/java-spring/module.yaml +0 -15
- package/modules/java-spring/stack-profile.yaml +0 -28
- package/modules/nextjs/architecture-snippets/app-router-patterns.md +0 -269
- package/modules/nextjs/module.yaml +0 -14
- package/modules/nextjs/stack-profile.yaml +0 -74
- package/modules/nuxt/module.yaml +0 -14
- package/modules/nuxt/stack-profile.yaml +0 -58
- package/modules/phaser-game/architecture-snippets/phaser-scene-patterns.md +0 -646
- package/modules/phaser-game/module.yaml +0 -15
- package/modules/phaser-game/stack-profile.yaml +0 -90
- package/modules/php-laravel/architecture-snippets/service-repository.md +0 -302
- package/modules/php-laravel/module.yaml +0 -15
- package/modules/php-laravel/stack-profile.yaml +0 -56
- package/modules/qc-playwright/stack-profile.yaml +0 -66
- package/modules/react/architecture-snippets/hooks-query-patterns.md +0 -254
- package/modules/react/module.yaml +0 -14
- package/modules/react/stack-profile.yaml +0 -63
- package/modules/react-native/module.yaml +0 -14
- package/modules/react-native/stack-profile.yaml +0 -56
- package/modules/vue/module.yaml +0 -14
- package/modules/vue/stack-profile.yaml +0 -65
- package/rules/data-protection.md +0 -80
- package/rules/workflow.md +0 -99
- package/skills/code/SKILL.md +0 -19
- package/skills/code/SKILL.tmpl +0 -19
- package/skills/debug/SKILL.md +0 -19
- package/skills/debug/SKILL.tmpl +0 -19
- package/skills/design-spec/SKILL.md +0 -11
- package/skills/design-spec/SKILL.tmpl +0 -11
- package/skills/discovery/SKILL.md +0 -14
- package/skills/discovery/SKILL.tmpl +0 -14
- package/skills/prd/SKILL.md +0 -19
- package/skills/prd/SKILL.tmpl +0 -19
- package/skills/qc/qa-analyst/DOC_GAPS.template.md +0 -63
- package/skills/qc/qa-analyst/acceptance-criteria.md +0 -60
- package/skills/qc/qa-analyst/business-rules.md +0 -59
- package/skills/qc/qa-analyst/data-flow.md +0 -64
- package/skills/qc/qa-analyst/spec-breakdown.md +0 -61
- package/skills/qc/qa-designer/e2e/journey.md +0 -41
- package/skills/qc/qa-designer/exploratory/charter.md +0 -68
- package/skills/qc/qa-designer/exploratory/explore-to-functional.md +0 -43
- package/skills/qc/qa-designer/functional/api.md +0 -45
- package/skills/qc/qa-designer/functional/gui-feature.md +0 -46
- package/skills/qc/qa-designer/functional/gui-screen.md +0 -52
- package/skills/qc/qa-designer/integration/api.md +0 -42
- package/skills/qc/qa-designer/integration/db.md +0 -39
- package/skills/qc/qa-designer/integration/gui.md +0 -40
- package/skills/qc/qa-designer/integration/kafka.md +0 -40
- package/skills/qc/qa-designer/non-functional.md +0 -40
- package/skills/qc/qa-planner/test-plan.md +0 -120
- package/skills/qc/qa-reviewer/script/e2e.md +0 -87
- package/skills/qc/qa-reviewer/script/exploratory.md +0 -45
- package/skills/qc/qa-reviewer/script/functional.md +0 -101
- package/skills/qc/qa-reviewer/script/integration.md +0 -91
- package/skills/qc/qa-reviewer/script/non-functional.md +0 -126
- package/skills/qc/qa-reviewer/test-case/e2e.md +0 -73
- package/skills/qc/qa-reviewer/test-case/exploratory.md +0 -43
- package/skills/qc/qa-reviewer/test-case/functional.md +0 -76
- package/skills/qc/qa-reviewer/test-case/integration.md +0 -69
- package/skills/qc/qa-reviewer/test-case/non-functional.md +0 -73
- package/skills/qc/qa-runner/e2e.md +0 -49
- package/skills/qc/qa-runner/exploratory/session.md +0 -36
- package/skills/qc/qa-runner/functional/api.md +0 -35
- package/skills/qc/qa-runner/functional/gui-feature.md +0 -51
- package/skills/qc/qa-runner/functional/gui-screen.md +0 -55
- package/skills/qc/qa-runner/integration.md +0 -47
- package/skills/qc/qa-runner/non-functional.md +0 -49
- package/skills/qc/qa-runner/report/report.md +0 -37
- package/skills/setup-ai-first/SKILL.md +0 -19
- package/skills/setup-ai-first/SKILL.tmpl +0 -19
- package/skills/spec/SKILL.md +0 -19
- package/skills/spec/SKILL.tmpl +0 -19
- package/skills/test/SKILL.md +0 -18
- package/skills/test/SKILL.tmpl +0 -18
- package/steps/business-language.md +0 -56
- package/steps/capture-lesson.md +0 -112
- package/steps/context-loader.md +0 -406
- package/steps/gate.md +0 -151
- package/steps/report-footer.md +0 -125
- package/steps/review-fanout.md +0 -159
- package/steps/spawn-agent.md +0 -129
- package/steps/trace-mirror.md +0 -53
- package/templates/README.md +0 -70
- package/templates/architecture.template.md +0 -394
- package/templates/ci/trace-gate.yml +0 -146
- package/templates/design-spec.template.md +0 -217
- package/templates/feature.template +0 -123
- package/templates/hooks/pre-push +0 -61
- package/templates/platform-guide.template.md +0 -145
- package/templates/prd.template.md +0 -283
- package/templates/product-definition.template.md +0 -188
- package/templates/project-context.yaml +0 -212
- package/templates/tech-design.template.md +0 -490
|
@@ -1,81 +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. **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)
|
|
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. **Đọc cột `status` trước khi ghi `pass`** — row `DRIFT`/`ORPHANED` + test xanh → `not_run`, và **không đóng bug nào** ở lần chạy đó *(đóng bug dựa trên một lần QC chạy trên spec đã đổi là đóng sai)* |
|
|
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)
|
|
@@ -1,134 +1,148 @@
|
|
|
1
|
-
[← Docs Home](../README.md) · [Reference](./)
|
|
2
|
-
|
|
3
|
-
# Reference · Commands — Bảng đầy đủ (Command Catalog)
|
|
4
|
-
|
|
5
|
-
> 32 slash command, gom theo phase pipeline. Chi tiết cơ chế từng bước → [Pipeline Steps](../02-concepts/pipeline-steps/).
|
|
6
|
-
|
|
7
|
-
Mọi lệnh chạy chung một **Gate** (model check → target → context-loader → checkpoint). Xem [Khung chung](../02-concepts/pipeline-steps/README.md#khung-chung-mọi-command-common-gate).
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## 0 · Setup & Foundation
|
|
12
|
-
|
|
13
|
-
| Lệnh | Input | Output | Owner |
|
|
14
|
-
|------|-------|--------|-------|
|
|
15
|
-
| `/setup-ai-first` | Dự án trống/có code | `.agent/`, `.claude/`, `project-context.yaml`, `CLAUDE.md` | Admin/Lead |
|
|
16
|
-
| `/generate-architecture` | config + tài liệu (`--from`) + code | `architecture.md` (SSOT kiến trúc, theo tier) | SA/Lead |
|
|
17
|
-
|
|
18
|
-
## 1 · Discovery
|
|
19
|
-
|
|
20
|
-
| Lệnh | Input | Output | Owner |
|
|
21
|
-
|------|-------|--------|-------|
|
|
22
|
-
| `/define-product` | Ý tưởng (+Figma) | `product-definition/*.md` (8 chặng) | PO |
|
|
23
|
-
|
|
24
|
-
## 2 · Specification (PRD)
|
|
25
|
-
|
|
26
|
-
| Lệnh | Input | Output | Owner |
|
|
27
|
-
|------|-------|--------|-------|
|
|
28
|
-
| `/generate-prd` | product-definition | PRD draft **mới** | PO |
|
|
29
|
-
| `/extend-prd` | **PRD đã có** + `feedback/prd-change-requests/` | PRD v+1 (UC/AC/BR nối tiếp
|
|
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
|
-
| Lệnh | Input | Output | Owner |
|
|
73
|
-
|------|-------|--------|-------|
|
|
74
|
-
| `/
|
|
75
|
-
| `/
|
|
76
|
-
| `/
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
|
83
|
-
|
|
84
|
-
| `/
|
|
85
|
-
| `/
|
|
86
|
-
| `/
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
| `/
|
|
94
|
-
| `/
|
|
95
|
-
| `/
|
|
96
|
-
| `/
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
| `/
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
1
|
+
[← Docs Home](../README.md) · [Reference](./)
|
|
2
|
+
|
|
3
|
+
# Reference · Commands — Bảng đầy đủ (Command Catalog)
|
|
4
|
+
|
|
5
|
+
> 32 slash command, gom theo phase pipeline. Chi tiết cơ chế từng bước → [Pipeline Steps](../02-concepts/pipeline-steps/).
|
|
6
|
+
|
|
7
|
+
Mọi lệnh chạy chung một **Gate** (model check → target → context-loader → checkpoint). Xem [Khung chung](../02-concepts/pipeline-steps/README.md#khung-chung-mọi-command-common-gate).
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 0 · Setup & Foundation
|
|
12
|
+
|
|
13
|
+
| Lệnh | Input | Output | Owner |
|
|
14
|
+
|------|-------|--------|-------|
|
|
15
|
+
| `/setup-ai-first` | Dự án trống/có code | `.agent/`, `.claude/`, `project-context.yaml`, `CLAUDE.md` | Admin/Lead |
|
|
16
|
+
| `/generate-architecture` | config + tài liệu (`--from`) + code | `architecture.md` (SSOT kiến trúc, theo tier) | SA/Lead |
|
|
17
|
+
|
|
18
|
+
## 1 · Discovery
|
|
19
|
+
|
|
20
|
+
| Lệnh | Input | Output | Owner |
|
|
21
|
+
|------|-------|--------|-------|
|
|
22
|
+
| `/define-product` | Ý tưởng (+Figma) | `product-definition/*.md` (8 chặng) | PO |
|
|
23
|
+
|
|
24
|
+
## 2 · Specification (PRD)
|
|
25
|
+
|
|
26
|
+
| Lệnh | Input | Output | Owner |
|
|
27
|
+
|------|-------|--------|-------|
|
|
28
|
+
| `/generate-prd` | product-definition | PRD draft **mới** | PO |
|
|
29
|
+
| `/extend-prd` | **PRD đã có** + `feedback/prd-change-requests/` | PRD v+1 (UC/AC/BR **nối tiếp**, `Status → draft`) | PO |
|
|
30
|
+
| `/amend-prd` | **PRD đã có** + ID cần sửa (PO khai) | PRD v+1 (nội dung ID **đổi tại chỗ**, `Status → draft`) | PO |
|
|
31
|
+
| `/refine-prd` | PRD | Findings 3 lăng kính DEV/SA/PO | PO+SA+Dev |
|
|
32
|
+
| `/review-context` (PRD) | PRD | Findings P0–P5 → `Status: approved` | PO |
|
|
33
|
+
|
|
34
|
+
> **Chọn lệnh nào cho PRD — bốn nhánh, phân biệt bằng THAO TÁC GHI:**
|
|
35
|
+
>
|
|
36
|
+
> | Tình huống | Lệnh | Ghi kiểu gì |
|
|
37
|
+
> |---|---|---|
|
|
38
|
+
> | PRD **chưa tồn tại** | `/generate-prd` | **Write** cả file |
|
|
39
|
+
> | **Thêm** UC/AC/BR mới | `/extend-prd` | Edit **add-only** — output là **superset chặt**; đánh số **nối tiếp** |
|
|
40
|
+
> | **Đổi** một yêu cầu đang đúng cú pháp | **`/amend-prd`** | Edit **tại chỗ** — output **KHÔNG** phải superset; **không** đánh số mới, **không** xoá row |
|
|
41
|
+
> | Sửa vấn đề **review đã soi ra** | `/refine-prd` → Review Board → `--resume` | Edit trong phạm vi finding |
|
|
42
|
+
>
|
|
43
|
+
> - `/generate-prd` **DỪNG HẲN** trên file đã có — §Guard *"Tồn tại → DỪNG. KHÔNG ghi, KHÔNG hỏi Y/N"*, vì ghi đè mất changelog + **đánh số lại BR** ⇒ hỏng `@trace.business_rules` trong mọi BDD đã sinh, và cả ba mất mát đều không hoàn tác được từ trong lệnh.
|
|
44
|
+
> - `/refine-prd` **không** thêm/đổi được theo ý định mới (nó tự cấm đụng section ngoài findings).
|
|
45
|
+
> - `/extend-prd` **không** sửa được nội dung cũ, trừ một cửa **phái sinh**: khi phần THÊM làm một BR cũ sai (Bước 3.2).
|
|
46
|
+
> - **Xoá hẳn** một BR/AC → không có lệnh, và **có chủ ý**: xoá row biến `@trace.business_rules` trong `.feature` thành `TRACE_ORPHAN` 🔴. Dùng `/amend-prd --retire {ID}` — nó khai tử **tại chỗ**, giữ nguyên row + ID.
|
|
47
|
+
>
|
|
48
|
+
> ⚠️ **Sửa tay file `.md` là điểm mù tuyệt đối (GAPS-v4 G54).** Mọi drift detector so **nhãn version**, không so nội dung. Sửa mà không bump version ⇒ **0 cờ**. `/validate-traces` Step 3.9 canh cửa sau bằng cờ 🔴 `PRD_UNTRACKED_EDIT` (git diff + git status vs `spec_baseline`); đường sửa là bump version + row changelog nêu UC — tức đúng việc `/amend-prd` làm hộ.
|
|
49
|
+
|
|
50
|
+
## 3 · Design-Spec (chỉ FE/App)
|
|
51
|
+
|
|
52
|
+
| Lệnh | Input | Output | Owner |
|
|
53
|
+
|------|-------|--------|-------|
|
|
54
|
+
| `/generate-design-spec` | PRD approved + Figma | `design-spec/*.md` | PO/PM |
|
|
55
|
+
|
|
56
|
+
## 4 · BDD
|
|
57
|
+
|
|
58
|
+
| Lệnh | Input | Output | Owner |
|
|
59
|
+
|------|-------|--------|-------|
|
|
60
|
+
| `/generate-bdd` | PRD approved (+design-spec) | `bdd/**/*.feature` | PO |
|
|
61
|
+
| `/review-context` (BDD) | `.feature` | Findings B1–B6 → `@trace.status: approved` | PO/Dev |
|
|
62
|
+
|
|
63
|
+
## 5 · Tech-Docs
|
|
64
|
+
|
|
65
|
+
| Lệnh | Input | Output | Owner |
|
|
66
|
+
|------|-------|--------|-------|
|
|
67
|
+
| `/generate-tech-docs` | BDD approved + entity catalog | `tech-docs/{TICKET}-tech-design.md` | SA |
|
|
68
|
+
| `/review-tech-docs` | tech-design | Findings đa chiều + ký T7 | SA/Lead |
|
|
69
|
+
|
|
70
|
+
## 6 · Code
|
|
71
|
+
|
|
72
|
+
| Lệnh | Input | Output | Owner |
|
|
73
|
+
|------|-------|--------|-------|
|
|
74
|
+
| `/generate-code` | `.feature` approved + tech-design | Code + `.trace/*.tsv` | Dev |
|
|
75
|
+
| `/review-code` | Code | Findings (read-only) | Dev/Lead |
|
|
76
|
+
| `/fix-bug` | Bug report | Fix + regression test | Dev |
|
|
77
|
+
| `/map-testids` | UI code | testid map (FE) | Dev |
|
|
78
|
+
| `/debug` | Mô tả lỗi | Phân tích (read-only) | Dev |
|
|
79
|
+
|
|
80
|
+
## 7 · Dev self-test
|
|
81
|
+
|
|
82
|
+
| Lệnh | Input | Output | Owner |
|
|
83
|
+
|------|-------|--------|-------|
|
|
84
|
+
| `/dev-gen-test` | Code + `.feature` | Bộ self-test | Dev |
|
|
85
|
+
| `/dev-run-test` | Self-test | Kết quả + cột `dev_selftest` | Dev |
|
|
86
|
+
| `/dev-smoke-test` | Service/app đang chạy | Kết quả smoke tại chỗ | Dev |
|
|
87
|
+
|
|
88
|
+
## 8 · QC Automation
|
|
89
|
+
|
|
90
|
+
| Lệnh | Input | Output | Owner |
|
|
91
|
+
|------|-------|--------|-------|
|
|
92
|
+
| `/qc-analyze` | UC + spec | `REQUIREMENT_ANALYSIS.md`, `DOC_GAPS.md` | QA |
|
|
93
|
+
| `/qc-plan` | Analysis | `TEST_PLAN.md` (rủi ro) | QA |
|
|
94
|
+
| `/qc-design-test` | Plan | `test-cases/*.Test.md` | QA |
|
|
95
|
+
| `/qc-review` | Test case/script | 🛑 Cổng review | QA |
|
|
96
|
+
| `/qc-run-test` | `.Test.md` reviewed | Script Playwright + `qc_status` | QA |
|
|
97
|
+
| `/qc-report` | Kết quả run | Report + evidence + product-gap | QA |
|
|
98
|
+
|
|
99
|
+
## 9 · Quality & Trace
|
|
100
|
+
|
|
101
|
+
| Lệnh | Input | Output | Owner |
|
|
102
|
+
|------|-------|--------|-------|
|
|
103
|
+
| `/validate-traces` | `.trace/*.tsv` + spec/code/test | Ma trận coverage · `trace-report.json` · **`trace-history.jsonl`** (append) · đếm hàng đợi | Dev/QA/Lead |
|
|
104
|
+
> **`/validate-traces` có phạm vi (GAPS-v4 G57):** `--domain {d}` · `--prd {TICKET-ID}` · `--uc {UC-ID}`; không cờ nào = toàn bộ. Đây là lệnh **đắt nhất** trong framework (~33k token chỉ dẫn rồi đọc cả repo), nên cờ scope là thứ làm nó chạy được thường xuyên — và `/sync` Step 1e nói cho bạn biết **scope là gì**.
|
|
105
|
+
>
|
|
106
|
+
> ⚠️ Biên bản có scope **không bao giờ** được coi là đầy đủ: report mang `scope`, và `gate-trace` G2 **fail** nếu `scope.kind !== "all"` — không ngoại lệ, không đếm số domain trên đĩa. Muốn tạo PR thì phải có một lần audit **toàn bộ** đã commit.
|
|
107
|
+
|
|
108
|
+
| `/validate-traces --realign-prd-version {UC}` | cờ ⓘ `PRD_STALE_REF` | Sửa **chỉ dòng `@trace.*`** — không đụng logic | Dev |
|
|
109
|
+
| `/validate-traces --realign-techdoc-revision {UC}` | cờ ⓘ `TECHDOC_STALE_REF` | như trên | Dev |
|
|
110
|
+
| `/generate-spec-manifest` | Specs | Mục lục spec cho agent ngoài | SA/Lead |
|
|
111
|
+
|
|
112
|
+
## 10 · Feedback & Ops
|
|
113
|
+
|
|
114
|
+
| Lệnh | Input | Output | Owner |
|
|
115
|
+
|------|-------|--------|-------|
|
|
116
|
+
| `/report-bug` | Lỗi phát hiện | `feedback/bug-reports/` (spec-anchored) | Tester/QC |
|
|
117
|
+
| `/propose-scenario` | Scenario thiếu | **A:** `feedback/bdd-proposals/` → `/generate-bdd` chèn · **B:** `feedback/prd-change-requests/` → PO chạy `/extend-prd` | Tester/QC |
|
|
118
|
+
| `/learn` · `/learn --review` | Định hướng lặp lại · rà/retire lesson cũ | `project-lessons.md` | Tất cả |
|
|
119
|
+
| `/sync` | (umbrella) | Pull + submodule + nổi feedback + Living Docs | Lead |
|
|
120
|
+
| `/update-framework` | — | Sync bản npm mới | Lead |
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Ký hiệu trạng thái trong report
|
|
125
|
+
|
|
126
|
+
- 🛑 checkpoint (dừng, chờ `Y`) · 🔒 gate trạng thái (chặn downstream) · ⚪ read-only
|
|
127
|
+
- ⚠️ cảnh báo mềm (không chặn) · ✅ pass · ❌ fail
|
|
128
|
+
- 🔴 cờ **chặn PR** — `SEAM_UNWIRED` · `STUB_UNRESOLVED` · `ORPHANED` · `TRACE_ORPHAN`. Build xanh + test từng-UC xanh **không** đủ để bỏ qua chúng.
|
|
129
|
+
- 🟠 cờ drift **không chặn PR** — `PRD_DRIFT` · `BDD_DRIFT` · `TECHDOC_DRIFT` · `FE_TECHDOC_DRIFT` · `TECHDOC_STALE_VS_BDD` · `DESIGNSPEC_DRIFT` · `DESIGNSPEC_STALE_VS_BDD`. *"Code chưa theo kịp spec"*, khác *"code đang hỏng"*. **Hết cờ 🔴 ≠ sạch.**
|
|
130
|
+
- ⓘ cờ **không phải lỗi** — `PRD_STALE_REF` · `TECHDOC_STALE_REF` (version lệch nhưng changelog không nêu UC này → chỉ con trỏ cũ) · `SEAM_PENDING` · `STUB_PENDING` (owner chưa gen).
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## CLI maintenance (không phải slash command)
|
|
135
|
+
|
|
136
|
+
Chạy qua `npx @educa-corp/sdd-framework <flag>`. Tất cả **dry-run mặc định** — thêm `--apply` để thực thi.
|
|
137
|
+
|
|
138
|
+
| Flag | Việc |
|
|
139
|
+
|------|------|
|
|
140
|
+
| `--init` | Cài/nâng cấp `.agent/` + shortcut `.claude/commands/`. Backup file bạn đã sửa sang `.agent/.overwritten-*/` và liệt kê ra |
|
|
141
|
+
| `--migrate-bdd-platform` | `bdd/*.feature` phẳng → `bdd/{platform}/`. Báo `OCCUPIED` / `LOST SPEC` thay vì đoán |
|
|
142
|
+
| `--migrate-specs` | Bố cục artifact-type-first cũ (`specs/prd/`, `specs/bdd/`) → feature-package |
|
|
143
|
+
| `--rename-prd-files` | `prd.md` → `{TICKET-ID}-{prd-slug}.md` |
|
|
144
|
+
| `--help` | Danh sách đầy đủ |
|
|
145
|
+
|
|
146
|
+
Trong repo framework: `npm run build` (assemble template + chạy self-check) · `npm run self-check` (chỉ kiểm contract trace).
|
|
147
|
+
|
|
148
|
+
→ [Trace Schema](trace-schema.md) · [Modules](modules.md) · [Configuration](configuration.md) · [Model Selection](model-selection.md)
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
| Tag | Ý nghĩa | Bắt buộc |
|
|
18
18
|
|-----|---------|:--------:|
|
|
19
19
|
| `@trace.id` | UC-ID — `{TICKET-ID}-UC{N}` (vd `SEG01-UC1`) | ✅ |
|
|
20
|
-
| `@trace.platform` | `web` / `app` / `system` — **mọi mode, kể cả umbrella** | ✅ |
|
|
20
|
+
| `@trace.platform` | `web` / `app` / `system` / `webview` — **mọi mode, kể cả umbrella**. Đây là **delivery surface**, không phải tech stack: `webview` (bundle web nhúng trong app native — Phaser game, mini-app) là surface riêng, không phải `web` (browser) cũng không phải `app` (native) | ✅ |
|
|
21
21
|
| `@trace.domain` | Domain nghiệp vụ | ✅ |
|
|
22
22
|
| `@trace.prd` | TICKET-ID của PRD nguồn | ✅ |
|
|
23
23
|
| `@trace.prd_version` | Version PRD lúc sinh BDD | ✅ |
|
|
@@ -172,6 +172,7 @@ Shared code dò qua **import chain** từ boundary → tránh tag explosion.
|
|
|
172
172
|
|
|
173
173
|
| Cờ | Nguồn | Nghĩa |
|
|
174
174
|
|---|---|---|
|
|
175
|
+
| `PRD_UNTRACKED_EDIT` 🔴 | Step 3.9 | **nội dung PRD đổi mà nhãn `Version` KHÔNG đổi** — có người sửa ngoài `/generate-prd` · `/extend-prd` · `/amend-prd` · `/refine-prd` · `/review-context`. So bằng `git diff` **và** `git status` với mốc `spec_baseline`. Cố ý **không** vào `gate.blocking` — xem dưới |
|
|
175
176
|
| `PRD_DRIFT` | Step 4 | version PRD lệch **và** changelog **có** nêu UC này → nội dung đổi thật |
|
|
176
177
|
| `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
178
|
| `BDD_DRIFT` | Step 5c | code mang `@trace.bdd_version` cũ hơn `.feature` |
|
|
@@ -186,12 +187,55 @@ Shared code dò qua **import chain** từ boundary → tránh tag explosion.
|
|
|
186
187
|
|
|
187
188
|
> 🔴 = **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
|
>
|
|
190
|
+
> 🔴 **`PRD_UNTRACKED_EDIT` là ngoại lệ có chủ ý — 🔴 nhưng KHÔNG chặn PR.** `gate.blocking` nghĩa hẹp là *code đang hỏng*; cờ này nói về **spec**, và code có thể đang hoàn toàn đúng. Thêm nữa: mọi project đang chạy đều đã có PRD sửa tay ⇒ một cờ chặn mới sẽ đỏ khắp nơi ở lần đầu ⇒ người ta **tắt cổng** ⇒ mất luôn 4 cờ chặn thật. Đó đúng là thất bại `self-check` R9(e) được viết ra để chống, chỉ đến bằng một cửa khác. Team đã dọn sạch nợ tồn thì tự thêm `prd_untracked_edit_count` vào `gate.blocking` (kèm `why`; R13(e) canh).
|
|
191
|
+
>
|
|
192
|
+
> **Đường ra tự lành, cố ý không có `--accept-edit`:** bump `Version` + ghi một row changelog nêu UC (tức đúng việc `/amend-prd` làm hộ) ⇒ `version != version_at_audit` ⇒ cờ tự tắt, và `PRD_DRIFT` bình thường tiếp quản. Một cờ escape sẽ là một đường **dán nhãn lên thay đổi chưa ai xem** — đúng cái ba rào của `--realign-*` tồn tại để chặn.
|
|
193
|
+
>
|
|
189
194
|
> ⓘ = **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
195
|
>
|
|
191
196
|
> **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.
|
|
192
197
|
|
|
193
198
|
---
|
|
194
199
|
|
|
200
|
+
## Dòng changelog — contract máy đọc
|
|
201
|
+
|
|
202
|
+
Hai cờ ⓘ ở trên hoạt động được là nhờ **một dòng văn bản**: row `# Change Log` của PRD (và `## Changelog` của tech-doc). `/validate-traces` Step 4/5 đọc nó để biết lần bump version đó **đụng UC nào**. Nên nó không phải ghi chú cho người đọc — nó là **đầu vào của một phép phân loại**.
|
|
203
|
+
|
|
204
|
+
Grammar: `bin/trace-schema.json` → `changelog_row_contract`. `bin/self-check.js` **R12** fail build nếu lệch.
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
| {version} | {YYYY-MM-DD} | {changelog_scope} |
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**`{changelog_scope}`** — các mệnh đề ngăn bằng `;`, mỗi mệnh đề **mở đầu bằng đơn vị sở hữu**:
|
|
211
|
+
|
|
212
|
+
| Dạng | Nghĩa |
|
|
213
|
+
|---|---|
|
|
214
|
+
| `{UC-ID}: {mô tả}` | thay đổi thuộc UC này → UC này ăn 🟠 |
|
|
215
|
+
| `PRD-global:` / `doc-global:` | không thuộc UC nào → **không** UC nào ăn cờ |
|
|
216
|
+
| `… [no-behavior]` | producer **chứng minh được** mệnh đề này không đổi hành vi → UC nêu trong đó ở lại ⓘ. Danh sách được phép: `changelog_row_contract.neutral_checks` |
|
|
217
|
+
|
|
218
|
+
**Ví dụ đúng**
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
| 1.4 | 2026-08-19 | Auto-fix — UC5: banned-term (khách hàng→người mua); PRD-global: skeleton §4b [no-behavior] |
|
|
222
|
+
| 2.0 | 2026-08-22 | thêm UC7: AC12-AC14, BR21-BR23; UC3: sửa BR8 (giới hạn 5→20) |
|
|
223
|
+
| 3 | 2026-08-25 | UC1: thêm block client web §4.5.1.2, từ BDD web v1.2 |
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Hai kiểu sai — và chúng hỏng theo hai hướng ngược nhau**
|
|
227
|
+
|
|
228
|
+
| Viết sai | Consumer làm gì | Hướng hỏng |
|
|
229
|
+
|---|---|---|
|
|
230
|
+
| `cập nhật theo yêu cầu mới` — **mơ hồ**, không nêu đơn vị nào | 🟠 cho **MỌI** UC (lưới an toàn) | **ỒN.** Cờ sáng thường trực → người đọc học cách bỏ qua → lần lệch thật cũng bị bỏ qua |
|
|
231
|
+
| `…; sửa BR8` — **nêu BR mà bỏ UC sở hữu** | Row nêu đủ ID nên **không** bị coi là mơ hồ; nhưng phép thử là *"**UC** này có trong tập?"* nên UC3 → **ⓘ** | **IM LẶNG.** Và ⓘ **mở cửa** cho `--realign-*` (nó chỉ từ chối khi UC là 🟠) ⇒ nhãn version bị dán lại trên thay đổi chưa ai implement |
|
|
232
|
+
|
|
233
|
+
Ca thứ hai là lý do consumer **phải** chuẩn hoá tập bị ảnh hưởng **về UC** trước khi so — phép phân giải **`BR/AC → UC sở hữu`**: `BR{n}` → UC có BR đó trong bảng Business Rule (PRD §3) · `AC{n}` → UC có AC đó ở dòng `**AC liên quan:**`. Không phân giải được → coi **cả row** là mơ hồ, **không** bỏ qua im lặng.
|
|
234
|
+
|
|
235
|
+
> **Lưới an toàn không phải cái cớ để producer ghi bừa.** Nó đúng khi **thiếu** thông tin, và sai khi producer **có** thông tin mà không ghi. R12 canh đúng chỗ đó: producer phải có một **dòng template** mang `{changelog_scope}` (ví dụ đã điền cụ thể thì không bị canh), và consumer phải nhắc cả `[no-behavior]` lẫn phép phân giải — vì một marker được **ghi** mà không ai **hiểu** thì tệ hơn không có marker.
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
195
239
|
## Xuất JSON cho panel
|
|
196
240
|
|
|
197
241
|
`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.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
[← /generate-prd](02-generate-prd.md) · [Explain Home](README.md) · [Next: /
|
|
1
|
+
[← /generate-prd](02-generate-prd.md) · [Explain Home](README.md) · [Next: /amend-prd →](02c-amend-prd.md)
|
|
2
2
|
|
|
3
3
|
# 02b · `/extend-prd` — Thêm yêu cầu vào PRD đã duyệt
|
|
4
4
|
|