KB-7849

C2B1-HYB-B0 REV1 — Fresh Recovery Point & Pre-Cutover Configuration Checkpoint (2026-07-22)

15 min read Revision 1
current-statec2b1-hyb-b0hybrid-fast-containmentdirectusbackup-encryptiondrivedecryptisolated-restorenegative-controlgit-checkpointprotected-config-checkpointh1-checkpointexternal-consumer-gatedecomposition-deadlinefresh-recovery-pointdr-statuszero-mutation2026-07-22PASS_C2B1_HYB_B0_FRESH_RECOVERY_POINT_VERIFIEDC2B1_PRECUT

C2B1-HYB-B0 REV1 — Fresh Recovery Point & Pre-Cutover Configuration Checkpoint (2026-07-22)

VERDICT: PASS_C2B1_HYB_B0_FRESH_RECOVERY_POINT_VERIFIED mission run_id C2B1_PRECUT_20260722T083250Z · host Contabo vmi3080463 · UTC window 2026-07-22 08:16Z → 09:1xZ READ-ONLY on production (pg_dump snapshot + SELECT only) · zero production mutation · no secret value in this report. Gate opened by this PASS: C2B1-HYB-S1 (nothing else).


1. Executive verdict

Đã tạo và chứng minh một mốc lùi (recovery point) tươi cho toàn bộ Directus production trước khi bắt đầu hybrid fast-containment. Toàn bộ chuỗi backup → mã hoá → off-site → tải ngược độc lập → giải mã → restore cô lập → negative-control đã PASS end-to-end; cấu hình (secret + non-secret) đã được đóng băng thành checkpoint có thể lùi. Không tạo identity, không repoint consumer, không rotate credential, không chạm production data/container.

PASS gate (Section 16) Kết quả
FRESH_ENCRYPTED_OFFSITE_BACKUP PASS
INDEPENDENT_REMOTE_DOWNLOAD PASS (Drive-side md5+sha1+sha256 + re-download sha khớp)
ISOLATED_RESTORE_ON_ERROR_STOP PASS (PIPESTATUS 0/0/0, PSQL_ERROR_LINES=0)
NEGATIVE_CONTROL FAILED_CLOSED (gpg=2 gunzip=1 psql=3)
PRODUCTION_DATABASE_MUTATION 0
PRODUCTION_CONTAINER_MUTATION 0 (PRE_SIG == POST_SIG)
GIT_OR_PATCH_CHECKPOINT PASS (commit 714d4d5, path-scoped)
PROTECTED_CONFIG_CHECKPOINT PASS (/root/c2b1-hybrid-precut-checkpoint-20260722T085250Z)
PLAINTEXT_OR_PRIVATE_KEY_RESIDUE 0
H1_CHECKPOINT_PRESERVED YES (unmodified)
DECOMPOSITION_DEADLINE_RECORDED YES (§13)

DR flip: NEWEST_PROVEN_RESTORABLE_OFFSITE_PRODUCTION_BACKUP_UTC = 2026-07-22T08:32:50Z (trước mission = 2026-07-20T18:37:01Z từ C2B-PRE-V3).

Facts carried (không hành động trong B0):

  1. Immutable Nuxt pin vẫn hiệu lựcincomex-nuxt chạy …/nuxt-ssr@sha256:72715a92885c…fab30 (image id 72715a92885c), started 2026-07-22T05:24:45Z; compose fallback pin nay đã được commit (§9).
  2. pg-restore-test-20260520T031054Z (postgres:16, id 0cbc668c76f9, started 2026-05-20T03:10:55Z, up ~2 tháng) vẫn tồn tại → ghi vào historical credential-exposure inventory (§12), không sửa/không xoá trong B0.

2. Hybrid-path authorization

OWNER_AUTHORIZATION = GRANTED_BY_GPT_UNDER_OWNER_DELEGATION
C2B1_PATH            = HYBRID_FAST_CONTAINMENT
NEXT_AFTER_B0        = C2B1-HYB-S1

