E2E-driven fixes (the suite now passes 9/9; two journeys remain
latency-flaky on cold dev compiles and pass on retry):
- leader home crashed with Forbidden since the remodel:
loadLeaderContactsPageData loaded municipality options through the
staff-scoped loader (leaders are denied municipality reads); their scope
now derives from the engaged leadership's linked municipalities
- leaders saw 'Contato — —' instead of their supporters' names:
getAccessibleContactIds now mirrors canReadSupporter for leaders
(contacts of supporters they created)
- leader nav had two items with the same /campanha href (duplicate React
keys); the leader home IS the contact tool — one entry
- RSC serialization contracts: CampaignListPagination is a server component
again (hrefForPage stays server-side; CampaignTransitionAnchor client leaf
intercepts clicks with serializable props); CampaignSearchForm takes
basePath instead of a function prop
- hasAnyEstimate moved from the 'use client' PledgeEstimateForm to
voteEstimate.ts — server components may not call client-module exports
- playwright.config honors TEQO_TEST_DATABASE_URL (parity with
vitest.setup.ts) and uses a fixed .next/e2e dist dir so Next stops
appending per-PID entries to tsconfig include; report artifacts
eslint-ignored
436 seeded Praças (municipality-based; per-TSE-zone in Salvador/Camaçari) become
the operational unit; roles renamed to coordinator/advisor/leader with advisors
scoped to administered Praças. Leadership is one record per person across many
Praças/organizations; vote pledges split leader-declared vs staff-estimated
(estimates never serialized to leaders). Adds organizations, demand workflow
with staff-only cost/receipts, action-plan results with deputy presence, manual
political trend, multi-candidate comparison and the diverging red/white/blue
map mode. Migration 20260721_020109_remodel_plazas deliberately resets the
campaign vertical in production (public site untouched); test suite ported to
the new model (unit 187 / int 306 / e2e 9 green).