Skip to content

docs(adr): record prerelease version identity as ADR 0033 - #1383

Merged
DecisionNerd merged 1 commit into
mainfrom
docs/1378-prerelease-adr
Sep 17, 2026
Merged

DecisionNerd merged 1 commit into
mainfrom
docs/1378-prerelease-adr

Conversation

@DecisionNerd

@DecisionNerd DecisionNerd commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Publishing v0.6.0-rc.1 to crates.io, PyPI and npm contradicts ADR 0017, which permits per-ecosystem spelling only for development builds and requires a public release to be exactly MAJOR.MINOR.PATCH everywhere. The decision and that sentence cannot both stand.

Why a new ADR rather than an edit

The request was to amend ADR 0017. This repository's own policy says not to:

Accepted ADRs are immutable; a new ADR supersedes an old one rather than rewriting it.

ADR 0017 is Accepted. So this supersedes one sentence of it, following the pattern ADR 0002 and ADR 0003 already use, with a Supersedes: line naming the specific part that changes. ADR 0017 is untouched.

What changes, and what does not

The invariant ADR 0017 exists to protect is unchanged. One release still carries one logical version across every registry. The shared release set, the recovery rule and the prohibition on advancing a single surface all stand.

Two things are added.

A release version may carry a prerelease identifier, and its spelling is derived per ecosystem.

Surface Spelling of the same version
crates.io 0.6.0-rc.1
npm, all eight packages 0.6.0-rc.1
PyPI 0.6.0rc1

This is not a new mechanism. ADR 0017 already sanctions three spellings of one development version, -dev, .dev0 and -dev.0. Prereleases get the same treatment. The Python spelling is what PEP 440 normalization produces, so it is a derived fact rather than a convention, and it is why five of the eight blockers recorded on #1378 are Python filename and metadata comparisons.

A prerelease is never the default install. cargo and PyPI exclude prereleases from default resolution on their own. npm assigns latest whenever no dist-tag is given, regardless of prerelease status, so it is stated as policy and applies to all eight npm packages. A prerelease main package alongside a latest native package is a divergence of exactly the kind ADR 0017 forbids.

Evidence

  • PEP 440 normalization confirmed with packaging.version.Version: 0.6.0-rc.1, 0.6.0-rc1 and 0.6.0rc1 all normalize to 0.6.0rc1.
  • The tag-to-version coupling is real: publication strips the leading v from the tag, asserts the tag equals v plus that version, then requires the workspace version to match. Tagging around the restriction is not possible.
  • ADR index updated. No other ADR modified.

Part of #1378.

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

Publishing v0.6.0-rc.1 to crates.io, PyPI and npm contradicts the wording
in ADR 0017, which permits per-ecosystem spelling only for development
builds and requires a public release to be exactly MAJOR.MINOR.PATCH
everywhere. The decision and that sentence cannot both stand.

ADR 0017 is Accepted, and this repository's ADR policy states that
accepted records are immutable and superseded rather than rewritten. So
this is a new ADR that supersedes one sentence, not an edit in place.

The invariant ADR 0017 exists to protect is untouched: one release still
carries one logical version across every registry, and the recovery rule
and single-surface prohibition are unchanged. What changes is that the
version may carry a prerelease identifier, and that its spelling is
derived per ecosystem. PEP 440 normalizes 0.6.0-rc.1 to 0.6.0rc1 whether
or not the project agrees, so the Python spelling is a derived fact
rather than a convention. This generalizes the allowance ADR 0017 already
makes for -dev, .dev0 and -dev.0.

Also records that a prerelease is never the default install. cargo and
PyPI enforce that themselves; npm assigns latest when no dist-tag is
given, so it is stated as policy and applies to all eight npm packages.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: ef59fb65-a945-41bd-8231-050b00ea7aad

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Warning

Billing warning: we have not been able to collect payment for this subscription for more than 72 hours. Please update the payment method or pay any pending invoices in Billing to avoid service interruption.


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.

@github-actions github-actions Bot added documentation Improvements or additions to documentation release:none No release note or version impact labels Sep 17, 2026
@DecisionNerd
DecisionNerd added this pull request to the merge queue Sep 17, 2026
Merged via the queue into main with commit 0cd97e7 Sep 17, 2026
23 checks passed
@DecisionNerd
DecisionNerd deleted the docs/1378-prerelease-adr branch September 17, 2026 18:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation release:none No release note or version impact

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant