chore: sort the unified pre.* prerelease timeline (drop followTag) - #144
Merged
Conversation
Drop "followTag": "nightly" so default npm semver sorting picks the newest @xmtp/node-sdk / @xmtp/node-bindings prerelease, and widen the lockstep guard to accept libxmtp'''s unified pre.<YYYYMMDDHHMM>.<channel>.<shortSha> suffix alongside the legacy nightly.<date>.<hash> / dev.<hash> shapes. ignoreUnstable: false and respectLatest: false are unchanged, so prereleases stay eligible.
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a small, self-contained Renovate maintenance change with a matching development-only lockstep-test update. It changes future prerelease dependency selection but does not modify shipped CLI behavior, schemas, deployment targets, or sensitive areas. You can add or adjust custom eligibility rules. Learn more. |
Dropping followTag left this rule sorting the whole @xmtp/node-sdk / @xmtp/node-bindings version list for the highest candidate, and rc/final releases are numerically higher than any prerelease of the same X.Y.Z -- so a stable release would have become the update candidate. allowedVersions pins the rule back to the prerelease timeline: - unified pre.<YYYYMMDDHHMM>.<channel>.<sha>, both channels: main-cut dev and nightly are one ordered timeline now; - legacy nightly.<date>.<sha>, kept for the transition so a cross-X.Y.Z move off the current legacy pins is still offered; - legacy dev.<sha> deliberately excluded -- branch-cut devs stay renovate-invisible and are delivered by bot PRs. Stable adoption therefore stays a deliberate human change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QF99maZfAqQ5onTGatgDvy
Tracks xmtp/libxmtp#4048's same-minute-collision fix: the prerelease timestamp widened from YYYYMMDDHHMM to YYYYMMDDHHMMSS, so releases minted in the same minute no longer tie and fall back to channel-word ordering.
macroscopeapp
Bot
dismissed
their stale review
August 26, 2026 02:16
Dismissing prior approval to re-evaluate 5f5e082
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
On 2026-08-25 renovate automerged a backwards version move in convos-assistants (#3646): it walked the
@xmtp/node-sdk/@xmtp/node-bindingspins off a freshdev.999b077build and onto a three-day-oldnightly.20260822one.Nothing malfunctioned — that is just what
followTagdoes.followTag: "nightly"tells renovate "whatever thenightlydist-tag points at is the target", so it follows the tag regardless of whether the tagged version is newer or older than what is already pinned. Because dev builds and nightly builds used two unrelated, mutually unorderable suffix shapes (dev.<sha>vsnightly.<date>.<sha>), there was no way for semver to arbitrate between them, and tag-following was the only mechanism available.What changes
xmtp/libxmtp#4048 gives main-cut dev and nightly releases one shared, sortable format:
Both channels now live on a single monotonic timeline, so plain semver ordering is enough and the tag-following crutch can go away.
1.
.github/renovate.json— dropfollowTag"followTag": "nightly"is deleted from the@xmtp/node-sdk/@xmtp/node-bindingspackageRule.ignoreUnstable: falseandrespectLatest: falsestay exactly as they were, so prereleases remain eligible; default npm semver sorting now picks the highest version rather than chasing a tag. Sorting cannot move backwards, so the #3646 class of regression is structurally impossible.Candidate scope
Dropping
followTagon its own would leave the rule sorting every published version, and rc/final releases are numerically higher than any prerelease of the sameX.Y.Z— a stable release, not the newest prerelease, would become the top candidate. The rule therefore also gains anallowedVersionsregex that pins it to the prerelease timeline —pre.*on both channels, plus legacy nightlies for the transition:Legacy
dev.<sha>is deliberately excluded, so branch-cut devs stay renovate-invisible, and adopting a stable release stays a deliberate human change. A suffix-less pair could never have automerged past the lockstep guard in any case —test/xmtpLockstep.test.tsasserts both pins carry a prerelease suffix, so an rc/final pin fails CI — but not being proposed at all beats failing loudly.2.
test/xmtpLockstep.test.ts— widen the suffix guardPRERELEASE_SUFFIXgrows a third alternative for the unified shape:The two legacy alternatives are deliberately kept: branch-cut dev releases still publish
X.Y.Z-dev.<shortSha>, and the current pins onmain(6.2.0-dev.999b077/1.12.0-dev.999b077) must keep matching so the guard stays live through the transition.rc<N>and final releases are still rejected.The same-suffix lockstep assertion is unaffected. One libxmtp release run stamps one timestamp for the whole run, so node-sdk and node-bindings from that run carry an identical
pre.<ts>.<channel>.<sha>suffix even though theirX.Y.Zdiffer — which is precisely what the "must come from the same libxmtp commit" check compares.Transition bridge
This lands safely before, during, or after libxmtp#4048 ships:
pre.*publish — legacy nightlies are still internally semver-ordered among themselves (nightly.20260822<nightly.20260825), so droppingfollowTagkeeps updates flowing normally; renovate just sorts within the legacy series instead of following the tag.pre.*publish —presorts above bothdevandnightlyas a dot-separated prerelease identifier, so everypre.*build outranks the entire legacy series and renovate migrates onto the new timeline on its own.dev.<sha>, which sorts below everything and is never offered as an update — they remain renovate-invisible by construction, exactly as today.No pin changes are needed in this PR; the next normal release re-pins onto the new format.
Related
pre.*formatxmtplabs/convos-assistants.🤖 Generated with Claude Code
https://claude.ai/code/session_01QF99maZfAqQ5onTGatgDvy
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.Note
Replace
followTagwithallowedVersionsregex for unified prerelease timelinefollowTag: nightlyin renovate.json with anallowedVersionsregex that permits onlypre.<14-digit ts>.(dev|nightly).<hex>,nightly.<8-digit date>.<hex>, anddev.<hex>suffixesPRERELEASE_SUFFIXin xmtpLockstep.test.ts to accept the newpre.<ts>.<channel>.<hash>form alongside the legacynightly/devforms, and updates the lockstep test failure message accordinglynightlytag, so versions published under a different tag but matching the pattern are eligible whilenightly-tagged versions that do not match are excludedMacroscope summarized 5f5e082.