LỆNH 2C — Khóa SSOT, atomic apply Balo và verify production — 2026-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: đúngtable | 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 và --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
- 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. - 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.
- 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.loggate-b-code-lock.loggate-c-atomic-target.logpreapply-dry-run.logpreapply-verify.logpreapply-backup.logatomic-apply.logpostapply-verify.logpostapply-dry-run.logpostapply-pg-verify.logdirectus-verify.logui-production-verify.loghttp-runtime-final.logreports-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.