@damphuquy/agent-init 1.4.4 → 2.1.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/README.md +10 -4
- package/README.vi.md +10 -4
- package/package.json +1 -1
- package/templates/en/.agents/behavior.md +34 -2
- package/templates/en/.agents/guardrails.md +2 -1
- package/templates/en/AGENTS.md +15 -8
- package/templates/en/process/README.md +14 -10
- package/templates/en/process/_seeds/_GUIDE.md +10 -6
- package/templates/en/process/_seeds/decision-template.md.seed +7 -6
- package/templates/en/process/_seeds/plan-template.md.seed +2 -2
- package/templates/en/process/_seeds/review-template.md.seed +1 -1
- package/templates/en/process/_seeds/task-template.md.seed +18 -9
- package/templates/en/process/context/all-context.md +1 -1
- package/templates/en/process/context/planning/all-planning.md +72 -16
- package/templates/en/process/context/tests/all-tests.md +87 -30
- package/templates/en/process/development-protocols/implementation-standards.md +103 -14
- package/templates/en/process/development-protocols/orchestration.md +88 -11
- package/templates/vi/.agents/behavior.md +34 -2
- package/templates/vi/.agents/guardrails.md +2 -1
- package/templates/vi/AGENTS.md +15 -8
- package/templates/vi/process/README.md +14 -10
- package/templates/vi/process/_seeds/_GUIDE.md +10 -6
- package/templates/vi/process/_seeds/decision-template.md.seed +7 -6
- package/templates/vi/process/_seeds/plan-template.md.seed +2 -2
- package/templates/vi/process/_seeds/review-template.md.seed +1 -1
- package/templates/vi/process/_seeds/task-template.md.seed +18 -9
- package/templates/vi/process/context/all-context.md +1 -1
- package/templates/vi/process/context/planning/all-planning.md +72 -16
- package/templates/vi/process/context/tests/all-tests.md +87 -30
- package/templates/vi/process/development-protocols/implementation-standards.md +104 -15
- package/templates/vi/process/development-protocols/orchestration.md +89 -12
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
### Triết Lý Thiết Kế Seeds: Bản Chất "Why" & "How"
|
|
13
13
|
* **Tại sao là đuôi `.seed`? (Why):** Đuôi `.seed` đóng vai trò ranh giới bất biến (Blueprint Immutability). Nó giúp phân biệt rõ ràng giữa "khuôn mẫu phôi" và "tài liệu markdown đang làm việc" (`*.md`). Khi AI quét repo bằng các công cụ tìm kiếm, hậu tố `.seed` bảo vệ các file này không bao giờ bị AI sửa đè vào làm hỏng template gốc của cả dự án.
|
|
14
14
|
* **Tại sao tách riêng từng seed theo phase? (Why):** Mỗi giai đoạn trong chu trình RIPER-5 đòi hỏi một kiểu tư duy và ranh giới quyền hạn khác biệt (Khảo sát vs Đề xuất vs Lập kế hoạch vs Thực thi vs Nghiệm thu). Việc tách rời giúp AI chỉ nạp đúng artifact cần thiết, chống phình to context window (Anti-Context Saturation) và gắn chặt với từng Cổng kiểm soát (Gates G1–G3).
|
|
15
|
-
* **Quy tắc Copy-On-Demand (How):** Tuyệt đối không copy hàng loạt tất cả seed vào thư mục task. Bắt đầu duy nhất với `task.md`. Khi task tiến vào phase nào, mới lần lượt khởi tạo artifact của phase đó (`research.md` $\rightarrow$ `decision.md` $\rightarrow$ `plan.md` $\rightarrow$ `state.md` $\rightarrow$ `review.md` $\rightarrow$ `handoff.md`).
|
|
15
|
+
* **Quy tắc Copy-On-Demand (How):** Tuyệt đối không copy hàng loạt tất cả seed vào thư mục task. Bắt đầu duy nhất với `task.md`. Khi task tiến vào phase nào, mới lần lượt khởi tạo artifact của phase đó (`research.md` $\rightarrow$ `decision.md` $\rightarrow$ `plan.md` $\rightarrow$ `state.md` $\rightarrow$ `review.md` $\rightarrow$ `handoff.md`). Ở chế độ PAIR, Agent dừng lại chờ người dùng duyệt cổng. Ở chế độ DELEGATED / Fast-Track, Agent tự động khởi tạo seed kế tiếp, tự động duyệt cổng và chạy liên tục không gián đoạn.
|
|
16
16
|
</architectural_rationale>
|
|
17
17
|
|
|
18
18
|
---
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
<seed type="task" path="task-template.md.seed">
|
|
25
25
|
Hợp đồng master và bản lưu vết trạng thái xuyên suốt toàn bộ vòng đời RIPER-5.
|
|
26
|
-
Bao gồm: Metadata kiểm soát task, Đặc tả (Spec), Ranh giới ngữ cảnh, Chiến lược kiểm chứng,
|
|
26
|
+
Bao gồm: Metadata kiểm soát task (working_mode PAIR/DELEGATED), Đặc tả (Spec), Ranh giới ngữ cảnh, Chiến lược kiểm chứng,
|
|
27
27
|
Quyết định kỹ thuật, Kế hoạch thực thi RIPER-5 (kèm Gates G0–G3), và Ranh giới an toàn (Guardrails).
|
|
28
28
|
</seed>
|
|
29
29
|
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
<seed type="decision" path="decision-template.md.seed">
|
|
39
39
|
Artifact của giai đoạn Đề xuất giải pháp (Innovate). Bộ nhớ lưu vết Gate 1.
|
|
40
40
|
Bao gồm: Câu hỏi quyết định, Các phương án (A/B/C) kèm ma trận đánh đổi (Trade-off),
|
|
41
|
-
Khuyến nghị của Agent, Quyết định
|
|
41
|
+
Khuyến nghị của Agent, Quyết định Triển khai (Kỹ sư điền ở PAIR, hoặc Agent tự động chọn ở DELEGATED), Ràng buộc phái sinh,
|
|
42
42
|
Bằng chứng còn cần xác minh, và Checklist Gate 1.
|
|
43
43
|
</seed>
|
|
44
44
|
|
|
@@ -121,9 +121,13 @@ handoff.md ← Tóm tắt bàn giao cuối cùng (ngắn gọn)
|
|
|
121
121
|
| Thực thi | mã nguồn + kiểm thử + `state.md` |
|
|
122
122
|
| Nghiệm thu | `review.md` |
|
|
123
123
|
| Bàn giao | `handoff.md` |
|
|
124
|
-
|
|
|
125
|
-
|
|
|
126
|
-
|
|
|
124
|
+
| Tạm dừng / Đóng băng | `paused.md` (đóng băng sạch sẽ & checklist mở lại) |
|
|
125
|
+
| Hủy task | `cancelled.md` (lưu giữ tri thức khi hủy bỏ) |
|
|
126
|
+
| Benchmark / Định lượng | `results.tsv` (theo dõi hiệu năng và số liệu đánh giá) |
|
|
127
|
+
| Chương trình lớn | `program.md` (bản thiết kế chương trình lớn nhiều giai đoạn) |
|
|
128
|
+
| Gate 1 | Phê duyệt trong `decision.md` (Kỹ sư hoặc Auto-DELEGATED) |
|
|
129
|
+
| Gate 2 | Phê duyệt trong `plan.md` (Kỹ sư hoặc Auto-DELEGATED) |
|
|
130
|
+
| Gate 3 | Nghiệm thu trong `review.md` (Kỹ sư hoặc Auto-DELEGATED) |
|
|
127
131
|
|
|
128
132
|
---
|
|
129
133
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
<technical_decision task_id="[TASK-ID]" dec_id="[DEC-ID]" version="1.0" framework="RIPER-5">
|
|
4
4
|
|
|
5
|
-
<!-- GIAI ĐOẠN CHỈ ĐỌC (READ-ONLY). Đề xuất các phương án.
|
|
5
|
+
<!-- GIAI ĐOẠN CHỈ ĐỌC (READ-ONLY). Đề xuất các phương án. PAIR: kỹ sư chọn. DELEGATED: agent tự chọn phương án tối ưu và tự động chuyển phase. -->
|
|
6
6
|
<decision_status>
|
|
7
7
|
<phase>INNOVATE</phase>
|
|
8
8
|
<mode>READ-ONLY</mode>
|
|
@@ -98,9 +98,11 @@
|
|
|
98
98
|
|
|
99
99
|
---
|
|
100
100
|
|
|
101
|
-
## 6. Quyết Định
|
|
101
|
+
## 6. Quyết Định Triển Khai (Implementation Decision)
|
|
102
102
|
|
|
103
|
-
<!--
|
|
103
|
+
<!-- Chế độ PAIR: Kỹ sư con người điền phần này trước khi duyệt Gate 1.
|
|
104
|
+
Chế độ DELEGATED / Fast-Track: Agent tự động điền phương án khuyến nghị (Recommendation)
|
|
105
|
+
vào <selected_option>, ghi rõ rationale và ký duyệt Gate 1 với [AUTO: DELEGATED]. -->
|
|
104
106
|
<engineer_decision>
|
|
105
107
|
<selected_option></selected_option>
|
|
106
108
|
<rationale></rationale>
|
|
@@ -133,10 +135,9 @@
|
|
|
133
135
|
|
|
134
136
|
<gate id="G1">
|
|
135
137
|
- [ ] Toàn bộ phương án đã được trình bày và phân tích đánh đổi.
|
|
136
|
-
- [ ]
|
|
137
|
-
- [ ] Phương án do kỹ sư chọn đã được ghi nhận ở trên.
|
|
138
|
+
- [ ] Phương án được chọn đã được ghi nhận ở trên.
|
|
138
139
|
- [ ] Không còn quyết định nghiệp vụ / schema / bảo mật nào đang bỏ ngỏ.
|
|
139
|
-
<approved_by></approved_by>
|
|
140
|
+
<approved_by></approved_by> <!-- Tên kỹ sư (PAIR) hoặc [AUTO: DELEGATED] (DELEGATED/Fast-Track) -->
|
|
140
141
|
<approved_date></approved_date>
|
|
141
142
|
</gate>
|
|
142
143
|
|
|
@@ -127,8 +127,8 @@
|
|
|
127
127
|
- [ ] Điều kiện dừng đã được định nghĩa cho từng slice.
|
|
128
128
|
- [ ] Điểm hoàn nguyên (rollback point) đã được định nghĩa cho từng slice.
|
|
129
129
|
- [ ] Danh sách lệnh được phép đã được liệt kê.
|
|
130
|
-
- [ ]
|
|
131
|
-
<approved_by></approved_by>
|
|
130
|
+
- [ ] Kế hoạch đã được ký duyệt.
|
|
131
|
+
<approved_by></approved_by> <!-- Tên kỹ sư (PAIR) hoặc [AUTO: DELEGATED] (DELEGATED/Fast-Track) -->
|
|
132
132
|
<approved_date></approved_date>
|
|
133
133
|
</gate>
|
|
134
134
|
|
|
@@ -142,7 +142,7 @@
|
|
|
142
142
|
- [ ] Rủi ro tồn đọng đã được chấp nhận rõ ràng.
|
|
143
143
|
- [ ] Quyết định review: PASS.
|
|
144
144
|
- [ ] Sẵn sàng bàn giao (handoff).
|
|
145
|
-
<approved_by></approved_by>
|
|
145
|
+
<approved_by></approved_by> <!-- Tên kỹ sư (PAIR) hoặc [AUTO: DELEGATED] (DELEGATED/Fast-Track) -->
|
|
146
146
|
<approved_date></approved_date>
|
|
147
147
|
</gate>
|
|
148
148
|
|
|
@@ -6,10 +6,12 @@
|
|
|
6
6
|
PHẦN 0 — KIỂM SOÁT TASK (bản lưu vết trạng thái master)
|
|
7
7
|
════════════════════════════════════════════ -->
|
|
8
8
|
<task_control>
|
|
9
|
-
<status>BACKLOG</status> <!-- BACKLOG | ACTIVE | BLOCKED | REVIEW | COMPLETED -->
|
|
9
|
+
<status>BACKLOG</status> <!-- BACKLOG | ACTIVE | BLOCKED | PAUSED | REVIEW | COMPLETED | CANCELLED -->
|
|
10
10
|
<spec_level>S1</spec_level> <!-- S0=phác thảo | S1=đã định nghĩa | S2=đã kiểm chứng | S3=đã khóa -->
|
|
11
|
+
<priority>P2</priority> <!-- P0=khẩn cấp | P1=cao | P2=bình thường | P3=thấp -->
|
|
11
12
|
<risk>MEDIUM</risk> <!-- LOW | MEDIUM | HIGH -->
|
|
12
|
-
<
|
|
13
|
+
<estimated_story_points>2</estimated_story_points> <!-- 1 SP ≈ 2-4 giờ làm việc kỹ thuật tập trung -->
|
|
14
|
+
<working_mode>PAIR</working_mode> <!-- PAIR (mặc định: dừng chờ duyệt từng gate) | DELEGATED (fast-track: tự động chạy liên tục qua các phase) | MANUAL | DIAGNOSE-ONLY -->
|
|
13
15
|
<current_phase>RESEARCH</current_phase> <!-- RESEARCH | INNOVATE | PLAN | EXECUTE | REVIEW -->
|
|
14
16
|
<owner>@engineer</owner>
|
|
15
17
|
<decision_owner>@engineer</decision_owner>
|
|
@@ -63,6 +65,11 @@
|
|
|
63
65
|
- `tests/[duong/dan/toi/test]` — [Khẳng định mục tiêu và test fixtures]
|
|
64
66
|
</target_files>
|
|
65
67
|
|
|
68
|
+
<context_groups>
|
|
69
|
+
<!-- Tham chiếu tới các nhóm ngữ cảnh đã đăng ký trong process/context/all-context.md -->
|
|
70
|
+
- [planning | tests | protocols | domain-specific-group]
|
|
71
|
+
</context_groups>
|
|
72
|
+
|
|
66
73
|
<source_of_truth>
|
|
67
74
|
<requirement>[Liên kết tới tài liệu yêu cầu hoặc đặc tả]</requirement>
|
|
68
75
|
<architecture>[Liên kết tới tài liệu kiến trúc hoặc ADR]</architecture>
|
|
@@ -117,18 +124,19 @@
|
|
|
117
124
|
- [ ] Hành vi hiện tại đã được hiểu và ghi nhận tài liệu.
|
|
118
125
|
- [ ] Luồng thực thi đã được truy vết đầy đủ.
|
|
119
126
|
- [ ] Không còn rào cản khảo sát chưa giải quyết.
|
|
127
|
+
<!-- Ở chế độ DELEGATED / Fast-Track: Agent tự động đánh giá và chuyển sang Innovate -->
|
|
120
128
|
</gate>
|
|
121
129
|
</phase>
|
|
122
130
|
|
|
123
131
|
<phase name="Innovate" order="2">
|
|
124
|
-
<!-- CHỈ ĐỌC. Đề xuất 2-3 phương án khả thi.
|
|
132
|
+
<!-- CHỈ ĐỌC. Đề xuất 2-3 phương án khả thi. PAIR: kỹ sư chọn. DELEGATED: agent tự chọn phương án tối ưu. -->
|
|
125
133
|
- [ ] Đề xuất 2–3 hướng tiếp cận khác nhau kèm ma trận đánh đổi.
|
|
126
134
|
- [ ] Tạo artifact `decision.md`.
|
|
127
135
|
<gate id="G1" label="Gate 1 — Phê duyệt phương án (Decision Approved)">
|
|
128
|
-
- [ ] Các phương án đã được
|
|
136
|
+
- [ ] Các phương án đã được xem xét và phân tích đánh đổi.
|
|
129
137
|
- [ ] Phương án được chọn đã ghi nhận vào `decision.md`.
|
|
130
138
|
- [ ] Không còn quyết định nghiệp vụ/schema/bảo mật nào đang bỏ ngỏ.
|
|
131
|
-
<approved_by></approved_by>
|
|
139
|
+
<approved_by></approved_by> <!-- Tên kỹ sư (PAIR) hoặc [AUTO: DELEGATED] (DELEGATED/Fast-Track) -->
|
|
132
140
|
<approved_date></approved_date>
|
|
133
141
|
</gate>
|
|
134
142
|
</phase>
|
|
@@ -142,8 +150,8 @@
|
|
|
142
150
|
- [ ] Phạm vi file được phép / bị cấm sửa được xác định rõ ràng.
|
|
143
151
|
- [ ] Điểm hoàn nguyên (rollback point) được định nghĩa cho từng slice.
|
|
144
152
|
- [ ] Điều kiện dừng khẩn cấp được nêu rõ.
|
|
145
|
-
- [ ]
|
|
146
|
-
<approved_by></approved_by>
|
|
153
|
+
- [ ] Kế hoạch đã được ký duyệt.
|
|
154
|
+
<approved_by></approved_by> <!-- Tên kỹ sư (PAIR) hoặc [AUTO: DELEGATED] (DELEGATED/Fast-Track) -->
|
|
147
155
|
<approved_date></approved_date>
|
|
148
156
|
</gate>
|
|
149
157
|
</phase>
|
|
@@ -154,6 +162,7 @@
|
|
|
154
162
|
- [ ] Chạy verifier ngay sau mỗi slice.
|
|
155
163
|
- [ ] Kiểm tra git diff sau mỗi slice.
|
|
156
164
|
- [ ] Cập nhật `state.md` sau mỗi slice.
|
|
165
|
+
- [ ] (Tùy chọn) Ghi nhận số liệu định lượng vào `results.tsv` nếu task có đo lường benchmark/hiệu năng.
|
|
157
166
|
</phase>
|
|
158
167
|
|
|
159
168
|
<phase name="Review" order="5">
|
|
@@ -163,9 +172,9 @@
|
|
|
163
172
|
<gate id="G3" label="Gate 3 — Nghiệm thu đạt (Review Passed)">
|
|
164
173
|
- [ ] Mọi AC đều được kiểm chứng kèm bằng chứng thực tế.
|
|
165
174
|
- [ ] Rủi ro tồn đọng đã được chấp nhận.
|
|
166
|
-
- [ ] Quyết định review: PASS
|
|
175
|
+
- [ ] Quyết định review: PASS.
|
|
167
176
|
- [ ] Sẵn sàng bàn giao (handoff).
|
|
168
|
-
<approved_by></approved_by>
|
|
177
|
+
<approved_by></approved_by> <!-- Tên kỹ sư (PAIR) hoặc [AUTO: DELEGATED] (DELEGATED/Fast-Track) -->
|
|
169
178
|
<approved_date></approved_date>
|
|
170
179
|
</gate>
|
|
171
180
|
</phase>
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
<group id="seeds">
|
|
27
27
|
<title>Cẩm Nang Mẫu Chuẩn & Seeds</title>
|
|
28
28
|
<path>[`../_seeds/_GUIDE.md`](../_seeds/_GUIDE.md)</path>
|
|
29
|
-
<scope>Blueprints mẫu cho task, research, decision, plan, state, review, handoff và program. Đầy đủ chuỗi artifact và lệnh khởi tạo.</scope>
|
|
29
|
+
<scope>Blueprints mẫu cho task, research, decision, plan, state, review, handoff, tạm dừng task, hủy task, benchmark định lượng và program. Đầy đủ chuỗi artifact và lệnh khởi tạo.</scope>
|
|
30
30
|
</group>
|
|
31
31
|
|
|
32
32
|
<group id="tests">
|
|
@@ -1,31 +1,87 @@
|
|
|
1
1
|
# Quy Chuẩn Lập Kế Hoạch & Hiệu Chỉnh Năng Lực (Planning Context)
|
|
2
2
|
|
|
3
|
-
<planning_context version="
|
|
3
|
+
<planning_context version="2.0">
|
|
4
4
|
|
|
5
5
|
<overview>
|
|
6
|
-
Hướng dẫn ước lượng Story Point, phân rã lát cắt dọc và hiệu chỉnh năng lực thực thi.
|
|
6
|
+
Hướng dẫn kỹ thuật về ước lượng Story Point, phân rã lát cắt dọc (Vertical Slicing), điểm hoàn nguyên rollback và hiệu chỉnh năng lực thực thi.
|
|
7
7
|
</overview>
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. Tiêu Chuẩn Chất Lượng (Tiêu Chuẩn INVEST)
|
|
12
|
+
|
|
10
13
|
<quality_standards>
|
|
11
14
|
<standard name="INVEST">
|
|
12
|
-
- **Độc lập (Independent):** Có thể bàn giao mà không bị
|
|
13
|
-
- **Thương lượng được (Negotiable):** Chi tiết
|
|
14
|
-
- **Có giá trị (Valuable):** Mang lại
|
|
15
|
-
- **Ước lượng được (Estimable):** Phạm vi đủ rõ để
|
|
16
|
-
- **Nhỏ gọn (Small):** Hoàn thành vừa vặn trong 1
|
|
17
|
-
- **Kiểm chứng được (Testable):**
|
|
18
|
-
</standard>
|
|
19
|
-
|
|
20
|
-
<standard name="Vertical Slicing (Cắt Lát Dọc)">
|
|
21
|
-
Tránh chia việc theo các tầng ngang độc lập (horizontal silos). Bàn giao từng lát cắt dọc hoàn chỉnh xuyên suốt qua API, logic nghiệp vụ và lưu trữ dữ liệu.
|
|
15
|
+
- **Độc lập (Independent):** Có thể bàn giao và kiểm chứng độc lập mà không bị phụ thuộc vòng vo vào story khác.
|
|
16
|
+
- **Thương lượng được (Negotiable):** Chi tiết kỹ thuật và phương án tiếp cận có thể linh hoạt đánh giá trong giai đoạn Innovate.
|
|
17
|
+
- **Có giá trị (Valuable):** Mang lại năng lực hệ thống rõ ràng hoặc tiến bộ kỹ thuật đo lường được.
|
|
18
|
+
- **Ước lượng được (Estimable):** Phạm vi đủ rõ và danh sách file cần sửa đủ hẹp để tính toán khối lượng công việc.
|
|
19
|
+
- **Nhỏ gọn (Small):** Hoàn thành vừa vặn trong 1–3 ngày làm việc của kỹ sư (hoặc 1–3 Story Points).
|
|
20
|
+
- **Kiểm chứng được (Testable):** Kèm theo các Tiêu chí nghiệm thu (AC) rõ ràng, kiểm chứng được (`- [ ]`).
|
|
22
21
|
</standard>
|
|
23
22
|
</quality_standards>
|
|
24
23
|
|
|
25
|
-
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 2. Kỷ Luật Cắt Lát Dọc (Vertical Slicing Discipline)
|
|
27
|
+
|
|
28
|
+
<vertical_slicing>
|
|
29
|
+
### Lát Cắt Dọc (Vertical Slice) vs Tầng Ngang (Horizontal Silo)
|
|
30
|
+
- **Quy tắc Lát Cắt Dọc:** Mỗi lát cắt bắt buộc phải đi xuyên suốt toàn bộ các tầng kỹ thuật cần thiết (ví dụ: Thực thể Domain $\rightarrow$ Service/Logic $\rightarrow$ Port Adapter/API $\rightarrow$ Bài kiểm thử tự động) để mang lại một gia số hành vi hoàn chỉnh, kiểm chứng được.
|
|
31
|
+
- **Phản mẫu Tầng Ngang (Anti-Pattern):** Tuyệt đối không chia việc theo tầng ngang (ví dụ: Slice 1: tạo toàn bộ bảng DB, Slice 2: viết toàn bộ logic service, Slice 3: tạo toàn bộ API endpoint). Các tầng ngang không thể kiểm chứng độc lập, khiến toàn hệ thống ở trạng thái dở dang hoặc không thể chạy test cho đến tận slice cuối cùng.
|
|
32
|
+
|
|
33
|
+
### Luồng Triển Khai Lát Cắt Dọc Mẫu
|
|
34
|
+
```text
|
|
35
|
+
[Slice 1: Lõi tối thiểu xuyên suốt] ──► Domain Entity + Repo giả lập bộ nhớ + Endpoint tối thiểu + Test pass
|
|
36
|
+
[Slice 2: Lưu trữ & Ranh giới] ──► Adapter Database thật + File Migration + Kiểm thử tích hợp
|
|
37
|
+
[Slice 3: Trường hợp biên & Xử lý] ──► Chuẩn hóa đầu vào nghiêm ngặt + Bắt lỗi + Test trường hợp biên
|
|
38
|
+
```
|
|
39
|
+
</vertical_slicing>
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 3. Quy Mô Lát Cắt, Khả Năng Kiểm Chứng & Checkpoint
|
|
44
|
+
|
|
45
|
+
<slice_sizing>
|
|
46
|
+
<rule id="slice_cardinality">
|
|
47
|
+
Một task tiêu chuẩn chỉ nên chứa từ **2 đến 5 lát cắt dọc**. Nếu một task đòi hỏi hơn 5 slice, bán kính ảnh hưởng của nó quá lớn và bắt buộc phải phân rã thành Chương trình nhiều giai đoạn (`program-template.md.seed`).
|
|
48
|
+
</rule>
|
|
49
|
+
|
|
50
|
+
<rule id="autonomous_verifier">
|
|
51
|
+
Mỗi slice trong `plan.md` bắt buộc phải có lệnh kiểm chứng `<verifier>` tường minh, tự động chạy được (ví dụ: `npm run test -- test/duong/dan/test.js` hoặc `pytest tests/unit/test_slice.py`). Một slice CHƯA ĐƯỢC COI LÀ XONG nếu lệnh verifier chưa exit với mã 0.
|
|
52
|
+
</rule>
|
|
53
|
+
|
|
54
|
+
<rule id="atomic_checkpoint">
|
|
55
|
+
Commit hoặc đánh dấu checkpoint git sau khi mỗi slice vượt qua verifier. Điều này đảm bảo lịch sử git tinh gọn và cho phép hoàn nguyên ngay lập tức nếu các slice sau gặp lỗi không thể cứu vãn.
|
|
56
|
+
</rule>
|
|
57
|
+
</slice_sizing>
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 4. Chiến Lược Hoàn Nguyên (Rollback Strategy) Cho Từng Slice
|
|
62
|
+
|
|
63
|
+
<rollback_strategy>
|
|
64
|
+
Mỗi slice trong `plan.md` BẮT BUỘC phải chỉ định một điểm hoàn nguyên cụ thể `<rollback_point>`:
|
|
65
|
+
- **Checkpoint Git:** `git checkout -- <allowed_files>` hoặc commit hash đảo ngược.
|
|
66
|
+
- **Checkpoint Stash:** `git stash pop` hoặc branch WIP riêng biệt.
|
|
67
|
+
- **Rollback Dữ liệu / Schema:** Script down-migration hoặc xóa container test tạm thời.
|
|
68
|
+
|
|
69
|
+
Nếu Agent cạn kiệt ngân sách thử lại 3 lần cho một slice, Agent phải thực thi rollback point trước khi dừng lại và xin chỉ thị từ con người.
|
|
70
|
+
</rollback_strategy>
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 5. Hiệu Chỉnh Năng Lực & Story Point (Capacity Calibration)
|
|
75
|
+
|
|
26
76
|
<capacity_calibration>
|
|
27
|
-
<unit>1 Story Point ≈ 2
|
|
28
|
-
<
|
|
77
|
+
<unit>1 Story Point (SP) ≈ 2–4 giờ làm việc kỹ thuật tập trung</unit>
|
|
78
|
+
<scale>
|
|
79
|
+
- **1 SP:** Thay đổi thẳng thắn, phạm vi hẹp và rõ ràng (sửa 1-3 files, 1-2 slices).
|
|
80
|
+
- **2 SP:** Tính năng tiêu chuẩn hoặc refactor có phạm vi (sửa 3-5 files, 2-3 slices).
|
|
81
|
+
- **3 SP:** Tác vụ phức tạp vừa phải tác động đến hợp đồng domain và lưu trữ (sửa 4-7 files, 3-4 slices).
|
|
82
|
+
- **5 SP:** Quy mô tối đa cho một task active đơn lẻ trong `process/features/active/`.
|
|
83
|
+
- **> 5 SP:** Quá lớn. Bắt buộc phải tách thành nhiều task độc lập hoặc tổ chức dưới `program-template.md.seed`.
|
|
84
|
+
</scale>
|
|
29
85
|
</capacity_calibration>
|
|
30
86
|
|
|
31
87
|
</planning_context>
|
|
@@ -1,56 +1,113 @@
|
|
|
1
1
|
# Tiêu Chuẩn Kiểm Thử & Chiến Lược Khung Thử Nghiệm (Testing Context)
|
|
2
2
|
|
|
3
|
-
<testing_context version="
|
|
3
|
+
<testing_context version="2.0">
|
|
4
4
|
|
|
5
5
|
<overview>
|
|
6
|
-
Hướng dẫn hiệu chỉnh kim tự tháp kiểm thử, chính sách cách ly, quy ước mock và khung kiểm tra tự động xuyên suốt hệ thống.
|
|
6
|
+
Hướng dẫn hiệu chỉnh kim tự tháp kiểm thử, chính sách cách ly, quy ước mock, vệ sinh fixture dữ liệu và khung kiểm tra tự động xuyên suốt hệ thống.
|
|
7
7
|
</overview>
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. Kim Tự Tháp Kiểm Thử & Phân Loại Tầng (Test Pyramid & Classification)
|
|
12
|
+
|
|
10
13
|
<test_pyramid>
|
|
11
14
|
<layer name="Unit Tests (Kiểm thử đơn vị)" path="tests/unit/">
|
|
12
|
-
- Phạm vi
|
|
13
|
-
- Tốc độ
|
|
14
|
-
- Chính sách
|
|
15
|
+
- **Phạm vi:** Logic nghiệp vụ thuần túy, mô hình domain, hàm tiện ích, rẽ nhánh trường hợp biên.
|
|
16
|
+
- **Tốc độ & Ràng buộc:** Cực nhanh (< 50ms mỗi test). Không gọi mạng, không đọc/ghi đĩa I/O, không kết nối database thật.
|
|
17
|
+
- **Chính sách Mock:** Mock toàn bộ giao diện cổng (port interfaces), client ngoại vi và ranh giới I/O.
|
|
15
18
|
</layer>
|
|
16
19
|
|
|
17
20
|
<layer name="Integration Tests (Kiểm thử tích hợp)" path="tests/integration/">
|
|
18
|
-
- Phạm vi
|
|
19
|
-
-
|
|
20
|
-
- Dọn dẹp (Teardown)
|
|
21
|
+
- **Phạm vi:** Adapter lưu trữ repository, truy vấn cơ sở dữ liệu, file migration, wrapper gọi HTTP client, cấu hình framework.
|
|
22
|
+
- **Cách ly:** Test containers tạm thời (ví dụ: Testcontainers), in-memory database, hoặc schema cách ly riêng cho mỗi worker chạy test.
|
|
23
|
+
- **Dọn dẹp (Teardown):** Bắt buộc phải đảm bảo dọn dẹp dữ liệu 100%, không để rò rỉ trạng thái giữa các lần chạy.
|
|
21
24
|
</layer>
|
|
22
25
|
|
|
23
26
|
<layer name="End-to-End Tests (Kiểm thử đầu-cuối)" path="tests/e2e/">
|
|
24
|
-
- Phạm vi
|
|
25
|
-
- Kiểm chứng
|
|
27
|
+
- **Phạm vi:** Các luồng trải nghiệm người dùng trọng yếu, toàn bộ vòng đời API công khai, luồng xác thực auth hoàn chỉnh, regression smoke tests.
|
|
28
|
+
- **Kiểm chứng:** Xác thực tính toàn vẹn hợp đồng đầu-cuối xuyên suốt toàn bộ hệ thống.
|
|
26
29
|
</layer>
|
|
27
30
|
</test_pyramid>
|
|
28
31
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. Ranh Giới Mocking & Các Phản Mẫu (Mocking Boundaries)
|
|
35
|
+
|
|
36
|
+
<mocking_boundaries>
|
|
37
|
+
<rule id="mock_at_architectural_boundary">
|
|
38
|
+
**Mock tại ranh giới kiến trúc, không bao giờ mock ở lõi.** Chỉ mock hạ tầng bên ngoài: HTTP API bên thứ ba, message broker, dịch vụ email, hoặc đồng hồ hệ thống.
|
|
39
|
+
</rule>
|
|
40
|
+
|
|
41
|
+
<rule id="do_not_mock_domain_or_sut">
|
|
42
|
+
Tuyệt đối không mock Hệ thống đang được kiểm thử (System Under Test - SUT) hoặc các thực thể domain / value objects thuần túy. Nếu một thực thể domain khó khởi tạo nếu thiếu mock, thiết kế đó đang bị thắt chặt và cần được tái cấu trúc (refactor).
|
|
43
|
+
</rule>
|
|
44
|
+
|
|
45
|
+
<rule id="verify_mock_interactions_sparingly">
|
|
46
|
+
Ưu tiên khẳng định dựa trên giá trị trả về và thay đổi trạng thái quan sát được hơn là kiểm tra số lần gọi hàm nội bộ (`toHaveBeenCalledTimes`), tránh việc gắn chặt test vào chi tiết triển khai ngầm.
|
|
47
|
+
</rule>
|
|
48
|
+
</mocking_boundaries>
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 3. Vệ Sinh Fixture Kiểm Thử & Data Factory (Fixture Hygiene)
|
|
53
|
+
|
|
54
|
+
<fixture_hygiene>
|
|
55
|
+
<rule id="data_factories_over_preseeded_db">
|
|
56
|
+
Sử dụng test factories (hoặc builder functions) rõ ràng với giá trị mặc định hợp lý thay vì phụ thuộc vào các file dump SQL seed tĩnh dùng chung dễ vỡ.
|
|
57
|
+
</rule>
|
|
58
|
+
|
|
59
|
+
<rule id="no_shared_mutable_fixtures">
|
|
60
|
+
Mỗi bài test bắt buộc phải tự khởi tạo dữ liệu của riêng mình. Tuyệt đối không chia sẻ trạng thái biến đổi hoặc biến test toàn cục giữa các bài test.
|
|
61
|
+
</rule>
|
|
62
|
+
|
|
63
|
+
<rule id="deterministic_teardown">
|
|
64
|
+
Luôn dọn sạch bản ghi database, tệp tạm thời hoặc đăng ký mock trong các hook `afterEach` / `teardown` để ngăn chặn lỗi dây chuyền sang các bài test khác.
|
|
65
|
+
</rule>
|
|
66
|
+
</fixture_hygiene>
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 4. Tính Tiền Định & Không Chấp Nhận Test Chập Chờn (Determinism)
|
|
71
|
+
|
|
72
|
+
<determinism>
|
|
73
|
+
<rule id="frozen_clock">
|
|
74
|
+
Tuyệt đối không sử dụng đồng hồ thực tế của hệ thống (`Date.now()`, `datetime.now()`) trong các khẳng định nhạy cảm về thời gian. Sử dụng frozen clock hoặc fake timer để đảm bảo kết quả tái lập tuyệt đối.
|
|
75
|
+
</rule>
|
|
76
|
+
|
|
77
|
+
<rule id="order_independence">
|
|
78
|
+
Các bài test bắt buộc phải chạy pass khi chạy riêng lẻ hoặc chạy theo thứ tự ngẫu nhiên (`--randomize`). Không bao giờ phụ thuộc vào việc bài test này phải chạy trước bài test kia.
|
|
79
|
+
</rule>
|
|
80
|
+
|
|
81
|
+
<rule id="no_arbitrary_sleeps">
|
|
82
|
+
Tuyệt đối không dùng lệnh chờ tùy tiện `sleep(1000)` trong test bất đồng bộ. Sử dụng helper kiểm tra định kỳ có timeout (`waitFor`, `eventually`) để hoàn thành ngay khi điều kiện kỳ vọng được thỏa mãn.
|
|
83
|
+
</rule>
|
|
84
|
+
</determinism>
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 5. Độ Chính Xác Của Khẳng Định (Assertion Precision)
|
|
89
|
+
|
|
90
|
+
<assertion_precision>
|
|
91
|
+
<rule id="exact_assertions">
|
|
92
|
+
Tránh các khẳng định mơ hồ (ví dụ: `expect(res).toBeTruthy()`). Luôn khẳng định cấu trúc giá trị chính xác, mã trạng thái HTTP và mã lỗi cụ thể.
|
|
93
|
+
</rule>
|
|
34
94
|
|
|
35
|
-
<
|
|
36
|
-
|
|
37
|
-
</
|
|
95
|
+
<rule id="actionable_failure_messages">
|
|
96
|
+
Khi viết assertion tùy biến, cung cấp thông báo lỗi rõ ràng chỉ ra dữ liệu đầu vào là gì và điều kiện bất biến nào đã bị vi phạm.
|
|
97
|
+
</rule>
|
|
98
|
+
</assertion_precision>
|
|
38
99
|
|
|
39
|
-
|
|
40
|
-
Tránh các khẳng định mơ hồ (ví dụ: `expect(res).toBeTruthy()`). Luôn khẳng định cấu trúc chính xác kỳ vọng, mã trạng thái HTTP (status code) và loại lỗi.
|
|
41
|
-
</policy>
|
|
100
|
+
---
|
|
42
101
|
|
|
43
|
-
|
|
44
|
-
Toàn bộ bộ unit test phải hoàn thành trong vòng dưới 30 giây. Các bộ integration test chậm phải được phân vùng rõ ràng.
|
|
45
|
-
</policy>
|
|
46
|
-
</test_policies>
|
|
102
|
+
## 6. Ánh Xạ Lệnh Kiểm Tra (Verification Commands Mapping)
|
|
47
103
|
|
|
48
|
-
## 3. Ánh Xạ Lệnh Kiểm Tra (Verification Commands Mapping)
|
|
49
104
|
<verification_commands>
|
|
50
105
|
<!-- Giữ đồng bộ với <validation_commands> trong AGENTS.md -->
|
|
51
|
-
<command type="unit">Chạy bộ kiểm thử unit test nhanh</command>
|
|
52
|
-
<command type="integration">Chạy kiểm thử tích hợp integration/e2e</command>
|
|
53
|
-
<command type="
|
|
106
|
+
<command type="unit">Chạy bộ kiểm thử unit test nhanh (< 30 giây toàn bộ)</command>
|
|
107
|
+
<command type="integration">Chạy kiểm thử tích hợp integration/e2e cách ly</command>
|
|
108
|
+
<command type="typecheck">Chạy kiểm tra kiểu tĩnh (0 lỗi, strict mode)</command>
|
|
109
|
+
<command type="lint">Chạy linter và kiểm tra format (0 cảnh báo)</command>
|
|
110
|
+
<command type="coverage">Chạy báo cáo độ bao phủ test coverage và ngưỡng tối thiểu</command>
|
|
54
111
|
</verification_commands>
|
|
55
112
|
|
|
56
113
|
</testing_context>
|
|
@@ -1,28 +1,117 @@
|
|
|
1
|
-
# Tiêu Chuẩn Triển Khai & Khung
|
|
1
|
+
# Tiêu Chuẩn Triển Khai & Khung Kỹ Thuật (Implementation Standards)
|
|
2
2
|
|
|
3
|
-
<implementation_standards version="
|
|
3
|
+
<implementation_standards version="2.0">
|
|
4
4
|
|
|
5
5
|
<description>
|
|
6
|
-
Quy chuẩn chất lượng kỹ thuật, an toàn kiểu dữ liệu
|
|
6
|
+
Quy chuẩn chất lượng kỹ thuật, an toàn kiểu dữ liệu, kiến trúc sạch và thực thi phòng thủ cho codebase. Dùng chung cho mọi dự án.
|
|
7
7
|
</description>
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. An Toàn Kiểu Dữ Liệu & Phân Tích Tĩnh (Type Safety & Static Analysis)
|
|
12
|
+
|
|
13
|
+
<type_safety>
|
|
11
14
|
<rule id="strict_typing">
|
|
12
|
-
Toàn bộ các hàm, phương thức và thuộc tính class bắt buộc phải có chú thích kiểu dữ liệu (type annotations) rõ ràng. Sử dụng union types hiện đại (`int | None` hoặc `string | null`)
|
|
15
|
+
Toàn bộ các hàm, phương thức và thuộc tính class bắt buộc phải có chú thích kiểu dữ liệu (type annotations) rõ ràng. Sử dụng union types hiện đại (`int | None` hoặc `string | null`). Tránh dùng `Any`/`any` không định kiểu trừ khi giải mã dữ liệu đầu vào thô chưa xác thực tại cổng biên.
|
|
16
|
+
</rule>
|
|
17
|
+
|
|
18
|
+
<rule id="explicit_return_types">
|
|
19
|
+
Luôn khai báo kiểu trả về tường minh cho các hàm và phương thức public để áp đặt hợp đồng lúc biên dịch (compile-time) và ngăn ngừa hiện tượng suy luận kiểu bị mở rộng vô ý.
|
|
20
|
+
</rule>
|
|
21
|
+
|
|
22
|
+
<rule id="no_suppression">
|
|
23
|
+
Tuyệt đối không tắt lỗi linter, formatter hoặc type-checker bằng comment bỏ qua nội dòng (`# type: ignore`, `eslint-disable`, `@SuppressWarnings`) để vượt qua cổng kiểm tra giả tạo. Phải xử lý triệt để nguyên nhân gốc rễ.
|
|
13
24
|
</rule>
|
|
25
|
+
</type_safety>
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 2. Kiến Trúc Sạch & Độ Thuần Khiết Domain (Clean Architecture & Domain Purity)
|
|
30
|
+
|
|
31
|
+
<clean_architecture>
|
|
32
|
+
<rule id="dependency_rule">
|
|
33
|
+
Chiều phụ thuộc (dependency) chỉ được phép hướng vào lõi Domain bên trong. Các tầng domain bên trong tuyệt đối không import hay phụ thuộc vào framework hạ tầng, database hoặc UI bên ngoài.
|
|
34
|
+
</rule>
|
|
35
|
+
|
|
14
36
|
<rule id="domain_purity">
|
|
15
|
-
|
|
37
|
+
Logic nghiệp vụ cốt lõi, thực thể domain và value objects phải thuần khiết 100% với 0 tác dụng phụ (zero side-effects), không thực hiện I/O tệp hệ thống và không gọi mạng.
|
|
16
38
|
</rule>
|
|
17
|
-
|
|
18
|
-
|
|
39
|
+
|
|
40
|
+
<rule id="ports_and_adapters">
|
|
41
|
+
Định nghĩa giao diện trừu tượng (ports) trong tầng application/domain cho lưu trữ dữ liệu, API bên ngoài và nhắn tin. Triển khai các driver cụ thể (adapters) độc quyền trong các package hạ tầng (infrastructure).
|
|
42
|
+
</rule>
|
|
43
|
+
|
|
44
|
+
<rule id="no_premature_abstraction">
|
|
45
|
+
Không tự ý đưa vào các lớp trừu tượng mang tính suy diễn, dynamic factory hoặc lớp trung gian bắc cầu không cần thiết cho các tiện ích đơn chức năng đơn giản.
|
|
46
|
+
</rule>
|
|
47
|
+
</clean_architecture>
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 3. Xử Lý Lỗi & Nguyên Tắc Thất Bại Sớm (Error Handling & Fail-Fast)
|
|
52
|
+
|
|
53
|
+
<error_handling>
|
|
54
|
+
<rule id="fail_fast_at_boundaries">
|
|
55
|
+
Kiểm tra hợp lệ toàn bộ tham số, payload và biến môi trường ngay tại điểm vào của hệ thống. Từ chối dữ liệu sai lệch ngay lập tức trước khi gọi vào logic nghiệp vụ.
|
|
56
|
+
</rule>
|
|
57
|
+
|
|
58
|
+
<rule id="no_silent_swallowing">
|
|
59
|
+
Tuyệt đối không sử dụng `catch {}` rỗng, `except: pass` hoặc bắt ngoại lệ mà không ghi log. Mọi ngoại lệ bị bắt phải được xử lý, chuyển đổi thành lỗi domain có định kiểu hoặc lan truyền (propagate) sạch sẽ.
|
|
60
|
+
</rule>
|
|
61
|
+
|
|
62
|
+
<rule id="typed_domain_errors">
|
|
63
|
+
Tạo các class lỗi domain rõ ràng kèm mã lỗi đọc được bằng máy (ví dụ: `ResourceNotFoundError`, `ValidationError`, `ConcurrencyConflictError`) thay vì ném ra các exception chung chung.
|
|
19
64
|
</rule>
|
|
20
|
-
</
|
|
65
|
+
</error_handling>
|
|
21
66
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 4. Bất Biến & An Toàn Khi Chạy Đồng Thời (Immutability & Concurrency Safety)
|
|
70
|
+
|
|
71
|
+
<concurrency_and_immutability>
|
|
72
|
+
<rule id="immutable_data_structures">
|
|
73
|
+
Ưu tiên các cấu trúc dữ liệu bất biến (`dataclass(frozen=True)`, `readonly` interface, hoặc `Readonly<T>`) cho các sự kiện domain, cấu hình và DTO.
|
|
74
|
+
</rule>
|
|
75
|
+
|
|
76
|
+
<rule id="no_shared_mutable_state">
|
|
77
|
+
Tránh sử dụng biến toàn cục có thể thay đổi (mutable globals), cache trạng thái cấp module hoặc singleton có trường biến đổi. Truyền dependency rõ ràng thông qua hàm khởi tạo (Dependency Injection).
|
|
78
|
+
</rule>
|
|
79
|
+
|
|
80
|
+
<rule id="safe_async_lifecycle">
|
|
81
|
+
Luôn xử lý dọn dẹp và từ chối lỗi bất đồng bộ (async error rejection/cancellation) cẩn thận. Thiết lập timeout rõ ràng cho mọi lệnh gọi mạng hoặc truy vấn cơ sở dữ liệu.
|
|
82
|
+
</rule>
|
|
83
|
+
</concurrency_and_immutability>
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 5. Giám Sát & Vệ Sinh Ghi Log (Observability & Logging Hygiene)
|
|
88
|
+
|
|
89
|
+
<observability_hygiene>
|
|
90
|
+
<rule id="structured_logging">
|
|
91
|
+
Sử dụng ghi log có cấu trúc (structured logging) kèm ngữ cảnh dạng key-value (`task_id`, `user_id`, `component`) thay vì nối chuỗi văn bản thuần túy.
|
|
92
|
+
</rule>
|
|
93
|
+
|
|
94
|
+
<rule id="no_credential_leakage">
|
|
95
|
+
Không bao giờ ghi log dữ liệu nhạy cảm: mật khẩu, tokens, API keys, cookies hoặc thông tin nhận dạng cá nhân (PII).
|
|
96
|
+
</rule>
|
|
97
|
+
|
|
98
|
+
<rule id="clean_production_diff">
|
|
99
|
+
Xóa sạch toàn bộ debug log tạm thời (`console.log`, `print()`, `debugger`, `dump()`) trước khi đề nghị ký duyệt Gate G3.
|
|
100
|
+
</rule>
|
|
101
|
+
</observability_hygiene>
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 6. Quản Lý Tài Nguyên Phòng Thủ & Dọn Dẹp (Resource Management & Teardown)
|
|
106
|
+
|
|
107
|
+
<resource_management>
|
|
108
|
+
<rule id="deterministic_teardown">
|
|
109
|
+
Luôn quản lý con trỏ tệp (file handles), kết nối mạng socket và transaction database bằng các cấu trúc giải phóng tiền định (`try...finally`, Python `with`, TypeScript `using`, hoặc RAII nguyên bản của ngôn ngữ).
|
|
110
|
+
</rule>
|
|
111
|
+
|
|
112
|
+
<rule id="isolated_test_state">
|
|
113
|
+
Mỗi fixture kiểm thử phải tự tạo và tự dọn sạch trạng thái tạm thời của mình. Không để sót lại dữ liệu rác sau khi chạy xong test.
|
|
114
|
+
</rule>
|
|
115
|
+
</resource_management>
|
|
27
116
|
|
|
28
117
|
</implementation_standards>
|