KB-2F54

C2B-PRE-V3 — Xác minh run production tự nhiên đầu tiên (2026-07-20)

25 min read Revision 1
c2b-prebackupdirectusencryptionverificationproductionread-only

C2B-PRE-V3 — XÁC MINH RUN PRODUCTION TỰ NHIÊN ĐẦU TIÊN

Ngày đo: 2026-07-20 (cửa sổ 02:42Z–02:52Z) Chế độ: READ-ONLY PRODUCTION VERIFICATION — không sửa, không trigger, không rotate Host: vmi3080463 (contabo, root) · uptime 157 ngày, không reboot trong cửa sổ điều tra


1. EXECUTIVE VERDICT

Run tự nhiên đầu tiên sau khi vá ĐÃ XẢY RA và ĐÃ KẾT THÚC, nhưng KHÔNG tạo được backup set nào.

CONTAINMENT_CONTROL_DEPLOYED   = PASS_FAIL_CLOSED_TESTED
NATURAL_SCHEDULER_PATH         = VERIFIED_PATCHED_PIPELINE
OFFSITE_PLAINTEXT_CONTAINMENT  = PASS
ENCRYPTED_BACKUP_RECOVERABILITY= FAIL
PRODUCTION_SERVICE_HEALTH      = PASS
BACKUP_STATUS                  = STALE
C2B_PRE_FINAL_STATUS           = FAIL_ENCRYPTED_BACKUP_NOT_PRODUCED
NEXT_ALLOWED_MISSION           = FIX_EXACT_OBSERVED_NATURAL_BACKUP_FAILURE
C2B1_ALLOWED                   = NO

Đây đúng Trường hợp A của §12 mission: scheduler gọi đúng patched pipeline, không có plaintext upload, nhưng encrypted backup fail. Không được đọc thành "rò rỉ đã mở lại". Rò plaintext offsite vẫn đóng.

Ba sự thật phải đọc cùng nhau

  1. 🟢 Containment giữ vững. Script chết nhưng chết sạch: 0 plaintext lên Drive, 0 artifact lịch sử bị xoá, 0 file rác để lại. Fail-closed đã được chứng minh bằng một lần fail thật trên production, không phải bằng harness.

  2. 🔴 Backup mã hoá không tồn tại. Prefix incomex-encrypted-v1/ vẫn chưa được tạo ra. Số backup set = 0. Không có gì để giải mã ⇒ recoverability FAIL, không phải INCONCLUSIVE.

  3. 🔴 Lỗi này là DEADLOCK VĨNH VIỄN, và nó IM LẶNG. Nguyên nhân gốc khiến script chết trước khi tạo file .gpg đầu tiên; mà điều kiện thoát lỗi lại cần một file .gpg đã tồn tại. Mọi đêm sau đều sẽ chết y hệt. Và vì chết qua set -e chứ không qua fail(), không có status FAIL, không có dòng log FAIL, không có heartbeat down.


2. NGUỒN VÀ BASELINE ĐÃ KHOÁ

Đọc đầy đủ (110.956 ký tự) hai report điều hành:

  • knowledge/current-state/reports/claude-c2b-pre-encrypt-directus-database-backup-2026-07-18.md (DOC-1)
  • knowledge/current-state/reports/claude-c2b-pre-v-prerun-gate-and-appendix-measurements-2026-07-19.md (DOC-2)
Baseline khoá Giá trị Đo lại hôm nay Khớp
patched script deployed 2026-07-19T05:48:10Z mtime 2026-07-19T05:48:10Z
patched script sha256 35f1095a8c70…d922b0 35f1095a8c70b91bc08a5d3a8f4a7284e58c7f222fe38ad009568056d3d922b0
last old-pipeline natural run 2026-07-18T18:37:01Z log + Drive artifact xác nhận
expected first patched fire 2026-07-19T18:37:00Z thực tế nổ 18:37:01Z
old plaintext artifact count 14 14
old plaintext total bytes 3.822.611.835 3.822.611.835 (byte-identical)
encrypted prefix count 0 backup set 0 (prefix chưa tồn tại)
old plaintext retention dormant dormant, 0 delete op
synthetic heartbeat (LOẠI TRỪ) 2026-07-19T04:10:46Z có, msg=probe — đã loại

