KB-18C4 rev 2

LỆNH 3D.3 — HOLD PRE_ROUTE_DRIFT trước exact Nginx route

8 min read Revision 2
codexlenh-3d3nginxbalopre-route-driftholdproduction2026-07-17

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

  1. 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.
  2. 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.
  3. 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:

  1. 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
  2. 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.