From the 2026-06-11 critique re-run (32/40, snapshot local-only), the one P1.
What: The sidebar's "Button mapping" item is greyed when no supported game is selected, but clicking it (or navigating to its hash) lands on Status with no explanation. The deep-link guard toast added in PR #30 ("Button mapping needs a game selected in Tuning first.") covers the cold-load intent path in web/src/App.svelte, not the direct-click path through web/src/app/navigation.ts:57's readiness guard.
Why it matters: Jordan (the target first-timer) clicks a visible nav item and gets teleported with zero feedback — "would a user contact support about this?" Yes.
Fix (either, agent's choice):
- Reuse the existing
guardBounceMessages toast on the direct-click/nav path so every bounce explains itself, AND give the disabled sidebar item a hover/focus title ("Pick a supported game in Tuning to map its buttons"); or
- Replace the bounce with a teaching empty state on the Button-mapping route that names the prerequisite and links to Tuning.
Constraints: copy law (no Device/HID/gamepad/plugin/backend/bus; no "legacy" in source); App.svelte is Svelte 5 legacy $: mode — no runes; don't touch web/src/lib/api/*, web/src/lib/mock/*, web/src/lib/types.ts; cd web && npm run check green.
From the 2026-06-11 critique re-run (32/40, snapshot local-only), the one P1.
What: The sidebar's "Button mapping" item is greyed when no supported game is selected, but clicking it (or navigating to its hash) lands on Status with no explanation. The deep-link guard toast added in PR #30 ("Button mapping needs a game selected in Tuning first.") covers the cold-load intent path in
web/src/App.svelte, not the direct-click path throughweb/src/app/navigation.ts:57's readiness guard.Why it matters: Jordan (the target first-timer) clicks a visible nav item and gets teleported with zero feedback — "would a user contact support about this?" Yes.
Fix (either, agent's choice):
guardBounceMessagestoast on the direct-click/nav path so every bounce explains itself, AND give the disabled sidebar item a hover/focustitle("Pick a supported game in Tuning to map its buttons"); orConstraints: copy law (no Device/HID/gamepad/plugin/backend/bus; no "legacy" in source); App.svelte is Svelte 5 legacy
$:mode — no runes; don't touchweb/src/lib/api/*,web/src/lib/mock/*,web/src/lib/types.ts;cd web && npm run checkgreen.