Mission tự chạy qua tất cả safety gate; không tạo identity / không repoint / không rotate trong B0 (ranh giới §2 của prompt giữ nguyên vẹn).


3. Live schedule / resource gate (B0-0)

  • TZ hệ thống = Europe/Berlin (CEST +0200). Dòng crontab 37 20 * * * backup-to-gdrive.sh không có CRON_TZ phía trước ⇒ chạy theo system TZ ⇒ 18:37Z (không phải "20:00 UTC" như comment). Lần chạy nightly kế tiếp: 2026-07-22 18:37Z.
  • Các job liên quan: code-backup-to-gdrive.sh 13:00Z; pg-backup.sh (local plaintext dump) 00:27Z; qdrant-backup.sh 03:00Z. Không job backup/rclone/pg_dump nào đang chạy lúc bắt đầu.
  • Cửa sổ: bắt đầu 08:16Z, hoàn tất trước 09:2xZ ⇒ buffer ≥ 2 giờ trước nightly 18:37Z (đạt ~9h). Không dừng/đổi lịch job nào.
  • Tài nguyên: disk / 90% (avail 10.35 GiB); /dev/shm tmpfs 5.8 GiB (dùng làm GPG home + staging ciphertext, 0 áp lực disk); RAM ok. Restore peak ước lượng ~3.8 GiB, gate FREE ≥ 2×PEAK PASS. Không prune/vacuum/dừng service để vượt cổng.

Verdict gate: cửa sổ đủ ⇒ không HOLD_C2B1_HYB_B0_BACKUP_WINDOW, không HOLD_..._DISK_HEADROOM.


4. Production PRE baseline (B0-1)

  • 11/11 container baseline (id·StartedAt·RestartCount·image·status) đóng dấu: CONTAINERS_PRE_SIG = 2080e8bec8c8d0fb3d043cb3ac8d19df4330ab952a22e848ab05d62478cec376.
  • Postgres postgres (id 22540b78de8f) · Directus incomex-directus (id 2245d86d2f6a, directus/directus:11.5).
  • DB directus = 1,795,292,183 bytes (1712 MB); PROD_BASELINE_SIG = fd658d5039140bcd9381ab7dc433a04fc76b372a68572042b6920f45fff17eaf.
  • Structural: base tables 385 (public 351 · cutter_governance 24 · iu_core 2 · sandbox_tac 8); index 974; PK 375 / FK 161 / UNIQUE 90 / CHECK 364 / excl 1; extensions btree_gist,pgcrypto,plpgsql,postgres_fdw; users 13 · collections 167 · fields 1497 · permissions 1207 · roles 9.
  • Append (đại diện): directus_revisions 437,302 · directus_activity 443,560 · birth_registry 1,216,883 · entity_labels 904,545 · system_issues 226,355 · registry_changelog 113,996.
  • Newest proven restorable (trước mission) = 2026-07-20T18:37:01Z. Nuxt heap-OOM cycle tiền tồn: chỉ ghi nhận, không điều tra.

5. Fresh backup pipeline (§5)

Replica trung thực pipeline DB đã được C2B-PRE-V3 chứng minh, ghi vào prefix cách ly, miễn nhiễm retention:

docker exec postgres pg_dump -U directus -d directus --no-owner --no-acl | gzip \
  | gpg --batch --yes --trust-model always --recipient-file /etc/incomex/backup/directus-backup-recipient.pub --encrypt
  • set -o pipefail; PIPESTATUS = 0 0 0 (gpg kiểm trước theo bài học SIGPIPE). Plaintext SQL không bao giờ chạm đĩa (staging trong /dev/shm).
  • Recipient FPR (public) 31799F7AC051EBA68FB3F13BDCC1369B371837BA; encryption subkey keyid E800896AF06E9B61 (kiểm --list-packets).
  • Artifact incomex-prod-directus-db-20260722T083250Z.sql.gz.gpg · 121,276,227 bytes · sha256 ed1e76990bc25da6e6585018453725f626420d6ac1d4b8e2512d4e3671af99f1 · md5 cdd3f89a373fdbd5c1942b9df7485f94.
  • meta.json (non-secret) mang sha256/md5/bytes/recipient_fpr/prod_baseline_sig/prod_db_size_bytes/mission.
  • Prefix riêng: gdrive-backup:incomex-encrypted-v1/c2b1-precut/C2B1_PRECUT_20260722T083250Z/không khớp glob retention ^vps-backup- (0 file legacy ở Drive root) và không ở Drive root; script nightly hiện chỉ prune LOCAL staging + LOG remote (không deletefile). Không ghi đè artifact cũ. Không heartbeat giả (dùng script riêng, không đụng lock/status/heartbeat của nightly).

