KB-16EF

LỆNH 1.6 — Báo cáo khôi phục có kiểm soát 40 DOT bin bị lùi

14 min read Revision 1
codexreportlenh-1.6dotrecoveryproduction-evidence2026-07-15

LỆNH 1.6 — Báo cáo khôi phục có kiểm soát 40 DOT bin bị lùi

  • Thời điểm thực hiện: 2026-07-15 (Asia/Ho_Chi_Minh; VPS CEST)
  • Phạm vi: đúng 40 file /opt/incomex/dot/bin/* trong allowlist forensic
  • Nguồn khóa: local DOT Git object 5a2e1bf998d89813729d6f10a0d87849075738b9
  • Verdict: PASS — đã khôi phục 40/40; dừng chờ Owner

1. Ba tuyên ngôn và rào chắn

  1. Hệ thống vận hành thật nằm trên VPS; mọi kết luận dưới đây dựa trên output thật tại /opt/incomex.
  2. PostgreSQL 16 là DB duy nhất; nhiệm vụ này không chạy SQL, không ghi DB và không chạy DOT nghiệp vụ.
  3. DOT là cổng ghi duy nhất; Nuxt chỉ đọc. Lệnh 1.6 không bắt đầu Balo sync.

Không deploy/recreate/restart/reload; không sửa Nuxt, nginx, compose, container, scheduler, workflow hoặc GitHub. Workflow Deploy to VPS được kiểm trước và sau, đều là disabled_manually.

2. Recovery script và nguồn

  • Script VPS: /opt/incomex/evidence/dot-recovery-1.6-20260715T135844Z/recover-40-dot.sh
  • Bản script trong KB tree: knowledge/current-state/reports/evidence/dot-recovery-1.6-20260715T135844Z/recover-40-dot.sh
  • SHA256 script: 1780c128610686858c0d70a9eab305b50ec0c35e20d932cf9eefa0819a2395f5
  • Mode script VPS: 700, owner root:root
  • bash -n: PASS; shellcheck: PASS.
  • Source được đọc bằng git show 5a2e1bf...:<path> từ local object của /opt/incomex/dot; không lấy blob từ GitHub remote.
  • Dry-run: DRY_RUN|PASS|zero_dot_writes=true.
  • Apply: RECOVERY|PASS|restored=40.
  • Verify của script: VERIFY|PASS|sha=40/40|bash_n=40/40|remaining_tracked_diff=sql/approved-sql-manifest.tsv.
  • Verify độc lập sau apply: INDEPENDENT_40|PASS|sha=40/40|mode=40/40|bash_n=40/40.

3. Bảng 40 file

SHA nguồn = SHA sau vì verify độc lập đã so byte 40/40. Các SHA dưới đây là SHA256 đầy đủ. Version lấy từ biến runtime VERSION= khi có; riêng header comment của dot-apr-propose còn ghi 2.0.0, nhưng biến thực thi và yêu cầu forensic đều là 2.0.2.

# Path SHA trước SHA nguồn = SHA sau Mode trước→sau Version trước→sau KQ
1 bin/dot-apr-execute d1bd8fc7dc8b2c681a8f42dc58cdd6ab39a420e0327c109c28d1a8780b5cab97 06211e6dc4d90ec4fbac26c521c146bef32c73ec97c0081783fa2986c0cbb8cc 755→755 1.0.0→2.2.0 PASS
2 bin/dot-apr-health ac113934f70c6d41794d511c441848b897c4430f1f91ca8ab28ef410719061eb 8cade4886f65d33edfb3dc6139db6ba19ac7c325bf35380108edb393891f5036 755→755 1.0.0→1.0.0 PASS
3 bin/dot-apr-propose 9dc5365ea29249f59782535b2dca4c3d584cb8ff988eabc101bba8aee403337f d2ed0283d3d7ab2f6dad24a4c69cb5830a455a6b39d2bc91b2ce77f6c2923da4 755→755 1.0.0→2.0.2 PASS
4 bin/dot-birth-backfill f1aa90f46cf9eabb173af0f8a48acde83dfb6009990ac5d23e05bb83f8a8d4a3 2a5f049fafe016447bf5b712e26e0221b83c42e0ff47f22feaf2c767a08957b9 755→755 1.0.0→1.0.0 PASS
5 bin/dot-birth-trigger-setup 38f17ab2d886eb5fc8e28f88dc60e85053945dcfe8e5e69946bb1248959227a7 e79a65629ad07a7fb43b38f7384fe06207e69405277fb8a2ef174653a5bcff4c 755→755 1.0.0→1.0.0 PASS
6 bin/dot-collection-create e9062d8c022c77cee76ea190572d053562aabc49bee62b50ff972c5c9aa0898d cd20287fdc9ce5d46aab58c63a37c9f99dadb62afb4b6e7d1e69157b9f77846d 755→755 2.0.0→2.0.0 PASS
7 bin/dot-collection-field-sync 63f4914a3888e1ccff82511678d7f6cce873d65c09bd9182d57f6b6cc24c8574 8322dca28668a365b8b28599d1e9ca4d286998ce9cc9cf786ceebdc535dcc8ef 755→755 1.0.0→1.0.0 PASS
8 bin/dot-collection-health 9cf3c62f9b84496b74414824026e8dde452ea98e19a393e3a1aa29cb3aa70f5c 85a32a0469c28432239d1fae4cf48cd7fb196335bd96ee41a407831dfb12e8d8 755→755 2.2.0→2.2.0 PASS
9 bin/dot-coverage-inspector c8fb9bbf7a741e3ad7d6de81a80068a9ad7389d439587c4fb372e0068d566000 1c080791eb43f28cbc5c4dfb505a5967945d9196bfa13d24118c22986c08f386 755→755 1.0.0→1.0.0 PASS
10 bin/dot-cron-matrix-setup efc1c94a0530e1868159917f47a7c8489bef3c52fd194f11b4376594ad0fa981 67914a1b5c37e29a47ff853b89307b2ebb5d2bfc70360c520c57dd8be5cfa531 755→755 1.0.0→1.0.0 PASS
11 bin/dot-cron-pivot-setup b2a2758c0128bd0ab146f6b8812f9b228010bca23c478b497f916484221885b7 6fbf1a47930b99c990cbd952f43c5e9e1fd36a35e2a755cc5a41c39d8ca6ecb9 755→755 1.0.0→1.0.0 PASS
12 bin/dot-dot-coverage 18fb001c511d98554ecb23fa17b79357767e52fa2a58760928f4fcc8f053681f cca1f47f50e506ee8a0f8ce168354f4953b2586948d389c45ae175614404da9d 755→755 1.0.0→1.0.0 PASS
13 bin/dot-dot-health 02974ac79177dd08afc0e7ca3e357613147c78f51509bf5d530ec1f6156f6ebe 28bc0b8e1ad93d380045e5e3cff6a6934d67c4b9bfffdd51ac5caaa1630a6bf2 755→755 1.0.0→2.0.0 PASS
14 bin/dot-dot-register 9c594efdd81c4cfe372a1801637b31762e9020e04a2322b6e1f61ed31906286a 31d5cf1508c7950cc30a2a6abb46d7cee868e1cbf951a6095ff0aee7ba48583f 755→755 1.0.0→1.0.0 PASS
15 bin/dot-entity-deprecate 446ff4cc15c6d7e5754d57c4e3db1ce5d83d42e06ef904eaa9a0c38f7a301057 77e53db286ea9e5fff5abff0ea246786632bcf6a0e3066cbc490b475c34c65e8 755→755 2.0.0→2.0.0 PASS
16 bin/dot-entity-retire f518dfd990f4a345783f4f5790bb84edaea84412fe1b29a2e2965aa06445d7cc af8e8cd2fdb33b314d7eab3ef7435f412e0c8b24964869a9e46437ccd0c492c1 755→755 2.0.0→2.0.0 PASS
17 bin/dot-inspect-pen 221d9b7c5f7ee14f46a654b7975be37849ffb4f6f3ffa4a4be818470531cb987 5a0cb24d92e05f6ecf8a5ee9a8b95ad01fba1d7e09b9460fb11c288e1b7993dc 755→755 1.0.0→1.0.0 PASS
18 bin/dot-knowledge-search 2e4c202efc1f6a70383562b7e9812f2599cc27aee87a771b57199e216a503700 1e54132430a692479443d5c4333c54e32f4202b725e4b6870eec38eb4b8b3ee0 755→755 NA→NA PASS
19 bin/dot-label-trigger-setup 07e9845f23c5970a77f0c777f2aba8296d57ee7b8c2d5f9840dab2504f291c9e 16ee40abef8a0b3b036e7f62dd140880a18c5e6a67c1942da12dac4fa7bdabd2 755→755 2.0.0→2.0.0 PASS
20 bin/dot-matrix-declare 6665004709c6d0425f67ec5c1deb3474ce62d77360b711abea10f924c65e5c2b 0ff96bb7783a7964e1ccc047553b554ae879a1b5c32690f72afae28469bc5a7c 755→755 1.0.0→1.0.0 PASS
21 bin/dot-matrix-health fe9a9e5d2f070e6b3a898ea77124bb0d2c0b405315012d092bb801a9957ca95b b024938304101b2689935511b87501296fe0ddfbd8aa95f23c1d213f851ce1d8 755→755 1.0.0→1.0.0 PASS
22 bin/dot-matrix-retire e1f9f925f1a5857423c85deadb40947915f8670e34d84c80a4eb1c9703d25fe3 3666ab0a9f42c3b468d7a8eb877314d534c211e78153de8c7a56d0bf55ac8cff 755→755 1.0.0→1.0.0 PASS
23 bin/dot-matrix-update f7fd8636a503c81252018522e5e5a11de556c5e57eec211e6f95858b8a629b44 aacff34d143164ac6e139c8163703732102a8659266eafeaf8a8c1be9a9fd7e6 755→755 1.0.0→1.0.0 PASS
24 bin/dot-migration-s127d-legacy-origin 2055199d0f66cac8ee2b4549d680ba927b0d6038dde8285b9fa962d636eee3bd 9c32c0ca5f98906dd83bdc72ce9d35e0c9c07054a8a2698bc6b1442595a67155 755→755 1.0.0→1.0.0 PASS
25 bin/dot-migration-s128b-dead-links 95b0320797a14aa5b2af330930cec1a4c0adb9a18c35c4c8ba52fcb576586397 b062a9c0113a1ba936f527ca011b854f92286357acfa094a70ad7877c0d0e311 755→755 1.0.0→1.0.0 PASS
26 bin/dot-migration-s155-p1b 0f3af8bdfa9fea20756587612f20c708c08ce78ebf8a5e7da01fc9a9b161175c 79b34ac8c6f56646046b26d7c6d6376b4d6326011eadbd6b13f2dad043989918 755→755 1.0.0→1.0.0 PASS
27 bin/dot-nrm-draft f0ea2fe5e5074bf91e2b45f23c6f9d8d8d116d680c1a6fa3814cea75e76660e2 617704a093db543e3cefe3c072cb0451102a28d32c38a6a00d1e33a61754cd1f 755→755 1.0.0→1.0.0 PASS
28 bin/dot-pg-audit-ensure 4ce159193ab65a48bfa071061f446ec4d6f6d8552f3e510868d3290743da8156 51f5f79b9a0b4b0b9ed482a4dfaa68bcf3a88e143bde11cb2723c21972483036 755→755 2.0.0→2.0.0 PASS
29 bin/dot-pg-triggers-ensure ac98005ddae5d41f493c8045677ad81eca0a2902a6948ca6f539d8fadd8b2599 a3aeacd0513d4ea230c112d9b7603d8ec3a59001d267d88f4e151826299215c4 755→755 1.0.0→1.0.0 PASS
30 bin/dot-pg-views-ensure bbebebbee27cf371b31697b4284d3c4f25d5ba1a0c33c24973f34258968208b8 015f06411777b03755dc619a0db81c8fbe007dc947e6ee882aa0acafa6fefecd 755→755 12.0.0→12.0.0 PASS
31 bin/dot-pivot-declare fcf16faaaacb8c903a2d2a0341cff04d95d9a4b0653819cfb537fae1ccc06d55 7029fe88f96268b929e305739724b6f646984197e0fb6452f52ec5b6169b3c06 755→755 1.0.0→1.0.0 PASS
32 bin/dot-pivot-health 5c0fa4af5e8ccacc116628b64e05f22332c64edf0d3d27f9ddd151fde292aa47 efe5b1085c79c7bd9922756cde9fa7f9b9ef28dfd9ba21fc2d0458191deb37df 755→755 1.0.0→1.0.0 PASS
33 bin/dot-pivot-virtual-create 7d2c366590c97db8143715150c511e5c0c112a91d231cb6529e7b89697b4093f 9823e61fec5a97b35c67ebeabe4391fac448168ef5063662c1ece880e72104e8 755→755 1.0.0→1.0.0 PASS
34 bin/dot-production-truth-gate 5a649eec7e318581fdef45ad952ab7ab289cf9c29207fdc63f32e5dfd3eddaf3 5994a9036257f27bb853b414b913c08fc646abf588521c72f5798be770099a06 755→755 1.0.0→1.0.0 PASS
35 bin/dot-schema-birth-registry-ensure 50586a7ab7767f21143f1081b550e2be987a97ebf3a1a07e2f271ba332a98297 f7afe712ee1b35c037fd149519b31acf8e291b51804df7d5a7b06fb55140a262 755→755 1.0.0→1.0.0 PASS
36 bin/dot-schema-dot-origin-ensure ab19742489ec3f0a7b86da584b998b6040ef0ac4a85c72e8706212b17a21dabb 0b534fd97b4bd338315f22247af92c8c7dcc95a59f43445ad7600a7187669623 755→755 1.0.0→1.0.0 PASS
37 bin/dot-schema-meta-catalog-add-composition 90ab27f5e735bbc723282454bc16e0130a904886fb2bbf3c689eede266c8412b 588b7d707af2844230b4032d52a506b303cab55889c55a813f3c3c27e9dfda26 755→755 1.0.0→1.0.0 PASS
38 bin/dot-schema-species-tree-ensure 3ac0ee2be06e6ea8cd62c3bf39124cb97a7f9f511399244fb20676490c57a927 dad0e2994816966e8d983f4efb7fd4a0329f2fea9c9a995aff06ea1e5eea8b65 755→755 1.0.0→1.0.0 PASS
39 bin/dot-schema-taxonomy-pg-apply 3cd6784d1604b45c892bb6300fa1c90af86a7eb9b1b7153804b1d155aa789a4e c9354c5f5db4da3ddf9e19ba72e4674a706e86e820cf5c5b55da16b56029ffb0 755→755 1.0.0→1.0.0 PASS
40 bin/dot-schema-trigger-registry-ensure 2985158295f88684f95107b04f80ca03cc69c0d6f532858607d78c33b7a80a01 941e5e0cac89851503445587409135562a939656f1083c5eb63663b790e55fc5 755→755 1.0.0→1.0.0 PASS

Ba hồi quy trọng yếu đã trở về đúng biến runtime:

VERSION|bin/dot-apr-execute|VERSION="2.2.0"
VERSION|bin/dot-apr-propose|VERSION="2.0.2"
VERSION|bin/dot-dot-health|VERSION="2.0.0"

4. Manifest và cổng ghi

sql/approved-sql-manifest.tsv

  • SHA trước: 0a96f8579068808e6e1ab678c5789a3d4255918e862b11c695f740280ce425be
  • SHA sau: 0a96f8579068808e6e1ab678c5789a3d4255918e862b11c695f740280ce425be
  • Số dòng sua-re/* trước/sau: 6/6.
  • Tracked diff duy nhất còn lại so với commit nguồn: sql/approved-sql-manifest.tsv, đúng ngoại lệ phải giữ.

bin/dot-pg-atomic-apply

  • Không thuộc allowlist 40; không được sửa.
  • Tồn tại; mode 755; bash -n PASS; 2 SQL reference liên quan đọc được.
  • Current SHA: cf90611d2c762f26865781f585e61bc4225ab39a6c60255e2f6cc199d180cd62.
  • Source SHA tại 5a2e1bf...: cf90611d2c762f26865781f585e61bc4225ab39a6c60255e2f6cc199d180cd62.
  • Kết luận: PASS — KEEP_UNCHANGED.
  • Điều kiện bổ sung đã được đánh giá: vì SHA khớp nguồn tin cậy nên cờ HOLD và điều kiện chặn Balo không bị kích hoạt. Không có Balo sync nào được bắt đầu trong Lệnh 1.6. Nếu cổng này phát sinh HOLD ở lần kiểm sau, nhiệm vụ Balo sync phải bị chặn cho tới khi cổng được xác minh/khôi phục trong một lệnh riêng.

5. Backup, rollback và zero-touch

  • Backup ngoài DOT tree: /opt/incomex/evidence/dot-recovery-1.6-20260715T135844Z/backup
  • Metadata: backup/metadata.txt; bảng SHA/mode/uid/gid: backup/files.tsv; preimage: backup/preimage/bin/*.
  • Backup integrity độc lập: BACKUP_INTEGRITY|PASS|sha_mode_owner=40/40.
  • Rollback command (chỉ dùng nếu Owner ra lệnh):
/opt/incomex/evidence/dot-recovery-1.6-20260715T135844Z/recover-40-dot.sh rollback

Không chạy rollback vì apply và verify đều PASS.

Zero-touch được đối chiếu SHA/ID/StartedAt trước-sau:

  • Balo/DB: không SQL, không DOT nghiệp vụ, không ghi DB.
  • Nuxt artifact: SHA không đổi.
  • nginx config: SHA không đổi.
  • compose: SHA không đổi.
  • 6 container: ID, image và StartedAt không đổi; không restart/recreate.
  • scheduler/crontab: SHA không đổi.
  • GitHub: không ghi; workflow vẫn disabled_manually.
  • find bin -name '*.recovery.*': 0 file tạm tồn dư.

6. Evidence production

Evidence root trên VPS:

/opt/incomex/evidence/dot-recovery-1.6-20260715T135844Z/
├── recover-40-dot.sh
├── workflow-state.txt
├── dry-run.log
├── apply.log
├── post-verify.log
├── zero-touch-before.txt
├── zero-touch-after.txt
└── backup/
    ├── metadata.txt
    ├── files.tsv
    └── preimage/bin/*   (40 file)

Các dòng kết luận production:

DRY_RUN|PASS|zero_dot_writes=true
BACKUP|PASS|files=40
RECOVERY|PASS|restored=40
INDEPENDENT_40|PASS|sha=40/40|mode=40/40|bash_n=40/40
BACKUP_INTEGRITY|PASS|sha_mode_owner=40/40
ZERO_TOUCH_PROTECTED|PASS|manifest_compose_nginx_nuxt_containers_crontab_unchanged
MANIFEST|sha=0a96f8579068808e6e1ab678c5789a3d4255918e862b11c695f740280ce425be|sua_re_rows=6
TRACKED_DIFF|sql/approved-sql-manifest.tsv
BIN_DIFF_COUNT|0
ATOMIC_GATE|PASS|action=KEEP_UNCHANGED|balo_block=NOT_TRIGGERED

7. Kết luận và điểm dừng

Lệnh 1.6 hoàn tất PASS đúng phạm vi: 40/40 DOT bin đã trở về byte của local commit khóa; manifest hợp lệ được giữ nguyên; cổng ghi PASS và không bị sửa; các vùng cấm không đổi. Không deploy và không chuyển sang Balo sync. DỪNG chờ chỉ đạo Owner.