@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
|
@@ -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õ.
|