Skip to content

Republish delivery, _canary and _estate on 1.0.0 #380

Closed
4 of 4 issues completed
Closed

Description

@ExtraToast

Parent

Rewrite the spec and the compiler in place, release 1.0.0, and hand over every Project

What to build

The three things already on the estate path move to the 1.0.0 contract, once. After it the estate path composes on the final model and the first handover can start. Settled in Decide between a spec/v2 and reworking v1 in place. The work spans JorisJonkers-dev/delivery and JorisJonkers-dev/estate.

Rollout order

Composition parses every held fragment with the composing toolkit's schema, so a fragment carrying a field 1.0 removed is refused, and a field is dropped only in the same change that moves its repository onto the new toolkit, never ahead of it. In order:

  1. deploy-kit 1.0.0 is published (Cut what the map cut and release package 1.0.0 #379, release PR chore(main): release 1.0.0 #631), after the other session's feat(model): move an Application between Projects by declaring it in the new one first #650 merges.
  2. The shared Publish Fragment workflow pins 1.0.0: Pin Publish Fragment to deploy-kit 1.0.0 github-workflows#197.
  3. auth-api moves onto 1.0 and releases: Move auth-api's project file onto deploy-kit 1.0 auth-api#119 (drop alertClass, wire ${identity:vaultRole}). The Platform document's forwardAuth names auth/auth, so this one must not lag. n8n does the same: Move n8n's project file onto deploy-kit 1.0 n8n#25 (PR feat(deploy): publish on deploy-kit 1.0 n8n#24).
  4. delivery moves onto 1.0: feat: move onto deploy-kit 1.0's schemas, scrape the Release Gate, and narrow its record writes delivery#97, repointed at the 1.0.0 tag's commit, then a delivery release (Release delivery with the off-cluster copy, garage-catalog and the gate's metrics delivery#98).
  5. The estate moves onto 1.0: Move the estate onto deploy-kit 1.0 estate#231 (branch feat/deploy-kit-1.0), which needs the maintainer's age key (Generate the backup age key pair, and write the off-cluster backup credential estate#228).

Acceptance criteria

  • The in-cluster delivery services regenerate their types against the 1.0.0 schemas and build.
  • delivery, _canary and _estate publish fragments validated with 1.0.0.
  • The estate composes, and the composition lock names 1.0.0.
  • The Reconcile Units report Ready on the estate path, and one consumer-visible value is checked: a Ready condition alone is not evidence.

Blocked by

Activity

  1. added
    type: choreMaintenance work without intended behavior change.
    area: deployhomelab-deploy, deploy-v2, manifests, and rollout flow.
    priority: P2Medium; normal planned work.
    status: blockedCannot move forward until an external dependency is resolved.
    on Oct 12, 2026
  2. ExtraToast commented on Oct 27, 2026

    @ExtraToast
    ContributorAuthor

    The estate-side edits this needs, from the audit in the estate HANDOVER.md (estate main against deploy-kit main plus #628):

    In delivery, beside the regenerated types:

    The off-cluster backup credential (AWS_ENDPOINT_URL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY at secret/data/platform/backup/off-cluster) is the maintainer's to write. It is needed before the first nightly backup on 1.0 copies anything off-cluster.

  3. added and removed
    status: blockedCannot move forward until an external dependency is resolved.
    on Oct 27, 2026
  4. ExtraToast commented on Oct 27, 2026

    @ExtraToast
    ContributorAuthor

    Prepared against deploy-kit main e255f846, 2026-10-27.

    The whole estate validates on main: its Platform document and project files, plus every Project's deploy/ on main, give accepted (60 read). That needs these changes:

    where change state
    estate forwardAuth: {provider: auth/auth, surface: http, path: /api/auth/forward}; ingressClass traefik-public and traefik-lan (the live classes); acme (the live ClusterIssuer's account, postmaster@jorisjonkers.dev, token at secret/data/platform/cloudflare); substrate.upstreamNameservers: [9.9.9.10, 149.112.112.10] (adguard's live ones); alertClass out of data.project.yml; offCluster.recipient local branch feat/deploy-kit-1.0, not pushed: estate CI runs 0.31, and the recipient waits on the maintainer's age key
    delivery schemas vendored at main and types regenerated, release-gate scraped, ConfigMap writes scoped to its namespace JorisJonkers-dev/delivery#97, draft, task check green
    auth-api alertClass dropped JorisJonkers-dev/auth-api#116, auto-merge
    auth-api VAULT_KUBERNETES_ROLE=${identity:vaultRole} (E_SELF_WITHOUT_VAULT_CLIENT) after 1.0.0: neither 0.31 nor 0.32 knows the placeholder
    n8n alertClass dropped JorisJonkers-dev/n8n#24, auto-merge

    Order, because composition parses every held fragment with the composing toolkit's schema:

    1. deploy-kit 1.0.0 is published (chore(main): release 1.0.0 #631).
    2. The shared Publish Fragment workflow pins 1.0.0.
    3. auth-api and n8n are released with alertClass gone. Those two can release now, on 0.31.
    4. auth-api's Vault client change, then an auth-api release on 1.0. Until then auth's fragment is refused on 1.0, and the Platform document's forwardAuth names auth/auth.
    5. delivery#97 is repointed at the 1.0.0 tag, merged and released.
    6. The estate: toolkit 1.0.0, the branch above, and the age recipient.

    For the maintainer: the age key pair. Before edge hands over (#662), a Vault document at secret/data/platform/cloudflare holding CF_DNS_API_TOKEN (today the token sits at secret/platform/edge under cloudflare.dns_api_token). The signIn block waits for identity to go live (identity#25), so it is not in this change.

  5. ExtraToast commented on Oct 27, 2026

    @ExtraToast
    ContributorAuthor

    A correction to the comment above: alertClass is required wherever observability is declared on 0.31 and 0.32 (and on 0.20.0, which n8n's CI pins), so it can't be dropped before 1.0.

    The order becomes:

    1. deploy-kit 1.0.0.
    2. The Publish Fragment pin moves to 1.0.0.
    3. auth-api drops alertClass and wires ${identity:vaultRole} in one change, then releases. n8n drops alertClass and moves tools/deploy-kit to 1.0.0, then releases.
    4. delivery#97, repointed and released.
    5. The estate.
  6. ExtraToast commented on Oct 27, 2026

    @ExtraToast
    ContributorAuthor

    Resume here (updated 2026-10-27)

  7. ExtraToast commented on Oct 29, 2026

    @ExtraToast
    ContributorAuthor

    Verified on 2026-10-29 by reading values back, not exit codes. All four criteria hold.

    1. delivery regenerates its types against the 1.0.0 schemas and builds.

    • JorisJonkers-dev/delivery main (9f4a7d61, release 0.16.0): third_party/deploy-kit/REF reads ae1d36fc7b27212c79f1a973449c396dfc5726e4, which is the commit tag v1.0.0 resolves to. Taskfile.yml pins DEPLOY_KIT_REF to the same commit. The internal/deploykit/{lock,pins,resolved,clusterstate}/types_gen.go files are generated from those vendored schemas.
    • CI on that commit (run 40578019214, push, head 9f4a7d61): schemas:check, gen:check, test, build, all nine images and Pipeline Complete succeeded.
    • The live release-gate pod in delivery-system runs delivery/release-gate@sha256:dca2a4b1…. That digest is the one v0.16.0 resolves to in the registry, and the one the delivery 0.16.0 fragment's images.lock.yml names. The image carries the label org.opencontainers.image.version=0.16.0. The live collector digest (sha256:80526921…) also matches the fragment.

    2. delivery, _canary and _estate are published on 1.0.0.

    • delivery: intent-delivery:latest resolves to sha256:8e289648…, which is 0.16.0 at revision 9f4a7d61, with fragment.yml schemaVersion: 1.0.0. It was published by delivery's Release run 40578019705 through Publish Fragment 16d241e4 (= v0.36.0). That run logs deploy-kit 1.0.0 and accepted (4 read).
    • _estate: this render comes from the Platform document's fragment. intent-jorisjonkers.dev:latest resolves to sha256:0a5e9a10…, which is 0.31.2 at revision ef14336f, with schemaVersion: 1.0.0, and it carries offCluster.recipient. It was published by the estate's Release run 40568781182 through Publish Fragment v0.36.0. All seven fragment jobs log deploy-kit 1.0.0 and accepted. Composition at 1.0.1 rendered render-estate@sha256:701d47a4…, and that is the digest pinned in projects/_estate/source.yaml (commit c605daf9, 27 Oct).
    • _canary: there is no fragment to validate. The canary is a plain ConfigMap that compose.yml's canary job pushes with flux push, not a deploy-kit render, so its content does not depend on the toolkit version. Its pin, render/canary@sha256:f69adb82… from 2 Oct, still passes the signer check: OCIRepository canary reads SourceVerified=True, and its applied ConfigMap flux-system/estate-canary reads commit: c2c21152…, the same commit as the artifact's revision annotation. Nothing on 1.0 asks for it to be republished.

    3. The estate composes, and the lock names 1.x.

    • composed:latest resolves to sha256:6418df4e…, and its COMMIT is fa7f25df. That is the nightly safety-net run 40845550384 on 29 Oct (schedule, head fa7f25df, success).
    • Its lock.json reads toolkitVersion: 1.0.1 and schemaVersion: 1.0.1, and all 24 fragments it composes carry schemaVersion: 1.0.0. 1.0.1 is a patch on the 1.0 contract, so this meets the criterion's intent.
    • That run also reproduced the live renders: its composition.json gives _estate content hash sha256:563d4a33… and delivery sha256:11862af7…, both moves: false. Those are the content-hash annotations on the pinned render-estate and render/delivery artifacts.

    4. The Reconcile Units are Ready, and a consumer-visible value checks out.

    • These Kustomizations read Ready=True ReconciliationSucceeded:

      • apps-delivery (applied sha256:a8b4f3ee…);
      • canary (sha256:f69adb82…);
      • estate-stable-addresses and estate-vso-secrets (sha256:701d47a4…);
      • estate-pins (main@sha1:0c768e63, estate main HEAD);
      • apps-estate-dashboard.

      The OCIRepositories project-delivery, canary and estate read Ready=True SourceVerified=True, and each revision equals the digest in its pin source.

    • Consumer-visible value: JorisJonkers-dev/delivery has GitHub Deployment 7369721745, environment production, sha 9f4a7d61, version: 0.16.0, artifact render/delivery@sha256:a8b4f3ee…. That is the same digest Flux applied. Its latest status is success, "delivery 0.16.0 applied by Flux and ready" (20:49Z, 27 Oct). It went in_progress → failure (health check) → success, so the status tracks what Flux actually did. The release-gate image digest under criterion 1 is a second consumer-visible value.

    What changes next: estate main's toolkit.yml now reads deploy-kit: 1.2.0 (JorisJonkers-dev/estate#252, JorisJonkers-dev/estate#253), and release.yml publishes through Publish Fragment v0.37.0 (deploy-kit 1.2.0). The next composition will therefore name toolkit 1.2.0.

    The handovers #656, #657, #658, #659, #660, #661, #662 and #663 no longer have this blocker. Each still has its own, such as the runbook.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: deployhomelab-deploy, deploy-v2, manifests, and rollout flow.priority: P2Medium; normal planned work.type: choreMaintenance work without intended behavior change.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions