Học Viện AI & Claude Thực Chiến Vagataba Chuẩn V7.1 · 20/10/2026 · Claude 5.5 / Fable 5.1
🗂️ Học Liệu Mở Rộng · StoriesChuẩn V7.1 · 20/10/2026

TIỂU PHẨM ROLE-CAS: AGENT TẠO QUY TẮC PHÂN KHO SAI 🤖

Đường dẫn nguồn: Stories/Role/Role_CAS_DR_Rule_Sai.md

📌 Mục Lục Bài Học (8 mục)

📍 Module: §16 (Connectors — Kết nối hệ thống MCP) & §23 (Agentic Engineering) | Role: CAS — Chuyên viên Quản trị Hệ thống & Tự động hóa Odoo 🎓 Slide: Role CAS Slides ⭐ Format: Hài kỹ thuật — CAS dùng câu lệnh thiếu ngữ cảnh để tạo quy tắc phân kho Odoo, khiến 60 đơn miền Tây bị đẩy nhầm ra kho Hà Nội | 🎯 Bài học: Kiểm thử trên Sandbox trước khi triển khai / Phủ kín tình huống biên (else cảnh báo) & Cổng người duyệt (Action Gate) / AI viết code, con người định nghĩa nghiệp vụ ⏱ ~8 phút | Số vai: 2 NV (CAS, Minh) + Linh + Vân Anh tổng kết

Comedy Tools: The Game ("3 ngày chạy thật trên Production mà không chạy thử!") + Escalation (60 đơn miền Tây đi vòng ra Hà Nội) + Dramatic Irony (Claude viết đúng cú pháp Python nhưng thiếu hẳn logic nghiệp vụ vùng miền) + Callback (Toàn quốc có hàng chục tỉnh thành, quy tắc chỉ phủ đúng 2 thành phố)

Xưng hô cố định: CAS↔Minh: em/anh | Linh↔Minh: em/anh


BỐI CẢNH

[Phòng công nghệ Vagataba, 10:00 sáng. Chuyên viên Quản trị Hệ thống & Tự động hóa Odoo (CAS) ngồi trước 2 màn hình: Odoo và Claude Code. Minh đi vào.]


🎬 MÀN 1 — "Anh muốn tự động phân bổ đơn về 2 kho"

MINH: (bước vào) Em ơi, anh muốn Odoo tự động phân tuyến đơn hàng theo khu vực địa lý — khách ở khu vực phía Nam thì xuất từ Kho Bình Dương, khách ở khu vực phía Bắc thì xuất từ Kho Hà Nội. Em viết quy tắc tự động được không?

CAS: (gật đầu) Dạ dễ anh ơi, để em bảo Claude viết đoạn mã phân kho cho nhanh. (gõ vội câu lệnh cụt lủn) "Viết quy tắc phân kho Odoo: đơn Hồ Chí Minh → kho Bình Dương, đơn Hà Nội → kho Hà Nội."

CLAUDE: "Dưới đây là đoạn mã quy tắc phân kho:

PYTHON
if order.partner_id.state_id.name == 'Hồ Chí Minh':
    order.warehouse_id = env.ref('stock.warehouse_binh_duong')
elif order.partner_id.state_id.name == 'Hà Nội':
    order.warehouse_id = env.ref('stock.warehouse_ha_noi')

"

CAS: (nhìn lướt 3 giây) Cú pháp Python chuẩn. Hồ Chí Minh vào Bình Dương, Hà Nội vào Hà Nội. (bấm triển khai thẳng lên hệ thống thật mà không qua nhánh thử nghiệm)

MINH: (gật gù) Nhanh thế? Chưa đầy 1 phút!


⚡ MÀN 2 — "60 đơn miền Tây đi du lịch ra Hà Nội"

[3 ngày sau. Linh (Chuyên viên Xác minh đơn hàng — DVO) hớt hải chạy vào.]

LINH: (hoảng hốt) Anh Minh ơi! Em CAS ơi! Có 60 đơn hàng của khách ở miền Tây — Long An, Cần Thơ, Đồng Tháp — hệ thống tự động đẩy hết phiếu xuất về Kho Hà Nội rồi!

CAS: (giật mình quay lại) ...Sao miền Tây lại nhảy ra kho Hà Nội được?! (mở nhật ký Odoo kiểm tra quy tắc) ...Thôi chết rồi. (ôm đầu) Đoạn mã hôm trước chỉ kiểm tra đúng 2 chuỗi 'Hồ Chí Minh' và 'Hà Nội'. Các đơn ở Long An, Cần Thơ không khớp với cả 2 nhánh if/elif → bị rơi xuống giá trị mặc định của hệ thống Odoo — mà kho mặc định cấu hình từ hồi đầu lại là Kho Hà Nội!

