Record rejected historical backup, verified fresh capture and worker activation
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s

Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a06ecb-456a-71c2-b41e-0755d336e883
This commit is contained in:
codex 2026-09-05 22:35:20 +02:00
parent 34b9385bee
commit 195a51a62c
7 changed files with 166 additions and 7 deletions

View file

@ -0,0 +1,62 @@
# WP-0029 real offsite recovery — 2026-09-05
User authorized executing WP-0029. A real September 4 encrypted Forgejo backup
was uploaded through Backup's create-only share (201), independently downloaded
as owner (200), compared byte-for-byte and decrypted. ZIP validation then rejected
it: it has a ZIP header but lacks a complete archive directory. It cannot support
application recovery. Evidence is `docs/evidence/RPF-WP-0029-rejected-backup-2026-09-05.json`.
No conclusion about every other historical backup is inferred from this sample.
The previous capture code accepted nonempty archive files after its polling
limit, did not require the dump's successful exit, and did not validate the full
transfer or ZIP integrity. Replaced it with an exact-process completion marker,
per-chunk length checks, producer/receiver SHA-256 equality and ZIP CRC validation
before encryption. A new live dump completed at 5,351,717,533 bytes, passed producer/transfer hash
and ZIP CRC validation, and contains 142 repository HEAD entries. It is encrypted
in private staging; drill-created local plaintext and producer temporary files
were removed. Its size materially constrains
the dedicated account's 10 GiB retention capacity.
Prepared isolated local recovery with pinned Forgejo 11.0.3/PostgreSQL 16 images,
internal-only Docker network, no host ports, disposable database credentials,
independent application configuration, and required fetched-artifact hash receipt.
The old infra drill's missing-file production-dump fallback and copied production
credentials are not used. Database import, application startup, repository clone
and package-blob integrity remain live acceptance gates until their receipt passes.
Old-share invalidation requires Bernd's owner confirmation or protected owner
custody coordinates; requested without asking for a password in chat. Neither
the existing age-key exposure record nor retained backups may be silently cleared.
Implementation validation: 200 repository tests passed. Live completion and
cleanup receipts will be appended when available; this entry is not closure.
## Resume boundary and runtime delivery
A fresh OpenBao login for the predecessor check failed before command handoff;
revocation could not be confirmed. No probe/provider mutation ran in that attempt.
It is terminal and cannot be reused. The validated backup still needs a fresh
attended upload/download/decrypt session followed by isolated restore.
Encrypted staging: `/tmp/rpf-wp0029-restore/forgejo-dump-20260905-verified.zip.age`.
Use `verify_nextcloud_offsite_restore.py` with this source, a new private directory
and receipt; then `restore_forgejo_offsite_locally.py --archive <directory>/fetched.zip
--transfer-receipt <receipt> --receipt <new-restore-receipt>`. Both scripts are
committed. The latter requires the hash-bound downloaded artifact. Retain the
encrypted staging until acceptance; remove fetched plaintext after the drill.
The rejected candidate's newly created offsite object is
`forgejo/wp0029-recovery-forgejo-dump-20260904T001507Z.zip.age`; remove only this
failed test copy through owner authority, preserving original historical backups.
The worker source check found the old capture script still mounted and the new
helper absent. Delivered immutable ConfigMap `backup-verified-0220ca56520c`, with
an entry-point wrapper and the complete reviewed backup helper/library bundle.
The worker rolled successfully and all four delivered source hashes match.
No host checkout was edited. This compatibility delivery is source-owned in
`scripts/deploy_verified_backup_bundle.py`; broader package ownership remains T06.
Evidence: `docs/evidence/RPF-WP-0029-worker-bundle-2026-09-05.json`.
T02 remains waiting for attended access, actual offsite application restore and
old-share owner invalidation. No full recovery, old-token rejection or age-key
exposure closure is claimed. Fresh archive and rejection receipts are persisted.