- Shipped
- August 7, 2026 at 4:50 AM UTC
- Author
- kamo
- Commit
- 123c757
Clicking Apps & Features (or Stats & Costs) while /settings/account was already open landed on the tab you came from. Next.js swaps the query string without remounting, so SettingsView saw only a new ?tab=; its "publish activeTab to the URL" effect could not tell that from its own not-yet-rendered state and wrote the previous tab straight back over the requested one. The reconciliation is now a pure reducer (tabSync.ts) with the URL and the state each recognizing the other's echo, and the effect no longer re-runs on the render where the two disagree. An unknown ?tab= resolves to the first tab rather than erroring, which had hidden a lot of drift between the links and the pages. Every dead link is now pointed at the tab it names: security landing card ?tab=suspicious-behavior (renamed to system-access-logs long ago) phone provider-setup / dial-plans / advanced-settings / device-registration — none exist commerce products, inventory, rental-assets, vendors, subscription-plans, loan-products are per-market pages, not tabs here hrs, kb linked four and two tabs respectively; both pages have one chat channels / settings; the page renders web-chat and overview docs storage / Docs; the page configures eight association types and every tab that had no way in gets one: PHI access audit and PHI compliance (god-gated, like the tab), Document AI, bulk sender, sender photos, provider integrations. settingsMenuTabCoverage now checks all 17 settings pages in both directions, plus the landing cards.