KB-3FD8

LỆNH 3D.1 — Named socket group và bridge production PASS

11 min read Revision 1
codexreportbalosystemdunix-socketproductionpass2026-07-17

LỆNH 3D.1 — Sửa socket group contract và cài bridge production

Ngày thực hiện: 2026-07-17
Verdict: READY_FOR_NUXT_BALO_BUTTON_DEPLOY_GATE
Phạm vi: named group + DOT template commit/bundle + bridge production; Nuxt zero-touch

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

Đã sửa tận source SSOT lỗi SocketGroup=65533 thành named group incomex-balo-sync, tạo system group bằng GID tự động của OS, commit/bundle trước install, rồi cài bridge production thành công.

Bridge production đã PASS:

socket=/run/incomex/balo-reconcile.sock
owner=root
group=incomex-balo-sync
gid=987
mode=0660
protocol=BALO_SYNC_V1\n
valid status=ALREADY_UP_TO_DATE
singleton status=ALREADY_RUNNING
TCP listener=none

Disposable container từ đúng image Nuxt chứng minh:

  • không supplementary group: EACCES;
  • --group-add 987: kết nối và nhận ALREADY_UP_TO_DATE;
  • primary UID/GID vẫn 1001/65533.

Không build/canary/cutover Nuxt trong mission này.

1. Luật và ba câu tuyên ngôn

Đã đọc trực tiếp:

  • .claude/skills/incomex-rules.md — 36 mục, 8 bước, hai mũ;
  • 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 3D rev1.

Ba câu tuyên ngôn:

  1. Vĩnh viễn: template dùng named host group; không còn gắn contract vào numeric primary GID của image Nuxt.
  2. Nhầm được không: source/install hashes bằng nhau, socket permission 0660, test không/có supplementary group và singleton lock khóa toàn đường.
  3. Tự động: socket activation gọi fixed bridge; DOT tự dry-run → apply nếu an toàn → verify; delta 0 tự dừng không apply.

Không cần cập nhật OR: named system group là sửa deployment identity contract cụ thể, không phải nguyên tắc vận hành tổng quát mới. TD-3D-01 đã được giải quyết trong commit mục 4.

2. Gate 0

Pre-state:

DOT_HEAD=88abb2f79548392794c8962fa443ca76da2664bd
NUXT_HEAD=2ea41583422427b6b5e6d886fa7a754198e121b7
group incomex-balo-sync=ABSENT
mission template scope=CLEAN
production unit/socket/tmpfiles=ABSENT
production socket=ABSENT

Nuxt production:

started=2026-07-11T02:50:33.302411141Z
restart_count=0
running=true
health=healthy

Balo:

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

3. Named group

Group chưa tồn tại nên không có name collision. Mission tạo đúng một system group, không hardcode GID:

groupadd --system incomex-balo-sync
incomex-balo-sync:x:987:
GROUP_CREATED_BY_MISSION=true
GROUP_NAME=incomex-balo-sync
GROUP_GID=987
MEMBERS=none

GID 987 là giá trị do hệ điều hành cấp tại thời điểm tạo, chỉ dùng làm runtime evidence và --group-add ở gate Nuxt sau; không ghi GID này vào source template.

4. Source SSOT, commit và diff

Chỉ sửa hai file:

ops/systemd/incomex-balo-reconcile.socket
ops/tmpfiles.d/incomex-balo-reconcile.conf

Diff đầy đủ:

-SocketGroup=65533
+SocketGroup=incomex-balo-sync

-d /run/incomex 0750 root 65533 -
+d /run/incomex 0750 root incomex-balo-sync -

Không sửa:

dot-balo-reconcile logic
bridge protocol/parser/timeout/output cap
singleton lock
Nuxt source

Verifier:

systemd-analyze verify=PASS
DOT_CANDIDATE_VERIFY|PASS
bridge unit tests: Ran 3 tests; OK
NAMED_GROUP_STATIC|PASS
git diff --check=PASS

Commit:

