The subscriber is deliberately not named here, and their registry hostnames,
project names and dates are not in this repository. Access to this repository
is granted per person and the next person may be another customer’s engineer —
see ADR-0008. Every technical finding below is
intact; only the identity is gone.
The target setup, in their own terms
How the station lands there
One merge into their config repo — the same motion as every deploy they make:- Bootstrap by commit: an Argo
Application(the station root) + a repo secret for the Harbor-proxied OCI helm repo. Site facts (Harbor paths, pinned channel public key) ride inline. Seestation/profiles/TEMPLATE/for the profile shape; filled per-customer profiles are not committed (ADR-0008). - The root pulls the station bundle (
scope: namespace,admission.enabled: false): the subscription ApplicationSet, their contract ConfigMap, the substrate floor CronJob. No Kyverno exists there — the verify gate is the enforcement point; cluster admission is the later ops-hardening step. - The subscription pulls Vexa releases through their Harbor. Staging tier follows automatically; the prod pin moves only when their approver moves it.
- The floor re-checks the tenant preconditions every 10 minutes and reports cluster-level facts as UNKNOWN rather than guessing — a tenant never pretends to see the substrate.
vexaai on Docker Hub)
needs nothing.
How we reproduce the environment for validation
Two rigs plus the standing station:- Transport rig — a literal Harbor (v2.15.2) configured exactly as theirs:
an anonymous
dockerhub-proxyand a credentialed proxy-cache project in front of an authenticated private registry playing our channel host. The endpoint + project are four Harbor API calls (recorded in the runbook). - Tenant rig — a restricted platform with their constraint shape: enforced ResourceQuota + LimitRange (their defaults), a ServiceAccount kubeconfig scoped to one namespace (every app action as tenant), Argo installed with a strict ledger of ops-acts vs tenant-acts, a config repo served over git-http, bootstrap by commit. Platform ladder: k3s + PSA-restricted (always available) → MicroShift (real SCC admission, no VM) → genuine OKD (needs KVM; cloud VMs without nested virtualization cannot run it — validated the hard way).
- The standing station — the channel’s own staging/prod pair, running the same bundle in cluster scope with admission enabled.
Parity matrix — where validation matches the target
Findings the genuine-OpenShift run added (2026-08-21)
- HOME under a random UID is a convergence blocker, not just a spawn defect:
the minio-init sync hook fails (
mkdir /.mc: permission denied), so the Application never converges and no later release can be delivered — the single gating fix for OpenShift GitOps delivery, tracked upstream. - Upstream Argo CD’s own images hard-code UIDs (dex 1001, redis 999) and
are rejected by restricted-v2 — use the OpenShift GitOps operator (the house
standard in regulated estates) or strip
runAsUserin a namespace install. - Namespace-scoped Argo needs a namespaced
*/*/*Role beyondadmin, created by the platform team (escalation prevention blocks the tenant), and its ~7 pods consume real quota — size the project for app + Argo, or run Argo in its own namespace.