You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
A platform roll is gated on measured loadability on the target, never on floors; a missing bake is a boot compile, not a hold #3651
Rule (maintainer, 2026-09-07): a platform roll is gated on what can LOAD on the target, never on declared floors — and a missing bake is a boot compile, not a hold
Today ReleaseAvailability.Evaluate declines a whole release when any installed package (a) declares a floor above the target tag (ModuleFloorExceedsTarget), or (b) has content but no sealed bake for the target identity (ContentBakeMissing), or (c) the sealed set is inconsistent. On 2026-09-07 (a) held memex-cloud on 8009 for the whole day while every candidate would have loaded; (b) would have held it again because the satellites' bakes for the new identity did not exist, although a boot compile of those courses succeeds on every PR.
Change
(a) is removed as a blocker (see the floors-advisory issue).
(b) becomes advisory: "would recompile at boot: education, crm" is reported in the verdict and on the Updates tab, but does not hold the roll. Modules:RequirePrebuilt (the strict mode) keeps its meaning for instances that opt in.
The only hold on the module lane is measured: for each installed module that has no build published for the target identity, ModulePlatformLink.Check(landed generation bytes, target surface) must say Linkable. This needs the target's surface at gate time: publish-bake-bundles.sh writes platform-surface.json (assembly → exported type names, the same set ModulePlatformSurface.OfRunningProcess builds) beside _complete for every identity; PublishedBundleCatalogue reads it; ReleaseAvailability consumes it. A release with no surface file is Indeterminate for the link check only — and Indeterminate is reported, not treated as clearance and not treated as a hold (the boot-time probe + keep-the-old fallback + readiness stall are the safety net; see the policy page).
RollSelection.Select therefore walks newest-first and stops at the first release with no UNLOADABLE module; "no complete release" (every candidate has an unloadable module) stays put and names the module.
Tests
SealedSetConsistencyTest/ReleaseGateDenominatorTest: bake-missing rows → advisory; new ReleaseLinkGateTest: a module unlinkable against the target surface holds and names the missing type; surface absent → Indeterminate reported, roll proceeds; RollSelectionTest updated.
Part of the module-adoption policy (Doc/Architecture/ModuleAdoptionPolicy). Depends on the floors-advisory change.
Shipped on main in 13d3249 (#3661, merged 2026-09-08 01:42Z): step 4 (roll gate on measured loadability) — PR #3669, merged into #3661. Closing by hand — the stacked PRs merged into the #3661 branch, so GitHub did not auto-close from their "Closes" lines.
Activity
docs: a floor is an AUTHORING claim — reconcile the ordering rule with …
Merge pull request #3669 from Systemorph/fix/3651-roll-gate-loadability
docs(#3648–#3651): the rule-change banners say the policy is implemen…
rbuergi commentedon Sep 8, 2026
Shipped on main in 13d3249 (#3661, merged 2026-09-08 01:42Z): step 4 (roll gate on measured loadability) — PR #3669, merged into #3661. Closing by hand — the stacked PRs merged into the #3661 branch, so GitHub did not auto-close from their "Closes" lines.