d29f76c70e
The #89788 gate read main-tab ownership from a plain module Map — invisible to React — and openGroupChat set the selection atom before recording the tab. Every open therefore rendered BotsPane in a selected-but-unowned window, painting the in-pane room beside the main tab, and the duplicate stuck because the later Map write repaints nothing. - $groupMainTabsRev atom shadows tab-map membership; all mutations go through recordGroupMainTab/dropGroupMainTab; BotsPane subscribes, so the in-pane gate re-evaluates on tab open/close. - openGroupChat records the tab BEFORE setting the selection atom; older desktops without the main-window door (and a throwing door) still get the in-pane fallback. - Regression tests: gate is false at the instant the selection atom flips (fails on the old ordering — sabotage-verified), and rev bumps on tab open/close.