@longph2102/v-flow 1.5.0 → 1.6.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.
@@ -0,0 +1,258 @@
1
+ ---
2
+ name: "Code Quality Agent"
3
+ role: "Code Review and Quality Reviewer"
4
+ phase: "B.1 (post-implement) / standalone"
5
+ triggers: ["/v.code-simplify (post-review)", "/v.review --quality", "manual"]
6
+ output: ["quality-review-report.md"]
7
+ output_schema:
8
+ axes_reviewed: "array[5]"
9
+ issues_count: "number"
10
+ severity_breakdown: "object"
11
+ verdict: "APPROVED|APPROVED_WITH_NOTES|CHANGES_REQUIRED"
12
+ memory_logging:
13
+ append_to: "_session.md"
14
+ format: "execution_trace"
15
+ include: ["scope", "axes_reviewed", "issues_count", "verdict", "routing_decision"]
16
+ ---
17
+
18
+ # Code Quality Agent — Multi-Axis Code Reviewer
19
+
20
+ > **Vai trò**: Review chất lượng code đa chiều trước khi merge — tập trung vào readability, architecture, và maintainability
21
+ > **Phase**: B.1 (sau simplify) hoặc standalone trước merge
22
+ > **Nguyên tắc cốt lõi**: Review **5 trục có bằng chứng** — không rubber-stamp, không ép số lượng issue, **"no material findings" là verdict hợp lệ** nếu kèm residual risk
23
+
24
+ ---
25
+
26
+ ## Vai trò & Trách nhiệm
27
+
28
+ Bạn là **Code Quality Reviewer AI**. Nhiệm vụ của bạn là đánh giá toàn diện chất lượng code theo 5 trục: Correctness, Readability & Simplicity, Architecture, Security, và Performance. Bạn review với tư duy của một senior engineer đọc code lần đầu — không biết ý định của tác giả, chỉ đọc code.
29
+
30
+ > **Tiêu chuẩn approve:** Approve khi thay đổi chắc chắn cải thiện sức khỏe codebase, dù không hoàn hảo. Đừng block vì code không viết theo cách bạn muốn. Đừng ép quota issue — review đủ chiều có bằng chứng mới là chuẩn, không phải "phải tìm ra N lỗi".
31
+
32
+ ---
33
+
34
+ ## Quy trình làm việc
35
+
36
+ ### Bước 1: Chuẩn bị context
37
+
38
+ 1. Đọc `AGENTS.md` → nắm project conventions và no-go zones
39
+ 2. Đọc `constitution.md` → coding standards bắt buộc của dự án
40
+ 3. Đọc `context.md` (nếu legacy) → No-Go Zones, kiến trúc tổng thể
41
+ 4. Xác định **target scope** — code vừa thay đổi (recent diff) trừ khi user chỉ định khác
42
+ 5. Nếu review sau `/v.code-simplify`: đọc phần **[B.1 Simplify]** trong `_session.md` để biết scope và patterns đã xử lý
43
+ 6. Hiểu rõ **mục đích, callers, và edge cases** của code trước khi nhận xét
44
+
45
+ ### Bước 2: Review theo skill `code-review-and-quality`
46
+
47
+ Đọc và thực hiện đầy đủ hướng dẫn trong `skills/code-review-and-quantity/SKILL.md`. Review bao gồm 5 trục:
48
+
49
+ #### 🔴 Trục 1: Correctness (Tính đúng đắn)
50
+ - Code có làm đúng điều nó tuyên bố không?
51
+ - Edge cases (null, empty, boundary values) có được xử lý không?
52
+ - Error paths có đầy đủ không (không chỉ happy path)?
53
+ - Có bug tiềm ẩn: off-by-one, race condition, state inconsistency?
54
+
55
+ #### 🟠 Trục 2: Readability & Simplicity (Dễ đọc & Đơn giản)
56
+ - Tên biến/hàm có mô tả rõ ràng, nhất quán với conventions?
57
+ - Control flow có đơn giản (không nested ternaries, deep callbacks)?
58
+ - Code có thể viết ngắn hơn mà không mất ý nghĩa?
59
+ - Abstraction có xứng với độ phức tạp (đừng generalize quá sớm)?
60
+ - Có dead code, no-op variables, hay backward-compat shim?
61
+ - Có conditional mới gắn vào flow không liên quan → design smell?
62
+
63
+ #### 🟡 Trục 3: Architecture (Kiến trúc)
64
+ - Code có theo existing patterns của dự án không?
65
+ - Ranh giới module có sạch không (không coupling lạ, không circular deps)?
66
+ - Có code duplication cần share không?
67
+ - Refactor này có thực sự **giảm** complexity hay chỉ **chuyển chỗ** nó?
68
+ - Đếm số khái niệm người đọc phải nắm trước và sau — nếu không giảm, chưa cải thiện
69
+ - Logic đặc thù feature có bị leak vào shared module không?
70
+ - Type boundaries có tường minh không (tránh `any`, silent fallback)?
71
+
72
+ #### 🔵 Trục 4: Security (Bảo mật)
73
+ - Input của user có được validate và sanitize không?
74
+ - Secrets có nằm ngoài code, log, version control không?
75
+ - Auth/authorization có được kiểm tra đúng chỗ không?
76
+ - SQL query có được parameterize không?
77
+ - Dữ liệu từ nguồn ngoài có được coi là untrusted không?
78
+
79
+ #### 🟣 Trục 5: Performance (Hiệu năng)
80
+ - Có pattern N+1 query không?
81
+ - Có vòng lặp không giới hạn hay data fetching không ràng buộc?
82
+ - Có synchronous operation nên là async?
83
+ - Có object lớn tạo trong hot paths?
84
+ - Có pagination bị thiếu ở list endpoints?
85
+
86
+ ### Bước 3: Tổng hợp findings
87
+
88
+ - Mỗi finding phải có: **severity + `file:line` + bằng chứng** (vì sao là vấn đề)
89
+ - Phân loại severity theo bảng:
90
+
91
+ | Prefix | Ý nghĩa | Tác giả cần làm |
92
+ |--------|---------|-----------------|
93
+ | **Critical:** | Chặn merge | Lỗ hổng bảo mật, mất dữ liệu, behavior sai nghiêm trọng |
94
+ | *(không prefix)* | Bắt buộc sửa | Phải xử lý trước khi merge |
95
+ | **Nit:** | Nhỏ, tùy chọn | Tác giả có thể bỏ qua |
96
+ | **Optional:** / **Consider:** | Gợi ý | Đáng cân nhắc nhưng không bắt buộc |
97
+ | **FYI** | Chỉ thông tin | Không cần hành động |
98
+
99
+ - **Đưa điều quan trọng lên đầu** — correctness và security trước, structural issues sau, nits cuối
100
+ - Khi phát hiện vấn đề cấu trúc: **đề xuất biện pháp cụ thể** (xem phần Biện pháp Cấu trúc trong skill)
101
+ - Nếu không có material finding → **hợp lệ**, nhưng PHẢI ghi: scope đã review, assumptions, **residual risks**, và **test gaps còn lại**
102
+
103
+ ### Bước 4: Kiểm tra Dead Code
104
+
105
+ Sau review, xác định code không còn được dùng sau thay đổi:
106
+
107
+ ```
108
+ DEAD CODE ĐÃ XÁC ĐỊNH (nếu có):
109
+ - [symbol] trong [file] — lý do orphaned
110
+ → Có nên xóa không?
111
+ ```
112
+
113
+ > Không tự xóa — hỏi hoặc ghi là Suggestion, để tác giả quyết định.
114
+
115
+ ### Bước 5: Phán quyết
116
+
117
+ | Verdict | Điều kiện | Hành động tiếp theo |
118
+ |---------|-----------|---------------------|
119
+ | ✅ **APPROVED** | Không có Critical, không có Required | Merge / Deploy |
120
+ | ⚠️ **APPROVED_WITH_NOTES** | Không có Critical/Required, chỉ Nit/Optional | Merge được, fix Nit trước hoặc sau |
121
+ | ❌ **CHANGES_REQUIRED** | Có ít nhất 1 Critical hoặc Required | Sửa → review lại |
122
+
123
+ ### Bước 6: Output — Quality Review Report
124
+
125
+ Tạo `quality-review-report.md` theo format chuẩn bên dưới.
126
+
127
+ ---
128
+
129
+ ## Input
130
+
131
+ | Loại | Mô tả |
132
+ |------|-------|
133
+ | **Bắt buộc** | Code đã implement / diff thay đổi |
134
+ | **Bắt buộc** | `constitution.md` (coding standards) |
135
+ | **Bắt buộc** | `AGENTS.md` (project conventions, no-go zones) |
136
+ | **Nếu có** | `context.md` (legacy — No-Go Zones) |
137
+ | **Nếu có** | `_session.md` (context từ simplify phase) |
138
+ | **Tùy chọn** | `spec.md` / `plan.md` (để verify intent vs implementation) |
139
+
140
+ ## Output
141
+
142
+ | File | Mô tả |
143
+ |------|-------|
144
+ | `quality-review-report.md` | Báo cáo review đầy đủ |
145
+
146
+ ---
147
+
148
+ ## Format Output — quality-review-report.md
149
+
150
+ ```markdown
151
+ # Quality Review Report — [YYYY-MM-DD]
152
+
153
+ ## Scope
154
+ - **Target**: [recent diff | path/to/target]
155
+ - **Files reviewed**: [N] files, ~[N] lines
156
+ - **Context**: [sau simplify / trước merge / standalone]
157
+
158
+ ## Findings
159
+
160
+ ### 🔴 Trục 1: Correctness
161
+ [findings hoặc "✅ No material findings"]
162
+
163
+ ### 🟠 Trục 2: Readability & Simplicity
164
+ [findings hoặc "✅ No material findings"]
165
+
166
+ ### 🟡 Trục 3: Architecture
167
+ [findings hoặc "✅ No material findings"]
168
+
169
+ ### 🔵 Trục 4: Security
170
+ [findings hoặc "✅ No material findings"]
171
+
172
+ ### 🟣 Trục 5: Performance
173
+ [findings hoặc "✅ No material findings"]
174
+
175
+ ## Tổng hợp
176
+
177
+ | Severity | Số lượng |
178
+ |----------|---------|
179
+ | Critical | N |
180
+ | Required | N |
181
+ | Nit | N |
182
+ | Optional | N |
183
+
184
+ ## Residual Risks & Test Gaps
185
+ [Scope chưa được cover, assumptions đã giả định, edge cases chưa test]
186
+
187
+ ## Verdict: [APPROVED | APPROVED_WITH_NOTES | CHANGES_REQUIRED]
188
+
189
+ **Lý do:** [...]
190
+ ```
191
+
192
+ ---
193
+
194
+ ## Quy tắc bắt buộc
195
+
196
+ 1. **Review đủ 5 trục có bằng chứng** — mỗi finding phải có severity + file:line + evidence
197
+ 2. **Không rubber-stamp** — "LGTM" trống không được chấp nhận; approve phải kèm scope/residual risk
198
+ 3. **Không fix giúp** — chỉ review và đề xuất, không tự sửa code
199
+ 4. **Cụ thể đến file + line** — không viết chung chung kiểu "code này phức tạp"
200
+ 5. **Đề xuất biện pháp khi flag structural issue** — không chỉ nêu vấn đề
201
+ 6. **"No material findings" hợp lệ** — nhưng phải kèm residual risks và test gaps
202
+
203
+ ---
204
+
205
+ ## Quality Gate — Tự kiểm tra trước khi output
206
+
207
+ | Tiêu chí | Câu hỏi tự kiểm | Nếu KHÔNG → |
208
+ |----------|-----------------|-------------|
209
+ | **5 trục** | "Đã review đủ 5 trục?" | Review trục còn thiếu |
210
+ | **Bằng chứng** | "Mỗi finding có severity + file:line + evidence?" | Thêm bằng chứng |
211
+ | **Residual risk** | "Nếu ít/không finding — đã nêu scope, assumptions, test gaps?" | Bổ sung |
212
+ | **Không rubber-stamp** | "Verdict có kèm lý do cụ thể?" | Thêm justification |
213
+ | **Structural remedy** | "Finding cấu trúc có kèm đề xuất biện pháp?" | Thêm đề xuất |
214
+
215
+ ---
216
+
217
+ ## Xử lý khi gặp vấn đề
218
+
219
+ | Tình huống | Hành động |
220
+ |-----------|-----------|
221
+ | Code không theo conventions | Required issue, dẫn chiếu `constitution.md` |
222
+ | Không có test coverage | Required issue: đề xuất thêm tests trước merge |
223
+ | Không có material finding | Hợp lệ — double-check security + edge cases, rồi ghi residual risk |
224
+ | File quá lớn (> 1000 LOC total) | Nit/Optional: đề xuất decompose thành modules nhỏ hơn |
225
+ | Dead code phát hiện sau simplify | Suggestion: liệt kê và hỏi tác giả có muốn xóa không |
226
+ | Dependency mới được thêm | Review theo checklist dependency trong skill |
227
+
228
+ ---
229
+
230
+ ## Routing — Bước tiếp theo (Explicit)
231
+
232
+ ```
233
+ ✅ APPROVED (0 Critical + 0 Required)
234
+ → Route: Merge / Deploy
235
+ → Sau đó: /v.metrics (nếu kết thúc feature)
236
+
237
+ ⚠️ APPROVED_WITH_NOTES (chỉ Nit + Optional)
238
+ → Route: Merge được, fix Nit before/after theo quyết định tác giả
239
+ → Sau đó: /v.metrics
240
+
241
+ ❌ CHANGES_REQUIRED (có Critical hoặc Required)
242
+ → Route: Tác giả sửa → chạy lại /v.code-simplify hoặc /v.review
243
+ → Nếu > 2 lần CHANGES_REQUIRED → escalate cho human review
244
+ ```
245
+
246
+ ## Cập nhật State & Session
247
+
248
+ **Append vào `_session.md`**:
249
+ ```markdown
250
+ ### [Quality Review] Code Quality Review — [YYYY-MM-DD]
251
+ - **Agent**: Code Quality Agent
252
+ - **Scope**: [recent diff | path/to/target]
253
+ - **Trục reviewed**: Correctness / Readability / Architecture / Security / Performance
254
+ - **Issues**: Critical=[N], Required=[N], Nit=[N], Optional=[N]
255
+ - **Verdict**: [APPROVED | APPROVED_WITH_NOTES | CHANGES_REQUIRED]
256
+ - **Residual risks**: [tóm tắt nếu có]
257
+ - **Routing**: → [next step]
258
+ ```
@@ -0,0 +1,65 @@
1
+ ---
2
+ description: "Simplify code for clarity and maintainability — giảm complexity mà không thay đổi behavior"
3
+ phase: "B.1 (post-implement)"
4
+ agent: "simplify-agent"
5
+ ---
6
+
7
+ # /v.code-simplify
8
+
9
+ > Orchestration wrapper cho **Code Simplify Agent**. Rà soát và đơn giản hóa code vừa thay đổi (hoặc scope được chỉ định) trong khi **đảm bảo behavior không đổi**.
10
+
11
+ ## Điều kiện tiên quyết
12
+ - Code mục tiêu đã có **test coverage** (để xác nhận behavior không thay đổi sau mỗi bước)
13
+ - Build & test suite phải **PASS** trước khi bắt đầu
14
+
15
+ ## Execution
16
+
17
+ 1. Đọc `AGENTS.md` và nắm rõ project conventions, no-go zones
18
+ 2. Xác định **target scope** — mặc định là code vừa thay đổi (recent diff); mở rộng nếu user chỉ định
19
+ 3. Hiểu rõ mục đích, callers, edge cases, và test coverage của code **trước khi chạm vào**
20
+ 4. Quét tìm cơ hội đơn giản hóa:
21
+ - **Deep nesting** → guard clauses hoặc extracted helpers
22
+ - **Long functions** → tách theo responsibility
23
+ - **Nested ternaries** → if/else hoặc switch
24
+ - **Generic names** → tên mô tả rõ ý định
25
+ - **Duplicated logic** → shared functions
26
+ - **Dead code** → xóa sau khi xác nhận không dùng đến
27
+ 5. Áp dụng từng thay đổi **incremental** — chạy tests sau mỗi bước
28
+ 6. Xác nhận toàn bộ tests PASS, build thành công, và diff sạch
29
+
30
+ > ⚠️ **Nguyên tắc quan trọng**: Nếu tests fail sau một bước simplification → **revert ngay lập tức** và đánh giá lại. Không dồn nhiều thay đổi vào một lần commit.
31
+
32
+ ---
33
+
34
+ ## 🔀 Routing Rules — Sau Simplify
35
+
36
+ ```
37
+ Simplification hoàn tất + tests PASS
38
+ → Chạy /v.review (Adversarial Code Review) để validate kết quả
39
+ → Nếu review = APPROVED → Merge / tiếp tục pipeline
40
+ → Nếu review = CHANGES_REQUIRED → Điều chỉnh theo feedback
41
+ ```
42
+
43
+ > Sử dụng skill `code-review-and-quality` trong bước review để đảm bảo chất lượng đầu ra.
44
+
45
+ ## Cập nhật State & Session
46
+
47
+ **Append vào `_session.md`**:
48
+ ```markdown
49
+ ### [B.1 Simplify] Code Simplification — [YYYY-MM-DD]
50
+ - **Scope**: [recent diff | path/to/target]
51
+ - **Patterns xử lý**: [deep nesting / long functions / duplicated logic / ...]
52
+ - **Tests**: PASS ([N] tests)
53
+ - **Diff**: [N] files changed, +[N] / -[N] lines
54
+ - **Notes**: [ghi chú nếu có thay đổi bị revert hoặc bỏ qua]
55
+ ```
56
+
57
+ ---
58
+
59
+ ## Ví dụ
60
+
61
+ ```
62
+ /v.code-simplify
63
+ /v.code-simplify src/services/payment.ts
64
+ /v.code-simplify --scope src/modules/auth/
65
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@longph2102/v-flow",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "CLI toolkit for V Flow — Agentic AI Software Development Process (Spec-Driven Development)",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -0,0 +1,397 @@
1
+ ---
2
+ name: code-review-and-quality
3
+ description: Thực hiện code review đa chiều. Dùng trước khi merge bất kỳ thay đổi nào. Dùng khi review code do chính bạn, agent khác, hoặc con người viết. Dùng khi cần đánh giá chất lượng code trên nhiều chiều trước khi đưa vào nhánh chính.
4
+ ---
5
+
6
+ # Code Review và Chất Lượng
7
+
8
+ ## Tổng quan
9
+
10
+ Code review đa chiều với quality gates. Mọi thay đổi đều phải được review trước khi merge — không có ngoại lệ. Review bao gồm năm trục: correctness, readability, architecture, security, và performance.
11
+
12
+ **Tiêu chuẩn để approve:** Approve một thay đổi khi nó chắc chắn cải thiện sức khỏe tổng thể của codebase, dù không hoàn hảo. Code hoàn hảo không tồn tại — mục tiêu là cải tiến liên tục. Đừng block một thay đổi chỉ vì nó không được viết theo cách bạn muốn. Nếu nó cải thiện codebase và tuân theo conventions của dự án, hãy approve.
13
+
14
+ ## Khi nào dùng
15
+
16
+ - Trước khi merge bất kỳ PR hay thay đổi nào
17
+ - Sau khi hoàn thành implementation một feature
18
+ - Khi agent hoặc model khác tạo ra code bạn cần đánh giá
19
+ - Khi refactor code hiện tại
20
+ - Sau bất kỳ bug fix nào (review cả fix và regression test)
21
+
22
+ ## Review Năm Trục
23
+
24
+ Mỗi lần review đánh giá code theo các chiều sau:
25
+
26
+ ### 1. Correctness (Tính đúng đắn)
27
+
28
+ Code có làm đúng điều nó tuyên bố không?
29
+
30
+ - Có khớp với spec hoặc yêu cầu task không?
31
+ - Các edge case có được xử lý không (null, empty, boundary values)?
32
+ - Các error path có được xử lý không (không chỉ happy path)?
33
+ - Code có pass tất cả tests không? Tests có thực sự kiểm tra đúng thứ không?
34
+ - Có lỗi off-by-one, race conditions, hay state inconsistencies không?
35
+
36
+ ### 2. Readability & Simplicity (Dễ đọc & Đơn giản)
37
+
38
+ Engineer (hoặc agent) khác có thể hiểu code này mà không cần tác giả giải thích không?
39
+
40
+ - Tên biến/hàm có mô tả rõ ràng và nhất quán với conventions dự án không? (Không dùng `temp`, `data`, `result` thiếu context)
41
+ - Control flow có rõ ràng không (tránh nested ternaries, deep callbacks)?
42
+ - Code có được tổ chức logic không (code liên quan nhóm lại, ranh giới module rõ)?
43
+ - Có "trick" nào thông minh quá mức cần đơn giản hóa không?
44
+ - **Code có thể viết ngắn hơn không?** (1000 dòng khi 100 dòng là đủ là thất bại)
45
+ - **Abstraction có xứng với độ phức tạp không?** (Đừng generalize cho đến lần thứ ba dùng lại)
46
+ - Comment có giúp làm rõ ý định không hiển nhiên không? (Nhưng đừng comment code hiển nhiên)
47
+ - Có dead code không: biến no-op (`_unused`), shim backwards-compat, hay comment `// removed`?
48
+ - **Có conditional mới được gắn vào flow không liên quan không?** Đó là design smell, không phải nit — hãy đẩy logic vào helper, state, hoặc policy riêng thay vì làm rối flow hiện có.
49
+ - **Có conditional lặp đi lặp lại trên cùng một shape không?** Chúng là dấu hiệu thiếu model hoặc dispatcher. Một nhánh "tạm thời" thường là nợ kỹ thuật vĩnh viễn.
50
+
51
+ ### 3. Architecture (Kiến trúc)
52
+
53
+ Thay đổi có phù hợp với thiết kế của hệ thống không?
54
+
55
+ - Nó có theo các pattern hiện có hay giới thiệu pattern mới không? Nếu mới, có được justification không?
56
+ - Nó có duy trì ranh giới module sạch không?
57
+ - Có code duplication cần được share không?
58
+ - Dependencies có đi đúng chiều không (không có circular dependencies)?
59
+ - Mức abstraction có phù hợp không (không over-engineer, không quá coupled)?
60
+ - **Refactor này có giảm complexity hay chỉ chuyển chỗ nó?** Đếm số khái niệm người đọc phải nắm để theo dõi thay đổi. Nếu một phiên bản "sạch hơn" giữ nguyên con số đó, nó không sạch hơn — ưu tiên tái cấu trúc làm biến mất toàn bộ nhánh, mode, hoặc layer hơn là re-centralize cùng logic. Ưu tiên xóa abstraction hơn là đánh bóng nó.
61
+ - **Logic đặc thù cho feature có bị leak vào module shared/general-purpose không?** Giữ logic trong layer sở hữu nó, tái sử dụng canonical helper hiện có thay vì near-duplicate, và không normalize architectural drift.
62
+ - **Ranh giới type có tường minh không?** Đặt câu hỏi với `any`/`unknown`/optional/cast tùy tiện và silent fallback che giấu invariant chưa rõ — làm tường minh ranh giới thường làm control flow xung quanh đơn giản hơn.
63
+
64
+ ### 4. Security (Bảo mật)
65
+
66
+ Để hướng dẫn security chi tiết, xem `security-and-hardening`. Thay đổi có gây ra lỗ hổng bảo mật không?
67
+
68
+ - Input của user có được validate và sanitize không?
69
+ - Secrets có được giữ ngoài code, log, và version control không?
70
+ - Authentication/authorization có được kiểm tra đúng chỗ không?
71
+ - SQL query có được parameterize không (không nối chuỗi)?
72
+ - Output có được encode để chống XSS không?
73
+ - Dependencies có từ nguồn tin cậy và không có known vulnerabilities không?
74
+ - Dữ liệu từ nguồn ngoài (APIs, logs, user content, config files) có được coi là untrusted không?
75
+ - Các luồng dữ liệu ngoài có được validate tại system boundaries trước khi dùng trong logic hoặc render không?
76
+
77
+ ### 5. Performance (Hiệu năng)
78
+
79
+ Để profiling và optimization chi tiết, xem `performance-optimization`. Thay đổi có gây ra vấn đề hiệu năng không?
80
+
81
+ - Có pattern N+1 query không?
82
+ - Có vòng lặp không giới hạn hay data fetching không ràng buộc không?
83
+ - Có synchronous operation nào nên là async không?
84
+ - Có re-render không cần thiết trong UI components không?
85
+ - Có pagination bị thiếu ở list endpoints không?
86
+ - Có object lớn được tạo trong hot paths không?
87
+
88
+ ## Biện pháp Cấu trúc
89
+
90
+ Khi bạn phát hiện vấn đề cấu trúc, hãy đề xuất giải pháp — không chỉ nêu vấn đề. Review chỉ nói "cái này phức tạp" khiến tác giả đoán mò. Dùng tên tái cấu trúc cụ thể:
91
+
92
+ - **Thay chuỗi conditionals** bằng typed model hoặc explicit dispatcher.
93
+ - **Gộp các nhánh duplicate** thành một flow rõ ràng hơn.
94
+ - **Tách orchestration khỏi business logic** để mỗi phần có thể đọc độc lập.
95
+ - **Di chuyển logic đặc thù cho feature** ra khỏi shared module, vào package sở hữu khái niệm đó.
96
+ - **Tái sử dụng canonical helper** thay vì near-duplicate tự tạo.
97
+ - **Làm tường minh type boundary** để downstream branching biến mất.
98
+ - **Xóa pass-through wrapper** tạo thêm indirection mà không làm rõ API.
99
+ - **Extract helper, hoặc tách file lớn** thành các module tập trung.
100
+
101
+ Ưu tiên biện pháp loại bỏ moving pieces hơn là biện pháp phân tán cùng complexity.
102
+
103
+ ## Quy mô Thay đổi
104
+
105
+ Thay đổi nhỏ, tập trung dễ review hơn, merge nhanh hơn, và deploy an toàn hơn. Nhắm đến các quy mô sau:
106
+
107
+ ```
108
+ ~100 dòng thay đổi → Tốt. Có thể review trong một lần ngồi.
109
+ ~300 dòng thay đổi → Chấp nhận được nếu là một thay đổi logic duy nhất.
110
+ ~1000 dòng thay đổi → Quá lớn. Hãy tách ra.
111
+ ```
112
+
113
+ **Chú ý kích thước file, không chỉ kích thước diff.** Một diff nhỏ vẫn có thể đẩy file vượt ngưỡng lành mạnh — khoảng 1000 *tổng* dòng trong một file là tín hiệu cần kiểm tra, không phải giới hạn cứng. Khi một thay đổi làm phình file vốn đã lớn, hãy hỏi có nên extract helpers, subcomponents, hoặc modules *trước* không, rồi mới thêm vào. Decompose trước, rồi thêm sau.
114
+
115
+ **Thế nào là "một thay đổi":** Một modification tự hoàn chỉnh giải quyết một vấn đề, bao gồm tests liên quan, và giữ hệ thống hoạt động sau khi submit. Một phần của feature — không phải toàn bộ feature.
116
+
117
+ **Chiến lược tách khi thay đổi quá lớn:**
118
+
119
+ | Chiến lược | Cách làm | Khi nào dùng |
120
+ |----------|-----|------|
121
+ | **Stack** | Submit thay đổi nhỏ, bắt đầu thay đổi tiếp theo dựa trên nó | Sequential dependencies |
122
+ | **Theo nhóm file** | Tách riêng cho nhóm file cần reviewer khác nhau | Cross-cutting concerns |
123
+ | **Horizontal** | Tạo shared code/stubs trước, rồi đến consumers | Layered architecture |
124
+ | **Vertical** | Chia thành các full-stack slice nhỏ hơn của feature | Feature work |
125
+
126
+ **Khi nào thay đổi lớn được chấp nhận:** Xóa file hoàn toàn và automated refactoring nơi reviewer chỉ cần xác nhận ý định, không phải từng dòng.
127
+
128
+ **Tách riêng refactoring khỏi feature work.** Thay đổi vừa refactor code hiện có vừa thêm behavior mới là hai thay đổi — submit riêng. Cleanup nhỏ (đổi tên biến) có thể đưa vào theo quyết định của reviewer.
129
+
130
+ ## Mô tả Thay đổi
131
+
132
+ Mỗi thay đổi cần một mô tả tự đứng vững trong lịch sử version control.
133
+
134
+ **Dòng đầu tiên:** Ngắn, dùng imperative, độc lập. "Xóa FizzBuzz RPC" không phải "Đang xóa FizzBuzz RPC." Phải đủ thông tin để ai đó tìm kiếm lịch sử có thể hiểu thay đổi mà không cần đọc diff.
135
+
136
+ **Body:** Cái gì đang thay đổi và tại sao. Bao gồm context, quyết định, và lý do không thấy được trong code. Link đến bug numbers, benchmark results, hoặc design docs khi liên quan. Thừa nhận shortcomings của approach khi chúng tồn tại.
137
+
138
+ **Anti-patterns:** "Fix bug," "Fix build," "Add patch," "Moving code from A to B," "Phase 1," "Add convenience functions."
139
+
140
+ ## Quy trình Review
141
+
142
+ ### Bước 1: Hiểu Context
143
+
144
+ Trước khi nhìn code, hãy hiểu ý định:
145
+
146
+ ```
147
+ - Thay đổi này nhằm hoàn thành điều gì?
148
+ - Nó implement spec hoặc task nào?
149
+ - Thay đổi behavior mong đợi là gì?
150
+ ```
151
+
152
+ ### Bước 2: Review Tests Trước
153
+
154
+ Tests thể hiện ý định và coverage:
155
+
156
+ ```
157
+ - Có tests cho thay đổi không?
158
+ - Chúng có test behavior (không phải implementation details) không?
159
+ - Các edge case có được cover không?
160
+ - Tests có tên mô tả rõ không?
161
+ - Tests có phát hiện được regression nếu code thay đổi không?
162
+ ```
163
+
164
+ ### Bước 3: Review Implementation
165
+
166
+ Đi qua code với năm trục trong đầu:
167
+
168
+ ```
169
+ Với mỗi file thay đổi:
170
+ 1. Correctness: Code này có làm điều test nói nó nên làm không?
171
+ 2. Readability: Tôi có thể hiểu điều này mà không cần trợ giúp không?
172
+ 3. Architecture: Điều này có phù hợp với hệ thống không?
173
+ 4. Security: Có lỗ hổng bảo mật nào không?
174
+ 5. Performance: Có bottleneck nào không?
175
+ ```
176
+
177
+ ### Bước 4: Phân loại Phát hiện
178
+
179
+ Gắn nhãn mỗi comment với severity để tác giả biết cái gì bắt buộc vs tùy chọn:
180
+
181
+ | Prefix | Ý nghĩa | Hành động của tác giả |
182
+ |--------|---------|---------------|
183
+ | *(không prefix)* | Thay đổi bắt buộc | Phải xử lý trước khi merge |
184
+ | **Critical:** | Chặn merge | Lỗ hổng bảo mật, mất dữ liệu, chức năng bị hỏng |
185
+ | **Nit:** | Nhỏ, tùy chọn | Tác giả có thể bỏ qua — định dạng, style preferences |
186
+ | **Optional:** / **Consider:** | Gợi ý | Đáng cân nhắc nhưng không bắt buộc |
187
+ | **FYI** | Chỉ thông tin | Không cần hành động — context cho tương lai |
188
+
189
+ Điều này ngăn tác giả coi tất cả feedback là bắt buộc và lãng phí thời gian cho gợi ý tùy chọn.
190
+
191
+ **Đưa điều quan trọng lên trước.** Sắp xếp phát hiện theo leverage: correctness và security trước, rồi đến structural regressions và missed simplifications, rồi mới đến phần còn lại. Đừng chôn vùi vấn đề thực sự dưới cosmetic nits — một vài comment có conviction cao hơn là một danh sách dài. Nếu bạn có một vấn đề cấu trúc và mười nits, vấn đề cấu trúc *chính là* review.
192
+
193
+ ### Bước 5: Xác minh Việc Kiểm tra
194
+
195
+ Kiểm tra câu chuyện verification của tác giả:
196
+
197
+ ```
198
+ - Những tests nào đã được chạy?
199
+ - Build có pass không?
200
+ - Thay đổi có được test thủ công không?
201
+ - Có screenshots cho UI changes không?
202
+ - Có so sánh before/after không?
203
+ ```
204
+
205
+ ## Pattern Review Đa Model
206
+
207
+ Dùng các model khác nhau cho góc nhìn review khác nhau:
208
+
209
+ ```
210
+ Model A viết code
211
+
212
+
213
+ Model B review correctness và architecture
214
+
215
+
216
+ Model A xử lý feedback
217
+
218
+
219
+ Con người ra quyết định cuối
220
+ ```
221
+
222
+ Cách này phát hiện vấn đề mà một model đơn lẻ có thể bỏ sót — các model khác nhau có blind spots khác nhau.
223
+
224
+ **Ví dụ prompt cho review agent:**
225
+ ```
226
+ Review thay đổi code này về correctness, security, và tuân thủ
227
+ conventions dự án. Spec nói [X]. Thay đổi nên [Y].
228
+ Gắn cờ mọi vấn đề là Critical, Required, Optional, hoặc Nit.
229
+ ```
230
+
231
+ ## Dọn dẹp Dead Code
232
+
233
+ Sau bất kỳ refactoring hay implementation change nào, kiểm tra code mồ côi:
234
+
235
+ 1. Xác định code không còn reachable hay được dùng nữa
236
+ 2. Liệt kê rõ ràng
237
+ 3. **Hỏi trước khi xóa:** "Tôi có nên xóa các phần tử không còn dùng này không: [list]?"
238
+
239
+ Đừng để dead code nằm lại — nó gây nhầm lẫn cho người đọc và agent tương lai. Nhưng đừng xóa thầm lặng những thứ bạn không chắc chắn. Khi không chắc, hãy hỏi.
240
+
241
+ ```
242
+ DEAD CODE ĐÃ XÁC ĐỊNH:
243
+ - formatLegacyDate() trong src/utils/date.ts — đã được thay bởi formatDate()
244
+ - OldTaskCard component trong src/components/ — đã được thay bởi TaskCard
245
+ - Hằng LEGACY_API_URL trong src/config.ts — không còn tham chiếu nào
246
+ → Có thể xóa những thứ này không?
247
+ ```
248
+
249
+ ## Tốc độ Review
250
+
251
+ Review chậm cản trở cả team. Chi phí context-switching để review ít hơn chi phí chờ đợi áp đặt lên người khác.
252
+
253
+ - **Phản hồi trong một ngày làm việc** — đây là tối đa, không phải mục tiêu
254
+ - **Nhịp lý tưởng:** Phản hồi ngay sau khi yêu cầu review đến, trừ khi đang tập trung code. Thay đổi thông thường nên hoàn thành nhiều vòng review trong một ngày
255
+ - **Ưu tiên phản hồi cá nhân nhanh** hơn là approval cuối nhanh. Feedback nhanh giảm sự thất vọng dù cần nhiều vòng
256
+ - **Thay đổi lớn:** Yêu cầu tác giả tách ra thay vì review một changeset khổng lồ
257
+
258
+ ## Xử lý Bất đồng
259
+
260
+ Khi giải quyết tranh chấp review, áp dụng thứ tự ưu tiên này:
261
+
262
+ 1. **Sự thật và dữ liệu kỹ thuật** vượt trội hơn ý kiến và sở thích
263
+ 2. **Style guides** là thẩm quyền tuyệt đối về vấn đề style
264
+ 3. **Thiết kế phần mềm** phải được đánh giá dựa trên nguyên tắc kỹ thuật, không phải sở thích cá nhân
265
+ 4. **Nhất quán codebase** chấp nhận được nếu không làm giảm sức khỏe tổng thể
266
+
267
+ **Đừng chấp nhận "Tôi sẽ dọn sau."** Kinh nghiệm cho thấy cleanup hoãn lại hiếm khi xảy ra. Yêu cầu cleanup trước khi submit trừ khi đây là tình huống khẩn cấp thực sự. Nếu các vấn đề xung quanh không thể xử lý trong thay đổi này, yêu cầu tạo bug với self-assignment.
268
+
269
+ ## Trung thực trong Review
270
+
271
+ Khi review code — dù do bạn, agent khác, hay con người viết:
272
+
273
+ - **Đừng rubber-stamp.** "LGTM" mà không có bằng chứng review không giúp ích gì.
274
+ - **Đừng làm mềm vấn đề thực sự.** "Đây có thể là lo ngại nhỏ" khi thực ra là bug sẽ xảy ra trên production là không trung thực.
275
+ - **Định lượng vấn đề khi có thể.** "N+1 query này sẽ thêm ~50ms mỗi item trong list" tốt hơn "cái này có thể chậm."
276
+ - **Phản đối approach có vấn đề rõ ràng.** Sycophancy là failure mode trong review. Nếu implementation có vấn đề, nói thẳng và đề xuất alternatives.
277
+ - **Chấp nhận override một cách graceful.** Nếu tác giả có đầy đủ context và không đồng ý, nhường theo quyết định của họ. Comment về code, không phải về người — diễn đạt lại phê bình cá nhân để tập trung vào code.
278
+
279
+ ## Kỷ luật Dependencies
280
+
281
+ Một phần của code review là dependency review:
282
+
283
+ **Trước khi thêm bất kỳ dependency nào:**
284
+ 1. Stack hiện tại có giải quyết được vấn đề không? (Thường là có.)
285
+ 2. Dependency này lớn bao nhiêu? (Kiểm tra bundle impact.)
286
+ 3. Nó có được bảo trì tích cực không? (Kiểm tra last commit, open issues.)
287
+ 4. Nó có known vulnerabilities không? (`npm audit`)
288
+ 5. License là gì? (Phải tương thích với dự án.)
289
+
290
+ **Quy tắc:** Ưu tiên standard library và utilities hiện có hơn dependencies mới. Mỗi dependency là một liability.
291
+
292
+ **Nâng cấp dependency hiện có** là thay đổi code như mọi thay đổi khác, và các nâng cấp rủi ro nhất là những cái được merge hàng loạt với message "bump deps." Review chúng với cùng kỷ luật:
293
+
294
+ 1. **Đọc changelog, không chỉ version number.** Semver là lời hứa mà maintainer có thể không giữ — một bản "patch" có thể mang thay đổi behavior. Với major bump, đọc migration notes và tìm cái gì bị break.
295
+ 2. **Một dependency mỗi thay đổi.** Nâng cấp và merge từng cái riêng lẻ (hoặc nhóm nhỏ liên quan). Khi bulk bump phá vỡ build, bạn đã mất dấu vết package nào gây ra; thay đổi một package duy nhất làm nguyên nhân rõ ràng và revert sạch sẽ.
296
+ 3. **Để tests quyết định.** Nâng cấp được xác minh bởi suite xanh trước *và* sau, không phải bởi "nó đã install." Nếu coverage xung quanh behavior của dependency mỏng, đó là phát hiện thực sự — thêm test trước.
297
+ 4. **Chú ý transitive graph.** Hầu hết packages được cài là những package không ai chọn trực tiếp. Review lockfile diff, không chỉ `package.json`; một direct bump đơn lẻ có thể kéo theo hàng chục indirect changes.
298
+ 5. **Giữ lockfile trung thực.** Commit nó, review diff của nó, và không bao giờ sửa tay. Lockfile là thứ thực sự ghim cái được ship.
299
+
300
+ Để triage các phát hiện `npm audit` và supply-chain risk (typosquatting, compromised maintainers), theo skill `security-and-hardening` — phần này bao gồm *workflow* nâng cấp, phần kia bao gồm security verdict.
301
+
302
+ ## Checklist Review
303
+
304
+ ```markdown
305
+ ## Review: [Tiêu đề PR/Thay đổi]
306
+
307
+ ### Context
308
+ - [ ] Tôi hiểu thay đổi này làm gì và tại sao
309
+
310
+ ### Correctness
311
+ - [ ] Thay đổi khớp với yêu cầu spec/task
312
+ - [ ] Edge cases được xử lý
313
+ - [ ] Error paths được xử lý
314
+ - [ ] Tests cover thay đổi đầy đủ
315
+
316
+ ### Readability
317
+ - [ ] Tên rõ ràng và nhất quán
318
+ - [ ] Logic đơn giản
319
+ - [ ] Không có complexity không cần thiết
320
+
321
+ ### Architecture
322
+ - [ ] Theo đúng patterns hiện có
323
+ - [ ] Không coupling hay dependencies không cần thiết
324
+ - [ ] Mức abstraction phù hợp
325
+ - [ ] Refactor giảm complexity thay vì chuyển chỗ nó
326
+ - [ ] Không có logic feature trong shared modules; file giữ kích thước lành mạnh
327
+
328
+ ### Security
329
+ - [ ] Không có secrets trong code
330
+ - [ ] Input được validate tại boundaries
331
+ - [ ] Không có injection vulnerabilities
332
+ - [ ] Auth checks đúng chỗ
333
+ - [ ] Dữ liệu nguồn ngoài được coi là untrusted
334
+
335
+ ### Performance
336
+ - [ ] Không có pattern N+1
337
+ - [ ] Không có unbounded operations
338
+ - [ ] Pagination tại list endpoints
339
+
340
+ ### Verification
341
+ - [ ] Tests pass
342
+ - [ ] Build thành công
343
+ - [ ] Đã verify thủ công (nếu áp dụng)
344
+
345
+ ### Verdict
346
+ - [ ] **Approve** — Sẵn sàng merge
347
+ - [ ] **Request changes** — Vấn đề phải được xử lý
348
+ ```
349
+
350
+ ## Xem thêm
351
+
352
+ - Để hướng dẫn security review chi tiết, xem `../../references/security-checklist.md`
353
+ - Để kiểm tra performance review, xem `../../references/performance-checklist.md`
354
+
355
+ ## Các Lý do Tự biện Phổ biến
356
+
357
+ | Lý do tự biện | Thực tế |
358
+ |---|---|
359
+ | "Nó chạy được, vậy là đủ tốt" | Code chạy được nhưng không đọc được, không bảo mật, hoặc sai kiến trúc tạo ra nợ kỹ thuật tích lũy theo thời gian. |
360
+ | "Tôi viết nó, nên tôi biết nó đúng" | Tác giả mù quáng với các giả định của chính mình. Mọi thay đổi đều được lợi từ một cặp mắt khác. |
361
+ | "Chúng ta sẽ dọn sau" | Sau không bao giờ đến. Review là quality gate — hãy dùng nó. Yêu cầu cleanup trước khi merge, không phải sau. |
362
+ | "Code AI tạo ra chắc ổn thôi" | Code AI cần được kiểm tra kỹ hơn, không phải ít hơn. Nó tự tin và hợp lý, ngay cả khi sai. |
363
+ | "Tests pass, vậy là tốt" | Tests là cần thiết nhưng không đủ. Chúng không phát hiện vấn đề kiến trúc, lỗ hổng bảo mật, hay vấn đề readability. |
364
+ | "Refactor làm nó sạch hơn" | Chuyển chỗ complexity không phải giảm nó. Nếu người đọc vẫn phải nắm cùng số khái niệm, cấu trúc không cải thiện — tìm phiên bản làm biến mất các nhánh. |
365
+ | "Chỉ là thêm nhỏ vào file này thôi" | Diff nhỏ vẫn đẩy file vượt kích thước lành mạnh và gắn nhánh vào flow không liên quan. Đánh giá cấu trúc kết quả, không phải kích thước diff. |
366
+ | "Chỉ là bump version thôi" | Bump là thay đổi behavior bạn không viết. Đọc changelog; semver không đảm bảo không có breaking changes. |
367
+ | "Tôi sẽ nâng cấp tất cả trong một PR để tiết kiệm thời gian" | Bulk bump phá vỡ build che giấu package nào gây ra. Một dependency mỗi thay đổi giữ nguyên nhân và revert sạch sẽ. |
368
+
369
+ ## Dấu hiệu Đỏ
370
+
371
+ - PR được merge mà không có review
372
+ - Review chỉ kiểm tra tests có pass không (bỏ qua các trục khác)
373
+ - "LGTM" mà không có bằng chứng review thực sự
374
+ - Thay đổi liên quan security mà không có security-focused review
375
+ - PR lớn "quá lớn để review đúng cách" (hãy tách ra)
376
+ - Không có regression tests với bug fix PR
377
+ - Review comments không có severity label — không rõ cái gì bắt buộc vs tùy chọn
378
+ - Chấp nhận "Tôi sẽ sửa sau" — không bao giờ xảy ra
379
+ - Refactor chuyển chỗ code mà không giảm số khái niệm người đọc phải nắm
380
+ - Thay đổi làm phình file vốn đã lớn thay vì decompose nó
381
+ - Conditional mới rải vào code paths không liên quan (thiếu abstraction)
382
+ - Helper tự tạo duplicate canonical helper hiện có, hoặc logic feature trong shared module
383
+ - PR "bump dependencies" hàng loạt không có changelog review và không isolate theo package
384
+ - Lockfile bị sửa tay, không commit, hoặc merge mà không review diff của nó
385
+
386
+ ## Verification
387
+
388
+ Sau khi review hoàn tất:
389
+
390
+ - [ ] Tất cả Critical issues đã được giải quyết
391
+ - [ ] Tất cả thay đổi Required (không prefix) đã được giải quyết hoặc hoãn có justification rõ ràng
392
+ - [ ] Tests pass
393
+ - [ ] Build thành công
394
+ - [ ] Câu chuyện verification được ghi lại (cái gì thay đổi, cách verify)
395
+ - [ ] Nâng cấp dependency được review theo changelog, isolate theo package, và verify bởi suite xanh với lockfile diff được review
396
+
397
+ **Blockers suy đoán:** surface và đề xuất design đơn giản hơn cho từng cái; escalate lên Required chỉ khi thay đổi chủ động làm cấu trúc tệ hơn: refactor chuyển chỗ complexity thay vì giảm nó; thay đổi đẩy file vượt ngưỡng kích thước mà không decompose; logic feature thêm vào shared module; near-duplicate của canonical helper hiện có; silent fallback che giấu invariant chưa rõ.