KB-7AFE

UI 4 Mẹ — Review cú nén modit-entry-enhance (mốc v6-squash-green) + Reviewer#3 độc lập

7 min read Revision 1
ui-preview4-memoditsquashcleanupparityreviewer-3role_kindqagitv6-squash-greendoc-only2026-07-02

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.js theo prompt "an toàn có git + parity": gộp 6 IIFE/6 wrap App.preview → 1, bỏ role_kind v1/v2 (sai) chỉ giữ v3, 24321 → 18887 bytes (~‑22%). KHÔNG đụng system-manifest.js/qa-contracts.js (đúng — đọc không trọn qua giới hạn 50KB, để phase có shell).
  • 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.MOLD vs #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.js là 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__2 phân biệt, không mất dữ liệu; __dup_warn=true.
  • Banner đỏ HIỆN THẬT: #ee-dup-banner position: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:fixed nên offsetParent===null — ĐỪNG dùng offsetParent để đo hiển thị phần tử fixed; dùng getBoundingClientRect + 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ẻ):

  1. Ghi KB (chính tài liệu này) — DONE.
  2. favicon.ico 404 + 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-greenmodit-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ì.