fix(ci): the v-prefixed image alias must be {{raw}}, not v{{version}} (+ VERSION 0.9.5-rc2) - #2505
Merged
Merged
Conversation
`v{{version}}` is a COMPONENT pattern, so docker/metadata-action drops it for a
pre-release under the same documented rule that correctly drops
`{{major}}.{{minor}}`: "Pre-release (rc, beta, alpha) will only extend
{{version}} (or {{raw}} if specified) as tag". `{{raw}}` is the documented
exception and keeps the `v`.
Observed on v0.9.5-rc1: all five packages published `0.9.5-rc1` and
`sha-0f4d54d`, and NO `v0.9.5-rc1`.
That is not cosmetic — it broke the marketplace build outright, which is the
one thing the RC was cut for. `packer/digitalocean/scripts/01-provision.sh`
feeds a single `TRINITY_IMAGE_TAG` to two consumers that need different
strings once they diverge:
line 86: git clone --depth 1 --branch "${TRINITY_IMAGE_TAG}" -> v0.9.5-rc1
line 93: docker pull ghcr.io/abilityai/trinity-*:${TAG} -> 0.9.5-rc1
They are the same string only while this alias exists, so its absence leaves
NO value of `image_tag` able to build the snapshot. #2280's own comment
predicted the failure ("makes the release name and the image tag the same
string, which is what anyone reading the releases page will type") — it just
did not account for the pre-release rule silently removing the alias.
`{{version}}` and `{{major}}.{{minor}}` are untouched: the first is what a
prerelease extends, the second is correctly withheld from one.
Guarded by tests/unit/test_2471_publish_images_prerelease_latest.py (extended
from the #2499 suite) — verified to fail against the pre-fix expression.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9bL6DZ8QVyrSvPybp5ZuK
Rides this PR rather than its own: `dev` is protected, so every write costs a review cycle, and both changes are prerequisites for the same rc2 cut with the same reviewer. The playbook already batches release-prep writes onto one `chore/release-<semver>` branch (Step 4 + Step 6a) — splitting them here was ceremony, not safety. rc2 rather than a re-cut of rc1: an RC tag is immutable by the playbook's own rule, because a snapshot built from it may already sit in a vendor queue. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K9bL6DZ8QVyrSvPybp5ZuK
{{raw}}, not v{{version}}{{raw}}, not v{{version}} (+ VERSION 0.9.5-rc2)
webmixgamer
approved these changes
Sep 2, 2026
webmixgamer
left a comment
Contributor
There was a problem hiding this comment.
Reviewed with /review, /cso --diff and /validate-pr: no critical findings.
- Tests verified locally: 5 pass on the branch, and restoring the
origin/devworkflow line fails exactly the 2 alias tests. - Bug reproduced against GHCR with an anonymous manifest inspect:
trinity-backend:0.9.5-rc1present,:v0.9.5-rc1absent. - metadata-action rule confirmed in the vendor README (
{{raw}}keeps thevon a pre-release); the fourdocker/*SHA pins resolve to the versions their comments claim.
One ask before merge: add Refs #2281 to the body, matching #2499 and #2471, so the PR is traceable to the listing it unblocks. A flow-doc paragraph for the pre-release tag set (hosted-install.md still describes release tags only) follows in a separate docs PR.
webmixgamer
added a commit
that referenced
this pull request
Sep 2, 2026
) Review artifacts from validating the publish-images `{{raw}}` alias fix: - docs/memory/learnings.md: a tag-push-only workflow is never exercised by PR CI, so audit every sibling tag rule against the metadata-action pre-release rule and verify against the live registry after the first RC push (the #2499 -> #2505 incomplete-fix chain). - docs/security-reports/cso-diff-2026-09-02-2505-*: diff-scoped CSO audit, zero findings; four docker/* action SHA pins verified against their version tags. Refs #2281 Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
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.
Refs #2281 (DigitalOcean Marketplace packer bundle — this unblocks its build)
Refs #2280 (prebuilt images + pull-only hosted compose — the workflow this fixes)
Refs #2332 (Epic: one-click hosted install)
Closes nothing: each stays open on its own acceptance criteria.
Blocks the DigitalOcean snapshot. Found by cutting
v0.9.5-rc1— same family as #2499, one line over.Two commits, deliberately batched: the workflow fix, and the
VERSIONbump to0.9.5-rc2. Both are prerequisites for the same rc2 cut and need the same reviewer;devis protected, so splitting them would buy a second full review cycle for a one-line file. The playbook already batches release-prep writes this way (Step 4 + Step 6a share one branch).What happened
All five packages published
0.9.5-rc1andsha-0f4d54d. Nov0.9.5-rc1. Verified against the live registry:v{{version}}is a component pattern, so metadata-action drops it for a pre-release under the same documented rule that correctly drops{{major}}.{{minor}}:#2499 reasoned about that rule for
{{major}}.{{minor}}and didn't carry it one line up.{{raw}}is the documented exception, and it keeps thev(v1.2.3→v1.2.3).Why it isn't cosmetic
It broke the marketplace build — the one thing the RC was cut for.
packer/digitalocean/scripts/01-provision.shfeeds a singleTRINITY_IMAGE_TAGto two consumers that need different strings the moment those strings diverge:They're the same string only while this alias exists. Without it there is no value of
image_tagthat builds the snapshot:v0.9.5-rc1fails both docker pulls,0.9.5-rc1fails the git clone.#2280's comment predicted the shape of this exactly — "makes the release name and the image tag the same string, which is what anyone reading the releases page will type" — it just didn't account for the pre-release rule removing the alias on precisely the tags where nobody had looked yet.
It also silently degrades real releases' operator ergonomics: every doc and
start.sh's own pin warning sayTRINITY_IMAGE_TAG=v0.9.0, andstart.sh:529blames the operator's spelling when that 404s.The change
v0.9.5→v0.9.5(identical for real releases) ·v0.9.5-rc1→v0.9.5-rc1(currently nothing).{{version}}and{{major}}.{{minor}}are untouched — the first is what a prerelease extends, the second is correctly withheld from one.Verification
tests/unit/test_2471_publish_images_prerelease_latest.pyextended to 5 tests, all passing. Verified to catch the bug: reverting the one-line change fails 2 of them.{{raw}}present,v{{version}}absent, and no hyphen guard on any semver pattern (an RC must stay pullable by its exact tag).yaml.safe_loadon the workflow — parses.After this lands
v0.9.5-rc1is not re-cut — an RC tag is immutable by the playbook's own rule, since its images may already sit in a vendor queue. WithVERSIONalready at0.9.5-rc2from this PR, the next step is just the tag push, thenpacker build -var image_tag=v0.9.5-rc2— the first time that command can succeed.🤖 Generated with Claude Code
https://claude.ai/code/session_01K9bL6DZ8QVyrSvPybp5ZuK