C2B-PRE-V3 — Xác minh run production tự nhiên đầu tiên (2026-07-20)
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
-
🟢 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.
-
🔴 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. -
🔴 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 quaset -echứ không quafail(), 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:
-
Cron entry sống — root crontab dòng 54:
37 20 * * * /opt/incomex/scripts/backup-to-gdrive.shCRON_TZ=Asia/Ho_Chi_Minhnằ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ẫydate -u -d "today 20:37"đã tránh; dùng epoch.) -
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 -
Script tại đường dẫn đó LÀ bản patched — sha256
35f1095a…d922b0, mtime2026-07-19T05:48:10Z, 265 dòng, khớp DOC-1. -
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) -
run_id trong status khớp run_id trong log —
20260719T183701Z-2534894, vàpid=2534894khớpCRON[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 2 ⇒ pipefail cho pipeline rc=2 ⇒ set -e giết script ngay tại dòng 115. Pipeline này không có || true.
Vì thoát qua set -e chứ không qua fail():
status_write FAILkhông chạy → status đóng băngRUNNING/PRECHECK- dòng log
DIRECTUS_DB_BACKUP FAILkhông in curl … status=downkhông gửi- chỉ
trap cleanup EXITchạy (im lặng):rm -rf "$WORK_DIR"→ chính nó làm mtime staging thành20: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_LOOP → script 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/ENCRYPT — sau đ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 +4 ⇒ giữ 3; dòng 250 (RETENTION) dùng tail -n +$((LOCAL_KEEP+1)) = tail -n +2 ⇒ giữ 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 20260705 → 20260718, 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:
- không tồn tại
vps-backup-20260719_* - 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ại ⇒ cleanup 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 và 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 -ekhông còn qua mặtfail()) — 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@ có 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ườngartifact_*_sha256rỗ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ằngpayload=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:
/dev/shm/.c2bprev3-pat-<pid>— pattern file token, 0600 tmpfs,trap shred -u. Đã xoá./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.