Đính chính DOC-2 §6 đã áp dụng: kỳ vọng đúng là 0 → 2 .gpg + 0 → 2 .meta.json, KHÔNG phải "+1". Đọc trực tiếp script sống dòng 242–245 xác nhận vòng upload đẩy 4 file.


3. GATE — RUN TỰ NHIÊN ĐÃ KẾT THÚC THẬT

SCHEDULER_INVOCATION            = PROVEN
RUN_USES_POST_PATCH_TIME_WINDOW = YES   (18:37:01Z 07-19  >  05:48:10Z 07-19)
STATUS_TERMINAL_STATE           = RUNNING   ← ❌ KHÔNG phải PASS_OR_FAIL
COMPLETED_OR_FAILED_UTC         = ABSENT
BACKUP_PROCESS                  = NOT_RUNNING
SINGLETON_LOCK                  = NOT_HELD
FINAL_COMPONENTS                = NONE_PRODUCED
GROWING_PARTIAL                 = NO

Vì sao KHÔNG trả WAIT_FOR_FIRST_NATURAL_PRODUCTION_RUN: ba điều kiện WAIT của §3 là status file chưa tồn tại / process chưa chạy / run chưa kết thúc. Không điều nào đúng ở đây — status file tồn tại, process đã chạy, và run đã kết thúc dứt khoát (process chết, lock đã nhả, cron session đóng lúc 20:37:02 CEST). Đây là trạng thái terminal-nhưng-không-ghi-nhận, đúng nhánh BACKUP_STATUS=STALE mà §7 mission đã dự liệu. Do đó tiếp tục sang verdict, không DỪNG ở gate.

Quy tắc STALE_RUNNING của DOC-1 §22 được áp dụng đúng: status RUNNING + không tiến trình nào giữ lock ⇒ lần chạy trước đã chết. Không dùng PID đơn lẻ làm bằng chứng — PID 2534894 được đối chiếu bằng /proc/2534894 (không tồn tại) cộng với lock không có holder (lsof rc=1, fuser rc=1).

Nhận dạng run

NATURAL_RUN_ID    = 20260719T183701Z-2534894
SCHEDULED_UTC     = 2026-07-19T18:37:00Z
STARTED_UTC       = 2026-07-19T18:37:01Z
FINISHED_UTC      = 2026-07-19T18:37:02Z   (cron session closed; cleanup trap chạm staging .108)
DURATION_SECONDS  ≈ 1
TERMINAL_STATUS   = DIED_WITHOUT_TERMINAL_RECORD  (status đóng băng ở RUNNING/PRECHECK)
FAILED_STAGE      = PRECHECK  (dòng 114–119, pipeline dòng 115)

4. CHỨNG MINH SCHEDULER → PATCHED SCRIPT

Năm mắt xích độc lập, tất cả khớp:

  1. Cron entry sống — root crontab dòng 54:

    37 20 * * * /opt/incomex/scripts/backup-to-gdrive.sh
    

    CRON_TZ=Asia/Ho_Chi_Minh nằm ở dòng 56 — SAU dòng 54, nên dòng 54 chạy theo system TZ = Europe/Berlin (CEST +0200) ⇒ 20:37 CEST = 18:37 UTC. (Bẫy date -u -d "today 20:37" đã tránh; dùng epoch.)

  2. Journal cron gọi đúng đường dẫn (không suy từ tên artifact):

    Jul 19 20:37:01 vmi3080463 CRON[2534892]: (root) CMD (/opt/incomex/scripts/backup-to-gdrive.sh)
    Jul 19 20:37:01 vmi3080463 CRON[2534890]: session opened for user root
    Jul 19 20:37:02 vmi3080463 CRON[2534890]: session closed for user root
    
  3. Script tại đường dẫn đó LÀ bản patched — sha256 35f1095a…d922b0, mtime 2026-07-19T05:48:10Z, 265 dòng, khớp DOC-1.

  4. Log mang chữ ký chỉ bản patched mới in được (dòng 101 script):

    [2026-07-19 20:37:01 CEST] BACKUP START run_id=20260719T183701Z-2534894
      (client-side encrypted, recipient 31799F7AC051EBA68FB3F13BDCC1369B371837BA)
    
  5. run_id trong status khớp run_id trong log20260719T183701Z-2534894, và pid=2534894 khớp CRON[2534892] sinh ra tiến trình con.

