Bẫy đã gặp thật
Mỗi bẫy dưới đây đã xảy ra thật và phải có máy chặn, không chỉ một dòng nhắc. Loại nguy hiểm nhất là loại hỏng mà hệ vẫn trông như đang chạy.
Bẫy 1: test dựng repo tạm bên trong git hook
Hook xuất GIT_DIR, GIT_INDEX_FILE. Test gọi git init trong thư mục tạm, nhưng git đọc các biến đó và ghi vào repo thật: core.bare=true, mọi lệnh git sau đó hỏng.
- Chặn: bộ chạy gate xoá mọi
GIT_*cho mọinode --test; test tự xoá ở đầu file. - Gặp rồi thì sửa ngay:
git config --file .git/config core.bare false, kiểmreflogkhông có commit lạ.
Bẫy 2: node_modules cũ sau git pull
Gate báo lỗi lạc đề ("Could not resolve @scope/pkg") vì phiên khác vừa đổi lockfile.
- Chặn:
check-node-modules.mjsở bước 2 của pre-commit.
Bẫy 3: lỗi bị try/catch nuốt trông giống "không có gì"
- Chặn: in lỗi rõ ràng và để bước đó đỏ. Hook được phép nuốt lỗi để không làm hỏng tool, nhưng đường lỗi phải được thử bằng tay một lần.
Bẫy 4: $? sau $(...) luôn ra 0
echo "$(date) (exit $?)" luôn in 0, vì $(...) đặt lại $?.
- Chặn:
rc=$?ngay sau lệnh, trước mọi$(...). Log của lượt hằng tuần đọcrc.
Bẫy 5: danh sách trỏ tới file đã chuyển chỗ
Tách app, đổi tên spec: danh sách spec hay đường dẫn trỏ vào chỗ trống, bộ kiểm thu nhỏ lặng lẽ và vẫn xanh.
- Chặn: kiểm sự tồn tại của từng đường dẫn, thiếu thì đỏ to.
Bẫy 6: gate local đọc cả file chưa commit
Gate ở máy đọc cây làm việc, gồm cả file dở của phiên khác, nên xanh hoặc đỏ oan.
- Chặn: CI mới là cổng thật. Ở máy, chế độ
--stagedchỉ xét file đã stage.
Bẫy 7: script tự đánh số đọc rồi +1
Hai phiên cùng đọc số lớn nhất rồi cùng +1: hai yêu cầu hay hai migration trùng số.
- Chặn: giành số trên remote (một ref riêng) trước khi ghi; cấm tự đọc rồi +1. Cùng tinh thần với luật "tính duy nhất nằm ở ràng buộc CSDL" của các vòng chạy tự động ở Conan.
Bẫy riêng của Conan
Sổ đầy đủ ở known-risks. Các bẫy thuộc harness:
| Bẫy | Ngày | Chặn bằng |
|---|---|---|
| Token CI thiếu D1 Edit: migration không áp, api đóng băng hai ngày trong khi frontend vẫn ship | 02-03.09.2026 | Migration chạy trước deploy cùng job; so sổ theo tên |
| CI chạy mọi job cho PR chỉ thêm JSON: 1.803/2.000 phút trong 4 ngày | 04.09.2026 | scripts/ci/select-jobs.mjs (29 mẫu tự kiểm), sparse checkout |
| Gác ở máy và ở CI nhìn hai tập file khác nhau | 09.09.2026 | scripts/lib/git-ignored.mjs; bộ chạy từ chối cây sparse |
startup_failure nuốt lượt deploy, không chạy lại được | 26-27.09.2026 | workflow_dispatch ở mọi deploy; kiểm deploy theo SHA merge |
| Actions bị tắt vì chi phí, mọi merge không deploy mà không gì đỏ | 28.09.2026 | timeout-minutes mọi job. Chưa có cảnh báo tự động. |
| Merge khi CI đỏ | 27.09, 11.10.2026 | Quy ước --match-head-commit. Không có máy chặn (gói Free). |
| 13/23 lượt CI đỏ là lỗi gác có sẵn bắt được ở máy | 12.10.2026 | Hook PostToolUse, Stop, trước push |
Đọc nhầm mã thoát vì | tail | 12.10.2026 | Hook trước push chạy gác, đỏ là chặn |
| Gác đỏ đầu tiên làm skip mọi job build; ba danh sách gác lệch nhau | 14.10.2026 | run-guards.mjs: một danh sách, chạy hết rồi báo |
| Hook đổi tên thì tắt im lặng | 14.10.2026 | Gác hooks |
| Tách repo: gác soi thư mục đã dời vẫn xanh vì không còn gì để soi | 16.10.2026 | Gác thoát 2 khi thư mục khai báo vắng mặt |
| Bản clone cũ sau khi viết lại lịch sử kéo 400 MB quay lại | 17.10.2026 | Gác history-root. Clone cũ vẫn được mở làm thư mục phiên. |
archived-migrations đỏ giả khi cây tụt sau origin/main (bẫy 6) | 18.10.2026 | So với merge-base |
| Luật "không bao giờ" chỉ nằm trong chữ bị vượt hàng trăm lần trong 14 ngày | 18.10.2026 | Hook danger-guard |
| Workflow deploy mới không vào sổ lỗi (aimaster, webai, harness) | 18.10.2026 | error-ledger --self-test |