G1-5A Delta One Slot — READY_FOR_AUDIT
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:
- Số phút của từng task.
- Tổng phút cộng dồn từ các task trong nhiệm vụ/quy trình.
- 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_phutnế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+ statusdefer_until_after_g1_5; backlog_note không lọt vào SQL. - Thư mục
change-scopemới tạo qua SSH, đã chown10001:10001+ chmod2775đú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ằngcptừ golden, không viết riêng - sha256 (golden = apply):
2a770815ea011c8bea08bf9bb23e3d6f20e6ad38e0faf88018936c95267298ba(2079 bytes / 71 dòng) - diff result:
diff -uRỖ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.tsvvẫn 7 dòng (như sau G1-4), grepdelta-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.