throwaway (cluster id and name in the session log, not here). Registry: in-cluster registry:3 with a self-signed cert. Signing: an
ephemeral test key (the real key ceremony is a founder gate). No production credential was used
at any point.
1 · What is implemented
Publisher (publisher/vexa_channel.py)
Verified in the packaged chart:
vexa-0.12.23.tgz carries
gateway.image.tag: v0.12.23@sha256:514ba270… (and the same shape for admin-api, meeting-api,
runtime, agent-api, terminal) plus runtime.browserImage: vexaai/vexa-bot:v0.12.23@sha256:2bd879c6…. Every digest equals the delivery receipt’s.
Kit (kit/, Apache-2.0 as of ADR-0005; whole repo as of ADR-0008)
profiles/vexa/node-baseline.yaml— the delivered toggles (never image identity; digests are baked per release by the publisher):imagePullPolicy: IfNotPresent(digest-pinned refs makeAlwayspointless and Hub-quota-expensive),gateway.replicaCount: 1,migrations.enabled: false(see the finding in §4).profiles/vexa/customer-values.example.yaml— the only file the customer edits; injected into the subscription asvaluesObject, applied over every release, never leaves their cluster.argocd/applicationset.yaml— now consumes the channel chart over helm-OCI: staging tracks*(newest published version = the pointer), production tracks the customer’s pin.ServerSideApply=true;ignoreDifferenceson StatefulSetvolumeClaimTemplates.install.sh— gained--customer-values(rendered into the ApplicationSet) and registration of the helm-OCI chart repository alongside the entry-artifact repository.
Operations
RUNBOOK.md— the per-release manual crank, founder gates marked ⛔.onboarding/README.md— the subscriber pack template (credential ·channel.pub· docs · customer-values template · support address).
2 · What was proven live
- One-command install on a bare cluster: preflight PASS → Argo CD v3.5.1 → Kyverno v1.19.0 → both admission policies → chart repo registration → subscription. Both Applications generated.
- The channel delivered a real release.
vexa-enterprise-staging: Synced / Healthy, revision0.12.23, 12 pods Running — gateway, admin-api ×2, meeting-api ×2, agent-api, runtime, terminal ×2, postgres, redis, minio (+ the minio-init Job Completed). - Every workload runs a digest, not a tag. Live readback:
vexaai/v012-gateway:v0.12.23@sha256:514ba2702ab03da4f90a6df58893cfec634ee61b913a1500ee6b56714dca89f2. - Admission is genuinely fail-closed — demonstrated, not asserted. The control plane sat in
ContainerCreatingand would not start while the image signatures were missing; Kyverno refused them. Whensign-imagescompleted, all twelve pods came up on their own, with no manifest touched and no sync command issued. That is the fail-closed policy and the self-healing pull in one observation. - The customer gate holds by construction.
vexa-enterprise-prodexists, tracksUNPINNED, and syncs nothing. Only a pin move — the customer’s act — changes that. - Sync waves work. First sync brought up postgres/redis/minio, then the control plane; no ordering failure, no deadlock.
3 · Defects found and fixed during the build
4 · Finding worth filing on the product
The OSS chart’s migrations Job cannot succeed on 0.12.x. It fails withModuleNotFoundError: No module named 'meeting_api.database' and retries to backoffLimit. The
stack is unaffected because the services create their schema on boot — verified live: six tables
(api_tokens, meeting_sessions, meetings, platform_settings, transcriptions, users)
exist with the Job disabled. The node baseline therefore ships migrations.enabled: false, and
the publisher’s Argo hook stamp stays in place for the first release that ships real migrations.
Anyone installing the OSS chart with defaults meets this. It is a product defect our own delivery
testing caught before a customer did — the conveyor doing its job — and belongs on
Vexa-ai/vexa.
5 · Not done (against the #7 acceptance)
- Bot spawn not yet driven. The stack is up; no meeting bot has been launched and admitted. This is the remaining piece of acceptance item 1.
- No real channel entry published. The chart and signatures are live, but
entry.jsonfor 0.12.23 is still the dry-run golden signed with a test key. The first real publication needs the key ceremony — a founder gate. - Test infrastructure, not production. In-cluster registry rather than GHCR; ephemeral test key rather than the channel key.
- Acceptance items 2 and 3 pending 0.12.24: staging self-promotion across a real release boundary, and one rollback by pin.
- Teardown: the proof cluster is still standing for the 0.12.24 leg; it is tagged
throwawayand is destroyed when the acceptance completes or the work pauses.