ordinary-commands-never-build — No ordinary command builds: every entry path fails fast or answers through a release of the same generation
Every entry path and every gate calls the tree's executable, a missing or stale one fails fast naming the explicit build or answers through a release whose generation matches, and no caller passes silently.
PLANNED 0 of 1 issues done
- ready
- 1
- blocked
- 0
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
On 2026-10-22 a pre-push sat forty minutes in one gate and timed out at ninety, queued behind the shared build lock with the tree's executable already built: nine gates run cargo run and ignore MAJORDOMUS_BIN, and at least seven other entry paths build implicitly or pass silently on a stale executable. ADR 0224 (accepted the same day, superseding ADR 0172) decides that only an explicit build builds.
Outcome
Every entry path and every gate calls the tree's executable, a missing or stale one fails fast naming the explicit build or answers through a release whose generation matches, and no caller passes silently.
Current state
Measured on master 2034d4a3f0b: bin/majordomus-cli rebuilds a stale executable for every caller; nine gates in .ai/repo/ci/gates.yaml run cargo run; test/lib.sh runs a raw cargo build; the edit guard passes on exit 12; mj_rust_installed accepts a release on --version alone.
Desired state
A case counts zero cargo invocations across every path with the executable missing and stale, and a mismatched release is refused.
Scope
- bin/majordomus-cli
- bin/majordomus-mcp
- lib/rust_bin.sh
- test/lib.sh
- .ai/repo/ci/gates.yaml
- .claude/hooks/majordomus-edit-guard
- apps/majordomus-cli/src/command_graph/bridge.rs
Out of scope
- Migrating lib/*.sh domain logic (intent repository-automation-is-typed)
Acceptance criteria
- Every criterion of intent every-capability-has-one-owner-and-the-cli-never-builds that names this milestone's issues has its proof in the tree
Validation
- majordomus plan validate
- majordomus intent validate
Risks
- A client that relied on the hidden rebuild now sees exit 12: the message names the one command to run
Issues
Each one is an execution contract with its own acceptance criteria, validation command and required evidence. The wave column is the layer of the dependency graph it sits in.
| issue | status | wave | depends on | title |
|---|---|---|---|---|
| I3957 | READY | 0 | — | No entry path or gate builds: the launcher, the gates, the test harness and the just bridge call the tree's executable and fail fast or use a release of the same generation |
The graph
flowchart LR
I3957["I3957<br/>No entry path or gate builds: the launcher, the gates, the test harness and the just bridge call the tree's executable and fail fast or use a release of the same generation"]:::ready
classDef done stroke:#16a34a,fill:#dcfce7,color:#14532d,stroke-width:2px
classDef active stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:2px
classDef verify stroke:#7c3aed,fill:#f5f3ff,color:#4c1d95,stroke-width:2px
classDef ready stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef planned stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef blocked stroke:#b45309,fill:#fffbeb,color:#78350f,stroke-width:2px
classDef cancelled stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2px
classDef superseded stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2pxCanonical record: .ai/repo/project/milestones/ordinary-commands-never-build.yaml. Read it back with majordomus plan show ordinary-commands-never-build.