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 newly shipped module version is adopted within minutes, and a fallback re-examines every new build #3650
Rule (maintainer, 2026-09-07): as soon as a new module version ships, the instance starts using it
RegistryUpdateReconciler.ReconcileModules already adopts unattended when the registry's bundle version is newer than the landed one, or the same version was rebuilt against a different framework build (ModuleUpdateDecision, Plugins#931/#723). Two gaps remain against the rule:
A module running its previous generation (the keep-the-old fallback) is not re-examined when a build that WOULD load appears under the same version: SkipUpToDate fires on Compare(bundleVersion, landed.Version) == 0 with an equal served MVID. Change: when the entry is in fallback (newest generation unloadable), an index entry with the same version but a frameworkMvid different from the unloadable generation's is a Land ("a build for this platform appeared").
The reconcile runs once per boot and on catalog opens (PluginUpdateOnGreenBuild: "a consumer learns on its next boot"). Change: the registry's ProposeModuleSet / publish path already raises a ModulePublished event locally; the platform-release broadcast (FrameworkReleaseBroadcaster) exists for images. Add a ModulePublished broadcast to consumers (same inbox as the release broadcast), which triggers ReconcileModules for that package only, so "ships" → "used" is minutes, not the next boot. Without the broadcast, a scheduled reconcile (every 30 min, SelfUpdate:MinRollInterval cadence) is the floor.
A landed-but-not-loaded newer generation still needs a restart to load (PendingRestart). Keep that contract (a module swap is a restart) but make the restart happen: SetPendingRestart(true) → the self-updater's tick treats a pending restart like a roll of the same image (respecting MinRollInterval), instead of waiting for the next unrelated roll.
Tests
ModuleUpdateIdentityTest: fallback + same version + new identity → Land; RegistryUpdateReconcilerTest: broadcast triggers one package's reconcile; SelfUpdateVerdictTest: pending restart rolls the same image within the interval rules.
Part of the module-adoption policy (Doc/Architecture/ModuleAdoptionPolicy).
Implementation is PR #3667 (stacked on #3661). Two operational follow-ups it leaves outside this repo, recorded here so they are not lost when the PR closes this issue:
AKS restart — IDeploymentUpdater.RestartAsync is default-implemented (false → RestartUnavailable, Warning + policy node); the Kubernetes implementation (rollout-restart annotation on the pod template) is Systemorph/MeshWeaver.Plugins#1498. Until it lands the restart half of "ships → used within minutes" waits for the next image roll on AKS.
Consumer inbox slot — a consumer receives the ModulePublished broadcast only with WebhookInbox:Targets:N = Plugins/_RegistryReconcileLedger configured (and a PluginCatalog:HomeUrl at registration); the chart lives in the private Memex repo. Without it the 30-minute safety-net reconcile (PluginCatalog:ReconcileSafetyNetInterval) is the floor. Documented in PluginUpdateOnGreenBuild.md; the Helm values change is an operator task for the Memex chart.
Shipped on main in 13d3249 (#3661, merged 2026-09-08 01:42Z): step 3 (eager adoption) — PRs #3667 and #3672, 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 #3667 from Systemorph/fix/3650-eager-adoption
rbuergi commentedon Sep 8, 2026
Implementation is PR #3667 (stacked on #3661). Two operational follow-ups it leaves outside this repo, recorded here so they are not lost when the PR closes this issue:
IDeploymentUpdater.RestartAsyncis default-implemented (false→RestartUnavailable, Warning + policy node); the Kubernetes implementation (rollout-restart annotation on the pod template) is Systemorph/MeshWeaver.Plugins#1498. Until it lands the restart half of "ships → used within minutes" waits for the next image roll on AKS.ModulePublishedbroadcast only withWebhookInbox:Targets:N = Plugins/_RegistryReconcileLedgerconfigured (and aPluginCatalog:HomeUrlat registration); the chart lives in the private Memex repo. Without it the 30-minute safety-net reconcile (PluginCatalog:ReconcileSafetyNetInterval) is the floor. Documented inPluginUpdateOnGreenBuild.md; the Helm values change is an operator task for the Memex chart.fix(#3650): the boot that falls back writes the marker the reconcile …
test(#3650): the fallback chain end to end, and the marker's sidecar …
Merge pull request #3672 from Systemorph/fix/3650-eager-adoption
rbuergi commentedon Sep 8, 2026
Shipped on main in 13d3249 (#3661, merged 2026-09-08 01:42Z): step 3 (eager adoption) — PRs #3667 and #3672, merged into #3661. Closing by hand — the stacked PRs merged into the #3661 branch, so GitHub did not auto-close from their "Closes" lines.