@edupia-tutor/spec-driven-docs 0.14.0 → 0.14.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/commands/debug.md +435 -435
- package/commands/debug.tmpl +111 -111
- package/commands/define-product.md +330 -327
- package/commands/define-product.tmpl +50 -47
- package/commands/dev-gen-test.md +364 -364
- package/commands/dev-gen-test.tmpl +63 -63
- package/commands/dev-run-test.md +375 -375
- package/commands/dev-run-test.tmpl +74 -74
- package/commands/dev-smoke-test.md +340 -340
- package/commands/dev-smoke-test.tmpl +60 -60
- package/commands/fix-bug.md +402 -402
- package/commands/fix-bug.tmpl +78 -78
- package/commands/generate-bdd.md +512 -512
- package/commands/generate-bdd.tmpl +211 -211
- package/commands/generate-code.md +480 -482
- package/commands/generate-code.tmpl +179 -181
- package/commands/generate-design-spec.md +495 -495
- package/commands/generate-design-spec.tmpl +219 -219
- package/commands/generate-prd.md +445 -396
- package/commands/generate-prd.tmpl +45 -198
- package/commands/generate-spec-manifest.md +337 -337
- package/commands/generate-spec-manifest.tmpl +57 -57
- package/commands/generate-tech-docs.md +364 -364
- package/commands/generate-tech-docs.tmpl +84 -84
- package/commands/learn.md +346 -346
- package/commands/learn.tmpl +22 -22
- package/commands/map-testids.md +321 -321
- package/commands/map-testids.tmpl +41 -41
- package/commands/propose-scenario.md +334 -334
- package/commands/propose-scenario.tmpl +54 -54
- package/commands/qc-analyze.md +322 -323
- package/commands/qc-analyze.tmpl +42 -43
- package/commands/qc-design-test.md +303 -303
- package/commands/qc-design-test.tmpl +23 -23
- package/commands/qc-plan.md +296 -296
- package/commands/qc-plan.tmpl +16 -16
- package/commands/qc-report.md +301 -301
- package/commands/qc-report.tmpl +21 -21
- package/commands/qc-review.md +297 -297
- package/commands/qc-review.tmpl +17 -17
- package/commands/qc-run-test.md +336 -336
- package/commands/qc-run-test.tmpl +35 -35
- package/commands/refine-prd.md +426 -428
- package/commands/refine-prd.tmpl +61 -61
- package/commands/report-bug.md +350 -350
- package/commands/report-bug.tmpl +70 -70
- package/commands/review-code.md +363 -363
- package/commands/review-code.tmpl +39 -39
- package/commands/review-context.md +577 -579
- package/commands/review-context.tmpl +212 -212
- package/commands/review-tech-docs.md +426 -426
- package/commands/review-tech-docs.tmpl +146 -146
- package/commands/setup-ai-first.md +237 -237
- package/commands/setup-ai-first.tmpl +131 -131
- 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 +379 -379
- package/commands/validate-traces.tmpl +99 -99
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +435 -435
- package/core/commands/define-product.md +330 -327
- package/core/commands/dev-gen-test.md +364 -364
- package/core/commands/dev-run-test.md +375 -375
- package/core/commands/dev-smoke-test.md +340 -340
- package/core/commands/fix-bug.md +402 -402
- package/core/commands/generate-bdd.md +512 -512
- package/core/commands/generate-code.md +480 -482
- package/core/commands/generate-design-spec.md +495 -495
- package/core/commands/generate-prd.md +445 -396
- package/core/commands/generate-spec-manifest.md +337 -337
- package/core/commands/generate-tech-docs.md +364 -364
- package/core/commands/learn.md +346 -346
- package/core/commands/map-testids.md +321 -321
- package/core/commands/propose-scenario.md +334 -334
- package/core/commands/qc-analyze.md +322 -323
- package/core/commands/qc-design-test.md +303 -303
- package/core/commands/qc-plan.md +296 -296
- package/core/commands/qc-report.md +301 -301
- package/core/commands/qc-review.md +297 -297
- package/core/commands/qc-run-test.md +336 -336
- package/core/commands/refine-prd.md +426 -428
- package/core/commands/report-bug.md +350 -350
- package/core/commands/review-code.md +363 -363
- package/core/commands/review-context.md +577 -579
- package/core/commands/review-tech-docs.md +426 -426
- package/core/commands/setup-ai-first.md +237 -237
- package/core/commands/sync.md +145 -145
- package/core/commands/update-framework.md +88 -88
- package/core/commands/validate-traces.md +379 -379
- package/core/skills/code/SKILL.md +388 -388
- package/core/skills/debug/SKILL.md +390 -390
- package/core/skills/design-spec/SKILL.md +316 -316
- package/core/skills/discovery/SKILL.md +7 -547
- package/core/skills/prd/SKILL.md +298 -394
- package/core/skills/setup-ai-first/SKILL.md +79 -79
- package/core/skills/spec/SKILL.md +176 -176
- package/core/skills/test/SKILL.md +602 -602
- package/core/steps/capture-lesson.md +44 -44
- package/core/steps/context-loader.md +174 -174
- 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 +106 -231
- package/core/templates/product-definition.template.md +101 -88
- package/docs/04-operations/publishing.md +20 -3
- package/package.json +1 -1
- package/skills/code/SKILL.md +388 -388
- package/skills/code/SKILL.tmpl +56 -56
- package/skills/debug/SKILL.md +390 -390
- package/skills/debug/SKILL.tmpl +60 -60
- package/skills/design-spec/SKILL.md +316 -316
- package/skills/design-spec/SKILL.tmpl +36 -36
- 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 +79 -79
- package/skills/setup-ai-first/SKILL.tmpl +27 -27
- package/skills/spec/SKILL.md +176 -176
- package/skills/spec/SKILL.tmpl +18 -18
- package/skills/test/SKILL.md +602 -602
- package/skills/test/SKILL.tmpl +44 -44
- package/steps/capture-lesson.md +44 -44
- package/steps/context-loader.md +174 -174
- 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 +106 -231
- package/templates/product-definition.template.md +101 -88
package/steps/gate.md
CHANGED
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
# Gate —
|
|
1
|
+
# Gate — Quy trình vào chuẩn cho mọi lệnh
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Mọi lệnh PHẢI chạy gate này trước khi thực thi phần logic riêng của nó.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Bước 0 — Kiểm tra chế độ Sub-Agent
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Trước tiên, kiểm tra xem `$ARGUMENTS` có phải là payload JSON từ một orchestrator hay không:
|
|
8
8
|
|
|
9
|
-
1.
|
|
10
|
-
2.
|
|
11
|
-
- **
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
3.
|
|
9
|
+
1. Thử parse `$ARGUMENTS` dưới dạng JSON.
|
|
10
|
+
2. Nếu parse thành công **và** chứa `"_agent_mode": true`:
|
|
11
|
+
- **Bỏ qua hoàn toàn Bước 1, 2 và 3 của Gate này.**
|
|
12
|
+
- Đặt target file = `payload.target_file`
|
|
13
|
+
- Đặt loaded context = `payload.context` (KHÔNG chạy context-loader.md)
|
|
14
|
+
- Đặt phạm vi UC = `payload.uc_id` (chỉ xử lý UC này)
|
|
15
|
+
- Đặt line range = `payload.uc_section` (chỉ đọc đúng section đó của PRD)
|
|
16
|
+
- Đi thẳng tới phần logic riêng của lệnh.
|
|
17
|
+
3. Nếu `$ARGUMENTS` không phải JSON hoặc không có `_agent_mode` → tiếp tục sang Bước 1 (chế độ thường).
|
|
18
18
|
|
|
19
|
-
##
|
|
19
|
+
## Bước 0-B — Kiểm tra Model
|
|
20
20
|
|
|
21
|
-
*
|
|
21
|
+
*Bỏ qua bước này nếu `_agent_mode: true` (sub-agent — orchestrator đã kiểm tra rồi).*
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
Các lệnh sinh nội dung và review phức tạp đòi hỏi khả năng suy luận mạnh.
|
|
24
|
+
Dùng model nhỏ hơn sẽ rủi ro: bỏ sót edge case, phân tích spec thiếu sót, vi phạm kiến trúc.
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
Hiển thị và chờ phản hồi:
|
|
27
27
|
|
|
28
28
|
```
|
|
29
29
|
⚙️ MODEL CHECK
|
|
30
30
|
──────────────────────────────────────────────────────────────────
|
|
31
|
-
Recommended : claude-opus-4 (
|
|
32
|
-
Why needed :
|
|
33
|
-
|
|
31
|
+
Recommended : claude-opus-4 (hoặc model Opus mới nhất)
|
|
32
|
+
Why needed : Phân tích spec, review kiến trúc, sinh code đòi hỏi
|
|
33
|
+
suy luận sâu. Model nhỏ hơn dễ bỏ sót edge case.
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
• Settings → Model →
|
|
37
|
-
•
|
|
35
|
+
Cách đổi trong Claude Code:
|
|
36
|
+
• Settings → Model → chọn "claude-opus"
|
|
37
|
+
• hoặc: /model → chọn claude-opus
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
Y —
|
|
41
|
-
S —
|
|
39
|
+
Đang chạy claude-opus?
|
|
40
|
+
Y — đúng, đang dùng claude-opus → tiếp tục
|
|
41
|
+
S — bỏ qua kiểm tra (tôi chấp nhận rủi ro chất lượng thấp hơn với model hiện tại)
|
|
42
42
|
──────────────────────────────────────────────────────────────────
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
- "Y" →
|
|
46
|
-
- "S" →
|
|
47
|
-
- "N"
|
|
45
|
+
- "Y" → tiếp tục sang Bước 1.
|
|
46
|
+
- "S" → tiếp tục sang Bước 1 (người dùng chấp nhận rủi ro, thêm ⚠️ vào report cuối).
|
|
47
|
+
- "N" hoặc bất kỳ giá trị nào khác → **DỪNG.** Xuất: "Vui lòng chuyển sang claude-opus rồi chạy lại lệnh này."
|
|
48
48
|
|
|
49
|
-
##
|
|
49
|
+
## Bước 1 — Xác định Target File
|
|
50
50
|
|
|
51
|
-
1.
|
|
52
|
-
2.
|
|
53
|
-
- **BDD
|
|
54
|
-
- **PRD
|
|
55
|
-
- **tech-docs
|
|
56
|
-
- **design-spec
|
|
51
|
+
1. Nếu `$ARGUMENTS` được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
|
|
52
|
+
2. Nếu `$ARGUMENTS` là một **UC-ID / ticket ID / tên rút gọn** (không có path) → phân giải thành file bằng cách glob theo bố cục feature-package. `{prd-slug}` lúc này **chưa biết**, nên dùng wildcard `*` cho segment đó, và `**` đệ quy dưới `bdd/` để phủ hết các thư mục con theo platform (`bdd/web/`, `bdd/app/`, `bdd/system/`):
|
|
53
|
+
- **Lệnh BDD** (target là `.feature`): `{specs_dir}/{domain}/*/bdd/**/{UC-ID}*.feature` — hoặc `{specs_dir}/*/*/bdd/**/{UC-ID}*.feature` nếu domain cũng chưa biết. Nếu lệnh ngụ ý một platform/scope cụ thể (vd: system tech-doc cần BDD `system/`), ưu tiên kết quả trong thư mục con platform đó.
|
|
54
|
+
- **Lệnh PRD** (target là `prd.md`): `{specs_dir}/{domain}/*/prd.md` (khớp feature folder có id tương ứng), nếu không thì `{specs_dir}/*/*/prd.md`.
|
|
55
|
+
- **Lệnh tech-docs**: `{specs_dir}/{domain}/*/tech-docs/{UC-ID}*-tech-design*.md`.
|
|
56
|
+
- **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
3.
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
-
|
|
58
|
+
Khi một file khớp: đặt nó làm target **và** ghi lại `domain` + `prd_slug` từ path của nó (theo quy tắc trích xuất trong `context-loader.md` Bước 1 — `prd_slug` = segment đầu tiên sau `{specs_dir}/{domain}/`). Mọi path mà lệnh đọc/ghi về sau (BDD/tech-docs/design-spec/trace cùng cấp) đều dùng **`prd_slug` đã phân giải đó**, nên tất cả artifact nằm chung một feature package. Nếu nhiều file khớp (vd: nhiều platform), chọn theo platform/scope của lệnh hoặc liệt kê ra và hỏi.
|
|
59
|
+
3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
|
|
60
|
+
- Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs/*/*/prd.md` cho lệnh PRD, `specs/*/*/bdd/**/*.feature` cho lệnh BDD).
|
|
61
|
+
- Hiển thị danh sách cho người dùng và hỏi: "Bạn muốn làm việc với file nào? (Nhập số thứ tự hoặc tên file)"
|
|
62
|
+
- Chờ người dùng chọn rồi mới tiếp tục.
|
|
63
63
|
|
|
64
|
-
##
|
|
64
|
+
## Bước 2 — Chạy Context Loader
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
Nạp toàn bộ context của dự án bằng cách làm theo quy trình trong `steps/context-loader.md`.
|
|
67
|
+
Lưu toàn bộ context đã nạp vào bộ nhớ để dùng xuyên suốt phiên làm việc của lệnh.
|
|
68
68
|
|
|
69
|
-
##
|
|
69
|
+
## Bước 3 — CHECKPOINT
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
Sau khi hoàn thành Bước 1 và 2, hiển thị bản tóm tắt và chờ xác nhận:
|
|
72
72
|
|
|
73
73
|
```
|
|
74
74
|
CHECKPOINT
|
|
75
75
|
-----------
|
|
76
76
|
Target : {resolved file path}
|
|
77
|
-
Project : {project.name
|
|
77
|
+
Project : {project.name từ project-context.yaml}
|
|
78
78
|
Tech stack : {language} / {framework}
|
|
79
|
-
Module : {module
|
|
80
|
-
Domains : {
|
|
79
|
+
Module : {module nếu có, else "not configured"}
|
|
80
|
+
Domains : {danh sách domain, ngăn cách bởi dấu phẩy}
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
Tiếp tục? (Y/N)
|
|
83
83
|
```
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
- "Y" →
|
|
87
|
-
- "N" →
|
|
85
|
+
Chờ người dùng trả lời rõ ràng "Y" hoặc "N" rồi mới tiếp tục.
|
|
86
|
+
- "Y" → tiếp tục sang các bước riêng của lệnh bên dưới.
|
|
87
|
+
- "N" → dừng lại và hỏi người dùng muốn thay đổi gì.
|
package/steps/report-footer.md
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
# Report Footer —
|
|
1
|
+
# Report Footer — Định dạng output chuẩn cho mọi lệnh
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Mọi report của lệnh phải kết thúc bằng section footer chuẩn này.
|
|
4
4
|
|
|
5
5
|
## Status Badge
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- `✅ Complete` —
|
|
9
|
-
- `❌ Failed` —
|
|
10
|
-
- `⚠️ Warnings` —
|
|
7
|
+
Chọn một theo kết quả:
|
|
8
|
+
- `✅ Complete` — mọi bước thành công, không có vấn đề
|
|
9
|
+
- `❌ Failed` — lệnh không hoàn thành được do lỗi chặn
|
|
10
|
+
- `⚠️ Warnings` — hoàn thành nhưng có vấn đề không chặn, nên review lại
|
|
11
11
|
|
|
12
12
|
## Output Artifacts
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
Liệt kê mọi file được tạo hoặc sửa bởi lệnh này:
|
|
15
15
|
```
|
|
16
16
|
Output Artifacts:
|
|
17
|
-
{created|updated} {file-path} ({
|
|
18
|
-
{created|updated} {file-path} ({
|
|
17
|
+
{created|updated} {file-path} ({mô tả ngắn})
|
|
18
|
+
{created|updated} {file-path} ({mô tả ngắn})
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Nếu không ghi file nào (vd: lệnh review hoặc phân tích) → ghi `Output Artifacts: none (read-only)`.
|
|
22
22
|
|
|
23
23
|
## Pipeline Position
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
In một sơ đồ pipeline một dòng, đánh dấu phase của lệnh HIỆN TẠI bằng `◀ bạn ở đây`,
|
|
26
|
+
để người dùng luôn thấy lệnh này nằm ở đâu trong luồng end-to-end:
|
|
27
27
|
|
|
28
28
|
```
|
|
29
29
|
Discovery → PRD → [Design Spec] → BDD → Tech Design → Code → Dev Self-Check → QC → Trace Audit
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Tìm lệnh hiện tại trong bảng phase dưới đây và đánh dấu **phase của nó** trong sơ đồ trên:
|
|
33
33
|
|
|
34
34
|
| Phase | Commands |
|
|
35
35
|
|-------|----------|
|
|
@@ -43,58 +43,58 @@ Find the current command in this phase legend and mark **its** phase in the map
|
|
|
43
43
|
| QC | `/qc-analyze` · `/qc-plan` · `/qc-design-test` · `/qc-review` · `/qc-run-test` · `/qc-report` |
|
|
44
44
|
| Trace Audit | `/validate-traces` |
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
Với **lệnh review**, thêm vòng review 3 bước và đánh dấu bước hiện tại, vd:
|
|
47
47
|
`Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume`.
|
|
48
48
|
|
|
49
|
-
**
|
|
50
|
-
`/report-bug`, `/propose-scenario`, `/generate-spec-manifest`)
|
|
51
|
-
**
|
|
49
|
+
**Lệnh xuyên suốt** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
|
|
50
|
+
`/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) nằm ngoài pipeline tuyến tính —
|
|
51
|
+
**bỏ hẳn dòng Pipeline** cho các lệnh này (đừng cố nhét chúng vào sơ đồ).
|
|
52
52
|
|
|
53
|
-
##
|
|
53
|
+
## Gợi ý lệnh tiếp theo
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
56
56
|
|
|
57
|
-
|
|
|
57
|
+
| Lệnh hiện tại | Gợi ý lệnh tiếp theo |
|
|
58
58
|
|-------------------------|-----------------------------------------------|
|
|
59
|
-
| /setup-ai-first | `/define-product`
|
|
59
|
+
| /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
|
|
60
60
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
61
|
-
| /generate-prd | `/refine-prd {prd-file}`
|
|
62
|
-
| /refine-prd |
|
|
63
|
-
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (
|
|
64
|
-
| /generate-design-spec | Designer review →
|
|
65
|
-
| /generate-bdd | `/review-context {feature-file}`
|
|
66
|
-
| /review-context (BDD) | `/generate-tech-docs {UC-ID}`
|
|
67
|
-
| /qc-analyze | `/qc-plan {UC-ID}` (
|
|
61
|
+
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
62
|
+
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
63
|
+
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (rồi BDD sau khi sign-off); BE: `/generate-bdd {prd-file}` trực tiếp; sửa PRD nếu NEEDS_FIX |
|
|
64
|
+
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
65
|
+
| /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
|
|
66
|
+
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
|
|
67
|
+
| /qc-analyze | `/qc-plan {UC-ID}` (xử lý các gap blocker 🔴 trước) |
|
|
68
68
|
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
69
|
-
| /qc-design-test | `/qc-review {UC-ID}` (test-case
|
|
70
|
-
| /qc-review (test-case) | `/qc-run-test {UC-ID}`
|
|
71
|
-
| /qc-run-test | `/qc-report {UC-ID}`
|
|
72
|
-
| /qc-review (script) | `/qc-report {UC-ID}`
|
|
73
|
-
| /qc-report | `/validate-traces {UC-ID}`
|
|
69
|
+
| /qc-design-test | `/qc-review {UC-ID}` (review test-case) |
|
|
70
|
+
| /qc-review (test-case) | `/qc-run-test {UC-ID}` nếu APPROVED; sửa TC nếu NEEDS_FIX |
|
|
71
|
+
| /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
|
|
72
|
+
| /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
|
|
73
|
+
| /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
|
|
74
74
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
75
|
-
| /review-tech-docs | `/generate-code {feature-file}`
|
|
76
|
-
| /generate-code |
|
|
75
|
+
| /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
|
|
76
|
+
| /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
|
|
77
77
|
| /dev-gen-test | `/dev-run-test {UC-ID}` |
|
|
78
78
|
| /dev-run-test (passing) | `/review-code {UC-ID}` |
|
|
79
|
-
| /dev-run-test (failing) | `/fix-bug {ticket-id}`
|
|
80
|
-
| /review-code | `/dev-smoke-test {UC-ID}`
|
|
81
|
-
| /dev-smoke-test |
|
|
82
|
-
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`;
|
|
83
|
-
| /fix-bug |
|
|
84
|
-
| /debug | `/fix-bug {ticket-id}`
|
|
85
|
-
| /report-bug |
|
|
86
|
-
| /propose-scenario |
|
|
87
|
-
| /learn |
|
|
88
|
-
| /sync | `/validate-traces`
|
|
89
|
-
| /update-framework | Review `git diff .agent/`, commit; `/sync`
|
|
90
|
-
|
|
91
|
-
|
|
79
|
+
| /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
|
|
80
|
+
| /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
|
|
81
|
+
| /dev-smoke-test | Tạo PR và link tới ticket |
|
|
82
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/dev-gen-test {UC-ID}`; tất cả OK → tạo PR |
|
|
83
|
+
| /fix-bug | Tạo PR và link tới ticket |
|
|
84
|
+
| /debug | `/fix-bug {ticket-id}` nếu cần sửa |
|
|
85
|
+
| /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
|
|
86
|
+
| /propose-scenario | Báo PO/Dev review proposal trong `feedback/bdd-proposals/` |
|
|
87
|
+
| /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
|
|
88
|
+
| /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
|
|
89
|
+
| /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
|
|
90
|
+
|
|
91
|
+
Định dạng footer như sau:
|
|
92
92
|
```
|
|
93
93
|
---
|
|
94
94
|
Status : {badge}
|
|
95
|
-
{Output Artifacts
|
|
95
|
+
{khối Output Artifacts}
|
|
96
96
|
Pipeline : Discovery → PRD → [BDD ◀ bạn ở đây] → Tech Design → Code → Dev Self-Check → QC → Trace Audit
|
|
97
|
-
(review
|
|
98
|
-
Next : {
|
|
97
|
+
(lệnh review) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
|
|
98
|
+
Next : {lệnh gợi ý kèm ví dụ tham số}
|
|
99
99
|
```
|
|
100
|
-
*(
|
|
100
|
+
*(Bỏ dòng `Pipeline` cho các lệnh xuyên suốt liệt kê ở trên.)*
|
package/steps/review-fanout.md
CHANGED
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Review Fan-Out toàn diện + Hội tụ về độ đầy đủ
|
|
2
2
|
|
|
3
|
-
**
|
|
4
|
-
|
|
5
|
-
(
|
|
6
|
-
fan out
|
|
7
|
-
|
|
3
|
+
**Vì sao có cái này:** Một lượt review đơn không bao giờ liệt kê hết mọi vấn đề cùng lúc — model
|
|
4
|
+
dừng ở mức "đủ" findings, nên mỗi vòng review sau lại lòi ra vấn đề *mới*
|
|
5
|
+
(đập chuột chũi). Quy trình này ép review **hội tụ trong một lần chạy lệnh**:
|
|
6
|
+
fan out song song theo các chiều review, rồi lặp một critic độ-đầy-đủ cho tới khi một
|
|
7
|
+
vòng không sinh thêm gì mới, *trước khi* ghi file findings.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
- **DIMENSIONS** —
|
|
11
|
-
(`/refine-prd` →
|
|
12
|
-
- **FINDINGS SCHEMA** —
|
|
9
|
+
Lệnh gọi cung cấp hai thứ:
|
|
10
|
+
- **DIMENSIONS** — danh sách các chiều review để fan out
|
|
11
|
+
(`/refine-prd` → 4 lăng kính; `/review-context` → các P-check hoặc B-check).
|
|
12
|
+
- **FINDINGS SCHEMA** — dạng YAML mà mỗi finding phải theo (định nghĩa trong lệnh).
|
|
13
13
|
|
|
14
|
-
> **
|
|
15
|
-
>
|
|
16
|
-
> sub-agent.
|
|
14
|
+
> **Bỏ qua ở chế độ sub-agent:** Nếu Gate Bước 0 đã set `_agent_mode: true`, toàn bộ
|
|
15
|
+
> quy trình này bị **bỏ qua** — orchestrator đã chạy sẵn một dimension/UC cho mỗi
|
|
16
|
+
> sub-agent. Chạy các check của lệnh trực tiếp trên section đã giới hạn và trả về findings.
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
## Phase 1 —
|
|
20
|
+
## Phase 1 — Quét dimension song song
|
|
21
21
|
|
|
22
|
-
**
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
**Bao nhiêu sub-agent:** *số lượng* agent không phải là đòn bẩy độ đầy đủ — bề rộng được
|
|
23
|
+
cố định bởi taxonomy DIMENSION (thêm agent vào cùng một dimension chỉ tìm lại cùng vấn đề),
|
|
24
|
+
còn *độ sâu* thuộc về vòng lặp critic ở Phase 2. Chọn **độ mịn fan-out**
|
|
25
|
+
theo kích thước target, tái dùng ngưỡng của `steps/spawn-agent.md`:
|
|
26
26
|
|
|
27
|
-
|
|
|
27
|
+
| Kích thước target | Độ mịn | Số agent |
|
|
28
28
|
|-------------|-------------|-------------|
|
|
29
|
-
| ≤ 3
|
|
30
|
-
| > 3
|
|
29
|
+
| ≤ 3 UC **và** ≤ 300 dòng | một agent cho mỗi DIMENSION trên cả file | = số dimension |
|
|
30
|
+
| > 3 UC **hoặc** > 300 dòng | một agent cho mỗi **DIMENSION × phạm vi UC** (các UC + một phạm vi PRD-global), gom batch để vừa giới hạn agent | `dimensions × (UCs + 1)`, có cap (xem dưới) |
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
Độ mịn lớn hơn giữ context của mỗi sub-agent nhỏ và quét nó vét cạn trên một
|
|
33
|
+
UC duy nhất — chính là điều ngăn bỏ sót trên các PRD lớn.
|
|
34
34
|
|
|
35
|
-
> **
|
|
36
|
-
>
|
|
37
|
-
> problem statement, terminology, glossary, changelog)
|
|
38
|
-
> fan out
|
|
39
|
-
> `uc_id: ""`)
|
|
40
|
-
> (
|
|
35
|
+
> **Các section global (không thuộc UC) — bắt buộc ở chế độ `DIMENSION × UC`.** Mỗi agent per-UC chỉ
|
|
36
|
+
> thấy một UC, nên các section toàn-PRD không thuộc UC nào (scope, success metric,
|
|
37
|
+
> problem statement, terminology, glossary, changelog) sẽ không được quét. Khi nào
|
|
38
|
+
> fan out theo UC, cũng phải thêm một phạm vi **"PRD-global"** (các section không thuộc UC, finding nhận
|
|
39
|
+
> `uc_id: ""`) bên cạnh danh sách UC. Nên số agent tự nhiên là `dimensions × (UCs + 1)`.
|
|
40
|
+
> (Không cần ở chế độ whole-file — ở đó mỗi agent đã thấy các section global rồi.)
|
|
41
41
|
|
|
42
|
-
### Agent cap — batch
|
|
42
|
+
### Agent cap — gom batch các UC khi fan-out quá rộng
|
|
43
43
|
|
|
44
|
-
`dimensions × (UCs + 1)`
|
|
45
|
-
|
|
44
|
+
`dimensions × (UCs + 1)` có thể bùng nổ trên PRD lớn (vd 6 check × (8 UC + 1) = 54
|
|
45
|
+
agent). Giới hạn mỗi wave ở **`AGENT_CAP = 12`** agent và gom batch các phạm vi UC cho vừa:
|
|
46
46
|
|
|
47
|
-
1.
|
|
48
|
-
2.
|
|
49
|
-
-
|
|
50
|
-
- Else
|
|
51
|
-
(
|
|
52
|
-
|
|
53
|
-
3.
|
|
47
|
+
1. Dựng danh sách phạm vi = `[UC1, UC2, …, UCn, PRD-global]` (độ dài `UCs + 1`).
|
|
48
|
+
2. Tính số-phạm-vi-mỗi-bucket: `groups = max(1, floor(AGENT_CAP / dimensions))`.
|
|
49
|
+
- Nếu `groups ≥ UCs + 1` → không cần batch, chạy một agent cho mỗi `DIMENSION × scope`.
|
|
50
|
+
- Else chia danh sách phạm vi thành `groups` bucket liền kề kích thước xấp xỉ bằng nhau
|
|
51
|
+
(giữ `PRD-global` ở bucket riêng nếu vừa; nếu không thì gắn vào bucket cuối).
|
|
52
|
+
Mỗi agent khi đó xử lý **một DIMENSION trên một bucket UC**.
|
|
53
|
+
3. Kích thước wave kết quả = `dimensions × groups ≤ AGENT_CAP`.
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
file,
|
|
57
|
-
|
|
55
|
+
Một agent đã batch review nhiều UC cùng lúc — vẫn giới hạn chặt hơn nhiều so với cả
|
|
56
|
+
file, nên độ phủ vẫn cao. `AGENT_CAP` là núm chỉnh duy nhất; tăng nếu host cho phép
|
|
57
|
+
concurrency nhiều hơn, giảm để tiết kiệm token. Chế độ whole-file (≤ 3 UC) không bao giờ chạm cap.
|
|
58
58
|
|
|
59
|
-
Spawn
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
dimension
|
|
59
|
+
Spawn các sub-agent đã chọn bằng Agent tool (gửi trong một message duy nhất để chúng
|
|
60
|
+
chạy đồng thời). Mỗi sub-agent nhận một **context window mới** và quét phạm vi của nó
|
|
61
|
+
chỉ qua **một** dimension duy nhất — độ phủ sâu hơn một session phải tung hứng mọi
|
|
62
|
+
dimension cùng lúc (tránh lost-in-the-middle).
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
Template prompt cho sub-agent (điền vào các ngoặc):
|
|
65
65
|
|
|
66
66
|
```
|
|
67
67
|
You are a {DIMENSION_NAME} reviewer. Read the full target file at {target_file}.
|
|
@@ -77,20 +77,20 @@ Return a JSON array of findings, each:
|
|
|
77
77
|
Return [] if this dimension is clean. Return ONLY the JSON array.
|
|
78
78
|
```
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
Gom mảng findings của mọi sub-agent vào một danh sách hợp nhất `ALL_FINDINGS`.
|
|
81
81
|
|
|
82
82
|
---
|
|
83
83
|
|
|
84
|
-
## Phase 2 —
|
|
84
|
+
## Phase 2 — Vòng lặp hội tụ critic độ-đầy-đủ
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
Đây là bước chống đập-chuột-chũi. Lặp cho tới khi **hai vòng liên tiếp thêm 0 finding
|
|
87
|
+
mới**, hoặc tới cap cứng **3 vòng**, cái nào đến trước:
|
|
88
88
|
|
|
89
|
-
1. Spawn
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
-
|
|
93
|
-
Prompt
|
|
89
|
+
1. Spawn một sub-agent **completeness-critic** bằng Agent tool. Cho nó:
|
|
90
|
+
- toàn bộ target file (`{target_file}`),
|
|
91
|
+
- danh sách `ALL_FINDINGS` hiện tại (để nó biết những gì đã được ghi nhận),
|
|
92
|
+
- cùng context gọn đó.
|
|
93
|
+
Prompt nó:
|
|
94
94
|
```
|
|
95
95
|
Here is a document and a list of issues already found. Read the WHOLE document.
|
|
96
96
|
List ONLY real, additional issues NOT already in the list — gaps, ambiguities,
|
|
@@ -99,40 +99,38 @@ findings**, or a hard cap of **3 rounds**, whichever comes first:
|
|
|
99
99
|
Do NOT repeat anything already listed. Return the same finding JSON shape, or [] if
|
|
100
100
|
nothing new.
|
|
101
101
|
```
|
|
102
|
-
2.
|
|
103
|
-
3.
|
|
104
|
-
4.
|
|
102
|
+
2. Thêm bất kỳ finding thực sự mới (chưa có trong `ALL_FINDINGS`) vào danh sách.
|
|
103
|
+
3. Nếu vòng này trả 0 finding mới → tăng bộ đếm dry-round; ngược lại reset về 0.
|
|
104
|
+
4. Dừng khi bộ đếm dry-round đạt 2, hoặc sau tổng cộng 3 vòng.
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
Ghi lại `convergence_rounds` (số vòng critic đã chạy) cho report.
|
|
107
107
|
|
|
108
108
|
---
|
|
109
109
|
|
|
110
|
-
## Phase 3 — Dedup,
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
1. **
|
|
117
|
-
`section` + `uc_id`
|
|
118
|
-
|
|
119
|
-
2. **
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
In the command's final report, add one line:
|
|
110
|
+
## Phase 3 — Dedup, giải quyết xung đột, merge
|
|
111
|
+
|
|
112
|
+
Các sub-agent chạy **mù với nhau** (độc lập = độ phủ đa dạng). Chúng không bao giờ
|
|
113
|
+
trao đổi hay điều hoà giữa chúng — mọi xử lý trùng/xung đột diễn ra **ở đây trong
|
|
114
|
+
orchestrator**, nơi thấy toàn bộ tập findings.
|
|
115
|
+
|
|
116
|
+
1. **Khử trùng lặp** `ALL_FINDINGS`: hai finding là trùng nếu cùng nhắm tới cùng
|
|
117
|
+
`section` + `uc_id` và mô tả cùng một vấn đề gốc. Giữ cái có `suggestion`
|
|
118
|
+
phong phú hơn; nếu khác nhau về severity, giữ severity **cao hơn**.
|
|
119
|
+
2. **Giải quyết xung đột** — nhóm các finding còn lại theo `section` + `uc_id` và kiểm tra
|
|
120
|
+
mâu thuẫn (hai finding có `suggestion` không thể cùng áp dụng, hoặc đề xuất sửa ngược nhau cho cùng một chỗ):
|
|
121
|
+
- Nếu hai đề xuất có thể **merge** thành một bản sửa mạch lạc → merge thành một finding duy nhất.
|
|
122
|
+
- Nếu chúng **loại trừ lẫn nhau** → phát ra **một** finding nêu cả hai phương án
|
|
123
|
+
và set `auto_fixable: false` với `status: "needs_discussion"` (PRD) /
|
|
124
|
+
`status: "pending"` (review) để con người chọn — không bao giờ âm thầm bỏ một bên.
|
|
125
|
+
- Nếu một finding bị **vô hiệu** bởi finding khác (vd một finding cấu trúc nói một section
|
|
126
|
+
bị thiếu, nhưng một finding khác trích dẫn nội dung từ chính section đó) → bỏ cái không hợp lệ.
|
|
127
|
+
3. **Sắp xếp** theo severity (critical → major → minor), rồi theo thứ tự `section` trong file.
|
|
128
|
+
4. **Gán ID ổn định** `F001, F002, …` theo thứ tự đã sắp đó.
|
|
129
|
+
5. Map `dimension` của mỗi finding vào field schema của lệnh
|
|
130
|
+
(`lens` cho `/refine-prd`; `check_id` cho `/review-context`).
|
|
131
|
+
6. Ghi **một** file findings duy nhất theo FINDINGS SCHEMA mà lệnh định nghĩa.
|
|
132
|
+
|
|
133
|
+
Trong report cuối của lệnh, thêm một dòng:
|
|
136
134
|
```
|
|
137
|
-
Convergence: {convergence_rounds} critic
|
|
135
|
+
Convergence: {convergence_rounds} vòng critic — file findings đã đầy đủ; chạy lại sẽ lòi ra 0 vấn đề mới.
|
|
138
136
|
```
|