LỆNH 3D.3 — HOLD PRE_ROUTE_DRIFT trước exact Nginx route
LỆNH 3D.3 — Exact Nginx route cho endpoint Balo
Ngày thực hiện: 2026-07-17
Verdict: HOLD — PRE_ROUTE_DRIFT
Trạng thái an toàn: không sửa Nginx, không reload, production/Balo/bridge nguyên vẹn
0. Kết luận điều hành
Mission dừng tại Gate 0 đúng quy định của Owner. Hai container Lệnh 3D.2 yêu cầu phải còn ở trạng thái stopped hiện đều không còn tồn tại:
incomex-nuxt-balo-canary
→ error: no such object
incomex-nuxt-failed-20260716T234206Z
→ error: no such object
Candidate output vẫn còn:
/opt/incomex/deploys/nuxt-output-balo-20260716T234206Z
Lệnh 3D.3 §3 quy định phải xác nhận candidate/canary vẫn stopped và nếu có drift thì HOLD: PRE_ROUTE_DRIFT. Vì container đã bị xóa sau báo cáo 3D.2, Codex không được tự diễn giải “absent” thành “stopped” và không tiếp tục patch Nginx.
1. Ba câu tuyên ngôn
- Vĩnh viễn: exact route vẫn là hướng sửa gốc đúng, nhưng chỉ được cài trên baseline đã được Owner khóa lại; không vá tiếp trên runtime có provenance thay đổi.
- Nhầm được không: Gate 0 so tên/trạng thái container thật; sự khác biệt stopped → absent tự chặn mutation trước khi Nginx bị sửa.
- Tự động: backup, SHA, runtime, Balo và container-state gates chạy trước patch; gate fail dẫn tới HOLD không reload.
2. Tài liệu đã đọc
.claude/skills/incomex-rules.md— 36 mục, 8 bước.knowledge/dev/ssot/operating-rules.md— v7.58 rev51.knowledge/dev/laws/constitution.md— v4.6.3 rev44.knowledge/dev/ssot/vps/vps-architecture.md— v2.0 rev4.knowledge/dev/ssot/vps/vps-operating-rules.md— v1.0 rev2.knowledge/current-state/reports/codex-lenh-3d2-balo-button-production-2026-07-17.md— rev1.
Không cập nhật OR: đây là drift runtime cụ thể đã được gate hiện hành phát hiện đúng, chưa phát sinh nguyên tắc mới.
3. Nginx SSOT và precedence đã xác định read-only
Mount thật của container:
/opt/incomex/docker/nginx/conf.d
→ /etc/nginx/conf.d
→ bind read-only trong container
nginx -T xác nhận file được include:
/etc/nginx/conf.d/default.conf
Source canonical tương ứng:
/opt/incomex/docker/nginx/conf.d/default.conf
Git root:
/opt/incomex
HEAD=b5e0f962600c4e42969df1e940c9c981254f0175
File canonical được Git track, nhưng đã dirty trước mission:
M docker/nginx/conf.d/default.conf
git diff --numstat: 9 thêm / 26 xóa
Đây là pre-existing state, không phải thay đổi của 3D.3.
Precedence hiện hành trong đúng server vps.incomexsaigoncorp.vn:
location /api/registries-pivot/ -> nuxt_backend
location /api/reports/ -> nuxt_backend
location /api/ -> agent_data_backend
location = /api/balo/reconcile
source count=0
effective nginx -T count=0
Không phát hiện location Balo chồng lấn ở file include khác.
4. Backup và evidence đã tạo trước gate mutation
evidence=/opt/incomex/evidence/lenh3d3-exact-nginx-balo-route-20260717T022923Z
backup=/opt/incomex/backups/lenh3d3-exact-nginx-balo-route-20260717T022923Z
Backup byte-exact:
default.conf.pre
nginx-conf.d-pre.tgz
SHA file canonical trước và sau Gate 0:
3b947f4d0b61ccdf7dd194534fc39ba2721ef8a76d134d7d3785f9969cad1cc6
CONFIG_CHANGED_BY_3D3=NO
cmp source vs backup=IDENTICAL
5. Drift đã chặn mission
Báo cáo 3D.2 kết thúc với:
incomex-nuxt-failed-20260716T234206Z|Exited
incomex-nuxt-balo-canary|Exited
Gate 0 hiện tại:
docker inspect incomex-nuxt-failed-20260716T234206Z
→ no such object
docker inspect incomex-nuxt-balo-canary
→ no such object
docker ps -a --filter name=incomex-nuxt hiện chỉ còn:
incomex-nuxt
ID=890fee21392ca5c7a3da5c637bbb8dc1b0b8c61a6cb23712900344c8556cd4a7
running, healthy
Docker event history trong cửa sổ kiểm không còn bản ghi đủ để quy trách nhiệm ai/thời điểm nào đã xóa hai container. Không suy đoán nguyên nhân.
6. Production vẫn an toàn
Nginx=running
started_at=2026-06-30T00:44:14.689584247Z
restart_count=0
Nuxt=running, healthy
restart_count=0
bridge=active
socket=root:incomex-balo-sync:0660
Syntax hiện hành:
nginx: configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Public regression sau HOLD:
/knowledge/pivot 200
/reports 200
/reports/report-pg 200
/reports/report-balo-table 200
/api/reports/live?table_id=tbl_report_pg 200
/api/registries-pivot/summary 200
/api/health 200
7. Balo và bridge zero-touch
COUNTS|2148|385|699|654|410
FINGERPRINT|2148|1|2148|8ed1cd5d2f93f5f8a970497bd5e4ec87|2148|t|1
KEEP_DATE_HASH|b2ed4caf31d04bdbfb16c575147fc47d
Hai dòng cuối:
2147|table:public.sua_re_khai_niem_nhap|2026-07-16 10:06:33.15177+00
2148|table:public.sua_re_ui_khai_niem_nhap|2026-07-16 10:06:33.15177+00
DRY_RUN|PASS|delta=0|write=0
VERIFY|PASS_RECONCILED|delta=0|write=0
Không gửi BALO_SYNC_V1.
8. Những bước không thực hiện
NGINX_PATCH=NOT_RUN_PRE_ROUTE_DRIFT
NGINX_RELOAD=NOT_RUN
NGINX_CONFIG_COMMIT=NOT_RUN_NO_CHANGE
NUXT_BUILD=NOT_RUN
NUXT_CANARY_START=NOT_RUN
NUXT_CUTOVER=NOT_RUN
OLD_NUXT_CONTAINER_CHANGE=NOT_RUN
BUTTON_CLICK=NOT_RUN
BALO_WRITE=NOT_RUN
COMPOSE_CHANGE=NOT_RUN
GITHUB_PUSH=NOT_RUN
Không có exact location diff vì mission dừng trước patch.
9. Rollback
Không cần rollback runtime/config vì chưa có mutation. Byte-exact command nếu cần phục hồi file khỏi backup của mission:
cp -a /opt/incomex/backups/lenh3d3-exact-nginx-balo-route-20260717T022923Z/default.conf.pre \
/opt/incomex/docker/nginx/conf.d/default.conf
docker exec incomex-nginx nginx -t
docker exec incomex-nginx nginx -s reload
Command này không được chạy trong trạng thái hiện tại vì source và backup đang byte-identical.
10. Gate cần Owner quyết định
Owner cần xác nhận một trong hai điều trước mission tiếp:
- việc hai container stopped của 3D.2 đã bị xóa là cleanup được phê duyệt, candidate output hiện có vẫn được phép dùng làm provenance cho recutover; hoặc
- yêu cầu dựng lại canary/candidate containers trong một gate riêng trước khi sửa route.
Owner cũng cần khóa cách xử lý Git baseline: live canonical default.conf đã khác HEAD từ trước mission (9+/26-). Vì Lệnh 3D.3 vừa yêu cầu commit đúng file vừa cấm gom thay đổi ngoài scope, lần chạy lại cần xác nhận một trong hai: toàn bộ live file hiện hành là baseline được phép đưa vào local commit; hoặc phải reconcile/commit baseline trong một gate riêng trước exact-route patch.
Sau khi Owner khóa baseline mới, có thể chạy lại Lệnh 3D.3 từ đầu. Không nên tiếp tục từ evidence dở dang hoặc tự tái tạo container trong mission Nginx-only này.
11. Evidence chính
nginx-T-pre.txt
nginx-inspect-pre.json
nuxt-inspect-pre.json
config-sha256-pre.txt
config-stat-pre.txt
git-nginx-status-pre.txt
git-default-conf-diff-pre.patch
nuxt-containers-pre.txt
pre-route-drift.txt
balo-current-after-hold.txt
balo-dryrun-after-hold.log
balo-verify-after-hold.log
nginx-t-current-hold.txt
hold-summary.txt
CHỐT: HOLD — PRE_ROUTE_DRIFT. Exact Nginx route chưa được thêm; production vẫn nguyên vẹn; dừng chờ Owner.