Receipt — prod adoption: vexa-production becomes subscriber #1
Date 2026-08-25 · Cluster LKE590708 (production) · Channel vexa-internal · Pin 0.1.0-estate.20260825.rev139 (entry seq 2, sha256:88acf796…) · Status: ADOPTED — soak window open until 2026-08-26 EOD
This executes the prod migration plan. Founder authorization: commitments 1–5 + both deviations (“1-7 yes, snapshot-only”), then the pin act verbatim: “pin approved, 1-4 yes”.
The headline numbers
- 36/36 pods kept their UID across the adoption sync (the single delta was a CronJob’s scheduled-run churn between captures).
- 111 ReplicaSets before, 111 after — zero new. The newest RS in the namespace predates the sync by 5 hours (it is the 14:17Z rev-139 deploy). No pod template changed anywhere.
- App:
Synced / Healthy / Succeeded.vexa.ai/api/version200 throughout, serving27b513d/ v0.12.23. - PVs: 25, all Retain; 8 Released; same 3 Bound in vexa-production. None created, deleted, or rebound.
What was done, in order
- Freeze announced to the concurrent prod-writing session (6.1).
- Before-state captured at helm rev 139 (pods, 13 generations, 18-ref digest map, manifest, values, PVs) (6.2).
- P6 fresh DB snapshot via the estate’s own backup CronJob:
s3://<backup-bucket>/db/<estate>/<snapshot>.sql.gz(172.3 MB). Snapshot-only per founder word; restore-test deferred. - P2 Argo CD v3.5.1 →
argocdns,resourceTrackingMethod: annotationset before any Application existed; pool toleration mirrored from prod workloads. Inert: 13/13 generations unchanged. - P3 Kyverno v1.19.0 →
kyvernons, zero policies → zero resource webhooks; dry-run admission probe untouched. Inert: generations unchanged. - Contract
vexa-contract-prod= the estate contract (vexa-internal-estate-2026-08) + channel pubkey installed in vexa-production. - Candidate entry seq 2 published (separate publisher receipt:
publish-receipt-139.md): 18/18 pins mirrored+signed, render-diff empty,currentNOT moved. - 6.3–6.5 Application
vexa-prodcreated sync-disabled; fullargocd app diff: fatal four all zero (no selector / image / Secret diffs; LB Service + PVC label-only). Residual diff =helm.sh/chartlabels +tracking-id+ one CronJob jobTemplate label (future Jobs only). Caddychecksum/caddyfileneutralized viaignoreDifferences+RespectIgnoreDifferences=true— live value0a795750…verified preserved post-sync. - 6.6 Sync with ServerSideApply. Result: headline numbers above.
- 6.7
vexa-platform-drift-detectorsuspended. Helm release secrets left in place (10 revisions of history). Nohelm uninstall, ever.
Deviations, named
- Generations ticked +1 on all 13 Deployments while RS set and pod UIDs stayed identical: SSA’s first apply took co-ownership and normalized spec serialization — a spec write, not a rollout. The plan’s generation metric was a proxy; the RS/UID ground truth is the adoption invariant and it held.
- Adoption values carry inline secrets (the live estate’s legacy shape) inside the Application spec — in-cluster only, same values the helm release secret already stores. Follow-up: move estate secrets to k8s Secrets via a planned, receipted rollout.
- In-cluster PreSync verifier not active for this sync (entry verified publisher-side: T1/T2 + offline checks). First post-adoption change: enable verifier + flip entries to
publishedwith named approver, per the estate contract’s own inline note. vexa_channel.py verifycannot verify platform-estate entries (crashes on absent delivery-receipt) — pre-existing gap, also fails on seq 1; to file.- Staging-verdict clause deferred until staging lives (platform#349, founder A/B pending).
Rollback
Pin move back to seq 1 (0.1.0-estate.20260825), re-approve, sync — or full exit: delete Application cascade=false, helm rollback vexa-platform 138. DB snapshot above. Schema delta: none (billingLedgerMigration disabled; hook renders nothing — proven twice today).