ai-developer-skill-os 9.1.2 → 9.3.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/.agents/AGENTS.md +139 -42
- package/.agents/DEV_PROFILE.md +95 -0
- package/.agents/registry/capability-graph.yml +171 -334
- package/.agents/registry/graph.json +37 -19
- package/.agents/registry/index.yaml +59 -13
- package/.agents/registry/skills-index.yml +204 -447
- package/.agents/rules/coding.md +23 -0
- package/.agents/rules/global.md +44 -30
- package/.agents/skills/_template/SKILL.md +2 -377
- package/.agents/skills/qk-access-policy/SKILL.md +98 -473
- package/.agents/skills/qk-agent-observability/SKILL.md +3 -439
- package/.agents/skills/qk-ai-builder/SKILL.md +132 -565
- package/.agents/skills/qk-api-consumer/SKILL.md +256 -0
- package/.agents/skills/qk-api-consumer/capability.yaml +21 -0
- package/.agents/skills/qk-api-consumer/evals/scorecard.yaml +29 -0
- package/.agents/skills/qk-api-lifecycle/SKILL.md +133 -456
- package/.agents/skills/qk-bug-resolution/SKILL.md +128 -561
- package/.agents/skills/qk-code-review/SKILL.md +142 -420
- package/.agents/skills/qk-context-loader/SKILL.md +99 -471
- package/.agents/skills/qk-data-engineer/SKILL.md +119 -340
- package/.agents/skills/qk-data-lifecycle/SKILL.md +89 -488
- package/.agents/skills/qk-db-optimizer/SKILL.md +102 -488
- package/.agents/skills/qk-design-system-engineering/SKILL.md +76 -461
- package/.agents/skills/qk-devops-platform/SKILL.md +77 -463
- package/.agents/skills/qk-docs/SKILL.md +88 -494
- package/.agents/skills/qk-engineering-standard/SKILL.md +4 -588
- package/.agents/skills/qk-fe-api-integration/SKILL.md +343 -343
- package/.agents/skills/qk-fe-api-integration/evals/scorecard.yaml +29 -29
- package/.agents/skills/qk-feature-delivery/SKILL.md +137 -445
- package/.agents/skills/qk-feature-delivery/evals/scorecard.yaml +1 -1
- package/.agents/skills/qk-frontend-architecture/SKILL.md +5 -479
- package/.agents/skills/qk-help/evals/scorecard.yaml +13 -13
- package/.agents/skills/qk-orchestrator/SKILL.md +63 -502
- package/.agents/skills/qk-orchestrator/references/routing-table.md +10 -14
- package/.agents/skills/qk-product-specification/SKILL.md +70 -479
- package/.agents/skills/qk-production-release/SKILL.md +80 -537
- package/.agents/skills/qk-project-audit/SKILL.md +174 -0
- package/.agents/skills/qk-project-bootstrap/SKILL.md +243 -471
- package/.agents/skills/qk-project-health/SKILL.md +97 -496
- package/.agents/skills/qk-project-memory/SKILL.md +76 -21
- package/.agents/skills/qk-refactor/SKILL.md +167 -384
- package/.agents/skills/qk-security-audit/SKILL.md +141 -463
- package/.agents/skills/qk-security-audit/capability.yaml +1 -2
- package/.agents/skills/qk-system-evolution/SKILL.md +343 -343
- package/.agents/skills/qk-system-evolution/evals/scorecard.yaml +26 -26
- package/.agents/skills/qk-test-engineering/SKILL.md +119 -509
- package/.agents/skills/qk-ui-audit/SKILL.md +73 -537
- package/.agents/skills/qk-ui-builder/SKILL.md +521 -482
- package/.agents/skills/qk-ui-system-builder/SKILL.md +68 -514
- package/.agents/skills/qk-upgrade/SKILL.md +301 -0
- package/.agents/skills/qk-upgrade/capability.yaml +24 -0
- package/.agents/skills/qk-upgrade/evals/scorecard.yaml +26 -0
- package/.agents/skills/qk-validation-gate/SKILL.md +4 -603
- package/.agents/skills/qk-web-quality-gate/SKILL.md +85 -463
- package/.agents/workflows/bug-resolution.yml +6 -6
- package/.agents/workflows/context-discovery.yml +94 -0
- package/.agents/workflows/feature-delivery.yml +8 -4
- package/.agents/workflows/refactor.yml +6 -3
- package/.agents/workflows/shared/quality-gate.yml +94 -0
- package/.agents/workflows/skin-governance.yml +115 -0
- package/README.md +152 -67
- package/package.json +2 -2
- package/tooling/build-registry.js +30 -8
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
---
|
|
1
|
+
---
|
|
2
2
|
# ── Identity ───────────────────────────────────────────────
|
|
3
3
|
name: qk-test-engineering
|
|
4
|
-
version: 9.
|
|
5
|
-
status:
|
|
6
|
-
description: "
|
|
4
|
+
version: 9.2.0
|
|
5
|
+
status: stable
|
|
6
|
+
description: "Thiết kế chiến lược kiểm thử toàn diện và viết bộ test tự động: Test Pyramid (Unit, Integration, E2E), Mocking strategy, Edge-case coverage, Regression testing. Dùng skill này khi user nhắc đến: viết test, test strategy, unit test, coverage, e2e, integration test, mock data, pytest, vitest, playwright — kể cả khi chỉ nói 'viết test cho module này'."
|
|
7
7
|
platforms: [antigravity, claude-code, cursor, windsurf, kilo-code]
|
|
8
8
|
|
|
9
9
|
# ── V9: Classification ─────────────────────────────────────
|
|
@@ -11,11 +11,10 @@ type: capability
|
|
|
11
11
|
|
|
12
12
|
intent:
|
|
13
13
|
- testing-strategy
|
|
14
|
-
- unit-
|
|
15
|
-
- integration-
|
|
16
|
-
- e2e-
|
|
17
|
-
-
|
|
18
|
-
- test-coverage-planning
|
|
14
|
+
- unit-testing
|
|
15
|
+
- integration-testing
|
|
16
|
+
- e2e-testing
|
|
17
|
+
- test-automation
|
|
19
18
|
|
|
20
19
|
complexity:
|
|
21
20
|
level: high
|
|
@@ -25,11 +24,18 @@ complexity:
|
|
|
25
24
|
has_external_dependency: true
|
|
26
25
|
has_breaking_change: false
|
|
27
26
|
|
|
28
|
-
triggers:
|
|
29
|
-
- "
|
|
30
|
-
- "
|
|
31
|
-
- "
|
|
32
|
-
- "
|
|
27
|
+
triggers:
|
|
28
|
+
- "viết test"
|
|
29
|
+
- "test strategy"
|
|
30
|
+
- "unit test"
|
|
31
|
+
- "coverage"
|
|
32
|
+
- "e2e"
|
|
33
|
+
- "integration test"
|
|
34
|
+
- "mock data"
|
|
35
|
+
- "pytest"
|
|
36
|
+
- "vitest"
|
|
37
|
+
- "playwright"
|
|
38
|
+
|
|
33
39
|
|
|
34
40
|
# ── V8: References ─────────────────────────────────────────
|
|
35
41
|
workflow: feature-delivery
|
|
@@ -43,7 +49,8 @@ tools:
|
|
|
43
49
|
- terminal
|
|
44
50
|
|
|
45
51
|
related_skills:
|
|
46
|
-
- qk-
|
|
52
|
+
- qk-code-review
|
|
53
|
+
- qk-bug-resolution
|
|
47
54
|
|
|
48
55
|
knowledge_scope:
|
|
49
56
|
domain:
|
|
@@ -52,57 +59,24 @@ knowledge_scope:
|
|
|
52
59
|
- unit-testing
|
|
53
60
|
- integration-testing
|
|
54
61
|
- e2e-testing
|
|
55
|
-
- visual-regression
|
|
56
62
|
concepts:
|
|
57
63
|
- test-pyramid
|
|
58
64
|
- mock-strategy
|
|
65
|
+
- arrange-act-assert
|
|
59
66
|
references:
|
|
60
67
|
- architecture
|
|
61
|
-
- anti-patterns
|
|
62
|
-
- playwright
|
|
63
68
|
- vitest
|
|
64
|
-
-
|
|
65
|
-
|
|
66
|
-
decision_boundary:
|
|
67
|
-
owns:
|
|
68
|
-
- test pyramid
|
|
69
|
-
- coverage strategy
|
|
70
|
-
- regression planning
|
|
71
|
-
does_not_own:
|
|
72
|
-
- business logic implementation
|
|
73
|
-
- writing tests
|
|
74
|
-
conflicts_with: []
|
|
69
|
+
- pytest
|
|
70
|
+
- playwright
|
|
75
71
|
|
|
76
72
|
# ── V8: Verification ───────────────────────────────────────
|
|
77
73
|
verification:
|
|
78
74
|
required: true
|
|
79
75
|
strategy: feature
|
|
80
76
|
|
|
81
|
-
lifecycle:
|
|
82
|
-
promotion_gate:
|
|
83
|
-
requirements:
|
|
84
|
-
tests:
|
|
85
|
-
minimum_pass_rate: 0.95
|
|
86
|
-
usage:
|
|
87
|
-
minimum_runs: 20
|
|
88
|
-
conflicts:
|
|
89
|
-
zero_boundary_violation: true
|
|
90
|
-
evidence:
|
|
91
|
-
required:
|
|
92
|
-
- evaluation_report
|
|
93
|
-
- usage_history
|
|
94
|
-
- boundary_audit
|
|
95
|
-
demotion_gate:
|
|
96
|
-
triggers:
|
|
97
|
-
- repeated_failure
|
|
98
|
-
- boundary_violation
|
|
99
|
-
- outdated_reference
|
|
100
|
-
action:
|
|
101
|
-
change_status: "stable -> experimental"
|
|
102
|
-
|
|
103
77
|
selection:
|
|
104
|
-
priority:
|
|
105
|
-
confidence_threshold: 0.
|
|
78
|
+
priority: high
|
|
79
|
+
confidence_threshold: 0.85
|
|
106
80
|
|
|
107
81
|
examples: []
|
|
108
82
|
learnings: []
|
|
@@ -112,494 +86,130 @@ execution_mode: deterministic
|
|
|
112
86
|
cost: medium
|
|
113
87
|
latency: medium
|
|
114
88
|
risk: low
|
|
115
|
-
side_effects:
|
|
116
|
-
produces: [
|
|
117
|
-
consumes: [user-description]
|
|
89
|
+
side_effects: edit_files
|
|
90
|
+
produces: [code, test_plan]
|
|
91
|
+
consumes: [source-code, user-description]
|
|
118
92
|
|
|
119
93
|
token_budget:
|
|
120
|
-
max_files_read:
|
|
94
|
+
max_files_read: 6
|
|
121
95
|
max_lines_per_read: 150
|
|
122
|
-
max_shell_commands:
|
|
96
|
+
max_shell_commands: 3
|
|
123
97
|
stop_early: true
|
|
124
98
|
|
|
125
|
-
exit_codes: [SUCCESS, BLOCKED, FAILED, PARTIAL]
|
|
99
|
+
exit_codes: [SUCCESS, BLOCKED, FAILED, PARTIAL]
|
|
126
100
|
---
|
|
127
101
|
|
|
128
|
-
# qk-test-engineering —
|
|
102
|
+
# qk-test-engineering — Automated Testing & Quality Architect
|
|
129
103
|
|
|
130
104
|
> **Language rule:** Code, identifiers, file names → English. Explanations, summaries → Vietnamese.
|
|
131
105
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
### 0. Self-Init Protocol (Khởi Tạo Bộ Nhớ Local & Gitignore)
|
|
135
|
-
- Trước khi tra cứu hoặc lưu trữ tri thức, BẮT BUỘC kiểm tra sự tồn tại của thư mục `.ai-local/` tại gốc dự án:
|
|
136
|
-
- **Tự động tạo mới:** Nếu `.ai-local/` chưa tồn tại, AI phải tự động tạo cấu trúc thư mục `.ai-local/knowledge/` (và file `index.yaml` nếu cần thiết) cùng `.ai-local/candidates/`. Tuyệt đối không ngưng chạy hay hỏi ý kiến người dùng về thao tác khởi tạo tiêu chuẩn này.
|
|
137
|
-
- **Bảo mật Gitignore:** BẮT BUỘC kiểm tra file `.gitignore` của dự án, nếu chưa có dòng `.ai-local/` thì phải tự động thêm vào để tuyệt đối bảo mật tri thức cá nhân và tránh lộ lọt lên Git.
|
|
138
|
-
|
|
139
|
-
---
|
|
140
|
-
|
|
141
|
-
### Pre-flight Retrieve (Trước khi thực thi)
|
|
142
|
-
- Trước các task có tính lặp lại, debug, refactor, kiến trúc hoặc rủi ro cao:
|
|
143
|
-
bắt buộc tra cứu:
|
|
144
|
-
- `.ai-local/knowledge/index.yaml` (Private Local Knowledge)
|
|
145
|
-
|
|
146
|
-
- Ưu tiên sử dụng các Knowledge đang có trạng thái `Active` thuộc:
|
|
147
|
-
- Architecture
|
|
148
|
-
- Hard Bug
|
|
149
|
-
- Convention
|
|
150
|
-
- Pattern
|
|
151
|
-
- Tech Debt Pattern
|
|
152
|
-
- 👉 *Domain Focus:* Convention / Pattern (vd: chiến lược Test Pyramid, mock provider Vitest/Jest, boundary test).
|
|
153
|
-
|
|
154
|
-
- Memory chỉ đóng vai trò **Navigator (bản đồ chỉ đường)**.
|
|
155
|
-
Không được xem Memory là Source of Truth.
|
|
156
|
-
Luôn xác minh lại bằng source code, configuration và trạng thái hiện tại của dự án trước khi áp dụng.
|
|
157
|
-
|
|
158
|
-
---
|
|
159
|
-
|
|
160
|
-
### Learning Flow (AI tự học có kiểm soát)
|
|
161
|
-
- Trong quá trình làm việc, AI được phép tự phát hiện và tạo **Candidate Memory** khi nhận thấy:
|
|
162
|
-
- Hard Bug có khả năng tái diễn.
|
|
163
|
-
- Pattern làm việc lặp lại trong dự án.
|
|
164
|
-
- Convention hoặc quy tắc kiến trúc mới.
|
|
165
|
-
- Quyết định Architecture quan trọng.
|
|
166
|
-
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
167
|
-
- 👉 *Domain Harvest:* Pattern viết mock/stub mới hoặc chiến lược fixture dự án.
|
|
168
|
-
|
|
169
|
-
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
170
|
-
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
171
|
-
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
172
|
-
|
|
173
|
-
---
|
|
174
|
-
|
|
175
|
-
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
176
|
-
Sau khi hoàn thành task:
|
|
177
|
-
- AI đánh giá các Candidate Memory đã tạo.
|
|
178
|
-
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
179
|
-
- Đề xuất người dùng xem xét.
|
|
180
|
-
- Gửi yêu cầu phê duyệt thông qua:
|
|
181
|
-
- `/learn`
|
|
182
|
-
- `qk-project-memory`
|
|
183
|
-
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
184
|
-
|
|
185
|
-
```
|
|
186
|
-
.ai-local/candidates/ ──(Approve)──> .ai-local/knowledge/index.yaml
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
190
|
-
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
### Ignore (Không đưa vào Memory)
|
|
195
|
-
Không lưu:
|
|
196
|
-
- Trace log của một session đơn lẻ.
|
|
197
|
-
- Temporary debugging data.
|
|
198
|
-
- Output của một lần chạy test/scan.
|
|
199
|
-
- Report health tạm thời của một đợt kiểm tra.
|
|
200
|
-
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
201
|
-
- Thông tin không có khả năng tái sử dụng.
|
|
202
|
-
- 👉 *Domain Ignore:* File coverage nháp sinh ra trong quá trình chạy test.
|
|
203
|
-
|
|
204
|
-
---
|
|
205
|
-
|
|
206
|
-
### Golden Rule
|
|
207
|
-
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
208
|
-
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
209
|
-
|
|
210
|
-
---
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
### 0. Self-Init Protocol (Khởi Tạo Bộ Nhớ Local & Gitignore)
|
|
215
|
-
- Trước khi tra cứu hoặc lưu trữ tri thức, BẮT BUỘC kiểm tra sự tồn tại của thư mục `.ai-local/` tại gốc dự án:
|
|
216
|
-
- **Tự động tạo mới:** Nếu `.ai-local/` chưa tồn tại, AI phải tự động tạo cấu trúc thư mục `.ai-local/knowledge/` (và file `index.yaml` nếu cần thiết) cùng `.ai-local/candidates/`. Tuyệt đối không ngưng chạy hay hỏi ý kiến người dùng về thao tác khởi tạo tiêu chuẩn này.
|
|
217
|
-
- **Bảo mật Gitignore:** BẮT BUỘC kiểm tra file `.gitignore` của dự án, nếu chưa có dòng `.ai-local/` thì phải tự động thêm vào để tuyệt đối bảo mật tri thức cá nhân và tránh lộ lọt lên Git.
|
|
218
|
-
|
|
219
|
-
---
|
|
220
|
-
|
|
221
|
-
### Pre-flight Retrieve (Trước khi thực thi)
|
|
222
|
-
- Trước các task có tính lặp lại, debug, refactor, kiến trúc hoặc rủi ro cao:
|
|
223
|
-
bắt buộc tra cứu:
|
|
224
|
-
- `.ai-local/knowledge/index.yaml` (Private Local Knowledge)
|
|
225
|
-
|
|
226
|
-
- Ưu tiên sử dụng các Knowledge đang có trạng thái `Active` thuộc:
|
|
227
|
-
- Architecture
|
|
228
|
-
- Hard Bug
|
|
229
|
-
- Convention
|
|
230
|
-
- Pattern
|
|
231
|
-
- Tech Debt Pattern
|
|
232
|
-
- 👉 *Domain Focus:* Convention / Pattern (vd: chiến lược Test Pyramid, mock provider Vitest/Jest, boundary test).
|
|
233
|
-
|
|
234
|
-
- Memory chỉ đóng vai trò **Navigator (bản đồ chỉ đường)**.
|
|
235
|
-
Không được xem Memory là Source of Truth.
|
|
236
|
-
Luôn xác minh lại bằng source code, configuration và trạng thái hiện tại của dự án trước khi áp dụng.
|
|
237
|
-
|
|
238
|
-
---
|
|
239
|
-
|
|
240
|
-
### Learning Flow (AI tự học có kiểm soát)
|
|
241
|
-
- Trong quá trình làm việc, AI được phép tự phát hiện và tạo **Candidate Memory** khi nhận thấy:
|
|
242
|
-
- Hard Bug có khả năng tái diễn.
|
|
243
|
-
- Pattern làm việc lặp lại trong dự án.
|
|
244
|
-
- Convention hoặc quy tắc kiến trúc mới.
|
|
245
|
-
- Quyết định Architecture quan trọng.
|
|
246
|
-
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
247
|
-
- 👉 *Domain Harvest:* Pattern viết mock/stub mới hoặc chiến lược fixture dự án.
|
|
248
|
-
|
|
249
|
-
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
250
|
-
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
251
|
-
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
252
|
-
|
|
253
|
-
---
|
|
254
|
-
|
|
255
|
-
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
256
|
-
Sau khi hoàn thành task:
|
|
257
|
-
- AI đánh giá các Candidate Memory đã tạo.
|
|
258
|
-
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
259
|
-
- Đề xuất người dùng xem xét.
|
|
260
|
-
- Gửi yêu cầu phê duyệt thông qua:
|
|
261
|
-
- `/learn`
|
|
262
|
-
- `qk-project-memory`
|
|
263
|
-
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
264
|
-
|
|
265
|
-
```
|
|
266
|
-
.ai-local/candidates/ ──(Approve)──> .ai-local/knowledge/index.yaml
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
270
|
-
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
271
|
-
|
|
272
|
-
---
|
|
273
|
-
|
|
274
|
-
### Ignore (Không đưa vào Memory)
|
|
275
|
-
Không lưu:
|
|
276
|
-
- Trace log của một session đơn lẻ.
|
|
277
|
-
- Temporary debugging data.
|
|
278
|
-
- Output của một lần chạy test/scan.
|
|
279
|
-
- Report health tạm thời của một đợt kiểm tra.
|
|
280
|
-
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
281
|
-
- Thông tin không có khả năng tái sử dụng.
|
|
282
|
-
- 👉 *Domain Ignore:* File coverage nháp sinh ra trong quá trình chạy test.
|
|
283
|
-
|
|
284
|
-
---
|
|
285
|
-
|
|
286
|
-
### Golden Rule
|
|
287
|
-
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
288
|
-
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
289
|
-
|
|
290
|
-
---
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
### Pre-flight Retrieve (Trước khi thực thi)
|
|
295
|
-
- Trước các task có tính lặp lại, debug, refactor, kiến trúc hoặc rủi ro cao:
|
|
296
|
-
bắt buộc tra cứu:
|
|
297
|
-
- `.agents/knowledge/index.yaml` (Shared Project Knowledge)
|
|
298
|
-
- `.ai-local/knowledge/index.yaml` (Private Local Knowledge)
|
|
299
|
-
|
|
300
|
-
- Ưu tiên sử dụng các Knowledge đang có trạng thái `Active` thuộc:
|
|
301
|
-
- Architecture
|
|
302
|
-
- Hard Bug
|
|
303
|
-
- Convention
|
|
304
|
-
- Pattern
|
|
305
|
-
- Tech Debt Pattern
|
|
306
|
-
- 👉 *Domain Focus:* Convention / Pattern (vd: chiến lược Test Pyramid, mock provider Vitest/Jest, boundary test).
|
|
307
|
-
|
|
308
|
-
- Memory chỉ đóng vai trò **Navigator (bản đồ chỉ đường)**.
|
|
309
|
-
Không được xem Memory là Source of Truth.
|
|
310
|
-
Luôn xác minh lại bằng source code, configuration và trạng thái hiện tại của dự án trước khi áp dụng.
|
|
311
|
-
|
|
312
|
-
---
|
|
313
|
-
|
|
314
|
-
### Learning Flow (AI tự học có kiểm soát)
|
|
315
|
-
- Trong quá trình làm việc, AI được phép tự phát hiện và tạo **Candidate Memory** khi nhận thấy:
|
|
316
|
-
- Hard Bug có khả năng tái diễn.
|
|
317
|
-
- Pattern làm việc lặp lại trong dự án.
|
|
318
|
-
- Convention hoặc quy tắc kiến trúc mới.
|
|
319
|
-
- Quyết định Architecture quan trọng.
|
|
320
|
-
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
321
|
-
- 👉 *Domain Harvest:* Pattern viết mock/stub mới hoặc chiến lược fixture dự án.
|
|
322
|
-
|
|
323
|
-
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
324
|
-
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
325
|
-
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
326
|
-
|
|
327
|
-
---
|
|
328
|
-
|
|
329
|
-
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
330
|
-
Sau khi hoàn thành task:
|
|
331
|
-
- AI đánh giá các Candidate Memory đã tạo.
|
|
332
|
-
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
333
|
-
- Đề xuất người dùng xem xét.
|
|
334
|
-
- Gửi yêu cầu phê duyệt thông qua:
|
|
335
|
-
- `/learn`
|
|
336
|
-
- `qk-project-memory`
|
|
337
|
-
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
338
|
-
|
|
339
|
-
```
|
|
340
|
-
.ai-local/candidates/ ──(Approve)──> .agents/knowledge/index.yaml
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
344
|
-
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
345
|
-
|
|
346
|
-
---
|
|
347
|
-
|
|
348
|
-
### Ignore (Không đưa vào Memory)
|
|
349
|
-
Không lưu:
|
|
350
|
-
- Trace log của một session đơn lẻ.
|
|
351
|
-
- Temporary debugging data.
|
|
352
|
-
- Output của một lần chạy test/scan.
|
|
353
|
-
- Report health tạm thời của một đợt kiểm tra.
|
|
354
|
-
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
355
|
-
- Thông tin không có khả năng tái sử dụng.
|
|
356
|
-
- 👉 *Domain Ignore:* File coverage nháp sinh ra trong quá trình chạy test.
|
|
357
|
-
|
|
358
|
-
---
|
|
359
|
-
|
|
360
|
-
### Golden Rule
|
|
361
|
-
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
362
|
-
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
363
|
-
|
|
364
|
-
---
|
|
365
|
-
---
|
|
366
|
-
|
|
367
|
-
### Learning Flow (AI tự học có kiểm soát)
|
|
368
|
-
- Trong quá trình làm việc, AI được phép tự phát hiện và tạo **Candidate Memory** khi nhận thấy:
|
|
369
|
-
- Hard Bug có khả năng tái diễn.
|
|
370
|
-
- Pattern làm việc lặp lại trong dự án.
|
|
371
|
-
- Convention hoặc quy tắc kiến trúc mới.
|
|
372
|
-
- Quyết định Architecture quan trọng.
|
|
373
|
-
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
374
|
-
- 👉 *Domain Harvest:* Pattern viết mock/stub mới hoặc chiến lược fixture dự án.
|
|
375
|
-
|
|
376
|
-
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
377
|
-
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
378
|
-
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
379
|
-
|
|
380
|
-
---
|
|
381
|
-
|
|
382
|
-
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
383
|
-
Sau khi hoàn thành task:
|
|
384
|
-
- AI đánh giá các Candidate Memory đã tạo.
|
|
385
|
-
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
386
|
-
- Đề xuất người dùng xem xét.
|
|
387
|
-
- Gửi yêu cầu phê duyệt thông qua:
|
|
388
|
-
- `/learn`
|
|
389
|
-
- `qk-project-memory`
|
|
390
|
-
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
391
|
-
|
|
392
|
-
```
|
|
393
|
-
.ai-local/candidates/ ──(Approve)──> .agents/knowledge/index.yaml
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
397
|
-
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
398
|
-
|
|
399
|
-
---
|
|
400
|
-
|
|
401
|
-
### Ignore (Không đưa vào Memory)
|
|
402
|
-
Không lưu:
|
|
403
|
-
- Trace log của một session đơn lẻ.
|
|
404
|
-
- Temporary debugging data.
|
|
405
|
-
- Output của một lần chạy test/scan.
|
|
406
|
-
- Report health tạm thời của một đợt kiểm tra.
|
|
407
|
-
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
408
|
-
- Thông tin không có khả năng tái sử dụng.
|
|
409
|
-
- 👉 *Domain Ignore:* File coverage nháp sinh ra trong quá trình chạy test.
|
|
410
|
-
|
|
411
|
-
---
|
|
412
|
-
|
|
413
|
-
### Golden Rule
|
|
414
|
-
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
415
|
-
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
416
|
-
|
|
417
|
-
---
|
|
418
|
-
---
|
|
419
|
-
|
|
420
|
-
### Learning Flow (AI tự học có kiểm soát)
|
|
421
|
-
- Trong quá trình làm việc, AI được phép tự phát hiện và tạo **Candidate Memory** khi nhận thấy:
|
|
422
|
-
- Hard Bug có khả năng tái diễn.
|
|
423
|
-
- Pattern làm việc lặp lại trong dự án.
|
|
424
|
-
- Convention hoặc quy tắc kiến trúc mới.
|
|
425
|
-
- Quyết định Architecture quan trọng.
|
|
426
|
-
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
427
|
-
- 👉 *Domain Harvest:* Pattern viết mock/stub mới hoặc chiến lược fixture dự án.
|
|
428
|
-
|
|
429
|
-
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
430
|
-
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
431
|
-
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
432
|
-
|
|
433
|
-
---
|
|
434
|
-
|
|
435
|
-
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
436
|
-
Sau khi hoàn thành task:
|
|
437
|
-
- AI đánh giá các Candidate Memory đã tạo.
|
|
438
|
-
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
439
|
-
- Đề xuất người dùng xem xét.
|
|
440
|
-
- Gửi yêu cầu phê duyệt thông qua:
|
|
441
|
-
- `/learn`
|
|
442
|
-
- `qk-project-memory`
|
|
443
|
-
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
444
|
-
|
|
445
|
-
```
|
|
446
|
-
.ai-local/candidates/ ──(Approve)──> .agents/knowledge/index.yaml
|
|
447
|
-
```
|
|
448
|
-
|
|
449
|
-
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
450
|
-
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
451
|
-
|
|
452
|
-
---
|
|
453
|
-
|
|
454
|
-
### Ignore (Không đưa vào Memory)
|
|
455
|
-
Không lưu:
|
|
456
|
-
- Trace log của một session đơn lẻ.
|
|
457
|
-
- Temporary debugging data.
|
|
458
|
-
- Output của một lần chạy test/scan.
|
|
459
|
-
- Report health tạm thời của một đợt kiểm tra.
|
|
460
|
-
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
461
|
-
- Thông tin không có khả năng tái sử dụng.
|
|
462
|
-
- 👉 *Domain Ignore:* File coverage nháp sinh ra trong quá trình chạy test.
|
|
463
|
-
|
|
464
|
-
---
|
|
465
|
-
|
|
466
|
-
### Golden Rule
|
|
467
|
-
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
468
|
-
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
469
|
-
|
|
470
|
-
---
|
|
471
|
-
---
|
|
472
|
-
---
|
|
473
|
-
---
|
|
474
|
-
|
|
475
|
-
## Preconditions
|
|
476
|
-
- [ ] Có code hoặc requirement rõ ràng cần kiểm thử.
|
|
106
|
+
Chịu trách nhiệm thiết kế chiến lược kiểm thử cân bằng (Test Pyramid) và trực tiếp cài đặt các bộ test tự động đáng tin cậy: **Unit Tests nhanh & cô lập, Integration Tests kiểm chứng hợp đồng kết nối, và E2E Tests bảo vệ luồng nghiệp vụ sống còn.**
|
|
477
107
|
|
|
478
|
-
|
|
479
|
-
- Đưa ra quyết định chọn loại test (Unit, Integration, E2E) theo Test Pyramid.
|
|
480
|
-
- Thiết kế chiến lược Mock (Mocking vs Stubbing vs Faking).
|
|
481
|
-
- Đánh giá Test Coverage hiện tại và đưa ra target.
|
|
482
|
-
- Quyết định Regression analysis (những phần nào cần test lại khi file A thay đổi).
|
|
483
|
-
- **Bắt buộc thiết kế test case cho ranh giới dữ liệu (Negative Testing / Boundary Testing) để đảm bảo tuân thủ R-SEC-04.**
|
|
484
|
-
- Không tự động sinh test trừ khi user yêu cầu implement, skill này chủ yếu tư vấn architecture và strategy cho QA/Testing.
|
|
485
|
-
|
|
486
|
-
## Non-Goals
|
|
487
|
-
- ❌ Provide implementation outside of Testing Strategy scope
|
|
488
|
-
- ❌ Override explicit user directives without explanation
|
|
489
|
-
- ❌ Guess ambiguous requirements without asking
|
|
490
|
-
|
|
491
|
-
## Priority Order
|
|
492
|
-
|
|
493
|
-
| Priority | Task | Skip Threshold |
|
|
494
|
-
|----------|------|----------------|
|
|
495
|
-
| P1 | Core Testing Strategy analysis and decision making | Never |
|
|
496
|
-
| P2 | Validation of existing patterns | Budget < 30% |
|
|
497
|
-
| P3 | Detailed documentation generation | Budget < 50% |
|
|
498
|
-
| P4 | Edge case exploration | Budget < 70% |
|
|
499
|
-
|
|
500
|
-
## Workflow
|
|
501
|
-
|
|
502
|
-
### Phase 1 — Context Loading
|
|
503
|
-
**Steps:**
|
|
504
|
-
1. Read existing configuration and requirements related to Testing Strategy.
|
|
505
|
-
2. Check for missing preconditions.
|
|
506
|
-
|
|
507
|
-
**Decision:**
|
|
508
|
-
```
|
|
509
|
-
IF context is clear
|
|
510
|
-
→ Confidence: HIGH → go to Phase 2
|
|
511
|
-
ELSE
|
|
512
|
-
→ EXIT: BLOCKED — ask user
|
|
513
|
-
```
|
|
108
|
+
---
|
|
514
109
|
|
|
515
|
-
|
|
516
|
-
**Steps:**
|
|
517
|
-
1. Analyze the current state against Testing Strategy best practices.
|
|
518
|
-
2. Formulate strategy or audit report based on findings.
|
|
110
|
+
## Preconditions
|
|
519
111
|
|
|
520
|
-
|
|
521
|
-
```
|
|
522
|
-
IF strategy/audit is complete
|
|
523
|
-
→ Confidence: HIGH → go to Phase 3
|
|
524
|
-
ELSE IF minor gaps exist
|
|
525
|
-
→ Confidence: MEDIUM → proceed with assumptions noted
|
|
526
|
-
```
|
|
112
|
+
Trước khi viết test, AI BẮT BUỘC xác nhận:
|
|
527
113
|
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
2. Prepare handoff data for subsequent skills.
|
|
114
|
+
- [ ] Xác định Test Framework từ `DEV_PROFILE.md` hoặc manifest (Vitest, Jest, Pytest, Go `testing`, Playwright).
|
|
115
|
+
- [ ] Xác định code mục tiêu cần test (function, class, API endpoint, hoặc user journey).
|
|
116
|
+
- [ ] Xác định phụ thuộc ngoại vi (Database, External API, File system, Third-party service) để chọn phương án Mock phù hợp.
|
|
532
117
|
|
|
533
|
-
|
|
118
|
+
*Nếu chưa có code mục tiêu và user không yêu cầu TDD (Test-Driven Development):*
|
|
119
|
+
→ **EXIT: BLOCKED**
|
|
120
|
+
→ Yêu cầu: "Vui lòng chỉ định hàm, module hoặc file cần viết test."
|
|
534
121
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
| MEDIUM | Some context missing but safe defaults exist | Proceed and note assumptions |
|
|
539
|
-
| LOW | Core requirements missing | EXIT: BLOCKED |
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Scope
|
|
540
125
|
|
|
541
|
-
|
|
126
|
+
✅ Skill này làm:
|
|
127
|
+
- Thiết lập **Test Cases Matrix** bao phủ:
|
|
128
|
+
- **Happy path:** Dữ liệu hợp lệ, kết quả mong đợi.
|
|
129
|
+
- **Edge cases:** Giới hạn biên (0, -1, max int, chuỗi rỗng, mảng rỗng, ký tự đặc biệt UTF-8).
|
|
130
|
+
- **Error boundaries:** Ném lỗi đúng loại (Custom Error / HTTP Status) khi đầu vào sai.
|
|
131
|
+
- **Async / Timeout:** Xử lý promise reject, network delay.
|
|
132
|
+
- Viết Unit Tests theo cấu trúc kinh điển **AAA (Arrange - Act - Assert)** hoặc **Given - When - Then**.
|
|
133
|
+
- Viết Integration Tests kiểm chứng sự phối hợp giữa Service và Database (dùng in-memory DB hoặc Testcontainers).
|
|
134
|
+
- Viết E2E Tests (Playwright) cho các User Flows quan trọng nhất (Sign up → Checkout → Payment).
|
|
135
|
+
- Xây dựng Mocking Strategy đúng mực: Mock ở ranh giới hệ thống (HTTP client, Message queue), **không bao giờ mock implementation details nội bộ**.
|
|
136
|
+
|
|
137
|
+
❌ Skill này KHÔNG làm:
|
|
138
|
+
- Viết tests rỗng không có `expect` / `assert` chỉ để farm chỉ số coverage.
|
|
139
|
+
- Mock quá mức khiến test luôn pass dù code thật bị hỏng (Tautological tests).
|
|
140
|
+
- Viết E2E test cho mọi biến thể nhỏ (vi phạm kim tự tháp kiểm thử, gây chậm CI và flaky test).
|
|
542
141
|
|
|
543
|
-
|
|
544
|
-
|-------|-----------|
|
|
545
|
-
| CRITICAL | Severe violation of Testing Strategy principles |
|
|
546
|
-
| HIGH | Significant risk or technical debt |
|
|
547
|
-
| MEDIUM | Suboptimal pattern but functional |
|
|
548
|
-
| LOW | Minor style or documentation issue |
|
|
142
|
+
---
|
|
549
143
|
|
|
550
|
-
##
|
|
144
|
+
## Execution Steps
|
|
551
145
|
|
|
146
|
+
### Step 1 — Phân tầng Kiểm thử (Pyramid Placement)
|
|
552
147
|
```
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
148
|
+
Quyết định tầng test phù hợp:
|
|
149
|
+
- Pure function, domain logic, utils → 70% Unit Tests (Chạy < 10ms/test).
|
|
150
|
+
- Database queries, API routes, middleware → 20% Integration Tests (Mock external API).
|
|
151
|
+
- Critical checkout / login flow → 10% E2E Tests (Playwright / Cypress).
|
|
557
152
|
```
|
|
558
153
|
|
|
559
|
-
|
|
154
|
+
### Step 2 — Lập Ma trận Kịch bản (Test Scenario Matrix)
|
|
560
155
|
```
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
156
|
+
Ví dụ với hàm transferMoney(fromId, toId, amount):
|
|
157
|
+
1. TC-01 (Happy): Chuyển tiền thành công khi số dư đủ, trừ tài khoản A, cộng tài khoản B.
|
|
158
|
+
2. TC-02 (Edge): Chuyển đúng bằng số dư hiện có (số dư về 0).
|
|
159
|
+
3. TC-03 (Error): Chuyển số tiền âm hoặc = 0 -> Ném ValidationError.
|
|
160
|
+
4. TC-04 (Error): Số dư không đủ -> Ném InsufficientFundsError.
|
|
161
|
+
5. TC-05 (Edge): fromId trùng toId -> Ném SelfTransferError.
|
|
162
|
+
6. TC-06 (Concur): 2 giao dịch đồng thời -> Xử lý lock/transaction an toàn.
|
|
565
163
|
```
|
|
566
164
|
|
|
567
|
-
|
|
165
|
+
### Step 3 — Viết Code Kiểm thử (Test Implementation)
|
|
166
|
+
```
|
|
167
|
+
Tuân thủ cấu trúc AAA:
|
|
168
|
+
// 1. Arrange: Chuẩn bị dữ liệu mẫu và mock
|
|
169
|
+
const user = createMockUser({ balance: 100 });
|
|
170
|
+
|
|
171
|
+
// 2. Act: Gọi hàm cần test
|
|
172
|
+
const result = await transferMoney(user.id, recipient.id, 50);
|
|
173
|
+
|
|
174
|
+
// 3. Assert: Kiểm tra kết quả
|
|
175
|
+
expect(result.status).toBe('SUCCESS');
|
|
176
|
+
expect(user.balance).toBe(50);
|
|
177
|
+
```
|
|
568
178
|
|
|
179
|
+
### Step 4 — Verification & Chạy Test Thực Tế
|
|
569
180
|
```
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
-
|
|
573
|
-
|
|
574
|
-
1. Bạn có thể cung cấp thêm thông tin về yêu cầu này không?
|
|
575
|
-
2. Mục tiêu chính của bạn là gì?
|
|
576
|
-
Recommended Assumptions: none
|
|
181
|
+
Actions:
|
|
182
|
+
- Chạy lệnh test thật qua terminal (`npm test -- run`, `pytest -v`, `go test ./...`).
|
|
183
|
+
- Đảm bảo toàn bộ test cases đều PASS (Màu xanh).
|
|
184
|
+
- Đảm bảo test chạy độc lập (Isolated), không phụ thuộc vào thứ tự thực thi.
|
|
577
185
|
```
|
|
578
186
|
|
|
579
|
-
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Prompt Template
|
|
580
190
|
|
|
581
|
-
### Consumes
|
|
582
|
-
```json
|
|
583
|
-
{
|
|
584
|
-
"from": "user or qk-orchestrator",
|
|
585
|
-
"required_fields": ["context"],
|
|
586
|
-
"optional_fields": ["existing_config"]
|
|
587
|
-
}
|
|
588
191
|
```
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
"output_fields": ["strategy_report", "exit_code"]
|
|
595
|
-
}
|
|
192
|
+
Target: [File hoặc Function cần viết test: vd: src/services/PaymentService.ts]
|
|
193
|
+
Framework: [Vitest / Jest / Pytest / Playwright]
|
|
194
|
+
Level: [Unit / Integration / E2E]
|
|
195
|
+
Phụ thuộc: [Cần mock Stripe API, PostgreSQL DB]
|
|
196
|
+
Yêu cầu: [Cover các trường hợp lỗi mạng, thẻ hết hạn, concurrency]
|
|
596
197
|
```
|
|
597
198
|
|
|
598
|
-
|
|
199
|
+
### Ví dụ theo Stack:
|
|
599
200
|
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
201
|
+
**Vitest (Unit Test cho Business Logic)**
|
|
202
|
+
```
|
|
203
|
+
Target: calculateDiscount(cart, coupon)
|
|
204
|
+
Framework: Vitest + TypeScript
|
|
205
|
+
Yêu cầu: Test giảm giá phần trăm, giảm giá cố định, mã hết hạn, coupon vượt quá tổng giá trị đơn hàng.
|
|
206
|
+
```
|
|
207
|
+
→ AI tạo: `tests/unit/calculateDiscount.test.ts` với đầy đủ 6 test cases, kiểm tra boundary condition `Math.max(0, total - discount)`.
|
|
208
|
+
|
|
209
|
+
**Pytest (Integration Test cho FastAPI Endpoint)**
|
|
210
|
+
```
|
|
211
|
+
Target: POST /api/v1/items
|
|
212
|
+
Framework: Pytest + httpx AsyncClient
|
|
213
|
+
Yêu cầu: Test tạo item thành công (201), validate body thiếu trường bắt buộc (422), unauthenticated (401).
|
|
214
|
+
```
|
|
215
|
+
→ AI tạo: `tests/test_items_api.py`, sử dụng pytest fixture cho test DB session và test client.
|