@educa-corp/sdd-framework 0.5.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/build.js +113 -19
- package/bin/gate-trace.js +487 -0
- package/bin/index.js +445 -146
- package/bin/lint-trace.js +643 -0
- package/bin/self-check.js +804 -2
- package/bin/trace-schema.json +621 -10
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/README.md +20 -0
- package/core/commands/amend-prd.md +518 -0
- package/core/commands/debug.md +123 -511
- package/core/commands/define-product.md +86 -510
- package/core/commands/dev-gen-test.md +86 -510
- package/core/commands/dev-run-test.md +133 -519
- package/core/commands/dev-smoke-test.md +86 -510
- package/core/commands/extend-prd.md +128 -522
- package/core/commands/fix-bug.md +118 -509
- package/core/commands/generate-architecture.md +94 -515
- package/core/commands/generate-bdd.md +128 -513
- package/core/commands/generate-code.md +119 -510
- package/core/commands/generate-design-spec.md +86 -510
- package/core/commands/generate-prd.md +89 -510
- package/core/commands/generate-spec-manifest.md +86 -510
- package/core/commands/generate-tech-docs.md +120 -512
- package/core/commands/learn.md +172 -496
- package/core/commands/map-testids.md +86 -510
- package/core/commands/propose-scenario.md +86 -510
- package/core/commands/qc-analyze.md +86 -510
- package/core/commands/qc-design-test.md +86 -510
- package/core/commands/qc-plan.md +86 -510
- package/core/commands/qc-report.md +86 -510
- package/core/commands/qc-review.md +86 -510
- package/core/commands/qc-run-test.md +115 -513
- package/core/commands/refine-prd.md +112 -522
- package/core/commands/report-bug.md +86 -510
- package/core/commands/review-code.md +123 -511
- package/core/commands/review-context.md +136 -522
- package/core/commands/review-tech-docs.md +90 -511
- package/core/commands/setup-ai-first.md +166 -138
- package/core/commands/sync.md +155 -107
- package/core/commands/update-framework.md +16 -103
- package/core/commands/validate-traces.md +426 -511
- package/core/hooks/data-guard.js +174 -83
- package/core/hooks/settings.json +2 -1
- package/core/rules/workflow.md +64 -4
- package/core/steps/capture-lesson.md +34 -1
- package/core/steps/context-loader.md +50 -8
- package/core/steps/gate.md +92 -35
- package/core/steps/report-footer.md +23 -0
- package/core/templates/README.md +24 -1
- package/core/templates/ci/trace-gate.yml +146 -0
- package/core/templates/feature.template +1 -1
- package/core/templates/hooks/pre-push +61 -0
- package/docs/02-concepts/architecture.md +61 -6
- package/docs/02-concepts/traceability.md +57 -0
- package/docs/03-guides/architect.md +63 -0
- package/docs/04-reference/commands.md +148 -134
- package/docs/04-reference/model-selection.md +32 -19
- 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/21-validate-traces.md +2 -1
- package/docs/explain/27-learn.md +5 -3
- package/docs/explain/28-sync.md +25 -0
- package/docs/explain/README.md +136 -135
- package/package.json +5 -9
- package/commands/debug.md +0 -917
- package/commands/debug.tmpl +0 -257
- package/commands/define-product.md +0 -862
- package/commands/define-product.tmpl +0 -225
- package/commands/dev-gen-test.md +0 -1124
- package/commands/dev-gen-test.tmpl +0 -490
- package/commands/dev-run-test.md +0 -859
- package/commands/dev-run-test.tmpl +0 -225
- package/commands/dev-smoke-test.md +0 -798
- package/commands/dev-smoke-test.tmpl +0 -217
- package/commands/extend-prd.md +0 -907
- package/commands/extend-prd.tmpl +0 -270
- package/commands/fix-bug.md +0 -910
- package/commands/fix-bug.tmpl +0 -197
- package/commands/generate-architecture.md +0 -775
- package/commands/generate-architecture.tmpl +0 -194
- package/commands/generate-bdd.md +0 -1347
- package/commands/generate-bdd.tmpl +0 -590
- package/commands/generate-code.md +0 -1283
- package/commands/generate-code.tmpl +0 -649
- package/commands/generate-design-spec.md +0 -1161
- package/commands/generate-design-spec.tmpl +0 -524
- package/commands/generate-prd.md +0 -1143
- package/commands/generate-prd.tmpl +0 -223
- package/commands/generate-spec-manifest.md +0 -745
- package/commands/generate-spec-manifest.tmpl +0 -164
- package/commands/generate-tech-docs.md +0 -1344
- package/commands/generate-tech-docs.tmpl +0 -273
- package/commands/learn.md +0 -723
- package/commands/learn.tmpl +0 -63
- package/commands/map-testids.md +0 -662
- package/commands/map-testids.tmpl +0 -81
- package/commands/propose-scenario.md +0 -783
- package/commands/propose-scenario.tmpl +0 -202
- package/commands/qc-analyze.md +0 -693
- package/commands/qc-analyze.tmpl +0 -112
- package/commands/qc-design-test.md +0 -650
- package/commands/qc-design-test.tmpl +0 -69
- package/commands/qc-plan.md +0 -630
- package/commands/qc-plan.tmpl +0 -49
- package/commands/qc-report.md +0 -641
- package/commands/qc-report.tmpl +0 -60
- package/commands/qc-review.md +0 -634
- package/commands/qc-review.tmpl +0 -53
- package/commands/qc-run-test.md +0 -750
- package/commands/qc-run-test.tmpl +0 -116
- package/commands/refine-prd.md +0 -1074
- package/commands/refine-prd.tmpl +0 -278
- package/commands/report-bug.md +0 -729
- package/commands/report-bug.tmpl +0 -148
- package/commands/review-code.md +0 -803
- package/commands/review-code.tmpl +0 -143
- package/commands/review-context.md +0 -1323
- package/commands/review-context.tmpl +0 -527
- package/commands/review-tech-docs.md +0 -982
- package/commands/review-tech-docs.tmpl +0 -401
- package/commands/setup-ai-first.md +0 -574
- package/commands/setup-ai-first.tmpl +0 -378
- package/commands/sync.md +0 -486
- package/commands/sync.tmpl +0 -384
- package/commands/update-framework.md +0 -290
- package/commands/update-framework.tmpl +0 -188
- package/commands/validate-traces.md +0 -1435
- package/commands/validate-traces.tmpl +0 -854
- package/hooks/data-guard.js +0 -141
- package/hooks/settings.json +0 -18
- 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 -73
- package/scripts/init.sh +0 -49
- package/scripts/upgrade.sh +0 -94
- 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 -79
- package/steps/context-loader.md +0 -385
- package/steps/gate.md +0 -94
- package/steps/report-footer.md +0 -102
- 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 -47
- package/templates/architecture.template.md +0 -394
- package/templates/design-spec.template.md +0 -217
- package/templates/feature.template +0 -123
- 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
|
@@ -91,6 +91,69 @@ flowchart LR
|
|
|
91
91
|
|
|
92
92
|
---
|
|
93
93
|
|
|
94
|
+
## Cắm vào CI — cái gì chặn được bằng máy
|
|
95
|
+
|
|
96
|
+
Đây là việc của SA/Lead, không phải của dev từng người: **kỷ luật nào không chặn thì sau
|
|
97
|
+
sprint thứ ba không ai làm.** Framework có hai lệnh CLI trả exit code — cắm được vào pipeline:
|
|
98
|
+
|
|
99
|
+
| Lệnh | Chặn gì | Đặt ở đâu |
|
|
100
|
+
|---|---|---|
|
|
101
|
+
| `--lint-trace` | **Cấu trúc sổ**: header lệch · row sai số ô · enum sai · `sc_id` trùng · marker conflict git · `.jsonl` hỏng. Cộng hai điều kiện **cấu hình** ở mức ⚠️: thiếu luật merge · sổ bị gitignore | pre-push **và** CI |
|
|
102
|
+
| `--gate-trace` | **Cấu hình** (nâng hai ⚠️ trên thành chặn) + **cờ 🔴**: `ORPHANED` · `TRACE_ORPHAN` · `SEAM_UNWIRED` · `STUB_UNRESOLVED` | CI (cần report tươi) |
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
npx @educa-corp/sdd-framework --lint-trace # exit 1 nếu sổ hỏng
|
|
106
|
+
npx @educa-corp/sdd-framework --gate-trace # exit 1 nếu có cờ 🔴
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Mẫu sẵn dùng: `.agent/templates/ci/trace-gate.yml` (GitHub Actions) · `.agent/templates/hooks/pre-push`.
|
|
110
|
+
**Copy ra khỏi `.agent/`** trước khi dùng — mọi thứ trong đó bị ghi đè mỗi lần `/update-framework`.
|
|
111
|
+
|
|
112
|
+
### Bốn tầng của `--gate-trace`, và vì sao thứ tự đó
|
|
113
|
+
|
|
114
|
+
0. **Sổ được bảo vệ?** — sổ có **nằm trong git**? git có **biết cách gộp** sổ? Kiểm cấu trúc của một quyển sổ sắp mất thì vô nghĩa. Hai điều kiện này `lint-trace` đã phát hiện dưới dạng ⚠️; gate **nâng** chúng thành lỗi chặn — *pre-push nhắc, CI chặn*.
|
|
115
|
+
1. **Sổ đúng hình dạng?** (gọi `--lint-trace`) — phán trạng thái trên sổ lệch cột là phán trên dữ liệu rác.
|
|
116
|
+
2. **Report còn tươi?** — đối chiếu `trace-report.json` với chính sổ TSV nó khai là đang mô tả.
|
|
117
|
+
Không có tầng này thì cổng là **sân khấu**: chạy `/validate-traces` một lần, commit report,
|
|
118
|
+
rồi sửa gì cũng được — CI đọc report cũ và cho qua mãi.
|
|
119
|
+
3. **Có cờ 🔴?** — đếm counter, nêu tên thủ phạm kèm câu `fix` của chính framework.
|
|
120
|
+
|
|
121
|
+
### Giới hạn — nói rõ với team, đừng để họ tin quá
|
|
122
|
+
|
|
123
|
+
> `--gate-trace` chứng minh **"report khớp SỔ"**.
|
|
124
|
+
> Chỉ `/validate-traces` chứng minh được **"sổ khớp CODE"** (nó phải quét tag trong source,
|
|
125
|
+
> đọc `.feature`, so version — việc của LLM).
|
|
126
|
+
|
|
127
|
+
Nên cổng bắt được ca phổ biến *"quên chạy lại `/validate-traces`"*, nhưng **không** bắt được
|
|
128
|
+
*"sửa code mà không đụng sổ"*. Cổng in ra đúng giới hạn này mỗi lần chạy, kể cả khi xanh.
|
|
129
|
+
|
|
130
|
+
Đường bịt: job **`require-fresh-audit`** trong template — **bật mặc định**. Nó hỏi
|
|
131
|
+
*"PR có chạm dòng nào mang một trong 7 tag mà report đang khẳng định không?"*
|
|
132
|
+
(`@trace.implements` · `verifies` · `seam_port` · `seam_pending` · `stub` · `stub_owner` ·
|
|
133
|
+
`stub_for` — nguồn của đúng 4 cờ 🔴). Có mà không kèm `trace-report.json` mới → **chặn**.
|
|
134
|
+
|
|
135
|
+
| PR làm gì | Kết quả |
|
|
136
|
+
|---|:---:|
|
|
137
|
+
| Sửa log trong Controller · thêm field vào DTO · đổi query Repository | ✅ cho qua |
|
|
138
|
+
| Thêm/xoá method mang `@trace.implements` · lấp một `@trace.stub` | 🔴 chặn |
|
|
139
|
+
|
|
140
|
+
> **Không dùng `^src/`** — framework có luật *boundary-only tagging*: Entity/Repository/DTO/
|
|
141
|
+
> Interface **không** mang tag, nên `^src/` chặn cả PR chỉ thêm một field vào DTO. Báo oan ⇒
|
|
142
|
+
> cổng bị tắt ⇒ mất luôn phần thật sự cần chặn. `self-check` **R10** fail build nếu file CI
|
|
143
|
+
> thiếu một tag — thiếu thì `grep` không khớp gì và job **luôn xanh**.
|
|
144
|
+
>
|
|
145
|
+
> **Giới hạn:** đổi tên class không chạm dòng tag ⇒ bỏ lọt. Ca đó ít gặp và **không im lặng**
|
|
146
|
+
> (`/validate-traces` lần sau báo ngay). Biến thể chặt hơn ghi trong comment của template.
|
|
147
|
+
|
|
148
|
+
### Cờ 🟠 cố ý KHÔNG chặn
|
|
149
|
+
|
|
150
|
+
`PRD_DRIFT` · `BDD_DRIFT` · `TECHDOC_DRIFT` · `DESIGNSPEC_DRIFT` là **nợ** — "code chưa theo
|
|
151
|
+
kịp spec" — không phải code hỏng. Chặn PR vì nợ làm cổng đỏ liên tục, và cổng đỏ liên tục sẽ
|
|
152
|
+
bị tắt, mất luôn cả phần 🔴. `bin/self-check.js` **R9** fail build nếu ai nhét một cờ 🟠 vào
|
|
153
|
+
danh sách chặn.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
94
157
|
## Lệnh của bạn (Your commands)
|
|
95
158
|
|
|
96
159
|
`/generate-architecture` · `/generate-tech-docs` · `/review-tech-docs` · `/refine-prd` (SA lens) · `/review-code` · `/generate-spec-manifest`
|
|
@@ -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)
|
|
@@ -2,33 +2,46 @@
|
|
|
2
2
|
|
|
3
3
|
# Reference · Model Selection
|
|
4
4
|
|
|
5
|
-
> Framework **không ràng buộc model cứng** —
|
|
5
|
+
> Framework **không ràng buộc model cứng** — nó **khai báo** model đang chạy ở report cuối. Giả định LLM đủ năng lực reasoning.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
## Model
|
|
9
|
+
## Model được KHAI BÁO, không bị hỏi *(từ v0.5.1)*
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Gate Bước 0-B ghi nhận model agent đang chạy; `report-footer` in ra ở cuối mỗi lệnh:
|
|
12
12
|
|
|
13
13
|
```
|
|
14
|
-
|
|
15
|
-
Recommended : claude-opus (model Opus mới nhất)
|
|
16
|
-
Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
|
|
17
|
-
suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
|
|
18
|
-
|
|
19
|
-
Đang chạy claude-opus?
|
|
20
|
-
Y — đúng → tiếp tục
|
|
21
|
-
S — bỏ qua (chấp nhận rủi ro chất lượng thấp hơn)
|
|
22
|
-
N — dừng, đổi model rồi chạy lại
|
|
14
|
+
Model: claude-opus-5
|
|
23
15
|
```
|
|
24
16
|
|
|
25
|
-
|
|
26
|
-
|---------|---------|
|
|
27
|
-
| **Y** | Tiếp tục |
|
|
28
|
-
| **S** | Tiếp tục, thêm ⚠️ vào report cuối (người dùng chấp nhận rủi ro) |
|
|
29
|
-
| **N** / khác | **Dừng** — đổi sang Opus rồi chạy lại |
|
|
17
|
+
Nếu agent biết mình không phải một model Opus:
|
|
30
18
|
|
|
31
|
-
|
|
19
|
+
```
|
|
20
|
+
Model: claude-haiku-4-5 ⚠️ lệnh này khuyến nghị Opus — model nhỏ hơn dễ bỏ sót
|
|
21
|
+
edge case, phân tích spec thiếu sót, vi phạm kiến trúc.
|
|
22
|
+
Cân nhắc chạy lại với /model → Opus trước khi dùng kết quả.
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Không có prompt nào. Không chờ. Không dừng.**
|
|
26
|
+
|
|
27
|
+
### Vì sao bỏ prompt cũ (GAPS-v3 G41)
|
|
28
|
+
|
|
29
|
+
Bản trước hiện một khối `⚙️ MODEL CHECK` rồi chờ `Y/S/N` ở **mọi** lệnh. Ba vấn đề:
|
|
30
|
+
|
|
31
|
+
| | |
|
|
32
|
+
|---|---|
|
|
33
|
+
| Hỏi sai người | Nó hỏi **người dùng** thứ mà **agent đã biết chính xác** |
|
|
34
|
+
| Không kiểm chứng được | Gõ `Y` xong vẫn đang chạy Haiku thì không gì phát hiện |
|
|
35
|
+
| Không chặn được ai | **Cả `Y` lẫn `S` đều đi tiếp** — cách duy nhất để nó dừng là tự nguyện gõ `N` |
|
|
36
|
+
|
|
37
|
+
Cái giá: một lần chặn ở mọi lệnh. Một feature đi hết pipeline dùng **20 lệnh** — 20 lần bấm
|
|
38
|
+
cho một tín hiệu tự-khai không kiểm chứng được. Và chính cái giá đó **làm mòn CHECKPOINT**,
|
|
39
|
+
cổng có giá trị thật ngay sau nó: bấm `Y` 40 lần một feature thì `Y` thành phản xạ.
|
|
40
|
+
|
|
41
|
+
Khai báo ở footer **mạnh hơn** hỏi: đúng nguồn (agent tự khai), và nằm **cạnh kết quả** để
|
|
42
|
+
người đọc cân nhắc có nên tin, thay vì nằm trước khi có kết quả để bấm cho xong.
|
|
43
|
+
|
|
44
|
+
> Sub-agent (`_agent_mode`) bỏ qua bước này — orchestrator đã ghi nhận rồi.
|
|
32
45
|
|
|
33
46
|
---
|
|
34
47
|
|
|
@@ -56,7 +69,7 @@ Model Claude mới nhất tại thời điểm viết:
|
|
|
56
69
|
|
|
57
70
|
| Model | ID |
|
|
58
71
|
|-------|-----|
|
|
59
|
-
| Opus
|
|
72
|
+
| Opus 5 | `claude-opus-5` |
|
|
60
73
|
| Sonnet 5 | `claude-sonnet-5` |
|
|
61
74
|
| Haiku 4.5 | `claude-haiku-4-5-20251001` |
|
|
62
75
|
| Fable 5 | `claude-fable-5` |
|
|
@@ -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
|
|