# Core Hub private shadow evidence — 2026-08-21 ## Scope and safety boundary This record covers the private Core Hub relocation shadow on railiance01 for `RPF-WP-0021`. Public Ingress was absent throughout. The CoulombCore writer, public routing, DNS, and source runtime were not changed or retired. No secret value is included in this record. ## Credential custody and isolation - State Hub decision `4f70311b-a4c4-4959-b1a1-cdd1be97d523` was approved by the platform operator / Core Hub owner at `2026-08-20T22:02:19Z`. - An attended OpenBao OIDC session carried `platform-admin`; the policy and Kubernetes-auth role for `CCR-2026-0013` were applied without displaying a protected value. - The existing API token moved directly from source Kubernetes custody into `platform/workloads/core-hub/runtime`; it was neither copied through a staging file nor printed. - `openbao-core-hub-runtime` and `openbao-core-hub-database` reported `Ready=True`, reason `Valid`. The API-token, runtime-database, and migration-database ExternalSecrets each reported `Ready=True` and used disjoint target Secrets. - A disposable outside namespace could use neither ClusterSecretStore and created no target Secret. A Kubernetes-auth probe could read only the exact Core Hub KV data/metadata paths and was denied on sibling and parent paths. - A runtime database lease connected and read but could not create objects or inherit `core_hub_migrate`. A migration lease created and dropped a bounded probe table. Probe tokens, pods, Secrets, and namespace were removed. ## Logical shadow restore and reconciliation - The consistent source archive was captured at `2026-08-20 22:12:26 UTC` while the source writer remained live. - Archive size: `22175` bytes. - SHA-256: `3770946a1032c4109fea32fc00f4411c2f4d9311a28fb17bfc3d0d2de888db8b`. - Source and restored target matched at Alembic revision `20260627_0002`, eight tables, and 39 rows before shadow smoke activity. Per-table counts were `1, 3, 10, 2, 2, 3, 2, 16`. - The source archive used `public`; all eight restored tables were moved into the accepted `core_hub` schema under the migration lease. Reconciliation confirmed `core_hub_owner` ownership, runtime SELECT grants on every table, and owner membership for the migration role. ## Package, deployment, and migration - `rapp-postgres` published the Core Hub database-engine roles and ESO policy in `cfde57a`; the live provisioner completed successfully. - `rapp-core-hub` added migration-only database/DNS egress in `1cedab2` and a fail-closed owned-port verifier in `8d729fd`. - Live rotation exposed that watcher exit 75 caused scheduled pod CrashLoopBackOff. The shadow runtime was temporarily stabilized at a 20-minute refresh interval while the source package was corrected. - `rapp-core-hub` chart `0.3.1`, commit `7cfa8bb`, keeps its PID 1 watcher alive and restarts only the child with a freshly constructed environment. All nine package tests, Helm lint, deterministic rendering, and package checks passed. - Helm release `core-hub` revision 2 reported `deployed`; the private API Deployment was Ready, the migration Job completed, all three package NetworkPolicies were present, and no Ingress existed. ## Credential rotation and private smoke - A forced database lease refresh changed the runtime Secret resourceVersion. The application child PID changed while the pod name and UID stayed fixed, container restart count stayed `0 -> 0`, and readiness returned `true`. - The intended ExternalSecret interval was restored to five minutes. The next scheduled reconcile at `2026-08-20T22:45:01Z` left the pod Ready with the same UID and zero container restarts; no CrashLoop behavior recurred. - The hardened package verifier passed on an owned, unused private port. - Authenticated deployed-smoke run `20260820224419-43dc05` completed at `2026-08-20T22:44:20Z`. All ten checks passed: health, readiness, OpenAPI, four public catalogs, unauthenticated 401 enforcement on protected routes, and operator-authenticated protected reads/writes. Its temporary token file was mode 0600 and shredded on exit. ## Scheduled rotation stabilization observation - At `2026-08-21T22:23:39Z`, after more than six hours of live stabilization, both five-minute hub-core database ExternalSecrets completed another scheduled reconciliation with `Ready=True` / `SecretSynced`. - The runtime target Secret resourceVersion advanced from `50635316` to `50636878`; the migration target advanced from `50635319` to `50636875`. Only metadata was observed; neither Secret data nor a credential value was read or logged. - After projected-volume propagation, the candidate application child PID changed from `224` to `278`. The pod UID remained `64bfd630-4f9c-4df8-9939-c737bd5c5a8a`, readiness remained true, and its container restart count remained zero. The `openbao-core-hub-database` ClusterSecretStore remained `Ready=True` / `Valid`. - This closes the deliberate scheduled-rotation stabilization gate in `RAILIANCE-WP-0023-T02` without forcing a refresh or disrupting the pod. `CCR-2026-0013` is verified. Public promotion, final write freeze/transfer, DNS changes, and CoulombCore retirement remain separate operator gates under `CORE-WP-0011`.