LINH: (giọng căng thẳng) 60 đơn miền Tây mà xuất từ Hà Nội thì thời gian giao mất 5–7 ngày thay vì 1–2 ngày từ Bình Dương, phí vận chuyển đội lên gấp đôi mà nguy cơ hoàn đơn (RTS) tăng vọt! May mà em đang rà soát hàng đợi xuất kho nên chặn lại kịp 45 đơn chưa bàn giao bưu cục!

MINH: (nhìn CAS, giọng nghiêm) Quy tắc này em bật chạy bao lâu rồi? Có chạy bộ 10 đơn thử nghiệm trên Sandbox trước khi đưa lên Production không?

CAS: (nhỏ giọng) Dạ... chạy được 3 ngày rồi ạ. Hôm đó thấy code ngắn nên em dán thẳng lên Production, không chạy thử...


🏆 MÀN 3 — "Code chạy không báo lỗi ≠ Nghiệp vụ đúng"

[Vân Anh bước vào, chiếu đoạn mã lên màn hình lớn.]

🎤 VÂN ANH: (bình tĩnh) Em CAS cho chị hỏi: khi em chỉ gõ "đơn HCM → kho BD, đơn HN → kho HN", Claude có tự biết bản đồ phân vùng giao vận toàn quốc (dù tính theo 34 tỉnh/thành sau sáp nhập hay 63 mã tỉnh/thành lịch sử trên Odoo) của Vagataba quy định tỉnh nào thuộc miền Nam, tỉnh nào thuộc miền Bắc không?

CAS: (lắc đầu) Dạ không ạ. Em chỉ nhắc tên 2 thành phố nên nó chỉ viết đúng 2 nhánh điều kiện.

🎤 VÂN ANH: (gật đầu) Chính xác. Claude viết đúng cú pháp Python — nhưng thiếu hoàn toàn logic nghiệp vụ vùng miền và nhánh xử lý ngoại lệ (else).

Hãy xem cách viết lại Hợp đồng Prompt chuẩn và đoạn mã an toàn có Hàng đợi cảnh báo (Warning Queue) kèm Cổng người duyệt (Action Gate — §16.3 / §23.2):

TEXT
<context>
Hệ thống Odoo của Vagataba có 2 kho: Kho Bình Dương (phụ trách các tỉnh/thành từ Đà Nẵng trở vào Nam) và Kho Hà Nội (phụ trách các tỉnh/thành từ Huế trở ra Bắc).
</context>
<task>
Viết hàm phân bổ kho tự động trên Odoo kèm xử lý tình huống biên (Edge case) và cổng kiểm soát an toàn.
</task>
<constraints>
1. Đối chiếu mã tỉnh/thành (state_id.code) với danh sách mã vùng miền Bắc và miền Nam đã định nghĩa rõ.
2. BẮT BUỘC có nhánh `else`: Nếu đơn hàng thiếu thông tin tỉnh/thành hoặc mã tỉnh không nằm trong 2 danh sách, TUYỆT ĐỐI KHÔNG tự gán kho mặc định mà phải chuyển trạng thái đơn sang `waiting_manual_routing` (Hàng đợi cảnh báo) để DVO duyệt tay (Action Gate).
3. Viết kèm bộ kiểm thử tự động (pytest) gồm 10 đơn mẫu (TP.HCM, Hà Nội, Cần Thơ, Đà Nẵng, và đơn khuyết tỉnh thành).
</constraints>
PYTHON
# Mã nguồn chuẩn có nhánh dự phòng an toàn (Graceful Fallback & Action Gate)
state_code = order.partner_id.state_id.code

if state_code in SOUTH_PROVINCE_CODES:
    order.warehouse_id = env.ref('stock.warehouse_binh_duong')
elif state_code in NORTH_PROVINCE_CODES:
    order.warehouse_id = env.ref('stock.warehouse_ha_noi')
else:
    # Cổng chặn an toàn: Không tự ý đẩy vào kho mặc định!
    order.routing_status = 'waiting_manual_routing'
    order.message_post(body="⚠️ CẢNH BÁO PHÂN KHO: Chưa xác định được vùng giao vận. Chuyển DVO duyệt tay (Action Gate).")

🎤 VÂN ANH: 3 nguyên tắc sắt đá cho vị trí CAS (Quản trị Hệ thống & Tự động hóa):

  1. Kiểm thử trên Sandbox trước khi triển khai: Luôn chạy thử tối thiểu 10 đơn mẫu bao phủ đủ các miền và đơn lỗi trước khi bật thật.
  2. Bắt buộc khóa nhánh else bằng Cổng người duyệt (Action Gate): Khi dữ liệu không khớp quy tắc, phải đẩy vào hàng đợi cảnh báo cho con người kiểm tra — tuyệt đối không để hệ thống âm thầm rơi vào giá trị mặc định sai.
  3. Claude viết code, kỹ sư định nghĩa nghiệp vụ: Phải nạp đầy đủ bảng phân vùng của Vagataba vào CLAUDE.md và Hợp đồng lệnh.

Trong ngành: Dispatch / Routing Rule (Quy tắc phân tuyến kho), Edge Case (Tình huống biên/ngoại lệ), Action Gate / Fallback Queue (Cổng người duyệt / Hàng đợi dự phòng), Sandbox Testing (Kiểm thử môi trường cô lập).

📋 Mở Role CAS Slide — "Chuyên viên CAS: Quy tắc tự động, Xử lý ngoại lệ (else), Kiểm thử Sandbox & Cổng người duyệt."


📋 3 Bài học

  1. Kiểm thử trước khi triển khai: Bắt buộc chạy bộ kiểm thử (pytest / 10 đơn mẫu đa vùng miền) trên Sandbox trước khi đưa lên Production.
  2. Không bao giờ bỏ trống nhánh else: Mọi quy tắc tự động phải có nhánh bắt ngoại lệ đẩy về hàng đợi cảnh báo (Action Gate), không để hệ thống tự chọn kho mặc định sai.
  3. Claude viết code, con người nắm nghiệp vụ: Phải cung cấp danh sách phân vùng đầy đủ trong Hợp đồng Prompt và CLAUDE.md.

💬 Câu hỏi thảo luận

  1. Khi viết một quy tắc tự động trên Odoo hoặc bảng tính, điều gì sẽ xảy ra nếu dữ liệu đầu vào bị khuyết hoặc viết tắt (ví dụ: "TP HCM", "TPHCM", "Sài Gòn") mà không có nhánh else cảnh báo?
  2. Hãy liệt kê 5 trường hợp kiểm thử (Test cases) bắt buộc phải chạy trước khi bật quy tắc phân bổ đơn hàng về 2 kho Bình Dương và Hà Nội.
  3. Trong hệ thống bạn đang quản trị, có cài đặt "mặc định" (Default) nào đang tiềm ẩn nguy cơ giống như vụ mặc định đẩy đơn về Kho Hà Nội không?

📹 KỊCH BẢN GỐC

Thông tin Chi tiết
Format gốc "Automation gone wrong" — đào tạo xử lý sự cố kỹ thuật & kiểm thử phần mềm
Xem trên YouTube Tìm "automation rule gone wrong" hoặc "deploy without testing"

BVT Analysis

Beat Violation Benign Đồng thời?
BEAT 3 (Crack): "Chưa đầy 1 phút!" → bấm triển khai thẳng lên Production Bỏ qua hoàn toàn bước kiểm thử Sandbox Tâm lý chủ quan khi thấy đoạn code ngắn ✅
BEAT 4 (Escalate): 60 đơn miền Tây bị phân về Kho Hà Nội Nguy cơ giao chậm 5–7 ngày & đội phí ship Linh (DVO) phát hiện và chặn kịp 45 đơn tại hàng đợi ✅
BEAT 5 (Crisis): Quy tắc chỉ phủ 2 thành phố, bỏ quên toàn bộ các tỉnh còn lại Code đúng cú pháp nhưng khuyết hoàn toàn logic nghiệp vụ Chỉ rõ tầm quan trọng của nhánh else & Action Gate ✅
BEAT 6 (Twist): "Claude viết code, kỹ sư viết nghiệp vụ và lưới bảo hiểm" Kỳ vọng lật — AI không thay thế tư duy kiểm thử của CAS Chuẩn hóa Hợp đồng lệnh + pytest ✅

Tài liệu nội bộ Vagataba — V7.1 — 20/10/2026 Tiểu phẩm ROLE-CAS — Agent Tạo Quy Tắc Phân Kho Sai Dẫn vào Role CAS: Quy tắc tự động, Xử lý ngoại lệ, Kiểm thử Sandbox & Action Gate (§16 & §23)