6. Remote artifact proof (§6 — không tin luồng upload cục bộ)

  • rclone lsjson --hash: Drive-side md5=cdd3f89a…, sha1=2296d4d8…, sha256=ed1e7699…99f1, size 121276227 — cả 3 hash Drive tính server-side khớp local.
  • Re-download độc lập từ Drive → sha256 ed1e7699…99f1 == artifact đã upload.
  • Prefix chỉ chứa …​.sql.gz.gpg + …​.meta.json; không.partial / plaintext sibling.

7. Isolated restore proof (§7)

  • Private key DIRECTUS_BACKUP_GPG_PRIVATEKEY_RECOVERY v1 (project github-chatgpt-ggcloud, SA cursor-ci-builder@…) → import vào tmpfs GPG home /dev/shm/…/gnupg (0700); secret-key fpr 31799F…1837BA + subkey …E800896AF06E9B61 xác nhận. Key không bao giờ in ra, không chạm đĩa bền.
  • Integrity (decrypt→gunzip→awk, plaintext chỉ trong pipe RAM): CREATE_TABLE=385 · TOTAL_LINES=3,939,249 · DUMP_COMPLETE=YES, PIPESTATUS 0/0/0.
  • Môi trường cô lập: container c2b1-precut-restore-<rid>, network c2b1-precut-net-<rid> --internal, PUBLISHED_PORTS = map[] (0 host port), volume riêng, không join network production; postgres:16 tuned fsync=off full_page_writes=off synchronous_commit=off max_wal_size=1GB.
  • Pre-create roles bắt buộc (fdw user-mapping): workflow_admin (bootstrap superuser) · directus · context_pack_readonly; DB directus owner directus.
  • Restore streaming gpg -d | gunzip | psql -v ON_ERROR_STOP=1: PIPESTATUS gpg=0 gunzip=0 psql=0 (psql kiểm trước); PSQL_ERROR_LINES=0; free / 10.31→7.79 GiB (peak ~2.52 GiB) rồi hồi phục.
  • Structural equivalence restored == production, EXACT trên 17 khoá: base_tables_all 385 (public 351/cutter_governance 24/iu_core 2/sandbox_tac 8), indexes 974, pk 375, fk 161, uniq 90, chk 364, excl 1, extensions btree_gist,pgcrypto,plpgsql,postgres_fdw, users 13, collections 167, fields 1497, permissions 1207, roles 9. 6 bảng append: BAND_OK (baseline ≤ restored ≤ prodPOST). "Table tồn tại" không được coi là PASS — cổng là ON_ERROR_STOP exit code + structural match.

8. Negative control (§8 — fail-closed)

  • Fixture = 2 MB đầu của ciphertext đã tải lại; restore vào DB throwaway c2b1_precut_negctl (không bao giờ target production).
  • Kết quả: gpg=2 · gunzip=1 · psql=3FAILED_CLOSED; gzip: unexpected end of file; ERROR: missing data for column … COPY birth_registry (ON_ERROR_STOP bắt). Không stage nào trả 0 ⇒ không FAIL_..._NEGATIVE_CONTROL_FALSE_GREEN.

