I3208 — Whether a commit may be released is one read that names each condition and the evidence that settles it
Add release.readiness to the release capability: for a commit and a candidate version, decide what release.yml's plan and verdict phases, the version gate and the base branch's ci verdict decide, and answer ready, not ready with the failing condition, or unknown with what could not be read, including the surface fingerprint the record will publish; release.yml's plan and verdict phases then call it, so one implementation decides both. The install job is the after-tag half and is named as not readable before a tag.
BLOCKED wave 0 · p1 · implementation profile · parallel safe
Blocked. This issue cannot start until milestone:a-release-is-proven-end-to-end is done. The status is derived from that, not declared.
Objective
Add release.readiness to the release capability: for a commit and a candidate version, decide what release.yml's plan and verdict phases, the version gate and the base branch's ci verdict decide, and answer ready, not ready with the failing condition, or unknown with what could not be read, including the surface fingerprint the record will publish; release.yml's plan and verdict phases then call it, so one implementation decides both. The install job is the after-tag half and is named as not readable before a tag.
Why
The owner set the alpha for 2026-10-19 with GO only on current master, green CI and real install tests, not an automatic GO (c281#2). Audits asked for a single derived readiness authority shown on CLI, UI and Pages (c283#2) and a machine-evaluated definition of done for a stage (c258#2). Today each condition lives in a different script and is first combined when a tag is pushed. Sources: chatgpt-majordomus:c111#6, chatgpt-majordomus:c238#2, chatgpt-majordomus:c258#2, chatgpt-majordomus:c283#2, chatgpt-majordomus:c089#1.
Current state
release.yml plan runs scripts/release-version --check; verdict runs scripts/ci/release-verdict on the tagged commit; distribution.status judges model, version, release, artifacts, metadata, public; release/compat.rs computes the surface fingerprint the record carries. No read answers before a tag whether the tag would pass.
Desired state
majordomus release readiness <sha> (and its HTTP and MCP projections) returns each condition with its evidence and age, read from the same functions the release path runs, so the workflow and the read cannot disagree; a condition that cannot be read is unknown and the answer is not ready.
Scope
- apps/majordomus-cli/src/release
- apps/majordomus-cli/src/capability/builtin/release.rs
- docs/RELEASE.md
- .github/workflows/release.yml
- .ai/repo/ci/release.yaml
- scripts/release-version
- scripts/ci/release-verdict
- apps/majordomus-cli/src/ui/delivery.rs
- apps/majordomus-cli/src/commands/release.rs
- site/content/docs/cli/release
- site/content/docs/release.md
Out of scope
- Tagging or publishing
- A second release engine; the read composes what exists
- Starting before the alpha top (0.30.0) and I2829 land on release.yml and scripts/site-deploy
Dependencies
None. This issue is a root of the graph.
Acceptance criteria
- A commit with a red or missing ci verdict is not ready and the verdict is named
- A candidate version below what the contract requires is not ready and both versions are named
- The read and the release workflow's plan and verdict phases share their implementation
- release.yml's plan and verdict phases call majordomus release readiness, and scripts/release-version --check and scripts/ci/release-verdict become thin callers of it; no condition is implemented twice
- The install job is the after-tag half of the proof: readiness names it as not readable before a tag and never reports it as passed
- The trunk's red state is the ci verdict of the base branch's head, read by the same function as the candidate commit's verdict; I2709's carrier is not a readiness condition
- The release screen under /ui shows the readiness read from the same capability
Validation
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib release::
- majordomus plan validate
Evidence required
- case_release_readiness_is_one_read
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/I3208.yaml. Read it back with majordomus plan show I3208.