rancher/dashboard PR 19764 (codyrancher) at head ad9b8b26, tested 2026-11-04. It fixes your issue 19761: outside Cluster Explorer, every side nav group collapsed whenever the nav was rebuilt.
Preview:rancherpr19764r.mf-created-dashboard.ui.rancher.space, built from ad9b8b26, backend mf Rancher. Baseline: the shared dashboard-master preview. I confirmed the PR's currentNavState is on the running PR build and absent on master.
Verdict: still approve
We already reviewed this head on 2026-11-03, and round 1 stands. This page only adds what round 1 did not cover, 26 new live cases, each run on the PR and on master.
No bug found. Every case matches master or beats it, except two tabs (card 3), which is arguably worse and harmless.
Round 1's biggest gap is closed: the real PR build, with no patched shell, keeps Harvester's groups open on a Harvester cluster registered in Rancher. Standard User and User Base are covered too.
All 5 mutations of the fix are caught by the unit tests.
The e2e job that was failing yesterday is green now. Only Branch Milestone is red, and that one is your call (card 2).
Your pending review 5759948941 is unchanged and nothing is published. Nothing here needs adding to it.
Test it yourself
Log in as the local admin (RANCHER_PASSWORD). The login page defaults to OpenLDAP, so click "Log in as a local user" first.
Harvester: open the Harvester links above, expand all four groups and pick default in the namespace filter. Master collapses all four.
Fleet: jump to "Bundle" from the search box, then switch the header workspace. On the PR, Resources stays open and the collapse-all button stays. On master, both go.
The namespace and workspace choices save to the shared admin's prefs when you do this by hand. My runs answered every write in the browser, so nothing changed.
New cases where the PR is better
Case
master
PR 19764
Harvester registered in Rancher (harvester-118), the real PR build with no hand patch: all 4 groups open, header namespace dropdown to default
All 4 collapse
All 4 stay open
Language switch to zh-hans, Cluster Management, Providers + Advanced open
Both collapse
Both stay open, labels translate
A schema arrives (the real allSchemasIds watcher): Cluster Management Advanced, Fleet Resources
Both collapse
Both stay open
Group expanded inside the 500ms debounce window, before the rebuild runs
Collapses
Stays open
Direct load of a Cluster Management page under Advanced, then a rebuild
Active group collapses
Stays open
Direct load of a nested Explorer page (More Resources > API), then a rebuild
API collapses, parent stays
Both stay open
Fleet: jump-to "Bundle" with Resources closed, then a rebuild
Jump opens it, rebuild collapses it
Stays open
Fleet: collapse-all button after a rebuild
Button gone, nothing is expanded
Still there. Click closes all, focus moves to the first header, stays closed through another rebuild
Keyboard: Enter on Advanced, Space on Providers, focus back, rebuild
Focus stays, aria-expanded goes false on both
Focus stays, aria-expanded stays true on both
Explorer with localStorage full (setItem throws)
Rebuild collapses the group
Stays open, a small bonus of the fix
Standard User: Cluster Management, Providers + Advanced open, rebuild
Both collapse
Both stay open
User Base: same walk
Both collapse
Both stay open
Harvester in Rancher, master, after the namespace filterHarvester in Rancher, PR, after the namespace filterCluster Management, master, after the language switchCluster Management, PR, after the language switch
New cases where the PR matches master
Case
Both builds
Cluster switch with a rebuild still queued: local → created-dashboard-2 in the same tick
Nothing from local reaches the new cluster, and local restores on return
local Explorer → Fleet → created-dashboard-2 Explorer
Nothing crosses, no Fleet names in the saved state
Harvester → Explorer → Harvester on one real cluster
No shared names, no Harvester names saved in Explorer. Harvester comes back collapsed on both, nothing is saved for it
Active group collapsed by hand, then a rebuild, then a route change
Stays closed through the rebuild, the route change reopens it
Starred through the real addFavorite / removeFavorite
Starts open, stays collapsed once collapsed, other groups untouched
Explorer nested group opened by hand, rebuild, reload
Kept
Saved state corrupted: "oops", [1,2], 5, {bad, null
Page loads, groups still work
Explorer subgroup whose schemas go away and come back (inUse_K3s)
Returns open from localStorage
Fleet group whose schemas go away and come back (Resources)
Returns closed: the tree lost it and nothing is saved (card 4)
Preferences and back, which remounts SideNav
Cluster Management Advanced closed, Explorer restored (card 4)
Standard User as a cluster member on created-dashboard-2 Explorer: 3 groups open, rebuild, reload
All kept
Fleet for Standard User and User Base
No collapsible groups, so nothing to carry. User Base has no Explorer here, it lands on Home
Unit test strength
Mutation of the fix, in a fresh clone
SideNav.test.ts (28 tests)
stampNavState back to load() (master's code)
3 fail
Precedence swapped, storage outranks the tree
1 fails
Storage ignored in the merge
5 fail
Only top-level groups carried, nested ones dropped
4 fail
Only true carried
3 fail
Unmodified, the head passes all 28. The wider set (shell/components/nav, SideNav, shell/composables) passes 47 suites, 918 tests. The file was restored after each mutation.
Findings
1
The new rule has no comment in the code
shell/components/SideNav.vue:322
Nit, optional
From round 1, already in your pending review. The rule that the tree on screen beats localStorage is guarded by a single test (the precedence-swap mutation above fails only that one), so the one-line comment is still worth asking for.
2
Should this stay on 2.17?
Milestone v2.17.0, Branch Milestone check red
Your call
Still open from round 1, and rechecked today. The gate says master expects v2.16.0, and there is still no release-2.16 branch. The regression came from PR 18195, which is on v2.16.0. So if this stays on 2.17, 2.16.0 ships with the collapse in Fleet, Cluster Management and Harvester unless it is backported. Moving it to v2.16.0 would turn the gate green. It is the only check holding the PR apart from the review itself.
3
Two tabs no longer sync on a rebuild
Explorer, same cluster in two tabs
FYI
Tab A opens Storage. Tab B then rebuilds its nav. On master, B opens Storage too, because the rebuild read localStorage. On the PR, B keeps what it had, and its next save writes Storage back to closed, so A's choice is lost on reload.
This is narrower than it sounds. Without a rebuild, master overwrites A's choice in exactly the same way (I ran that too), so tabs were already last-write-wins. It follows directly from the on-screen tree outranking storage, and a tab not changing under your hands is arguably better. I would not raise it.
4
Outside Explorer, state still resets when the tree is lost
Preferences and back; a group whose schemas leave and return
FYI
The fix carries state from the tree on screen, so it can't help once that tree is gone. Going to Preferences and back remounts SideNav, and Cluster Management's Advanced comes back closed. A Fleet group whose schemas leave and return also comes back closed. Both match master, and the PR description says persistence outside Explorer is deliberately left out. Your issue only asks for rebuilds, so this is not a gap in the PR. If someone reports the Preferences round trip, it needs its own issue.
Checked
CI: 37 passed, 16 skipped, 1 failed (Branch Milestone). e2e-test (admin, @virtualizationMgmt, @fleet), which round 1 saw failing, passes on the same commit after the auto-retry. It failed on master runs that day too, so this PR isn't the cause.
Master baseline: the last commit touching SideNav.vue, Group.vue or the storage composable on current master is older than the baseline, so the comparison still holds.
Name collisions: "none share names today" holds for what is installed on mf. Across manager (providers, advanced), fleet (resources), harvester (networks, backupAndSnapshot, rbac, advanced) and Explorer, only advanced repeats, and that move changes cluster, which clears the tree first (round 1 checked it live). auth, settings, uiplugins and harvesterManager have no collapsible groups.
Temporary users: I created zz19764std and zz19764base on mf for the role cases, plus a cluster-member binding on created-dashboard-2, and deleted them afterwards. No user, global role binding or cluster binding is left.
Not checked
Standalone Harvester was only run in round 1, on the hand-patched preview. Today's real-build run is Harvester inside Rancher, not a standalone shell release.
The code comment says More Resources subgroups come and go with the namespace filter. On mf none did, even filtering to kube-node-lease, so I forced that case by removing schemas in the browser.
Extensions not installed on mf could share group names. A shared name would just open one group.
Chromium only. I did not run Cypress locally, CI covers it.
Most rebuilds were triggered by the real watcher or by calling getGroups(). The real header dropdown was used for Harvester today and for Fleet in round 1.