coulomb-social/history/20261006T200726Z-reichelag-source-and-paired-recovery.md
tegwick b897aa1ee6
Some checks failed
Use-case regression gate / usecase-regressions (push) Has been cancelled
feat: prepare isolated recovery and guarded fresh ReichelAg capture
Assistant: codex
Assistant-Model: gpt-6.1-sol
Assistant-Session: 01a10e2d-a5ef-7e92-b03d-b1694e915680
2026-10-06 22:11:42 +02:00

5 KiB

ReichelAg first transfer: recovery prepared, fresh source needs login

User authorization and source state

Founder answered “yes go on” to current Bubble capture and first ReichelAg transfer following the empty-workspace assessment. New tegwick app sign-in and reset inbox receipt remain accepted. Authority for bounded app snapshot/quiesce: ADMINISTER @ realm:kubernetes/railiance01, activation=APPROVED; continue existing personal-app/brief-interruption approval and the current first-transfer go.

Initial Bubble capture returned public records and looked usable, but no private weekly protocols. Subsequent metadata inspection found expired Bubble signature cookie. No fresh ReichelAg protocol capture or live import is claimed. User asked to run scripts/capture-auth-state.sh privately and save a new authenticated session after opening the real protocol list. No password/session/reset values read into chat, Git or State Hub. Raw source dumps remain private temporary files.

Capture fixes

Existing exporter guessed the largest captured space, mixed an old seed by default, overwrote full records with partial responses and did not validate expired signature cookies. Added explicit target mode using the Space filter and Search action, disabling old seeds, retaining full fields across partial fresh responses, normalizing typed Bubble lookup references, awaiting response handlers and rejecting missing target protocols/body fields. Target mode defaults to Pages following the user-confirmed Spaces -> ReichelAg -> Pages journey; actual fresh authenticated protocol list still needs reconciliation.

Four synthetic Node tests cover typed references, expired signature/analytics distinction, partial-record preservation, and explicit target selection rejecting larger unrelated spaces or incomplete bodies. A pytest wrapper includes them in the repo gate. Current expired-session run exits2 before creating any output directory, so public inventory cannot silently become a real import tree.

Paired snapshot and isolated restore evidence

Node snapshot helper scripts/snapshot-content-and-db.py default server dry-run passed against the pinned cluster UID and revision11 image. Execute scopes pg_dump only to coulomb_social_db; app writers are paused, retained PVC mounted read-only by a separate pod with no credential projection or service selector. Pod removed and app1replica restored. Snapshot started19:34:18Z; total operation 53.73seconds; completed/app resumed. Public app health200 afterward.

Database dump49843bytes SHA256 26a1630db0a0603dff33a4f2cb128e5ca3bd914d953c335a0f941162dbddf2b3; content archive186bytes SHA256 7645781eca69efff473f67dcc736fde7e2a8a66a0172f59056ac57b651b19a25. Snapshot files mode0600, enclosing directory0700, private node/workstation/tmp. These are temporary rehearsal artifacts, not durable scheduled backup custody.

Restore helper scripts/restore-paired-snapshot.py validates artifact checksums, restores native PostgreSQL in a Docker internal network without published ports, compares every COPY row/table and sequence value, checks archive paths and file hashes. Exact app image retained; offline instance disables identity integrations. Initial production-pair restore:13tables/102rows, all data/sequences match, empty content confirmed, measured database/content restore4.26seconds.

Populate that isolated instance with the synthetic established weekly-call fixture: full copy, independently edited copy, an asset, owner/viewer/ungranted actors. Snapshot both stores with no writers running; restore into a second isolated PostgreSQL instance. Result:13tables/111rows,4content files, all logical data/sequence/file hashes match, measured restore3.92seconds. Restored Django checks: original and edited body matches; asset bytes and markdown render match; owner can read; viewer write with validCSRF denied403; outsider read denied. Both temporary database containers/internal networks removed afterward.

Four snapshot safety tests exercise default dry-run/no writes, corrupt dump and cleanup failures resuming the app, and private paired artifact creation. Restore unit checks exercise changed rows/sequences, incomplete COPY and archive escape. Full make check:96passed, including established Chromium workflows. Focused Ruff and Node syntax/capture tests pass.

Remaining live work

CSOC-WP-0008-T02 remains progress: establish retained backup custody/retention, measured real-content recovery and production rollback procedure; successful empty/synthetic recovery does not close actual corpus/visual/privacy acceptance. T03 waits fresh authenticated Bubble capture. After renewal, capture the correct current ReichelAg protocols, reconcile latest expected call and assets/privacy, rehearse import with tenant:platform and only the existing tegwick owner mapping, refresh paired snapshot before a reviewed live import, then validate visible space, latest protocol and explicit denied access. T09 is the user's copy/edit/ clipboard/mail-client acceptance; Bubble remains authoritative until accepted.