@educa-corp/sdd-framework 0.9.2 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/build.js +11 -0
- package/bin/qc-base-map.json +119 -49
- package/bin/self-check.js +30 -0
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/qc-analyze.md +85 -75
- package/core/commands/qc-design-test.md +144 -25
- package/core/commands/qc-plan.md +40 -7
- package/core/commands/qc-review.md +74 -7
- package/core/commands/qc-run-test.md +21 -1
- package/core/commands/setup-ai-first.md +5 -5
- package/core/commands/update-framework.md +1 -1
- package/core/commands/validate-traces.md +1 -1
- package/core/modules/qc-playwright/stack-profile.yaml +3 -3
- package/core/rules/workflow.md +1 -1
- package/core/skills/qc/qa-analyst/DOC_GAP.template.md +47 -17
- package/core/skills/qc/qa-analyst/acceptance-criteria.md +1 -1
- package/core/skills/qc/qa-analyst/business-rules.md +2 -2
- package/core/skills/qc/qa-analyst/data-flow.md +2 -2
- package/core/skills/qc/qa-analyst/spec-breakdown.md +4 -4
- package/core/skills/qc/qa-analyst/spec-issue-reporter.md +14 -2
- package/core/skills/qc/qa-designer/api/auth-chain.md +155 -0
- package/core/skills/qc/qa-designer/api/auth-sequence.md +75 -0
- package/core/skills/qc/qa-designer/api/common-headers.md +61 -0
- package/core/skills/qc/qa-designer/api/crud-sequence.md +122 -0
- package/core/skills/qc/qa-designer/api/endpoint.md +231 -0
- package/core/skills/qc/qa-designer/api/http-status-codes.md +102 -0
- package/core/skills/qc/qa-designer/e2e/journey.md +13 -8
- package/core/skills/qc/qa-designer/exploratory/charter.md +2 -0
- package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +7 -4
- package/core/skills/qc/qa-designer/functional/api.md +87 -18
- package/core/skills/qc/qa-designer/functional/gui-feature.md +12 -9
- package/core/skills/qc/qa-designer/functional/gui-screen.md +12 -10
- package/core/skills/qc/qa-designer/integration/api.md +12 -5
- package/core/skills/qc/qa-designer/integration/db.md +12 -6
- package/core/skills/qc/qa-designer/integration/gui.md +12 -5
- package/core/skills/qc/qa-designer/integration/kafka.md +12 -5
- package/core/skills/qc/qa-designer/non-functional.md +12 -5
- package/core/skills/qc/qa-designer/shared/action-keywords-glossary.md +91 -0
- package/core/skills/qc/qa-designer/shared/duplicate-check-procedure.md +105 -0
- package/core/skills/qc/qa-designer/shared/implicit-scenarios.md +22 -0
- package/core/skills/qc/qa-designer/shared/precision-rules.md +198 -0
- package/core/skills/qc/qa-designer/shared/read-doc-gap-inputs.md +25 -0
- package/core/skills/qc/qa-designer/shared/skill-decision-tree.md +93 -0
- package/core/skills/qc/qa-designer/shared/tc-metadata-format.md +243 -0
- package/core/skills/qc/qa-planner/risk-model.md +1 -1
- package/core/skills/qc/qa-planner/test-plan.md +24 -13
- package/core/skills/qc/qa-reviewer/script/e2e.md +9 -1
- package/core/skills/qc/qa-reviewer/script/exploratory.md +9 -1
- package/core/skills/qc/qa-reviewer/script/functional.md +9 -1
- package/core/skills/qc/qa-reviewer/script/integration.md +9 -1
- package/core/skills/qc/qa-reviewer/script/non-functional.md +9 -1
- package/core/skills/qc/qa-reviewer/shared/read-doc-gap-inputs.md +26 -0
- package/core/skills/qc/qa-reviewer/shared/review-check-groups.md +207 -0
- package/core/skills/qc/qa-reviewer/shared/review-file-template.md +228 -0
- package/core/skills/qc/qa-reviewer/test-case/e2e.md +71 -13
- package/core/skills/qc/qa-reviewer/test-case/exploratory.md +53 -4
- package/core/skills/qc/qa-reviewer/test-case/functional.md +63 -15
- package/core/skills/qc/qa-reviewer/test-case/integration.md +64 -12
- package/core/skills/qc/qa-reviewer/test-case/non-functional.md +72 -13
- package/core/skills/qc/qa-runner/e2e.md +1 -1
- package/core/skills/qc/qa-runner/exploratory/session.md +1 -1
- package/core/steps/context-loader.md +1 -1
- package/core/steps/qc-scope.md +119 -0
- package/core/templates/project-context.yaml +3 -1
- package/docs/02-concepts/pipeline-steps/08-qc-automation.md +1 -1
- package/docs/02-concepts/pipeline-steps/09-validate-traces.md +1 -1
- package/docs/04-reference/configuration.md +146 -146
- package/docs/04-reference/trace-schema.md +1 -1
- package/docs/explain/00-setup-ai-first.md +1 -1
- package/docs/explain/15-qc-analyze.md +1 -1
- package/docs/explain/16-qc-plan.md +1 -1
- package/docs/explain/17-qc-design-test.md +1 -1
- package/docs/plans/qc-implementation-log.md +288 -5
- package/docs/plans/qc-sync-command.md +2 -1
- package/package.json +1 -1
- package/scripts/migrate-qc-docs.js +261 -0
|
@@ -1,146 +1,146 @@
|
|
|
1
|
-
[← Reference](./) · [Concepts › Architecture](../02-concepts/architecture.md)
|
|
2
|
-
|
|
3
|
-
# Reference · Configuration
|
|
4
|
-
|
|
5
|
-
> Hai file cấu hình chính. `/update-framework` **không** đụng chúng — đây là nội dung của bạn.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 1. `project-context.yaml`
|
|
10
|
-
|
|
11
|
-
**Single source of truth** cho paths/mode/routing. Nằm ở `.agent/project-context.yaml`, sinh từ `templates/project-context.yaml` qua token substitution khi init. Mọi workflow đọc file này để biết **WHERE** tìm mọi thứ.
|
|
12
|
-
|
|
13
|
-
### Cấu trúc chính
|
|
14
|
-
|
|
15
|
-
```yaml
|
|
16
|
-
project:
|
|
17
|
-
name: "..."
|
|
18
|
-
description: "..."
|
|
19
|
-
|
|
20
|
-
paths:
|
|
21
|
-
specs_dir: "specs" # gốc mọi spec artifact
|
|
22
|
-
trace_dir: ".trace" # trace state .tsv
|
|
23
|
-
qc_dir: "docs" # working docs của QC
|
|
24
|
-
qc_skills_dir: ".agent/skills/qc" # nơi qc-* nạp skill (override sang repo QC riêng)
|
|
25
|
-
refinement_dir: ".agent/review" # findings review
|
|
26
|
-
|
|
27
|
-
setup:
|
|
28
|
-
mode: single | umbrella
|
|
29
|
-
spec_source: "..." # (umbrella) spec repo dùng chung
|
|
30
|
-
|
|
31
|
-
services: # (multi/umbrella) map domain → service
|
|
32
|
-
# dạng phẳng: {domain}: { path, module }
|
|
33
|
-
# dạng map-theo-platform: {domain}: { web: {path,module}, app: {...}, system: {...} }
|
|
34
|
-
|
|
35
|
-
conventions:
|
|
36
|
-
build_command: "..." # lệnh build verify (≤3 retry)
|
|
37
|
-
test_command: "..."
|
|
38
|
-
|
|
39
|
-
tech_stack:
|
|
40
|
-
database: "..." # vd PostgreSQL
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### Bố cục feature-package (path resolution)
|
|
44
|
-
|
|
45
|
-
Mọi artifact của một feature nằm chung `specs/{domain}/{prd-slug}/`:
|
|
46
|
-
|
|
47
|
-
```
|
|
48
|
-
specs/{domain}/{prd-slug}/
|
|
49
|
-
├── {TICKET-ID}-{prd-slug}.md # PRD (file .md duy nhất ở gốc)
|
|
50
|
-
├── bdd/{web|app|system}/*.feature # BDD — subfolder platform LUÔN có
|
|
51
|
-
├── tech-docs/{TICKET-ID}-tech-design.md # MỘT doc gộp cho cả PRD
|
|
52
|
-
├── design-spec/{TICKET-ID}*.md # FE/App
|
|
53
|
-
└── changelog/{TICKET-ID}-{prd-slug}.changelog.md # chỉ tạo khi changelog vượt 5 version
|
|
54
|
-
.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv # MỘT sổ / UC × platform (24 cột)
|
|
55
|
-
.trace/{domain}/{prd-slug}/_seams.tsv # sổ seam/stub — nguồn 2 cờ 🔴 chặn PR
|
|
56
|
-
.trace/trace-report.json # snapshot cho panel — GHI ĐÈ mỗi lần chạy
|
|
57
|
-
.trace/trace-history.jsonl # nhật ký append-only — PHẢI commit
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
- `{domain}` = segment đầu sau `specs_dir`.
|
|
61
|
-
- `{prd-slug}` = segment kế tiếp (folder feature-package) — **không** phải folder cha trực tiếp của file lồng sâu.
|
|
62
|
-
- **Segment `{platform}` không optional** — mọi mode, kể cả umbrella. `web` và `system` của cùng một UC là hai file khác nhau; bỏ segment thì chúng va tên và **ghi đè nhau**. Trace tách theo platform nên bố cục spec phải khớp.
|
|
63
|
-
*Project còn ở bố cục phẳng: `npx @educa-corp/sdd-framework --migrate-bdd-platform` (dry-run mặc định).*
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## 2. `CLAUDE.md` (phân tầng)
|
|
68
|
-
|
|
69
|
-
Instruction cho AI agent — AI *follow* file này thay vì *invent*.
|
|
70
|
-
|
|
71
|
-
| Tầng | Nội dung |
|
|
72
|
-
|------|----------|
|
|
73
|
-
| **root** `CLAUDE.md` | Luật chung dự án/umbrella |
|
|
74
|
-
| **overlay** `{service}/CLAUDE.md` | §2 kiến trúc & thứ tự layer & package strategy · §3 coding standards · §5 error handling — **theo stack** |
|
|
75
|
-
|
|
76
|
-
> Service overlay **thắng** root khi mâu thuẫn. context-loader nạp cả hai, đặt ở **cuối** context (Lost-in-the-Middle: "follow style này").
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
## 3. Single vs Umbrella
|
|
81
|
-
|
|
82
|
-
| | Single | Umbrella |
|
|
83
|
-
|---|--------|----------|
|
|
84
|
-
| `setup.mode` | `single` | `umbrella` |
|
|
85
|
-
| Spec ở đâu | Cùng repo | **Spec repo dùng chung** (`spec_source`) |
|
|
86
|
-
| Code ở đâu | Cùng repo | Service submodule (chỉ code + tooling) |
|
|
87
|
-
| Trace/feedback/findings | Cùng repo | Trong spec repo (một nơi authoritative) |
|
|
88
|
-
| Đồng bộ | — | `/sync` (pull + submodule + nổi feedback + Living Docs) |
|
|
89
|
-
|
|
90
|
-
Khi `spec_source` được đặt, **mọi** PRD/BDD/tech-doc/design-spec/`.trace`/`.agent/review`/`feedback` route về spec repo — vì đều là **artifact liên team**.
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## Vùng nào bị ghi đè khi update
|
|
95
|
-
|
|
96
|
-
`.agent/` là **mirror sinh ra**: `/update-framework` chạy `npx … --init`, và `--init` copy `core/` → `.agent/` **vô điều kiện**.
|
|
97
|
-
|
|
98
|
-
| Đường dẫn | Sửa được? | Vì sao |
|
|
99
|
-
|---|:---:|---|
|
|
100
|
-
| `CLAUDE.md` | ✅ | ngoài `.agent/` |
|
|
101
|
-
| `.agent/project-context.yaml` | ✅ | file **duy nhất trong `.agent/`** có guard: chỉ tạo nếu chưa tồn tại |
|
|
102
|
-
| `.agent/project-lessons.md` · `.agent/review/` | ✅ | không nằm trong `core/` nên nâng cấp không đụng |
|
|
103
|
-
| `specs/domain-knowledge/` · `.trace/` · `feedback/` | ✅ | ngoài `.agent/` |
|
|
104
|
-
| `.agent/commands` `steps` `rules` `skills` `hooks` `templates` `modules` | ❌ | copy từ repo framework, **ghi đè mỗi lần nâng cấp** |
|
|
105
|
-
|
|
106
|
-
**Nếu bạn đã sửa gì trong vùng ❌** — từ v0.4.2 `--init` tự cứu:
|
|
107
|
-
|
|
108
|
-
- bản cũ copy sang `.agent/.overwritten-{version}-{YYYYMMDD}/` (giữ nguyên cây thư mục)
|
|
109
|
-
- danh sách file bị ghi đè in ra ngay sau bước cài
|
|
110
|
-
- `.agent/.install-manifest.json` ghi hash của **đúng những gì lần cài trước đã viết** — nhờ đó lệnh phân biệt được *bạn sửa file* với *framework tự đổi file giữa hai version* (một phép so nội dung thuần sẽ flag cả hai và báo oan hàng chục file mỗi lần nâng cấp)
|
|
111
|
-
|
|
112
|
-
Thêm vào `.gitignore` của project:
|
|
113
|
-
|
|
114
|
-
```gitignore
|
|
115
|
-
.agent/.overwritten-*/
|
|
116
|
-
.agent/.install-manifest.json
|
|
117
|
-
.trace-mirror/ # bản sao cho panel VS Code — sinh lại được
|
|
118
|
-
.living-docs/ # report gộp — sinh lại được (đặt trong .gitignore của spec repo)
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
> ### ⚠️ `.trace/` **KHÔNG** được gitignore
|
|
122
|
-
>
|
|
123
|
-
> Đây là chỗ dễ mất dữ liệu nhất trong toàn framework.
|
|
124
|
-
>
|
|
125
|
-
> | Đường dẫn | Vai trò | Git |
|
|
126
|
-
> |---|---|---|
|
|
127
|
-
> | `{paths.trace_dir}` (`.trace/`) | **AUTHORITATIVE** — `.tsv` + `trace-history.jsonl`. **Không regenerate được** | **PHẢI commit** |
|
|
128
|
-
> | `.trace-mirror/` | bản sao cho panel VS Code | gitignore |
|
|
129
|
-
> | `.living-docs/` | report gộp | gitignore |
|
|
130
|
-
>
|
|
131
|
-
> **Trước v0.4.3 cả hai cùng tên `.trace`.** Khi dev mở thẳng spec repo làm workspace thì hai đường dẫn **bằng nhau** — và `/sync` (bản cũ) gợi ý gitignore theo **tên**, không theo vai trò. Làm theo là **mất sổ gốc, im lặng**: máy vẫn chạy, dashboard vẫn có số; chỉ người thứ hai clone về mới phát hiện, và lúc đó lịch sử đã mất vĩnh viễn.
|
|
132
|
-
>
|
|
133
|
-
> **Kiểm dự án đang chạy:**
|
|
134
|
-
> ```bash
|
|
135
|
-
> git -C {spec_source} check-ignore .trace # trả về kết quả = ĐANG DÍNH
|
|
136
|
-
> ```
|
|
137
|
-
> Dính thì gỡ dòng khớp `.trace` khỏi `.gitignore` rồi `git add -f .trace && git commit`.
|
|
138
|
-
> Từ v0.4.3 `/sync` Step 4b tự kiểm và báo động 🔴 nếu phát hiện.
|
|
139
|
-
|
|
140
|
-
> Muốn thay đổi **bền vững** thì sửa trong repo framework rồi phát hành. Tuỳ biến riêng của một project thuộc về `CLAUDE.md`, `.agent/project-context.yaml`, hoặc `.agent/project-lessons.md` — cả ba đều không bị ghi đè. Ranh giới đầy đủ: `.agent/README.md`.
|
|
141
|
-
>
|
|
142
|
-
> **Template `.feature`/PRD không cấu hình được.** Skeleton được `{{include}}` nướng cứng vào file lệnh lúc build, nên sửa `.agent/templates/` **không có tác dụng** (và sẽ bị ghi đè). Đổi cấu trúc artifact = sửa `templates/*` trong repo framework rồi `npm run build`. Chi tiết: `.agent/templates/README.md`.
|
|
143
|
-
|
|
144
|
-
---
|
|
145
|
-
|
|
146
|
-
→ [Architecture › Configuration](../02-concepts/architecture.md#configuration-2-file) · [Modules](modules.md)
|
|
1
|
+
[← Reference](./) · [Concepts › Architecture](../02-concepts/architecture.md)
|
|
2
|
+
|
|
3
|
+
# Reference · Configuration
|
|
4
|
+
|
|
5
|
+
> Hai file cấu hình chính. `/update-framework` **không** đụng chúng — đây là nội dung của bạn.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. `project-context.yaml`
|
|
10
|
+
|
|
11
|
+
**Single source of truth** cho paths/mode/routing. Nằm ở `.agent/project-context.yaml`, sinh từ `templates/project-context.yaml` qua token substitution khi init. Mọi workflow đọc file này để biết **WHERE** tìm mọi thứ.
|
|
12
|
+
|
|
13
|
+
### Cấu trúc chính
|
|
14
|
+
|
|
15
|
+
```yaml
|
|
16
|
+
project:
|
|
17
|
+
name: "..."
|
|
18
|
+
description: "..."
|
|
19
|
+
|
|
20
|
+
paths:
|
|
21
|
+
specs_dir: "specs" # gốc mọi spec artifact
|
|
22
|
+
trace_dir: ".trace" # trace state .tsv
|
|
23
|
+
qc_dir: "docs" # working docs của QC — {qc_dir}/{TICKET-ID}/{platform}/
|
|
24
|
+
qc_skills_dir: ".agent/skills/qc" # nơi qc-* nạp skill (override sang repo QC riêng)
|
|
25
|
+
refinement_dir: ".agent/review" # findings review
|
|
26
|
+
|
|
27
|
+
setup:
|
|
28
|
+
mode: single | umbrella
|
|
29
|
+
spec_source: "..." # (umbrella) spec repo dùng chung
|
|
30
|
+
|
|
31
|
+
services: # (multi/umbrella) map domain → service
|
|
32
|
+
# dạng phẳng: {domain}: { path, module }
|
|
33
|
+
# dạng map-theo-platform: {domain}: { web: {path,module}, app: {...}, system: {...} }
|
|
34
|
+
|
|
35
|
+
conventions:
|
|
36
|
+
build_command: "..." # lệnh build verify (≤3 retry)
|
|
37
|
+
test_command: "..."
|
|
38
|
+
|
|
39
|
+
tech_stack:
|
|
40
|
+
database: "..." # vd PostgreSQL
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Bố cục feature-package (path resolution)
|
|
44
|
+
|
|
45
|
+
Mọi artifact của một feature nằm chung `specs/{domain}/{prd-slug}/`:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
specs/{domain}/{prd-slug}/
|
|
49
|
+
├── {TICKET-ID}-{prd-slug}.md # PRD (file .md duy nhất ở gốc)
|
|
50
|
+
├── bdd/{web|app|system}/*.feature # BDD — subfolder platform LUÔN có
|
|
51
|
+
├── tech-docs/{TICKET-ID}-tech-design.md # MỘT doc gộp cho cả PRD
|
|
52
|
+
├── design-spec/{TICKET-ID}*.md # FE/App
|
|
53
|
+
└── changelog/{TICKET-ID}-{prd-slug}.changelog.md # chỉ tạo khi changelog vượt 5 version
|
|
54
|
+
.trace/{domain}/{prd-slug}/{UC-ID}-{platform}.tsv # MỘT sổ / UC × platform (24 cột)
|
|
55
|
+
.trace/{domain}/{prd-slug}/_seams.tsv # sổ seam/stub — nguồn 2 cờ 🔴 chặn PR
|
|
56
|
+
.trace/trace-report.json # snapshot cho panel — GHI ĐÈ mỗi lần chạy
|
|
57
|
+
.trace/trace-history.jsonl # nhật ký append-only — PHẢI commit
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
- `{domain}` = segment đầu sau `specs_dir`.
|
|
61
|
+
- `{prd-slug}` = segment kế tiếp (folder feature-package) — **không** phải folder cha trực tiếp của file lồng sâu.
|
|
62
|
+
- **Segment `{platform}` không optional** — mọi mode, kể cả umbrella. `web` và `system` của cùng một UC là hai file khác nhau; bỏ segment thì chúng va tên và **ghi đè nhau**. Trace tách theo platform nên bố cục spec phải khớp.
|
|
63
|
+
*Project còn ở bố cục phẳng: `npx @educa-corp/sdd-framework --migrate-bdd-platform` (dry-run mặc định).*
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 2. `CLAUDE.md` (phân tầng)
|
|
68
|
+
|
|
69
|
+
Instruction cho AI agent — AI *follow* file này thay vì *invent*.
|
|
70
|
+
|
|
71
|
+
| Tầng | Nội dung |
|
|
72
|
+
|------|----------|
|
|
73
|
+
| **root** `CLAUDE.md` | Luật chung dự án/umbrella |
|
|
74
|
+
| **overlay** `{service}/CLAUDE.md` | §2 kiến trúc & thứ tự layer & package strategy · §3 coding standards · §5 error handling — **theo stack** |
|
|
75
|
+
|
|
76
|
+
> Service overlay **thắng** root khi mâu thuẫn. context-loader nạp cả hai, đặt ở **cuối** context (Lost-in-the-Middle: "follow style này").
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 3. Single vs Umbrella
|
|
81
|
+
|
|
82
|
+
| | Single | Umbrella |
|
|
83
|
+
|---|--------|----------|
|
|
84
|
+
| `setup.mode` | `single` | `umbrella` |
|
|
85
|
+
| Spec ở đâu | Cùng repo | **Spec repo dùng chung** (`spec_source`) |
|
|
86
|
+
| Code ở đâu | Cùng repo | Service submodule (chỉ code + tooling) |
|
|
87
|
+
| Trace/feedback/findings | Cùng repo | Trong spec repo (một nơi authoritative) |
|
|
88
|
+
| Đồng bộ | — | `/sync` (pull + submodule + nổi feedback + Living Docs) |
|
|
89
|
+
|
|
90
|
+
Khi `spec_source` được đặt, **mọi** PRD/BDD/tech-doc/design-spec/`.trace`/`.agent/review`/`feedback` route về spec repo — vì đều là **artifact liên team**.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Vùng nào bị ghi đè khi update
|
|
95
|
+
|
|
96
|
+
`.agent/` là **mirror sinh ra**: `/update-framework` chạy `npx … --init`, và `--init` copy `core/` → `.agent/` **vô điều kiện**.
|
|
97
|
+
|
|
98
|
+
| Đường dẫn | Sửa được? | Vì sao |
|
|
99
|
+
|---|:---:|---|
|
|
100
|
+
| `CLAUDE.md` | ✅ | ngoài `.agent/` |
|
|
101
|
+
| `.agent/project-context.yaml` | ✅ | file **duy nhất trong `.agent/`** có guard: chỉ tạo nếu chưa tồn tại |
|
|
102
|
+
| `.agent/project-lessons.md` · `.agent/review/` | ✅ | không nằm trong `core/` nên nâng cấp không đụng |
|
|
103
|
+
| `specs/domain-knowledge/` · `.trace/` · `feedback/` | ✅ | ngoài `.agent/` |
|
|
104
|
+
| `.agent/commands` `steps` `rules` `skills` `hooks` `templates` `modules` | ❌ | copy từ repo framework, **ghi đè mỗi lần nâng cấp** |
|
|
105
|
+
|
|
106
|
+
**Nếu bạn đã sửa gì trong vùng ❌** — từ v0.4.2 `--init` tự cứu:
|
|
107
|
+
|
|
108
|
+
- bản cũ copy sang `.agent/.overwritten-{version}-{YYYYMMDD}/` (giữ nguyên cây thư mục)
|
|
109
|
+
- danh sách file bị ghi đè in ra ngay sau bước cài
|
|
110
|
+
- `.agent/.install-manifest.json` ghi hash của **đúng những gì lần cài trước đã viết** — nhờ đó lệnh phân biệt được *bạn sửa file* với *framework tự đổi file giữa hai version* (một phép so nội dung thuần sẽ flag cả hai và báo oan hàng chục file mỗi lần nâng cấp)
|
|
111
|
+
|
|
112
|
+
Thêm vào `.gitignore` của project:
|
|
113
|
+
|
|
114
|
+
```gitignore
|
|
115
|
+
.agent/.overwritten-*/
|
|
116
|
+
.agent/.install-manifest.json
|
|
117
|
+
.trace-mirror/ # bản sao cho panel VS Code — sinh lại được
|
|
118
|
+
.living-docs/ # report gộp — sinh lại được (đặt trong .gitignore của spec repo)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
> ### ⚠️ `.trace/` **KHÔNG** được gitignore
|
|
122
|
+
>
|
|
123
|
+
> Đây là chỗ dễ mất dữ liệu nhất trong toàn framework.
|
|
124
|
+
>
|
|
125
|
+
> | Đường dẫn | Vai trò | Git |
|
|
126
|
+
> |---|---|---|
|
|
127
|
+
> | `{paths.trace_dir}` (`.trace/`) | **AUTHORITATIVE** — `.tsv` + `trace-history.jsonl`. **Không regenerate được** | **PHẢI commit** |
|
|
128
|
+
> | `.trace-mirror/` | bản sao cho panel VS Code | gitignore |
|
|
129
|
+
> | `.living-docs/` | report gộp | gitignore |
|
|
130
|
+
>
|
|
131
|
+
> **Trước v0.4.3 cả hai cùng tên `.trace`.** Khi dev mở thẳng spec repo làm workspace thì hai đường dẫn **bằng nhau** — và `/sync` (bản cũ) gợi ý gitignore theo **tên**, không theo vai trò. Làm theo là **mất sổ gốc, im lặng**: máy vẫn chạy, dashboard vẫn có số; chỉ người thứ hai clone về mới phát hiện, và lúc đó lịch sử đã mất vĩnh viễn.
|
|
132
|
+
>
|
|
133
|
+
> **Kiểm dự án đang chạy:**
|
|
134
|
+
> ```bash
|
|
135
|
+
> git -C {spec_source} check-ignore .trace # trả về kết quả = ĐANG DÍNH
|
|
136
|
+
> ```
|
|
137
|
+
> Dính thì gỡ dòng khớp `.trace` khỏi `.gitignore` rồi `git add -f .trace && git commit`.
|
|
138
|
+
> Từ v0.4.3 `/sync` Step 4b tự kiểm và báo động 🔴 nếu phát hiện.
|
|
139
|
+
|
|
140
|
+
> Muốn thay đổi **bền vững** thì sửa trong repo framework rồi phát hành. Tuỳ biến riêng của một project thuộc về `CLAUDE.md`, `.agent/project-context.yaml`, hoặc `.agent/project-lessons.md` — cả ba đều không bị ghi đè. Ranh giới đầy đủ: `.agent/README.md`.
|
|
141
|
+
>
|
|
142
|
+
> **Template `.feature`/PRD không cấu hình được.** Skeleton được `{{include}}` nướng cứng vào file lệnh lúc build, nên sửa `.agent/templates/` **không có tác dụng** (và sẽ bị ghi đè). Đổi cấu trúc artifact = sửa `templates/*` trong repo framework rồi `npm run build`. Chi tiết: `.agent/templates/README.md`.
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
→ [Architecture › Configuration](../02-concepts/architecture.md#configuration-2-file) · [Modules](modules.md)
|
|
@@ -240,7 +240,7 @@ Ca thứ hai là lý do consumer **phải** chuẩn hoá tập bị ảnh hưở
|
|
|
240
240
|
|
|
241
241
|
## Xuất JSON cho panel
|
|
242
242
|
|
|
243
|
-
`trace-report.json` giữ enum `status` **đúng 4 giá trị** `OK`/`DRIFT`/`GAP`/`UNTRACKED` — VS Code extension "
|
|
243
|
+
`trace-report.json` giữ enum `status` **đúng 4 giá trị** `OK`/`DRIFT`/`GAP`/`UNTRACKED` — VS Code extension "SDD Board" sống ngoài repo framework và switch trên field này. Row `ORPHANED` xuất ra là `"status": "DRIFT"` + `"orphaned": true`; panel cũ hiện nó như DRIFT (đúng nghĩa, không im lặng), panel mới đọc `orphaned` để hiện nhãn riêng. **TSV giữ nguyên chữ `ORPHANED`** — TSV là nguồn-sự-thật.
|
|
244
244
|
|
|
245
245
|
---
|
|
246
246
|
|
|
@@ -44,7 +44,7 @@ Mọi command sau đều đọc `project-context.yaml` + `CLAUDE.md` + `domain-k
|
|
|
44
44
|
5. **Step 3 · project-context.yaml** — copy từ `templates/project-context.yaml`, điền `{{PLACEHOLDER}}`. Umbrella: verify/sửa `services` (path phải khớp tên submodule thật — generator để placeholder `TODO-…`).
|
|
45
45
|
6. **Step 4 · business-dictionary.md** — Canonical Terms / Banned Terms / Enum Registry. *(Umbrella skip — sống trong spec submodule.)*
|
|
46
46
|
7. **Step 5 · core-entities.md** — entity catalog máy-đọc-được (field, invariant, relationship). *(Umbrella skip.)*
|
|
47
|
-
8. **Step 6 · VS Code extension** — khuyến nghị cài "
|
|
47
|
+
8. **Step 6 · VS Code extension** — khuyến nghị cài "SDD Board" (Review Board + Living Docs UI).
|
|
48
48
|
9. **Step 7 · Verify** — checklist theo `project_type` (file/folder tồn tại; umbrella check submodule init).
|
|
49
49
|
|
|
50
50
|
---
|
|
@@ -26,7 +26,7 @@ QC chính thức cần hiểu yêu cầu **testable** trước khi viết test.
|
|
|
26
26
|
|
|
27
27
|
**Input:** UC-ID + spec (PRD/BDD từ spec repo) + skill `qa-analyst`.
|
|
28
28
|
|
|
29
|
-
**Output (per
|
|
29
|
+
**Output (per PRD × nền):** `{qc_dir}/{TICKET-ID}/{platform}/REQUIREMENT_ANALYSIS.md` + `DOC_GAP.md` (11 cột, cột 2 là `UC`) + `{refinement_dir}/{TICKET-ID}-qa-findings.yaml`. Một lần chạy phủ **mọi UC có BDD `approved`** của PRD; UC còn nháp vào bảng *Phạm vi phân tích* với dấu `⏸ Chưa xét` (`--include-draft` để xét luôn).
|
|
30
30
|
|
|
31
31
|
---
|
|
32
32
|
|
|
@@ -23,7 +23,7 @@ Không phải mọi scenario rủi ro ngang nhau. Trạm này xếp ưu tiên te
|
|
|
23
23
|
|
|
24
24
|
**Input:** analysis từ trạm 1 + skill `qa-planner`.
|
|
25
25
|
|
|
26
|
-
**Output:** `{qc_dir}/{
|
|
26
|
+
**Output:** `{qc_dir}/{TICKET-ID}/{platform}/TEST_PLAN.md` — **một plan cho cả PRD** (rủi ro + câu hỏi cho dev), `Ready`/`Blocked` chấm theo từng UC.
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
@@ -22,7 +22,7 @@ Tách "thiết kế test case" (con người đọc/review được) khỏi "cod
|
|
|
22
22
|
|
|
23
23
|
**Input:** TEST_PLAN.md + skill `qa-designer` (chọn layer, nạp MỘT file).
|
|
24
24
|
|
|
25
|
-
**Output:** `{qc_dir}/{
|
|
25
|
+
**Output:** `{qc_dir}/{TICKET-ID}/{platform}/test-cases/*.Test.md` (trace mapping bắt buộc). Gọi theo **từng UC**, ghi vào thư mục test-case dùng chung cấp PRD.
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|