LỆNH 3D — Bridge install HOLD và rollback production an toàn
LỆNH 3D — Cài bridge, deploy nút đồng bộ Balo và verify production
Ngày thực hiện: 2026-07-17
Verdict: HOLD — BRIDGE_INSTALL_FAILED
Kết quả an toàn: bridge đã rollback; Nuxt chưa build/canary/cutover; production cũ nguyên vẹn
0. Kết luận điều hành
Gate 0 PASS toàn bộ commit, SHA, source scope, runtime và dữ liệu. Backup đầy đủ đã tạo trước mutation.
Bridge systemd không cài được vì template đã duyệt có:
SocketGroup=65533
Systemd trên VPS giải chuỗi này như tên group, không phải numeric GID. Host không có group tên 65533, nên socket activation fail:
Failed to resolve group 65533: No such process
status=216/GROUP
Rollback tự động đã chạy ngay tại bridge gate. Theo Lệnh 3D §4 và §16, không được sửa template/code production rồi tiếp tục; vì vậy mission dừng trước build candidate, canary và cutover Nuxt.
1. Ba câu tuyên ngôn
- Vĩnh viễn: vẫn giữ một đường duy nhất fixed-purpose bridge → DOT canonical; không tạo workaround hoặc đường WRITE thứ hai để vượt lỗi systemd.
- Nhầm được không: commit/SHA/runtime/data được khóa trước; lỗi socket kích hoạt rollback tự động nên không thể kéo theo deploy Nuxt nửa vời.
- Tự động: rollback gỡ unit/socket/tmpfiles và trả runtime về pre-state ngay khi
enable --nowfail; production không cần thao tác chữa DB.
2. Luật và tài liệu đã đọc
Đã đọc trực tiếp qua Agent Data KB:
- Operating Rules SSOT v7.58 rev51;
- VPS Operating Rules v1.0;
- Hiến pháp v4.6.3 rev44;
- Quy định Balo canonical v1.9 rev15;
- báo cáo Lệnh 3C rev1;
.claude/skills/incomex-rules.md— 36 mục, 8 bước, hai mũ.
Không cập nhật OR: lỗi này là deployment-contract cụ thể, chưa tạo nguyên tắc vận hành tổng quát mới. TD được ghi tại mục 11 báo cáo này.
3. Gate 0 — commit, SHA và source scope
Hai HEAD khớp đúng Owner gate:
DOT_HEAD=88abb2f79548392794c8962fa443ca76da2664bd
NUXT_HEAD=2ea41583422427b6b5e6d886fa7a754198e121b7
SHA mission khớp báo cáo 3C:
a14eb489509280449924e09ae45415a2ab0086294797dfe739e49c481293dc9a dot-balo-reconcile
6994c34af9f47f92b36bf6e6f60f3172dce4b067dd6213a0a42f0d54a5d7b6be dot-balo-reconcile-bridge
3423f16c38de01a3e190f1ebc8255f625d760c9635959d1585342cad3d397332 reconcile.post.ts
4a66ea7b17ea9dae955169d0783e63b8eacb41ba50e01009ced516527611ce31 BaloSyncButton.vue
DOT_MISSION_SCOPE=CLEAN
NUXT_MISSION_SCOPE=CLEAN
NUXT_UNRELATED=? web-rp-current
Không có PREDEPLOY_DRIFT.
4. Env và UID/GID contract đọc trực tiếp
Source candidate xác nhận:
role allowlist env = NUXT_BALO_OPERATOR_ROLE_IDS
socket path env = NUXT_BALO_RECONCILE_SOCKET_PATH
public origin env = NUXT_PUBLIC_SITE_URL
socket default = /run/incomex/balo-reconcile.sock
empty role config = HOLD_AUTH_NOT_CONFIGURED
Live container:
user=nuxtjs
uid=1001
primary_gid=65533
supplementary_groups=65533
Điểm quan trọng: numeric GID live đúng là 65533, nhưng SocketGroup= của systemd cần một group identity mà host resolver nhận được. Trước mission host không có group tương ứng.
5. Runtime contract và backup
Runtime Nuxt pre-state được lưu nguyên JSON, gồm image/image ID, entrypoint/cmd, user, env, network/aliases, ports, mounts, working directory, restart policy, healthcheck, labels, hostname, resource limits, logging, started/restart count.
Tóm tắt không chứa secret:
container=incomex-nuxt
image_id=sha256:72715a92885c9b2a467cabccdb1e3b8e5221dbfdae68e59f9daef0af08bfab30
entrypoint=docker-entrypoint.sh
cmd=node .output/server/index.mjs
user=nuxtjs
working_dir=/app
network=docker_incomex
aliases=incomex-nuxt,nuxt
host_ports=none
mount=/opt/incomex/deploys/nuxt-output:/app/.output:rw
restart_policy=unless-stopped
memory=536870912
log=json-file,max-file=3,max-size=50m
started=2026-07-11T02:50:33.302411141Z
restart_count=0
health=healthy
Backup:
/opt/incomex/backups/lenh3d-balo-sync-production-20260716T231839Z
nuxt-output=43M
nginx-conf.d.tgz=68K
systemd prestate=all target files ABSENT
Evidence:
/opt/incomex/evidence/lenh3d-balo-sync-production-20260716T231839Z
Bao gồm inspect Nuxt/nginx, nginx -T, danh sách container/network và Balo fingerprint.
6. Balo pre-state
COUNTS|2148|385|699|654|410
FINGERPRINT|2148|1|2148|8ed1cd5d2f93f5f8a970497bd5e4ec87|2148|t|1
TAIL|2147|table:public.sua_re_khai_niem_nhap|2026-07-16 10:06:33.15177+00
TAIL|2148|table:public.sua_re_ui_khai_niem_nhap|2026-07-16 10:06:33.15177+00
KEEP_DATE_HASH|b2ed4caf31d04bdbfb16c575147fc47d
DOT read-only:
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
FINGERPRINT|unchanged=PASS
DRY_RUN|PASS|delta=0|write=0
VERIFY|PASS_RECONCILED|delta=0|write=0
7. Template bridge đã kiểm trước install
ExecStart=/opt/incomex/dot/bin/dot-balo-reconcile-bridge
ListenStream=/run/incomex/balo-reconcile.sock
SocketMode=0660
SocketGroup=65533
ProtectSystem=strict
ReadWritePaths=/run/lock
REQUEST=BALO_SYNC_V1\n
RUNNER=/opt/incomex/dot/bin/dot-balo-reconcile
TIMEOUT=120
MAX_OUTPUT=64 KiB
shell=False
SYNC_LOCK=/run/lock/incomex-balo-reconcile-sync.lock
flock -n
systemd-analyze verify không báo lỗi vì kiểm tĩnh không phát hiện việc group name 65533 không resolve được khi activation.
8. Lỗi install thật
Các file approved được copy vào đúng systemd/tmpfiles path; parent runtime được tạo mode 0750; daemon-reload chạy. Lỗi xảy ra tại:
systemctl enable --now incomex-balo-reconcile.socket
Journal thật:
Starting incomex-balo-reconcile.socket - INCOMEX fixed-purpose Balo reconcile socket...
(sd-chown): Failed to resolve group 65533: No such process
Control process exited, code=exited, status=216/GROUP
Failed with result 'exit-code'
Failed to listen on incomex-balo-reconcile.socket
Do socket chưa tạo được:
- chưa chạy invalid-byte production test;
- chưa chạy
BALO_SYNC_V1qua production bridge; - không có bridge WRITE;
- không deploy Nuxt.
9. Rollback và production post-state
Rollback tự động đã:
- disable/stop socket nếu có;
- stop service nếu có;
- xóa ba file vừa cài;
- xóa production socket;
- daemon-reload/reset-failed;
- xóa parent
/run/incomexsau khi xác nhận rỗng.
Post-state:
/etc/systemd/system/incomex-balo-reconcile.service|ABSENT
/etc/systemd/system/incomex-balo-reconcile.socket|ABSENT
/etc/tmpfiles.d/incomex-balo-reconcile.conf|ABSENT
/run/incomex/balo-reconcile.sock|ABSENT
/run/incomex|ABSENT
WANTS_LINKS=0
Runtime cũ nguyên vẹn:
/incomex-nuxt|started=2026-07-11T02:50:33.302411141Z|restart=0|running=true|health=healthy
/incomex-nginx|started=2026-06-30T00:44:14.689584247Z|restart=0|running=true
/incomex-agent-api-executor|started=2026-06-04T08:46:26.827398196Z|restart=0|running=true|health=healthy
Balo sau rollback:
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
FINGERPRINT|unchanged=PASS
VERIFY|PASS_RECONCILED|delta=0|write=0
10. Các bước không chạy
BRIDGE_PRODUCTION_REQUEST=NOT_RUN_SOCKET_FAILED_BEFORE_LISTEN
NUXT_TYPECHECK_REBUILD=NOT_RUN_AFTER_HOLD
NUXT_CANDIDATE_STAGE=NOT_RUN
NUXT_CANARY=NOT_RUN
NUXT_CUTOVER=NOT_RUN
OLD_CONTAINER_STOP_RENAME=NOT_RUN
NGINX_TEST_RELOAD=NOT_RUN
PRODUCTION_ADMIN_SESSION_TEST=NOT_RUN
PRODUCTION_BUTTON_CLICK=NOT_RUN
PRODUCTION_SINGLETON_HTTP_409=NOT_RUN
CANONICAL_BALO_UPDATE=NOT_RUN_PASS_CONDITION_NOT_MET
COMPOSE_CHANGE=NOT_RUN
DIRECT_DB_WRITE=NOT_RUN
CRON_CHANGE=NOT_RUN
GITHUB_PUSH=NOT_RUN
WORKFLOW_TRIGGER=NOT_RUN
Không có container rollback vì cutover chưa bắt đầu; production container cũ chưa từng stop.
11. Blocker và gate cần Owner tiếp theo
TD-3D-01 — sửa deployment identity contract cho production socket.
Hướng sửa an toàn đề xuất cho mission riêng:
- tạo một named host group chuyên dụng với GID khớp primary GID live của
nuxtjs(65533tại thời điểm này); - sửa source template
SocketGroup=và tmpfiles group sang tên group đó, không dùng chuỗi số; - chạy lại
systemd-analyze verifyvà một activation test trong evidence; - commit DOT mới, tạo bundle mới, Owner duyệt commit mới;
- sau gate mới mới chạy lại Lệnh 3D từ đầu.
Không dùng 0666. Không tạo group tên số. Không vá unit chỉ ở /etc rồi tiếp tục, vì như vậy source SSOT và production sẽ lệch.
12. Git và tài liệu canonical
DOT_HEAD vẫn 88abb2f79548392794c8962fa443ca76da2664bd
NUXT_HEAD vẫn 2ea41583422427b6b5e6d886fa7a754198e121b7
code commit mới=NONE
GitHub push=NONE
Canonical Balo không cập nhật vì Lệnh 3D §14 chỉ cho cập nhật sau production PASS. Không sửa tài liệu lịch sử.
13. Evidence paths
evidence=/opt/incomex/evidence/lenh3d-balo-sync-production-20260716T231839Z
backup=/opt/incomex/backups/lenh3d-balo-sync-production-20260716T231839Z
failure journal=/opt/incomex/evidence/lenh3d-balo-sync-production-20260716T231839Z/bridge-install-failure-journal.txt
pre inspect=/opt/incomex/evidence/lenh3d-balo-sync-production-20260716T231839Z/incomex-nuxt-inspect-pre.json
post inspect=/opt/incomex/evidence/lenh3d-balo-sync-production-20260716T231839Z/incomex-nuxt-inspect-post-rollback.json
Balo pre=/opt/incomex/evidence/lenh3d-balo-sync-production-20260716T231839Z/balo-pre.txt
report=knowledge/current-state/reports/codex-lenh-3d-balo-sync-production-2026-07-17.md
CHỐT: HOLD — BRIDGE_INSTALL_FAILED. Production đã rollback sạch và vẫn healthy; dừng chờ Owner gate cho template/group contract mới.