Skip to content

A release publishes an artifact for every supported target or it is not published

share/distribution.yaml marks a target supported, experimental or unavailable. A

declared statusdeclared status: guaranteed Declared deterministic and blocking, implemented, and naming the behavioural test that is to prove it. Whether a recorded run supports it is the evidence verdict, shown beside it.

recorded evidencerecorded evidence: not run Declared guaranteed, and not supported by a recorded run: the test is named, and no passing run of the current inputs is recorded. how evidence is recorded

The build matrix stops at the first failure, publication begins only when every build succeeded, and the recorder refuses to write a record missing a target the model marks supported.

What it means

share/distribution.yaml marks a target supported, experimental or unavailable. A release publishes an artifact for every target in the first two states. There is no state in which a release exists, is offered by latest.json, and has nothing for a platform the documentation lists.

How it works

Three independent refusals, at three moments:

  • the build matrix is fail-fast, so one target failing to build stops the run;
  • publication is a separate job that begins only when every build has succeeded;
  • scripts/release-record, which writes the record from the artifacts that were actually uploaded, refuses to write one that is missing a supported target, and the typed check behind it (Release::findings) is also what majordomus distribution validate runs over every committed record.

Completeness is judged against the set the release was published against, which the record snapshots in required_targets rather than recomputing. Adding a platform to the model is a promise about the next release: v0.3.1 cannot grow a riscv64 artifact however the model changes afterwards, and a check that said otherwise would turn every historical record invalid the day a target was added — which is what it did, until the first real release made it visible. The enforcement point is publication, where release-record sees the model of its own day and refuses a partial release with exit 10. A record written before the field existed carries no set and is judged on internal consistency alone.

The public metadata is generated from that record, so a record that could not be written is metadata that does not exist, and latest.json keeps pointing at the release before it.

How to see it

majordomus distribution validate            # every record against the model
bash test/run.sh 87_release_pipeline        # including a recorder given an empty directory

What it does not cover

A target the model marks unavailable is documented with its reason and is not built; the installer refuses it by name rather than pretending. That is the supported way to not ship a platform — silently omitting one is what this claim forbids.

Why it exists

The half-published release is the classic distribution failure: the tag looks green, the release page has five archives instead of six, and the sixth platform's users get a 404 from an installer that was told the platform exists. Making completeness a property of the record rather than of anyone's attention means the failure happens in CI, before anyone has downloaded anything.

Detail rendered from docs/claims/release-is-complete-or-absent.md.

From the statement to the proof

  1. 1 · the public statement

    A release publishes an artifact for every supported target or it is not published

    Made on Install, Projection.

  2. 2 · the canonical claim

    release-is-complete-or-absentdeclared status: guaranteed in docs/CLAIMS.yaml

    Defined in read it on this site · docs/DISTRIBUTION.md

  3. 3 · the implementation

    scripts/release-record

  4. 4 · the test and the scenarios

    Test: test/cases/87_release_pipeline.sh

    Executed in Install the tool in one command, on a machine with no toolchain.

  5. 5 · the recorded runs

    recorded evidence: not run how evidence is recorded

Verify it yourself

The test runs in a disposable temporary repository and asserts the behaviour, not a string in the source.

from a clone of the repository
bash test/run.sh 87_release_pipeline

Where this claim is used

responsibilities it covers

Related claims same implementation

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