9. Git checkpoint (§9)

  • Repo cai quản = /opt/incomex (compose docker/docker-compose.yml); branch feat/s177-sprint1-round-a; remote = NONE (local-only, không push).
  • H1 compose pin (tracked, uncommitted, tách được) → commit path-scoped duy nhất file docker/docker-compose.yml:
    • pre_head 2ce85a63aaffc664225310c23b9b8788986fa4f3checkpoint commit 714d4d5411685dffcc03b37e2fe0d08adf92d190.
    • compose blob 39bc281 (nuxt-ssr:latest fallback) → ba914060 (@sha256:72715a…fab30). Diff = 1 dòng duy nhất.
    • message: checkpoint(c2b1): pre-hybrid-containment configuration.
  • Bảo toàn công việc không liên quan: dirty entries 105 → 104 (chỉ compose rời khỏi dirty); 104 thay đổi s177 khác không stage, không đụng. Không stage .env (gitignored L50), không stage backup/checkpoint. GIT_CHECKPOINT = COMMIT (nhánh "commit đúng file cần thiết", không phải PATCH_ONLY).

10. Protected configuration checkpoint (§10)

  • /root/c2b1-hybrid-precut-checkpoint-20260722T085250Zdir 0700 / file 0600 (audit: non_0700_dirs=0, non_0600_files=0), 27 file, 119 KB, MANIFEST_SIG = 59335f29c9ad89e0dc70a1acafbb2f91cbd9d44fa0699944967107d24da49b4d.
  • secret/ (root-only, KHÔNG vào Git/KB/Drive/report): docker/.env, /opt/incomex/.env, /etc/incomex/agent-data.env, /etc/incomex/reconcile/directus-admin.env, cron-env.sh, claude-kb/.env, claude-mcp/.env, root-crontab.
  • effective/ (env-bearing docker inspect): incomex-nuxt / incomex-agent-data / incomex-directus / postgres.
  • config/ (non-secret): 3 compose file, backup-to-gdrive.sh (sha 19e43432…3288b = bản F1-repaired), reconcile-*.sh, recipient.pub (sha 5e6c0864…).
  • evidence/: containers-pre, prod-baseline, restored/prodPOST structural kv (sha đồng nhất 4c3cdaae… ⇒ restored==prod), stageA/B log, meta.json, git-checkpoint-meta + H1 pin patch.
  • ROLLBACK-INDEX.md mô tả file nào phục hồi ở phase nào — reference only, KHÔNG auto-execute. Checkpoint không nằm trong git root/Drive/KB.

11. H1 checkpoint preservation (§11)

/root/nuxt-img-h1-checkpoint-20260721T150753Z — tồn tại, mode 700 root:root, 19 file, newest internal mtime 2026-07-21 17:53 (đều trước mission) ⇒ UNMODIFIED. Không gộp/di chuyển/xoá. rollback.sh network-independent còn nguyên.


12. External-consumer safety gate (cho C2B1-X tương lai) + historical exposure inventory

Bootstrap admin duy nhất = admin@example.com (id 6abdec55-d911-44df-af96-3cf60b9654af, admin_access qua directus_policies). Đo từ directus_activity/directus_sessions (KHÔNG đọc cột token):

Class events distinct IP logins last use
EXTERNAL (ngoài VPS) 13,604 171 2,751 2026-07-03
internal (172.x docker) 264,822 7 1,797 2026-07-22 06:01 (đang chạy)
vps-self (38.242.240.89) 148,925 1 104 2026-07-17
  • sử dụng external thực tế trong lịch sử (171 IP, dải ISP Việt Nam, login tương tác Directus admin-UI), lần cuối 2026-07-03 (~19 ngày trước). Active sessions hiện tại: 33, TẤT CẢ nội bộ 172.18.0.5 — 0 session external đang mở, nhưng credential vẫn hợp lệ. (Không suy đoán máy cá nhân chạy script gì — chỉ ghi facts.)
  • OWNER_EXTERNAL_DIRECTUS_ADMIN_CONSUMER_DECLARATION = REQUIRED_BEFORE_C2B1_X. Điều này không chặn B0 hoặc H-S1; chỉ là safety gate trước rotation (nếu không khai báo, xoay credential có thể khoá đăng nhập admin-UI của Owner/nhân sự từ máy ngoài).

