KB-21C6 rev 9

Anti-Patterns Registry — 15 patterns

5 min read Revision 9

Anti-Patterns Registry

Bài học rút từ incidents. Đọc trước mỗi mission. 15 patterns.

AP-01: Skip Assembly Gate (S135G) Sai: Bỏ qua Step 0, code ngay. Fix: PHẢI quote OR + Assembly Gate 6 câu.

AP-02: Báo cáo ảo (S167E) Sai: Báo DONE chưa verify production. Fix: VERIFY NUXT bắt buộc.

AP-03: Bypass branch protection (S161B) Sai: --admin khi CI fail. Fix: CẤM --admin.

AP-04: Filter ẩn issues (S162C) Sai: Filter che giấu vấn đề. Fix: Scanner show ALL.

AP-05: Manual deploy duplicate (S161) Sai: Deploy thủ công. Fix: CẤM manual deploy.

AP-06: Chức năng OK nhưng automation thiếu (S142) Sai: DONE nhưng không tự động. Fix: §0-AW Automation Checklist.

AP-07: Sửa lắt nhắt nhiều vòng CI (S161) Sai: Push từng fix lẻ. Fix: Test local, 1 PR 1 commit.

AP-08: Config trước code sau (S135G) Sai: Code trước, check PG/Directus sau. Fix: Assembly First.

AP-09: Làm tay thay DOT (S145) Sai: directus_create_item bypass DOT. Fix: DOT 100%.

AP-10: "Excluded" = giấu (S145) Sai: governance_role="excluded" cho junction. Fix: Junction = atom, "observed".

AP-11: Sáng tác Nuxt page cho collection mới (S145) Sai: Tạo PivotList.vue riêng. Dynamic pages ĐÃ CÓ. Fix: PG+Directus+meta_catalog → Nuxt TỰ HIỆN. §0-BA.

AP-12: Giám sát báo PASS nhưng số sai (S145, S146) Sai: DOT-114 pivot-health H7 báo "PASS" nhưng không so COUNT() thật. Fix: DOT verify accuracy PHẢI so COUNT() thật. Dual-trigger bắt buộc.

AP-13: Viết luật nhưng không đọc lại (S146) Sai: Agent viết hiến pháp nhưng khi làm → vi phạm chính luật đã viết. Fix: Mỗi mission PHẢI đọc luật TRƯỚC hành động.

AP-14: Dùng background agent đọc luật (S146-M4d) Sai: Background sub-agent không có MCP tools → bỏ qua luật. Fix: §0-BC — search_knowledge() MAIN PROCESS.

AP-15: ALTER TABLE trực tiếp bypass Directus (S147) Sai: Agent viết SQL ALTER TABLE ADD COLUMN trực tiếp trong PG. PG có column mới nhưng Directus không biết → API không serve field → Nuxt không thấy → field "vô hình". Đã xảy ra với l2_*, species_count, orphan_count, display_order. Fix: §0-BF — Mọi thay đổi schema PHẢI qua Directus Fields API (POST /fields/:collection). Directus tự tạo PG column + đăng ký + permissions trong 1 call. DOT tool là cổng duy nhất. Giống khai sinh: muốn sinh = phải qua DOT. Muốn thêm field = phải qua Directus API.

AP-16: Directus API không tạo PG FK (Dieu37-P1) Sai: Tin rằng Directus tự tạo FK constraint khi tạo relation. Thực tế Directus CHỈ lưu metadata vào directus_fields, KHÔNG ALTER TABLE. Fix: DOT collection-health H14 phải kiểm tra PG catalog + ALTER TABLE nếu thiếu.

AP-17: Script dùng Directus API khi PG table có cùng data (Dieu37-P1) Sai: H14 gọi curl GET /fields/${col} 133+ lần. directus_fields là PG table, đọc trực tiếp = milliseconds. Fix: Assembly First (NT8) — nếu data nằm trong PG, đọc PG. Directus API chỉ khi PG không có.

AP-18: Verify chỉ check positive, bỏ qua negative (Dieu37-P1) Sai: H15 kiểm tra "có read permission" nhưng H17 không kiểm tra "CẤM delete permission" trên governed cũ. Fix: Verify phải check positive (đủ) VÀ negative (cấm). Governed collection = PHẢI có read/create/update VÀ CẤM delete.

AP-19: Luật mới không hồi tố cho data cũ (Dieu37-P1) Sai: H17 Luật Bảo toàn chỉ áp dụng cho 6 bảng mới. Governed cũ (dot_tools, collection_registry...) vẫn có DELETE permission. Fix: Luật = hồi tố. Khi ban hành luật mới → quét TẤT CẢ data cũ + mới.

AP-21: Ghi đè nội dung BAN HÀNH bằng bản tóm tắt (S157 Đ37, S170 Đ36+NĐ-36-01) Sai: Agent upload bản tóm tắt / bản nháp lên KB, ghi đè bản enacted đầy đủ. Đã xảy ra 2 lần: S157 (Đ37 bị cắt cụt §1-§12, phát hiện ở S165), S170 (Đ36 v4.0 enacted bị ghi đè bằng v5.0 DRAFT tóm tắt 2K chars, NĐ-36-01 upload bản tóm tắt thay bản đầy đủ). Hậu quả: agent đọc KB → hiểu sai luật → hệ thống hỏng mà không ai biết. Fix: (1) Nội dung BAN HÀNH = BẤT BIẾN — KHÔNG update_document trên file enacted mà không có lệnh rõ ràng từ Huyên. (2) Trước khi update_document: PHẢI so sánh content_length bản mới vs bản cũ — nếu bản mới NGẮN HƠN → DỪNG, hỏi. (3) Upload nội dung mới = upload_document path riêng, KHÔNG ghi đè path cũ. (4) Verify sau upload PHẢI kiểm tra content_length + nội dung giữa file, không chỉ header.

AP-20: Hardcode enum bằng tiếng Anh khi data đã Việt hoá (Dieu37-P1) Sai: Check 9 hardcode ('CMS','LOG','REGISTRY'...) nhưng meta_catalog.atom_group đã migrate sang tiếng Việt ('cấu_trúc','công_cụ'...). Check luôn báo lỗi sai. Fix: Đọc enum từ PG table hoặc cross-reference, KHÔNG hardcode.