Skip to content

feat(release): split version suffix from registry channel - #615

Merged
guibeira merged 2 commits into
mainfrom
feat/registry-tag-channels
Jul 29, 2026
Merged

feat(release): split version suffix from registry channel#615
guibeira merged 2 commits into
mainfrom
feat/registry-tag-channels

Conversation

@guibeira

@guibeira guibeira commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Problem

The distribution channel and the pre-release suffix are independent axes, and the workflow modelled them as a single list. A release is <version>@<channel>1.2.4-rc.1@next. That was not expressible: tag was a choice closed to latest|next and there was no suffix input at all, so the SOP read "Create Tag cannot produce prerelease suffixes. Push a manual annotated tag".

The first revision of this PR modelled alpha/beta/rc as channels. That was wrong — the PR was rewritten around the two-axis design.

Change

create-tag.yml gains a suffix input and keeps tag as the channel:

Input Options Role
bump patch minor major none Picks the base version
suffix none alpha beta rc stable Decides whether that base ships as a pre-release
tag latest next experimental Channel the version is published to

The two axes compose freely. bump: none iterates a pre-release without walking the version forward; stable promotes a pre-release to its base without bumping:

Bump: patch  Suffix: rc      Tag: next     ->  1.2.4-rc.1@next
Bump: none   Suffix: rc      Tag: next     ->  1.2.4-rc.2@next
Bump: none   Suffix: stable  Tag: latest   ->  1.2.4@latest

The counter comes from existing git tags (--worker on manifest_version.py bump), so repeating the same base and suffix advances -rc.1 to -rc.2 instead of colliding with the tag already pushed — the "Check tag does not exist" step would otherwise fail the release. Separate suffix lines at the same base advance independently.

parse_release_tag.py validates the channel against a closed set. The registry stores registry-tag verbatim in a free-form column and there is no unpublish: a typo — or a suffix passed as a channel, exactly the confusion that prompted this PR — would publish to a channel nothing resolves, with no way to undo it.

Reusable workflow descriptions updated (registry_tag was already type: string, so no contract changed).

Compatibility

suffix defaults to none, which reproduces current behaviour byte for byte. Existing stable releases are unaffected. 1.2.4-rc.1 normalises under PEP 440 (1.2.4rc1), so Python workers do not break.

Known limitation (outside this repo)

Publishing to next/experimental works end to end, but installing by channel name does not — and that already applied to the next that existed before this PR. The registry resolver only treats latest as an alias (resolver.service.ts:208-227); any other string falls through to semver validation and returns invalid_version. Vector indexing is also hardcoded to tag = 'latest'.

Enabling iii worker add <worker>@next requires a change in iii-hq/registry — filed as iii-hq/registry#76. Documented in the SOP so the limitation is not a surprise.

Worth noting that suffixed versions are filtered out of the resolver by isStable — that is the desired behaviour: a ^1.2.0 must never silently resolve to 1.2.4-rc.2.

Testing

Full suite: 158 passed.

  • test_manifest_version.py: parametrised suffixes, bump: none preserving the base, stable promoting, invalid suffix rejected.
  • TestPrereleaseCounter: counter continuing from existing tags and ignoring another suffix, another worker and another base.
  • test_parse_release_tag.py: the experimental channel, a suffixed version on any channel marking is_prerelease, and invalid channels rejected — including alpha, which is a suffix and never a channel.

The registry stores `registry-tag` as a free-form string and moves it
atomically per worker, so extra channels needed no API change — only the
Create Tag / Publish skills dispatch inputs were a closed choice of
latest|next.

Adds rc, beta and alpha to both, and validates the value parsed from the
annotated tag message against the same closed set. Without that check a
typo (`latests`) would publish a channel nothing ever resolves.
@vercel

vercel Bot commented Jul 28, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
workers Ready Ready Preview, Comment Jul 28, 2026 7:48pm
workers-tech-spec Ready Ready Preview, Comment Jul 28, 2026 7:48pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

skill-check — worker

0 verified, 49 skipped (no docs/).

Layer Result
structure
vale
ai
render

Four for four. Nicely done.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Registry release channels now include rc, beta, and alpha alongside latest and next. Parsing validates channel values, workflows expose the expanded choices, tests cover valid and invalid inputs, and release documentation describes the updated semantics.

Changes

Registry channel expansion

Layer / File(s) Summary
Channel validation and coverage
.github/scripts/parse_release_tag.py, .github/scripts/tests/test_parse_release_tag.py
Defines the allowed registry channels, rejects unknown values, and tests valid prerelease channels plus invalid input.
Workflow channel options
.github/workflows/create-tag.yml, .github/workflows/publish-worker-skills.yml, .github/workflows/_container.yml, .github/workflows/_publish-registry.yml, .github/workflows/_publish-worker-skills.yml
Adds rc, beta, and alpha to workflow choices and explicitly documents all supported channels.
Release channel semantics
docs/sops/release.md
Documents the expanded channels, reassignment behavior, parser rejection, install resolution, and prerelease tagging rules.

