G2-1B′ R2 Time Concept Ledger Delta — APPLIED
G2-1B′ R2 Time Concept Ledger Delta — APPLIED
Ngày: 2026-07-07. Nhiệm vụ: G2-1B′ — apply golden SQL r2 (G2-1A′) qua dot-pg-atomic-apply, kèm bổ sung bắt buộc A–F.
1. Verdict
APPLIED
Apply COMMIT thành công qua gateway, affected-count đúng nguyên văn 4 dòng kỳ vọng, verify read-only sau apply PASS toàn bộ (kể cả bổ sung C/D).
2. Gate
- GO_APPLY_G2_1B_R2_TIME_CONCEPT_DELTA received — yes. Owner phát nguyên văn ở lượt riêng; lượt nhận task card (chuỗi gate chỉ trong mô tả) đã HOLD 0 hành động trước đó — đúng kỷ luật G1-2B/G2-1A/G2-1A′.
- 4 Owner decisions confirmed cùng GO: ① tạo field.tong_phut_congdon; ② sửa ranh_gioi field.so_phut; ③ remap id=13 SR-SUA; ④ defer field.tong_thoigian_nhaptay.
- Input reports đã đọc: G2-1A′ r2 (verdict READY_FOR_AUDIT ✔), G2-1B HOLD cũ, G2-1A gốc, G1 final proof (SEALED).
- Bổ sung A–F nhận đủ và thực thi cùng prompt.
3. Files
- change-scope:
/opt/incomex/docs/mcp-writes/sua-re/change-scope/g2-1-time-concept-delta.jsonl— sha256b7133a7d82296be3cd311a36b6f31dc14f0c9432081ae2086d63c14a378cb39f✔ khớp, không sửa. - golden r2:
/opt/incomex/docs/mcp-writes/sua-re/golden/concept-delta-time-values-g2-1r2.golden.sql— sha256ef74898d16364c88880fde48293d94041e742c646c90cec5b102e0755c389a0f✔ khớp, không sửa. - apply r2:
/opt/incomex/dot/sql/sua-re/concept-delta-time-values-g2-1r2.sql— copy từ golden, sha256ef74898d…✔ khớp. diff -ugolden r2 / apply r2: rỗng ✔.- Old inert: apply file cũ
concept-delta-time-values-g2-1.sql(sha23ced9a4…) + old golden không đụng, không xóa ✔. Không dùng sha cũ, không dùng relpath cũ ✔.
4. DOT / atomicity / guardrail
- Script:
/opt/incomex/dot/bin/dot-pg-atomic-apply(sha256cf90611d2c762f26865781f585e61bc4225ab39a6c60255e2f6cc199d180cd62— ghi lần đầu để đối chiếu sau). - Single transaction: PASS — dòng thực thi
docker exec -i postgres psql -U workflow_admin -d directus -v ON_ERROR_STOP=1 -1 -f - < file(-1bọc toàn file 1 transaction) — đọc lại nguyên văn trước apply. - Guardrail inventory re-check: script CHƯA ĐỔI so với inventory G2-1A′ — 17 regex trích máy từ script live == 17 regex bản replicate G2-1A′ (diff rỗng, so sánh programmatic); thứ tự 4 lock nguyên (path allowlist → manifest → sha256 → static guardrail).
- R2 clean: PASS — fetch lại r2 từ VPS (sha khớp
ef74898d…), scan bằng bản replicate 17 pattern → CLEAN toàn bộ, không false-positive trong comment/header. Lock (4) của gateway lúc apply thật inguardrail: PASS— xác nhận cuối bằng chính script.
5. Manifest
- Relpath r2:
sua-re/concept-delta-time-values-g2-1r2.sql - Action: appended đúng 1 dòng TAB-separated (
ef74898d…<TAB>relpath r2) — relpath r2 chưa tồn tại trước đó. - Manifest line count: 9 → 10. Xác nhận TAB bằng cat -A.
- Old inert line 9 (
23ced9a4…<TAB>sua-re/concept-delta-time-values-g2-1.sql) giữ nguyên ✔.
6. Last-chance check (ngay trước apply)
7/7 PASS (gồm bổ sung B):
- field.so_phut id=5, status active, old ranh_gioi nguyên văn = 1 row ✔
- usage id=13 is_current=true + joined concept_key=field.so_phut = 1 ✔
- new item_key = 0 rows ✔
- field.tong_phut_congdon = 0 rows ✔
- slot vi phạm 1-current = 0 ✔
- apply file sha =
ef74898d…✔ - manifest r2 đúng 1 dòng sha+relpath ✔
7. Apply result
- Command:
/opt/incomex/dot/bin/dot-pg-atomic-apply /opt/incomex/dot/sql/sua-re/concept-delta-time-values-g2-1r2.sql - manifest match: PASS; guardrail: PASS (khác hẳn G2-1B cũ — file r2 qua lock 4).
- Transaction: COMMIT thành công, exit 0.
- Affected-count đúng nguyên văn, đúng thứ tự:
INSERT 0 1(concept field.tong_phut_congdon)UPDATE 1(ranh_gioi field.so_phut)UPDATE 1(usage id=13 → is_current=false)INSERT 0 1(usage mới current)
- Không mismatch → không kích hoạt mục 8; không SQL nào khác được chạy.
8. Verify read-only
8.1 Counts — PASS
concept = 14; usage total = 32; current = 30; current distinct slot_key = 30; total distinct slot_key = 30; mỗi slot đúng 1 current (0 vi phạm); current match_status matched 27 / candidate 2 / review 1 (không đổi — dòng mới matched thay đúng chỗ dòng 13 hạ history).
8.2 Concept mới — PASS
field.tong_phut_congdon đúng 1 row, id=14: ten Tổng phút cộng dồn; concept_kind field; mo_ta + ranh_gioi khớp nguyên văn golden (boolean check true); aliases khớp jsonb đúng 5 mục; match_policy auto (default); status active. 7/7 boolean check true.
8.3 Concept field.so_phut — PASS (bổ sung D)
Đúng 1 row: id vẫn = 5 ✔; concept_key field.so_phut ✔; ten Số phút thực hiện không đổi ✔; mo_ta không đổi (Thời lượng ước tính của MỘT task, đơn vị phút.) ✔; status active ✔; ranh_gioi đã đổi đúng text mới: Thời lượng của MỘT task riêng lẻ, đơn vị phút. Không dùng cho tổng phút cộng dồn từ nhiều task, và không dùng cho tổng thời gian quy trình nhập tay. ✔
8.4 Usage id=13 history — PASS
is_current = false; item_key …::scan_0, slot_key …code_marker:qv-tot, raw_label/purpose/location/location_anchor giữ nguyên; joined concept_key cũ = field.so_phut; match_status matched.
8.5 Usage mới current — PASS (bổ sung C)
Tìm bằng item_key master-list-quy-trinh-v1::code_marker:qv-tot::scan_g2_1_time_concept_001 → đúng 1 row, id=32 (PG tự sinh): is_current=true; scan_id scan_g2_1_time_concept_001; slot_key giữ nguyên; raw_label Tổng phút (dòng tổng); purpose Tổng thời lượng cả quy trình — giá trị TÍNH từ các task.; location master-list.js · qv-tot; location_anchor code_marker:qv-tot; anchor_quality strong; dedupe_key field.tong_phut_congdon; concept_id = 14 = id concept mới (boolean check true); joined concept_key = field.tong_phut_congdon; match_status = matched do PG GENERATED (SQL không ghi cột này); owner_concept_id IS NULL ✔; near_concepts = '[]'::jsonb ✔; owner_decision/decision_note/decision_by/decision_at đều NULL ✔ (6/6 boolean check true).
8.6 Không đụng ngoài phạm vi — PASS
id=31 vẫn current joined field.so_phut ✔; id=12 vẫn current joined field.so_phut ✔; id 24/25/30 vẫn keep_pending nguyên ✔; field.tong_thoigian_nhaptay = 0 rows ✔; pg_class sua_re%: vẫn đúng 2 bảng + 2 sequence + 0 view + 0 trigger + 10 index (nguyên như G1) ✔; không có cột date_updated/backlog_note ✔; không UI/source/shadow file nào bị sửa (phiên chỉ cp golden→apply + append manifest + chạy gateway) ✔.
Hardcoded id guard (bổ sung E)
- Golden r2 statement (2) dùng hardcoded
WHERE id = 5(kèm guard concept_key/status/mo_ta/ranh_gioi nguyên văn). - Pre-check xác nhận
field.so_phutid=5 (boolean id_is_5=true) trước copy/apply. - Last-chance check xác nhận lại id=5 + old ranh_gioi ngay trước apply (1 row khớp đủ điều kiện).
- Sau apply xác nhận
field.so_phutvẫn id=5 và ranh_gioi đã cập nhật đúng text mới. - Không xảy ra HOLD_FIELD_SO_PHUT_ID_MISMATCH.
New usage decision fields (bổ sung E)
Dòng usage mới id=32: owner_concept_id NULL; near_concepts []; 4 decision fields (owner_decision/decision_note/decision_by/decision_at) đều NULL — kiểm bằng boolean check trong SELECT, 6/6 true. Không kích hoạt VERIFY_FAIL_NEW_USAGE_DECISION_FIELDS.
9. Sửa-rẻ proof — concept level
- Thêm 1 concept mới (field.tong_phut_congdon, id=14) —
INSERT 0 1. - Sửa ranh giới 1 concept cũ (field.so_phut) —
UPDATE 1, không đụng ten/mo_ta/status. - Remap 1 usage bằng lịch sử (SR-SUA): id=13 thành history, id=32 thành current cùng slot_key —
UPDATE 1+INSERT 0 1. - Current rows vẫn 30; mỗi slot đúng 1 current (DB-enforced
ux_sruk_slot_current). - Không scan/re-scan; không UI patch; không tạo concept type-3 rỗng; không match lại 30 dòng; 29 slot khác không đổi current row.
- Chi phí sửa 1 drift khái niệm = 1 change-scope (cũ, giữ nguyên) + 1 golden SQL 4 câu lệnh + 1 dòng manifest. Sửa-rẻ concept-level chứng minh end-to-end.
10. Baseline impact
APPLIED → G1 sealed baseline (concept 13 / usage 31) đã LỖI THỜI THEO THIẾT KẾ (đúng ghi chú g1-final-proof mục 8). Cần chạy G2-SEAL để tạo sealed baseline mới: concept 14, usage 32, current 30. G2-SEAL KHÔNG chạy trong bước này (ranh giới cấm) — chờ gate riêng.
11. Next gate
Đề xuất Owner mở G2-SEAL (seal baseline mới + readonly checklist mới thay bản G1). Backlog còn lại của G2: field.tong_thoigian_nhaptay (defer, chưa có usage — bài riêng khi cần).
12. Caveat
- Guardrail-clean pre-check dùng bản replicate 17 pattern (script không có dry-run mode); xác nhận cuối là lock (4) của chính gateway lúc apply thật — đã PASS in log. Không còn khoảng hở.
- Script gateway sha
cf90611d…ghi lần đầu tại đây — card sau có thể so sha thay vì diff pattern thủ công. - Dòng manifest 9 (relpath cũ, sha cũ) + apply file cũ vẫn nằm trên đĩa làm audit trail; file cũ nếu chạy lại gateway vẫn bị guardrail chặn — inert, vô hại. Chưa dọn theo quyết định Owner trước đó.
- match_status của dòng mới do PG GENERATED sinh ra 'matched' vì concept_id NOT NULL — đúng thiết kế, không phải SQL ghi.