Skip to content

feat!: 1.0.0 — so a caret range can finally do its job - #46

Merged
catomean merged 1 commit into
mainfrom
feat/v1-stable
Sep 11, 2026
Merged

feat!: 1.0.0 — so a caret range can finally do its job#46
catomean merged 1 commit into
mainfrom
feat/v1-stable

Conversation

@catomean

Copy link
Copy Markdown
Collaborator

Eleven repos depend on this package and sit on five different versions, from 0.6.2 to 0.15.0, while the registry serves 0.16.0 to none of them.

That is not neglect, and the automation is not broken.

The cause

A caret range on a pre-1.0 version does not cross a minor. ^0.13.0 means at least 0.13.0 and below 0.14.0, because semver treats a 0.x minor as a breaking change.

^0.6.2   → satisfies 0.16.0?  false      ^1.6.2   → satisfies 1.16.0?  true
^0.13.0  → satisfies 0.16.0?  false      ^1.13.0  → satisfies 1.16.0?  true
^0.15.0  → satisfies 0.16.0?  false      ^1.15.0  → satisfies 1.16.0?  true

Dependabot runs weekly in all ten consuming repos. It correctly classifies each 0.x minor as breaking, and correctly routes it to its own PR for a human to read — the right policy for a breaking change, and the wrong outcome for a package whose minors have been additive in practice. The version numbering defeated the process.

Repo Range Resolves to
fleetcrown · aoz-housing ^0.6.2 0.6.x
surf-your-life ^0.8.0 0.8.x
revamp-info ^0.12.0 0.12.x
orangecat · evig · truthseeker ^0.13.0 0.13.x
botsmann · hirnli · vitareba ^0.15.0 0.15.x

What this changes

1.0.0 ends it by construction. Afterwards ^1.x admits every later minor, Dependabot groups them with the routine bumps, and CI is the gate that makes taking them safe rather than brave.

No code changes. The surface is byte-identical to 0.16.0. This release exists to change what a range means, and bundling behaviour into it would make the one upgrade everybody has to eyeball harder to eyeball.

The cost, stated plainly

The upgrade to 1.0.0 is a real one for old consumers: coming from 0.6.x crosses ten minors of a package that was permitted to break at each. Every repo runs its own suite on the way. That cost is paid once, and it is the last time.

Also

The README gains a Versioning section stating the promise from here — minors additive, majors carry a migration note — and the rule that keeps drift uninteresting:

Model ids rot on a timescale of weeks. Anything on that clock does not belong in a release, because shipping it means a version bump per rot and one upgrade per consumer to deliver a fact that was true yesterday.

So the package ships the logic and keeps perishable data in the environment and in live catalogue fetches. That is what makes being a version behind uninteresting, which is a better property than being always current.

Verify green locally: lint, typecheck, build, 162 tests.

🤖 Generated with Claude Code

https://claude.ai/code/session_01CAfKwM1oUSA9tU9fgdhfdf

Eleven repos depend on this package and they sit on five different versions,
from 0.6.2 to 0.15.0, while the registry serves 0.16.0 to none of them. That is
not neglect and the automation is not broken.

A caret range on a pre-1.0 version does not cross a minor: `^0.13.0` means at
least 0.13.0 and below 0.14.0, because semver treats a 0.x minor as breaking.
Dependabot runs weekly in every one of those repos, correctly classifies each
0.x minor as a breaking change, and correctly routes it to its own pull request
for a human to read. That is the right policy for a breaking change and the
wrong outcome for a package whose minors have been additive in practice. The
version numbering defeated the process.

1.0.0 ends it by construction. Afterwards `^1.x` admits every later minor,
Dependabot groups them with the routine bumps, and CI is the gate that makes
taking them safe rather than brave.

No code changes. The surface is byte-identical to 0.16.0 — this release exists
to change what a range means, and bundling behaviour into it would make the one
upgrade everybody must eyeball harder to eyeball.

The upgrade TO 1.0.0 is a real one for old consumers: coming from 0.6.x crosses
ten minors of a package that was permitted to break at each. Each repo runs its
own suite. That cost is paid once.

README gains a Versioning section stating the promise from here (minors
additive, majors carry a migration note) and the rule that keeps drift
uninteresting: perishable data — model ids rot in weeks — stays in the
environment and in live catalogue fetches, never in a release.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CAfKwM1oUSA9tU9fgdhfdf
@catomean
catomean merged commit 0b6df33 into main Sep 11, 2026
1 check passed
@catomean
catomean deleted the feat/v1-stable branch September 11, 2026 16:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant