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-db-optimizer
|
|
4
|
-
version: 9.
|
|
4
|
+
version: 9.2.0
|
|
5
5
|
status: stable
|
|
6
|
-
description: "Tối ưu Database dựa trên bằng chứng
|
|
6
|
+
description: "Tối ưu hiệu năng Database dựa trên bằng chứng kỹ thuật: phân tích EXPLAIN/ANALYZE, phát hiện N+1 queries, thiết kế Composite/Partial Index, refactor câu truy vấn chậm. Dùng skill này khi user nhắc đến: tối ưu query, query chậm, optimize db, thêm index, explain, slow query, n+1 query, lag database — kể cả khi chỉ nói 'câu SQL này chạy mất 5 giây'."
|
|
7
7
|
platforms: [antigravity, claude-code, cursor, windsurf, kilo-code]
|
|
8
8
|
|
|
9
9
|
# ── V9: Classification ─────────────────────────────────────
|
|
@@ -17,15 +17,20 @@ complexity:
|
|
|
17
17
|
level: high
|
|
18
18
|
criteria:
|
|
19
19
|
files_affected: "1-5"
|
|
20
|
-
has_behavior_change:
|
|
20
|
+
has_behavior_change: false
|
|
21
21
|
has_external_dependency: true
|
|
22
22
|
has_breaking_change: false
|
|
23
23
|
|
|
24
|
-
triggers:
|
|
25
|
-
- "tối ưu query"
|
|
26
|
-
- "query chậm"
|
|
27
|
-
- "optimize db"
|
|
28
|
-
- "thêm index"
|
|
24
|
+
triggers:
|
|
25
|
+
- "tối ưu query"
|
|
26
|
+
- "query chậm"
|
|
27
|
+
- "optimize db"
|
|
28
|
+
- "thêm index"
|
|
29
|
+
- "explain"
|
|
30
|
+
- "slow query"
|
|
31
|
+
- "n+1 query"
|
|
32
|
+
- "lag database"
|
|
33
|
+
|
|
29
34
|
|
|
30
35
|
# ── V8: References ─────────────────────────────────────────
|
|
31
36
|
workflow: refactor
|
|
@@ -40,11 +45,13 @@ tools:
|
|
|
40
45
|
|
|
41
46
|
related_skills:
|
|
42
47
|
- qk-data-lifecycle
|
|
48
|
+
- qk-refactor
|
|
43
49
|
|
|
44
50
|
knowledge_scope:
|
|
45
51
|
owns:
|
|
46
52
|
- database-performance
|
|
47
53
|
- query-optimization
|
|
54
|
+
- index-engineering
|
|
48
55
|
references:
|
|
49
56
|
- architecture
|
|
50
57
|
- anti-patterns
|
|
@@ -71,526 +78,133 @@ produces: [code, report]
|
|
|
71
78
|
consumes: [query-log, source-code]
|
|
72
79
|
|
|
73
80
|
token_budget:
|
|
74
|
-
max_files_read:
|
|
75
|
-
max_lines_per_read:
|
|
81
|
+
max_files_read: 5
|
|
82
|
+
max_lines_per_read: 150
|
|
76
83
|
max_shell_commands: 2
|
|
77
84
|
stop_early: true
|
|
78
85
|
|
|
79
|
-
exit_codes: [SUCCESS, BLOCKED, FAILED, PARTIAL]
|
|
86
|
+
exit_codes: [SUCCESS, BLOCKED, FAILED, PARTIAL]
|
|
80
87
|
---
|
|
81
88
|
|
|
82
|
-
# qk-db-optimizer — Database Performance Tuner
|
|
89
|
+
# qk-db-optimizer — Evidence-Based Database Performance Tuner
|
|
83
90
|
|
|
84
91
|
> **Language rule:** Code, identifiers, file names → English. Explanations, summaries → Vietnamese.
|
|
85
92
|
|
|
93
|
+
Chịu trách nhiệm chẩn đoán và khắc phục điểm nghẽn hiệu năng cơ sở dữ liệu dựa trên **bằng chứng đo lường thực tế**: `EXPLAIN (ANALYZE, BUFFERS)` → tìm root cause → đề xuất Index / Query Rewrite — **tuyệt đối không đoán mò**.
|
|
94
|
+
|
|
86
95
|
---
|
|
87
96
|
|
|
88
|
-
## Memory Workflow
|
|
89
|
-
|
|
90
|
-
### 0. Self-Init Protocol (Khởi Tạo Bộ Nhớ Local & Gitignore)
|
|
91
|
-
- 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:
|
|
92
|
-
- **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.
|
|
93
|
-
- **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.
|
|
94
|
-
|
|
95
|
-
---
|
|
96
|
-
|
|
97
|
-
### Pre-flight Retrieve (Trước khi thực thi)
|
|
98
|
-
- Trước các task có tính lặp lại, debug, refactor, kiến trúc hoặc rủi ro cao:
|
|
99
|
-
bắt buộc tra cứu:
|
|
100
|
-
- `.ai-local/knowledge/index.yaml` (Private Local Knowledge)
|
|
101
|
-
|
|
102
|
-
- Ưu tiên sử dụng các Knowledge đang có trạng thái `Active` thuộc:
|
|
103
|
-
- Architecture
|
|
104
|
-
- Hard Bug
|
|
105
|
-
- Convention
|
|
106
|
-
- Pattern
|
|
107
|
-
- Tech Debt Pattern
|
|
108
|
-
- 👉 *Domain Focus:* Pattern / Hard Bug (vd: lỗi slow query từng gặp, kế hoạch index đã duyệt).
|
|
109
|
-
|
|
110
|
-
- Memory chỉ đóng vai trò **Navigator (bản đồ chỉ đường)**.
|
|
111
|
-
Không được xem Memory là Source of Truth.
|
|
112
|
-
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.
|
|
113
|
-
|
|
114
|
-
---
|
|
115
|
-
|
|
116
|
-
### Learning Flow (AI tự học có kiểm soát)
|
|
117
|
-
- 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:
|
|
118
|
-
- Hard Bug có khả năng tái diễn.
|
|
119
|
-
- Pattern làm việc lặp lại trong dự án.
|
|
120
|
-
- Convention hoặc quy tắc kiến trúc mới.
|
|
121
|
-
- Quyết định Architecture quan trọng.
|
|
122
|
-
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
123
|
-
- 👉 *Domain Harvest:* Quyết định Architecture hoặc Pattern tối ưu (vd: chuẩn composite index, partition strategy).
|
|
124
|
-
|
|
125
|
-
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
126
|
-
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
127
|
-
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
128
|
-
|
|
129
|
-
---
|
|
130
|
-
|
|
131
|
-
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
132
|
-
Sau khi hoàn thành task:
|
|
133
|
-
- AI đánh giá các Candidate Memory đã tạo.
|
|
134
|
-
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
135
|
-
- Đề xuất người dùng xem xét.
|
|
136
|
-
- Gửi yêu cầu phê duyệt thông qua:
|
|
137
|
-
- `/learn`
|
|
138
|
-
- `qk-project-memory`
|
|
139
|
-
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
140
|
-
|
|
141
|
-
```
|
|
142
|
-
.ai-local/candidates/ ──(Approve)──> .ai-local/knowledge/index.yaml
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
146
|
-
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
|
|
150
|
-
### Ignore (Không đưa vào Memory)
|
|
151
|
-
Không lưu:
|
|
152
|
-
- Trace log của một session đơn lẻ.
|
|
153
|
-
- Temporary debugging data.
|
|
154
|
-
- Output của một lần chạy test/scan.
|
|
155
|
-
- Report health tạm thời của một đợt kiểm tra.
|
|
156
|
-
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
157
|
-
- Thông tin không có khả năng tái sử dụng.
|
|
158
|
-
- 👉 *Domain Ignore:* Dữ liệu kết quả EXPLAIN tạm thời của 1 query.
|
|
159
|
-
|
|
160
|
-
---
|
|
161
|
-
|
|
162
|
-
### Golden Rule
|
|
163
|
-
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
164
|
-
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
165
|
-
|
|
166
|
-
---
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
### 0. Self-Init Protocol (Khởi Tạo Bộ Nhớ Local & Gitignore)
|
|
171
|
-
- 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:
|
|
172
|
-
- **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.
|
|
173
|
-
- **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.
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
### Pre-flight Retrieve (Trước khi thực thi)
|
|
178
|
-
- Trước các task có tính lặp lại, debug, refactor, kiến trúc hoặc rủi ro cao:
|
|
179
|
-
bắt buộc tra cứu:
|
|
180
|
-
- `.ai-local/knowledge/index.yaml` (Private Local Knowledge)
|
|
181
|
-
|
|
182
|
-
- Ưu tiên sử dụng các Knowledge đang có trạng thái `Active` thuộc:
|
|
183
|
-
- Architecture
|
|
184
|
-
- Hard Bug
|
|
185
|
-
- Convention
|
|
186
|
-
- Pattern
|
|
187
|
-
- Tech Debt Pattern
|
|
188
|
-
- 👉 *Domain Focus:* Pattern / Hard Bug (vd: lỗi slow query từng gặp, kế hoạch index đã duyệt).
|
|
189
|
-
|
|
190
|
-
- Memory chỉ đóng vai trò **Navigator (bản đồ chỉ đường)**.
|
|
191
|
-
Không được xem Memory là Source of Truth.
|
|
192
|
-
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.
|
|
193
|
-
|
|
194
|
-
---
|
|
195
|
-
|
|
196
|
-
### Learning Flow (AI tự học có kiểm soát)
|
|
197
|
-
- 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:
|
|
198
|
-
- Hard Bug có khả năng tái diễn.
|
|
199
|
-
- Pattern làm việc lặp lại trong dự án.
|
|
200
|
-
- Convention hoặc quy tắc kiến trúc mới.
|
|
201
|
-
- Quyết định Architecture quan trọng.
|
|
202
|
-
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
203
|
-
- 👉 *Domain Harvest:* Quyết định Architecture hoặc Pattern tối ưu (vd: chuẩn composite index, partition strategy).
|
|
204
|
-
|
|
205
|
-
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
206
|
-
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
207
|
-
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
212
|
-
Sau khi hoàn thành task:
|
|
213
|
-
- AI đánh giá các Candidate Memory đã tạo.
|
|
214
|
-
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
215
|
-
- Đề xuất người dùng xem xét.
|
|
216
|
-
- Gửi yêu cầu phê duyệt thông qua:
|
|
217
|
-
- `/learn`
|
|
218
|
-
- `qk-project-memory`
|
|
219
|
-
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
220
|
-
|
|
221
|
-
```
|
|
222
|
-
.ai-local/candidates/ ──(Approve)──> .ai-local/knowledge/index.yaml
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
226
|
-
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
227
|
-
|
|
228
|
-
---
|
|
229
|
-
|
|
230
|
-
### Ignore (Không đưa vào Memory)
|
|
231
|
-
Không lưu:
|
|
232
|
-
- Trace log của một session đơn lẻ.
|
|
233
|
-
- Temporary debugging data.
|
|
234
|
-
- Output của một lần chạy test/scan.
|
|
235
|
-
- Report health tạm thời của một đợt kiểm tra.
|
|
236
|
-
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
237
|
-
- Thông tin không có khả năng tái sử dụng.
|
|
238
|
-
- 👉 *Domain Ignore:* Dữ liệu kết quả EXPLAIN tạm thời của 1 query.
|
|
239
|
-
|
|
240
|
-
---
|
|
241
|
-
|
|
242
|
-
### Golden Rule
|
|
243
|
-
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
244
|
-
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
245
|
-
|
|
246
|
-
---
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
### Pre-flight Retrieve (Trước khi thực thi)
|
|
251
|
-
- Trước các task có tính lặp lại, debug, refactor, kiến trúc hoặc rủi ro cao:
|
|
252
|
-
bắt buộc tra cứu:
|
|
253
|
-
- `.agents/knowledge/index.yaml` (Shared Project Knowledge)
|
|
254
|
-
- `.ai-local/knowledge/index.yaml` (Private Local Knowledge)
|
|
255
|
-
|
|
256
|
-
- Ưu tiên sử dụng các Knowledge đang có trạng thái `Active` thuộc:
|
|
257
|
-
- Architecture
|
|
258
|
-
- Hard Bug
|
|
259
|
-
- Convention
|
|
260
|
-
- Pattern
|
|
261
|
-
- Tech Debt Pattern
|
|
262
|
-
- 👉 *Domain Focus:* Pattern / Hard Bug (vd: lỗi slow query từng gặp, kế hoạch index đã duyệt).
|
|
263
|
-
|
|
264
|
-
- Memory chỉ đóng vai trò **Navigator (bản đồ chỉ đường)**.
|
|
265
|
-
Không được xem Memory là Source of Truth.
|
|
266
|
-
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.
|
|
267
|
-
|
|
268
|
-
---
|
|
269
|
-
|
|
270
|
-
### Learning Flow (AI tự học có kiểm soát)
|
|
271
|
-
- 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:
|
|
272
|
-
- Hard Bug có khả năng tái diễn.
|
|
273
|
-
- Pattern làm việc lặp lại trong dự án.
|
|
274
|
-
- Convention hoặc quy tắc kiến trúc mới.
|
|
275
|
-
- Quyết định Architecture quan trọng.
|
|
276
|
-
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
277
|
-
- 👉 *Domain Harvest:* Quyết định Architecture hoặc Pattern tối ưu (vd: chuẩn composite index, partition strategy).
|
|
278
|
-
|
|
279
|
-
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
280
|
-
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
281
|
-
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
282
|
-
|
|
283
|
-
---
|
|
284
|
-
|
|
285
|
-
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
286
|
-
Sau khi hoàn thành task:
|
|
287
|
-
- AI đánh giá các Candidate Memory đã tạo.
|
|
288
|
-
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
289
|
-
- Đề xuất người dùng xem xét.
|
|
290
|
-
- Gửi yêu cầu phê duyệt thông qua:
|
|
291
|
-
- `/learn`
|
|
292
|
-
- `qk-project-memory`
|
|
293
|
-
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
294
|
-
|
|
295
|
-
```
|
|
296
|
-
.ai-local/candidates/ ──(Approve)──> .agents/knowledge/index.yaml
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
300
|
-
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
301
|
-
|
|
302
|
-
---
|
|
303
|
-
|
|
304
|
-
### Ignore (Không đưa vào Memory)
|
|
305
|
-
Không lưu:
|
|
306
|
-
- Trace log của một session đơn lẻ.
|
|
307
|
-
- Temporary debugging data.
|
|
308
|
-
- Output của một lần chạy test/scan.
|
|
309
|
-
- Report health tạm thời của một đợt kiểm tra.
|
|
310
|
-
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
311
|
-
- Thông tin không có khả năng tái sử dụng.
|
|
312
|
-
- 👉 *Domain Ignore:* Dữ liệu kết quả EXPLAIN tạm thời của 1 query.
|
|
313
|
-
|
|
314
|
-
---
|
|
315
|
-
|
|
316
|
-
### Golden Rule
|
|
317
|
-
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
318
|
-
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
319
|
-
|
|
320
|
-
---
|
|
321
|
-
---
|
|
322
|
-
|
|
323
|
-
### Learning Flow (AI tự học có kiểm soát)
|
|
324
|
-
- 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:
|
|
325
|
-
- Hard Bug có khả năng tái diễn.
|
|
326
|
-
- Pattern làm việc lặp lại trong dự án.
|
|
327
|
-
- Convention hoặc quy tắc kiến trúc mới.
|
|
328
|
-
- Quyết định Architecture quan trọng.
|
|
329
|
-
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
330
|
-
- 👉 *Domain Harvest:* Quyết định Architecture hoặc Pattern tối ưu (vd: chuẩn composite index, partition strategy).
|
|
331
|
-
|
|
332
|
-
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
333
|
-
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
334
|
-
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
335
|
-
|
|
336
|
-
---
|
|
337
|
-
|
|
338
|
-
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
339
|
-
Sau khi hoàn thành task:
|
|
340
|
-
- AI đánh giá các Candidate Memory đã tạo.
|
|
341
|
-
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
342
|
-
- Đề xuất người dùng xem xét.
|
|
343
|
-
- Gửi yêu cầu phê duyệt thông qua:
|
|
344
|
-
- `/learn`
|
|
345
|
-
- `qk-project-memory`
|
|
346
|
-
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
347
|
-
|
|
348
|
-
```
|
|
349
|
-
.ai-local/candidates/ ──(Approve)──> .agents/knowledge/index.yaml
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
353
|
-
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
354
|
-
|
|
355
|
-
---
|
|
356
|
-
|
|
357
|
-
### Ignore (Không đưa vào Memory)
|
|
358
|
-
Không lưu:
|
|
359
|
-
- Trace log của một session đơn lẻ.
|
|
360
|
-
- Temporary debugging data.
|
|
361
|
-
- Output của một lần chạy test/scan.
|
|
362
|
-
- Report health tạm thời của một đợt kiểm tra.
|
|
363
|
-
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
364
|
-
- Thông tin không có khả năng tái sử dụng.
|
|
365
|
-
- 👉 *Domain Ignore:* Dữ liệu kết quả EXPLAIN tạm thời của 1 query.
|
|
366
|
-
|
|
367
|
-
---
|
|
368
|
-
|
|
369
|
-
### Golden Rule
|
|
370
|
-
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
371
|
-
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
372
|
-
|
|
373
|
-
---
|
|
374
|
-
---
|
|
375
|
-
|
|
376
|
-
### Learning Flow (AI tự học có kiểm soát)
|
|
377
|
-
- 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:
|
|
378
|
-
- Hard Bug có khả năng tái diễn.
|
|
379
|
-
- Pattern làm việc lặp lại trong dự án.
|
|
380
|
-
- Convention hoặc quy tắc kiến trúc mới.
|
|
381
|
-
- Quyết định Architecture quan trọng.
|
|
382
|
-
- Tech Debt Pattern hoặc Code Smell có tính hệ thống.
|
|
383
|
-
- 👉 *Domain Harvest:* Quyết định Architecture hoặc Pattern tối ưu (vd: chuẩn composite index, partition strategy).
|
|
384
|
-
|
|
385
|
-
- Candidate Memory chỉ là bản nháp quan sát, chưa phải tri thức chính thức.
|
|
386
|
-
- Candidate Memory có thể lưu tạm tại: `.ai-local/candidates/`
|
|
387
|
-
- AI không được tự động Promote Candidate Memory thành Project Knowledge.
|
|
388
|
-
|
|
389
|
-
---
|
|
390
|
-
|
|
391
|
-
### Post-flight Harvest (Đề xuất → Phê duyệt)
|
|
392
|
-
Sau khi hoàn thành task:
|
|
393
|
-
- AI đánh giá các Candidate Memory đã tạo.
|
|
394
|
-
- Nếu phát hiện tri thức có giá trị tái sử dụng:
|
|
395
|
-
- Đề xuất người dùng xem xét.
|
|
396
|
-
- Gửi yêu cầu phê duyệt thông qua:
|
|
397
|
-
- `/learn`
|
|
398
|
-
- `qk-project-memory`
|
|
399
|
-
- Chỉ sau khi được phê duyệt, Candidate Memory mới được chuyển thành Knowledge chính thức:
|
|
400
|
-
|
|
401
|
-
```
|
|
402
|
-
.ai-local/candidates/ ──(Approve)──> .agents/knowledge/index.yaml
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
- Project Knowledge phải được xem như tài sản kỹ thuật của dự án:
|
|
406
|
-
- Có thể review, cập nhật, loại bỏ và có lịch sử thay đổi.
|
|
407
|
-
|
|
408
|
-
---
|
|
409
|
-
|
|
410
|
-
### Ignore (Không đưa vào Memory)
|
|
411
|
-
Không lưu:
|
|
412
|
-
- Trace log của một session đơn lẻ.
|
|
413
|
-
- Temporary debugging data.
|
|
414
|
-
- Output của một lần chạy test/scan.
|
|
415
|
-
- Report health tạm thời của một đợt kiểm tra.
|
|
416
|
-
- Lỗi nhỏ chỉ xảy ra một lần.
|
|
417
|
-
- Thông tin không có khả năng tái sử dụng.
|
|
418
|
-
- 👉 *Domain Ignore:* Dữ liệu kết quả EXPLAIN tạm thời của 1 query.
|
|
419
|
-
|
|
420
|
-
---
|
|
421
|
-
|
|
422
|
-
### Golden Rule
|
|
423
|
-
> **AI được phép học, nhưng không được tự quyết định tri thức chính thức.**
|
|
424
|
-
> **AI quan sát → Đề xuất → Con người phê duyệt → Dự án tiến hóa.**
|
|
425
|
-
|
|
426
|
-
---
|
|
427
|
-
---
|
|
428
|
-
---
|
|
429
|
-
---
|
|
430
|
-
|
|
431
97
|
## Preconditions
|
|
432
|
-
- [ ] Slow query log OR specific slow query is provided
|
|
433
|
-
- [ ] Database schema/ORM models accessible
|
|
434
98
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
99
|
+
Trước khi đề xuất tối ưu, AI BẮT BUỘC xác nhận:
|
|
100
|
+
|
|
101
|
+
- [ ] Đoạn query cụ thể (SQL thô hoặc câu gọi ORM) đang bị chậm.
|
|
102
|
+
- [ ] Schema định nghĩa bảng và **danh sách index hiện có** trên các cột liên quan.
|
|
103
|
+
- [ ] Output `EXPLAIN` hoặc `EXPLAIN ANALYZE` (nếu môi trường cho phép chạy query).
|
|
104
|
+
- [ ] Quy mô dữ liệu ước tính (e.g. bảng có 1.000 rows hay 50.000.000 rows).
|
|
105
|
+
|
|
106
|
+
*Nếu user yêu cầu "tối ưu database" mà không cung cấp query cụ thể hoặc slow log:*
|
|
107
|
+
→ **EXIT: BLOCKED**
|
|
108
|
+
→ Phản hồi: "Vui lòng cung cấp câu query bị chậm hoặc output log EXPLAIN để phân tích chính xác."
|
|
440
109
|
|
|
441
110
|
---
|
|
442
111
|
|
|
443
112
|
## Scope
|
|
444
|
-
- ✅ Analyze EXPLAIN/query plans before adding indexes
|
|
445
|
-
- ✅ Solve N+1 with Data Loaders or explicit Joins
|
|
446
|
-
- ✅ Validate performance improvement
|
|
447
113
|
|
|
448
|
-
|
|
449
|
-
-
|
|
450
|
-
-
|
|
451
|
-
-
|
|
114
|
+
✅ Skill này làm:
|
|
115
|
+
- Phân tích Execution Plan: Xác định `Seq Scan` trên bảng lớn, `Nested Loop` kém hiệu quả, `Temporary disk spill`, hoặc `Filter cost` cao.
|
|
116
|
+
- Phát hiện và giải quyết triệt để **N+1 queries** trong ORM (Prisma, Drizzle, Hibernate, ActiveRecord).
|
|
117
|
+
- Thiết kế Index chính xác: Composite Index (tuân thủ quy tắc Left-to-Right prefix), Partial Index (lọc `WHERE is_deleted = false`), Covering Index (`INCLUDE`).
|
|
118
|
+
- Tái cấu trúc câu truy vấn (Query rewrite): Chuyển `OFFSET` lớn sang Keyset Pagination (Cursor-based), thay `NOT IN` bằng `NOT EXISTS` hoặc `LEFT JOIN ... IS NULL`.
|
|
119
|
+
- Báo cáo định lượng trước và sau (Before / After Cost & Execution Time).
|
|
452
120
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|---|-----------|--------|----------------|
|
|
458
|
-
| P1 | Sequential scan on large table (> 10k rows) | Add composite index | Never |
|
|
459
|
-
| P2 | N+1 query pattern | Eager load / DataLoader (Ưu tiên theo chuẩn dự án, không tự chế query lồng) | Budget < 30% |
|
|
460
|
-
| P3 | Missing JOIN (multiple queries for related data) | Rewrite with JOIN | Budget < 50% |
|
|
461
|
-
| P4 | SELECT * (over-fetching) | Select specific columns | Budget < 60% |
|
|
121
|
+
❌ Skill này KHÔNG làm:
|
|
122
|
+
- Thêm index bừa bãi vào mọi cột (làm chậm `INSERT`, `UPDATE`, tăng dung lượng đĩa).
|
|
123
|
+
- Tự ý thay đổi cấu trúc bảng hoặc drop cột (thuộc `qk-data-lifecycle`).
|
|
124
|
+
- Can thiệp phần cứng DB hoặc tune memory server nếu không có file cấu hình repo.
|
|
462
125
|
|
|
463
126
|
---
|
|
464
127
|
|
|
465
|
-
##
|
|
128
|
+
## Execution Steps
|
|
466
129
|
|
|
130
|
+
### Step 1 — Thu thập Query & Phân tích EXPLAIN Plan
|
|
467
131
|
```
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
IF "Nested Loop" with many iterations
|
|
476
|
-
→ Check: is this N+1?
|
|
477
|
-
→ IF yes → rewrite as single JOIN or use DataLoader
|
|
478
|
-
|
|
479
|
-
IF "Sort" without index
|
|
480
|
-
→ Add index on ORDER BY column
|
|
481
|
-
|
|
482
|
-
IF index exists but not used ("Index Scan" missing)
|
|
483
|
-
→ Check: is WHERE clause using non-leading column of composite index?
|
|
484
|
-
→ Reorder composite index columns
|
|
132
|
+
Inputs: Slow query SQL/ORM, Schema & Existing Indexes
|
|
133
|
+
Actions:
|
|
134
|
+
- Đọc câu query: xác định predicates (WHERE, JOIN, ORDER BY, GROUP BY).
|
|
135
|
+
- Đọc EXPLAIN output (nếu có):
|
|
136
|
+
- Tìm Node có `Cost` cao nhất.
|
|
137
|
+
- Kiểm tra `Rows Removed by Filter` (dấu hiệu thiếu index).
|
|
138
|
+
- Kiểm tra Sort method (in-memory quicksort hay external merge on disk).
|
|
485
139
|
```
|
|
486
140
|
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
## Workflow
|
|
490
|
-
|
|
491
|
-
### Phase 1 — Evidence Collection
|
|
492
|
-
1. Read slow query log or provided query
|
|
493
|
-
2. Run EXPLAIN ANALYZE (1 command) — or analyze ORM-generated SQL
|
|
494
|
-
3. Identify bottleneck pattern (seq scan / N+1 / sort / over-fetch)
|
|
495
|
-
|
|
496
|
-
### Phase 2 — Solution Design
|
|
497
|
-
1. Apply Decision Tree above
|
|
498
|
-
2. Design minimal index or query rewrite
|
|
499
|
-
|
|
500
|
-
### Phase 3 — Apply & Verify
|
|
501
|
-
1. Apply change (add index migration OR rewrite query via `replace_file_content`)
|
|
502
|
-
2. (Optional) Re-run EXPLAIN to verify improvement (2nd command)
|
|
503
|
-
|
|
504
|
-
**Decision:**
|
|
141
|
+
### Step 2 — Chẩn đoán Root Cause
|
|
505
142
|
```
|
|
506
|
-
|
|
507
|
-
|
|
143
|
+
Xác định vấn đề cốt lõi:
|
|
144
|
+
- Missing Index: Cột lọc không có index dẫn tới Full Table Scan.
|
|
145
|
+
- Sub-optimal Index: Có index nhưng sai thứ tự cột trong Composite Index.
|
|
146
|
+
- Implicit Type Casting: So sánh varchar với int làm database vô hiệu hóa index.
|
|
147
|
+
- N+1 Query: Gọi loop query con thay vì batch load.
|
|
148
|
+
- Expensive Pagination: `OFFSET 100000` quét qua 100.000 dòng rồi vứt bỏ.
|
|
508
149
|
```
|
|
509
150
|
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
## Evidence Format
|
|
151
|
+
### Step 3 — Thiết kế Giải pháp Tối ưu
|
|
513
152
|
```
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
153
|
+
Actions:
|
|
154
|
+
- Chiến lược Index:
|
|
155
|
+
- Composite Index: Đặt cột equality (`=`) trước, cột range (`<`, `>`, `BETWEEN`) sau.
|
|
156
|
+
- Partial Index: Khi chỉ query tập con dữ liệu (VD: `WHERE status = 'PENDING'`).
|
|
157
|
+
- Chiến lược Query Rewrite:
|
|
158
|
+
- Viết lại sang Cursor Pagination (`WHERE id > :last_id LIMIT 20`).
|
|
159
|
+
- Dùng CTE hoặc Window functions thay cho multiple subqueries lặp lại.
|
|
160
|
+
- Chiến lược ORM: Thêm `include`/`select` cụ thể, tránh `SELECT *`, áp dụng batch loader.
|
|
520
161
|
```
|
|
521
162
|
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
| FAILED | Optimization breaks existing test or query syntax | Logic error |
|
|
531
|
-
|
|
532
|
-
---
|
|
533
|
-
|
|
534
|
-
## Confidence Model
|
|
535
|
-
| Level | Condition | Action |
|
|
536
|
-
|-------|-----------|--------|
|
|
537
|
-
| HIGH | EXPLAIN plan shows SEQ SCAN, user confirms index is missing | Add index / rewrite |
|
|
538
|
-
| MEDIUM | Query looks inefficient but no EXPLAIN available | Ask to run EXPLAIN |
|
|
539
|
-
| LOW | "Make DB faster" with no slow query log | EXIT: BLOCKED |
|
|
163
|
+
### Step 4 — Verification & So sánh định lượng
|
|
164
|
+
```
|
|
165
|
+
Actions:
|
|
166
|
+
- Đối chiếu Expected Cost trước và sau tối ưu:
|
|
167
|
+
Before: Seq Scan on orders (cost=0.00..45210.00 rows=1200000)
|
|
168
|
+
After: Index Scan using idx_orders_customer_created (cost=0.43..8.45 rows=20)
|
|
169
|
+
- Đảm bảo câu query sau khi rewrite trả về đúng 100% dữ liệu như câu query cũ.
|
|
170
|
+
```
|
|
540
171
|
|
|
541
172
|
---
|
|
542
173
|
|
|
543
|
-
##
|
|
544
|
-
| Level | Definition | Example |
|
|
545
|
-
|-------|-----------|---------|
|
|
546
|
-
| CRITICAL | Query locking table in production | Long running UPDATE |
|
|
547
|
-
| HIGH | Missing index on frequently joined table | Full scan on million rows |
|
|
548
|
-
| MEDIUM | N+1 queries due to missing JOIN | ORM fetching relations in loop |
|
|
549
|
-
| LOW | Over-fetching columns | `SELECT *` instead of specific |
|
|
174
|
+
## Prompt Template
|
|
550
175
|
|
|
551
|
-
---
|
|
552
|
-
|
|
553
|
-
## Retry Policy
|
|
554
176
|
```
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
177
|
+
DB Engine: [PostgreSQL / MySQL / SQLite / MongoDB]
|
|
178
|
+
Slow Query: [Câu SQL hoặc đoạn code ORM cần tối ưu]
|
|
179
|
+
Schema: [Định nghĩa bảng và index hiện tại]
|
|
180
|
+
Triệu chứng: [Chạy mất bao lâu / Execution Plan nếu có]
|
|
181
|
+
Volume: [Số lượng bản ghi trong các bảng liên quan]
|
|
559
182
|
```
|
|
560
183
|
|
|
561
|
-
|
|
184
|
+
### Ví dụ theo Stack:
|
|
562
185
|
|
|
563
|
-
|
|
186
|
+
**PostgreSQL (Composite Index & Keyset Pagination)**
|
|
564
187
|
```
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
- Current schema of the involved tables
|
|
569
|
-
Questions:
|
|
570
|
-
1. Câu query nào đang bị chậm? (Xin SQL / ORM log)
|
|
571
|
-
2. Bảng này hiện đang có những index nào?
|
|
572
|
-
Recommended Assumptions:
|
|
573
|
-
- Do NOT assume table size or indexes blindly
|
|
188
|
+
DB Engine: PostgreSQL 15
|
|
189
|
+
Slow Query: SELECT * FROM orders WHERE customer_id = 123 AND status = 'COMPLETED' ORDER BY created_at DESC LIMIT 20 OFFSET 50000;
|
|
190
|
+
Volume: Bảng orders có 10 triệu records. Hiện có index trên (customer_id).
|
|
574
191
|
```
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
"required_fields": ["slow_query"],
|
|
584
|
-
"optional_fields": ["schema", "explain_plan", "db_engine"]
|
|
585
|
-
}
|
|
192
|
+
→ AI chẩn đoán:
|
|
193
|
+
1. Offset 50.000 buộc engine quét qua 50.000 index entries.
|
|
194
|
+
2. Index hiện tại thiếu `status` và `created_at`.
|
|
195
|
+
→ AI giải pháp:
|
|
196
|
+
1. Đề xuất Composite Index: `CREATE INDEX CONCURRENTLY idx_orders_cust_stat_created ON orders (customer_id, status, created_at DESC);`
|
|
197
|
+
2. Rewrite sang Cursor Pagination: `SELECT id, total, created_at FROM orders WHERE customer_id = 123 AND status = 'COMPLETED' AND created_at < :last_created_at ORDER BY created_at DESC LIMIT 20;`
|
|
198
|
+
|
|
199
|
+
**Prisma ORM (Khắc phục N+1 Query)**
|
|
586
200
|
```
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
{
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
}
|
|
201
|
+
ORM: Prisma
|
|
202
|
+
Code:
|
|
203
|
+
const users = await prisma.user.findMany({ take: 50 });
|
|
204
|
+
for (const user of users) {
|
|
205
|
+
user.posts = await prisma.post.findMany({ where: { authorId: user.id } });
|
|
206
|
+
}
|
|
593
207
|
```
|
|
594
|
-
|
|
595
|
-
|
|
208
|
+
→ AI sửa thành single query batching với eager load:
|
|
209
|
+
`const users = await prisma.user.findMany({ take: 50, include: { posts: { select: { id: true, title: true } } } });`
|
|
596
210
|
|