Context
PRD §0c: nothing proprietary of ours executes in the customer’s perimeter — the customer runs stock upstream GitOps; we ship signed artifacts plus policy configuration. The founder’s chain ruling (ADR-0002 §4) puts two customer environments behind the channel with the gate between them held by the customer. Handoff §6 fixes the preflight’s failure classes from observed incidents.Decisions
- Stock Argo CD, OCI source, ApplicationSet with a list generator — one Application per
customer environment, same channel, different positions:
enterprise-stagingtracks thecurrentpointer (automated sync + selfHeal + prune);enterprise-prodtracks a pin the customer moves.ServerSideApply=truealways (client-side apply is the mechanism under the 0.12.23 ownership blocker and the 256KB annotation limit),ignoreDifferenceson StatefulSetvolumeClaimTemplates(Argo cannot normalise API-server defaults there — permanent OutOfSync with an empty diff otherwise; spike finding 3). - Kyverno as the customer-owned admission layer, two ClusterPolicies: digest-pinning for
vexaai/*(NO_MUTABLE_TAGS at the customer’s door) and cosign signature verification against the channel public key, withrepositorypointing at the channel registry so verification needs neither Docker Hub reachability nor any call to Vexa. The customer can tighten these; we cannot override them (P11). - The preflight is the kit’s front door —
install.shrefuses to install on a FAIL. Checks P1–P9 each carry the incident that earned them; the dynamic bot pod (absent from every render) is a first-class workload profile with production-measured sizes. Air-gapped mode via--dump-snapshot/--snapshot. - One command per provider —
install.sh --provider <name>; provider deltas live inproviders/<name>/profile.envand say honestly whether they were exercised (PROFILE_TESTED). lke: tested end-to-end. openshift: audit-grounded, not cluster-proven. aws-eks/gcp-gke/azure-aks: declared deltas only. - Image signatures ride the channel registry (cosign convention), so the admission layer
verifies against infrastructure inside or near the customer’s perimeter. Until Kyverno reads
cosign’s bundle-format referrers, channel signing uses the legacy
.sigformat (--new-bundle-format=false).
Known gaps, stated
- Argo does not verify the channel-entry signature at pull time (no cosign verification of
OCI sources in Argo CD today). Compensations: per-image signatures verified at admission
independently; entry-level verification (
vexa-channel verify, fully offline) runs at the operator/promotion step. Closure options when needed: a PreSync verification hook, or Kargo (M3) whose promotion step can verify before the pin moves. - PSA
restrictednamespaces refuse today’s unhardened images — the preflight says so honestly (P4 flags the bot). The hardening track (vexa#976/#1101/#1102, audit classes A–F) is product work inVexa-ai/vexa, not kit work. - Node-level registry trust (containerd CAs for a corporate registry) is provider documentation, not something the kit can reach from inside the cluster.