@educa-corp/sdd-framework 0.6.0 → 0.7.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/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 +391 -30
- package/core/FRAMEWORK_VERSION +1 -1
- package/{commands/extend-prd.md → core/commands/amend-prd.md} +205 -173
- package/core/commands/dev-run-test.md +47 -9
- package/core/commands/extend-prd.md +39 -12
- package/core/commands/generate-bdd.md +43 -4
- package/core/commands/generate-code.md +33 -0
- package/core/commands/generate-tech-docs.md +34 -2
- 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 +284 -11
- package/core/rules/workflow.md +34 -0
- package/core/steps/context-loader.md +26 -5
- package/core/templates/feature.template +1 -1
- package/docs/02-concepts/architecture.md +36 -0
- package/docs/04-reference/commands.md +148 -134
- package/docs/04-reference/trace-schema.md +39 -0
- package/docs/explain/02b-extend-prd.md +1 -1
- package/docs/explain/02c-amend-prd.md +152 -0
- 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,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` chỉ có một cổng **chặn cứng** trên file đã có — gõ `Y` là nó vẫn ghi đè, và ghi đè sẽ mất changelog + **đánh số lại BR** ⇒ hỏng `@trace.business_rules` trong mọi BDD đã sinh.
|
|
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)
|
|
@@ -192,6 +192,45 @@ Shared code dò qua **import chain** từ boundary → tránh tag explosion.
|
|
|
192
192
|
|
|
193
193
|
---
|
|
194
194
|
|
|
195
|
+
## Dòng changelog — contract máy đọc
|
|
196
|
+
|
|
197
|
+
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**.
|
|
198
|
+
|
|
199
|
+
Grammar: `bin/trace-schema.json` → `changelog_row_contract`. `bin/self-check.js` **R12** fail build nếu lệch.
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
| {version} | {YYYY-MM-DD} | {changelog_scope} |
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**`{changelog_scope}`** — các mệnh đề ngăn bằng `;`, mỗi mệnh đề **mở đầu bằng đơn vị sở hữu**:
|
|
206
|
+
|
|
207
|
+
| Dạng | Nghĩa |
|
|
208
|
+
|---|---|
|
|
209
|
+
| `{UC-ID}: {mô tả}` | thay đổi thuộc UC này → UC này ăn 🟠 |
|
|
210
|
+
| `PRD-global:` / `doc-global:` | không thuộc UC nào → **không** UC nào ăn cờ |
|
|
211
|
+
| `… [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` |
|
|
212
|
+
|
|
213
|
+
**Ví dụ đúng**
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
| 1.4 | 2026-08-19 | Auto-fix — UC5: banned-term (khách hàng→người mua); PRD-global: skeleton §4b [no-behavior] |
|
|
217
|
+
| 2.0 | 2026-08-22 | thêm UC7: AC12-AC14, BR21-BR23; UC3: sửa BR8 (giới hạn 5→20) |
|
|
218
|
+
| 3 | 2026-08-25 | UC1: thêm block client web §4.5.1.2, từ BDD web v1.2 |
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Hai kiểu sai — và chúng hỏng theo hai hướng ngược nhau**
|
|
222
|
+
|
|
223
|
+
| Viết sai | Consumer làm gì | Hướng hỏng |
|
|
224
|
+
|---|---|---|
|
|
225
|
+
| `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 |
|
|
226
|
+
| `…; 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 |
|
|
227
|
+
|
|
228
|
+
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.
|
|
229
|
+
|
|
230
|
+
> **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.
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
195
234
|
## Xuất JSON cho panel
|
|
196
235
|
|
|
197
236
|
`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
|
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
[← /extend-prd](02b-extend-prd.md) · [Explain Home](README.md) · [Next: /refine-prd →](03-refine-prd.md)
|
|
2
|
+
|
|
3
|
+
# 02c · `/amend-prd` — Đổi một yêu cầu đã duyệt
|
|
4
|
+
|
|
5
|
+
> **Một câu.** Sửa **tại chỗ** nội dung của một AC/BR/UC đã duyệt — PO khai tường minh ID, lệnh kiểm va chạm, ghi bằng `Edit` với guard **hai chiều**, bump version + `Status → draft`, và nói rõ UC nào phải làm lại.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Vấn đề giải quyết
|
|
10
|
+
|
|
11
|
+
Có bốn tình huống PO chạm PRD. Trước GAPS-v4 G54 chỉ ba cái có lệnh.
|
|
12
|
+
|
|
13
|
+
| Tình huống | Lệnh | Có từ |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| PRD chưa có | `/generate-prd` | đầu |
|
|
16
|
+
| **Thêm** UC/AC/BR mới | `/extend-prd` | v0.4.3 |
|
|
17
|
+
| Sửa vấn đề **review chỉ ra** | `/refine-prd` | đầu |
|
|
18
|
+
| **Đổi một yêu cầu đang đúng cú pháp** | *(không có)* | — |
|
|
19
|
+
|
|
20
|
+
Nhánh thứ tư là *"BR8 nói tối đa 5 file, giờ đổi thành 20"*. Không thêm gì mới. Không phải AI phát hiện lỗi. Chỉ đổi một con số đã duyệt.
|
|
21
|
+
|
|
22
|
+
Ba lệnh có sẵn đều **từ chối đúng việc đó**:
|
|
23
|
+
|
|
24
|
+
| Lệnh | Vì sao không dùng được |
|
|
25
|
+
|---|---|
|
|
26
|
+
| `/generate-prd` | Chỉ có một cổng **chặn cứng** rồi vẫn ghi đè. Ghi đè mất changelog và **đánh số lại BR** ⇒ phá `@trace.business_rules` trong mọi `.feature` đã sinh. Đường có mìn, không phải đường dùng được |
|
|
27
|
+
| `/extend-prd` | **Add-only.** Bước 5 §3 đòi output là *"superset chặt"* của bản cũ. Có **một** cửa sửa nội dung cũ (Bước 3.2 case 1, "mâu thuẫn rule") nhưng nó **phái sinh** — chỉ mở khi phần THÊM làm BR cũ sai |
|
|
28
|
+
| `/refine-prd` | Resume Mode Phase 2 tự cấm đụng section nào không được một finding trỏ tới, và findings sinh từ việc soi PRD hiện có ⇒ **không có đường nào để một ý định MỚI của PO đi vào** |
|
|
29
|
+
|
|
30
|
+
Nên hành vi hợp lý duy nhất còn lại là **mở file `.md` ra gõ**.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Vì sao nhánh thiếu này nặng hơn nó trông (GAPS-v4 G54)
|
|
35
|
+
|
|
36
|
+
Toàn bộ lưới an toàn của framework so **nhãn version**, không so **nội dung**. Kiểm bằng máy: `grep "content_hash|checksum|sha256|md5"` trên toàn bộ lệnh + schema + step → **0 kết quả**.
|
|
37
|
+
|
|
38
|
+
Nên khi PO sửa tay: bìa không đổi, trang changelog trắng, con dấu `approved` vẫn còn.
|
|
39
|
+
|
|
40
|
+
| Tầng canh | Nó hỏi gì | Trả lời | Kết quả |
|
|
41
|
+
|---|---|---|---|
|
|
42
|
+
| `/validate-traces` Step 4 | *"PRD Version == cột `prd_version`?"* | `1.3 == 1.3` | ✅ sạch |
|
|
43
|
+
| `gate-trace` G2 | *"report khớp sổ TSV?"* | khớp | ✅ PASS |
|
|
44
|
+
| `require-fresh-audit` | *"PR có chạm file mang tag trace?"* | PO chỉ sửa `.md` | ✅ không đòi audit |
|
|
45
|
+
|
|
46
|
+
**Ba tầng xanh, và ba tầng đều đúng theo định nghĩa của chính chúng.** Code vẫn chặn ở 5, test vẫn assert 5 và vẫn PASS — nó đang test đúng code, chỉ là code sai spec. Dashboard hiện `OK · ✅ 10 tests · qc pass`.
|
|
47
|
+
|
|
48
|
+
So với hai họ hàng gần:
|
|
49
|
+
|
|
50
|
+
| | Hỏng kiểu gì | Có gì để phát hiện? |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| G52 | **Ồn** — báo oan cho mọi UC | Có, quá nhiều |
|
|
53
|
+
| G53 | **Im lặng** — nhưng version vẫn lệch, vẫn còn cờ ⓘ để người tinh ý thấy | Có, một chút |
|
|
54
|
+
| **G54** | **Im lặng tuyệt đối** | **Không có gì** |
|
|
55
|
+
|
|
56
|
+
Và đây là nhánh **dùng nhiều nhất**: trên một sản phẩm đang sống, *"đổi một yêu cầu đã có"* xảy ra thường hơn *"thêm một UC hoàn toàn mới"* rất nhiều.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Vị trí & tiền đề
|
|
61
|
+
|
|
62
|
+
- **Vị trí:** Phase Specification — nhánh *"PRD đã tồn tại, đổi nội dung"*.
|
|
63
|
+
- **Tiền đề:** có PRD. Không có → `/generate-prd`.
|
|
64
|
+
- **Mức chặn:** **CỨNG** (`--yes` không bỏ qua được). Đây là thao tác ghi **duy nhất** trong framework được phép làm output **không phải superset** của bản cũ.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Nó làm gì, theo thứ tự
|
|
69
|
+
|
|
70
|
+
| Bước | Làm gì | Điểm đáng chú ý |
|
|
71
|
+
|---|---|---|
|
|
72
|
+
| **1** | Nạp PRD + **PO khai tường minh `amend_targets`** | Trình danh sách UC/BR/AC để PO chọn. **Không tự suy** target từ mô tả mơ hồ — đoán sai là sửa sai một yêu cầu đã duyệt. Mỗi ID được phân giải về **UC sở hữu** ngay |
|
|
73
|
+
| **2** | **Kiểm va chạm** (3 câu) | Tái dùng `/extend-prd` Bước 3.2, **đảo hướng**: ở đó là *"phần THÊM có làm cái cũ sai không"*, ở đây là *"cái SỬA có làm phần còn lại sai không"*. Mỗi "có" **mở rộng `amend_targets`** |
|
|
74
|
+
| **3** | Altitude | Cơ chế xuống BR/BL, AC chỉ giữ outcome + ref. Đây là chỗ dễ trôi nhất khi sửa tại chỗ |
|
|
75
|
+
| **4** | Ghi + **guard sau-ghi HAI CHIỀU** | Xem dưới — đây là phần cốt lõi |
|
|
76
|
+
| **5** | Bump version + `{changelog_scope}` + `Status → draft` | Đổi một giới hạn nghiệp vụ là **major**: code hiện tại đang sai so với spec mới |
|
|
77
|
+
| **6** | Report | Nêu **UC PHẢI làm lại** kèm lệnh, và **cấm tường minh** `--realign` cho chúng |
|
|
78
|
+
|
|
79
|
+
### Guard hai chiều — chỗ lệnh này khác mọi thao tác ghi khác
|
|
80
|
+
|
|
81
|
+
`/extend-prd` guard bằng *"output là **superset chặt**"*. Ở đây output **cố ý không** phải superset, nên guard phải đảo:
|
|
82
|
+
|
|
83
|
+
| Chiều | Kiểm gì | Fail nghĩa là |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| **Bảo toàn** | Mọi UC/BR/AC-ID + row changelog cũ **vẫn còn** | Đã xoá thứ không được xoá |
|
|
86
|
+
| **Giới hạn** | **Mọi** nội dung đã đổi đều thuộc một ID trong `amend_targets` | Đã sửa **lan ra ngoài** phạm vi PO chốt |
|
|
87
|
+
|
|
88
|
+
Chiều **Giới hạn** quan trọng bằng chiều Bảo toàn, và vì một lý do cụ thể: `{changelog_scope}` dựng từ `amend_targets`. Nếu bản ghi lỡ sửa một UC không có trong danh sách đó thì changelog **không nêu** UC ấy ⇒ `/validate-traces` xếp nó vào ⓘ `PRD_STALE_REF` ⇒ `--realign-prd-version` **mở cửa** và dán nhãn version lại lên một thay đổi chưa ai implement. Đúng hình dạng **G53**, chỉ đến từ một hướng khác.
|
|
89
|
+
|
|
90
|
+
Fail chiều nào → **khôi phục file**, dừng, **không** sang Bước 5.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Hai chế độ, và những gì nó **không** làm
|
|
95
|
+
|
|
96
|
+
| Chế độ | Cờ | Làm gì |
|
|
97
|
+
|---|---|---|
|
|
98
|
+
| Sửa nội dung | *(mặc định)* | Đổi nội dung của ID đã có. ID giữ nguyên |
|
|
99
|
+
| **Khai tử tại chỗ** | `--retire {ID}` | Đánh dấu ID không còn hiệu lực **nhưng GIỮ NGUYÊN row + ID** |
|
|
100
|
+
|
|
101
|
+
`--retire` tồn tại vì **xoá hẳn một BR là bẫy**: `@trace.business_rules` trong mọi `.feature` đã sinh đang trỏ vào ID đó, nên xoá row biến một liên kết hợp lệ thành `TRACE_ORPHAN` 🔴. Khai tử tại chỗ đạt cùng mục đích nghiệp vụ mà không phá liên kết.
|
|
102
|
+
|
|
103
|
+
| PO muốn | Lệnh đúng |
|
|
104
|
+
|---|---|
|
|
105
|
+
| Thêm UC/AC/BR mới | `/extend-prd` — lệnh này **không đánh số mới** bao giờ |
|
|
106
|
+
| **Xoá hẳn** một dòng | *(không có, có chủ ý)* → `--retire` |
|
|
107
|
+
| Sửa lỗi `/refine-prd` vừa chỉ ra | `/refine-prd --resume` |
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Cửa sau vẫn có chuông
|
|
112
|
+
|
|
113
|
+
Mở cửa chính không có nghĩa không ai đi cửa sau. `/validate-traces` **Step 3.9** canh:
|
|
114
|
+
|
|
115
|
+
- Đọc mốc `spec_baseline` (`prd_path` · `sha_at_audit` · `version_at_audit`) mà lần audit trước đã ghi.
|
|
116
|
+
- So bằng **hai nguồn**: `git diff` (sửa đã commit) **và** `git status` (sửa **chưa** commit — ca thường gặp nhất, vì PO đang gõ).
|
|
117
|
+
- Nội dung đổi **mà** `Version` không đổi → 🔴 **`PRD_UNTRACKED_EDIT`**.
|
|
118
|
+
|
|
119
|
+
**Không báo oan:** sửa **và** bump version ⇒ `version != version_at_audit` ⇒ im.
|
|
120
|
+
|
|
121
|
+
**Đường ra tự lành, cố ý không có `--accept-edit`:** cách sửa đúng là bump version + ghi row changelog nêu UC — tức đúng việc lệnh này làm hộ. Làm xong thì cờ tự tắt và logic `PRD_DRIFT` bình thường tiếp quản. Thêm một cờ escape sẽ là thêm 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.
|
|
122
|
+
|
|
123
|
+
**Vì sao cờ này không chặn PR:** `gate.blocking` nghĩa hẹp là *code đang hỏng*; cờ này nói về *spec*. 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ờ 🔴 thật. Đó đúng là thất bại mà `self-check` R9(e) được viết ra để chặn, chỉ đến bằng một cửa khác. Team đã dọn sạch nợ tồn thì tự thêm counter vào `gate.blocking`; R13(e) canh việc đó có kèm `why`.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Sau đó chạy gì
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
/amend-prd {prd-file} UC3-BR8
|
|
131
|
+
→ /review-context {prd-file} ← kiểm chất lượng phần vừa sửa
|
|
132
|
+
→ PO đặt Status: approved
|
|
133
|
+
→ /generate-bdd {prd-file} ← CHỈ cho UC bị sửa
|
|
134
|
+
→ /generate-code {UC-ID}
|
|
135
|
+
→ /dev-gen-test → /dev-run-test ← test cũ đang assert giá trị cũ và vẫn PASS
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
❌ **Không** `--realign-prd-version` cho UC bị sửa — nội dung đổi thật.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Máy canh gì
|
|
143
|
+
|
|
144
|
+
| Rule | Canh gì |
|
|
145
|
+
|---|---|
|
|
146
|
+
| `self-check` **R11** | Lệnh phải tự khai mức `chặn CỨNG`, khớp `gate.checkpoint_levels.hard` |
|
|
147
|
+
| `self-check` **R12** | Là producer dòng changelog → phải có **dòng template** mang `{changelog_scope}` |
|
|
148
|
+
| `self-check` **R13** | `spec_baseline` phải được **GHI** như một key trong `trace-report.json` — nếu không, cờ `PRD_UNTRACKED_EDIT` không bao giờ bật mà R6/R7 vẫn ✅ |
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
[← /extend-prd](02b-extend-prd.md) · [Explain Home](README.md) · [Next: /refine-prd →](03-refine-prd.md)
|
package/docs/explain/28-sync.md
CHANGED
|
@@ -68,3 +68,28 @@ Umbrella nhiều submodule + một spec repo dùng chung dễ lệch nhau. `/syn
|
|
|
68
68
|
## Kết nối
|
|
69
69
|
|
|
70
70
|
**Trước:** bất kỳ (vận hành) · **Sau:** [`/validate-traces`](21-validate-traces.md); xử lý `📥 tester feedback` nổi lên → [`/fix-bug`](23-fix-bug.md)/[`/generate-bdd`](06-generate-bdd.md).
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Step 1e — "tài liệu nào vừa đổi" *(mới, GAPS-v4 G56)*
|
|
75
|
+
|
|
76
|
+
Câu hỏi số **một** của dev sau mỗi lần sync. Trước đó `/sync` **không** trả lời: nó diff đúng ba đường dẫn `feedback/*` và **bỏ qua `specs/`** — tức hỏi *"có góp ý gì mới"* rồi bỏ qua chính tài liệu mà mọi lệnh downstream đọc (PRD · BDD · tech-doc · design-spec). Range `{old_sha}..{new_sha}` đã có sẵn từ Step 1c, nên thêm nó là thêm **một tham số đường dẫn**.
|
|
77
|
+
|
|
78
|
+
Step này trả lời **hai câu khác nhau**, bằng **hai mốc khác nhau**:
|
|
79
|
+
|
|
80
|
+
| | Mốc | Trả lời | Vấn đề nếu chỉ có cái này |
|
|
81
|
+
|---|---|---|---|
|
|
82
|
+
| **1e-A** | `{old_sha}..{new_sha}` | *"đổi gì kể từ lần **PULL** trước"* | Mốc **reset mỗi lần pull**. Pull 4 ngày liền không audit → ngày thứ 5 chỉ thấy delta của **một ngày** |
|
|
83
|
+
| **1e-B** | `spec_baseline.sha_at_audit` | *"đổi gì kể từ lần **AUDIT** gần nhất"* | — con số này **tích luỹ đúng** |
|
|
84
|
+
|
|
85
|
+
1e-B đọc khối `spec_baseline` mà `/validate-traces` Step 6b ghi (cùng khối dùng cho cờ `PRD_UNTRACKED_EDIT` của G54). `/sync` **chỉ đọc, không bao giờ ghi** — nếu nó cũng ghi thì mốc audit trượt theo mỗi lần pull, tức phá đúng thứ 1e-B tồn tại để cung cấp. `self-check` R13 canh cả lời khai này.
|
|
86
|
+
|
|
87
|
+
### Và dòng `Next` không còn là hằng số
|
|
88
|
+
|
|
89
|
+
Bản cũ in cứng `/validate-traces (full coverage check) | /generate-code {UC-ID}` — **y hệt nhau** dù 0 file đổi hay 12 file đổi. Một lời nhắc không bao giờ thay đổi thì không mang thông tin nên bị lướt; cộng thêm việc lệnh duy nhất nó gợi ý là lệnh **đắt nhất** (quét cả repo), nên con đường duy nhất được chỉ là con đường người ta sẽ không đi.
|
|
90
|
+
|
|
91
|
+
Giờ nó rẽ nhánh: có nợ audit → `/validate-traces {các PRD đó}` · chỉ 1e-A có đổi → `/generate-code` cho phần đó · cả hai sạch → `✅ Spec khớp audit — không cần audit lại`.
|
|
92
|
+
|
|
93
|
+
> Đây là nguyên tắc `gate.md` Bước 3b đã áp cho CHECKPOINT (*"cổng luôn in ra một bảng giống hệt nhau … nên `Y` thành phản xạ và cổng hỏng âm thầm"*) — G56 là chỗ nó còn thiếu.
|
|
94
|
+
>
|
|
95
|
+
> **Lưu ý về bản chất:** G56 **không** phải một detector bị hỏng. Mọi detector đều đúng. Đây là một **công tắc bị thiếu** — không ai biết là cần bật.
|