Estimated code review effort: 2 (Simple) | ~10 minutes

Suggested reviewers: ytallo, sergiofilhowz

Poem

A rabbit tags the release tree bright,
With alpha, beta, rc in flight.
“Next” hops on, “latest” stays,
Unknown tags get turned away.
The workflows bloom with channels new—
And docs tell every bunny what to do.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is relevant and captures the release-channel separation that the PR implements, even though it is a bit broader than the specific channel additions.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/registry-tag-channels

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@guibeira guibeira added the no-ticket PR deliberately has no Linear ticket (bump/typo/CI-only) label Jul 28, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/sops/release.md`:
- Around line 134-136: Standardize the spelling of “prerelease” throughout
release.md by replacing any “pre-release” variants with the document’s chosen
consistent form, while preserving the existing release behavior and wording
otherwise.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: bde71858-5fc6-4ebc-80b6-6e51d196b8d9

📥 Commits

Reviewing files that changed from the base of the PR and between 43487cb and c6cf3d1.

📒 Files selected for processing (8)
  • .github/scripts/parse_release_tag.py
  • .github/scripts/tests/test_parse_release_tag.py
  • .github/workflows/_container.yml
  • .github/workflows/_publish-registry.yml
  • .github/workflows/_publish-worker-skills.yml
  • .github/workflows/create-tag.yml
  • .github/workflows/publish-worker-skills.yml
  • docs/sops/release.md

Comment thread docs/sops/release.md Outdated
Comment on lines +134 to +136
With tag message including a prerelease channel (`registry-tag: rc`, `beta`,
`alpha` or `next`). Marks the GitHub Release as prerelease; still builds and
publishes (unless `interface_smoke: false`).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Standardize “prerelease” spelling.

release.md mixes prerelease and pre-release; use one spelling consistently across the document.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~134-~134: Do not mix variants of the same word (‘prerelease’ and ‘pre-release’) within a single text.
Context: ...eta.1 ``` With tag message including a prerelease channel (registry-tag: rc, `beta`, `a...

(EN_WORD_COHERENCY)


[uncategorized] ~135-~135: Do not mix variants of the same word (‘prerelease’ and ‘pre-release’) within a single text.
Context: ...or next). Marks the GitHub Release as prerelease; still builds and publishes (unless `in...

(EN_WORD_COHERENCY)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/sops/release.md` around lines 134 - 136, Standardize the spelling of
“prerelease” throughout release.md by replacing any “pre-release” variants with
the document’s chosen consistent form, while preserving the existing release
behavior and wording otherwise.

Source: Linters/SAST tools

Channel and pre-release suffix are independent axes, not one list. A release
is `<version>@<channel>`: 1.2.4-rc.1@next.

Create Tag gains a `suffix` input (none|alpha|beta|rc|stable) alongside the
existing bump, while `tag` stays a channel and gains `experimental`. Bump
picks the base version, suffix decides whether that base ships as a
pre-release, so `bump: none` iterates a pre-release without walking the
version forward and `stable` promotes it to its base.

The counter comes from existing git tags, so re-running with the same base
and suffix advances -rc.1 to -rc.2 instead of colliding with the pushed tag.
Each suffix line advances independently at the same base.

parse_release_tag.py validates the channel against a closed set: the registry
stores `registry-tag` verbatim, so a typo (or a suffix passed as a channel)
would publish to a channel nothing resolves, with no unpublish to undo it.
@guibeira guibeira changed the title feat(release): support rc/beta/alpha registry channels feat(release): split version suffix from registry channel Jul 28, 2026
@guibeira
guibeira merged commit d0bc06d into main Jul 29, 2026
18 checks passed
guibeira added a commit that referenced this pull request Jul 30, 2026
* Revert "fix(release): trigger alpha tag publish (#633)"

This reverts commit 45b212f.

* Revert "fix(release): trigger alpha publish pipeline (#632)"

This reverts commit 4f1b339.

* Revert "fix(ci): simplify alpha release inputs (#628)"

This reverts commit 72a6595.

* Revert "feat(release): add alpha releases from pull request branches (#626)"

This reverts commit ac0f750.

* Revert "fix(release): isolate alpha releases (#631)"

This reverts commit 156f5dd.

* Revert "chore(image-resize): bump to v0.1.13-alpha.1"

This reverts commit 0cba488.

* Revert "feat(release): split version suffix from registry channel (#615)"

This reverts commit d0bc06d.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

no-ticket PR deliberately has no Linear ticket (bump/typo/CI-only)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant