KB-6276 rev 2

LỆNH 2C — Khóa SSOT, atomic apply Balo và verify production — 2026-07-16

12 min read Revision 2
codex-reportbaloatomic-applyproduction-verifylenh-2c2026-07-16

LỆNH 2C — Khóa SSOT, atomic apply Balo và verify production

Ngày thực hiện: 2026-07-16
Verdict: PASS
Phạm vi: đúng table | view | function | trigger
Production WRITE: đúng một lần, qua DOT atomic đã duyệt
Ngoài phạm vi: không cron, không mở 12 loại, không sửa UI, không deploy/restart/reload, không GitHub push.

1. Kết luận điều hành

LỆNH 2C đã hoàn tất trên production. Hai table mới trong live pg_catalog đã được cấp Balo bằng cùng DOT reconcile idempotent đã duyệt ở 2B. Tổng Balo tăng từ 2146 lên 2148; riêng table tăng từ 383 lên 385. Sau apply, cả --verify--dry-run đều trả delta bằng 0, không còn ADD/REVIVE/METADATA_UPDATE/MARK_MISSING/CONFLICT.

Đường ghi duy nhất đã dùng:

dot-balo-reconcile --apply
→ dot-pg-atomic-apply
→ /opt/incomex/dot/sql/balo-reconcile.sql
→ docker exec -i postgres psql -U workflow_admin -d directus -v ON_ERROR_STOP=1 -1

Không có psql direct WRITE, Directus/API WRITE, SQL rời, setval, deploy, restart, reload hay cron.

2. Ba câu tuyên ngôn

  1. Vĩnh viễn: DOT reconcile tính động từ live pg_catalog; lần chạy sau vẫn cùng một đường xử lý object mới, object mất và metadata lệch, không hardcode 383/385 hay hai khóa hiện tại.
  2. Nhầm được không: không. Manifest/hash lock, schema/sequence/conflict gate, transaction atomic và post-condition delta=0 chặn write sai trước COMMIT.
  3. Tự động: một lệnh DOT thực hiện preflight → atomic gateway → verifier. Mission này không tạo lịch chạy; cron là quyết định vận hành riêng.

3. Luật và SSOT đã đọc

  • .claude/skills/incomex-rules.md: quy trình 8 bước, 36 điều, hai mũ và yêu cầu evidence thật.
  • Operating Rules SSOT: knowledge/dev/ssot/operating-rules.md, v7.58.
  • VPS Operating Rules v1.0.
  • Hiến pháp INCOMEX v4.6.3.
  • Luật Balo v1.9.
  • Điều 35 v5.2.
  • Kiến trúc PostgreSQL 16 hiện hành.

Assembly Gate: PG production là SSOT dữ liệu; Balo chỉ được ghi qua DOT atomic; Directus và Nuxt chỉ đọc để verify.

4. Hai commit local trên VPS

65a2d732dd31459ce9d9312fce5b36c9ac9627a3
feat(balo): add four-kind reconcile dry-run gate

bddfdcc5a504ff6f4c1bc4fdf075dc8dde209402
chore(dot): preserve approved sua-re manifest entries

Commit thứ hai chỉ có 1 file, 6 insertions vào sql/approved-sql-manifest.tsv; không chứa thay đổi nào khác. Không push GitHub.

5. Gate A — làm sạch SSOT manifest: PASS

