Runtime baseline · 30 SEP 2026
Cont/Seal · luồng đang chạy
Luồng production từ callback Zalo tới Master, OPS và nhóm kết quả.
Phiên nhận dữ liệu độc lập
Callback đầu mở một phiên theo tenant + account session + channel + thread type + thread/group + sender. Callback cùng khóa nối text/ảnh/source messages và reset quiet timer riêng (mặc định 60 giây, hard cap 300 giây). Tài xế khác trong cùng nhóm hoặc cùng tài xế ở nhóm khác mở phiên riêng. Không giữ transaction DB trong thời gian đợi; phiên khác vẫn nhận và chốt dữ liệu trong khi AI đang xử lý.
Provider submission ID dùng để tách album khi có. Nếu không có, timer là fallback, không bảo đảm tách hai album gửi gần nhau từ cùng tài xế/nhóm. Phiên chưa chốt còn trong RAM: shutdown chủ động flush; crash đột ngột có thể mất phần chưa chốt.
Luồng hiện tại
Zalo callback: text / ảnh / video
→ phiên gom riêng cho sender + nhóm (không gọi AI)
→ chốt một event chứa đầy đủ text, media và source messages
→ commit Gateway durable inbox
→ Core kiểm tra scope, dedupe
├─ Có ảnh Zalo → TX: inbound event + core_master_jobs → COMMIT → ACK
│ → worker Master claim job (lease, retry, concurrency có giới hạn)
│ → scoped workflow catalog + toàn bộ ảnh → typed per-image evidence
│ → handler Java kiểm tra policy, chọn tối đa 6 ảnh cho OPS
│ ├─ IGNORE → lưu reason/evidence, không tạo OPS và không gửi
│ └─ ASSIGN → pin workflow/skill/policy/model/destination + tạo OPS job
│ → OPS đọc độc lập ảnh được chọn, không lấy mã Master làm đáp án
│ → validate / consensus / targeted reread / review
│ → TX: result + report outbox
│ → gửi qua Gateway → lưu receipt
├─ Không có ảnh, có text hữu ích → TX: event + text job → ACK
│ → text worker → policy/handover → assistant/tools được phép → reply
└─ Media không hỗ trợ / event rỗng → lưu event, không tự chạy Vision
ACCEPTED chỉ xác nhận event và job đã commit, không khẳng định Master đã có decision hay đã gửi kết quả. Core không poll Zalo: Gateway nhận listener callback; các worker chỉ poll hàng đợi PostgreSQL. Gateway replay giữ thứ tự trong cùng sender/thread; các scope khác không dùng chung hàng đợi theo toàn bộ tài khoản.
Master, handler và OPS làm gì?
| Thành phần | Trách nhiệm thực tế |
|---|---|
| Master | Một lần định tuyến AI sau khi event bền vững: xem album, chọn workflow đang bật trong scope và mô tả evidence từng ảnh. Không thực hiện gửi tin hay coi mã sơ khai là đã xác minh. |
| Handler Java | Không gọi AI. Áp dụng policy DB và typed evidence để lọc nhiễu, chọn tối đa 6 ảnh đầu vào OPS; không cắt mất ảnh trong event gốc. Java owns schema validation, admission và side effects. |
| OPS | Đọc kỹ ảnh đã chọn theo skill được pin; xác minh mã Cont/Seal, load state và provenance, cùng các lượt đọc độc lập/targeted khi pipeline yêu cầu. Vì vậy tổng số model calls không cố định là ba. |
| Workflow/task runtime | Workflow/task và outbox của Cont/Seal có thật, nhưng executor vẫn chuyên biệt. Canvas/config không đồng nghĩa mọi node graph đều đã có live executor; text assistant chạy processor riêng. Process/Workflow một Role là hướng mở rộng, không được suy diễn là mọi nghiệp vụ đã triển khai. |
Hai nhánh kết quả và ảnh tem
- Cont đầy: một ảnh hiện trường đủ chứng minh hàng hóa/load state theo policy có thể là evidence FULL; không bắt buộc toàn album là ảnh đầy. Ảnh tem dán hàng hóa khác seal khóa container.
- OPS vẫn nhận tối đa 6 ảnh theo policy. Report chính giữ formatter/selection hiện có; nhánh FULL bổ sung toàn bộ ảnh cargo label Master nhận diện, không giới hạn hai tem, không loại hai ảnh khác nhau chỉ vì thông tin tem giống nhau.
- Không tạo tin OCR tem bổ sung. Ảnh tem được gửi kèm kết quả; không gửi toàn album chỉ vì cont đầy.
- Cont rỗng giữ nhánh cũ, chọn ảnh bằng chứng đuôi/số cont và loại ảnh nhiễu theo handler/quality gate.
- Hạ cont/progress, ảnh seal chụp rời hay ảnh nhiệt độ không tự trở thành submission đủ điều kiện; caption và evidence vật lý phải qua skill/policy.
History, retry và chống trùng
Inbound history lưu event kể cả khi chưa có decision, thể hiện Master PENDING/PROCESSING/RETRY/DONE/FAILED, số lượt và lỗi cùng trạng thái OPS/task nếu đã tạo. Intake commit DB thất bại không trả ACCEPTED. Master/network/schema failure retry có backoff, mặc định tối đa 4 lượt; lease hết hạn được reclaim và claim token cũ không được hoàn tất claim mới. Một event replay không nhân đôi job/task; quyết định đã commit được dùng lại. Model failure không bị giả lập thành IGNORE.
Report dùng destination đã pin và command idempotency. Hold tại một outbox cụ thể không ảnh hưởng báo cáo live; UNKNOWN cần đối soát, không tự gửi lại mù quáng. Lookup Sheet không phải điều kiện của lượt replay Cont/Seal hiện tại.
Acceptance đã kiểm tra trên production
Replay bộ Phúc: 15 callbacks → 1 event chứa 13 ảnh + 1 video + tin tài xế; Master → OPS trả VERIFIED, Cont OTPU6921220, Seal WHA4492111; report 7 ảnh gồm đủ 4 ảnh tem. ACK event đầu 209 ms; event ở nhóm khác được lưu/ACK 104 ms khi Master đầu đang chạy. Duplicate trả 200, một Master job, một lượt xử lý; report test giữ WAITING_DESTINATION, attempts 0, không tạo outbound command.
Thiết kế mở rộng: Intake & Process Routing · Role & Skill · Process / Workflow Runtime.