Skip to content

Estate delivery: deploy with deploy-kit, pause and roll back, watch it from one dashboard #195

Open
52 of 66 issues completed

Description

@ExtraToast

What this is

The estate gets a delivery path built on deploy-kit, so that a release becomes a deploy without any rendered YAML in a repository, and so that Projects can be paused and rolled back and watched from one admin dashboard. This epic carries the decisions of the 2026-10-01 design session and every ticket that implements them. Supersedes the outline in #148.

Design canvas (dashboard, desktop and mobile for every page): https://claude.ai/artifact/M5ZQjxFofUeEqaEdPLtn2R

Decisions

Delivery

  • Composition runs in CI in a new private Estate repository: the Platform document, the composition lock, the ClusterState snapshot and one pin per Project. It never holds a rendered tree, and there is no backing repository. The render diff is posted on the application repository's PR.
  • A fragment publishes when release-please tags a release, and carries that version. Application repositories publish through one reusable publish-fragment workflow and dispatch composition with a GitHub App token; a nightly composition is the safety net.
  • The toolkit is pinned exactly from npm. Artifacts are signed keyless and verified by Flux, the one applier.
  • A refused fragment is isolated: its Project stays at its last composed fragment, and every other Project still composes.

Controls

  • Pause freezes a Project's pin, recorded as annotations on its pin file. Pause, resume and rollback are estate workflows.
  • Rollback re-composes an earlier release, named by version, with the schema at its newest. It is offered only to releases proven against the current schema. It first takes a backup kept for 7 days, moves the pin only once that backup succeeds, and leaves the Project paused.

In-cluster services, Go, in a new delivery repository and project:

  • A minimal Release Gate. It reads each Application's releaseGate from a rendered ConfigMap and fails closed.
  • A read-only ClusterState Collector that commits the snapshot to the Estate repository through a GitHub App.
  • A Vault policy job in apps-vso-secrets.
  • All three generate their types from deploy-kit's published JSON Schemas.

Alerts

  • Alertmanager is the hub for cluster-side alerts; their rules are Assets of the observability project.
  • Composition-side alerts are commit statuses, one Estate-repository issue per Project condition, and Discord posts.

Dashboard

  • estate-dashboard: Go + Vue, contract-first (OpenAPI, ogen, openapi-ts).
  • Signed in as an OIDC client of auth, with its own session and its own admin-role check. It keeps its own database.
  • Read-only, except for Alertmanager silences.

Standard

  • go-commons, extracting a package only once three consumers share it.
  • template-go and template-go-vue; the Go and Vue blueprints move out of grimoire into them.

Model

  • A project's database is named <project>_db.
  • Vault roles and policies are named <namespace>-<identity>.
  • Backup pods get their own NetworkPolicy.
  • The pending refusal codes become real refusals in slice 7, in both implementations.

Children

Decisions

deploy-kit

Estate repository and workflows

delivery (Go)

Dashboard

Go standard

Adoption

Activity

  1. added
    type: featureNew user-facing or operator-facing capability.
    area: platformPlatform, deployment, cluster, or runtime concern.
    area: deployhomelab-deploy, deploy-v2, manifests, and rollout flow.
    priority: P1High; important and should be handled in the current iteration.
    status: ready-for-agentFully specified; an agent may take it with nobody watching.
    on Oct 1, 2026
  2. self-assigned this
    on Oct 1, 2026
  3. 50 remaining items

  4. ExtraToast commented on Oct 27, 2026

    @ExtraToast
    ContributorAuthor

    Start here (updated 2026-10-27)

    This epic is the root of all open estate-delivery work. To resume from nothing:

    1. Read the comment "Work division (deploy-kit agents)" on Rewrite the spec and the compiler in place, release 1.0.0, and hand over every Project #373. It holds the order to 1.0.0, who holds what (one session now holds everything), and the triggers between steps.
    2. Every issue in flight carries a Resume here comment: State, Next step, Blocked by, Decisions, Gotchas. Trust it over any local notes, and update it in place as you go.
    3. The order of work:
      1. Land the Move stack feat(model): derive a Move from a Process and its active Instance #648 → feat(model): render an open Move: its Instances, step Jobs and move identity #649 → feat(model): move an Application between Projects by declaring it in the new one first #650. The procedure is on Implement the Stable Address, the derived Move and Infrastructure Intent #324.
      2. Land Raise E_SCHEMA_VERSION_MISMATCH when composing a fragment #665 (the schema-version check), which ships in 1.0.0.
      3. Release 1.0.0 (Cut what the map cut and release package 1.0.0 #379, release PR chore(main): release 1.0.0 #631), on the maintainer's yes.
      4. Roll out onto 1.0, in the order Republish delivery, _canary and _estate on 1.0.0 #380's body gives (github-workflows#197 → auth-api#119 and n8n#25 → delivery#97 → estate#231).
      5. The examples Declare Grafana in the observability example #653 → Model the agents example on what runs live: hermes and kubernetes-mcp-server #654 → Scrape Flux's own controllers from the observability Project #655, then the spec move Move the spec into the frame and concept chapters, with no change of meaning #374, then the runbooks Rewrite chapter 60 to rules, and write the handover and setup runbooks #381.
      6. The handovers Hand over mail to the estate path #656 → Hand over secrets to the estate path #663, in their chain.
      7. After 1.0.0, the EMF catch-up Bring the EMF implementation level with 1.0.0 in one change #666, which sits under Build the model-driven EMF implementation and hold it to parity with the production implementation #78 (the coursework epic), not here.
    4. Hygiene no handover waits on: Harden the model after 1.0.0 #664.
    5. What only the maintainer can do: Run the live operations only the maintainer can estate#222. Never do those yourself.

    Rules: AGENTS.md and https://github.com/JorisJonkers-dev/workspace/blob/main/CLAUDE.md.

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

Metadata

Metadata

Assignees

Labels

area: deployhomelab-deploy, deploy-v2, manifests, and rollout flow.area: platformPlatform, deployment, cluster, or runtime concern.priority: P1High; important and should be handled in the current iteration.status: in-progressActively being worked.type: featureNew user-facing or operator-facing capability.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions