@edupia-tutor/spec-driven-docs 0.14.0 → 0.14.2
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/index.js +12 -1
- package/commands/debug.md +436 -436
- package/commands/debug.tmpl +111 -111
- package/commands/define-product.md +350 -345
- package/commands/define-product.tmpl +69 -64
- package/commands/dev-gen-test.md +365 -365
- package/commands/dev-gen-test.tmpl +63 -63
- package/commands/dev-run-test.md +376 -376
- package/commands/dev-run-test.tmpl +74 -74
- package/commands/dev-smoke-test.md +341 -341
- package/commands/dev-smoke-test.tmpl +60 -60
- package/commands/fix-bug.md +403 -403
- package/commands/fix-bug.tmpl +78 -78
- package/commands/generate-bdd.md +513 -513
- package/commands/generate-bdd.tmpl +211 -211
- package/commands/generate-code.md +481 -483
- package/commands/generate-code.tmpl +179 -181
- package/commands/generate-design-spec.md +497 -497
- package/commands/generate-design-spec.tmpl +220 -220
- package/commands/generate-prd.md +452 -400
- package/commands/generate-prd.tmpl +50 -200
- package/commands/generate-spec-manifest.md +340 -340
- package/commands/generate-spec-manifest.tmpl +59 -59
- package/commands/generate-tech-docs.md +365 -365
- package/commands/generate-tech-docs.tmpl +84 -84
- package/commands/learn.md +347 -347
- package/commands/learn.tmpl +22 -22
- package/commands/map-testids.md +322 -322
- package/commands/map-testids.tmpl +41 -41
- package/commands/propose-scenario.md +335 -335
- package/commands/propose-scenario.tmpl +54 -54
- package/commands/qc-analyze.md +323 -324
- package/commands/qc-analyze.tmpl +42 -43
- package/commands/qc-design-test.md +304 -304
- package/commands/qc-design-test.tmpl +23 -23
- package/commands/qc-plan.md +297 -297
- package/commands/qc-plan.tmpl +16 -16
- package/commands/qc-report.md +302 -302
- package/commands/qc-report.tmpl +21 -21
- package/commands/qc-review.md +298 -298
- package/commands/qc-review.tmpl +17 -17
- package/commands/qc-run-test.md +337 -337
- package/commands/qc-run-test.tmpl +35 -35
- package/commands/refine-prd.md +428 -430
- package/commands/refine-prd.tmpl +62 -62
- package/commands/report-bug.md +351 -351
- package/commands/report-bug.tmpl +70 -70
- package/commands/review-code.md +364 -364
- package/commands/review-code.tmpl +39 -39
- package/commands/review-context.md +578 -580
- package/commands/review-context.tmpl +212 -212
- package/commands/review-tech-docs.md +427 -427
- package/commands/review-tech-docs.tmpl +146 -146
- package/commands/setup-ai-first.md +239 -239
- package/commands/setup-ai-first.tmpl +133 -133
- package/commands/sync.md +145 -145
- package/commands/sync.tmpl +93 -93
- package/commands/update-framework.md +88 -88
- package/commands/update-framework.tmpl +36 -36
- package/commands/validate-traces.md +381 -381
- package/commands/validate-traces.tmpl +100 -100
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +436 -436
- package/core/commands/define-product.md +350 -345
- package/core/commands/dev-gen-test.md +365 -365
- package/core/commands/dev-run-test.md +376 -376
- package/core/commands/dev-smoke-test.md +341 -341
- package/core/commands/fix-bug.md +403 -403
- package/core/commands/generate-bdd.md +513 -513
- package/core/commands/generate-code.md +481 -483
- package/core/commands/generate-design-spec.md +497 -497
- package/core/commands/generate-prd.md +452 -400
- package/core/commands/generate-spec-manifest.md +340 -340
- package/core/commands/generate-tech-docs.md +365 -365
- package/core/commands/learn.md +347 -347
- package/core/commands/map-testids.md +322 -322
- package/core/commands/propose-scenario.md +335 -335
- package/core/commands/qc-analyze.md +323 -324
- package/core/commands/qc-design-test.md +304 -304
- package/core/commands/qc-plan.md +297 -297
- package/core/commands/qc-report.md +302 -302
- package/core/commands/qc-review.md +298 -298
- package/core/commands/qc-run-test.md +337 -337
- package/core/commands/refine-prd.md +428 -430
- package/core/commands/report-bug.md +351 -351
- package/core/commands/review-code.md +364 -364
- package/core/commands/review-context.md +578 -580
- package/core/commands/review-tech-docs.md +427 -427
- package/core/commands/setup-ai-first.md +239 -239
- package/core/commands/sync.md +145 -145
- package/core/commands/update-framework.md +88 -88
- package/core/commands/validate-traces.md +381 -381
- package/core/skills/code/SKILL.md +389 -389
- package/core/skills/debug/SKILL.md +391 -391
- package/core/skills/design-spec/SKILL.md +318 -318
- package/core/skills/discovery/SKILL.md +7 -547
- package/core/skills/prd/SKILL.md +298 -394
- package/core/skills/setup-ai-first/SKILL.md +80 -80
- package/core/skills/spec/SKILL.md +178 -178
- package/core/skills/test/SKILL.md +604 -604
- package/core/steps/capture-lesson.md +44 -44
- package/core/steps/context-loader.md +175 -175
- package/core/steps/gate.md +54 -54
- package/core/steps/report-footer.md +52 -52
- package/core/steps/review-fanout.md +85 -87
- package/core/steps/spawn-agent.md +45 -45
- package/core/steps/trace-mirror.md +21 -21
- package/core/templates/architecture.template.md +37 -37
- package/core/templates/design-spec.template.md +77 -77
- package/core/templates/platform-guide.template.md +47 -47
- package/core/templates/prd.template.md +107 -232
- package/core/templates/product-definition.template.md +101 -88
- package/core/templates/project-context.yaml +2 -2
- package/docs/01-getting-started/core-concepts.md +1 -1
- package/docs/01-getting-started/quickstart.md +7 -7
- package/docs/02-guides/developer/bdd-and-trace.md +1 -1
- package/docs/02-guides/developer/scenarios.md +5 -5
- package/docs/02-guides/product-owner/handoff-checklist.md +1 -1
- package/docs/02-guides/product-owner/scenarios.md +23 -23
- package/docs/02-guides/tester/bug-reporting.md +2 -2
- package/docs/02-guides/tester/reading-specs.md +2 -2
- package/docs/02-guides/tester/scenarios.md +1 -1
- package/docs/02-guides/tester/spec-manifest.md +3 -3
- package/docs/02-guides/tester/workflow.md +1 -1
- package/docs/03-concepts/architecture.md +3 -3
- package/docs/03-concepts/pipeline.md +3 -3
- package/docs/04-operations/publishing.md +20 -3
- package/docs/04-operations/sync-and-update.md +5 -5
- package/docs/05-reference/command-cheatsheet.md +2 -2
- package/docs/05-reference/commands.md +8 -8
- package/package.json +1 -1
- package/scripts/migrate-specs.js +5 -3
- package/scripts/rename-prd-files.js +174 -0
- package/skills/code/SKILL.md +389 -389
- package/skills/code/SKILL.tmpl +56 -56
- package/skills/debug/SKILL.md +391 -391
- package/skills/debug/SKILL.tmpl +60 -60
- package/skills/design-spec/SKILL.md +318 -318
- package/skills/design-spec/SKILL.tmpl +37 -37
- package/skills/discovery/SKILL.md +7 -547
- package/skills/discovery/SKILL.tmpl +7 -140
- package/skills/prd/SKILL.md +298 -394
- package/skills/prd/SKILL.tmpl +40 -151
- package/skills/setup-ai-first/SKILL.md +80 -80
- package/skills/setup-ai-first/SKILL.tmpl +28 -28
- package/skills/spec/SKILL.md +178 -178
- package/skills/spec/SKILL.tmpl +20 -20
- package/skills/test/SKILL.md +604 -604
- package/skills/test/SKILL.tmpl +44 -44
- package/steps/capture-lesson.md +44 -44
- package/steps/context-loader.md +175 -175
- package/steps/gate.md +54 -54
- package/steps/report-footer.md +52 -52
- package/steps/review-fanout.md +85 -87
- package/steps/spawn-agent.md +45 -45
- package/steps/trace-mirror.md +21 -21
- package/templates/architecture.template.md +37 -37
- package/templates/design-spec.template.md +77 -77
- package/templates/platform-guide.template.md +47 -47
- package/templates/prd.template.md +107 -232
- package/templates/product-definition.template.md +101 -88
- package/templates/project-context.yaml +2 -2
|
@@ -1,139 +1,139 @@
|
|
|
1
|
-
# /review-context — Review PRD
|
|
1
|
+
# /review-context — Review PRD hoặc BDD về Chất lượng & Tính nhất quán
|
|
2
2
|
|
|
3
|
-
**READ-ONLY
|
|
4
|
-
**
|
|
3
|
+
**Chế độ phân tích READ-ONLY — ghi file findings, KHÔNG sửa target.**
|
|
4
|
+
**Dùng `--resume` để áp dụng các finding được chấp nhận.**
|
|
5
5
|
|
|
6
6
|
## Gate
|
|
7
7
|
{{include:steps/gate.md}}
|
|
8
8
|
|
|
9
|
-
*
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
*Lưu ý: Với lệnh này, target ở Bước 1 là một file PRD `.md` hoặc file BDD `.feature`.
|
|
10
|
+
Nếu path là file PRD (`{TICKET-ID}-{prd-slug}.md` — file `.md` ở gốc feature folder `{paths.specs_dir}/{domain}/{prd-slug}/`) → PRD Review Mode.
|
|
11
|
+
Nếu path kết thúc bằng `.feature` → BDD Review Mode.
|
|
12
|
+
Nếu `$ARGUMENTS` chứa `--resume` → bỏ qua sang Resume Mode bên dưới.
|
|
13
|
+
Nếu `$ARGUMENTS` chứa `--fix` → bỏ qua sang Fix Mode bên dưới (áp dụng ngay mọi finding auto-fixable).*
|
|
14
14
|
|
|
15
15
|
## Context
|
|
16
16
|
{{include:steps/context-loader.md}}
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
##
|
|
20
|
+
## Phát hiện Review Mode
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
- `.feature`
|
|
24
|
-
-
|
|
25
|
-
-
|
|
22
|
+
Sau khi phân giải target file:
|
|
23
|
+
- File `.feature` → **BDD Review Mode** (nhảy tới section BDD)
|
|
24
|
+
- File `.md` ở gốc feature folder `{paths.specs_dir}/*/*/` (không phải dưới `bdd/`·`tech-docs/`·`design-spec/`) → **PRD Review Mode** (tiếp tục bên dưới)
|
|
25
|
+
- Không xác định → hỏi: "Đây là file PRD hay file BDD feature? (prd/bdd)"
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
- `--fix`
|
|
29
|
-
- `--resume`
|
|
27
|
+
Đồng thời kiểm tra flag:
|
|
28
|
+
- Có `--fix` → sau khi chạy hết các check, áp dụng ngay các finding `auto_fixable: true` (bỏ qua Review Board)
|
|
29
|
+
- Có `--resume` → bỏ qua phân tích hoàn toàn, sang Resume Mode
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
Suy ra tên file findings output:
|
|
32
32
|
- PRD: `{paths.refinement_dir}/{prd-slug}-review-context-findings.yaml`
|
|
33
33
|
- BDD: `{paths.refinement_dir}/{uc-id}-review-bdd-findings.yaml`
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
37
|
-
## Review
|
|
37
|
+
## Quy trình Review
|
|
38
38
|
{{include:steps/review-fanout.md}}
|
|
39
39
|
|
|
40
|
-
**
|
|
41
|
-
- **DIMENSIONS** =
|
|
42
|
-
- **
|
|
43
|
-
-
|
|
40
|
+
**Các check dưới đây map vào quy trình như sau:**
|
|
41
|
+
- **DIMENSIONS** = các nhóm check theo mode phát hiện được — PRD: `P1, P2, P4, P5`; BDD: `B1, B2, B3, B4, B5, B6`. Fan out một sub-agent cho mỗi nhóm check, mỗi cái quét toàn bộ target file chỉ cho nhóm đó.
|
|
42
|
+
- **Check do orchestrator chạy (không fan out):** `P0` (umbrella routing) và `P3` (xung đột cross-PRD) cần config / context của PRD khác — orchestrator tự chạy chúng **trước** fan-out và thêm kết quả vào `ALL_FINDINGS`.
|
|
43
|
+
- Vòng lặp completeness-critic (Phase 2) đảm bảo file findings đầy đủ trong một lần chạy — chạy lại `/review-context` sẽ lòi ra **0 finding mới**. Map mỗi dimension vào field `check_id` của schema dưới đây.
|
|
44
44
|
|
|
45
45
|
---
|
|
46
46
|
|
|
47
47
|
## PRD Review Mode
|
|
48
48
|
|
|
49
|
-
### P0 — Umbrella Routing Check (
|
|
49
|
+
### P0 — Umbrella Routing Check (chỉ chế độ umbrella)
|
|
50
50
|
|
|
51
|
-
*
|
|
51
|
+
*Bỏ qua hoàn toàn check này nếu `setup.mode` không phải `"umbrella"` (tức không có section `services` trong project-context.yaml).*
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
Khi `setup.mode = umbrella`, PRD phải có metadata routing đúng để context-loader Bước 1.5 có thể đưa output sinh ra tới đúng service submodule. Chạy các check này **trước P1–P5**:
|
|
54
54
|
|
|
55
|
-
**P0.1 — `@trace.domain`
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
- `finding`: "`@trace.domain`
|
|
59
|
-
- `suggestion`: "
|
|
60
|
-
- `auto_fixable: false` — PO
|
|
55
|
+
**P0.1 — `@trace.domain` có mặt**
|
|
56
|
+
- Đọc block frontmatter của PRD (các dòng bắt đầu bằng `@trace.` ở đầu file)
|
|
57
|
+
- Nếu `@trace.domain` **vắng mặt** → finding **critical**:
|
|
58
|
+
- `finding`: "`@trace.domain` đang thiếu. Umbrella routing của team dev phụ thuộc field này để đưa BDD và code output tới đúng service submodule."
|
|
59
|
+
- `suggestion`: "Thêm `@trace.domain: {domain}` vào frontmatter của PRD. Dùng một trong các domain key được định nghĩa trong section services của `project-context.yaml` của umbrella."
|
|
60
|
+
- `auto_fixable: false` — PO phải confirm tên domain đúng
|
|
61
61
|
|
|
62
|
-
**P0.2 — `@trace.domain`
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
- `finding`: "`@trace.domain: {value}`
|
|
66
|
-
- `suggestion`: "
|
|
62
|
+
**P0.2 — `@trace.domain` khớp một service key**
|
|
63
|
+
- Nếu `@trace.domain` có mặt, kiểm tra giá trị của nó có khớp key nào trong section `services` của project-context.yaml không
|
|
64
|
+
- Nếu **không khớp** → finding **critical**:
|
|
65
|
+
- `finding`: "`@trace.domain: {value}` không khớp key nào trong config `services` của umbrella. Routing sẽ fallback về path mặc định và BDD có thể được sinh sai chỗ."
|
|
66
|
+
- `suggestion`: "Hoặc cập nhật `@trace.domain` cho khớp một service key có sẵn ({list known keys}), hoặc thêm entry mới vào `services` trong project-context.yaml cho domain `{value}`."
|
|
67
67
|
- `auto_fixable: false`
|
|
68
|
-
-
|
|
69
|
-
- `finding`: "
|
|
70
|
-
- `suggestion`: "
|
|
68
|
+
- Nếu section `services` chưa được cấu hình (rỗng/placeholder) → finding **major**:
|
|
69
|
+
- `finding`: "Section `services` của umbrella chưa được cấu hình. Không thể kiểm chứng domain routing."
|
|
70
|
+
- `suggestion`: "Cập nhật section services trong `.agent/project-context.yaml` với mapping domain-to-submodule trước khi sinh BDD."
|
|
71
71
|
- `auto_fixable: false`
|
|
72
72
|
|
|
73
|
-
**P0.3 — `@trace.status
|
|
74
|
-
-
|
|
75
|
-
-
|
|
76
|
-
- `finding`: "PRD status
|
|
77
|
-
- `suggestion`: "PO/SA
|
|
73
|
+
**P0.3 — Check `@trace.status`**
|
|
74
|
+
- Nếu `@trace.status` vắng mặt → **minor**, `auto_fixable: true` (thêm `@trace.status: draft`)
|
|
75
|
+
- Nếu `@trace.status: draft` → **major**, `auto_fixable: false`:
|
|
76
|
+
- `finding`: "PRD status là `draft`. Team dev không nên sinh BDD từ một PRD chưa được duyệt."
|
|
77
|
+
- `suggestion`: "PO/SA nên review và cập nhật status thành `approved` trước khi team dev tiếp tục."
|
|
78
78
|
|
|
79
|
-
> **P0
|
|
79
|
+
> **P0 là một gate check:** Nếu P0.1 hoặc P0.2 cho finding critical, hiển thị cảnh báo trước khi tiếp tục:
|
|
80
80
|
> ```
|
|
81
|
-
> ⚠️ ROUTING WARNING: @trace.domain
|
|
82
|
-
> BDD/code
|
|
83
|
-
>
|
|
81
|
+
> ⚠️ ROUTING WARNING: phát hiện vấn đề @trace.domain.
|
|
82
|
+
> BDD/code sinh từ PRD này có thể rơi vào sai service submodule.
|
|
83
|
+
> Giải quyết các finding P0 trước khi chạy /generate-bdd.
|
|
84
84
|
> ```
|
|
85
|
-
>
|
|
85
|
+
> Rồi tiếp tục với P1–P5 (đừng abort — PO có thể đang review PRD giai đoạn sớm).
|
|
86
86
|
|
|
87
87
|
### P1 — Terminology Check (Business Dictionary)
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
Nạp `{paths.business_dictionary}`.
|
|
90
|
+
Quét toàn bộ PRD tìm vấn đề thuật ngữ:
|
|
91
91
|
|
|
92
|
-
1. **Banned terms** —
|
|
93
|
-
→ Severity: **critical**. AI
|
|
92
|
+
1. **Banned terms** — mọi lần xuất hiện của một term trong §Banned Terms:
|
|
93
|
+
→ Severity: **critical**. AI có thể auto-fix khi `--resume`.
|
|
94
94
|
|
|
95
|
-
2. **
|
|
96
|
-
→ Severity: **major**.
|
|
95
|
+
2. **Dùng không nhất quán** — cùng một khái niệm được đặt tên khác nhau giữa các section:
|
|
96
|
+
→ Severity: **major**. Gắn cờ cả hai chỗ. Người quyết định dạng chuẩn trong note Review Board.
|
|
97
97
|
|
|
98
|
-
3. **
|
|
99
|
-
→ Severity: **minor**.
|
|
98
|
+
3. **Business term chưa liệt kê** — các term quan trọng vắng trong dictionary:
|
|
99
|
+
→ Severity: **minor**. Đề xuất thêm vào `business-dictionary.md`.
|
|
100
100
|
|
|
101
101
|
### P2 — Ambiguity Check
|
|
102
102
|
|
|
103
|
-
|
|
103
|
+
Quét mỗi AC và BR tìm:
|
|
104
104
|
|
|
105
|
-
|
|
|
105
|
+
| Tín hiệu | Ví dụ | Severity |
|
|
106
106
|
|--------|---------|----------|
|
|
107
|
-
|
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
|
|
|
111
|
-
|
|
|
107
|
+
| Định lượng mơ hồ | "nhanh", "lớn", "hợp lý", "mau" | Critical |
|
|
108
|
+
| Thiếu actor | "hệ thống nên" mà không nêu trigger | Major |
|
|
109
|
+
| Tham chiếu chưa định nghĩa | "{SomeThing}" được dùng nhưng chưa định nghĩa trong PRD này | Major |
|
|
110
|
+
| Thiếu luồng âm | AC chỉ mô tả happy path nhưng BR có điều kiện lỗi | Minor |
|
|
111
|
+
| Câu bị động giấu actor | "Invoice is created" — ai tạo? | Minor |
|
|
112
112
|
|
|
113
|
-
→ AI
|
|
113
|
+
→ AI không thể auto-fix finding P2. Người phải viết bản fix trong note "Modify" của Review Board.
|
|
114
114
|
|
|
115
115
|
### P3 — Domain Conflict Check
|
|
116
116
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
117
|
+
Liệt kê tất cả PRD khác trong `{paths.specs_dir}/{domain}/*/*.md` (file `.md` ở gốc mỗi feature folder = PRD).
|
|
118
|
+
Với mỗi PRD, kiểm tra xem PRD này có mâu thuẫn với một BR đã định nghĩa không (cùng trigger, khác outcome)
|
|
119
|
+
hoặc định nghĩa lại field/status transition của một entity khác đi.
|
|
120
120
|
|
|
121
|
-
→ Severity: **critical**.
|
|
121
|
+
→ Severity: **critical**. Người quyết định PRD nào đúng. Bắt buộc có note.
|
|
122
122
|
|
|
123
123
|
### P4 — Structural Completeness
|
|
124
124
|
|
|
125
|
-
- [ ] Metadata
|
|
126
|
-
- [ ]
|
|
127
|
-
- [ ]
|
|
128
|
-
- [ ] `## Changelog`
|
|
129
|
-
- [ ]
|
|
125
|
+
- [ ] Block Metadata: Version, Author, Date, Status
|
|
126
|
+
- [ ] Ít nhất 1 UC với heading `#### {TICKET-ID}-UC{N}:`
|
|
127
|
+
- [ ] Mỗi UC có: Description, Actors, Preconditions, Acceptance Criteria, Business Rules
|
|
128
|
+
- [ ] Có section `## Changelog`
|
|
129
|
+
- [ ] Không còn giá trị `{{PLACEHOLDER}}` chưa điền
|
|
130
130
|
|
|
131
|
-
→
|
|
131
|
+
→ Section thiếu: **major**. AI có thể thêm skeleton khi `--resume` nếu được chấp nhận.
|
|
132
132
|
|
|
133
|
-
### P5 — Custom Criteria (
|
|
133
|
+
### P5 — Custom Criteria (tuỳ chọn)
|
|
134
134
|
|
|
135
|
-
|
|
136
|
-
|
|
135
|
+
Nếu `$ARGUMENTS` chứa tiêu chí bổ sung sau path file, đánh giá chúng và tạo
|
|
136
|
+
finding với `check_id: "P5"` và severity phù hợp.
|
|
137
137
|
|
|
138
138
|
---
|
|
139
139
|
|
|
@@ -141,8 +141,8 @@ findings with `check_id: "P5"` and severity as appropriate.
|
|
|
141
141
|
|
|
142
142
|
### B1 — PRD Coverage Check
|
|
143
143
|
|
|
144
|
-
|
|
145
|
-
Map
|
|
144
|
+
Nạp PRD được tham chiếu bởi `# @trace.prd:` trong header file feature.
|
|
145
|
+
Map mọi AC và mọi BR (gồm cả sub-bullet) sang scenario:
|
|
146
146
|
|
|
147
147
|
```
|
|
148
148
|
AC1 ({short text}) → SC1, SC2 ✅
|
|
@@ -151,64 +151,64 @@ BR1 ({short text}) → SC1 ✅
|
|
|
151
151
|
BR2 ({short text}) → MISSING ❌
|
|
152
152
|
```
|
|
153
153
|
|
|
154
|
-
→
|
|
155
|
-
|
|
154
|
+
→ Mỗi AC/BR thiếu coverage: finding **critical**.
|
|
155
|
+
Nếu được chấp nhận trong Review Board, `--resume` sinh scenario còn thiếu.
|
|
156
156
|
|
|
157
157
|
### B2 — Terminology & Entity Check
|
|
158
158
|
|
|
159
|
-
|
|
159
|
+
Dùng `{paths.business_dictionary}` và `{paths.core_entities}`:
|
|
160
160
|
|
|
161
|
-
1. **Banned terms
|
|
162
|
-
2. **
|
|
163
|
-
3. **
|
|
164
|
-
4. **
|
|
161
|
+
1. **Banned terms trong steps** → **critical**, auto-fixable khi `--resume`
|
|
162
|
+
2. **Tên entity không chuẩn** → **major**, auto-fixable
|
|
163
|
+
3. **Tên field không chuẩn trong data table** → **major**, auto-fixable
|
|
164
|
+
4. **Sample data trông kỹ thuật** (UUID, `item_123`) → **minor**, auto-fixable
|
|
165
165
|
|
|
166
166
|
### B3 — Gherkin Rules Check (R1–R10)
|
|
167
167
|
|
|
168
168
|
| Rule | Check | Auto-fixable? |
|
|
169
169
|
|------|-------|---------------|
|
|
170
|
-
| R1 |
|
|
171
|
-
| R2 |
|
|
172
|
-
| R3 |
|
|
173
|
-
| R4 |
|
|
174
|
-
| R5 |
|
|
175
|
-
| R6 | `Then`
|
|
176
|
-
| R7 |
|
|
177
|
-
| R8 |
|
|
178
|
-
| R9 | Data
|
|
179
|
-
| R10 | Cross-UC reference
|
|
180
|
-
|
|
181
|
-
→ R3, R7, R9, R10
|
|
170
|
+
| R1 | Mỗi scenario có Given + When + Then | No — cần thiết kế lại scenario |
|
|
171
|
+
| R2 | Không chained `When … Then … When` | No — cần thiết kế lại |
|
|
172
|
+
| R3 | Không UI selector / API path / tech term trong steps | Yes — thay bằng cách diễn đạt nghiệp vụ |
|
|
173
|
+
| R4 | Tên scenario là một business outcome | No — cần người đổi tên |
|
|
174
|
+
| R5 | Khai báo WHAT, không phải mệnh lệnh HOW | No — cần viết lại |
|
|
175
|
+
| R6 | `Then` khẳng định business outcome quan sát được | No — cần thiết kế lại |
|
|
176
|
+
| R7 | Giá trị cụ thể, không phải "valid data" | Yes — thay bằng giá trị thực tế |
|
|
177
|
+
| R8 | Mỗi scenario chạy độc lập được | No — cần thiết kế lại |
|
|
178
|
+
| R9 | Data table đủ cột cho Then | Yes — thêm cột còn thiếu |
|
|
179
|
+
| R10 | Cross-UC reference dùng cách diễn đạt navigation + Note | Yes — thêm comment Note |
|
|
180
|
+
|
|
181
|
+
→ Vi phạm R3, R7, R9, R10: auto-fixable. Còn lại cần người hướng dẫn qua note Review Board.
|
|
182
182
|
|
|
183
183
|
### B4 — Compliance Checks (C.1–C.5)
|
|
184
184
|
|
|
185
|
-
- [ ] C.1 Wireframe Coverage:
|
|
186
|
-
- [ ] C.2 PRD Traceability:
|
|
187
|
-
- [ ] C.3 Business Dictionary
|
|
188
|
-
- [ ] C.4 Banned Terms: 0 banned
|
|
189
|
-
- [ ] C.5 NHÓM Grouping:
|
|
185
|
+
- [ ] C.1 Wireframe Coverage: mỗi component/action của màn hình có ≥1 SC → một finding cho mỗi mục thiếu
|
|
186
|
+
- [ ] C.2 PRD Traceability: đã phủ đầy đủ bởi B1 — KHÔNG tạo finding mới ở đây; dedup với finding B1
|
|
187
|
+
- [ ] C.3 Term Business Dictionary được dùng → giống B2
|
|
188
|
+
- [ ] C.4 Banned Terms: 0 banned term → **critical**, auto-fixable
|
|
189
|
+
- [ ] C.5 NHÓM Grouping: nếu ≥3 SC, gom nhóm theo business theme → **major**, auto-fixable
|
|
190
190
|
|
|
191
191
|
### B5 — Metadata & Structural Check
|
|
192
192
|
|
|
193
|
-
- [ ]
|
|
194
|
-
-
|
|
195
|
-
- [ ]
|
|
196
|
-
- [ ] Coverage Matrix
|
|
197
|
-
- [ ] Pre-merge Checklist
|
|
193
|
+
- [ ] Header file có đủ các field `@trace.*` bắt buộc — kiểm tra từng cái tường minh: `@trace.id`, `@trace.title`, `@trace.revision`, `@trace.domain`, `@trace.service`, `@trace.module`, `@trace.status`, `@trace.author`, `@trace.created_at`, `@trace.prd`, `@trace.prd_version`, `@trace.bdd_version`, `@trace.business_rules`, `@trace.dataset` → **minor** cho mỗi field thiếu, auto-fixable
|
|
194
|
+
- Lưu ý: `@trace.revision` luôn là `1` (field tĩnh — xem generate-bdd.tmpl). Chỉ kiểm tra có mặt; KHÔNG gắn cờ giá trị là stale.
|
|
195
|
+
- [ ] Mỗi scenario có `# @trace.scenario`, `# @trace.sc_version`, `# @trace.business_rules`, `# Side-effects:` → **minor**, auto-fixable
|
|
196
|
+
- [ ] Coverage Matrix ở cuối file → **major**, auto-fixable (AI sinh lại)
|
|
197
|
+
- [ ] Pre-merge Checklist ở cuối file → **minor**, auto-fixable
|
|
198
198
|
|
|
199
199
|
### B6 — Side-effect Completeness
|
|
200
200
|
|
|
201
|
-
|
|
202
|
-
- `# Side-effects:`
|
|
203
|
-
- `Then`
|
|
201
|
+
Với mỗi scenario `@happy`:
|
|
202
|
+
- Comment `# Side-effects:` liệt kê tất cả side effect quan sát được
|
|
203
|
+
- Block `Then` có `And <side-effect>` cho mỗi side effect đã liệt kê
|
|
204
204
|
|
|
205
|
-
→
|
|
205
|
+
→ Thiếu assertion side-effect: **major**, auto-fixable.
|
|
206
206
|
|
|
207
207
|
---
|
|
208
208
|
|
|
209
|
-
##
|
|
209
|
+
## Ghi File Findings
|
|
210
210
|
|
|
211
|
-
|
|
211
|
+
Sau khi chạy hết các check, ghi `{paths.refinement_dir}/{slug}-review-*-findings.yaml`:
|
|
212
212
|
|
|
213
213
|
```yaml
|
|
214
214
|
source_file: "{absolute path to reviewed file}"
|
|
@@ -218,14 +218,14 @@ status: "pending_review"
|
|
|
218
218
|
|
|
219
219
|
findings:
|
|
220
220
|
- id: "F001"
|
|
221
|
-
check_id: "P1" # P1-P5
|
|
221
|
+
check_id: "P1" # P1-P5 cho PRD; B1-B6 cho BDD
|
|
222
222
|
severity: "critical" # critical | major | minor
|
|
223
|
-
section: "{section
|
|
224
|
-
uc_id: "{UC-ID
|
|
225
|
-
quote: "{
|
|
226
|
-
finding: "{
|
|
227
|
-
suggestion: "{
|
|
228
|
-
auto_fixable: true # true = AI
|
|
223
|
+
section: "{section hoặc scenario ID nơi tìm thấy lỗi}"
|
|
224
|
+
uc_id: "{UC-ID mà finding này thuộc về — PRD: UC heading; BDD: @trace.id; \"\" nếu global}"
|
|
225
|
+
quote: "{trích đoạn nguyên văn copy CHÍNH XÁC từ file đang review tại vị trí lỗi, ≤120 ký tự}"
|
|
226
|
+
finding: "{mô tả rõ ràng vấn đề}"
|
|
227
|
+
suggestion: "{bản fix cụ thể, hành động được — AI sẽ áp dụng khi --resume nếu được chấp nhận}"
|
|
228
|
+
auto_fixable: true # true = AI áp dụng được; false = người phải viết note trong Review Board
|
|
229
229
|
status: "pending" # pending | accepted | modified | rejected | deferred
|
|
230
230
|
|
|
231
231
|
summary:
|
|
@@ -236,180 +236,180 @@ summary:
|
|
|
236
236
|
recommendation: "APPROVED | NEEDS_REVISION | BLOCKED"
|
|
237
237
|
```
|
|
238
238
|
|
|
239
|
-
> **
|
|
240
|
-
>
|
|
241
|
-
>
|
|
242
|
-
>
|
|
243
|
-
>
|
|
239
|
+
> **Field định vị (`quote` + `uc_id`) — bắt buộc cho source-jump của Review Board.**
|
|
240
|
+
> Với mỗi finding, copy một đoạn `quote` **nguyên văn** thẳng từ file đang review tại đúng
|
|
241
|
+
> chỗ lỗi xảy ra — KHÔNG diễn giải lại; nó được so khớp với tài liệu để định vị dòng.
|
|
242
|
+
> Đặt `uc_id` là Use Case sở hữu (`@trace.id` cho BDD, UC heading cho PRD; `""` nếu global).
|
|
243
|
+
> Hai field này cho phép reviewer click một finding trong Review Board và nhảy tới đúng vị trí nguồn.
|
|
244
244
|
|
|
245
|
-
## Post-Analysis Routing
|
|
245
|
+
## Định tuyến sau phân tích (Post-Analysis Routing)
|
|
246
246
|
|
|
247
|
-
|
|
247
|
+
Sau khi chạy hết các check và ghi file findings:
|
|
248
248
|
|
|
249
|
-
**
|
|
249
|
+
**Nếu có flag `--fix`** → nhảy tới Fix Mode (áp dụng ngay các finding `auto_fixable: true`).
|
|
250
250
|
|
|
251
|
-
**
|
|
251
|
+
**Nếu không có flag** → in Report bên dưới và dừng.
|
|
252
252
|
|
|
253
253
|
## Report
|
|
254
254
|
|
|
255
255
|
{{include:steps/report-footer.md}}
|
|
256
256
|
|
|
257
257
|
```
|
|
258
|
-
/review-context
|
|
258
|
+
/review-context Hoàn tất — {target file}
|
|
259
259
|
Mode: {PRD | BDD}
|
|
260
260
|
Findings: {total} | 🔴 Critical: {N} | 🟡 Major: {N} | 🟢 Minor: {N}
|
|
261
261
|
Auto-fixable: {N} | Needs human decision: {N}
|
|
262
262
|
|
|
263
|
-
|
|
263
|
+
File findings:
|
|
264
264
|
{If PRD}: {paths.refinement_dir}/{prd-slug}-review-context-findings.yaml
|
|
265
265
|
{If BDD}: {paths.refinement_dir}/{uc-id}-review-bdd-findings.yaml
|
|
266
266
|
|
|
267
|
-
|
|
267
|
+
Lựa chọn tiếp theo:
|
|
268
268
|
A) Quick fix : /review-context --fix {target-file}
|
|
269
|
-
→
|
|
270
|
-
B) Review Board:
|
|
269
|
+
→ áp dụng ngay mọi finding auto-fixable
|
|
270
|
+
B) Review Board: mở file findings → accept/modify/reject
|
|
271
271
|
→ /review-context --resume {target-file}
|
|
272
272
|
```
|
|
273
273
|
|
|
274
274
|
---
|
|
275
275
|
|
|
276
|
-
## Fix Mode —
|
|
276
|
+
## Fix Mode — Áp dụng ngay các Finding Auto-Fixable
|
|
277
277
|
|
|
278
|
-
*
|
|
279
|
-
*
|
|
278
|
+
*Kích hoạt khi `$ARGUMENTS` chứa `--fix`.*
|
|
279
|
+
*Ví dụ: `/review-context --fix specs/payment/process-payment/bdd/PAY-001.feature`*
|
|
280
280
|
|
|
281
|
-
|
|
282
|
-
`auto_fixable: true`
|
|
281
|
+
Mode này chạy toàn bộ phân tích (giống mặc định), rồi áp dụng ngay mọi finding
|
|
282
|
+
`auto_fixable: true` mà không qua Review Board.
|
|
283
283
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
284
|
+
Dùng cho: dọn BDD, fix thuật ngữ, gap metadata — bất cứ thứ gì AI có thể sửa an toàn
|
|
285
|
+
mà không cần phán đoán của con người. Finding cần quyết định của con người vẫn được ghi
|
|
286
|
+
vào file findings như thường và để `status: pending`.
|
|
287
287
|
|
|
288
|
-
### Phase 1 —
|
|
288
|
+
### Phase 1 — Chạy phân tích
|
|
289
289
|
|
|
290
|
-
|
|
291
|
-
|
|
290
|
+
Chạy hết các check qua **Quy trình Review** (fan-out + completeness loop) đúng như mode mặc định.
|
|
291
|
+
Ghi file findings với tất cả `status: "pending"` như thường.
|
|
292
292
|
|
|
293
|
-
### Phase 2 —
|
|
293
|
+
### Phase 2 — Áp dụng các finding auto-fixable
|
|
294
294
|
|
|
295
|
-
|
|
295
|
+
Với mỗi finding có `auto_fixable: true`, theo thứ tự (critical → major → minor):
|
|
296
296
|
|
|
297
|
-
**
|
|
297
|
+
**Với file PRD:**
|
|
298
298
|
|
|
299
|
-
| check_id |
|
|
299
|
+
| check_id | Áp dụng gì |
|
|
300
300
|
|----------|--------------|
|
|
301
|
-
| P0.3 (
|
|
302
|
-
| P1 (Banned term) |
|
|
303
|
-
| P4 (Structure) |
|
|
301
|
+
| P0.3 (Thiếu status) | Thêm `@trace.status: draft` vào frontmatter |
|
|
302
|
+
| P1 (Banned term) | Thay mọi lần xuất hiện banned term bằng canonical term |
|
|
303
|
+
| P4 (Structure) | Thêm skeleton section/metadata còn thiếu |
|
|
304
304
|
|
|
305
|
-
**
|
|
305
|
+
**Với file BDD:**
|
|
306
306
|
|
|
307
|
-
| check_id |
|
|
307
|
+
| check_id | Áp dụng gì |
|
|
308
308
|
|----------|--------------|
|
|
309
|
-
| B2 (Terminology) |
|
|
310
|
-
| B3 R3 |
|
|
311
|
-
| B3 R7 |
|
|
312
|
-
| B3 R9 |
|
|
313
|
-
| B3 R10 |
|
|
314
|
-
| B4 C4 | Fix banned
|
|
315
|
-
| B4 C5 |
|
|
316
|
-
| B5 |
|
|
317
|
-
| B6 |
|
|
318
|
-
|
|
319
|
-
|
|
309
|
+
| B2 (Terminology) | Thay banned term, fix tên entity/field, fix sample data kỹ thuật |
|
|
310
|
+
| B3 R3 | Thay tech term/UI selector bằng cách diễn đạt nghiệp vụ |
|
|
311
|
+
| B3 R7 | Thay bằng giá trị thực tế cụ thể |
|
|
312
|
+
| B3 R9 | Thêm cột data table còn thiếu |
|
|
313
|
+
| B3 R10 | Thêm comment Note navigation cross-UC |
|
|
314
|
+
| B4 C4 | Fix banned term trong tag |
|
|
315
|
+
| B4 C5 | Thêm NHÓM grouping nếu ≥3 SC |
|
|
316
|
+
| B5 | Thêm @trace header còn thiếu, sinh lại Coverage Matrix / Pre-merge Checklist |
|
|
317
|
+
| B6 | Thêm `And <side-effect>` còn thiếu vào block Then |
|
|
318
|
+
|
|
319
|
+
Sau khi áp dụng mỗi finding, đánh dấu nó `status: "applied_automatically"` trong file findings.
|
|
320
320
|
|
|
321
321
|
### Phase 3 — Version bump
|
|
322
322
|
|
|
323
|
-
- **PRD**:
|
|
323
|
+
- **PRD**: nếu ≥1 finding được áp dụng → bump version **minor** (auto-fix chỉ áp dụng thay banned-term P1 và thêm skeleton P4 — không bao giờ thay đổi cấu trúc UC hay nội dung BR, nên minor bump luôn đúng), thêm entry Changelog:
|
|
324
324
|
`Auto-fix: applied {N} auto-fixable review-context findings`
|
|
325
|
-
- **BDD**:
|
|
325
|
+
- **BDD**: nếu ≥1 finding được áp dụng → tăng `@trace.bdd_version` lên 0.1
|
|
326
326
|
|
|
327
327
|
### Phase 4 — Report
|
|
328
328
|
|
|
329
329
|
```
|
|
330
|
-
/review-context --fix
|
|
330
|
+
/review-context --fix Đã áp dụng — {target file}
|
|
331
331
|
Mode: {PRD | BDD}
|
|
332
332
|
|
|
333
333
|
Auto-fixed : {N} findings ({critical} critical, {major} major, {minor} minor)
|
|
334
|
-
- {change 1
|
|
335
|
-
- {change 2
|
|
334
|
+
- {tóm tắt change 1}
|
|
335
|
+
- {tóm tắt change 2}
|
|
336
336
|
|
|
337
|
-
|
|
338
|
-
- F00X [{severity}] {finding
|
|
337
|
+
Còn pending (cần quyết định của con người): {N}
|
|
338
|
+
- F00X [{severity}] {tóm tắt finding} ← mở file findings trong Review Board
|
|
339
339
|
|
|
340
340
|
{If PRD}: Version bumped: {old} → {new}
|
|
341
341
|
{If BDD}: bdd_version: {old} → {new}
|
|
342
342
|
|
|
343
|
-
|
|
343
|
+
File findings:
|
|
344
344
|
{If PRD}: {paths.refinement_dir}/{prd-slug}-review-context-findings.yaml
|
|
345
345
|
{If BDD}: {paths.refinement_dir}/{uc-id}-review-bdd-findings.yaml
|
|
346
|
-
|
|
346
|
+
Chạy lại /review-context {file} để xác nhận 0 finding critical còn lại.
|
|
347
347
|
```
|
|
348
348
|
|
|
349
|
-
|
|
349
|
+
Nếu 0 finding nào auto-fixable → in:
|
|
350
350
|
```
|
|
351
|
-
|
|
352
|
-
|
|
351
|
+
Không có gì để auto-fix. Cả {N} finding đều cần quyết định của con người.
|
|
352
|
+
Mở file findings trong Review Board → rồi chạy: /review-context --resume {file}
|
|
353
353
|
```
|
|
354
354
|
|
|
355
355
|
---
|
|
356
356
|
|
|
357
|
-
## Resume Mode —
|
|
357
|
+
## Resume Mode — Áp dụng các Finding được chấp nhận
|
|
358
358
|
|
|
359
|
-
*
|
|
360
|
-
*
|
|
359
|
+
*Kích hoạt khi `$ARGUMENTS` chứa `--resume`.*
|
|
360
|
+
*Ví dụ: `/review-context --resume specs/payment/process-payment/PAY01-process-payment.md`*
|
|
361
361
|
|
|
362
|
-
### Phase 1 —
|
|
362
|
+
### Phase 1 — Đọc các finding được chấp nhận
|
|
363
363
|
|
|
364
|
-
1.
|
|
364
|
+
1. Suy ra tên file findings từ target file dùng cùng quy tắc như Detect Review Mode:
|
|
365
365
|
- PRD: `{paths.refinement_dir}/{prd-slug}-review-context-findings.yaml`
|
|
366
366
|
- BDD: `{paths.refinement_dir}/{uc-id}-review-bdd-findings.yaml`
|
|
367
|
-
2.
|
|
368
|
-
3.
|
|
369
|
-
4.
|
|
367
|
+
2. Đọc file findings.
|
|
368
|
+
3. Gom các finding có `status: "accepted"` hoặc `status: "modified"`.
|
|
369
|
+
4. Nếu không có → báo "No accepted findings. File unchanged." và dừng.
|
|
370
370
|
|
|
371
|
-
### Phase 2 —
|
|
371
|
+
### Phase 2 — Áp dụng fix
|
|
372
372
|
|
|
373
|
-
|
|
373
|
+
Áp dụng theo thứ tự: critical → major → minor.
|
|
374
374
|
|
|
375
|
-
**
|
|
376
|
-
| check_id |
|
|
375
|
+
**Với finding PRD:**
|
|
376
|
+
| check_id | Làm gì |
|
|
377
377
|
|----------|-----------|
|
|
378
|
-
| P0.3 (
|
|
379
|
-
| P1 (Banned term) |
|
|
380
|
-
| P2 (Ambiguity) |
|
|
381
|
-
| P3 (Conflict) |
|
|
382
|
-
| P4 (Structure) |
|
|
383
|
-
| P5 (Custom) |
|
|
378
|
+
| P0.3 (Thiếu status) | Thêm `@trace.status: draft` vào frontmatter |
|
|
379
|
+
| P1 (Banned term) | Thay mọi lần xuất hiện banned term bằng canonical term |
|
|
380
|
+
| P2 (Ambiguity) | Áp dụng fix nêu trong `suggestion` hoặc note `modified` |
|
|
381
|
+
| P3 (Conflict) | Áp dụng cách giải quyết nêu trong note modified |
|
|
382
|
+
| P4 (Structure) | Thêm section/metadata field còn thiếu |
|
|
383
|
+
| P5 (Custom) | Áp dụng như nêu trong suggestion/note |
|
|
384
384
|
|
|
385
|
-
→
|
|
385
|
+
→ Sau khi áp dụng, bump version PRD (minor) và thêm entry Changelog.
|
|
386
386
|
|
|
387
|
-
**
|
|
388
|
-
| check_id |
|
|
387
|
+
**Với finding BDD:**
|
|
388
|
+
| check_id | Làm gì |
|
|
389
389
|
|----------|-----------|
|
|
390
|
-
| B1 (Coverage gap) |
|
|
391
|
-
| B2 (Terminology) |
|
|
392
|
-
| B3 (Gherkin rule) |
|
|
393
|
-
| B4 (Compliance) |
|
|
394
|
-
| B5 (Metadata) |
|
|
395
|
-
| B6 (Side effects) |
|
|
390
|
+
| B1 (Coverage gap) | Sinh scenario mới cho AC/BR chưa phủ và chèn vào đúng NHÓM |
|
|
391
|
+
| B2 (Terminology) | Thay banned term, fix tên entity/field |
|
|
392
|
+
| B3 (Gherkin rule) | Áp dụng fix theo từng rule (thay tech term, thêm giá trị cụ thể, v.v.) |
|
|
393
|
+
| B4 (Compliance) | Thêm NHÓM grouping, fix tag @trace |
|
|
394
|
+
| B5 (Metadata) | Thêm @trace header còn thiếu, sinh lại Coverage Matrix / Pre-merge Checklist |
|
|
395
|
+
| B6 (Side effects) | Thêm `And <side-effect>` còn thiếu vào block Then |
|
|
396
396
|
|
|
397
|
-
→
|
|
398
|
-
→
|
|
397
|
+
→ Sau khi áp dụng, tăng `@trace.bdd_version` trong header file lên 0.1.
|
|
398
|
+
→ Đồng thời cập nhật `{paths.trace_dir}/{domain}/{prd-slug}/{UC-ID}.tsv`: đặt cột `bdd_version` thành giá trị `@trace.bdd_version` mới cho mọi row, và đặt `last_updated` thành ngày hôm nay.
|
|
399
399
|
|
|
400
400
|
### Phase 3 — Report
|
|
401
401
|
|
|
402
402
|
```
|
|
403
|
-
/review-context --resume
|
|
403
|
+
/review-context --resume Đã áp dụng — {target file}
|
|
404
404
|
Applied : {N} findings ({critical} critical, {major} major, {minor} minor)
|
|
405
405
|
Skipped : {N} rejected/deferred
|
|
406
406
|
|
|
407
407
|
Changes:
|
|
408
|
-
- {change 1
|
|
409
|
-
- {change 2
|
|
408
|
+
- {tóm tắt change 1}
|
|
409
|
+
- {tóm tắt change 2}
|
|
410
410
|
|
|
411
411
|
{If PRD}: Version bumped: {old} → {new}
|
|
412
412
|
{If BDD}: bdd_version: {old} → {new}
|
|
413
413
|
|
|
414
|
-
|
|
414
|
+
Chạy lại /review-context {file} để xác nhận 0 finding critical còn lại.
|
|
415
415
|
```
|