Skip to content

I0914 — One deployment core, one command, and a dry run that mutates nothing

Implement the deployment operations — validate, plan, generate, build, status, deploy, smoke — once in the typed core, expose them through thin adapters, and provide one ergonomic command that performs the whole sequence safely and can be asked to change nothing.

CANCELLED wave 4 · p0 · deep-work profile · parallel safe

Part of fly-deployment — The container image is a projection of the repository model, and its smoke is its evidence.

Objective

Implement the deployment operations — validate, plan, generate, build, status, deploy, smoke — once in the typed core, expose them through thin adapters, and provide one ergonomic command that performs the whole sequence safely and can be asked to change nothing.

Why

Deployment logic spread across a script, a workflow, a Makefile target and an entrypoint means four places each knowing half the truth. One core with thin adapters is the same rule the capability registry already enforces for everything else.

Current state

Nothing performs any deployment step. Every operation named here does not exist.

Desired state

The core owns the semantics, the CLI is an adapter, CI calls the same core, and a dry run reports exactly what a real run would do without touching the provider.

Scope

  • apps/majordomus-cli/src/deploy/core.rs
  • apps/majordomus-cli/src/commands/deploy.rs

Out of scope

  • Deployment logic in a shell script beyond thin adaptation
  • Interactive prompts in a non-interactive path
  • Creating a new application on every invocation

Dependencies

What waits on this

Acceptance criteria

  • The sequence is validate, verify projections, preflight credentials and configuration, build, deploy, wait for health, assert the machine inventory, run the smoke suite, publish a summary — and a failure at any step stops the ones after it
  • A dry run performs no mutation and reports the same plan the real run would execute
  • Plan and doctor are read-only, and repeated runs without a source change converge rather than creating new resources
  • Failures name the source of truth, the observed state and the command that repairs it, rather than reporting that deployment failed
  • No token value can appear in any output, including verbose and error paths

Validation

  • cargo test --workspace --all-features
  • majordomus deploy --dry-run

Evidence required

  • core_operations
  • dry_run
  • one_command
  • actionable_failures

Evidence

None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.

Risk

A single command that does everything is also a single command that does something unintended. The dry run and the read-only operations are what make it safe to run without reading its source first.

Completion report

Cancelled 2026-10-14 on master e28daccd9b: its steps are deploy, wait for health and assert the Machine inventory on Fly; the provider-neutral part is deploy.check and generate --check, which exist. The owner disconnected Fly.io on 2026-10-12; this repository deploys release binaries, the GHCR image and GitHub Pages (commit 9af3fa65a4 removed fly.toml).

Timeline

started
—
verified
—
completed
—

Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.

Canonical record: .ai/repo/project/issues/I0914.yaml. Read it back with majordomus plan show I0914.

Searches the titles and descriptions of every page this site publishes.