I0903 — Deployment reads are declared once and projected everywhere
Declare the read-only deployment operations as canonical capabilities so that the CLI, the HTTP API, MCP, OpenAPI and the generated documentation all derive from one declaration.
BLOCKED wave 2 · p0 · implementation profile · parallel safe
Blocked. This issue cannot start until I0902 is done. The status is derived from that, not declared.
Objective
Declare the read-only deployment operations as canonical capabilities so that the CLI, the HTTP API, MCP, OpenAPI and the generated documentation all derive from one declaration.
Why
The repository's rule is that an operation is declared once and projected; adding deployment to a transport registry, an OpenAPI file or a documentation table by hand is the defect ADR 0004 names.
Current state
The capability registry holds modules for capabilities, graph, health, objects, peers, perf, repository, scope and views. No deployment module exists.
Desired state
A deploy capability module declares the deployment reads, and every projection picks them up from generate with no second registration anywhere.
Scope
- apps/majordomus-cli/src/capability/builtin/deploy.rs
- apps/majordomus-cli/src/capability/builtin/mod.rs
Out of scope
- Mutating operations over HTTP or MCP; deployment mutation belongs to the trusted CLI and CI
- Hand-edited OpenAPI, route tables or documentation lists
Dependencies
What waits on this
- I0913BLOCKED The provider configuration is generated, and the cheap profile is declared
- I0914BLOCKED One deployment core, one command, and a dry run that mutates nothing
- I0926BLOCKED The deployment documentation is generated and reachable
- I0927BLOCKED The cockpit shows the deployment from the same data
Acceptance criteria
- Each operation is one capability! declaration with its input, output, stability, exposure and tags
- The operations appear in the CLI, the HTTP API, the MCP surface, openapi.json and the generated reference without any file listing them a second time
- No capability performs a mutating deployment action
- generate --check is green after regeneration and fails when a projection is edited by hand
- The benchmark coverage projection accounts for the new capabilities, as the coverage rule requires
Validation
- cargo test --workspace --all-features
- majordomus generate --check
Evidence required
- capability_declared
- projections_derived
- generate_check
- benchmark_coverage
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 deployment status read wants to call flyctl, which turns a cheap capability into a network call on a hot path. Live provider state belongs behind an explicit operation with its own cost, not behind an ordinary read.
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/I0903.yaml. Read it back with majordomus plan show I0903.