NATURAL_SCHEDULER_PATH = VERIFIED_PATCHED_PIPELINE

Đã loại khỏi evidence: run 2026-07-18T18:37:01Z (script cũ) · harness /root/c2bpre-work/ · isolated test c2bpre-isolated-* · manual invocation · synthetic heartbeat 04:10:46Z.


5. NGUYÊN NHÂN GỐC — ĐÃ ĐO, KHÔNG SUY ĐOÁN

Cơ chế

Script sống, dòng 111–119 (khối LOCAL-PRUNE thêm ở PRECHECK để chặn ciphertext tích luỹ trên đĩa 88%):

for _pat in 'incomex-prod-directus-db-*.sql.gz.gpg' 'incomex-prod-vps-config-*.tar.gz.gpg'; do
  ls -1t ${STAGING_DIR}/${_pat} 2>/dev/null | tail -n +4 | while read -r _old; do
    rm -f "$_old" "$_old.meta.json"
    log "  [PRECHECK][LOCAL-PRUNE] deleted=$(basename "$_old")"
  done
done

Script chạy dưới set -Eeuo pipefail (dòng 19). Trên run đầu tiên, STAGING_DIR rỗng theo định nghĩa ⇒ glob không khớp ⇒ ls exit 2pipefail cho pipeline rc=2 ⇒ set -e giết script ngay tại dòng 115. Pipeline này không|| true.

Vì thoát qua set -e chứ không qua fail():

  • status_write FAIL không chạy → status đóng băng RUNNING/PRECHECK
  • dòng log DIRECTUS_DB_BACKUP FAIL không in
  • curl … status=down không gửi
  • chỉ trap cleanup EXIT chạy (im lặng): rm -rf "$WORK_DIR" → chính nó làm mtime staging thành 20:37:02.108

Đo xác nhận (probe cô lập, không chạm production)

Chạy trong /tmp/c2bprev3-probe-<pid>, tái dựng đúng construct, bash 5.2.21 y hệt host:

Điều kiện Kết quả
thư mục RỖNG (đúng trạng thái run đầu) PROBE_EXIT_CODE=2, không in REACHED_LINE_AFTER_PRUNE_LOOPscript chết
có sẵn 1 file .gpg mỗi loại in REACHED_LINE_AFTER_PRUNE_LOOP, rc=0 → sống
ls glob không khớp ls_rc=2

PROBE_CLEANUP=PASS — thư mục probe đã xoá. Probe không chạm bất kỳ đường dẫn backup/lock/status/remote nào.

Vì sao đây là DEADLOCK vĩnh viễn, không phải sự cố một lần

Điều kiện để vòng prune không giết script là staging phải có ít nhất một file .gpg. Nhưng file .gpg chỉ được tạo ở stage PG_DUMP/ENCRYPTsau điểm chết. Hệ tự khoá chính nó:

staging rỗng → chết ở PRECHECK → không tạo .gpg → staging vẫn rỗng → chết ở PRECHECK → …

⚠️ Hệ quả: run đêm nay 2026-07-20T18:37:00Z sẽ chết y hệt, và mọi đêm sau nữa, cho đến khi được vá. Backup offsite hiện đã chết hoàn toàn và artifact offsite mới nhất già thêm 1 ngày mỗi ngày.

Phân loại

Đây là lần thứ 4 cùng một lớp lỗi pipefail + errexit trong chuỗi mission này (DOC-1 §23 ghi 3 lần: gpg --list-packets exit 2; SIGPIPE 141 gán sai stage; retention starvation). Trớ trêu: khối gây lỗi chính là Lỗi 3 tự phát hiện và sửa chủ động ở DOC-1 §23 — bản vá cho một bẫy pipefail lại rơi vào đúng bẫy pipefail. Bản vá đó chưa từng được chạy với staging rỗng trước khi deploy.


6. HỢP ĐỒNG BACKUP SET (đọc từ script sống, không sửa)

