G2-1A′ Guardrail-Safe R2 — READY_FOR_AUDIT
G2-1A′ Guardrail-Safe R2 — READY_FOR_AUDIT
Ngày: 2026-07-07. Nhiệm vụ: G2-1A′ — re-render golden SQL r2 sạch guardrail cho G2-1, CHỈ sửa comment/header, không đổi logic 4 statement. 0 ghi PG, 0 copy vào /opt/incomex/dot/sql, 0 append manifest, 0 apply, 0 sửa file cũ.
Gate: GO_RENDER_G2_1A_R2_GUARDRAIL_SAFE_SQL received — yes. Lượt nhận task card (chuỗi gate chỉ nằm trong mô tả) đã HOLD 0 hành động; Owner phát nguyên văn ở lượt kế tiếp — đúng kỷ luật G1-2B/G2-1A.
1. Verdict
READY_FOR_AUDIT
2. Root cause from prior HOLD
- G2-1B HOLD vì file golden cũ bị static guardrail của dot-pg-atomic-apply TỪ CHỐI: pattern
(?i)\bTRUNCATE\bkhớp từ "TRUNCATE" nằm trong comment tự-kiểm dòng 25 (danh sách từ khóa cấm mà chính header liệt kê để audit). - 0 PG write; psql chưa từng chạy; transaction chưa từng mở — file bị chặn ở lock (4) trước execution.
- Sequence không nhảy: pre-check hôm nay xác nhận max(concept id)=13, max(usage id)=31 — không có INSERT nào từng chạm psql ở G2-1B.
- G1 sealed baseline (g1-final-proof SEALED, baseline JSON sha
4a410cf6…) vẫn còn hiệu lực.
3. DB pre-state check
SELECT read-only (MCP query_pg, READ ONLY transaction) trước render — PASS toàn bộ, re-check sau render không đổi:
- concept count = 13 ✓; max concept id = 13 ✓
- usage total = 31 ✓; max usage id = 31 ✓ — max(id) không nhúc nhích là bằng chứng không có INSERT nào từng chạm psql ở G2-1B HOLD cũ
- current rows = 30 ✓; current distinct slot_key = 30 ✓; total distinct slot_key = 30 ✓
- current match_status: matched 27 / candidate 2 / review 1 ✓; 0 slot vi phạm 1-current ✓
- id 11 is_current=false ✓; id 31 is_current=true concept field.so_phut ✓; id 13 is_current=true concept field.so_phut, matched, owner_decision NULL, dedupe_key field.so_phut ✓
- id 24/25/30 vẫn keep_pending ✓
field.tong_phut_congdon= 0 rows ✓;field.tong_thoigian_nhaptay= 0 rows ✓- field.so_phut (id=5): mo_ta + ranh_gioi khớp nguyên văn bản cũ (boolean equality check trong SQL = true cả hai) ✓
- item_key mới
master-list-quy-trinh-v1::code_marker:qv-tot::scan_g2_1_time_concept_001= 0 rows ✓; scan_id mới = 0 rows ✓
4. Guardrail pattern inventory
- Script path:
/opt/incomex/dot/bin/dot-pg-atomic-apply— đọc nguyên văn qua SSH (MCP read_file DENY vì path ngoài allowlist đọc; SSH host contabo là kênh đọc script duy nhất). - Single transaction: CÓ —
docker exec -i postgres psql -U workflow_admin -d directus -v ON_ERROR_STOP=1 -1 -f - < file(-1bọc toàn file trong MỘT transaction). - Thứ tự lock: (3.1) đúng 1 tham số → (3.2) path allowlist
/opt/incomex/dot/sql/+ realpath + cấm symlink + đuôi .sql → (3.3) manifest membership + đúng 1 dòng + sha256 exact → (3.4) static guardrail → preflight docker → (3.5) execution. - Static guardrail quét TOÀN BỘ nội dung file, KỂ CẢ comment cho nhóm (a)/(c)/(d)/(e) — by design, có design note trong script. Nhóm (b) quét trên bản đã strip dollar-quote (
s/\$([A-Za-z0-9_]*)\$.*?\$\1\$//gs), chỉ match ở statement-position(^|;)[ \t\r\n]*. - 17 pattern (perl
-0777, LC_ALL=C):- (a) destructive, full content:
(?is)\bDROP\s+(TABLE|VIEW|…|EVENT)\b(26 object keyword);(?is)\bDELETE\s+FROM\b;(?i)\bTRUNCATE\b(naive word match — pattern đã chặn file cũ). - (b) transaction control, statement-position trên bản strip dollar-quote: BEGIN; COMMIT; ROLLBACK; SAVEPOINT; RELEASE; START TRANSACTION.
- (c) meta-command:
(?m)^[ \t]*\\(dòng bắt đầu bằng backslash), full content. - (d)
\\!shell escape;(?i)\\copy;(?is)\bCOPY\b[^;]*\bPROGRAM\b;(?is)\bALTER\s+SYSTEM\b;(?is)\bCREATE\s+EXTENSION\b;(?is)\bCREATE\s+EVENT\s+TRIGGER\b— full content. - (e) tên cấm, substring case-insensitive:
meta_catalog|schema_birth_registry|birth_registry|table_registry|qt001_|v_registry_— full content.
- (a) destructive, full content:
- Script không có dry-run/static-check-only mode — guardrail PASS thì chạy psql luôn. Vì vậy KHÔNG chạy script với file r2 (sẽ là apply attempt = vượt ranh giới); thay bằng replication cục bộ (mục 6).
5. Old vs R2 files
- Old golden:
/opt/incomex/docs/mcp-writes/sua-re/golden/concept-delta-time-values-g2-1.golden.sql— sha25623ced9a4cc0e6eeffa8c73233d824584aed9a82849bb50d9d1278dcb5e0478c0(6440 B) — không sửa, không xóa, sha xác nhận lại sau render. - R2 golden (MỚI):
/opt/incomex/docs/mcp-writes/sua-re/golden/concept-delta-time-values-g2-1r2.golden.sql— sha256ef74898d16364c88880fde48293d94041e742c646c90cec5b102e0755c389a0f(7376 B) — xác nhận 2 phía (local shasum + VPS sha256sum, byte-identical). - Change summary: thay nguyên khối header (dòng 1–28 cũ), giữ byte-identical từ dòng 29 đến hết file (toàn bộ 4 statement + comment body + footer kỳ vọng). Header mới: mô tả ràng buộc tự-kiểm bằng lời, chủ ý không nhắc tên bất kỳ từ khóa nào thuộc diện guardrail chặn; bỏ luôn các từ transaction-control và từ "copy" khỏi comment (dù dạng cũ của chúng không match statement-position — né triệt để theo đề); ghi rõ gate r2, sha nguồn, lý do re-render.
- Change-scope cũ giữ nguyên:
/opt/incomex/docs/mcp-writes/sua-re/change-scope/g2-1-time-concept-delta.jsonlshab7133a7d82296be3cd311a36b6f31dc14f0c9432081ae2086d63c14a378cb39f— không sửa (delta quyết định không đổi; chỉ sha golden đổi, sẽ ghim trong card G2-1B′).
6. Guardrail-clean result
- Scan method: replicate nguyên văn 17 pattern từ script thật (copy verbatim regex + pmatch perl -0777 + LC_ALL=C + logic strip dollar-quote cho nhóm (b)) thành script kiểm cục bộ; chạy trên bản local đã xác nhận byte-identical với VPS qua sha256 hai phía.
- Đối chứng độ trung thực của bản replicate: quét file CŨ ra đúng 1 violation duy nhất
TRUNCATE (destructive)— trùng khớp y kết quả gateway thật đã báo ở G2-1B ("vi phạm pattern: TRUNCATE (destructive)"). 16 pattern còn lại sạch trên file cũ, cũng khớp phân tích G2-1B. - Kết quả r2: CLEAN 17/17 pattern — kể cả comment/header/string; không meta-command; không transaction control ở statement-position (kể cả sau strip dollar-quote); không tên cấm; không còn false-positive.
- Dry-run bằng script thật: không dùng — script không có mode static-check riêng, chạy nó là apply attempt. Không apply.
- Remaining risk: chỉ còn rủi ro script guardrail bị sửa giữa G2-1A′ và G2-1B′ (xem Caveat).
7. Executable SQL equivalence
- Cách A (ưu tiên): strip comment an toàn — tiền kiểm chứng minh
--CHỈ xuất hiện đầu dòng ở cả 2 file (không inline comment, không có--trong dollar-quoted string, các literal đều 1 dòng dùng em-dash "—" chứ không phải "--") → loại dòng^[ \t]*--+ dòng trống không thể hỏng literal. - Kết quả: executable body 2 file byte-identical — diff rỗng; 51 dòng mỗi bên; normalized executable sha256 giống hệt nhau:
25ace91d7015bf26d3dd92def57904e995db74925eef3b46d0e5c4cb8c69be58. - 4 write action giữ nguyên: (1) INSERT concept
field.tong_phut_congdon→ (2) UPDATE ranh_gioifield.so_phut→ (3) UPDATE usage id=13 is_current=false → (4) INSERT usage mới current cùng slot_key. Kỳ vọng output không đổi:INSERT 0 1 / UPDATE 1 / UPDATE 1 / INSERT 0 1. - Vì body byte-identical nên hiển nhiên không đổi: ten/mo_ta/ranh_gioi/aliases/status của concept mới; ranh_gioi mới + WHERE guard của field.so_phut; WHERE guard 10 điều kiện của id=13; scan_id
scan_g2_1_time_concept_001; item_key mới; slot_key; raw_label/purpose/location/location_anchor giữ nguyên; dedupe_key mớifield.tong_phut_congdon; concept_id subquery; không ghi match_status; không đụng 24/25/30; không tạofield.tong_thoigian_nhaptay; không transaction control. - Khác biệt còn lại giữa 2 file: chỉ comment/header (7376 B vs 6440 B toàn do khối comment).
- Result: PASS.
8. Apply plan for G2-1B′
G2-1B′ phải dùng:
- golden r2:
/opt/incomex/docs/mcp-writes/sua-re/golden/concept-delta-time-values-g2-1r2.golden.sql - apply path:
/opt/incomex/dot/sql/sua-re/concept-delta-time-values-g2-1r2.sql - manifest relpath:
sua-re/concept-delta-time-values-g2-1r2.sql
Bắt buộc:
- Ghim sha256 MỚI của r2:
ef74898d16364c88880fde48293d94041e742c646c90cec5b102e0755c389a0f - KHÔNG dùng sha cũ
23ced9a4cc0e6eeffa8c73233d824584aed9a82849bb50d9d1278dcb5e0478c0 - KHÔNG dùng relpath cũ
sua-re/concept-delta-time-values-g2-1.sql - Verify sau apply đối chiếu 4 dòng affected-count với kỳ vọng; sau khi APPLY thành công phải tạo sealed baseline mới thay G1 (concept 13→14, usage 31→32).
9. Inert leftovers
- Old apply file
/opt/incomex/dot/sql/sua-re/concept-delta-time-values-g2-1.sql(sha23ced9a4…) + dòng manifest thứ 9 (relpath cũ, sha cũ) giữ nguyên làm audit trail — xác nhận sau render: manifest vẫn 9 dòng, dòng 9 nguyên văn; ls apply dir vẫn đúng 5 file (4 G1 + 1 g2-1 cũ), không có file r2; grep relpath r2 trong manifest = 0 dòng. - Không dọn gì trong G2-1A′ (đúng ranh giới).
- File cũ nếu chạy lại qua gateway vẫn bị guardrail chặn đúng như G2-1B — vô hại.
10. Caveat
- Guardrail-clean của r2 được chứng minh bằng bản replicate nguyên văn 17 pattern chạy trên nội dung byte-identical (sha256 xác nhận 2 phía), KHÔNG phải bằng chính gateway (gateway không có dry-run mode; chạy nó = apply attempt, bị cấm trong card này). Bản replicate đã đối chứng trung thực bằng việc tái tạo đúng 1 violation TRUNCATE trên file cũ. Lock (4) của gateway ở G2-1B′ sẽ là lần xác nhận cuối bằng chính script thật.
- Nếu script
dot-pg-atomic-applybị sửa trước G2-1B′, pattern inventory mục 4 phải đọc lại từ script thật — không dùng lại inventory này như trí nhớ. - R2 chưa có trong manifest và chưa có ở apply path — G2-1B′ phải tự copy + append manifest sau Owner GO riêng; sha ghim ở mục 8.
11. Next gate
READY_FOR_AUDIT — chờ Owner mở G2-1B′ apply bằng gate riêng (copy r2 sang apply path + append manifest relpath r2 + sha ef74898d… + chạy dot-pg-atomic-apply + verify + sealed baseline mới). Agent sau không được tự suy GO.