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
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
- I3821BLOCKED The tree a provider receives is assembled from the deployment object, and master publishes it after green ci
- I3826BLOCKED A hosted hub keeps one key from a secret, advertises its URL, and shows the mesh only to those it trusts
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.