@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,23 +1,33 @@
|
|
|
1
|
-
# /
|
|
1
|
+
# /amend-prd — Sửa tại chỗ một yêu cầu đã duyệt trong PRD
|
|
2
2
|
|
|
3
|
-
> **
|
|
3
|
+
> **Nhánh thứ tư — đọc bảng này trước khi chọn lệnh:**
|
|
4
4
|
>
|
|
5
|
-
> |
|
|
5
|
+
> | Tình huống | Lệnh | Thao tác ghi |
|
|
6
6
|
> |---|---|---|
|
|
7
|
-
> |
|
|
8
|
-
> |
|
|
7
|
+
> | PRD **chưa có** | `/generate-prd` | **Write** cả file |
|
|
8
|
+
> | PRD đã có, **thêm** UC/AC/BR mới | `/extend-prd` | **Edit add-only** — output là superset chặt |
|
|
9
|
+
> | PRD đã có, **sửa vấn đề review chỉ ra** | `/refine-prd` → Review Board → `--resume` | Edit trong phạm vi finding |
|
|
10
|
+
> | **PRD đã có, PO muốn ĐỔI một yêu cầu đang đúng cú pháp** | **`/amend-prd`** | **Edit tại chỗ** — output **KHÔNG** phải superset |
|
|
9
11
|
>
|
|
10
|
-
>
|
|
11
|
-
>
|
|
12
|
-
>
|
|
12
|
+
> **Vì sao phải là lệnh riêng (GAPS-v4 G54).** Ba lệnh kia đều **từ chối đúng việc này**:
|
|
13
|
+
> `/generate-prd` **DỪNG HẲN** trên file đã có (§Guard: *"Tồn tại → DỪNG. KHÔNG ghi, KHÔNG hỏi
|
|
14
|
+
> Y/N"* — vì ghi đè mất changelog, **đánh số lại BR**, phá `@trace.business_rules` trong mọi
|
|
15
|
+
> `.feature` đã sinh, cả ba không hoàn tác được) · `/extend-prd` chỉ **add-only**, luật
|
|
16
|
+
> Bước 5 §3 đòi output là *"superset chặt"* · `/refine-prd` tự cấm đụng section nào không được một
|
|
17
|
+
> finding trỏ tới, và findings sinh từ việc soi PRD hiện có nên **không có đường nào để một ý định
|
|
18
|
+
> MỚI của PO đi vào**.
|
|
13
19
|
>
|
|
14
|
-
>
|
|
15
|
-
>
|
|
16
|
-
>
|
|
20
|
+
> Trước lệnh này, hành vi hợp lý duy nhất còn lại là **mở file `.md` ra gõ** — và đó là con đường
|
|
21
|
+
> DUY NHẤT framework không nhìn thấy: mọi drift detector so **nhãn version**, không so **nội dung**
|
|
22
|
+
> (0 content hash trong toàn bộ codebase). Sửa tay không bump version ⇒ **0 cờ**, không 🔴 không 🟠
|
|
23
|
+
> không ⓘ. Nên nhánh thiếu không phải một tiện ích còn nợ; nó là **điểm mù mà chính thiết kế tạo ra**.
|
|
24
|
+
>
|
|
25
|
+
> **`/validate-traces` canh cửa sau** bằng cờ `PRD_UNTRACKED_EDIT` (schema → `spec_edit_detection`):
|
|
26
|
+
> nội dung PRD đổi mà `Version` không đổi ⇒ có người đi cửa sau. Cửa chính là lệnh này.
|
|
17
27
|
|
|
18
28
|
## Gate
|
|
19
29
|
|
|
20
|
-
*Checkpoint: **chặn CỨNG** —
|
|
30
|
+
*Checkpoint: **chặn CỨNG** — SỬA TẠI CHỖ một AC/BR/UC đã duyệt — 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ũ. `--yes` KHÔNG bỏ qua được (gate Bước 3a).*
|
|
21
31
|
|
|
22
32
|
# Gate — Quy trình vào chuẩn cho mọi lệnh
|
|
23
33
|
|
|
@@ -172,7 +182,7 @@ Mỗi dòng ⚠️/🔴 phải ứng với một trạng thái **context-loader
|
|
|
172
182
|
🔴/⚠️ (không chặn ≠ không báo — người đọc log sau này vẫn cần thấy).
|
|
173
183
|
|
|
174
184
|
|
|
175
|
-
*Lưu ý: Với lệnh này, target ở Bước 1 là **file PRD đã tồn tại** `{TICKET-ID}-{prd-slug}.md` (file `.md` duy nhất ở gốc feature folder).
|
|
185
|
+
*Lưu ý: Với lệnh này, target ở Bước 1 là **file PRD đã tồn tại** `{TICKET-ID}-{prd-slug}.md` (file `.md` duy nhất ở gốc feature folder). `$ARGUMENTS` rỗng → liệt kê `{specs_dir}/*/*/*.md` và hỏi. **Không tìm thấy file PRD → DỪNG** và chỉ sang `/generate-prd`.*
|
|
176
186
|
|
|
177
187
|
## Context
|
|
178
188
|
**BẮT BUỘC — đọc `.agent/steps/context-loader.md` và thực thi TOÀN BỘ quy trình trong đó**,
|
|
@@ -184,7 +194,7 @@ placeholder bên dưới sẽ rỗng và lệnh sẽ đọc/ghi sai chỗ.
|
|
|
184
194
|
|
|
185
195
|
---
|
|
186
196
|
|
|
187
|
-
## Ngôn ngữ nghiệp vụ *(áp cho mọi text
|
|
197
|
+
## Ngôn ngữ nghiệp vụ *(áp cho mọi text được sửa: AC, BR, Business Logic, Scope)*
|
|
188
198
|
# Business Language Guard — chặn thuật ngữ kỹ thuật rò vào tài liệu nghiệp vụ
|
|
189
199
|
|
|
190
200
|
Tài liệu nghiệp vụ (PRD, product-definition) mô tả **WHAT** — chỉ ngôn ngữ nghiệp vụ. Guard này chạy **mỗi khi viết hoặc sửa** prose (gen mới, áp fix `--resume`, hiệu chỉnh): **quét và xử lý** các thuật ngữ kỹ thuật/UI phổ thông bên dưới **trước khi ghi**.
|
|
@@ -245,190 +255,209 @@ Các từ như `cờ / flag`, `biến / trường / field`, `giá trị / value`
|
|
|
245
255
|
|
|
246
256
|
---
|
|
247
257
|
|
|
248
|
-
## Bước 1 — Nạp
|
|
258
|
+
## Bước 1 — Nạp PRD và **PO khai tường minh** cái cần sửa
|
|
249
259
|
|
|
250
260
|
Đọc target PRD, trích và lưu:
|
|
251
261
|
|
|
252
262
|
| Giá trị | Nguồn | Dùng để |
|
|
253
263
|
|---|---|---|
|
|
254
|
-
| `current_version` | Metadata `\| **Version** \|` | tính version mới ở Bước
|
|
255
|
-
| `current_status` | Metadata `\| **Status** \|` | cảnh báo nếu
|
|
256
|
-
| `
|
|
257
|
-
| `
|
|
258
|
-
| `
|
|
259
|
-
| `existing_ucs` | danh sách UC-ID + tên | phát hiện va chạm ở Bước 3 · báo "UC không đổi" ở Bước 7 |
|
|
264
|
+
| `current_version` | Metadata `\| **Version** \|` | tính version mới ở Bước 5 |
|
|
265
|
+
| `current_status` | Metadata `\| **Status** \|` | cảnh báo nếu chưa `approved` |
|
|
266
|
+
| `existing_ucs` | danh sách UC-ID + tên | phân giải UC sở hữu · kiểm va chạm |
|
|
267
|
+
| `all_br` | mọi BR-ID + nội dung, theo UC sở hữu (bảng BR ở §3) | phân giải `BR{n}` → UC |
|
|
268
|
+
| `all_ac` | mọi AC-ID + nội dung, theo UC sở hữu (dòng `**AC liên quan:**`) | phân giải `AC{n}` → UC |
|
|
260
269
|
| `changelog_rows` | bảng `# Change Log` | biết PRD đã đi qua những gì |
|
|
261
|
-
| `
|
|
262
|
-
| `bdd_generated` | glob `{specs_dir}/{domain}/{prd-slug}/bdd/*/{TICKET-ID}-UC*.feature` | **cảnh báo BR ID churn** + route ở Bước 7 |
|
|
263
|
-
|
|
264
|
-
**Guard — PRD đang `draft`:** nếu `current_status != approved` → cảnh báo mềm, không chặn:
|
|
265
|
-
```
|
|
266
|
-
⚠️ PRD đang ở Status: {status} (chưa approved).
|
|
267
|
-
Thêm yêu cầu lên một PRD chưa chốt sẽ trộn hai việc: phần chưa duyệt + phần mới.
|
|
268
|
-
Cân nhắc hoàn tất review vòng hiện tại trước (/review-context → PO duyệt).
|
|
269
|
-
Vẫn thêm bây giờ? (Y/N)
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
**Guard — BDD đã sinh:** nếu `bdd_generated` không rỗng, hiện danh sách và nêu rõ hệ quả:
|
|
273
|
-
```
|
|
274
|
-
ℹ️ {n} file BDD đã sinh cho PRD này: {danh sách UC × platform}
|
|
275
|
-
Lệnh này CHỈ đánh số nối tiếp (UC{max_uc+1}, BR{max_br+1}) — KHÔNG bao giờ đánh lại
|
|
276
|
-
ID cũ, nên các liên kết @trace.business_rules hiện có KHÔNG bị ảnh hưởng.
|
|
277
|
-
Sau khi thêm: chỉ cần /generate-bdd cho UC MỚI; các UC cũ không phải gen lại
|
|
278
|
-
(/validate-traces sẽ xếp chúng vào ⓘ PRD_STALE_REF, không phải 🟠 PRD_DRIFT).
|
|
279
|
-
```
|
|
270
|
+
| `bdd_generated` | glob `{specs_dir}/{domain}/{prd-slug}/bdd/*/{TICKET-ID}-UC*.feature` | tính blast radius ở Bước 6 |
|
|
280
271
|
|
|
281
|
-
|
|
272
|
+
### `amend_targets` — **BẮT BUỘC, không suy đoán**
|
|
282
273
|
|
|
283
|
-
|
|
274
|
+
PO phải nêu **chính xác ID** cần sửa. Đây là ràng buộc cứng nhất của lệnh: ID được khai
|
|
275
|
+
**trở thành `{changelog_scope}`** ở Bước 5, và cũng là **danh sách duy nhất** mà guard sau-ghi ở
|
|
276
|
+
Bước 4 cho phép nội dung thay đổi.
|
|
284
277
|
|
|
285
|
-
|
|
278
|
+
Nhận `amend_targets` theo thứ tự:
|
|
286
279
|
|
|
287
|
-
|
|
280
|
+
1. Từ `$ARGUMENTS` nếu PO đã nêu (vd `/amend-prd PAY01 UC3-BR8`).
|
|
281
|
+
2. Nếu không, **hỏi** — kèm danh sách để PO chọn, đừng để PO gõ mò:
|
|
282
|
+
```
|
|
283
|
+
Sửa gì trong {TICKET-ID}? (nhập ID, cách nhau bằng dấu phẩy)
|
|
288
284
|
|
|
289
|
-
|
|
285
|
+
UC3 "Xuất báo cáo"
|
|
286
|
+
BR8 tối đa 5 file mỗi lần
|
|
287
|
+
BR9 chỉ xuất được đơn đã duyệt
|
|
288
|
+
AC5 người dùng xuất được nhiều đơn trong một lần
|
|
289
|
+
UC4 …
|
|
290
|
+
```
|
|
291
|
+
3. **KHÔNG tự suy** target từ một mô tả mơ hồ (*"sửa cái giới hạn file ấy"*). Trình danh sách ứng
|
|
292
|
+
viên rồi để PO chốt. Đoán sai ở đây là sửa sai một yêu cầu đã duyệt.
|
|
290
293
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
| `accepted` | Đưa `Requested behavior` + `Suggested AC` vào làm **nguyên liệu** cho Bước 3. **KHÔNG chèn thẳng vào PRD** — đây là yêu cầu nghiệp vụ, phải qua PO chốt AC/BR đúng tầng. |
|
|
294
|
-
| `Open` (chưa ai xử) | **Trình cho PO ngay ở CHECKPOINT** kèm số ngày chờ: *"có {n} request chưa xử lý, đưa vào lần này không?"*. PO chọn từng cái. |
|
|
295
|
-
| `rejected` / `incorporated` | Bỏ qua. |
|
|
294
|
+
Với **mỗi** target, phân giải **UC sở hữu** ngay (dùng `all_br` / `all_ac`) và lưu vào
|
|
295
|
+
`affected_ucs`. ID không phân giải được về UC nào → **DỪNG**, báo ID sai; đừng sửa mò.
|
|
296
296
|
|
|
297
|
-
|
|
297
|
+
### Hai chế độ — và những gì lệnh này **KHÔNG** làm
|
|
298
298
|
|
|
299
|
-
|
|
299
|
+
| Chế độ | Cờ | Làm gì |
|
|
300
|
+
|---|---|---|
|
|
301
|
+
| **Sửa nội dung** *(mặc định)* | — | Đổi nội dung của ID đã có. ID **giữ nguyên**. |
|
|
302
|
+
| **Khai tử tại chỗ** | `--retire {ID}` | Đánh dấu ID là không còn hiệu lực **NHƯNG GIỮ NGUYÊN row/ID** (xem Bước 4). |
|
|
300
303
|
|
|
301
|
-
|
|
304
|
+
**Ngoài phạm vi — route đi chỗ khác, đừng làm ở đây:**
|
|
302
305
|
|
|
303
|
-
|
|
306
|
+
| PO muốn | Lệnh đúng | Vì sao không phải lệnh này |
|
|
307
|
+
|---|---|---|
|
|
308
|
+
| Thêm UC/AC/BR mới | `/extend-prd` | Nó có Discovery delta + đánh số nối tiếp. Lệnh này **không đánh số mới** bao giờ |
|
|
309
|
+
| **XOÁ HẲN** một dòng BR/AC/UC | *(không có, và có chủ ý)* | Xoá row làm `@trace.business_rules` trong mọi `.feature` đã sinh trỏ vào ID không còn ⇒ đúng hình dạng `TRACE_ORPHAN`. Dùng `--retire` — nó đạt cùng mục đích nghiệp vụ mà **không** phá liên kết |
|
|
310
|
+
| Sửa lỗi mà `/refine-prd` vừa chỉ ra | `/refine-prd --resume` | Nó đã có findings + `applied_to_version` để theo dõi delta |
|
|
304
311
|
|
|
305
|
-
|
|
312
|
+
**Guard — PRD chưa `approved`:** nếu `current_status != approved` → cảnh báo mềm, không chặn:
|
|
313
|
+
```
|
|
314
|
+
⚠️ PRD đang ở Status: {status} (chưa approved).
|
|
315
|
+
Sửa một yêu cầu CHƯA được duyệt thì thường không cần lệnh này — cứ hoàn tất vòng review
|
|
316
|
+
hiện tại (/review-context → /refine-prd → PO duyệt) là nội dung sẽ đúng.
|
|
317
|
+
Vẫn sửa tại chỗ bây giờ? (Y/N)
|
|
318
|
+
```
|
|
306
319
|
|
|
307
|
-
|
|
308
|
-
|---|---|---|
|
|
309
|
-
| **3.1** | **Định nghĩa phần thêm** — bối cảnh · vấn đề · phạm vi in/out · actor · pre/post-condition | Tương ứng Phase 1 của `/define-product`, thu hẹp vào phần mới |
|
|
310
|
-
| **3.2** | **Va chạm với cái đã có** ⭐ | Xem dưới — đây là phase KHÔNG có trong `/define-product` |
|
|
311
|
-
| **3.3** | **Business Rule** cho phần thêm | Phase 4 |
|
|
312
|
-
| **3.4** | **Business Logic** | Phase 5 |
|
|
313
|
-
| **3.5** | **Acceptance Criteria** | Phase 6 — giữ tầng: AC = outcome quan sát được + ref BR, cơ chế nằm ở BR/BL |
|
|
320
|
+
---
|
|
314
321
|
|
|
315
|
-
|
|
322
|
+
## Bước 2 — Kiểm va chạm *(bắt buộc, không bỏ qua)*
|
|
316
323
|
|
|
317
|
-
|
|
324
|
+
*Tái dùng đúng **Bước 3.2** của `/extend-prd`, đảo hướng: ở đó câu hỏi là "phần THÊM có làm cái cũ
|
|
325
|
+
sai không"; ở đây là "cái SỬA có làm phần còn lại sai không". Cùng ba câu, cùng lý do — va chạm âm
|
|
326
|
+
thầm là cách một PRD tự mâu thuẫn.*
|
|
318
327
|
|
|
319
|
-
|
|
328
|
+
Với **mỗi** target, đối chiếu nội dung mới với toàn bộ PRD và hỏi PO:
|
|
320
329
|
|
|
321
|
-
1. **Mâu thuẫn
|
|
322
|
-
|
|
323
|
-
|
|
330
|
+
1. **Mâu thuẫn ngược:** giá trị/hành vi mới có làm một BR **khác** trở nên sai hoặc không đủ không?
|
|
331
|
+
*(BR8 nâng 5→20, nhưng BR12 nói "gộp tối đa 5 file vào một hoá đơn")* → nếu có, **BR12 cũng phải
|
|
332
|
+
vào `amend_targets`**. Đây là lý do bước này không bỏ qua được: sửa một nửa của một cặp ràng buộc
|
|
333
|
+
là tạo một PRD tự mâu thuẫn, và không cờ nào bắt được mâu thuẫn nội bộ của tài liệu.
|
|
334
|
+
2. **AC lệch theo:** AC nào đang ref target này có còn diễn tả đúng outcome không? → nếu không, AC đó
|
|
335
|
+
vào `amend_targets`.
|
|
336
|
+
3. **Phụ thuộc liên service:** thay đổi có đụng cam kết ở **§1c** không? → cập nhật §1c (mức nghiệp vụ).
|
|
324
337
|
|
|
325
|
-
|
|
338
|
+
Mỗi câu trả lời "có" **mở rộng `amend_targets`** — và `affected_ucs` mở rộng theo. Chốt lại danh sách
|
|
339
|
+
trước khi sang CHECKPOINT.
|
|
326
340
|
|
|
327
|
-
|
|
328
|
-
|---|---|
|
|
329
|
-
| Thuần thêm mới | Append UC/AC/BR mới. Không đụng nội dung cũ. |
|
|
330
|
-
| Có sửa BR cũ | Sửa **tại chỗ** BR đó (Edit) **+** append phần mới. Nêu rõ trong changelog. |
|
|
331
|
-
| Mở rộng UC cũ | Append AC/BR mới **vào UC đó**, không tạo UC mới. |
|
|
341
|
+
### CHECKPOINT trước khi ghi
|
|
332
342
|
|
|
333
|
-
**CHECKPOINT** trước khi ghi:
|
|
334
343
|
```
|
|
335
|
-
CHECKPOINT —
|
|
344
|
+
CHECKPOINT — Amend PRD {TICKET-ID}
|
|
336
345
|
─────────────────────────────────────────────────
|
|
337
|
-
PRD : v{current_version} ({current_status}) — {n} UC
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
346
|
+
PRD : v{current_version} ({current_status}) — {n} UC
|
|
347
|
+
Sửa : UC3-BR8 "tối đa 5 file" → "tối đa 20 file"
|
|
348
|
+
UC3-AC5 {tóm tắt thay đổi}
|
|
349
|
+
Khai tử : {UC4-BR15 (--retire) | không}
|
|
350
|
+
Va chạm : {UC5-BR12 cũng phải sửa (mâu thuẫn với BR8 mới) | không}
|
|
351
|
+
UC ảnh hưởng: UC3, UC5 ← sẽ là {changelog_scope}
|
|
352
|
+
Version : v{current} → v{new} ({major|minor}) · Status → draft
|
|
353
|
+
|
|
354
|
+
Sau khi ghi, các UC trên BẮT BUỘC:
|
|
355
|
+
/generate-bdd → /generate-code → /dev-gen-test → /dev-run-test
|
|
356
|
+
❌ KHÔNG dùng --realign-prd-version cho chúng (nội dung đổi thật)
|
|
357
|
+
|
|
358
|
+
BDD đã sinh sẽ lỗi thời: {danh sách UC × platform}
|
|
344
359
|
|
|
345
360
|
Tiếp tục? (Y/N)
|
|
346
361
|
```
|
|
347
362
|
|
|
348
363
|
---
|
|
349
364
|
|
|
350
|
-
## Bước
|
|
365
|
+
## Bước 3 — Altitude: sửa ở đúng tầng
|
|
351
366
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
> tồn tại có thể còn bị tham chiếu ở BDD, code, bug report, hoặc PRD khác.
|
|
367
|
+
*Giống `/extend-prd` Bước 5 và `/refine-prd` Phase 2 — nêu lại vì đây là chỗ dễ trôi nhất khi sửa
|
|
368
|
+
tại chỗ: PO thường mô tả thay đổi bằng cơ chế, và cách rẻ nhất là nhét cơ chế vào AC.*
|
|
369
|
+
|
|
370
|
+
| Tầng | Chứa gì | KHÔNG chứa gì |
|
|
371
|
+
|---|---|---|
|
|
372
|
+
| **AC** | outcome **quan sát/kiểm được** + ref `_(BR: …)_` | số lần retry, timeout, tên cờ, nhánh lỗi vụn, và **không lặp lại nội dung BR nó ref** |
|
|
373
|
+
| **BR** | quy tắc nghiệp vụ (WHAT) — giá trị, giới hạn, điều kiện | chi tiết kỹ thuật triển khai |
|
|
374
|
+
| **Business Logic** | trình tự nghiệp vụ (HOW **nghiệp vụ**) | API, cấu trúc dữ liệu, thư viện |
|
|
375
|
+
|
|
376
|
+
Thay đổi là **cơ chế** mà PO đang muốn nhét vào AC → **route xuống BR/BL**, AC chỉ giữ outcome + ref.
|
|
377
|
+
|
|
378
|
+
**Chạy Business Language Guard trên MỌI text mới TRƯỚC khi ghi.**
|
|
365
379
|
|
|
366
380
|
---
|
|
367
381
|
|
|
368
|
-
## Bước
|
|
382
|
+
## Bước 4 — Ghi *(Edit tại chỗ · guard sau-ghi ĐẢO NGƯỢC)*
|
|
369
383
|
|
|
370
|
-
>
|
|
384
|
+
> **Đây là chỗ lệnh này khác MỌI thao tác ghi khác trong framework.** `/extend-prd` guard bằng
|
|
385
|
+
> *"output là **superset chặt** của bản cũ"*. Ở đây output **cố ý KHÔNG** phải superset — nên guard
|
|
386
|
+
> phải đảo: **mọi thứ giữ nguyên NGOẠI TRỪ đúng các ID trong `amend_targets`.**
|
|
371
387
|
>
|
|
372
|
-
>
|
|
373
|
-
>
|
|
374
|
-
> 3. Output PHẢI là **superset chặt** của bản cũ: **mọi** UC, AC, BR, row bảng, dòng changelog, cross-reference cũ **còn nguyên si** — trừ đúng những chỗ Bước 3.2 kết luận là "sửa BR cũ", và chỉ đúng những chỗ đó.
|
|
375
|
-
> 4. **Guard sau-ghi (bắt buộc):** đọc lại file vừa ghi, đối chiếu với bản trước khi sửa. Kiểm: mọi UC-ID cũ · mọi BR-ID cũ · mọi AC cũ · mọi row `# Change Log` cũ **vẫn còn**. Nếu **mất bất kỳ cái nào** → **DỪNG NGAY, khôi phục file về bản cũ** (`git checkout -- {file}` nếu đã commit, hoặc hoàn tác edit), báo:
|
|
376
|
-
> ```
|
|
377
|
-
> ❌ EXTEND làm mất {UC/AC/BR/changelog row} — đã chặn clobber.
|
|
378
|
-
> File đã khôi phục. Sửa lại theo add-only rồi chạy lại.
|
|
379
|
-
> ```
|
|
380
|
-
> **KHÔNG** tiếp tục sang Bước 6.
|
|
381
|
-
|
|
382
|
-
Vị trí ghi từng loại nội dung:
|
|
383
|
-
|
|
384
|
-
| Nội dung | Đặt ở đâu |
|
|
385
|
-
|---|---|
|
|
386
|
-
| UC mới | **Cuối §3**, sau UC hiện có cuối cùng. Đủ Actor · Description · Pre-condition · Post-condition · bảng BR · dòng "AC liên quan" |
|
|
387
|
-
| AC mới | **Cuối §2**, kèm ref `_(BR: …)_` trỏ về BR tương ứng |
|
|
388
|
-
| BR mới | Bảng BR của UC sở hữu. **Giữ đúng hình dạng bảng hiện có** (3 cột hay đã mở cột) — đừng đổi hình dạng ở lệnh này |
|
|
389
|
-
| Phụ thuộc mới | **§1c Phụ thuộc liên service** — append, mức nghiệp vụ |
|
|
390
|
-
| Màn hình mới | **§4b Wireframe** — nguồn coverage cho `/generate-bdd` C.1 |
|
|
391
|
-
| Quy ước mới dùng ≥2 chỗ | **§1d**, khai MỘT LẦN, AC/BR trỏ tới thay vì chép |
|
|
388
|
+
> Guard yếu hơn không được: một lệnh được phép sửa nội dung đã duyệt mà không có rào chính xác là
|
|
389
|
+
> đúng cái `/generate-prd` bị chặn-cứng để tránh.
|
|
392
390
|
|
|
393
|
-
|
|
391
|
+
1. **Đọc lại file trên disk NGAY TRƯỚC khi ghi** — không dựa vào bản nạp ở Bước 1.
|
|
392
|
+
2. **CHỈ dùng Edit.** **CẤM tuyệt đối Write cả file.**
|
|
393
|
+
3. **KHÔNG đánh số lại bất kỳ ID nào.** Không thêm ID mới (đó là `/extend-prd`). Không xoá row.
|
|
394
|
+
4. Chế độ `--retire {ID}`: **giữ nguyên row và ID**, đổi nội dung thành dạng khai tử rõ ràng —
|
|
395
|
+
`~~{nội dung cũ}~~ **(không còn hiệu lực từ v{new})**` — và thêm một dòng nêu lý do nghiệp vụ.
|
|
396
|
+
*Không xoá row vì `@trace.business_rules` trong `.feature` đã sinh đang trỏ vào ID này; xoá nó
|
|
397
|
+
biến một liên kết hợp lệ thành `TRACE_ORPHAN` 🔴.*
|
|
394
398
|
|
|
395
|
-
|
|
399
|
+
### Guard sau-ghi *(bắt buộc — DỪNG nếu fail)*
|
|
396
400
|
|
|
397
|
-
|
|
401
|
+
Đọc lại file vừa ghi, đối chiếu với bản trước khi sửa. Kiểm **hai chiều**:
|
|
402
|
+
|
|
403
|
+
| Chiều | Kiểm gì | Fail nghĩa là |
|
|
404
|
+
|---|---|---|
|
|
405
|
+
| **Bảo toàn** | Mọi UC-ID · BR-ID · AC-ID · row `# Change Log` cũ **vẫn còn** (kể cả ID vừa `--retire`) | Đã xoá thứ không được xoá |
|
|
406
|
+
| **Giới hạn** | **Mọi** nội dung đã đổi đều thuộc một ID trong `amend_targets` — **không có** chỗ nào khác đổi | Đã sửa lan ra ngoài phạm vi PO chốt |
|
|
398
407
|
|
|
399
|
-
|
|
408
|
+
Fail bất kỳ chiều nào → **DỪNG NGAY, khôi phục file về bản cũ** (`git checkout -- {file}` nếu đã
|
|
409
|
+
commit, hoặc hoàn tác edit), báo:
|
|
410
|
+
```
|
|
411
|
+
❌ AMEND vi phạm phạm vi — đã chặn.
|
|
412
|
+
{Mất: UC3-BR9 | Sửa ngoài phạm vi: UC7-BR22 (không có trong amend_targets)}
|
|
413
|
+
File đã khôi phục. Chỉ sửa đúng ID đã chốt rồi chạy lại.
|
|
414
|
+
```
|
|
415
|
+
**KHÔNG** tiếp tục sang Bước 5.
|
|
400
416
|
|
|
401
|
-
|
|
417
|
+
> **Vì sao chiều "Giới hạn" quan trọng bằng chiều "Bảo toàn":** `{changelog_scope}` ở Bước 5 dựng từ
|
|
418
|
+
> `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**
|
|
419
|
+
> UC ấy ⇒ `/validate-traces` xếp nó vào ⓘ `PRD_STALE_REF` ⇒ `--realign-prd-version` **mở cửa** và dán
|
|
420
|
+
> 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.
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
## Bước 5 — Bump version & ghi changelog
|
|
402
425
|
|
|
403
426
|
1. Loại bump:
|
|
404
|
-
- **major** (X.0 → X+1.0):
|
|
405
|
-
|
|
406
|
-
|
|
427
|
+
- **major** (X.0 → X+1.0): đổi hành vi theo hướng **breaking** · `--retire` một BR/AC · tái cấu
|
|
428
|
+
trúc scope. *(Đổi một giới hạn nghiệp vụ 5→20 là **major** — code hiện tại đang chặn ở 5, tức
|
|
429
|
+
nó đang sai so với spec mới.)*
|
|
430
|
+
- **minor** (x.Y → x.Y+1): làm rõ diễn đạt mà **không** đổi hành vi nghiệm thu được.
|
|
431
|
+
2. Cập nhật Metadata: `Version` = mới · `Updated` = hôm nay · **`Status` = `draft`**
|
|
432
|
+
*(yêu cầu đã duyệt vừa đổi ⇒ con dấu duyệt cũ hết hiệu lực — đồng bộ `/refine-prd`, `/extend-prd`.)*
|
|
407
433
|
3. Thêm row lên **đầu** bảng `# Change Log`:
|
|
408
434
|
```
|
|
409
|
-
| {new_version} | {today} | {
|
|
435
|
+
| {new_version} | {today} | {changelog_scope} |
|
|
410
436
|
```
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
---
|
|
417
|
-
|
|
418
|
-
## Bước 6.5 — Đóng dấu request đã xử lý
|
|
437
|
+
**`{changelog_scope}` — mỗi mệnh đề mở đầu bằng UC SỞ HỮU** *(contract:
|
|
438
|
+
`bin/trace-schema.json` → `changelog_row_contract`)*. Nguồn: `affected_ucs` đã chốt ở Bước 2 —
|
|
439
|
+
tức **UC sở hữu của từng ID trong `amend_targets`**. Ngăn nhau bằng `;`. Thay đổi ở §1c/§1d
|
|
440
|
+
(không thuộc UC nào) → `PRD-global`.
|
|
419
441
|
|
|
420
|
-
|
|
442
|
+
**Ví dụ đúng**
|
|
443
|
+
```
|
|
444
|
+
| 2.0 | 2026-08-19 | UC3: sửa BR8 (giới hạn 5→20 file), AC5 theo đó; UC5: sửa BR12 (bỏ ràng buộc gộp 5) |
|
|
445
|
+
| 3.0 | 2026-08-22 | UC4: khai tử BR15 (không còn yêu cầu duyệt hai cấp) |
|
|
446
|
+
```
|
|
421
447
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
4. **Commit + push** spec repo (giống `feedback/` — xem `/propose-scenario` Step 5): `git add feedback/prd-change-requests/ && git commit -m "po(prd-change): {TICKET-ID} — incorporated into v{new}" && git push`. Không có quyền push → mở PR/MR và in fallback.
|
|
448
|
+
⚠️ **BR/AC không bao giờ đứng một mình.** `sửa BR8` (thiếu `UC3:`) nêu đủ ID để **không** bị coi
|
|
449
|
+
là mơ hồ, nhưng consumer khớp theo **UC** — nên UC3 rơi vào ⓘ và `--realign` dán nhãn lại lên
|
|
450
|
+
đúng thay đổi này. **Lệnh này là producer dễ mắc lỗi đó nhất**, vì đầu vào của nó *là* một BR-ID.
|
|
426
451
|
|
|
427
|
-
|
|
452
|
+
⚠️ **KHÔNG dùng hậu tố `[no-behavior]` ở lệnh này.** Nó dành cho fix mà producer **chứng minh
|
|
453
|
+
được** là thuần cấu trúc (`changelog_row_contract.neutral_checks`). Lệnh này tồn tại để đổi **nội
|
|
454
|
+
dung nghiệp vụ** — theo định nghĩa là có đổi hành vi.
|
|
455
|
+
4. Cập nhật dòng đầu section: `> Hiện tại: **v{new}** ({today}) · Lịch sử đầy đủ → [changelog](./changelog/{TICKET-ID}-{prd-slug}.changelog.md)`
|
|
456
|
+
5. **Rollover** (cửa sổ trượt 5 row) — theo đúng quy ước `/refine-prd` Phase 3.
|
|
428
457
|
|
|
429
458
|
---
|
|
430
459
|
|
|
431
|
-
## Bước
|
|
460
|
+
## Bước 6 — Report
|
|
432
461
|
|
|
433
462
|
**Đọc `.agent/steps/report-footer.md`** và áp đúng khuôn footer trong đó (Status Badge ·
|
|
434
463
|
Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
|
|
@@ -436,51 +465,55 @@ Output Artifacts · Next) cho report cuối, kèm khối bên dưới.
|
|
|
436
465
|
Ví dụ footer cho lệnh này:
|
|
437
466
|
|
|
438
467
|
```
|
|
439
|
-
/
|
|
468
|
+
/amend-prd Đã sửa — {TICKET-ID} {tên feature}
|
|
469
|
+
|
|
470
|
+
Version : v1.3 → v2.0 (major) · Status → draft
|
|
471
|
+
Sửa : UC3-BR8 "tối đa 5 file" → "tối đa 20 file"
|
|
472
|
+
UC3-AC5 diễn đạt lại outcome theo BR8 mới
|
|
473
|
+
UC5-BR12 bỏ ràng buộc gộp 5 (va chạm với BR8 mới — Bước 2 câu 1)
|
|
474
|
+
Khai tử : không
|
|
475
|
+
Changelog : | 2.0 | 2026-08-19 | UC3: sửa BR8 (giới hạn 5→20 file), AC5 theo đó; UC5: sửa BR12 |
|
|
476
|
+
|
|
477
|
+
Guard sau-ghi : ✅ Bảo toàn — {n} UC · {m} AC · {k} BR · {j} changelog row cũ còn nguyên
|
|
478
|
+
✅ Giới hạn — 0 chỗ đổi ngoài amend_targets
|
|
440
479
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
480
|
+
🔴 UC PHẢI làm lại (nội dung đổi thật): UC3, UC5
|
|
481
|
+
/generate-bdd {prd-file} ← BDD hiện tại đang nghiệm thu giới hạn 5
|
|
482
|
+
→ /generate-code {UC-ID} ← code đang chặn ở 5
|
|
483
|
+
→ /dev-gen-test → /dev-run-test ← test đang assert 5 và vẫn PASS
|
|
484
|
+
❌ TUYỆT ĐỐI KHÔNG --realign-prd-version cho UC3/UC5 — đó là dán nhãn lên thay đổi
|
|
485
|
+
chưa ai implement.
|
|
446
486
|
|
|
447
|
-
|
|
487
|
+
BDD sẽ lỗi thời: bdd/system/{TICKET-ID}-UC3.feature · bdd/web/{TICKET-ID}-UC3.feature
|
|
448
488
|
|
|
449
|
-
UC KHÔNG đổi ({n}): {UC1, UC2,
|
|
450
|
-
|
|
451
|
-
/validate-traces sẽ xếp chúng vào ⓘ PRD_STALE_REF (nhãn version cũ, nội dung không đổi).
|
|
452
|
-
Sạch bằng: /validate-traces --realign-prd-version {UC-ID}
|
|
489
|
+
UC KHÔNG đổi ({n}): {UC1, UC2, UC4…}
|
|
490
|
+
→ ⓘ PRD_STALE_REF. Sạch bằng: /validate-traces --realign-prd-version {UC-ID}
|
|
453
491
|
|
|
454
|
-
⚠️ Status đã reset về draft —
|
|
492
|
+
⚠️ Status đã reset về draft — thay đổi chưa được duyệt lại.
|
|
455
493
|
|
|
456
494
|
---
|
|
457
495
|
Status : ✅ Complete
|
|
458
496
|
Output Artifacts:
|
|
459
|
-
updated {paths.specs_dir}/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md (
|
|
497
|
+
updated {paths.specs_dir}/{domain}/{prd-slug}/{TICKET-ID}-{prd-slug}.md (v2.0)
|
|
460
498
|
updated {paths.specs_dir}/{domain}/{prd-slug}/changelog/… (nếu có rollover)
|
|
461
|
-
updated {paths.prd_change_requests_dir}/archived/… (nếu có request)
|
|
462
499
|
Pipeline : Discovery → [PRD ◀ bạn ở đây] → Design Spec → BDD → Tech Design → Code → Dev Self-Check → QC → Trace Audit
|
|
463
|
-
Next : /
|
|
464
|
-
→
|
|
465
|
-
→
|
|
466
|
-
• Feature CÓ màn hình → /generate-design-spec {prd-file} (design-spec sẽ tự
|
|
467
|
-
phát hiện lỗi thời vs PRD mới và bắt sign-off lại) rồi /generate-bdd
|
|
468
|
-
• Thuần backend → /generate-bdd {prd-file} thẳng
|
|
469
|
-
→ CHỈ gen BDD/code cho UC MỚI. UC cũ: dùng --realign-prd-version.
|
|
500
|
+
Next : /review-context {prd-file} ← kiểm chất lượng phần vừa sửa
|
|
501
|
+
→ khi sạch critical, PO đặt Status: approved
|
|
502
|
+
→ /generate-bdd {prd-file} ← CHỈ cho UC3, UC5
|
|
470
503
|
```
|
|
471
504
|
|
|
472
505
|
---
|
|
473
506
|
|
|
474
507
|
## Quality Checklist *(kiểm trước khi ghi)*
|
|
475
508
|
|
|
476
|
-
- [ ]
|
|
477
|
-
- [ ]
|
|
478
|
-
- [ ]
|
|
479
|
-
- [ ]
|
|
480
|
-
- [ ]
|
|
481
|
-
- [ ]
|
|
509
|
+
- [ ] `amend_targets` do **PO khai tường minh** — không suy từ mô tả mơ hồ
|
|
510
|
+
- [ ] Mỗi target đã phân giải được **UC sở hữu**; ID không phân giải được → đã DỪNG
|
|
511
|
+
- [ ] Bước 2 đã hỏi đủ 3 câu va chạm, và mọi ID phát sinh **đã được thêm** vào `amend_targets`
|
|
512
|
+
- [ ] **KHÔNG** đánh số lại ID nào · **KHÔNG** thêm ID mới · **KHÔNG** xoá row nào
|
|
513
|
+
- [ ] `--retire` giữ nguyên row + ID (chỉ đổi nội dung sang dạng khai tử)
|
|
514
|
+
- [ ] Guard sau-ghi PASS **cả hai chiều**: Bảo toàn **và** Giới hạn
|
|
515
|
+
- [ ] Altitude đúng tầng: cơ chế nằm ở BR/BL, AC chỉ outcome + ref
|
|
516
|
+
- [ ] `{changelog_scope}`: mỗi mệnh đề **mở đầu bằng UC sở hữu**; **không** BR/AC đứng một mình; **không** `[no-behavior]`
|
|
482
517
|
- [ ] `Status` đã reset về `draft`
|
|
483
|
-
- [ ] Hình dạng bảng BR giữ nguyên như cũ (không đổi 3-cột ↔ mở-cột ở lệnh này)
|
|
484
518
|
- [ ] Không có banned term; 0 thuật ngữ kỹ thuật/UI trong text mới
|
|
485
|
-
- [ ]
|
|
486
|
-
- [ ] Report nêu rõ danh sách **UC không đổi** + route `--realign-prd-version` cho chúng
|
|
519
|
+
- [ ] Report nêu **UC PHẢI làm lại** kèm lệnh, và **cấm tường minh** `--realign` cho chúng
|
|
@@ -338,20 +338,58 @@ Sau khi chạy, lưu kết quả vào **TSV authoritative** trong service để
|
|
|
338
338
|
report Living Docs ở spec module (qua `/sync` + `/validate-traces`). Các file test
|
|
339
339
|
ở lại trong service — chỉ *status* của lần chạy được report.
|
|
340
340
|
|
|
341
|
-
Cập nhật **sổ của platform đang test** `{paths.trace_dir}/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv` (`{platform}` = platform của code/`.feature` đang test — `system` cho backend, `web`/`app
|
|
341
|
+
Cập nhật **sổ của platform đang test** `{paths.trace_dir}/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv` (`{platform}` = platform của code/`.feature` đang test — `system` cho backend, mọi platform khác (`web`/`app`/`webview`/…) cho client; nếu `domain`/`prd_slug` không phân giải được từ spec target, định vị TSV bằng cách glob `{paths.trace_dir}/**/{UC-ID}-{platform}.tsv` — nó được tạo trước đó bởi `/generate-bdd`) — cho mỗi scenario row (khớp `sc_id` qua tag
|
|
342
342
|
`@trace.verifies={UC-ID}-SC{N}` của test). *(Umbrella + `spec_source`: `trace_dir` là `{spec_source}/.trace` — test chạy từ `service_root` nhưng update `dev_selftest` ghi vào **spec repo**; commit/push spec submodule cho nó.)*
|
|
343
343
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
344
|
+
### ĐỌC cột `status` của row TRƯỚC KHI GHI *(bắt buộc)*
|
|
345
|
+
|
|
346
|
+
*Contract: `bin/trace-schema.json` → `positive_assertion_guards`. Dữ liệu đã có trong sổ — không phát sinh I/O.*
|
|
347
|
+
|
|
348
|
+
`pass` **không** mang nghĩa *"test đã chạy và xanh"*. Nó mang nghĩa **"scenario này đã được nghiệm thu theo spec HIỆN TẠI"**. Nên trước khi ghi nó, đọc `status` của đúng row đó:
|
|
349
|
+
|
|
350
|
+
| `status` của row | `dev_selftest` ghi gì | `dev_selftest_at` |
|
|
351
|
+
|---|---|---|
|
|
352
|
+
| `OK` · `GAP` · `UNTRACKED` | `pass` nếu mọi test của SC này pass · `fail` nếu có cái fail · `not_run` nếu test bị skip/vắng | hôm nay |
|
|
353
|
+
| **`DRIFT`** | test **pass** → **`not_run`** *(KHÔNG ghi `pass`)* · test **fail** → **`fail`** như thường | `—` nếu ghi `not_run`; hôm nay nếu ghi `fail` |
|
|
354
|
+
| **`ORPHANED`** | **`not_run`** — scenario đã bị xoá khỏi `.feature`, không còn gì để nghiệm thu | `—` |
|
|
355
|
+
|
|
356
|
+
`last_updated` = hôm nay, mọi trường hợp.
|
|
357
|
+
|
|
358
|
+
**Tin xấu luôn hợp lệ.** Đây là guard cho lời khẳng định **DƯƠNG**, không phải lệnh *"bỏ qua kết quả khi DRIFT"*. Test đỏ trên row DRIFT vẫn là thông tin thật và phải được ghi. Chỉ `pass` cần giấy phép.
|
|
359
|
+
|
|
360
|
+
**Khi ghi `not_run` vì `DRIFT`/`ORPHANED`, in ngay:**
|
|
361
|
+
```
|
|
362
|
+
⚠️ {sc_id} — test XANH nhưng row đang {DRIFT | ORPHANED}, nên KHÔNG ghi pass.
|
|
363
|
+
{DRIFT: spec đã đổi sau lần codegen (spec_ver {a} ≠ gen_ver {b}) — test hiện tại đang
|
|
364
|
+
nghiệm thu một hành vi không còn tồn tại.
|
|
365
|
+
Làm: /generate-code {UC-ID} → /dev-gen-test {UC-ID} → chạy lại lệnh này.}
|
|
366
|
+
{ORPHANED: scenario đã bị xoá khỏi .feature nhưng code+test còn. Xử theo /validate-traces.}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
> **Vì sao bước này bắt buộc (GAPS-v4 G55).** Bản cũ ghi `pass` chỉ dựa vào *test có xanh không*, và
|
|
370
|
+
> khai `dev_selftest` **trực giao** với `status`. Trực giao về *kết quả chạy* thì đúng — nhưng
|
|
371
|
+
> **không** trực giao về *quyền được khẳng định*.
|
|
372
|
+
>
|
|
373
|
+
> Chuỗi hỏng, mọi mắt nối đều là hành vi framework tự chỉ định: PO đổi AC → `/generate-bdd` đặt
|
|
374
|
+
> `status = DRIFT` và **hạ** `dev_selftest → not_run` (kèm cảnh báo *"test của SC này viết cho spec
|
|
375
|
+
> cũ"*) → sáng sau dev chạy lệnh này theo thói quen, **chưa** `/generate-code`, **chưa**
|
|
376
|
+
> `/dev-gen-test` → test cũ + code cũ xanh hết → ghi `pass` + **ngày hôm nay**.
|
|
377
|
+
>
|
|
378
|
+
> Tức **lệnh kế tiếp trong vòng lặp dev bình thường dựng lại đúng cái tín hiệu `/generate-bdd` vừa
|
|
379
|
+
> hạ xuống.** README §Philosophy: *"Một tín hiệu đã hết đúng phải bị hạ xuống, không được giữ"* —
|
|
380
|
+
> ở đây còn tệ hơn *giữ*: nó **tái phát hành** với dấu ngày mới.
|
|
381
|
+
>
|
|
382
|
+
> Và thứ duy nhất chở tín hiệu *"test đã lỗi thời"* là **một dòng terminal** từ một lần chạy có thể
|
|
383
|
+
> đã xảy ra tuần trước, trong session của người khác: sổ có 24 cột và **không cột nào** giữ *"test
|
|
384
|
+
> được viết cho `spec_ver` nào"*. Dev không có cách nào biết. Đọc `status` là cách rẻ nhất để biết.
|
|
385
|
+
>
|
|
386
|
+
> **Tầng thứ hai độc lập:** `lint-trace` **T12** bắt đúng trạng thái này ở sổ thật (`status` ∈
|
|
387
|
+
> {DRIFT, ORPHANED} mà `dev_selftest`/`qc_status` = `pass`), bất kể lệnh nào ghi ra — kể cả sổ sửa
|
|
388
|
+
> tay hoặc sổ sinh bởi version framework cũ hơn.
|
|
349
389
|
|
|
350
390
|
Giữ nguyên mọi cột khác — đặc biệt **không bao giờ** đụng `qc_status`/`qc_run_at`
|
|
351
|
-
(kết quả QC automation chính thức, do `/qc-run-test` sở hữu
|
|
352
|
-
và `qc_status` (QC chính thức) là hai tín hiệu riêng.
|
|
353
|
-
trực giao với `status` (OK/GAP/DRIFT/UNTRACKED/ORPHANED): `status` theo dõi *coverage*, `dev_selftest`
|
|
354
|
-
theo dõi *kết quả chạy* gần nhất của dev.
|
|
391
|
+
(kết quả QC automation chính thức, do `/qc-run-test` sở hữu; nó có guard riêng cùng loại).
|
|
392
|
+
`dev_selftest` (dev smoke) và `qc_status` (QC chính thức) là hai tín hiệu riêng.
|
|
355
393
|
|
|
356
394
|
## Refresh Panel Mirror
|
|
357
395
|
# Làm mới panel mirror của Living Docs *(local)*
|