KB-3E1D

G1-5A Delta One Slot — READY_FOR_AUDIT

8 min read Revision 1
sua-reg1-5adelta-one-slotready-for-auditqt-blaws-newpa32026-07-07

G1-5A Delta One Slot — READY_FOR_AUDIT

Ngày: 2026-07-07. Nhiệm vụ: G1-5A — render delta test sửa-rẻ cho ĐÚNG 1 slot, CHƯA APPLY. Chỉ đọc PG read-only + tạo change-scope vàng + render SQL delta vàng + copy sang apply path + self-check. 0 ghi PG, 0 append manifest, 0 chạy dot-pg-atomic-apply.

Nguồn baseline: G1-4 (APPLIED, verify 9/9 PASS) — knowledge/dev/laws-new/kestra/sua-re/nhap-ui/g1-4-owner-decision-keep-pending-2026-07-07.md. DB directus, bảng public.sua_re_khai_niem_nhap + public.sua_re_ui_khai_niem_nhap.

1. Verdict

READY_FOR_AUDIT

2. Target

Field Value
target_id 11
slot_key master-list-quy-trinh-v1::config_key:MASTER_CONFIG.items[].steps[].items[].min
old_item_key master-list-quy-trinh-v1::config_key:MASTER_CONFIG.items[].steps[].items[].min::scan_0
new_item_key master-list-quy-trinh-v1::config_key:MASTER_CONFIG.items[].steps[].items[].min::scan_g1_5_demo_001
concept_key field.so_phut (concept_id = 5, giữ nguyên)
old_label Số phút của task
new_label Thời lượng task (phút)
old_purpose Thời lượng ước tính của MỘT task, đơn vị phút.
new_purpose Thời lượng dự kiến của MỘT task, tính bằng phút.
kind edit (old_scan_id scan_0 → new_scan_id scan_g1_5_demo_001)

Target verify: query join concept trả đúng duy nhất 1 dòng cho slot_key này — id=11, is_current=true, match_status='matched' (GENERATED), anchor_quality='strong', dedupe_key='field.so_phut', owner_concept_id=NULL, near_concepts=[], owner_decision/decision_note/decision_by/decision_at đều NULL, ui_file master-list-quy-trinh-v1.html, location master-list-quy-trinh-v1.html · MASTER_CONFIG.items[].steps[].items[].min. Pre-state đầy đủ đã đối chiếu khớp nguyên văn kỳ vọng prompt.

match_status bản mới sẽ TỰ SINH = 'matched' (cột GENERATED, vì concept_id kế thừa NOT NULL) — không ghi tay.

3. Backlog note — phân định 3 giá trị thời gian

Ghi nhận quyết định-treo, CHƯA xử trong G1-5A:

  1. Số phút của từng task.
  2. Tổng phút cộng dồn từ các task trong nhiệm vụ/quy trình.
  3. Tổng thời gian quy trình nhập tay.

Logic đúng:

  • hệ cần cả giá trị số 2 và số 3 cùng tồn tại;
  • không phải chọn một trong hai;
  • đây là quan hệ VÀ, không phải HOẶC.

Mâu thuẫn hiện tại: field.so_phut đang bao cả số phút task và tổng phút. G1-5A không sửa sổ khái niệm cho vấn đề này.

Sau khi G1-5 PASS, tạo bài sửa-sổ-khái-niệm riêng:

  • tạo concept field.tong_phut_congdon;
  • tạo concept field.tong_thoigian_nhaptay;
  • trỏ lại slot tổng phút hiện tại khỏi field.so_phut nếu cần;
  • sửa boundary field.so_phut.

Backlog note chỉ nằm trong change-scope JSONL và báo cáo này — không có trong SQL (đã grep xác nhận 0 lần xuất hiện).

4. Baseline pre-check

# Kiểm tra Kỳ vọng Thực tế Kết quả
1 concept count 13 13 PASS
2 usage total 30 30 PASS
3 current usage rows 30 30 PASS
4 distinct current slot_key 30 30 PASS
5 current match_status group matched 27 / candidate 2 / review 1 27 / 2 / 1 PASS
6 id 24/25/30 owner_decision='keep_pending' 3 3 PASS
7 tổng dòng có owner_decision (ngoài 3 dòng = 0) 3 3 PASS
8 target đúng duy nhất 1 dòng current, mọi field khớp 1 1 PASS

Re-check sau khi render xong (trước khi dừng): baseline y nguyên (13/30/30, 27/2/1, kp=3, target id=11 vẫn is_current/matched/chưa quyết) — PG không bị ghi trong suốt G1-5A.