EXPECTED_GPG_COMPONENTS          = 2
EXPECTED_METADATA_COMPONENTS     = 2
EXPECTED_COMPONENTS_PER_BACKUP_SET = 4
EXPECTED_NAMING_RELATION   = <artifact>.meta.json  đi kèm từng .gpg
EXPECTED_TIMESTAMP_RELATION= cả 4 file chia sẻ cùng TS_UTC  (date -u +%Y%m%dT%H%M%SZ)
EXPECTED_RUN_ID_RELATION   = RUN_ID="${TS_UTC}-$$" ghi trong CẢ HAI meta.json
incomex-prod-directus-db-<TS_UTC>.sql.gz.gpg   + .meta.json
incomex-prod-vps-config-<TS_UTC>.tar.gz.gpg    + .meta.json
→ gdrive-backup:incomex-encrypted-v1/

Giải quyết mâu thuẫn DOC-1 §23 ("giữ 3") vs DOC-2 §15 (LOCAL_KEEP=1): cả hai đều đúng, khác stage. Dòng 115 (PRECHECK prune) dùng tail -n +4giữ 3; dòng 250 (RETENTION) dùng tail -n +$((LOCAL_KEEP+1)) = tail -n +2giữ 1.

Kết quả kiểm

COMPLETE_BACKUP_SET_INCREMENT = 0
EXPECTED_COMPONENT_COUNT      = 4
OBSERVED_COMPONENT_COUNT      = 0
ORPHAN_COMPONENT_COUNT        = 0
PARTIAL_COMPONENT_COUNT       = 0

7. STATUS · PROCESS · LOCK

Nội dung /var/lib/incomex/backup-status/directus-db-backup.status (313 B, root 0600, mtime 2026-07-19T18:37:01Z):