de4730013ca3cee5f55cb54c00fe51f1c2f1068b
fix(balo): use named socket access group
2 files changed, 2 insertions, 2 deletions
mission scope clean

Không git add -A; không push GitHub.

5. Git bundle

path=/opt/incomex/artifacts/git-bundles/dot-lenh3d1-de47300-20260717.bundle
sha256=97bba41f76ba00a154573889df3694993c7fc5dd5fc626d4364f0c9ad6a03456
size=863426
ref=de4730013ca3cee5f55cb54c00fe51f1c2f1068b refs/heads/main
history=complete
git bundle verify=PASS

6. Backup và bridge install

backup=/opt/incomex/backups/lenh3d1-balo-socket-group-20260716T233013Z
evidence=/opt/incomex/evidence/lenh3d1-balo-socket-group-20260716T233013Z

Systemd/tmpfiles prestate được ghi trước install. Đã cài đúng source vừa commit:

/etc/systemd/system/incomex-balo-reconcile.service
/etc/systemd/system/incomex-balo-reconcile.socket
/etc/tmpfiles.d/incomex-balo-reconcile.conf

Thực thi:

systemd-tmpfiles --create
systemctl daemon-reload
systemctl enable --now incomex-balo-reconcile.socket

Trước request đầu:

socket=active
service=inactive

Điều này chứng minh service không chạy thường trực trước activation request.

Post-install:

/run/incomex|root|incomex-balo-sync|gid=987|mode=750|directory
/run/incomex/balo-reconcile.sock|root|incomex-balo-sync|gid=987|mode=660|socket
socket unit=enabled,active
service=active sau request đầu
TCP_LISTENER=NONE
JOURNAL_SECRET_PATTERN=NONE

Source/install SHA khớp từng cặp:

service  63abef2d2cedd76f8a57c5c2a925bc7c1b70854c8172d0a9b46b538cd7db7818
socket   0c216aea03fa24b11d679b12bde1537105af7a0642f68de933f88c9308caa88b
tmpfiles 4df64bfdecebe233f0d1f9862bc7e39413459b6a709fb066327eccc657b88c82

cmp cả ba cặp source/install PASS.

7. Invalid protocol test

Gửi request khác byte contract:

BALO_SYNC_V2\n

Kết quả:

INVALID_PROTOCOL|status=FAILED|verified=false|PASS

Fingerprint trước/sau invalid request:

2148|1|2148|8ed1cd5d2f93f5f8a970497bd5e4ec87|b2ed4caf31d04bdbfb16c575147fc47d

Không gọi DOT apply và không đổi dữ liệu.

8. Valid delta=0 bridge test

Preflight:

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
DRY_RUN|PASS|delta=0|write=0

Response:

{"status":"ALREADY_UP_TO_DATE","before_total":2148,"after_total":2148,"add":0,"revive":0,"metadata_update":0,"mark_missing":0,"conflict":0,"verified":true,"message":"Balo đã mới nhất"}
apply called=NO — delta=0 branch
fingerprint before=after
date_updated hash before=after
write=0

9. Singleton lock test

Trong lúc tiến trình kiểm soát giữ:

/run/lock/incomex-balo-reconcile-sync.lock

Bridge trả:

{"status":"ALREADY_RUNNING","before_total":0,"after_total":0,"add":0,"revive":0,"metadata_update":0,"mark_missing":0,"conflict":0,"verified":false,"message":"Đang có phiên đồng bộ khác"}

Sau khi nhả lock:

status=ALREADY_UP_TO_DATE
verified=true

Fingerprint và date_updated hash vẫn không đổi.

10. Disposable Nuxt-image group test

Dùng đúng image hiện hành của production, không public port, không public container name, không mount production output, Docker socket, DOT hoặc SSH key. Chỉ bind đúng socket.

Không supplementary group

user=nuxtjs
group_add=null
ports={}
mount=/run/incomex/balo-reconcile.sock only
IDENTITY|uid=1001|gid=65533|groups=65533,65533
SOCKET_ERROR|EACCES
exit=13