5. Change-scope

  • path: /opt/incomex/docs/mcp-writes/ui-preview/change-scope/master-list-quy-trinh-v1.g1-5-demo.jsonl
  • sha256: 2088f4c4aec02ecca54693a5e2f8a4843129cb88c5fcf7cd8c28da265b4e835e
  • JSONL count: 1 dòng (1328 bytes), parse JSON hợp lệ
  • self-check: 12/12 PASS — slot_key không đổi; old≠new item_key; new_item_key = slot_key||'::'||new_scan_id; old_label/old_purpose khớp nguyên văn PG; concept_key=field.so_phut; không nhắc 24/25/30; có backlog_note đúng topic phan_dinh_3_gia_tri_thoi_gian + status defer_until_after_g1_5; backlog_note không lọt vào SQL.
  • Thư mục change-scope mới tạo qua SSH, đã chown 10001:10001 + chmod 2775 đúng quy ước cây mcp-writes (như caveat G1-1); file ghi qua kênh MCP write_file.

6. SQL files

  • golden SQL: /opt/incomex/docs/mcp-writes/sua-re/golden/delta-g1-5-demo.golden.sql
  • apply SQL: /opt/incomex/dot/sql/sua-re/delta-g1-5-demo.sql — tạo bằng cp từ golden, không viết riêng
  • sha256 (golden = apply): 2a770815ea011c8bea08bf9bb23e3d6f20e6ad38e0faf88018936c95267298ba (2079 bytes / 71 dòng)
  • diff result: diff -u RỖNG (byte-identical, xác nhận cả sha256sum trên VPS lẫn shasum bản kéo về local)
  • manifest: KHÔNG đụng/opt/incomex/dot/sql/approved-sql-manifest.tsv vẫn 7 dòng (như sau G1-4), grep delta-g1-5-demo = 0 → cổng dot-pg-atomic-apply hiện KHÔNG THỂ chạy file này. Đúng chủ đích G1-5A.

7. SQL self-check

Script tự động 34 check (12 change-scope + 22 SQL): 34/34 PASS.

# Mục Kết quả
1 Đúng 2 statement PASS
2 Statement 1 = UPDATE, đứng trước PASS
3 Statement 2 = INSERT, đứng sau PASS
4 UPDATE chỉ chạm public.sua_re_ui_khai_niem_nhap PASS
5 INSERT chỉ chạm public.sua_re_ui_khai_niem_nhap PASS
6 Không ghi bảng concept (chỉ SELECT subquery lấy id) PASS
7 Không INSERT cột match_status PASS
8 Không ON CONFLICT PASS
9 Không DROP/DELETE/TRUNCATE/ALTER/CREATE PASS
10 Không nhắc id 24/25/30 trong SQL PASS
11 UPDATE WHERE đủ 8 guard (id=11, old item_key, slot_key, raw_label cũ, purpose cũ, is_current=true, match_status='matched', concept_key='field.so_phut') PASS
12 INSERT SELECT từ bản cũ SAU update (is_current=false + old item_key + same slot_key + same concept_id qua subquery concept_key) PASS
13 New item_key = slot_key || '::' || 'scan_g1_5_demo_001' PASS
14 New raw_label = 'Thời lượng task (phút)' — dollar-quote $sr_text$ PASS
15 New purpose = 'Thời lượng dự kiến của MỘT task, tính bằng phút.' — dollar-quote $sr_text$ PASS
16 Bản mới: owner_decision/decision_note/decision_by/decision_at = NULL (đúng 4 NULL) PASS
17 Golden = apply byte-identical PASS
18 SQL không chứa backlog_note PASS
19 Không tạo/sửa concept field.tong_phut_congdon PASS
20 Không tạo/sửa concept field.tong_thoigian_nhaptay PASS
21 Không sửa boundary field.so_phut PASS
+ Không INSERT scan_at/date_created (DEFAULT now()); không txn-control/meta-cmd PASS

Ghim QT-B tuân thủ: UPDATE is_current=false bản cũ TRƯỚC rồi mới INSERT bản mới cùng slot_key — thứ tự bắt buộc do partial unique index ux_sruk_slot_current.

8. Next gate

Chỉ được chạy G1-5B (append manifest + dot-pg-atomic-apply + verify) sau khi Owner nói tường minh GO_APPLY_G1_5_DELTA_ONE_SLOT trong phiên (kỷ luật gate G1-2B/G1-4: không tự suy GO từ chuỗi trong mô tả gate).

G1-5B kỳ vọng: UPDATE 1 + INSERT 1, COMMIT; sau apply: usage total 30→31, current vẫn 30, slot này có 2 bản (scan_0 is_current=false + scan_g1_5_demo_001 is_current=true matched), match_status group current vẫn 27/2/1, không quét lại UI, không đụng 24/25/30.

9. Caveat

Không có blocker kỹ thuật. Ghi chú vận hành: (1) thư mục change-scope tạo mới qua SSH + chỉnh quyền trong vùng mcp-writes như quy ước sẵn — không đụng /opt/incomex/dot ngoài việc cp đúng 1 file SQL vào /opt/incomex/dot/sql/sua-re/ (file nằm ngoài manifest nên bất hoạt với cổng); (2) đối chiếu byte-identity làm cả hai phía (sha256sum trên VPS + shasum bản scp về local) — trùng tuyệt đối.

Back to Knowledge Hub knowledge/dev/laws-new/kestra/sua-re/nhap-ui/g1-5a-delta-one-slot-ready-for-audit-2026-07-07.md