/goal /ultracode-workflows [GATE] validated grandchild acceptance gate — secrets+domains+rbac+policy on a VPS depth-2/3 platform #46
Labels
No labels
bug
discussion
duplicate
enhancement
goal
help wanted
horizon:backlog
horizon:governance
horizon:mvp
invalid
operator-decision
question
roadmap
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Depends on
#24 /goal /ultracode-workflows [DOM-1a] public ACME TLS for the platform domain (letsencrypt-dns01 ClusterIssuer + public wildcard cert)
open-platform/mitosis
#26 /goal /ultracode-workflows [SEC-1] sovereign age-key backup, escrow verification, and rotation runbook + tooling
open-platform/mitosis
#27 /goal /ultracode-workflows [SPINE-4] re-establish a known-good baseline — germinate a fresh long-lived reference/staging platform from post-SPINE-2/3 main
open-platform/mitosis
#29 /goal /ultracode-workflows [RBAC-2] forwardAuth platform-auth service + Traefik middleware (apps private by Forgejo permission, zero app auth code)
open-platform/mitosis
#30 /goal /ultracode-workflows [RBAC-3] migrate app-template auth to trust platform headers (retire per-app better-auth OAuth)
open-platform/mitosis
#31 /goal /ultracode-workflows [RBAC-4] retire the god-PAT — per-user delegated agent identity + per-app scoped read-only kube token
open-platform/mitosis
#35 /goal /ultracode-workflows [HYB-2] validate a granddaughter on a real VPS over the public internet (production TLS + edge)
open-platform/mitosis
#34 /goal /ultracode-workflows [DOM-1b] self-serve custom domains (BYOD, Vercel-style, TXT-verify + per-app issuer selection)
open-platform/mitosis
#37 /goal /ultracode-workflows [DOM-2] swap CNI to Cilium + replace blanket app egress with domain/identity-defined CiliumNetworkPolicy (closes #13)
open-platform/mitosis
#40 /goal /ultracode-workflows [POL-2] migrate overlayManifests governance → Kyverno generate policies (the real payoff)
open-platform/mitosis
#41 /goal /ultracode-workflows [POL-3] image provenance via Kyverno verifyImages + platform CI cosign signing
open-platform/mitosis
#42 /goal /ultracode-workflows [POL-4] policy-govern the secrets + domains + network invariants
open-platform/mitosis
#43 /goal /ultracode-workflows [POL-5] policy-govern the RBAC/identity invariants
open-platform/mitosis
Reference
open-platform/mitosis#46
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Track/Wave:
GATE· Wave G6 · Size LRepos:
mitosis,mcp,agents,gitops,_app-templateDepends on: SPINE-4, SEC-1, DOM-1a, DOM-1b, DOM-2, RBAC-2, RBAC-3, RBAC-4, POL-2, POL-3, POL-4, POL-5, HYB-2
Why
The final deliverable: an unattended acceptance run proving all five primitives at once on a real-infra granddaughter — the client-deployable validation report.
Scope
Extend the CI-1 harness into a full acceptance gate on REAL VPS infra: germinate genesis→daughter→granddaughter, then on the granddaughter assert ALL five at once — (secrets) age-key rotation preserves a live app secret + prod/dev scoping holds; (domains) a real custom domain verifies via DNS-01 and serves a browser-trusted PRODUCTION Let's Encrypt cert on the public edge; (rbac) apps are private-by-Forgejo-permission through forwardAuth and agent runs use a scoped kube token, not the god-PAT; (policy) Kyverno rejects a plaintext Secret, an unregistered Ingress host, a blanket-egress app, and a god-PAT-scoped SA; (app) a real agent-built app with DB+bucket serves 200s at its public URL.
Acceptance
One unattended gate run passes EVERY assertion and emits a client-deployable validation report; any single failure fails the gate.
Notes
The capstone.
Part of the First Client Deploy → Governance roadmap. The owning agent may recurse into its own subagent team (ultracode workflow) if the task warrants. Honor the seam-serialization: land on a shared seam by rebase, and don't start a seam position until the prior one has merged.
plat referenced this issue2026-07-01 21:32:11 +00:00
GATE PASSED — mission complete. Coordinated release (mcp v0.26.0 + agents v0.7.5 tags, gitops#10 pins, mitosis#61 seed) + germinate-integration fix (bin/lib.sh dynamic trim so fresh platforms deploy Kyverno/policies/letsencrypt/cosign-signing + never drift; a set-u latent bug in the trim was caught+fixed; bin/germinate builds ci-builder 0.1.0+0.2.0; _app-template#6 makes cosign signing conditional). PROVEN LIVE on a fresh germination (wb-gate2): (1) secrets rotate_age_key preserves a live secret / old key decrypts nothing; (2) forwardAuth four-tier gate; (3) agent-ctx scoped token can-i own-ns yes / cross+secrets+cluster 403; (4) Kyverno deployed BY germinate — 12 ClusterPolicies Ready, rejects privileged/non-sovereign pods; (5) webhook HMAC tampered→401/signed→200; (6) a create_app app ships FIRST-TRY to a running prod pod (HTTP 200) in a Kyverno-GOVERNED namespace (generated quota + netpols). All 5 whiteboard dimensions live end-to-end on a fresh platform. DOM-1a public-TLS separately proven on the real product-garden.com VPS deploy.
Two gate assertions discovered during today's wb-gate validation, filed as #67: both failure modes SELF-HEAL (the app still ships and serves 200), so a naive gate pass would miss them.
rollout restartproduced two active admin hooks on the same URL → every event delivered twice (#63; fix in flight plat/agents#10). Assert byGET /api/v1/admin/hooks/{id}— the LIST endpoint returns[]while hooks exist.Both should land in the unattended VPS gate run (and the #21 harness) so agents 0.7.6 (#66) stays fixed.
Depth-2 chain evidence for the GATE: genesis seed -> daughter (d2a) -> granddaughter (d2b)
Proving the released capabilities hold AT DEPTH: germinated
d2afrom the committedgenesis/seed.tar.gz(fresh clone of main@8a7dc0e, the #70/#72 release), mintedseed-d2.tar.gzFROM the running d2a, germinatedd2bfrom that. Both clustersPORTS=noneon the vxrail host; prod untouched (snapshots at bottom). #70's fork chain exercised for real at both hops — including a genuine tier fallback at hop 2.Evidence matrix
no-XFP=301 XFP:https=200 https=200(Host git.d2a.local)no-XFP=301 XFP:https=200 https=200(Host git.d2b.local)redirect-to-https@file+redirectScheme: {scheme: https, permanent: true}forgejo/registry-node-configRunning; node listener127.0.0.1:31100;crictl pull git.d2a.local/plat/ci-builder:0.2.0OKgit.d2b.local/...:0.2.0OKoci://forgejo-http.forgejo.svc...:3000/plat/charts/agents), imagegit.d2a.local/plat/agents:0.7.6git.d2b.local/plat/agents:0.7.6original_urlon plat/mitosishttps://git.open-platform.sh/plat/mitosis.githttps://git.open-platform.sh/plat/mitosis.gitcd643a31atop root main310081a1)a9a2f3bcatop root main310081a1)COLDSTART GATE PASS (90s)13/13, FORK_TIER=1 strictCOLDSTART GATE PASS (95s)13/13, FORK_TIER=2 strictHop 1 — fork chain link (quoted)
ORIGIN on d2a (full chain present — tier-1 carries the parent's ORIGIN forward):
Hop 2 — seed FROM d2a, and which tier won (quoted)
bin/seedagainst d2a over the only route a PORTS=none parent offers (kubectl port-forward,FORGEJO_URL=http://127.0.0.1:3100). The manifest:d2b germination — parent alive, port-forward up, so the HOST-side tier-1 probe passed; the migrate runs in the daughter's Forgejo POD, where 127.0.0.1 is the pod itself:
The fallback design worked: a mid-chain tier failure produced a fully working platform (13/13 gate), full history, forge-recorded source, half-created repo cleaned before retry. This is exactly the resilience #70 promised.
The genealogy cost is real: ORIGIN on d2b (tier-2 shape — root's ORIGIN, not d2a's):
The d2b line correctly names d2a as parent (manifest
domain:is durable), so the chain stays inferable — but d2a's OWN line (d2a.local germinated-from open-platform.sh …) is absent, andoriginal_urlpoints at the root instead of the actual parent. Until createdFrom is durable, depth >= 2 genealogy degrades to the root on every port-forward-minted seed.Findings
bin/seedrecordscreatedFrom: $FORGEJO_URLverbatim; a port-forward URL (the standard way to reach a PORTS=none parent) silently costs daughters the tier-1 fork. Fix: recordhttps://git.<SEED_DOMAIN>(bareDomain from reserved-names — already fetched by the same script), falling back to$FORGEJO_URLonly when unknown.FATAL: bootstrap Forgejo admin 'plat' never authenticated— root cause was a concurrent CI coldstart (ci9) holding127.0.0.1:3000; germinate's auth gate silently authenticated against the WRONG cluster's Forgejo (bin/germinatefj_pf hardcodes3000:3000; anonymous/api/v1/versionon the wrong instance answers 200, so the port-forward "looks up"). CI serializes with itself via the concurrency group, but manual runs are unprotected. Re-ran with the port-forward on a distinct local port and everything passed — the ONLY local modification to the released code was that host-side port (bin/germinate lines 225/227, 3000->3007); no platform behavior touched. Worth a tiny fix (random free port, like coldstart-assert.sh already does). Not filed — staying within the one-issue budget for this run; happy to file/PR on request.310081a) fixed detection via HelmRelease values; both gate runs above used the fixed script. Bonus depth observation: both daughters' mitosis forks carry310081a— a merge that landed on root main ~30 min before hop 1 — because repo-migrate takes live HEAD, not the seed's snapshot.Prod isolation (before / after)
Teardown verified:
docker ps -a | grep k3d-d2-> ZERO containers; d2 networks gone; throwaway PAT/fork-keys/kubeconfig removed. All runs used a dedicated KUBECONFIG — the host default context was never switched.GATE evidence on a real public VPS granddaughter (2026-07-06) — 4 of 5 primitives live
On
product-garden.com(depth-2, DigitalOcean bare-k3s + Cloudflare tunnel), a crew-built app running end-to-end:ssl_verify_result: 0) on git/mcp/app; Enforce denies unregistered Ingress hosts.qa-smokelink-shortener built by the crew, DB-backed (CNPG), serving 200 publicly.So the multi-primitive acceptance holds for secrets+domains+policy+app+signing on a real VPS granddaughter, but the literal single unattended all-five gate is NOT met (forwardAuth #93 blocks it, and it wasn't one unattended run). Keeping open pending #93 + a re-run. Also surfaced the gate's structural blind spot: it only germinates k3d, so bare-VPS bugs (#89/#91/#93) are invisible to it.