@educa-corp/sdd-framework 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/gate-trace.js +25 -2
- package/bin/index.js +32 -5
- package/bin/lint-trace.js +41 -0
- package/bin/self-check.js +430 -3
- package/bin/trace-schema.json +391 -30
- package/core/FRAMEWORK_VERSION +1 -1
- package/{commands/extend-prd.md → core/commands/amend-prd.md} +205 -173
- package/core/commands/dev-run-test.md +47 -9
- package/core/commands/extend-prd.md +39 -12
- package/core/commands/generate-bdd.md +43 -4
- package/core/commands/generate-code.md +33 -0
- package/core/commands/generate-tech-docs.md +34 -2
- package/core/commands/qc-run-test.md +29 -3
- package/core/commands/refine-prd.md +13 -2
- package/core/commands/review-context.md +43 -8
- package/core/commands/sync.md +105 -1
- package/core/commands/validate-traces.md +284 -11
- package/core/rules/workflow.md +34 -0
- package/core/steps/context-loader.md +26 -5
- package/core/templates/feature.template +1 -1
- package/docs/02-concepts/architecture.md +36 -0
- package/docs/04-reference/commands.md +148 -134
- package/docs/04-reference/trace-schema.md +39 -0
- package/docs/explain/02b-extend-prd.md +1 -1
- package/docs/explain/02c-amend-prd.md +152 -0
- package/docs/explain/28-sync.md +25 -0
- package/docs/explain/README.md +136 -135
- package/package.json +1 -8
- package/commands/debug.md +0 -529
- package/commands/debug.tmpl +0 -260
- package/commands/define-product.md +0 -438
- package/commands/define-product.tmpl +0 -225
- package/commands/dev-gen-test.md +0 -700
- package/commands/dev-gen-test.tmpl +0 -490
- package/commands/dev-run-test.md +0 -435
- package/commands/dev-run-test.tmpl +0 -225
- package/commands/dev-smoke-test.md +0 -374
- package/commands/dev-smoke-test.tmpl +0 -217
- package/commands/extend-prd.tmpl +0 -273
- package/commands/fix-bug.md +0 -519
- package/commands/fix-bug.tmpl +0 -197
- package/commands/generate-architecture.md +0 -354
- package/commands/generate-architecture.tmpl +0 -197
- package/commands/generate-bdd.md +0 -923
- package/commands/generate-bdd.tmpl +0 -590
- package/commands/generate-code.md +0 -859
- package/commands/generate-code.tmpl +0 -649
- package/commands/generate-design-spec.md +0 -737
- package/commands/generate-design-spec.tmpl +0 -524
- package/commands/generate-prd.md +0 -722
- package/commands/generate-prd.tmpl +0 -226
- package/commands/generate-spec-manifest.md +0 -321
- package/commands/generate-spec-manifest.tmpl +0 -164
- package/commands/generate-tech-docs.md +0 -920
- package/commands/generate-tech-docs.tmpl +0 -273
- package/commands/learn.md +0 -399
- package/commands/learn.tmpl +0 -130
- package/commands/map-testids.md +0 -238
- package/commands/map-testids.tmpl +0 -81
- package/commands/propose-scenario.md +0 -359
- package/commands/propose-scenario.tmpl +0 -202
- package/commands/qc-analyze.md +0 -269
- package/commands/qc-analyze.tmpl +0 -112
- package/commands/qc-design-test.md +0 -226
- package/commands/qc-design-test.tmpl +0 -69
- package/commands/qc-plan.md +0 -206
- package/commands/qc-plan.tmpl +0 -49
- package/commands/qc-report.md +0 -217
- package/commands/qc-report.tmpl +0 -60
- package/commands/qc-review.md +0 -210
- package/commands/qc-review.tmpl +0 -53
- package/commands/qc-run-test.md +0 -326
- package/commands/qc-run-test.tmpl +0 -116
- package/commands/refine-prd.md +0 -653
- package/commands/refine-prd.tmpl +0 -281
- package/commands/report-bug.md +0 -305
- package/commands/report-bug.tmpl +0 -148
- package/commands/review-code.md +0 -415
- package/commands/review-code.tmpl +0 -146
- package/commands/review-context.md +0 -902
- package/commands/review-context.tmpl +0 -530
- package/commands/review-tech-docs.md +0 -561
- package/commands/review-tech-docs.tmpl +0 -404
- package/commands/setup-ai-first.md +0 -602
- package/commands/setup-ai-first.tmpl +0 -450
- package/commands/sync.md +0 -430
- package/commands/sync.tmpl +0 -429
- package/commands/update-framework.md +0 -203
- package/commands/update-framework.tmpl +0 -202
- package/commands/validate-traces.md +0 -1077
- package/commands/validate-traces.tmpl +0 -920
- package/hooks/data-guard.js +0 -232
- package/hooks/settings.json +0 -19
- package/modules/android-compose/module.yaml +0 -13
- package/modules/android-compose/stack-profile.yaml +0 -57
- package/modules/angular/architecture-snippets/component-patterns.md +0 -187
- package/modules/angular/module.yaml +0 -6
- package/modules/angular/stack-profile.yaml +0 -38
- package/modules/context-engineering/architecture-snippets/context-design.md +0 -119
- package/modules/context-engineering/module.yaml +0 -9
- package/modules/context-engineering/stack-profile.yaml +0 -61
- package/modules/dotnet/architecture-snippets/clean-arch.md +0 -160
- package/modules/dotnet/module.yaml +0 -6
- package/modules/dotnet/stack-profile.yaml +0 -50
- package/modules/flutter/module.yaml +0 -14
- package/modules/flutter/stack-profile.yaml +0 -59
- package/modules/golang/architecture-snippets/domain-layout.md +0 -283
- package/modules/golang/module.yaml +0 -6
- package/modules/golang/stack-profile.yaml +0 -40
- package/modules/ios-swiftui/module.yaml +0 -13
- package/modules/ios-swiftui/stack-profile.yaml +0 -55
- package/modules/java-spring/architecture-snippets/layered-arch.md +0 -201
- package/modules/java-spring/module.yaml +0 -15
- package/modules/java-spring/stack-profile.yaml +0 -28
- package/modules/nextjs/architecture-snippets/app-router-patterns.md +0 -269
- package/modules/nextjs/module.yaml +0 -14
- package/modules/nextjs/stack-profile.yaml +0 -74
- package/modules/nuxt/module.yaml +0 -14
- package/modules/nuxt/stack-profile.yaml +0 -58
- package/modules/phaser-game/architecture-snippets/phaser-scene-patterns.md +0 -646
- package/modules/phaser-game/module.yaml +0 -15
- package/modules/phaser-game/stack-profile.yaml +0 -90
- package/modules/php-laravel/architecture-snippets/service-repository.md +0 -302
- package/modules/php-laravel/module.yaml +0 -15
- package/modules/php-laravel/stack-profile.yaml +0 -56
- package/modules/qc-playwright/stack-profile.yaml +0 -66
- package/modules/react/architecture-snippets/hooks-query-patterns.md +0 -254
- package/modules/react/module.yaml +0 -14
- package/modules/react/stack-profile.yaml +0 -63
- package/modules/react-native/module.yaml +0 -14
- package/modules/react-native/stack-profile.yaml +0 -56
- package/modules/vue/module.yaml +0 -14
- package/modules/vue/stack-profile.yaml +0 -65
- package/rules/data-protection.md +0 -80
- package/rules/workflow.md +0 -99
- package/skills/code/SKILL.md +0 -19
- package/skills/code/SKILL.tmpl +0 -19
- package/skills/debug/SKILL.md +0 -19
- package/skills/debug/SKILL.tmpl +0 -19
- package/skills/design-spec/SKILL.md +0 -11
- package/skills/design-spec/SKILL.tmpl +0 -11
- package/skills/discovery/SKILL.md +0 -14
- package/skills/discovery/SKILL.tmpl +0 -14
- package/skills/prd/SKILL.md +0 -19
- package/skills/prd/SKILL.tmpl +0 -19
- package/skills/qc/qa-analyst/DOC_GAPS.template.md +0 -63
- package/skills/qc/qa-analyst/acceptance-criteria.md +0 -60
- package/skills/qc/qa-analyst/business-rules.md +0 -59
- package/skills/qc/qa-analyst/data-flow.md +0 -64
- package/skills/qc/qa-analyst/spec-breakdown.md +0 -61
- package/skills/qc/qa-designer/e2e/journey.md +0 -41
- package/skills/qc/qa-designer/exploratory/charter.md +0 -68
- package/skills/qc/qa-designer/exploratory/explore-to-functional.md +0 -43
- package/skills/qc/qa-designer/functional/api.md +0 -45
- package/skills/qc/qa-designer/functional/gui-feature.md +0 -46
- package/skills/qc/qa-designer/functional/gui-screen.md +0 -52
- package/skills/qc/qa-designer/integration/api.md +0 -42
- package/skills/qc/qa-designer/integration/db.md +0 -39
- package/skills/qc/qa-designer/integration/gui.md +0 -40
- package/skills/qc/qa-designer/integration/kafka.md +0 -40
- package/skills/qc/qa-designer/non-functional.md +0 -40
- package/skills/qc/qa-planner/test-plan.md +0 -120
- package/skills/qc/qa-reviewer/script/e2e.md +0 -87
- package/skills/qc/qa-reviewer/script/exploratory.md +0 -45
- package/skills/qc/qa-reviewer/script/functional.md +0 -101
- package/skills/qc/qa-reviewer/script/integration.md +0 -91
- package/skills/qc/qa-reviewer/script/non-functional.md +0 -126
- package/skills/qc/qa-reviewer/test-case/e2e.md +0 -73
- package/skills/qc/qa-reviewer/test-case/exploratory.md +0 -43
- package/skills/qc/qa-reviewer/test-case/functional.md +0 -76
- package/skills/qc/qa-reviewer/test-case/integration.md +0 -69
- package/skills/qc/qa-reviewer/test-case/non-functional.md +0 -73
- package/skills/qc/qa-runner/e2e.md +0 -49
- package/skills/qc/qa-runner/exploratory/session.md +0 -36
- package/skills/qc/qa-runner/functional/api.md +0 -35
- package/skills/qc/qa-runner/functional/gui-feature.md +0 -51
- package/skills/qc/qa-runner/functional/gui-screen.md +0 -55
- package/skills/qc/qa-runner/integration.md +0 -47
- package/skills/qc/qa-runner/non-functional.md +0 -49
- package/skills/qc/qa-runner/report/report.md +0 -37
- package/skills/setup-ai-first/SKILL.md +0 -19
- package/skills/setup-ai-first/SKILL.tmpl +0 -19
- package/skills/spec/SKILL.md +0 -19
- package/skills/spec/SKILL.tmpl +0 -19
- package/skills/test/SKILL.md +0 -18
- package/skills/test/SKILL.tmpl +0 -18
- package/steps/business-language.md +0 -56
- package/steps/capture-lesson.md +0 -112
- package/steps/context-loader.md +0 -406
- package/steps/gate.md +0 -151
- package/steps/report-footer.md +0 -125
- package/steps/review-fanout.md +0 -159
- package/steps/spawn-agent.md +0 -129
- package/steps/trace-mirror.md +0 -53
- package/templates/README.md +0 -70
- package/templates/architecture.template.md +0 -394
- package/templates/ci/trace-gate.yml +0 -146
- package/templates/design-spec.template.md +0 -217
- package/templates/feature.template +0 -123
- package/templates/hooks/pre-push +0 -61
- package/templates/platform-guide.template.md +0 -145
- package/templates/prd.template.md +0 -283
- package/templates/product-definition.template.md +0 -188
- package/templates/project-context.yaml +0 -212
- package/templates/tech-design.template.md +0 -490
package/steps/gate.md
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
# Gate — Quy trình vào chuẩn cho mọi lệnh
|
|
2
|
-
|
|
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
|
-
|
|
5
|
-
## Bước 0 — Kiểm tra chế độ Sub-Agent
|
|
6
|
-
|
|
7
|
-
Trước tiên, kiểm tra xem `$ARGUMENTS` có phải là payload JSON từ một orchestrator hay không:
|
|
8
|
-
|
|
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
|
-
- Đặt dimension = `payload.dimension` nếu có (lệnh review per-UC: chỉ review đúng lăng kính này)
|
|
17
|
-
- Đi thẳng tới phần logic riêng của lệnh.
|
|
18
|
-
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).
|
|
19
|
-
|
|
20
|
-
## Bước 0-B — Ghi nhận Model *(KHÔNG chặn)*
|
|
21
|
-
|
|
22
|
-
*Bỏ qua nếu `_agent_mode: true` (sub-agent — orchestrator đã ghi nhận rồi).*
|
|
23
|
-
|
|
24
|
-
Ghi lại **model mà bạn — agent đang chạy lệnh này — thực sự đang dùng**, rồi mang nó vào
|
|
25
|
-
dòng `Model:` của report cuối (xem `report-footer`). Nếu bạn biết mình **không** phải một
|
|
26
|
-
model Opus, gắn thêm cảnh báo ngay ở dòng đó.
|
|
27
|
-
|
|
28
|
-
**KHÔNG hỏi người dùng. KHÔNG chờ. KHÔNG dừng.**
|
|
29
|
-
|
|
30
|
-
> **Vì sao bước này từng là prompt chặn, và vì sao bỏ (GAPS-v3 G41):** bản cũ hiện khối
|
|
31
|
-
> `⚙️ MODEL CHECK` rồi chờ `Y/S/N`. Ba vấn đề cùng chỉ một hướng:
|
|
32
|
-
> **(1)** nó hỏi người dùng thứ mà **agent đã biết chính xác**;
|
|
33
|
-
> **(2)** câu trả lời **không kiểm chứng được** — gõ `Y` xong vẫn đang chạy Haiku thì không
|
|
34
|
-
> gì phát hiện;
|
|
35
|
-
> **(3)** **cả `Y` lẫn `S` đều đi tiếp** — cách duy nhất để nó dừng là tự nguyện gõ `N`.
|
|
36
|
-
> Tức nó **không chặn được ai**, mà tốn một lần chặn ở **mọi** lệnh. Một feature đi hết
|
|
37
|
-
> pipeline dùng 20 lệnh; 30/32 lệnh chạy gate. Hai mươi lần bấm cho một tín hiệu tự-khai
|
|
38
|
-
> không kiểm chứng được — và chính cái giá đó làm mòn CHECKPOINT ở Bước 3, cổng có giá trị thật.
|
|
39
|
-
>
|
|
40
|
-
> Khai báo trong report **mạnh hơn** hỏi: đúng nguồn (agent, không phải người), và nằm
|
|
41
|
-
> **cạnh kết quả** để cân nhắc, thay vì nằm trước khi có kết quả để bấm cho xong.
|
|
42
|
-
|
|
43
|
-
**Vẫn khuyến nghị Opus:** phân tích spec, review kiến trúc và sinh code đòi hỏi suy luận sâu;
|
|
44
|
-
model nhỏ hơn dễ bỏ sót edge case và vi phạm kiến trúc. Đổi: `/model` → chọn Opus.
|
|
45
|
-
|
|
46
|
-
## Bước 1 — Xác định Target File
|
|
47
|
-
|
|
48
|
-
0. **Tách cờ trước khi resolve target.** `$ARGUMENTS` có thể lẫn các `--flag` (vd `--phase=integration`, `--comment`, `--fix`). **Loại bỏ mọi token bắt đầu bằng `--`** ra khỏi phần dùng để tìm target — chỉ giữ phần path/UC-ID/ticket. (Các flag đó do phần logic riêng của lệnh parse ở bước sau, KHÔNG phải tên file.)
|
|
49
|
-
1. Nếu `$ARGUMENTS` (đã tách cờ) được cung cấp và trỏ tới một file tồn tại → dùng trực tiếp làm target.
|
|
50
|
-
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/`):
|
|
51
|
-
- **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 đó.
|
|
52
|
-
- **Lệnh PRD** (target là file PRD `{TICKET-ID}-{prd-slug}.md` — file `.md` duy nhất ở gốc feature folder, cạnh `bdd/`): `{specs_dir}/{domain}/*/{TICKET-ID}*.md` nếu biết TICKET-ID; nếu không, `{specs_dir}/{domain}/*/*.md` (khớp feature folder có id tương ứng), hoặc `{specs_dir}/*/*/*.md` nếu domain cũng chưa biết. *(Glob `*/*.md` ở cấp gốc folder chỉ khớp PRD — tech-docs/design-spec `.md` nằm sâu hơn trong thư mục con.)*
|
|
53
|
-
- **Lệnh tech-docs** — target là tech-doc **gộp cấp PRD** `{TICKET-ID}-tech-design.md` (MỘT doc phủ nhiều UC; danh sách UC nằm ở `@trace.ucs`). Vì tên file mang `{TICKET-ID}` chứ **không** mang `{UC-ID}`, phải tách trước khi glob:
|
|
54
|
-
- `$ARGUMENTS` là **UC-ID** (`{TICKET-ID}-UC{N}`) → lấy `{TICKET-ID}` = phần **trước** `-UC`, rồi glob `{specs_dir}/{domain}/*/tech-docs/{TICKET-ID}-tech-design.md`.
|
|
55
|
-
- `$ARGUMENTS` là **TICKET-ID** → glob trực tiếp như trên.
|
|
56
|
-
- Chưa biết domain → `{specs_dir}/*/*/tech-docs/{TICKET-ID}-tech-design.md`.
|
|
57
|
-
- Vẫn không khớp → glob rộng `{specs_dir}/*/*/tech-docs/*tech-design*.md` rồi liệt kê để người dùng chọn.
|
|
58
|
-
*(Đừng glob `{UC-ID}*-tech-design*.md` — nó nở thành `FT-001-UC1*-tech-design*.md` và **không bao giờ** khớp `FT-001-tech-design.md`.)*
|
|
59
|
-
- **Lệnh design-spec**: `{specs_dir}/{domain}/*/design-spec/{TICKET-ID}*.md`.
|
|
60
|
-
|
|
61
|
-
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.
|
|
62
|
-
3. Nếu `$ARGUMENTS` rỗng hoặc không tìm thấy file khớp:
|
|
63
|
-
- Liệt kê các file trong thư mục liên quan của lệnh này (vd: `specs/*/*/*.md` — file PRD ở gốc mỗi feature folder — cho lệnh PRD, `specs/*/*/bdd/**/*.feature` cho lệnh BDD).
|
|
64
|
-
- 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)"
|
|
65
|
-
- Chờ người dùng chọn rồi mới tiếp tục.
|
|
66
|
-
|
|
67
|
-
## Bước 2 — Chạy Context Loader
|
|
68
|
-
|
|
69
|
-
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`.
|
|
70
|
-
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.
|
|
71
|
-
|
|
72
|
-
## Bước 3 — CHECKPOINT
|
|
73
|
-
|
|
74
|
-
*Bỏ qua nếu `_agent_mode: true`.*
|
|
75
|
-
|
|
76
|
-
### 3a — Lệnh này có phải chặn không?
|
|
77
|
-
|
|
78
|
-
| Mức | Lệnh nào | `--yes` bỏ qua được? |
|
|
79
|
-
|---|---|:---:|
|
|
80
|
-
| **Không chặn** | Lệnh read-only: `/review-code` · `/validate-traces` · `/debug` · `/review-context` · `/review-tech-docs` | — (vốn không có) |
|
|
81
|
-
| **Chặn thường** | Mọi lệnh sinh/sửa artifact | ✅ |
|
|
82
|
-
| **Chặn CỨNG** | Ghi đè file đã tồn tại · `--resume` áp findings · migrate · prune | ❌ **không bao giờ** |
|
|
83
|
-
|
|
84
|
-
`--yes` trong `$ARGUMENTS` → bỏ qua CHECKPOINT mức *chặn thường*. (Bước 1 đã tách mọi token
|
|
85
|
-
`--` khỏi phần resolve target, nên cờ này không ảnh hưởng việc tìm file.) Mở đường chạy
|
|
86
|
-
headless: `claude -p "/generate-code UC1 --yes"`.
|
|
87
|
-
|
|
88
|
-
> **KHÔNG tự suy mức từ bảng này.** Mỗi lệnh **tự khai** mức của nó ở một dòng `*Checkpoint: …*`
|
|
89
|
-
> ngay dưới `## Gate` của chính nó — đọc dòng đó, đừng suy diễn. Bảng trên chỉ giải thích ba mức
|
|
90
|
-
> **nghĩa là gì**.
|
|
91
|
-
> Nguồn máy đọc: `bin/trace-schema.json` → `gate.checkpoint_levels`; `self-check` **R11** fail
|
|
92
|
-
> build nếu nhãn trong file lệnh lệch với schema, hoặc nếu một lệnh `hard`/`none` thiếu nhãn.
|
|
93
|
-
> *(Lệnh không có dòng nào = mức **chặn thường**, mặc định.)*
|
|
94
|
-
|
|
95
|
-
> **Mức *không chặn* là thực thi đúng miễn trừ mà `rules/workflow.md` đã cấp từ trước** —
|
|
96
|
-
> trước G41 file đó viết *"read-only commands may skip CHECKPOINT"* còn gate thì luôn đòi.
|
|
97
|
-
> Hai file cùng được nạp vào mọi lệnh mà nói ngược nhau; agent theo cái nào là tuỳ lúc.
|
|
98
|
-
|
|
99
|
-
### 3b — In gì
|
|
100
|
-
|
|
101
|
-
**KHÔNG lặp lại những gì `[CTX LOADED]` vừa in.** Recap của context-loader (Bước 7) đã hiện
|
|
102
|
-
Stack · Platform · Layers · CLAUDE.md · Dict · Entities · Lessons · Service · Status ngay phía
|
|
103
|
-
trên. CHECKPOINT chỉ thêm **một** thông tin mới là `Target`.
|
|
104
|
-
|
|
105
|
-
**Mọi thứ sạch** — recap báo `Status: FULL`, không cờ nào bật → in đúng hai dòng:
|
|
106
|
-
|
|
107
|
-
```
|
|
108
|
-
CHECKPOINT — Target: {resolved file path}
|
|
109
|
-
Tiếp tục? (Y/N)
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
**Có bất thường** → thêm một dòng cho **mỗi** trạng thái, nặng nhất lên đầu:
|
|
113
|
-
|
|
114
|
-
```
|
|
115
|
-
CHECKPOINT
|
|
116
|
-
🔴 Service : unresolved — {lý do context-loader đã ghi}
|
|
117
|
-
⚠️ CLAUDE.md: service overlay THIẾU — dùng root (code sinh ra có thể sai stack)
|
|
118
|
-
⚠️ Target : resolve bằng wildcard — {n} file khớp, chọn {file}
|
|
119
|
-
⚠️ Module : not configured — code sinh ra sẽ dùng default
|
|
120
|
-
Status : PARTIAL — thiếu: {danh sách}
|
|
121
|
-
Target : {resolved file path}
|
|
122
|
-
Tiếp tục? (Y/N)
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### 3c — Cờ nào bật, cờ nào KHÔNG
|
|
126
|
-
|
|
127
|
-
Mỗi dòng ⚠️/🔴 phải ứng với một trạng thái **context-loader đã tính rồi** — không phát minh
|
|
128
|
-
điều kiện mới, chỉ mang thứ đang bị giấu lên chỗ người dùng phải quyết định:
|
|
129
|
-
|
|
130
|
-
| Bật cờ khi | Nguồn | Mức |
|
|
131
|
-
|---|---|:---:|
|
|
132
|
-
| `active_service = unresolved` | context-loader Bước 2b/2c/Fallback | 🔴 |
|
|
133
|
-
| `Status = MINIMAL` | recap Bước 7 | 🔴 |
|
|
134
|
-
| `Status = PARTIAL` | recap Bước 7 | ⚠️ |
|
|
135
|
-
| CLAUDE.md thiếu, hoặc service overlay thiếu | context-loader Bước 3 | ⚠️ |
|
|
136
|
-
| Target resolve qua wildcard, hoặc nhiều file khớp mà lệnh tự chọn | Bước 1 ở trên | ⚠️ |
|
|
137
|
-
| `module` không cấu hình | recap Bước 7 | ⚠️ |
|
|
138
|
-
|
|
139
|
-
**KHÔNG bật cờ cho:** `Lessons: chưa có` · `Dict: missing` · `Entities: missing`. Đó là
|
|
140
|
-
*"dự án chưa điền"*, không phải *"có gì đó sai"* — chúng ở lại trong recap.
|
|
141
|
-
|
|
142
|
-
> **Nguyên tắc một câu:** cờ dành cho thứ **framework không chắc chắn hoặc đã phải đoán**,
|
|
143
|
-
> không dành cho thứ **người dùng chưa làm**. Đẩy hết mọi thứ lên thì CHECKPOINT lại đầy như
|
|
144
|
-
> cũ, và ta quay về đúng chỗ xuất phát: một cổng luôn giống nhau thì bị lướt qua.
|
|
145
|
-
|
|
146
|
-
### 3d — Chờ trả lời
|
|
147
|
-
|
|
148
|
-
- "Y" → tiếp tục sang các bước riêng của lệnh.
|
|
149
|
-
- "N" → dừng, hỏi người dùng muốn thay đổi gì.
|
|
150
|
-
- Có `--yes` và mức *chặn thường* → coi như "Y", **nhưng vẫn IN khối CHECKPOINT** nếu có cờ
|
|
151
|
-
🔴/⚠️ (không chặn ≠ không báo — người đọc log sau này vẫn cần thấy).
|
package/steps/report-footer.md
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
# Report Footer — Định dạng output chuẩn cho mọi lệnh
|
|
2
|
-
|
|
3
|
-
Mọi report của lệnh phải kết thúc bằng section footer chuẩn này.
|
|
4
|
-
|
|
5
|
-
## Model *(bắt buộc, một dòng)*
|
|
6
|
-
|
|
7
|
-
In model mà **bạn — agent vừa chạy lệnh này — thực sự đang dùng** (ghi nhận ở Gate Bước 0-B):
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
Model: {tên model đang chạy}
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
Nếu bạn biết mình **không** phải một model Opus, thêm cảnh báo ngay trên cùng dòng:
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
Model: {tên model} ⚠️ lệnh này khuyến nghị Opus — model nhỏ hơn dễ bỏ sót edge case,
|
|
17
|
-
phân tích spec thiếu sót, vi phạm kiến trúc. Cân nhắc chạy lại
|
|
18
|
-
với /model → Opus trước khi dùng kết quả này.
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
> **Vì sao ở ĐÂY chứ không phải một prompt ở đầu lệnh (GAPS-v3 G41):** trước đây Gate hiện
|
|
22
|
-
> `⚙️ MODEL CHECK` rồi chờ `Y/S/N`. Nó **hỏi người dùng thứ agent đã biết**, câu trả lời
|
|
23
|
-
> **không kiểm chứng được**, và **cả `Y` lẫn `S` đều đi tiếp** — tức không chặn được ai, mà
|
|
24
|
-
> tốn một lần chặn ở mọi lệnh (20 lệnh cho một feature). Khai báo ở footer đúng nguồn hơn
|
|
25
|
-
> (agent tự khai, không phải người tự khai) và đúng chỗ hơn: nó nằm **cạnh kết quả** để
|
|
26
|
-
> 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.
|
|
27
|
-
|
|
28
|
-
## Status Badge
|
|
29
|
-
|
|
30
|
-
Chọn một theo kết quả:
|
|
31
|
-
- `✅ Complete` — mọi bước thành công, không có vấn đề
|
|
32
|
-
- `❌ Failed` — lệnh không hoàn thành được do lỗi chặn
|
|
33
|
-
- `⚠️ Warnings` — hoàn thành nhưng có vấn đề không chặn, nên review lại
|
|
34
|
-
|
|
35
|
-
## Output Artifacts
|
|
36
|
-
|
|
37
|
-
Liệt kê mọi file được tạo hoặc sửa bởi lệnh này:
|
|
38
|
-
```
|
|
39
|
-
Output Artifacts:
|
|
40
|
-
{created|updated} {file-path} ({mô tả ngắn})
|
|
41
|
-
{created|updated} {file-path} ({mô tả ngắn})
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
Nếu không ghi file nào (vd: lệnh review hoặc phân tích) → ghi `Output Artifacts: none (read-only)`.
|
|
45
|
-
|
|
46
|
-
## Pipeline Position
|
|
47
|
-
|
|
48
|
-
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`,
|
|
49
|
-
để người dùng luôn thấy lệnh này nằm ở đâu trong luồng end-to-end:
|
|
50
|
-
|
|
51
|
-
```
|
|
52
|
-
Discovery → PRD → [Design Spec] → BDD → Tech Design → Code → Dev Self-Check → QC → Trace Audit
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
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:
|
|
56
|
-
|
|
57
|
-
| Phase | Commands |
|
|
58
|
-
|-------|----------|
|
|
59
|
-
| Discovery | `/define-product` |
|
|
60
|
-
| PRD | `/generate-prd` · `/extend-prd` · `/refine-prd` · `/review-context` (PRD) |
|
|
61
|
-
| Design Spec | `/generate-design-spec` |
|
|
62
|
-
| BDD | `/generate-bdd` · `/review-context` (BDD) |
|
|
63
|
-
| Tech Design | `/generate-tech-docs` · `/map-testids` · `/review-tech-docs` |
|
|
64
|
-
| Code | `/generate-code` · `/review-code` |
|
|
65
|
-
| Dev Self-Check | `/dev-gen-test` · `/dev-run-test` · `/dev-smoke-test` |
|
|
66
|
-
| QC | `/qc-analyze` · `/qc-plan` · `/qc-design-test` · `/qc-review` · `/qc-run-test` · `/qc-report` |
|
|
67
|
-
| Trace Audit | `/validate-traces` |
|
|
68
|
-
|
|
69
|
-
Với **lệnh review**, thêm vòng review 3 bước và đánh dấu bước hiện tại, vd:
|
|
70
|
-
`Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume`.
|
|
71
|
-
|
|
72
|
-
**Lệnh xuyên suốt** (`/sync`, `/update-framework`, `/fix-bug`, `/debug`, `/learn`,
|
|
73
|
-
`/report-bug`, `/propose-scenario`, `/generate-spec-manifest`) nằm ngoài pipeline tuyến tính —
|
|
74
|
-
**bỏ hẳn dòng Pipeline** cho các lệnh này (đừng cố nhét chúng vào sơ đồ).
|
|
75
|
-
|
|
76
|
-
## Gợi ý lệnh tiếp theo
|
|
77
|
-
|
|
78
|
-
Gợi ý lệnh kế tiếp hợp lý theo phase của workflow:
|
|
79
|
-
|
|
80
|
-
| Lệnh hiện tại | Gợi ý lệnh tiếp theo |
|
|
81
|
-
|-------------------------|-----------------------------------------------|
|
|
82
|
-
| /setup-ai-first | `/define-product` để bắt đầu feature đầu tiên |
|
|
83
|
-
| /define-product | `/generate-prd {product-definition-file}` |
|
|
84
|
-
| /generate-prd | `/refine-prd {prd-file}` rồi `/review-context {prd-file}` |
|
|
85
|
-
| /extend-prd | `/refine-prd {prd-file}` (soi phần vừa thêm) rồi `/review-context {prd-file}` → PO duyệt → `/generate-bdd` **chỉ cho UC MỚI**; UC cũ dùng `/validate-traces --realign-prd-version {UC-ID}` |
|
|
86
|
-
| /refine-prd | Mở Review Board → cập nhật PRD → `/review-context {prd-file}` |
|
|
87
|
-
| /review-context (PRD) | Khi 0 critical → PO đặt `Status: approved`, rồi FE/App: `/generate-design-spec {prd-file}` (→ design sign-off → BDD); BE: `/generate-bdd {prd-file}`. Còn critical/NEEDS_FIX → sửa PRD (giữ draft) |
|
|
88
|
-
| /generate-design-spec | Designer review → xác nhận link Figma → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
89
|
-
| /generate-bdd | `/review-context {feature-file}` để kiểm tra độ phủ |
|
|
90
|
-
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` nếu APPROVED; sinh lại nếu NEEDS_FIX |
|
|
91
|
-
| /qc-analyze | `/qc-plan {UC-ID}` (xử lý các gap blocker 🔴 trước) |
|
|
92
|
-
| /qc-plan | `/qc-design-test {UC-ID}` |
|
|
93
|
-
| /qc-design-test | `/qc-review {UC-ID}` (review test-case) |
|
|
94
|
-
| /qc-review (test-case) | `/qc-run-test {UC-ID}` nếu APPROVED; sửa TC nếu NEEDS_FIX |
|
|
95
|
-
| /qc-run-test | `/qc-report {UC-ID}` rồi `/qc-review {UC-ID}` (review script) |
|
|
96
|
-
| /qc-review (script) | `/qc-report {UC-ID}` rồi tạo PR nếu APPROVED |
|
|
97
|
-
| /qc-report | `/validate-traces {UC-ID}` để làm mới Living Docs (qc_status) |
|
|
98
|
-
| /map-testids | `/qc-design-test {UC-ID}` (QC dựng Page Object từ contract §4.5.6 vừa ghi) |
|
|
99
|
-
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
100
|
-
| /review-tech-docs | `/generate-code {feature-file}` nếu APPROVED; sửa doc nếu NEEDS_FIX |
|
|
101
|
-
| /generate-code | Lần gen đầu → `/review-code {UC-ID}`; gen lại → `/dev-gen-test {UC-ID}` |
|
|
102
|
-
| /dev-gen-test | `/dev-run-test {UC-ID}` |
|
|
103
|
-
| /dev-run-test (passing) | `/review-code {UC-ID}` |
|
|
104
|
-
| /dev-run-test (failing) | `/fix-bug {ticket-id}` hoặc `/debug {error}` |
|
|
105
|
-
| /review-code | `/dev-smoke-test {UC-ID}` hoặc tạo PR |
|
|
106
|
-
| /dev-smoke-test | Tạo PR và link tới ticket |
|
|
107
|
-
| /validate-traces | **Cờ 🔴 trước (chặn PR):** SEAM_UNWIRED → nối binding sang class thật, xoá/thay stub · STUB_UNRESOLVED → `/generate-code {owner_uc}` (lấp logic tại chỗ + xoá hàm song song) · ORPHANED/TRACE_ORPHAN → quyết định thủ công (xoá code+test, đưa scenario trở lại `.feature`, hoặc sửa `sc_id` của tag). **Rồi:** DRIFT/UNTRACKED → `/generate-code {UC-ID}` · BDD_DRIFT → `/generate-code {feature-file}` · tech-doc lỗi thời vs BDD → `/generate-tech-docs` → `/review-tech-docs` · PRD drift → `/generate-bdd {prd-file}` · GAP → `/dev-gen-test {UC-ID}`. **Chỉ tạo PR khi mọi cờ 🔴 = 0** |
|
|
108
|
-
| /fix-bug | `/dev-run-test {UC-ID}` (dev_selftest vừa reset về not_run) → tạo PR; nếu fix một `{BUG-ID}` → QC chạy `/qc-run-test {UC-ID}` để verify + đóng bug |
|
|
109
|
-
| /debug | `/fix-bug {ticket-id}` nếu cần sửa |
|
|
110
|
-
| /report-bug | Gửi cho dev (`/fix-bug {BUG-ID}`); nếu thiếu coverage → `/propose-scenario {UC-ID}` |
|
|
111
|
-
| /propose-scenario | **Case A** (thiếu scenario cho AC có sẵn) → báo PO/Dev review trong `feedback/bdd-proposals/`; `/generate-bdd` tự chèn khi `Status: accepted`. **Case B** (requirement mới) → `feedback/prd-change-requests/` — PO phải đưa vào PRD trước, KHÔNG tự vào BDD được; `/validate-traces` nhắc lại kèm số ngày chờ chừng nào `Status: Open` |
|
|
112
|
-
| /learn | Tiếp tục làm việc — lesson áp dụng ở lệnh kế tiếp |
|
|
113
|
-
| /sync | `/validate-traces` để xem độ phủ đầy đủ; xử lý mọi `📥 tester feedback` được nêu |
|
|
114
|
-
| /update-framework | Review `git diff .agent/`, commit; `/sync` để đồng bộ nội dung dự án |
|
|
115
|
-
|
|
116
|
-
Định dạng footer như sau:
|
|
117
|
-
```
|
|
118
|
-
---
|
|
119
|
-
Status : {badge}
|
|
120
|
-
{khối Output Artifacts}
|
|
121
|
-
Pipeline : Discovery → PRD → [BDD ◀ bạn ở đây] → Tech Design → Code → Dev Self-Check → QC → Trace Audit
|
|
122
|
-
(lệnh review) Vòng review: [① phân tích ◀] → ② Review Board → ③ --resume
|
|
123
|
-
Next : {lệnh gợi ý kèm ví dụ tham số}
|
|
124
|
-
```
|
|
125
|
-
*(Bỏ dòng `Pipeline` cho các lệnh xuyên suốt liệt kê ở trên.)*
|
package/steps/review-fanout.md
DELETED
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
# Review Fan-Out toàn diện + Hội tụ về độ đầy đủ
|
|
2
|
-
|
|
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
|
-
|
|
9
|
-
Lệnh gọi cung cấp hai thứ bắt buộc + hai tuỳ chọn:
|
|
10
|
-
- **DIMENSIONS** — danh sách các chiều review để fan out
|
|
11
|
-
(`/refine-prd` → 3 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
|
-
- **GRANULARITY** *(tuỳ chọn, mặc định `auto`)* — `auto`: chọn độ mịn fan-out theo bảng ngưỡng kích thước ở Phase 1 (hành vi cũ). `per-uc`: **LUÔN** fan-out theo từng UC, **bỏ qua ngưỡng** — dùng cho review cần độ đầy đủ cao (`/refine-prd` truyền cái này để lần đầu đã quét sâu). Lệnh không truyền → `auto` → hành vi không đổi.
|
|
14
|
-
- **CHANGED_SCOPE** *(tuỳ chọn)* — danh sách UC/section đã thay đổi (review **delta**). Nếu được truyền, Phase 1 chỉ fan-out trên các phạm vi này + PRD-global; Phase 2 critic vẫn quét **toàn doc** làm lưới an toàn. Không truyền → quét toàn bộ như thường.
|
|
15
|
-
|
|
16
|
-
> **Bỏ qua ở chế độ sub-agent:** Nếu Gate Bước 0 đã set `_agent_mode: true`, toàn bộ
|
|
17
|
-
> quy trình này bị **bỏ qua** — orchestrator đã chạy sẵn một dimension/UC cho mỗi
|
|
18
|
-
> 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.
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Phase 1 — Quét dimension song song
|
|
23
|
-
|
|
24
|
-
**Bao nhiêu sub-agent:** *số lượng* agent không phải là đòn bẩy độ đầy đủ — bề rộng được
|
|
25
|
-
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 đề),
|
|
26
|
-
còn *độ sâu* thuộc về vòng lặp critic ở Phase 2.
|
|
27
|
-
|
|
28
|
-
**Nếu `GRANULARITY = per-uc`:** **bỏ qua bảng ngưỡng dưới đây**, luôn dùng độ mịn **DIMENSION × phạm vi UC** (kể cả PRD nhỏ) — đảm bảo quét sâu, không bỏ sót ngay lần đầu. (Cái giá: nhiều agent hơn cho PRD nhỏ — chấp nhận để lần đầu đầy đủ.)
|
|
29
|
-
|
|
30
|
-
**Nếu `GRANULARITY = auto`** (mặc định): chọn **độ mịn fan-out** theo kích thước target, tái dùng ngưỡng của `steps/spawn-agent.md`:
|
|
31
|
-
|
|
32
|
-
| Kích thước target | Độ mịn | Số agent |
|
|
33
|
-
|-------------|-------------|-------------|
|
|
34
|
-
| ≤ 3 UC **và** ≤ 300 dòng | một agent cho mỗi DIMENSION trên cả file | = số dimension |
|
|
35
|
-
| > 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) |
|
|
36
|
-
|
|
37
|
-
Độ 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
|
|
38
|
-
UC duy nhất — chính là điều ngăn bỏ sót trên các PRD lớn.
|
|
39
|
-
|
|
40
|
-
> **Các section global (không thuộc UC) — bắt buộc ở chế độ `DIMENSION × UC`.** Mỗi agent per-UC chỉ
|
|
41
|
-
> thấy một UC, nên các section toàn-PRD không thuộc UC nào (scope, success metric,
|
|
42
|
-
> problem statement, terminology, glossary, changelog) sẽ không được quét. Khi nào
|
|
43
|
-
> 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
|
|
44
|
-
> `uc_id: ""`) bên cạnh danh sách UC. Nên số agent tự nhiên là `dimensions × (UCs + 1)`.
|
|
45
|
-
> (Không cần ở chế độ whole-file — ở đó mỗi agent đã thấy các section global rồi.)
|
|
46
|
-
|
|
47
|
-
### Agent cap — gom batch các UC khi fan-out quá rộng
|
|
48
|
-
|
|
49
|
-
`dimensions × (UCs + 1)` có thể bùng nổ trên PRD lớn (vd 6 check × (8 UC + 1) = 54
|
|
50
|
-
agent). Giới hạn mỗi wave ở **`AGENT_CAP = 12`** agent và gom batch các phạm vi UC cho vừa:
|
|
51
|
-
|
|
52
|
-
1. Dựng danh sách phạm vi = `[UC1, UC2, …, UCn, PRD-global]` (độ dài `UCs + 1`).
|
|
53
|
-
- **Nếu `CHANGED_SCOPE` được truyền (review delta):** danh sách phạm vi = `[các UC trong CHANGED_SCOPE] + [PRD-global]` (chỉ các UC đã đổi + global), KHÔNG phải tất cả UC. Số agent tụt theo đó.
|
|
54
|
-
2. Tính số-phạm-vi-mỗi-bucket: `groups = max(1, floor(AGENT_CAP / dimensions))`.
|
|
55
|
-
- Nếu `groups ≥ UCs + 1` → không cần batch, chạy một agent cho mỗi `DIMENSION × scope`.
|
|
56
|
-
- 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
|
|
57
|
-
(giữ `PRD-global` ở bucket riêng nếu vừa; nếu không thì gắn vào bucket cuối).
|
|
58
|
-
Mỗi agent khi đó xử lý **một DIMENSION trên một bucket UC**.
|
|
59
|
-
3. Kích thước wave kết quả = `dimensions × groups ≤ AGENT_CAP`.
|
|
60
|
-
|
|
61
|
-
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ả
|
|
62
|
-
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
|
|
63
|
-
concurrency nhiều hơn, giảm để tiết kiệm token. Chế độ whole-file (≤ 3 UC) không bao giờ chạm cap.
|
|
64
|
-
|
|
65
|
-
Spawn các sub-agent đã chọn bằng Agent tool (gửi trong một message duy nhất để chúng
|
|
66
|
-
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ó
|
|
67
|
-
chỉ qua **một** dimension duy nhất — độ phủ sâu hơn một session phải tung hứng mọi
|
|
68
|
-
dimension cùng lúc (tránh lost-in-the-middle).
|
|
69
|
-
|
|
70
|
-
Template prompt cho sub-agent (điền vào các ngoặc):
|
|
71
|
-
|
|
72
|
-
```
|
|
73
|
-
You are a {DIMENSION_NAME} reviewer. Read the full target file at {target_file}.
|
|
74
|
-
Scope: review ONLY through the {DIMENSION_NAME} lens/check — {DIMENSION_DESCRIPTION}.
|
|
75
|
-
Be exhaustive: scan every section, every UC, every AC/BR/scenario. Do not stop early.
|
|
76
|
-
Project context (terminology, entities, architecture):
|
|
77
|
-
{slim_context — banned terms, canonical entities, layer order, domains}
|
|
78
|
-
|
|
79
|
-
Return a JSON array of findings, each:
|
|
80
|
-
{ "dimension": "{DIMENSION_NAME}", "severity": "critical|major|minor",
|
|
81
|
-
"section": "...", "uc_id": "...", "quote": "<verbatim ≤120 chars>",
|
|
82
|
-
"finding": "...", "suggestion": "...", "auto_fixable": true|false }
|
|
83
|
-
Return [] if this dimension is clean. Return ONLY the JSON array.
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
Gom mảng findings của mọi sub-agent vào một danh sách hợp nhất `ALL_FINDINGS`.
|
|
87
|
-
|
|
88
|
-
---
|
|
89
|
-
|
|
90
|
-
## Phase 2 — Vòng lặp hội tụ critic độ-đầy-đủ
|
|
91
|
-
|
|
92
|
-
Đâ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
|
|
93
|
-
mới**, hoặc tới cap cứng **3 vòng**, cái nào đến trước:
|
|
94
|
-
|
|
95
|
-
> **Lưu ý delta:** kể cả khi `CHANGED_SCOPE` giới hạn Phase 1 vào các UC đã đổi, completeness-critic ở Phase 2 **vẫn đọc TOÀN bộ doc** — đây là lưới an toàn bắt các vấn đề mà một fix ở UC đã đổi có thể làm lộ ra ở chỗ khác.
|
|
96
|
-
|
|
97
|
-
1. Spawn một sub-agent **completeness-critic** bằng Agent tool. Cho nó:
|
|
98
|
-
- toàn bộ target file (`{target_file}`),
|
|
99
|
-
- danh sách findings đã ghi nhận dưới dạng **slim JSON** — chỉ 3 fields cốt lõi
|
|
100
|
-
đủ để critic nhận ra trùng lặp (không cần `quote`, `suggestion`, `auto_fixable`, `severity`):
|
|
101
|
-
```json
|
|
102
|
-
[
|
|
103
|
-
{ "uc_id": "...", "section": "...", "finding": "..." },
|
|
104
|
-
...
|
|
105
|
-
]
|
|
106
|
-
```
|
|
107
|
-
Nếu `ALL_FINDINGS` vượt 60 items, rút gọn `finding` xuống còn 80 ký tự đầu mỗi item.
|
|
108
|
-
- cùng slim context (banned terms, canonical entities, layer order, domains).
|
|
109
|
-
Prompt nó:
|
|
110
|
-
```
|
|
111
|
-
Here is a document and a list of issues already found. Read the WHOLE document.
|
|
112
|
-
List ONLY real, additional issues NOT already in the list — gaps, ambiguities,
|
|
113
|
-
contradictions, missing edge/negative paths, coverage holes, terminology drift,
|
|
114
|
-
structural omissions, and any issue that a fix to an existing finding would expose.
|
|
115
|
-
ALSO flag ROLE-BOUNDARY / altitude violations (you are NOT limited to adding detail):
|
|
116
|
-
content sitting in the WRONG section — detailed mechanism (retry counts, timeouts, flag
|
|
117
|
-
names/owners, error branches) written INSIDE an acceptance criterion or a scope line
|
|
118
|
-
instead of the Business Rule/Logic section; an AC that merely restates its referenced BR
|
|
119
|
-
(same content, converged); a term definition crammed into In/Out Scope. For these, the
|
|
120
|
-
suggestion must be to MOVE the detail to its proper section (AC keeps only the observable
|
|
121
|
-
outcome + BR ref) — NOT to delete it, and NOT to add more detail.
|
|
122
|
-
Do NOT repeat anything already listed. Return the same finding JSON shape, or [] if
|
|
123
|
-
nothing new.
|
|
124
|
-
```
|
|
125
|
-
2. Thêm bất kỳ finding thực sự mới (chưa có trong `ALL_FINDINGS`) vào danh sách.
|
|
126
|
-
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.
|
|
127
|
-
4. Dừng khi bộ đếm dry-round đạt 2, hoặc sau tổng cộng 3 vòng.
|
|
128
|
-
|
|
129
|
-
Ghi lại `convergence_rounds` (số vòng critic đã chạy) cho report.
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
## Phase 3 — Dedup, giải quyết xung đột, merge
|
|
134
|
-
|
|
135
|
-
Các sub-agent chạy **mù với nhau** (độc lập = độ phủ đa dạng). Chúng không bao giờ
|
|
136
|
-
trao đổi hay điều hoà giữa chúng — mọi xử lý trùng/xung đột diễn ra **ở đây trong
|
|
137
|
-
orchestrator**, nơi thấy toàn bộ tập findings.
|
|
138
|
-
|
|
139
|
-
1. **Khử trùng lặp** `ALL_FINDINGS`: hai finding là trùng nếu cùng nhắm tới cùng
|
|
140
|
-
`section` + `uc_id` và mô tả cùng một vấn đề gốc. Giữ cái có `suggestion`
|
|
141
|
-
phong phú hơn; nếu khác nhau về severity, giữ severity **cao hơn**.
|
|
142
|
-
2. **Giải quyết xung đột** — nhóm các finding còn lại theo `section` + `uc_id` và kiểm tra
|
|
143
|
-
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ỗ):
|
|
144
|
-
- 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.
|
|
145
|
-
- Nếu chúng **loại trừ lẫn nhau** → phát ra **một** finding nêu cả hai phương án
|
|
146
|
-
và set `auto_fixable: false` với `status: "needs_discussion"` (PRD) /
|
|
147
|
-
`status: "pending"` (review) để con người chọn — không bao giờ âm thầm bỏ một bên.
|
|
148
|
-
- 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
|
|
149
|
-
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ệ.
|
|
150
|
-
3. **Sắp xếp** theo severity (critical → major → minor), rồi theo thứ tự `section` trong file.
|
|
151
|
-
4. **Gán ID ổn định** `F001, F002, …` theo thứ tự đã sắp đó.
|
|
152
|
-
5. Map `dimension` của mỗi finding vào field schema của lệnh
|
|
153
|
-
(`lens` cho `/refine-prd`; `check_id` cho `/review-context`).
|
|
154
|
-
6. Ghi **một** file findings duy nhất theo FINDINGS SCHEMA mà lệnh định nghĩa.
|
|
155
|
-
|
|
156
|
-
Trong report cuối của lệnh, thêm một dòng:
|
|
157
|
-
```
|
|
158
|
-
Convergence: {convergence_rounds} vòng critic — file findings đã đầy đủ; chạy lại sẽ lòi ra 0 vấn đề mới.
|
|
159
|
-
```
|
package/steps/spawn-agent.md
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
# Pattern điều phối Sub-Agent
|
|
2
|
-
|
|
3
|
-
Dùng bởi các lệnh nặng khi target vượt ngưỡng phức tạp.
|
|
4
|
-
Session chính trở thành một **orchestrator nhẹ** — chỉ điều phối.
|
|
5
|
-
Mỗi đơn vị công việc chạy trong sub-agent riêng với context window mới.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Ngưỡng phức tạp
|
|
10
|
-
|
|
11
|
-
| Tín hiệu | Ngưỡng | Hành động |
|
|
12
|
-
|--------|-----------|--------|
|
|
13
|
-
| Số UC trong PRD | > 3 UC | spawn 1 agent cho mỗi UC |
|
|
14
|
-
| Độ dài PRD | > 300 dòng | spawn agent bất kể số UC |
|
|
15
|
-
|
|
16
|
-
Nếu vượt **một trong hai** ngưỡng → chuyển sang chế độ orchestration.
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## Các bước của Orchestrator (session chính)
|
|
21
|
-
|
|
22
|
-
### Bước A — Dựng context gọn
|
|
23
|
-
|
|
24
|
-
Chỉ trích xuất những gì sub-agent cần — KHÔNG truyền nguyên CLAUDE.md hay nguyên business-dictionary:
|
|
25
|
-
|
|
26
|
-
```json
|
|
27
|
-
{
|
|
28
|
-
"project_name": "{project.name}",
|
|
29
|
-
"tech_stack": {
|
|
30
|
-
"language": "{tech_stack.language}",
|
|
31
|
-
"framework": "{tech_stack.framework}",
|
|
32
|
-
"build_tool": "{tech_stack.build_tool}",
|
|
33
|
-
"test_framework": "{tech_stack.test_framework}",
|
|
34
|
-
"database": "{tech_stack.database}",
|
|
35
|
-
"module": "{tech_stack.module}"
|
|
36
|
-
},
|
|
37
|
-
"conventions": {
|
|
38
|
-
"build_command": "{conventions.build_command}",
|
|
39
|
-
"commit_format": "{conventions.commit_format}"
|
|
40
|
-
},
|
|
41
|
-
"paths": {
|
|
42
|
-
"specs_dir": "{paths.specs_dir}",
|
|
43
|
-
"trace_dir": "{paths.trace_dir}",
|
|
44
|
-
"tech_docs_dir": "{paths.tech_docs_dir}"
|
|
45
|
-
},
|
|
46
|
-
"architecture_summary": "<3-5 gạch đầu dòng: thứ tự layer + quy tắc chính>",
|
|
47
|
-
"domains": ["{domain1}", "{domain2}"],
|
|
48
|
-
"banned_terms": ["{term1}", "{term2}"]
|
|
49
|
-
}
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### Bước B — Trích danh sách UC
|
|
53
|
-
|
|
54
|
-
Quét PRD target tìm các heading `#### {TICKET-ID}-UC{N}:`.
|
|
55
|
-
Dựng list: `[ { uc_id, uc_name, line_start, line_end } ]`
|
|
56
|
-
|
|
57
|
-
### Bước C — Công bố kế hoạch
|
|
58
|
-
|
|
59
|
-
```
|
|
60
|
-
Phát hiện độ phức tạp cao — {N} UC / {L} dòng trong {prd_file}
|
|
61
|
-
Đang spawn {N} sub-agent (1 cho mỗi UC)...
|
|
62
|
-
Agent 1 → {TICKET-ID}-UC1: {tên UC}
|
|
63
|
-
Agent 2 → {TICKET-ID}-UC2: {tên UC}
|
|
64
|
-
...
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### Bước D — Spawn một sub-agent cho mỗi UC
|
|
68
|
-
|
|
69
|
-
Dựng payload và gọi Agent tool cho từng UC:
|
|
70
|
-
|
|
71
|
-
```json
|
|
72
|
-
{
|
|
73
|
-
"_agent_mode": true,
|
|
74
|
-
"command": "generate-bdd",
|
|
75
|
-
"uc_id": "{TICKET-ID}-UC{N}",
|
|
76
|
-
"target_file": "{đường dẫn tuyệt đối tới PRD hoặc feature file}",
|
|
77
|
-
"uc_section": { "line_start": {N}, "line_end": {N} },
|
|
78
|
-
"context": { "<context gọn từ Bước A>" },
|
|
79
|
-
"active_platform": "{web|app|system — platform orchestrator đã chọn ở Platform Selection}",
|
|
80
|
-
"design_coverage": { "<Screen States + AC-UI behavioral orchestrator đã trích ở 'Design Spec — Gate & Load' (B1); rỗng nếu BE / không có design-spec>" }
|
|
81
|
-
}
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
> **Truyền state orchestrator đã phân giải (quan trọng):** orchestrator (session chính) đã chạy các Guard + chọn platform + nạp design-spec MỘT LẦN *trước* khi spawn. Phải kèm `active_platform` và `design_coverage` vào payload để sub-agent áp đúng (đặc biệt phủ Screen States + AC-UI cho FE/App). KHÔNG kèm → sub-agent sinh BDD thiếu phần design (PRD lớn mất B1).
|
|
85
|
-
|
|
86
|
-
> **Phạm vi lệnh**: Chỉ `/generate-bdd` khởi động chế độ orchestration. `/generate-code` và `/dev-gen-test` có thể chạy như sub-agent (chúng tôn trọng `_agent_mode: true` từ Gate Bước 0), nhưng không spawn thêm sub-agent — phạm vi của chúng vốn đã là một UC duy nhất.
|
|
87
|
-
|
|
88
|
-
Serialize JSON này và truyền làm `$ARGUMENTS` khi gọi lệnh sub-agent.
|
|
89
|
-
|
|
90
|
-
### Bước E — Thu thập và merge kết quả
|
|
91
|
-
|
|
92
|
-
Mỗi sub-agent trả về:
|
|
93
|
-
```json
|
|
94
|
-
{
|
|
95
|
-
"uc_id": "{TICKET-ID}-UC{N}",
|
|
96
|
-
"files_created": ["path/to/file1", "path/to/file2"],
|
|
97
|
-
"status": "success | error",
|
|
98
|
-
"errors": []
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
Merge vào một report duy nhất (theo định dạng report-footer.md).
|
|
103
|
-
Nếu có sub-agent lỗi → liệt kê rõ ràng và đề xuất chạy lại riêng UC đó.
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
## Điểm vào của Sub-Agent (các lệnh được gọi)
|
|
108
|
-
|
|
109
|
-
Khi `gate.md Bước 0` phát hiện `_agent_mode: true`:
|
|
110
|
-
|
|
111
|
-
1. Parse toàn bộ payload từ `$ARGUMENTS`
|
|
112
|
-
2. **Bỏ qua context-loader.md** — dùng trực tiếp `payload.context`
|
|
113
|
-
3. **Chỉ giới hạn ở `payload.uc_id`** — không xử lý các UC khác trong file
|
|
114
|
-
4. Chỉ đọc section PRD giữa `payload.uc_section.line_start` và `line_end`
|
|
115
|
-
5. **Dùng state orchestrator đã phân giải:** `active_platform` = `payload.active_platform`; `design_coverage` = `payload.design_coverage`. **KHÔNG chạy lại** các Guard (PRD approved / Design-Spec) hay tự nạp lại design-spec / hỏi platform — orchestrator đã làm một lần ở session chính.
|
|
116
|
-
6. Thực thi logic thường của lệnh cho riêng UC này (dùng `design_coverage` từ payload để phủ Screen States + AC-UI)
|
|
117
|
-
7. Trả về JSON kết quả có cấu trúc (định dạng Bước E ở trên)
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
## Tiết kiệm Context Window
|
|
122
|
-
|
|
123
|
-
| Chế độ | Nạp gì mỗi session |
|
|
124
|
-
|------|------------------------|
|
|
125
|
-
| Single session (≤ 3 UC) | Full context + full PRD + tất cả UC |
|
|
126
|
-
| Orchestrator | Context gọn + chỉ các heading UC |
|
|
127
|
-
| Mỗi sub-agent | Context gọn + **chỉ 1 section UC** |
|
|
128
|
-
|
|
129
|
-
PRD càng lớn, mức tiết kiệm trên mỗi sub-agent càng nhiều.
|
package/steps/trace-mirror.md
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# Làm mới panel mirror của Living Docs *(local)*
|
|
2
|
-
|
|
3
|
-
> **Hai vị trí, HAI TÊN KHÁC NHAU — đọc trước khi sửa gì ở đây.**
|
|
4
|
-
>
|
|
5
|
-
> | Đường dẫn | Vai trò | Git |
|
|
6
|
-
> |---|---|---|
|
|
7
|
-
> | `{paths.trace_dir}` (`.trace/` hoặc `{spec_source}/.trace/`) | **AUTHORITATIVE** — TSV + `trace-history.jsonl`. Không regenerate được. | **PHẢI commit** |
|
|
8
|
-
> | `./.trace-mirror/` ở gốc workspace hiện tại | **MIRROR** — bản sao tiện cho panel VS Code. Sinh lại được bất cứ lúc nào. | **Luôn gitignore** |
|
|
9
|
-
>
|
|
10
|
-
> Trước v0.4.3 cả hai đều tên `.trace`, nên một luật gitignore theo tên có thể **xoá sạch sổ gốc**
|
|
11
|
-
> khi dev mở thẳng spec repo làm workspace (lúc đó hai path bằng nhau). Hai tên khác nhau làm
|
|
12
|
-
> luật git đọc được bằng mắt và **không còn ca nhập nhằng nào**: `.trace-mirror/` không bao giờ
|
|
13
|
-
> commit, `.trace/` không bao giờ gitignore.
|
|
14
|
-
|
|
15
|
-
## Khi nào CÓ mirror
|
|
16
|
-
|
|
17
|
-
Mirror chỉ tồn tại khi **`{paths.trace_dir}` nằm NGOÀI workspace hiện tại** — panel đọc từ workspace đang mở nên cần một bản sao ở đây.
|
|
18
|
-
|
|
19
|
-
| Tình huống | `{paths.trace_dir}` | Có mirror? |
|
|
20
|
-
|---|---|---|
|
|
21
|
-
| Single-service | `./.trace` — **trong** workspace | ❌ Không. Panel đọc thẳng `.trace/trace-report.json`. Bỏ qua cả file này. |
|
|
22
|
-
| Dev mở thẳng **spec repo** | `./.trace` — **trong** workspace | ❌ Không. Như trên. |
|
|
23
|
-
| Umbrella + `spec_source`, dev đứng ở umbrella hoặc service submodule | `{spec_source}/.trace` — **ngoài** workspace | ✅ Có |
|
|
24
|
-
| Umbrella legacy (không `spec_source`) | `.trace` theo từng service | ✅ Có |
|
|
25
|
-
|
|
26
|
-
Quy tắc một dòng: **phân giải `panel_mirror = ./.trace-mirror` ở gốc workspace hiện tại; nếu `{paths.trace_dir}` đã nằm trong workspace này thì bỏ qua toàn bộ bước mirror.**
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
Sau khi cập nhật TSV authoritative tại `{paths.trace_dir}`:
|
|
31
|
-
|
|
32
|
-
**Khi `setup.spec_source` được đặt (trace gộp — trường hợp phổ biến):**
|
|
33
|
-
`{paths.trace_dir}` phân giải về `{spec_source}/.trace` — vị trí authoritative duy nhất.
|
|
34
|
-
Lệnh này chạy từ `service_root`, nên thao tác ghi là **liên-repo vào spec submodule**;
|
|
35
|
-
commit/push spec submodule cho lần cập nhật trace (giống như `feedback/`).
|
|
36
|
-
|
|
37
|
-
1. Phân giải `panel_mirror = ./.trace-mirror` tại **gốc workspace hiện tại**.
|
|
38
|
-
2. Nếu `{paths.trace_dir}` **không** nằm trong workspace hiện tại, copy mỗi
|
|
39
|
-
`{UC-ID}-{platform}.tsv` vừa cập nhật → `{panel_mirror}/{UC-ID}-{platform}.tsv` (tạo thư mục; ghi đè).
|
|
40
|
-
Không namespace theo service — chỉ có một bộ trace; service sở hữu được mang ở
|
|
41
|
-
**cột `service` (cột 23)** của chính từng row, do `/generate-bdd` ghi từ `@trace.service`.
|
|
42
|
-
3. **KHÔNG copy `trace-history.jsonl`.** Nó là dữ liệu tích luỹ, không phải thứ sinh lại được —
|
|
43
|
-
nhân bản nó ra một thư mục gitignore là tạo hai lịch sử lệch nhau rồi mất bản thật.
|
|
44
|
-
|
|
45
|
-
**Legacy (không có `spec_source` — trace theo service):**
|
|
46
|
-
Copy mỗi `{UC-ID}-{platform}.tsv` vừa cập nhật → `{panel_mirror}/{service-name}/{UC-ID}-{platform}.tsv`
|
|
47
|
-
(namespace theo `active_service`).
|
|
48
|
-
|
|
49
|
-
Cách này giữ panel Living Docs của workspace đang mở luôn mới **giữa các lần sync** — nó chỉ là
|
|
50
|
-
một **mirror tiện lợi cục bộ**. File `trace-report.json` đã merge (canonical, trong
|
|
51
|
-
`{spec_source}/.living-docs/`) được build lại bởi `/sync` hoặc `/validate-traces`. Với các lệnh
|
|
52
|
-
được orchestrate, làm việc này một lần trong orchestrator sau khi tất cả sub-agent trả về — không phải
|
|
53
|
-
bên trong từng sub-agent.
|