Repository navigation
test(ladder): the P/M matrix — ordinary + control walked step by step, two modules, every step checked (stacked on #6124) - #6139
Conversation
…nary + control), two modules, every step checked ModuleUpdateLadderMatrixTest walks P1+M1 → P2+M1 → P2+M2 → P2+M3 → P3+M3 on one instance as one ordered scenario: each row is (running platform, published module set) with the loaded version of every module, its activation path (live / restart / none / declined) and whether a platform roll happened. Two modules with different floors: M_a swaps live, M_b declares boot-time infrastructure (exactly one restart). Real registry reconcile, bundle client, floor decision, landing, module-set proposal, ModuleReload request + executor and the self-update restart path; a platform roll is the running-platform seam plus the production boot computation over the same volume. Premise of row E1 throughout: no seal, sync-owned partitions at OLD content. The ordinary instance rolls P3 one step after control; control takes M_a 1.3 (floor P3) first. Negative control in the suite: M_a pinned → the walk fails at step 2 and nowhere earlier. By-hand negative control run: re-inserting the retired #4355 gate 1b (a sync-owned module waits for the seal its content does) fails both the ordinary and the control walk at step 2. ModuleUpdateLadderDeclineIsNamedTest pins row A4's naming half, which FAILS today: a module declined for its floor on the auto-update lane is named on no node (only an Information log line). Skipped with that reason; run un-skipped it fails with "declined, but no node names it — the install record's heldUpdate is ''". Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Auto-merge was not armed. This pull request targets |
|
The control plane does not arm auto-merge on this pull request: its base 'feat/module-reload' is not the default branch 'main' — an unprotected base merges the moment it is armed (#1685), so merge it by hand. PR babysitter — posted once per head; see |
2 similar comments
|
The control plane does not arm auto-merge on this pull request: its base 'feat/module-reload' is not the default branch 'main' — an unprotected base merges the moment it is armed (#1685), so merge it by hand. PR babysitter — posted once per head; see |
|
The control plane does not arm auto-merge on this pull request: its base 'feat/module-reload' is not the default branch 'main' — an unprotected base merges the moment it is armed (#1685), so merge it by hand. PR babysitter — posted once per head; see |
|
🚰 PR babysitter (build instance) is merging the base into this branch on head Why: stale: 'lane / Automatic review answered' red on a head that tested 'feat/module-reload' at 1196734 — green on the base's newest run, so a gate the base has fixed since, not the diff ('lane / Automatic review answered' concluded failure: Process completed with exit code 1.) — the base 'feat/module-reload' moved from 1196734 (what the red run tested) to 5e51313. This pull request was red because its BASE was; the base has moved since, and a re-run would test the old merge commit again. Validated: 'lane / Automatic review answered' is red on run 37288553599, a head that tested its base feat/module-reload at 1196734, while that base's newest run (now at 5e51313) is green on this check — the red is a gate the base has fixed since, not this diff's. Merging the current base into this stacked branch gives a new head whose run re-tests against the fixed base. It does not merge the pull request, push anything else or dequeue. A red after this is left for the owner (rbuergi). |
|
The control plane does not arm auto-merge on this pull request: its base 'feat/module-reload' is not the default branch 'main' — an unprotected base merges the moment it is armed (#1685), so merge it by hand. PR babysitter — posted once per head; see |
|
The control plane does not arm auto-merge on this pull request: its base 'feat/module-reload' is not the default branch 'main' — an unprotected base merges the moment it is armed (#1685), so merge it by hand. PR babysitter — posted once per head; see |
1 similar comment
|
The control plane does not arm auto-merge on this pull request: its base 'feat/module-reload' is not the default branch 'main' — an unprotected base merges the moment it is armed (#1685), so merge it by hand. PR babysitter — posted once per head; see |
The module update ladder as an ordered P/M matrix (stacked on #6124)
Rule table:
Doc/Architecture/ModuleUpdateLadder(lands in the companion PR fromtest/module-update-ladder). This PR holds the rows whose behaviour exists only in #6124: A1–A6, B1/B3 in sequence, E1.ModuleUpdateLadderMatrixTest/ModuleUpdateLadderControlMatrixTestEach row = (running platform, published module set) → expected loaded version per module, activation path (live / restart / none / declined), restarts this step, and whether a platform roll happened. One ordered scenario per instance. Two modules with different floors:
M_aswaps live,M_bdeclares boot-time infrastructure.Every step also asserts the module lane never patched the image.
Real:
RegistryUpdateReconciler.ReconcileNow,PluginBundleClient+ its floor decision,ModuleLandingService, the module-set proposal,ModuleReloadrequest + executor,SelfUpdateHostedServicewith a recording updater. Seams: the running platform (RunningPlatformVersionOverride, transient so a roll is visible to the next decision), a roll's new process = the production boot computation over the same volume, the live swap throughIModuleLiveActivation(#6123 provides the real loader), the restarted pod's report through aModuleReloadAgentstarted after the restart stamp.Premise of row E1 on every step: no seal for the running identity, every module partition sync-owned with its sync at OLD content.
Results (local, Release,
-warnaserrorclean)ModuleUpdateLadder*+PackagesAutoUpdate*+ModuleReload*: 20 passed, 1 skipped (below), 0 failed.Negative controls
ModuleUpdateLadderMatrixNegativeControlTest.APinnedPackage_FailsTheMatrixAtTheFirstModuleStep—M_apinned (None), the walk must fail at step 2 and nowhere earlier. Passes.RegistryUpdateReconciler.AdoptOne("a sync-owned module waits for the same seal its content does") →Ordinary_…andControl_…both FAIL at[2 M_a 1.1 lands live]: expected 1.1.0 loaded, measured 1.0.0; expected a live swap, measured 0 swap(s). Restored.A row that FAILS today — row A4's naming half
ModuleUpdateLadderDeclineIsNamedTest.AModuleDeclinedForItsFloor_IsNamedOnTheInstallRecordis skipped with the defect named. Un-skipped, it fails:declined, but no node names it — the install record's heldUpdate is ''. A module declined for its floor on the unattended auto-update lane is logged at Information byPluginBundleClient.AdoptModuleOutcomeand written nowhere.heldUpdateis only written by the content lane, which is idle when the package's content identity did not move. The explicit reload path names it (ModuleReloadByRestartTest.ANewerVersionAboveTheFloor_…). Un-skip with the fix.Not established
Merge
Auto-merge deliberately NOT armed: the base
feat/module-reloadis an unprotected feature branch, where arming merges at once. This retargets to main when #6124 merges.Pairs-with: none — tests only
Implementers: none — no interface member added
Mirror-sync: none — no catalog key
🤖 Generated with Claude Code