Skip to content

I3820 — A deployment names the provider that hosts it, and the provider's files are generated from it

deployment/v1 gains an optional provider block (name gigalixir, app, stack, url); the typed model parses and checks it; majordomus generate deployment renders deploy/gigalixir/Procfile and deploy/gigalixir/bin/{detect,compile,release} from the object with provenance headers under generate --check; the crate's build script reads the provider's SOURCE_VERSION when MAJORDOMUS_BUILD_COMMIT is unset; rule majordomus.deployment-contract moves to version 2 (a known provider is accepted, an unknown one refused, every provider file generated); .ai/repo/deployments/majordomus.yaml names the Gigalixir application prismatic-majordomus. ADR 0219.

READY wave 0 · p1 · implementation profile · runs alone

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

Ready. Every dependency is done, so majordomus plan start I3820 will be accepted.

Objective

deployment/v1 gains an optional provider block (name gigalixir, app, stack, url); the typed model parses and checks it; majordomus generate deployment renders deploy/gigalixir/Procfile and deploy/gigalixir/bin/{detect,compile,release} from the object with provenance headers under generate --check; the crate's build script reads the provider's SOURCE_VERSION when MAJORDOMUS_BUILD_COMMIT is unset; rule majordomus.deployment-contract moves to version 2 (a known provider is accepted, an unknown one refused, every provider file generated); .ai/repo/deployments/majordomus.yaml names the Gigalixir application prismatic-majordomus. ADR 0219.

Why

The owner ordered on 2026-10-20/21 that Prismatic Majordomus run on Gigalixir and that the deployment be derived, enforced and always current, not a parallel universe. The first deployment was a hand-assembled slug whose file list, start command and port restate facts the deployment object holds, and the contract refused the provider key that would let the object state where it runs.

Current state

Measured on master 573df967bb5: deployment/v1 has no provider field and rule deployment-contract v1 refuses one (case 84 asserts it); render.rs renders only deploy/Dockerfile and .dockerignore; build.rs reads MAJORDOMUS_BUILD_COMMIT or git; https://prismatic-majordomus.gigalixirapp.com runs a slug assembled by hand and answers the release binary's commit 9a5a9b77520.

Desired state

The object states provider.name gigalixir, app prismatic-majordomus, stack gigalixir-24 and url https://prismatic-majordomus.gigalixirapp.com; deploy/gigalixir/ holds the generated Procfile and hooks and generate --check refuses a hand edit; case 84 refuses an unknown provider name, a non-https url and a hosted loopback interface; case 86 checks the provider files' header, command, port and credential scan; case 3820 renders a fixture object with a provider and proves the Procfile starts the declared executable on the provider's port.

Scope

  • .ai/repo/adrs/0219-a-deployment-names-its-provider-and-every-provider-file-is-derived.md
  • .ai/repo/project/issues/I3820.yaml
  • .ai/repo/deployments
  • .ai/repo/rules/vendor/majordomus/rules
  • share/standard/majordomus/rules
  • share/schemas/majordomus/deployment
  • share/allow/deployment.txt
  • apps/majordomus-cli/src/deploy
  • apps/majordomus-cli/build.rs
  • deploy/gigalixir
  • lib/deployment.sh
  • test/cases/84_deployment_contract.sh
  • test/cases/86_deployment_projections.sh
  • test/cases/3820_a_deployment_renders_its_providers_files.sh
  • .gitattributes
  • docs
  • site

Dependencies

None. This issue is a root of the graph.

What waits on this

Acceptance criteria

  • An object with provider.name gigalixir, app, stack and an https url parses and checks; an unknown provider name, an http url or a hosted loopback interface is refused naming the file, key, value and correction
  • generate deployment writes deploy/gigalixir/Procfile and deploy/gigalixir/bin/{detect,compile,release}, each with the provenance header, and generate --check refuses a hand edit
  • The Procfile starts the deployment's executable with serve --discovery filesystem on all interfaces and the provider's PORT, falling back to listen.port
  • A build with SOURCE_VERSION set to a 40-hex commit and no MAJORDOMUS_BUILD_COMMIT answers that commit on /api/v1/live
  • Rule deployment-contract is version 2 in share/standard and in the vendored copy, identical

Validation

  • env -u MAJORDOMUS_SHARE -u MAJORDOMUS_HTTP_HOST -u MJ_ROOT bash test/run.sh 84_deployment_contract 86_deployment_projections 3820_a_deployment_renders_its_providers_files
  • cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib deploy::
  • majordomus generate --check

Evidence required

  • provider_block_parses
  • provider_files_generated
  • unknown_provider_refused

Evidence

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

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/I3820.yaml. Read it back with majordomus plan show I3820.

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