Balo reconcile từ khuôn — bước 2A read-only và HOLD gate
Balo reconcile từ khuôn — tiến độ điều tra và thiết kế
Ngày: 2026-07-15
Trạng thái: HOLD — bước 2A chỉ đọc đã xong; thiếu lệnh Balo nền và Owner gate WRITE
Rào chắn: chưa WRITE DB, chưa sửa DOT SSOT, chưa deploy/restart/cron, UI vẫn chỉ đọc.
0. Phạm vi nhận được
- File đính kèm là Lệnh 1.6 khôi phục 40 DOT, đã hoàn tất trước đó và ghi rõ không chạm Balo.
- Phụ lục mới yêu cầu cơ chế reconcile
public.balo_thuc_thetừ livepg_catalog, idempotent, giữ STT, đánh dấu mất, có verifier và không quyết định cron. - Do hai phần xung đột và phụ lục nhắc “bước 2A” không có trong file, nhịp hiện tại chỉ thực hiện điều tra read-only; chưa coi đây là Owner gate cho WRITE Balo.
1. Checklist
- Đọc
.claude/skills/incomex-rules.md. - Search trực tiếp Operating Rules SSOT, Hiến pháp hiện hành và luật Balo.
- Xác định khuôn/DOT đã tạo và hiện duy trì
balo_thuc_the. - Tính dry-run từ live
pg_catalog: giữ/thêm/đánh dấu mất/conflict. - Xác định chỗ sửa tối thiểu và verifier.
- Chốt ranh giới thực thi/Owner gate từ prompt đầy đủ — HOLD.
- Nếu được phép: triển khai qua DOT, verify production và cập nhật báo cáo/KB.
2. Ba câu tuyên ngôn cho mission
- Vĩnh viễn: phải sửa cơ chế reconcile canonical dùng live
pg_catalog, không chèn số đếm hiện tại và không vá dữ liệu một lần. - Nhầm được không: khóa scope 4 loại, khóa nhận diện UNIQUE, dry-run/atomic apply/verifier và fail nếu conflict; không cho UI ghi.
- Tự động: mỗi lần DOT reconcile được gọi sẽ tự tính toàn bộ delta và xử lý idempotent; lịch chạy/cron là quyết định vận hành riêng, không thuộc mission.
3. Nguồn đã đọc
.claude/skills/incomex-rules.md— 36 mục, quy trình 8 bước.knowledge/dev/ssot/vps/vps-operating-rules.md— v1.0 Active.knowledge/dev/laws/constitution.md— v4.6.3 BAN HÀNH.knowledge/dev/laws-new/pg-read-pg/balo-thuc-the-quy-dinh.md— nội dung revision 14, tiêu đề thân v1.9 CHÍNH THỨC.knowledge/dev/laws-new/pg-read-pg/balo-thuc-the-design-handoff.md.
4. Kết quả bước 2A read-only
4.1 Khuôn tạo và trách nhiệm duy trì
- Khuôn đã tạo Core:
/opt/incomex/dot/sql/balo-core-first-run.sql, commit local DOTf8eb7c2. - Khuôn này cố ý là first-run only: nếu bảng/sequence đã tồn tại thì RAISE; luật Balo §11 nói rõ đây là ảnh chụp một lần, không duy trì object phát sinh sau.
- Cổng ghi chung:
/opt/incomex/dot/bin/dot-pg-atomic-apply; SHA đã được Lệnh 1.6 xác minh với commit tin cậy. Đây chỉ là gateway atomic/hash-lock, không phải logic reconcile. rgtoàn repo và truy vấnpublic.dot_tools: không códot-balo-reconcile,dot-balo-verifyhoặc DOT Balo maintenance nào.- Kết luận: hiện không có thành phần chịu trách nhiệm duy trì Balo sau first-run. Khoảng thiếu là cơ chế reconcile canonical đã được luật Balo dự kiến nhưng chưa xây.
4.2 Dry-run từ live pg_catalog
Nguồn catalog dùng đúng bốn loại hiện đã được Balo Core quản lý và cùng bộ lọc schema của SQL first-run: table relkind='r', view relkind='v', function prokind='f', trigger NOT tgisinternal; loại pg_catalog, information_schema, pg_toast%.
kind catalog keep revive metadata_update add mark_missing conflicts
table 385 383 0 0 2 0 0
view 699 699 0 0 0 0 0
function 654 654 0 0 0 0 0
trigger 410 410 0 0 0 0 0
TOTAL 2148 2146 0 0 2 0 0
Hai khóa mới được tính từ catalog, không hardcode số:
table:public.sua_re_khai_niem_nhap
table:public.sua_re_ui_khai_niem_nhap
Trạng thái hiện tại:
balo rows=2146; da_mat=true=0
stt min=1; max=2146; distinct_stt=2146
distinct khoa_nhan_dien=2146
balo_stt_seq last_value=2146; is_called=true
duplicate catalog keys=0; ambiguous names=0
4.3 UI Làm mới vẫn chỉ đọc
web/components/shared/DirectusTable.vue::handleRefresh()chỉ gọirefresh()rồi emitrefreshed.- Trang Balo đi theo Directus list; test production mold khẳng định request
/api/directus/items/balo_thuc_the, không gọi/api/reports/live. - Directus có đúng 5 permission cho
balo_thuc_the, tất cảaction=read; không có create/update/delete. - Route live report là
GET, client chỉ gửitable_id; PG gateway đặt transaction read-only. - Không có liên kết từ nút UI tới Balo reconcile.
5. Chỗ sửa tối thiểu đề xuất
Không sửa dữ liệu trực tiếp và không hardcode 383/385/2146/2148. Tạo đúng một cơ chế maintenance canonical trong DOT repo:
- Một định nghĩa catalog/delta dùng chung cho 4 loại hiện hành, sinh action
KEEP/ADD/REVIVE/METADATA_UPDATE/MARK_MISSING/CONFLICTtừ livepg_catalog. - DOT-B
dot-balo-reconcilecó--dry-runmặc định và--applyrõ ràng; apply đi quadot-pg-atomic-apply, một transaction, hash-lock manifest, fail khi conflict. - Apply chỉ:
- giữ nguyên hàng khớp và STT;
- INSERT khóa chưa từng có để sequence cấp STT mới;
- set
da_mat=truecho khóa biến mất, không DELETE; - set
da_mat=falsekhi cùng khóa xuất hiện lại, giữ nguyên STT; - cập nhật
ten/noi_luu/date_updatedtừ catalog khi khóa cũ còn tồn tại; - không đụng các ô phải-gật (
nhom/loai/chuyen_mon/lop/ghi_chu/kiem_soat/active).
- DOT-A
dot-balo-verifychỉ đọc cùng delta và FAIL nếu cònADD/REVIVE/METADATA_UPDATE/MARK_MISSING/CONFLICT, nếu trùng key/STT hoặc sequence có nguy cơ tái cấp. - Không cron, trigger, registry, framework sync, Nuxt WRITE hoặc máy chạy ngầm mới.
Điểm thiết kế cần khóa trong prompt nền: phạm vi hiện tại là 4 loại đã có Balo hay mở sang đủ 12 loại census. Mở 12 loại là một mission khác vì phải chốt khóa nhận diện và semantics cho 8 loại chưa có.
6. Lý do HOLD
File đính kèm hiện tại vẫn là Lệnh 1.6 khôi phục 40 DOT, có các câu cấm balo_thuc_the và “Không chuyển sang Balo sync trong cùng nhiệm vụ”. Phụ lục mới lại yêu cầu xây và chạy Balo reconcile, đồng thời nhắc “bước 2A” không tồn tại trong file. Vì WRITE Balo là thay đổi production không thể suy diễn từ hai mệnh lệnh xung đột, bước 2A đã xong nhưng code/apply phải dừng chờ Owner xác nhận prompt đúng và gate.
7. OR/TD/Handoff
- OR: chưa cập nhật vì chưa có thay đổi runtime; đây là read-only investigation.
- TD: chưa mở nợ mới; khoảng thiếu reconcile đã tồn tại và đang chờ lệnh chính xác.
- Handoff: dùng chính báo cáo này cùng evidence live nêu trên.