UI 4 Mẹ — Review cú nén modit-entry-enhance (mốc v6-squash-green) + Reviewer#3 độc lập
UI "4 Mẹ" — Review cú nén modit-entry-enhance.js (mốc v6-squash-green)
Ngày: 2026-07-02 · Phạm vi: tầng UI/khuôn khai báo (surface) — KHÔNG đụng PG/Directus/Kestra runtime · Trạng thái: PASS (đã verify độc lập). Đối tượng đọc: mọi agent (Claude, GPT/Codex, người tiếp quản). Tài liệu tự-chứa.
0. TL;DR
- Một agent (Claude Code CLI) đã nén
modit-entry-enhance.jstheo prompt "an toàn có git + parity": gộp 6 IIFE/6 wrapApp.preview→ 1, bỏ role_kind v1/v2 (sai) chỉ giữ v3, 24321 → 18887 bytes (~‑22%). KHÔNG đụngsystem-manifest.js/qa-contracts.js(đúng — đọc không trọn qua giới hạn 50KB, để phase có shell). - Có git baseline (tag
v5c-green) và tag kết quảv6-squash-green; web-state chỉ đổi đúng hash của modit. - Reviewer #3 (độc lập, chạy trên UI thật) xác nhận SẠCH: role_kind 4 nhãn đúng, idempotent, chống-nuốt-cột + banner đỏ hiện thật, không lỗi ngầm. 404 baseline = thiếu
favicon.ico(vô hại). - Bài học nâng thành luật: nghiệm thu bám baseline đo được, KHÔNG bám invariant do prompt đoán (ca
window.MOLDvs#moldJson). - Không còn blocker. Việc "đọc rẻ toàn hệ" (nén/tách 2 file lớn) để phase riêng, thiết kế trước, agent có shell.
1. Bối cảnh hệ (đủ để khỏi cần tài liệu khác)
- "4 Mẹ" = 4 khuôn KHAI BÁO design-time: MOW (quy trình), MOT (mô hình/trường), MOIT (biểu mẫu nhập → sinh bản ghi), MOUT (báo cáo) + Master hub; các con MODW/MODT/MODIT để "biến Mẹ thành chạy được".
- Kiến trúc mục tiêu:
PG (nguồn sự thật) → Directus (ĐỌC) → UI (khuôn) → DOT/gateway (GHI) → Kestra (điều phối). Luật NO-DIRECT-PG. modit-entry-enhance.jslà lớp dùng chung cho MOIT (host#formZone) LẪN MODT (host#vInp) — nó sinh ra "hợp đồng thông tin" (mold JSON):target_collection,value_fields[],reference_inputs[],save_shape. Mold này là ĐẶC TẢ để phase sau dựng bảng/collection. Mold sai một ly → bảng dựng sai một dặm → đây là lý do parity là sinh tử, cấm "xanh giả".
2. Cú nén đã làm gì (báo cáo agent CLI)
| Trước | Sau |
|---|---|
6 IIFE, 6 lần wrap App.preview |
1 IIFE, 1 wrap |
| role_kind v1 (regex có dấu → hỏng) + v2 (bắt nhầm "nguoi_nhan") + v3 | chỉ v3 (slug ASCII + keyword siết) |
| 24321 bytes | 18887 bytes (~‑22%) |
Kỷ luật an toàn đã áp: baseline xanh trước → git tag v5c-green → golden ngoài docroot → test workdir → deploy sau khi pass → QA 2 lần → deep-equal mold → flow thật MOIT/MODT → chotMoc() → web-state chỉ đổi hash modit → git tag v6-squash-green. Không đụng system-manifest.js/qa-contracts.js (quyết định đúng).
3. Reviewer #3 — verify độc lập trên UI THẬT (không tin báo cáo suông)
Chạy trực tiếp trên moit-builder-v1.html LIVE:
3.1 role_kind 4 nhãn (rủi ro lớn nhất của việc bỏ v1/v2) — qua đường mold thật:
| Nhãn | role_kind | source | Đúng? |
|---|---|---|---|
| Người thực hiện | actor | inferred | ✓ |
| Người nhận báo cáo | recipient | inferred | ✓ |
| Người nhận hàng | actor | inferred | ✓ (v2 sẽ ra recipient — bản nén KHÔNG lệch) |
| Reviewer | approver | inferred | ✓ |
fk_column role-prefix đúng & phân biệt (nguoi_thuc_hien_nhan_vien_id, …).
3.2 Flow thật + tính ổn định:
- Idempotent: gọi
App.preview()4 lần liên tiếp → mold giống hệt (parity lặp — quan trọng vì boot chỉ gọi preview 1 lần thay vì 6). - Chống-nuốt-cột (F1): dùng nút thật
#addRefBtn×2 không đặt tên → 2 cột..._id+..._id__2phân biệt, không mất dữ liệu;__dup_warn=true. - Banner đỏ HIỆN THẬT:
#ee-dup-bannerposition:fixed, opacity 1, z-index 99999, 1641×35 ở đỉnh, chữ "TRÙNG ĐỊNH DANH CỘT — đã tự tách để KHÔNG mất dữ liệu". (Lưu ý kỹ thuật: banner làposition:fixednênoffsetParent===null— ĐỪNG dùngoffsetParentđể đo hiển thị phần tử fixed; dùnggetBoundingClientRect+getComputedStyle.)
3.3 Giới hạn trung thực: case save_shape 2 khóa (M–N) không tái tạo được bằng inject M.refInputs (thiếu state mà picker thật tạo). Nó nằm trong QAC R1 (reference_inputs.fk_column KHỚP save_shape link_table) đã XANH ở lần QA đầy đủ — dựa QAC, không nhận "tự kiểm lại".
3.4 Cái 404 baseline: = ui-preview/mcp-writes/favicon.ico → 404 (browser tự xin favicon theo thư mục; /favicon.ico gốc thì 200). Vô hại, không tính năng nào chết ngầm.
4. BÀI HỌC → LUẬT ĐỨNG (quan trọng nhất)
Prompt trước yêu cầu window.MOLD deep-equal #moldJson. Agent phát hiện baseline vốn KHÔNG bằng nhau: entry-savemode.js bổ sung save_mode/save_target vào #moldJson SAU modit. Agent đã đúng khi giữ quan hệ baseline thay vì ép invariant.
LUẬT: Nghiệm thu refactor = khớp BASELINE ĐO ĐƯỢC, không khớp invariant do prompt/giả định đặt ra. Nếu prompt khẳng định một bất biến mà baseline vi phạm → baseline thắng, ghi lại chênh lệch làm kiến thức hệ thống.
5. Đánh giá theo mục tiêu "sửa rẻ / đọc rẻ"
| Mục tiêu | Kết quả |
|---|---|
| Git bảo vệ + revert nhanh | Đạt (tag v5c-green, v6-squash-green) |
Không lộ .git public / không ghi nhầm thư mục cha |
Đạt |
| Nén modit + đọc rẻ/sửa rẻ cho modit | Đạt |
| Đọc rẻ TOÀN HỆ (SYS ~76KB, qa-contracts ~60KB) | Chưa — hoãn đúng chủ đích |
| Tách SYS/QA | Hoãn (rủi ro dây chuyền, cần thiết kế + shell) |
6. Còn lại — xếp theo độ phức tạp
Làm-ngay (rẻ):
- Ghi KB (chính tài liệu này) — DONE.
favicon.ico404 + git chưa có remote/backup ngoài VPS → backlog, không gấp.
Giao agent có công cụ tốt hơn (shell/SSH):
3. system-manifest.js / qa-contracts.js: vòng sau phải ĐỌC + THIẾT KẾ trước, chưa sửa code — khảo sát chiến lược TÁCH (split) ưu tiên hơn merge, thiết kế nghiệm thu cho ràng buộc dây chuyền: SYS.canonical.core_files + web-state.json + chotMoc() + mọi trang include (đúng thứ tự) + QAC path-integrity. Bắt buộc golden snapshot deep window.SYS + snapshot tập QAC trước khi đụng.
4. Git remote/backup định kỳ /opt/incomex/git/ui-preview.git.
7. Kỷ luật cho các vòng sau
- Mỗi vòng chỉ một nhóm rủi ro, baseline riêng, parity riêng.
- Parity = deep-equal sau parse JSON (không so chuỗi thô).
- Chạy QA headless (ổn định thời gian;
wdcut=0), không dựa trình duyệt phiên agent (nhiễu mạng gây cắt watchdog giả). - Golden do một harness kịch-bản-hoá sinh ra, chạy trên cả baseline lẫn bản mới.
8. Mốc hiện tại
v6-squash-green — modit-entry-enhance.js parity-preserving cleanup PASS, verify độc lập trên UI thật. Nền QA: ~101 xanh · 0 đỏ · 0 fail (mốc v5c) + cú nén modit không phá gì.