run_id=20260719T183701Z-2534894
pid=2534894
started_utc=20260719T183701Z
last_attempt_utc=20260719T183701Z
last_success_utc=never          ← chưa từng có lần thành công nào
status=RUNNING                  ← ĐÓNG BĂNG, stale 8 giờ
stage=PRECHECK
artifact_db=                    (rỗng)
artifact_db_sha256=             (rỗng)
artifact_cfg=                   (rỗng)
artifact_cfg_sha256=            (rỗng)
recipient_fpr=31799F7AC051EBA68FB3F13BDCC1369B371837BA
error_class=                    ← rỗng: fail() KHÔNG chạy
payload=REDACTED
BACKUP_STATUS = STALE
PID_2534894   = DOES_NOT_EXIST            (/proc/2534894 vắng)
LOCK_HOLDER   = NONE                      (lsof rc=1, fuser rc=1 — KHÔNG tạo/acquire lock)
PROCESS_SCAN  = 0 hit                     (quét /proc/*/cmdline, tự loại trừ $$, không dùng pattern tự khớp)

Log markers toàn file (8.747.703 B):

BACKUP START run_id=       : 1
DIRECTUS_DB_BACKUP PASS    : 0
DIRECTUS_DB_BACKUP FAIL    : 0
ALREADY_RUNNING            : 0

Toàn bộ dấu vết run 07-19 trong log đúng 2 dòng (157577–157578): dòng phân cách + BACKUP START. Sau đó im lặng tuyệt đối.

Fail-visible ĐÃ THẤT BẠI — và Kuma bị hoãn báo động

HEARTBEAT_SEMANTICS = AFTER_UPLOAD_WITHOUT_REMOTE_VERIFY   (không đổi)
HEARTBEAT_EMITTED_BY_FAILED_RUN = NONE

Kuma monitor id=14 "PG Backup GDrive" (type=push, active=1, interval=90000s = 25h), đọc kuma.db với mode=ro, không ping:

1322834 | up | 2026-07-19 04:10:46 | probe            ← SYNTHETIC (loại trừ)
1318396 | up | 2026-07-18 18:38:48 | OK archive=259M  ← heartbeat THẬT cuối cùng (script CŨ)
1307221 | up | 2026-07-17 18:38:43 | OK archive=259M

Run 07-19 không phát heartbeat nào — không OK+encrypted, cũng không status=down.

🔴 Đo được hệ quả của heartbeat synthetic:

Thời điểm Kuma chuyển DOWN
nếu chỉ có heartbeat thật cuối (18:38:48Z 07-18) 2026-07-19T19:38:48Z — tức ~1h sau khi run fail
thực tế, do probe 04:10:46Z reset đồng hồ 2026-07-20T05:10:46Z

báo động bị hoãn ≈ 9 giờ 32 phút. Tại thời điểm đo (02:51Z) Kuma vẫn đang xanh và sẽ chỉ chuyển đỏ sau ~2,3 giờ nữa. Đây là hậu quả đo được của sai sót mà DOC-1 §40 đã tự khai ("Lẽ ra tôi nên kiểm gián tiếp. Không lặp lại."). Mission này không ping, không sửa Kuma.


8. REMOTE SET + AN TOÀN ARTIFACT LỊCH SỬ

Prefix mã hoá

rclone lsf gdrive-backup:incomex-encrypted-v1/
  → ERROR: directory not found
ENCRYPTED_PREFIX_STATE = DOES_NOT_EXIST
COMPLETE_BACKUP_SETS   = 0

Prefix chỉ được tạo khi rclone copyto chạy ở stage UPLOAD — script chết ở PRECHECK nên chưa bao giờ tới.

Artifact plaintext lịch sử — BẤT BIẾN

OLD_PLAINTEXT_ARTIFACT_COUNT_PRE  = 14
OLD_PLAINTEXT_ARTIFACT_COUNT_POST = 14
OLD_PLAINTEXT_TOTAL_BYTES         = 3.822.611.835   (byte-identical với baseline)
HISTORICAL_DELETE_OPERATION       = 0

Danh sách đầy đủ, liên tục 2026070520260718, không có khoảng trống, không có 20260719:

vps-backup-20260705_203701.tar.gz … vps-backup-20260718_203701.tar.gz   (14 file)

Hai bằng chứng độc lập rằng không có plaintext mới nào lên Drive:

  1. không tồn tại vps-backup-20260719_*
  2. artifact cũ nhất vẫn là 20260705 — nếu có file mới thêm vào, retention cũ (count-based, ngưỡng đúng 14) sẽ lập tức xoá 20260705. Nó còn nguyên ⇒ chứng minh gián tiếp rằng không có gì được thêm.
OFFSITE_PLAINTEXT_CONTAINMENT = PASS

9. QUÉT PLAINTEXT VÀ KNOWN-SECRET

Dùng đúng kỷ luật đã chứng minh (DOC-1 §30): pattern file chứa giá trị token đặt trong /dev/shm 0600, khớp bằng grep -F -f <file> nên giá trị không bao giờ vào argv, cleanup bằng trap + shred -u.

Trích 13 static token sống từ directus_users (13/13 user có token — khớp baseline).

CIPHERTEXT_KNOWN_SECRET_MATCH  = 0   (N/A — 0 ciphertext component tồn tại)
METADATA_KNOWN_SECRET_MATCH    = 0   (N/A — 0 metadata component tồn tại)
UPLOAD_STAGING_PLAINTEXT_COPY  = 0   (staging rỗng: 0 file)
BACKUP_TEMP_PLAINTEXT_COPY     = 0   (0 thư mục work-*)
ABANDONED_PARTIAL_COUNT        = 0
LOG_STATUS_SECRET_MATCH        = 0   (quét TOÀN BỘ 8.747.703 B log + status file)
PROCESS_ARGV_SECRET_EXPOSURE   = 0   (không có backup process nào chạy)

Sweep .partial dùng đúng lệnh DOC-2 §7:

find /var/lib/incomex /opt/incomex/backups /tmp /var/tmp -maxdepth 3 \
     \( -name "*.partial" -o -name "incomex-prod-*" \)
→ sweep_hits = 0

Thư mục status chỉ chứa 2 file hợp lệ, không có .status.XXXXXX sót lạicleanup trap đã chạy đúng.

⚠️ Lưu ý phương pháp: fingerprint trong report này là sha256 12-hex đầu, KHÁC với HMAC-16hex ephemeral của DOC-1 (khoá HMAC đã shred, không tái tạo được). Không so trực tiếp hai bộ fingerprint. Cross-check nội bộ: fingerprint admin token 4d1f0a095ab6 khớp giá trị đã ghi trong memory nuxt-403-identity-denial-map — nhất quán.

Không khảo sát lại 8 plaintext dump local. Không coi live Directus DB là bản sao trái phép.


10. RECOVERABILITY — KHÔNG THỂ KIỂM VÌ KHÔNG CÓ GÌ ĐỂ KIỂM

ENCRYPTED_BACKUP_RECOVERABILITY = FAIL
DIRECTUS_DUMP_COMPLETE          = NO   (không có dump nào được tạo)
TABLE_COUNT                     = N/A  (kỳ vọng đã chứng minh: 385 CREATE TABLE)
KNOWN_TOKEN_RECOVERY_COUNT      = N/A  (kỳ vọng: 13/13)
VERIFICATION_TEMP_CLEANUP       = PASS (chỉ probe /tmp, đã xoá)

Chủ động KHÔNG materialize khoá riêng. Không có ciphertext nào để giải mã, nên chạy gcloud secrets versions access sẽ chỉ đặt khoá riêng RSA4096 lên đĩa VPS mà không thu được bằng chứng nào — theo đúng tiền lệ read-only DOC-2 §13.

PRIVATE_KEY_MATERIALIZED               = NO
ARTIFACT_DOWNLOADED                    = NO
HISTORICAL_PLAINTEXT_ARTIFACT_DOWNLOAD = NO
HOLD_VERIFICATION_DISK_HEADROOM        = N/A (không tải gì)

Giữ nguyên câu ĐÚNG (không dùng câu CẤM):

PRIVATE_KEY_PERSISTED_ON_VPS            = NO
VPS_SERVICE_ACCOUNT_CAN_FETCH_PRIVATE_KEY = YES
ROOT_VPS_CAN_CURRENTLY_RETRIEVE_KEY     = YES

🔴 Tình trạng DR thực tế (§13 mission yêu cầu đo)

NEWEST_PROVEN_RESTORABLE_OFFSITE_PRODUCTION_BACKUP_UTC = NONE

Chưa từng có artifact offsite production nào được chứng minh phục hồi được. Hai lần decrypt PASS trong DOC-1 là (a) test local và (b) artifact isolated c2bpre-isolated-20260719T055642Z đã bị xoá sau test — không phải backup production.

Artifact offsite production mới nhất đang tồn tại:

vps-backup-20260718_203701.tar.gz   @ 2026-07-18T18:37:01Z   (271.385.746 B)
NEWEST_EXISTING_OFFSITE_PRODUCTION_BACKUP_AGE_DAYS = 1.34
RESTORABILITY = UNPROVEN  (và CẤM kiểm: nó là plaintext chứa 13 token sống;
                           tải về sẽ tự tay tạo thêm một bản sao plaintext)

Con số 1.34 ngày này sẽ tăng 1 mỗi ngày cho tới khi bug được vá, vì không backup mới nào được tạo ra.


11. ĐĨA VÀ SỨC KHOẺ PRODUCTION

PRODUCTION_SERVICE_HEALTH   = PASS
CONTAINER_MUTATION_BY_MISSION = 0
SERVICE_RESTART_BY_MISSION    = 0
DISK_RISK_AFTER_RUN         = ELEVATED
Mục Đo
Directus /server/health {"status":"ok"} trên cả hai network (172.19.0.5, 172.18.0.4)
PostgreSQL /var/run/postgresql:5432 - accepting connections
Container 11 container Up; incomex-directus healthy 2 tháng, postgres healthy 3 tháng
Đĩa 89% dùng · 85G/96G · 12G trống · inode 9%
Đĩa (backup tiêu thụ) 0 byte — run chết trước khi tạo file
Plaintext dump local 8 file, 911M (backlog đã biết, cron 02:27 độc lập, không đụng)

Đĩa 89% (DOC-2 đo 89%) — không đổi trong cửa sổ này vì backup không chạy. Đánh dấu ELEVATED chứ không HOLD: 12G trống vẫn đủ cho một backup set (~515 MB peak local).

Directus qua public edge trả 404 — không phải lỗi Directus. Đó là Nuxt trả 404 JSON cho /server/health; Directus không mount ở path đó trên edge. Health thật đã lấy trực tiếp qua container network.


12. VERDICT TÁCH BIỆT

CONTAINMENT_CONTROL_DEPLOYED    = PASS_FAIL_CLOSED_TESTED
NATURAL_SCHEDULER_PATH          = VERIFIED_PATCHED_PIPELINE
OFFSITE_PLAINTEXT_CONTAINMENT   = PASS
ENCRYPTED_BACKUP_RECOVERABILITY = FAIL

Đúng Trường hợp A §12. Diễn giải bắt buộc:

Scheduler gọi đúng patched pipeline, không có plaintext upload, nhưng encrypted backup fail. KHÔNG nói rò rỉ đã mở lại.

⚠️ Chú thích quan trọng cho nhãn PASS_FAIL_CLOSED_TESTED: fail-closed đã được chứng minh thật (0 plaintext, 0 xoá, 0 rác). Nhưng invariant fail-visible mà chính script tuyên bố ở dòng 15 ĐÃ THẤT BẠI: không status FAIL, không log FAIL, không heartbeat down. Đừng để chữ PASS che khuất điều này — chế độ hỏng hiện tại là im lặng.


13. MISSION KẾ TIẾP

C2B_PRE_FINAL_STATUS = FAIL_ENCRYPTED_BACKUP_NOT_PRODUCED
C2B1_ALLOWED         = NO
CREDENTIAL_ROTATION_BLOCKED = YES
NEXT_ALLOWED_MISSION = FIX_EXACT_OBSERVED_NATURAL_BACKUP_FAILURE

Vì sao chặn C2B1 (giữ nguyên lập luận DOC-2 §15): xoay credential trước khi backup mã hoá được chứng minh phục hồi được sẽ đẩy hệ vào trạng thái backup mới nhất có thể không giải mã được credential cũ đã mất — không có đường lùi. Hiện tại còn tệ hơn giả định của DOC-2: không có backup mã hoá nào tồn tại.

Không chèn survey khác trước C2B1. Không tự soạn hoặc chạy C2B1. Mission này không sửa lỗi đã tìm ra.

Trình Owner lựa chọn

Phạm vi lỗi đã khoanh chính xác tới một pipeline, một dòng (dòng 115, khối 114–119). Owner chọn:

  • (A) Vá tối thiểu khối PRECHECK-prune cho tolerant với staging rỗng, rồi chờ run tự nhiên 2026-07-20T18:37:00Z xác minh. Chậm nhất, sạch nhất, không cần quyền chạy tay.
  • (B) Vá rồi OWNER_APPROVED_ONE_MANUAL_ENCRYPTED_BACKUP ngay để rút ngắn cửa sổ DR (hiện đã 1.34 ngày và đang tăng, với recoverability chưa từng được chứng minh trên artifact production).
  • (C) Vá đồng thời cả defect fail-visible (để set -e không còn qua mặt fail()) — khuyến nghị gộp vào cùng lần vá, vì chính defect này khiến sự cố tồn tại 8 giờ mà không ai biết.

Khuyến nghị: (A)+(C) cùng một lần vá. Lý do: (B) rút ngắn được ~1 ngày DR nhưng đánh đổi bằng một lần chạy tay trên production; trong khi (C) là thứ quyết định lần sau hỏng có ai biết hay không — giá trị lâu dài cao hơn hẳn. Nếu Owner coi cửa sổ DR là rủi ro cấp bách thì thêm (B).

⚠️ Nếu không vá gì: run 2026-07-20T18:37:00Z đêm nay sẽ chết y hệt, im lặng, và Kuma sẽ chuyển đỏ lúc 05:10:46Z hôm nay (~2,3h nữa) — đó sẽ là tín hiệu đầu tiên và duy nhất.


14. BACKLOG ĐÃ BIẾT — KHÔNG AUDIT LẠI

Mục Trạng thái
incomex-nuxt tự restart StartedAt=2026-07-19T12:15:26Z, ExitCode=0, RestartCount=79. Restart xảy ra 06h22m TRƯỚC run backup, không liên quan. Không mission command nào tác động. Giữ ở backlog.
8 plaintext dump local /opt/incomex/backups/pg/ ~911M cron 02:27 độc lập, local-only. Không khảo sát.
HISTORICAL_DIRECTUS_DUMP_EXPOSURE REMAINS_CREDENTIALS_STILL_VALID — 14 dump plaintext trên Drive vẫn chứa static token còn hiệu lực. Encryption chỉ ngăn tạo thêm plaintext; không thu hồi credential đã phát tán.
DIRECTUS_OFFSITE_BACKUP_SCOPE DATABASE_DIRECTUS_ONLY — 4 DB khác + Qdrant không có backup offsite được chứng minh.
cursor-ci-builder@versions.access trên cả khoá riêng Directus + Lark, no-passphrase. Ngoài phạm vi.
Telegram VPS monitoring TELEGRAM_VPS_MONITOR_INSPECTION=NO, TELEGRAM_VPS_MONITOR_MUTATION=NO. (Ghi chú: hai report nguồn không nhắc Telegram; monitoring chỉ có Uptime Kuma.)
Nuxt 403 / C2B1 admin dependency Ngoài phạm vi mission này.

15. ĐƯỜNG DẪN BẰNG CHỨNG

/opt/incomex/scripts/backup-to-gdrive.sh          sha256 35f1095a…d922b0, mtime 2026-07-19T05:48:10Z
/var/lib/incomex/backup-status/directus-db-backup.status   313 B, mtime 2026-07-19T18:37:01Z
/var/lib/incomex/backup-status/.directus-db-backup.lock    0 B, không holder
/var/lib/incomex/backup-staging/                  RỖNG, mtime 2026-07-19T18:37:02.108Z (dấu vết cleanup trap)
/opt/incomex/logs/backup-gdrive.log               dòng 157577–157578 (toàn bộ dấu vết run 07-19)
journalctl                                        CRON[2534892] Jul 19 20:37:01 CEST
crontab -l (root)                                 dòng 54 = lịch; dòng 56 = CRON_TZ (SAU)
/opt/incomex/uptime-kuma/kuma.db                  monitor 14, đọc mode=ro
gdrive-backup:                                    14 × vps-backup-*, 3.822.611.835 B
gdrive-backup:incomex-encrypted-v1/               KHÔNG TỒN TẠI
/tmp/c2bprev3-probe-<pid>/                        probe cô lập, ĐÃ XOÁ

16. PAYLOAD=REDACTED PROOF

  • Status file chứa đúng dòng payload=REDACTED; các trường artifact_*_sha256 rỗng vì chưa có artifact.
  • write_meta() (dòng 220–236) nhúng "payload": "REDACTED" vào mọi sidecar — chưa sidecar nào được tạo.
  • Mọi dòng log verdict (fail() dòng 91, PASS dòng 261) đều kết thúc bằng payload=REDACTED.
  • Report này không chứa giá trị token, khoá riêng, hay OAuth token nào. Chỉ có fingerprint sha256 12-hex một chiều.
  • Giá trị secret không bao giờ vào argv trong toàn bộ mission (grep -F -f /dev/shm/<file> 0600 + trap shred).

17. KẾT THÚC BẮT BUỘC

MANUAL_BACKUP_TRIGGER          = NO
BACKUP_TEST_HARNESS_RUN        = NO
HEARTBEAT_PING                 = NO
TELEGRAM_TEST                  = NO
TELEGRAM_MONITOR_CHANGE        = NO
BACKUP_SCRIPT_CHANGE           = NO
CRON_CHANGE                    = NO
LOCK_FILE_CREATION_FOR_TEST    = NO
RETENTION_CHANGE               = NO
REMOTE_ARTIFACT_DELETE         = NO
DIRECTUS_CREDENTIAL_CHANGE     = NO
SECRET_MANAGER_MUTATION        = NO
IAM_MUTATION                   = NO
CONTAINER_MUTATION_BY_MISSION  = NO
SERVICE_RESTART_BY_MISSION     = NO
DIRECT_DB_WRITE                = NO
GITHUB_PUSH                    = NO
DOCKER_CLEANUP                 = NO
C2B1_EXECUTED                  = NO

Ghi nhận minh bạch — thao tác ghi duy nhất của mission:

  1. /dev/shm/.c2bprev3-pat-<pid> — pattern file token, 0600 tmpfs, trap shred -u. Đã xoá.
  2. /tmp/c2bprev3-probe-<pid>/ — probe ngữ nghĩa bash cô lập, không chạm đường dẫn production nào. Đã xoá (PROBE_CLEANUP=PASS).

Cả hai đều thuộc diện "cleanup verification temp material do mission tạo" (§2 mission cho phép). Không có ghi nào lên đường dẫn backup, status, lock, cron, remote hay DB.

DỪNG sau báo cáo.

Back to Knowledge Hub knowledge/current-state/reports/claude-c2b-pre-first-natural-production-run-verification-2026-07-20.md