Sáu dòng sua-re/* đã tồn tại trước mission Balo, được đối chiếu với evidence 2B trước khi bảo tồn vào commit riêng. Cả sáu file đều tồn tại dưới allowlist /opt/incomex/dot/sql, không phải symlink thoát đường dẫn và SHA256 khớp manifest:

File SHA256 Kết quả
sua-re/create-core.sql 2839def83d054407a922e189eb4887c03a1172340cda98f08726038f8c109d0a PASS
sua-re/import-seed-master-list.sql e17cae62240a8d73a28bcccf79718dbe714d54ebf9209894a94b7199ba730d5c PASS
sua-re/owner-decision-keep-pending-g1-4.sql 59c95e398f1712638858c724f3e2a5c2a47eb7a29f254b129f4e38d3b99cc1a9 PASS
sua-re/delta-g1-5-demo.sql 2a770815ea011c8bea08bf9bb23e3d6f20e6ad38e0faf88018936c95267298ba PASS
sua-re/concept-delta-time-values-g2-1.sql 23ced9a4cc0e6eeffa8c73233d824584aed9a82849bb50d9d1278dcb5e0478c0 PASS
sua-re/concept-delta-time-values-g2-1r2.sql ef74898d16364c88880fde48293d94041e742c646c90cec5b102e0755c389a0f PASS

Trạng thái sau commit:

POST_HEAD=bddfdcc5a504ff6f4c1bc4fdf075dc8dde209402
HEAD_MANIFEST_LINES=11
HEAD_SUA_RE_LINES=6
HEAD_BALO_LINES=1
MANIFEST_WORKTREE=CLEAN
GITHUB_PUSH=NOT_RUN

6. Gate B — khóa mã mission: PASS

DOT_SHA=7e657b96cc27e0f396e2485a67d6296c4de10aabd2f68cf4aaf367cb7b9bdfe5
SQL_SHA=c018f12ce86918c2a6199b70c4626c981deb2632edc686c1544504a3cf387369
MANIFEST_SHA=fb86bee730f76464c385f3da7be65ad81fc5a718f25b84a554404a13dde070fd
BASH_N=PASS
SHELLCHECK=PASS
CODE_DRIFT_AFTER_DRY_RUN=NO

DOT và SQL giữ nguyên đúng bản 2B; thay đổi duy nhất kể từ 2B là commit Gate A bảo tồn sáu dòng manifest.

7. Gate C — atomic gateway thật: PASS

ATOMIC_GATE_REALPATH=/opt/incomex/dot/bin/dot-pg-atomic-apply
ATOMIC_GATE_SHA=cf90611d2c762f26865781f585e61bc4225ab39a6c60255e2f6cc199d180cd62
ALLOW_DIR=/opt/incomex/dot/sql
MANIFEST=/opt/incomex/dot/sql/approved-sql-manifest.tsv
PG_CONTAINER=postgres
PG_DB=directus
PG_ROLE=workflow_admin
TARGET=postgres|postgres:16|Up 3 months (healthy)
SQL_REALPATH=/opt/incomex/dot/sql/balo-reconcile.sql
MANIFEST_LOCK_SHA=c018f12ce86918c2a6199b70c4626c981deb2632edc686c1544504a3cf387369
current_database=directus
current_user=workflow_admin
current_schema=public
ATOMIC_GATEWAY_TARGET=PROVEN

Gateway không lệch đường dẫn/version; manifest nhận đúng SQL đã hash-lock.

8. Dry-run và backup ngay trước WRITE

Dry-run và verify cùng tính lại từ live catalog:

table|385|383|2|0|0|0|0
view|699|699|0|0|0|0|0
function|654|654|0|0|0|0|0
trigger|410|410|0|0|0|0|0
TOTAL|2148|2146|2|0|0|0|0
BALO_RESULT|add=2|revive=0|metadata_update=0|mark_missing=0|conflict=0|sequence_safe=t
VERIFY|READY_TO_APPLY|delta=2|write=0

Hai khóa ADD được phát hiện động:

table:public.sua_re_khai_niem_nhap
table:public.sua_re_ui_khai_niem_nhap

Sequence trước WRITE:

max_stt=2146
last_value=2146
is_called=true
increment_by=1
predicted_next_value=2147
sequence_safe=true

Backup evidence lúc 2026-07-16T12:06:09+02:00:

total=2146|table=383|view=699|function=654|trigger=410|max_stt=2146
existing_rows=2146
full_existing_fingerprint=7ab8e6ffc18705ce6a35da1bb89d4df4
keep_date_updated_fingerprint=a137c1b1dd6c9bc621af8b0e90a0bfbf

9. Atomic apply — PASS, chạy đúng một lần

Thời gian: 2026-07-16T12:06:30+02:00 đến 12:06:34+02:00.

Preflight ngay trong lệnh apply:

APPLY_PREFLIGHT|READY_TO_APPLY|delta=2|write=0
file path:      /opt/incomex/dot/sql/balo-reconcile.sql
sha256:         c018f12ce86918c2a6199b70c4626c981deb2632edc686c1544504a3cf387369
manifest match: PASS
guardrail:      PASS
execution:      docker exec -i postgres psql -U workflow_admin -d directus -v ON_ERROR_STOP=1 -1
exit code:      0
✅ COMMIT thành công
APPLY_EXIT=0

Post-condition trong cùng luồng:

TOTAL|2148|2148|0|0|0|0|0
BALO_RESULT|add=0|revive=0|metadata_update=0|mark_missing=0|conflict=0|sequence_safe=t
VERIFY|PASS_RECONCILED|delta=0|write=0

Không chạy --apply lần hai.

10. Verify PG và idempotency sau apply: PASS

Hai lệnh không ghi sau apply đều sạch:

dot-balo-reconcile --verify
VERIFY|PASS_RECONCILED|delta=0|write=0

dot-balo-reconcile --dry-run
DRY_RUN|PASS|delta=0|write=0

Counts production:

Chỉ số Trước Sau
Tổng Balo 2146 2148
table 383 385
view 699 699
function 654 654
trigger 410 410
max(stt) 2146 2148

Sequence sau apply:

last_value=2148
is_called=true
increment_by=1
predicted_next_value=2149
sequence_safe=true

Hai dòng mới:

stt khoa_nhan_dien ten noi_luu loai_census da_mat
2147 table:public.sua_re_khai_niem_nhap sua_re_khai_niem_nhap public table false
2148 table:public.sua_re_ui_khai_niem_nhap sua_re_ui_khai_niem_nhap public table false

stt do sequence cấp; loai_census do PG generated; da_mat và thời gian dùng default. ten/noi_luu khớp catalog và cả hai object còn live.

Các trường phải-gật nhom, loai, chuyen_mon, lop, ghi_chu, active đều NULL. kiem_soat=false, đúng default live; reconcile không diễn giải thành nhãn phân loại.

Chứng minh không sửa dòng KEEP:

existing_rows=2146
full_existing_fingerprint_before=7ab8e6ffc18705ce6a35da1bb89d4df4
full_existing_fingerprint_after =7ab8e6ffc18705ce6a35da1bb89d4df4
keep_date_updated_before=a137c1b1dd6c9bc621af8b0e90a0bfbf
keep_date_updated_after =a137c1b1dd6c9bc621af8b0e90a0bfbf

Không chỉ date_updated, toàn bộ dữ liệu của 2146 dòng cũ giữ nguyên dấu vân tay.

11. Verify Directus và Reports production: PASS

Directus đọc thật:

{"total":2148,"table":385}

Hai dòng mới đọc được qua collection balo_thuc_the, với đúng stt, khóa, tên, nơi lưu, loai_census=table, da_mat=false, các trường phải-gật NULL và kiem_soat=false.

UI production được kiểm bằng thao tác bấm thật trong Google Chrome:

Trang Hành động/Kết quả
/reports/report-pg Bấm Làm mới; timestamp đổi từ 2026-07-16T10:10:15.334Z sang 2026-07-16T10:10:36.206Z; table 385, view 699, function 654, trigger 410
/reports Bấm Làm mới; table 385, view 699, function 654, trigger 410
/reports/report-balo-table Bấm Làm mới; hiển thị 385 bản ghi

API live trả HTTP 200, Cache-Control: no-store, max-age=0, generated_at=2026-07-16T10:13:22.557Z và các số 385/699/654/410.

Runner Playwright trên VPS không mở được Chromium vì thiếu binary chromium_headless_shell; ba test dừng ở bước launch, chưa hề mở trang. Đây là caveat của máy chạy test, không phải lỗi Reports. Để bảo đảm kiểm đúng yêu cầu, production đã được bấm trực tiếp bằng Chrome thật như bảng trên, đồng thời đối chiếu PG, Directus và API live.

12. Chứng minh không vượt phạm vi

PSQL_DIRECT_WRITE=NOT_RUN
DIRECTUS_OR_API_WRITE=NOT_RUN
SETVAL=NOT_RUN
SECOND_APPLY=NOT_RUN
NUXT_DEPLOY=NOT_RUN
SERVICE_RESTART_RELOAD=NOT_RUN
CRON=NOT_CREATED
TWELVE_KINDS=NOT_OPENED
GITHUB_PUSH=NOT_RUN

Start time container không đổi trong mission:

postgres        2026-04-17T05:35:18Z
incomex-directus 2026-05-08T09:13:06Z
incomex-nuxt     2026-07-11T02:50:33Z
incomex-nginx    2026-06-30T00:44:14Z

13. Evidence

Evidence local và bản tương ứng trên VPS:

knowledge/current-state/reports/evidence/balo-reconcile-2c-20260716/
/opt/incomex/evidence/balo-reconcile-2c-20260716/

Các file chính:

  • gate-a-manifest-commit.log
  • gate-b-code-lock.log
  • gate-c-atomic-target.log
  • preapply-dry-run.log
  • preapply-verify.log
  • preapply-backup.log
  • atomic-apply.log
  • postapply-verify.log
  • postapply-dry-run.log
  • postapply-pg-verify.log
  • directus-verify.log
  • ui-production-verify.log
  • http-runtime-final.log
  • reports-refresh-playwright.log

14. Trạng thái cuối và hai mũ

DOT_HEAD=bddfdcc5a504ff6f4c1bc4fdf075dc8dde209402
MANIFEST_WORKTREE=CLEAN
MISSION_FILES_STATUS=CLEAN
PRODUCTION_VERIFY=PASS
  • Mũ xây dựng: cơ chế 2B giữ nguyên, manifest được khóa đúng, apply atomic thành công.
  • Mũ giám sát: delta sau apply bằng 0; PG, sequence, Directus, API và ba nút Làm mới đều được kiểm bằng nội dung thật.
  • OR v7.58: không cần cập nhật — mission áp dụng đúng luật hiện có, không phát hiện nguyên tắc vận hành mới.
  • Technical Debt: không tạo mục nợ sản phẩm mới. Việc VPS thiếu Chromium là caveat hạ tầng test; không làm thiếu bằng chứng production vì đã kiểm bằng Chrome thật.
  • Handoff: STOP. Không còn việc nào trong LỆNH 2C. Cron, mở 12 loại và report “Balo gần đây” vẫn ngoài phạm vi, chỉ làm khi Owner ra lệnh riêng.

15. Trạng thái KB

Báo cáo đã được đưa lên KB đúng path:

knowledge/current-state/reports/codex-lenh-2c-balo-atomic-apply-production-2026-07-16.md

Chuỗi kiểm sau upload revision 1:

LIST=PASS
document_id=knowledge/current-state/reports/codex-lenh-2c-balo-atomic-apply-production-2026-07-16.md
revision=1

FULL_READ=PASS
truncated=false
content_length=11267
verdict=PASS

SEMANTIC_SEARCH=PASS
query="LỆNH 2C atomic apply Balo production 2148 table 385 bddfdcc PASS_RECONCILED"
top_result=chính báo cáo LỆNH 2C
score=0.94390684

Sau khi bổ sung chính bằng chứng này, tài liệu được cập nhật revision 2 và kiểm lại lần cuối trước bàn giao.