Closes the 'Feel the action' gaps (.cursor/rules/campanha-action-feedback.mdc):
- BUG: action-plan task checkbox was optimistic but never revalidated — a
successful toggle visually reverted when the transition ended. The action
now revalidates the plan page; checkbox disables while pending
- map compare + candidate compare picker: optimistic select value +
useTransition; the map region dims with aria-busy and a live region
instead of flashing the full-page skeleton
- CampaignListPendingBoundary/CampaignListResults: one shared transition so
filters (municípios/apoiadores/planos), pagination, demandas status chips
(new CampaignFilterChips), and the name-search pages (new
CampaignSearchForm on lideranças/organizações/dobradinhas) dim the RESULTS
region, not only the control — children stay server-rendered (composition)
- streaming: dashboard map section behind Suspense (KPI shell paints first;
React cache() keeps the municipality scope shared, not reloaded);
municipality detail tabs (elections/leaderships/updates) stream below the
header; list-shaped loading.tsx for /municipios and /apoiadores
- logout button gets a pending state; BahiaMap init shows a visible spinner
(was sr-only)