/goal /ultracode-workflows [POL-3] image provenance via Kyverno verifyImages + platform CI cosign signing #41

Open
opened 2026-07-01 02:03:50 +00:00 by plat · 1 comment
Owner

Track/Wave: POL-3 · Wave G4 · Size L
Repos: gitops, _app-template, mitosis
Depends on: POL-0, POL-1

Why

Closes a supply-chain gap that does NOT exist at all today — anyone with registry write can deploy an unsigned image. Named as a trust gap in the enterprise vision.

Scope

(1) add a cosign signing step to the app-image CI build; (2) a verifyImages/ImageValidatingPolicy ClusterPolicy requiring that signature on any image admitted to app namespaces. mitosis touched only if cosign key material needs per-fork sealing (XL if so).

Acceptance

A CI-signed image deploys; a manually-pushed unsigned image is rejected at admission, visible in the PolicyReport.

Notes

Design gate: a misconfigured verifyImages in enforce mode can brick every app deploy — settle POL-0's enforce/audit + failurePolicy first.


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.

**Track/Wave:** `POL-3` · Wave **G4** · Size **L** **Repos:** `gitops`, `_app-template`, `mitosis` **Depends on:** POL-0, POL-1 ## Why Closes a supply-chain gap that does NOT exist at all today — anyone with registry write can deploy an unsigned image. Named as a trust gap in the enterprise vision. ## Scope (1) add a cosign signing step to the app-image CI build; (2) a verifyImages/ImageValidatingPolicy ClusterPolicy requiring that signature on any image admitted to app namespaces. mitosis touched only if cosign key material needs per-fork sealing (XL if so). ## Acceptance A CI-signed image deploys; a manually-pushed unsigned image is rejected at admission, visible in the PolicyReport. ## Notes **Design gate: a misconfigured verifyImages in enforce mode can brick every app deploy — settle POL-0's enforce/audit + failurePolicy first.** --- *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.*
Author
Owner

cosign SIGNING delivered + proven; verifyImages held at Audit (2026-07-06)

On the product-garden.com granddaughter: generated a platform cosign keypair, sealed it (sops, fork key) into cosign-signing-key.yaml, pasted the real pubkey into verify-image-provenance, and wired COSIGN_PRIVATE_KEY/COSIGN_PASSWORD as Forgejo Actions secrets. The crew-built qa-smoke image was then signed by CI and cryptographically verified:

cosign verify --key cosign.pub git.product-garden.com/plat/qa-smoke:0.1.1
  → The signatures were verified against the specified public key
  identity: forgejo-http.forgejo.svc:3000/plat/qa-smoke  digest: sha256:87a3d48...

So signing works end-to-end. verify-image-provenance is deliberately left at Audit, NOT flipped to Enforce, because of a real gap: plat is a Forgejo user, not an org, so a freshly-generated app repo does NOT auto-receive the COSIGN secrets (only REGISTRY_TOKEN via the dispatcher). Flipping verifyImages→Enforce globally would reject every new app the owner builds (unsigned) → bricked app-building.

Remaining for full POL-3: per-app/per-fork COSIGN secret provisioning (the documented follow-up in cosign-signing-key.yaml) — teach the dispatcher to seal + inject COSIGN secrets onto each app repo like REGISTRY_TOKEN, THEN flip verifyImages to Enforce. Keeping this open for that.

## cosign SIGNING delivered + proven; verifyImages held at Audit (2026-07-06) On the `product-garden.com` granddaughter: generated a platform cosign keypair, sealed it (sops, fork key) into `cosign-signing-key.yaml`, pasted the real pubkey into `verify-image-provenance`, and wired `COSIGN_PRIVATE_KEY`/`COSIGN_PASSWORD` as Forgejo Actions secrets. The crew-built `qa-smoke` image was then **signed by CI and cryptographically verified**: ``` cosign verify --key cosign.pub git.product-garden.com/plat/qa-smoke:0.1.1 → The signatures were verified against the specified public key identity: forgejo-http.forgejo.svc:3000/plat/qa-smoke digest: sha256:87a3d48... ``` So signing works end-to-end. **verify-image-provenance is deliberately left at Audit**, NOT flipped to Enforce, because of a real gap: `plat` is a Forgejo **user, not an org**, so a freshly-generated app repo does NOT auto-receive the COSIGN secrets (only `REGISTRY_TOKEN` via the dispatcher). Flipping verifyImages→Enforce globally would reject every new app the owner builds (unsigned) → bricked app-building. **Remaining for full POL-3:** per-app/per-fork COSIGN secret provisioning (the documented follow-up in `cosign-signing-key.yaml`) — teach the dispatcher to seal + inject COSIGN secrets onto each app repo like `REGISTRY_TOKEN`, THEN flip verifyImages to Enforce. Keeping this open for that.
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
open-platform/mitosis#41
No description provided.