feat(manta-cli,ci,docs): MAN-84 — guard release honesty and unblock the GitHub Release from GHCR failures ahead of cutting v0.1.0 - #126
Open
catalyst-cloud-connector[bot] wants to merge 1 commit into
Open
Conversation
edd86eb feat: MAN-84 — Operators should be able to download a v0.1.0 release instead of building manta from source 6618f2a feat: MAN-84 — Operators should be able to download a v0.1.0 release instead of building manta from source d292166 feat: MAN-84 — Operators should be able to download a v0.1.0 release instead of building manta from source Catalyst-Replay-Squash: e398d46
catalyst-cloud-connector
Bot
force-pushed
the
MAN-84
branch
from
September 7, 2026 05:44
d292166 to
f3125aa
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
manta's pitch is escaping a closed-source, build-from-source-only tool, but
at HEAD there are zero git tags and zero GitHub Releases — the README's
"download a prebuilt binary" story is false for every reader. MAN-21 built
the release pipeline already; this ticket is about making the first real tag
through it both safe to cut and honest about what it ships, per decision
D7 in
docs/DECISIONS/2026-09-06-broad-review-decisions.md(tag now, don'twait on the Pi4 CPU-budget gate).
This PR carries the repo-side changes only (plan Phases 1–3). It does not
cut the
v0.1.0tag itself — that step needs push credentials toHagaleTechnologies/mantathat no agent container holds, and is documentedas a follow-up human/credentialed-agent action in the new runbook. Until
that tag is pushed, the ticket's Gherkin scenarios remain unmet; this PR is
what makes pushing it safe.
What changed
.github/workflows/release-publish.yml(+56/−3)verify-versionjob that fails the run if the pushed tag(
vX.Y.Z) disagrees with[workspace.package] versioninCargo.toml,so a mistagged push can't publish binaries that answer a different
version to
--version. Deliberately not aneeds:ofbuild— askipped job would skip its dependents, and
buildmust still run onworkflow_dispatch, where there's no tag to check.releasejob from a faileddocker-publish: it now gateson
!cancelled() && needs.build.result == 'success' && needs.verify-version.result == 'success'instead of a plain
needs: [build, docker-publish]. A first-ever GHCRpackage push is the leg most likely to fail, and per the ticket ("don't
block this ticket on GHCR being public — the GitHub Release binaries are
the priority"), that failure must not take the Release down with it.
docker-publishitself also gainedneeds: [verify-version, build]withits own gate, so a version-mismatched tag can't still push a mistagged
GHCR image even though the Release is correctly suppressed.
body:to the release-notes step, a short pre-stability bannerthat prepends to GitHub's
generate_release_notes: truechangelog ratherthan replacing it.
README.md(+4/−1) —## Statusnow opens with "Pre-stabilityalpha, expect breakage." instead of a bare "Pre-1.0.", stating that
v0.1.0hasn't cleared M2/M3 acceptance and that CLI flags, config keys,and the JSON spot schema can still change without a deprecation path. This
also lands inside every release archive, since the packaging step copies
README.mdinto each one.crates/manta-cli/tests/release_copy.rs(new) — three repo-propertytests, run by this repo's required
test (ubuntu-latest)/test (macos-latest)checks on every PR forever:body:both contain the pre-stability phrase(case-insensitively, since prose capitalizes it mid-sentence).
releasejob's ownif:line (extracted via a small job-blockparser, not a whole-file grep, so a match in a neighboring job can't
satisfy it) requires
needs.build.result == 'success'and must notreference
docker-publish.verify-versionjob still contains its real"$TAG_VERSION" != "$CARGO_VERSION"comparison, not just its name.docs/RUNBOOKS/release.md(new, 174 lines) — the previouslyundocumented procedure for cutting a release: preconditions, the exact
git tag -a/git pushinvocation, watching the workflow run, verifyingthe published release as an operator would (download → unpack → run →
decode), the one-time GHCR visibility flip (explicitly non-blocking, per
MAN-65/MAN-66), and how to unwind a bad release. MAN-65's planned Phase 4/5
should extend this file rather than create a second one.
Verification
All from the validation report (
d292166vs. basee398d46):cargo test -p manta-cli --test release_copy— 3 passed (observed redbefore the README/workflow copy landed, green after).
cargo test --workspace— 469 passed, 0 failed, 0 ignored, 40 targets;no regression.
cargo clippy --workspace --all-targets -- -D warningsandcargo fmt --all --check— clean.["verify-version", "build", "docker-publish", "release"]as intended.verify-version's shell logic executed directly against the realCargo.toml: exit 0 forv0.1.0, exit 1 forv0.2.0and forv0.1.0+linux(the latter incidentally also covers MAN-65 finding 1'sbuild-metadata-tag case, though not by design).
./manta --version→manta 0.1.0;./manta gen v1 && ./manta decode→ correct W1AW decode,
spots: 1.code-reviewat high effort found six issues, all test-coverage /robustness / maintainability / documentation, none correctness or
security — for example, the GHCR-decoupling guard doesn't itself assert
!cancelled()(the line that actually does the decoupling), and therelease-notes guard greps the whole workflow file rather than scoping to
the
releasejob'sbody:. Per this repo's review-convergencepolicy, these
are follow-up-ticket material rather than blocking, since they're
hardening the guards this same PR introduces rather than fixing shipped
behavior.
(macOS x86_64/arm64, Windows MSVC, Linux arm64 via
cross) and themulti-arch
docker buildx/GHCR push — this PR's ownrelease.ymlpull_requesttrigger path-matchesrelease-publish.yml, so opening itexercises all five matrix legs and the Docker build as the only pre-tag
signal on them.
Not in scope
v0.1.0tag itself (Phase 4) — requires push credentials noagent container holds; procedure is
docs/RUNBOOKS/release.md.scripts/release-version.sh, GHCR-public-by-default) — none of its fourfindings block this specific tag; tracked separately.
not a blocker for the GitHub Release deliverable.
--helpjargon cleanup, Windows CRT linkage — out ofthis ticket's Gherkin.