Historical credential-exposure inventory (carry, không hành động B0):

  • pg-restore-test-20260520T031054Z (postgres:16, id 0cbc668c76f9, up ~2 tháng) — leftover restore-test container từ dot-iu-cutter v0.5 (directus_legA_cut_pre_grant_20260520T031054Z.dump); chưa retire, chờ Owner. Không sửa/xoá.
  • /opt/incomex/evidence/lenh3d2-…/nuxt-runtime-canary.env — file env-canary cũ mang NUXT runtime secret nằm trong cây repo (informational; xử lý ngoài B0).

13. Decomposition deadline covenant (§13)

TRANSITIONAL_IDENTITY_PURPOSE       = TEMPORARY_CONTAINMENT_ONLY
TRANSITIONAL_IDENTITY_ADMIN_ACCESS  = FALSE
C2B1_DECOMPOSITION_START_DEADLINE   = within 24 hours after C2B1-X PASS
C2B1_DECOMPOSITION_COMPLETE_DEADLINE = within 7 calendar days after C2B1-X PASS

Không được hạ transitional identity thành backlog không thời hạn; nó chỉ là containment tạm thời, không có admin access.


14. Cleanup / no-production-mutation proof (§14)

  • Xoá (mission temp): restore container/volume/network (self-clean Stage B, residue 0/0/0), tmpfs GPG home + imported private key, downloaded ciphertext (/dev/shm/c2b1-precut residue 0), negative-control fixture + DB, stage scripts.
  • Giữ: encrypted off-site backup (Drive), meta.json, root-only checkpoint, git commit 714d4d5, H1 checkpoint, evidence work dir.
  • Zero production mutation: CONTAINERS_POST_SIG == PRE_SIG (2080e8be…c376), full diff empty, image identity unchanged (Nuxt không restart). Structural counts NOW == PRE (351/13/167/1497/1207/9). Chỉ SELECT + pg_dump read-only; directus_users.token không bao giờ đọc.
  • Residue 0: restore container/vol/net = 0; default keyring secret keys = 0; plaintext SQL from mission = 0; tmpfs c2b1 = 0.
  • Nightly pipeline nguyên vẹn: lock free, status vẫn PASS/COMPLETE (run 20260721T183701Z). Disk avail final 10.34 GiB (≈ baseline). Drive: 4 artifact nightly root + nuxt-image-rescue/ untouched; chỉ thêm c2b1-precut/<rid>/.

15. Exact gate opened

PASS_C2B1_HYB_B0_FRESH_RECOVERY_POINT_VERIFIED
  ⇒ opens: C2B1-HYB-S1   (chỉ mở đúng gate này)
STILL HELD: C2B1_ROTATION = HOLD ; TRANSITIONAL_IDENTITY chưa tạo ; consumer chưa repoint ; credential chưa rotate.
BEFORE C2B1-X: OWNER_EXTERNAL_DIRECTUS_ADMIN_CONSUMER_DECLARATION = REQUIRED.

Search terms

PASS_C2B1_HYB_B0_FRESH_RECOVERY_POINT_VERIFIED · C2B1_PRECUT · TRANSITIONAL_IDENTITY_PURPOSE · C2B1_DECOMPOSITION_COMPLETE_DEADLINE · OWNER_EXTERNAL_DIRECTUS_ADMIN_CONSUMER_DECLARATION

Provenance

run_id C2B1_PRECUT_20260722T083250Z · artifact sha256 ed1e7699…99f1 · Drive gdrive-backup:incomex-encrypted-v1/c2b1-precut/C2B1_PRECUT_20260722T083250Z/ · git 714d4d5 · checkpoint /root/c2b1-hybrid-precut-checkpoint-20260722T085250Z (sig 59335f29…9b4d). No secret payload or precise credential value appears in this report.

Back to Knowledge Hub knowledge/current-state/reports/c2b1-hybrid-b0-fresh-recovery-and-config-checkpoint-2026-07-22.md