Conversation
canMigrateFrom was >=32.0.11:0 && <=34.0.3:0, which says an install on
Nextcloud 32 can migrate into a package bundling Nextcloud 34. It cannot:
v34.0.3's $OC_VersionCanBeUpgradedFrom is {33.0, 34.0}, and
bootstrapNextcloud refuses the jump during init.
The floor is the lowest declared version whose up is IMPOSSIBLE, so
replacing the 32.0.11:0 anchor with one at 33.0.5:0 — the oldest published
33 revision — moves it. Executing the graph gives
>=33.0.5:0 && <=34.0.3:0, and 33.0.5:0 through 33.0.8:3 all still reach
34.0.3:0 through the >=33.0.5:0 && <33.0.8:2 range vertex, so
v33.0.8_2's clearTask and migrateFrom035x still run for every one of them.
Dropping the 32.0.11:0 anchor rather than keeping it alongside: with a
higher IMPOSSIBLE floor above it, it contributes no edges and no vertex
the reverse search can reach, and a released version is not on its own a
reason to declare one.
DO NOT RELEASE before Start9Labs/start-technologies#3807 is deployed to
the registries. That PR is what makes the registry publish canMigrateFrom
as sourceVersion, which is what lets it answer a 32.0.11:0 install with
the 33 release instead of this one. Until then the Updates tab still
offers this version to that cohort, and the narrower range turns a clear
"cannot update from major version 32 directly to 34" during init into an
unsatisfiable uninit target range from service_map.rs. Same rollback,
worse message.
MattDHill
force-pushed
the
fix/version-graph-floor
branch
from
September 6, 2026 04:36
eccf9de to
1b60055
Compare
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.
Warning
Do not merge or release before Start9Labs/start-technologies#3807 is deployed to the registries. On its own this change makes the failure it describes worse, not better. See "Sequencing" below.
Stacked on #131 — the floor only makes sense once
currentis34.0.3:0.What is wrong
canMigrateFromis>=32.0.11:0 && <=34.0.3:0, which claims an install on Nextcloud 32 can migrate into a package bundling Nextcloud 34. It cannot.$OC_VersionCanBeUpgradedFrominv34.0.3/version.phpis{33.0, 34.0}, andstartos/init/bootstrapNextcloud.ts:165refuses the jump during init.32.0.11:0is the version a StartOS 0.3.5.x carry-over lands on — the legacy registry serves Nextcloud 32.0.11 as current, andemver 32.0.11 → exver 32.0.11:0. So this is not a theoretical cohort.The change
The floor of a version graph is the lowest declared version whose
upisIMPOSSIBLE— everything below it has no edge into the graph, so the reverse search stops there. Replacing the32.0.11:0anchor with one at33.0.5:0(the oldest published 33 revision,v33.0.5_0) moves it.Executing the real graph:
The 0.3.5.x layout migration is unaffected.
dump()confirms the synthesized range vertex still carries it:so every 33.x revision below
:2still runsclearTask+migrateFrom035xon the way to34.0.3:0.Why the
32.0.11:0anchor is dropped rather than kept alongside. With a higherIMPOSSIBLEfloor above it, it contributes no edges and sits in no path the reverse search can reach — the range is identical with or without it. Per the packaging guide, a version having been released is not on its own a reason to declare it.Note that simply removing
v_32_0_11_0without adding a replacement does the opposite of what's wanted: the graph then synthesizes an unbounded<33.0.8:2vertex and the range widens to<=34.0.3:0.Sequencing
This change alone does not stop the Updates tab offering
34.0.3:0to a32.0.11:0install. The Updates tab filters on installed / newer / flavor only (filter-updates.pipe.ts); the piece that would consultcanMigrateFromisupdates-refinement.service.ts, and it is dead because the registry never publishes the field —source_version: None, // TODOinregistry/package/index.rs, which is what #3807 fixes.So until #3807 is deployed, the sole effect here is to change how the update fails for that cohort:
>=32.0.11:0)service_map.rscomputestarget_range(prev_can_migrate_to ∧ next_can_migrate_from), which is unsatisfiable →uninit target range … is unsatisfiable — no version can satisfy it (host contract violation), then rollback33.0.8:3offered insteadSame rollback and the same safe data in all three, but the middle row replaces a message naming the remedy with a host-contract error. That is why #131 ships first with the permissive floor, the actionable guard message, and the release-note bullet pointing at the version picker — those are the interim mitigation — and this lands only once the registry can route around it.
Verified
npm run checkandnpx prettier --checkgreen.versionGraph.dump()inspected for the migration path.