PASS: permission bị từ chối như thiết kế.

Có supplementary group

user=nuxtjs
group_add=["987"]
ports={}
mount=/run/incomex/balo-reconcile.sock only
IDENTITY|uid=1001|gid=65533|groups=987,65533,65533

Response:

{"status":"ALREADY_UP_TO_DATE","before_total":2148,"after_total":2148,"add":0,"revive":0,"metadata_update":0,"mark_missing":0,"conflict":0,"verified":true,"message":"Balo đã mới nhất"}
exit=0
DISPOSABLE_REMAINING=0

PASS: không cần đổi primary UID/GID; gate Nuxt sau chỉ cần --group-add 987 và exact socket mount.

11. Balo final

total=2148
table=385
view=699
function=654
trigger=410
delta=0
conflict=0
sequence_safe=true
write=0
fingerprint=8ed1cd5d2f93f5f8a970497bd5e4ec87
KEEP date_updated hash=b2ed4caf31d04bdbfb16c575147fc47d

Hai tail rows nguyên vẹn:

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

Final verifier:

VERIFY|PASS_RECONCILED|delta=0|write=0

12. Production Nuxt zero-touch

NUXT_BUILD=NOT_RUN
NUXT_CANARY=NOT_RUN
NUXT_CUTOVER=NOT_RUN
OLD_NUXT_CONTAINER_CHANGE=NOT_RUN
NGINX_CHANGE=NOT_RUN
DB_WRITE=NOT_RUN
COMPOSE_CHANGE=NOT_RUN
GITHUB_PUSH=NOT_RUN

Production Nuxt cuối mission:

started=2026-07-11T02:50:33.302411141Z
restart_count=0
running=true
health=healthy
group_add=null
mount duy nhất=/opt/incomex/deploys/nuxt-output:/app/.output

Nginx:

started=2026-06-30T00:44:14.689584247Z
restart_count=0
running=true

Nuxt HEAD vẫn:

2ea41583422427b6b5e6d886fa7a754198e121b7
status chỉ còn linked worktree ngoài mission: ? web-rp-current

13. Rollback command

Runtime rollback:

systemctl disable --now incomex-balo-reconcile.socket
systemctl stop incomex-balo-reconcile.service
rm -f /etc/systemd/system/incomex-balo-reconcile.service \
      /etc/systemd/system/incomex-balo-reconcile.socket \
      /etc/tmpfiles.d/incomex-balo-reconcile.conf \
      /run/incomex/balo-reconcile.sock
systemctl daemon-reload
systemctl reset-failed incomex-balo-reconcile.service incomex-balo-reconcile.socket
rmdir /run/incomex  # chỉ khi rỗng

Giữ group khi source commit de473001 còn tham chiếu. Chỉ sau khi revert commit và chứng minh không member/reference mới:

groupdel incomex-balo-sync

Rollback command được lưu tại:

/opt/incomex/evidence/lenh3d1-balo-socket-group-20260716T233013Z/rollback-command.txt

14. Evidence paths

evidence=/opt/incomex/evidence/lenh3d1-balo-socket-group-20260716T233013Z
backup=/opt/incomex/backups/lenh3d1-balo-socket-group-20260716T233013Z
group evidence=.../group-contract.txt
bridge journal=.../bridge-journal.txt
disposable inspect/output=.../disposable-*.txt
poststate=.../poststate.txt
bundle=/opt/incomex/artifacts/git-bundles/dot-lenh3d1-de47300-20260717.bundle
report=knowledge/current-state/reports/codex-lenh-3d1-balo-socket-group-bridge-production-2026-07-17.md

CHỐT: READY_FOR_NUXT_BALO_BUTTON_DEPLOY_GATE. Bridge production giữ nguyên installed/enabled; dừng, không chạy Nuxt canary/cutover trong mission này.

Back to Knowledge Hub knowledge/current-state/reports/codex-lenh-3d1-balo-socket-group-bridge-production-2026-07-17.md