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
Adds electoral nuclei, leaderships, updates, and WhatsApp invite flows behind campaign auth, plus the consolidated schema migration that Vercel applies on deploy.
Local dev and the test suite previously defaulted to the live production
Neon database, and running the tests mutated prod data. Add guardrails plus
a proper local Postgres + migrations workflow so production can't be hit by
mistake:
- docker-compose: local Postgres 17 (matches prod) + auto-created teqo_test
- dev guard refuses a non-local DATABASE_URL; tests refuse non-_test databases
- .env.test isolates the suite; vitest/playwright load it and fail closed
- Payload migrations set up (push disabled); build runs `payload migrate`,
so deploys apply pending migrations to prod automatically
- baseline `initial` migration + idempotent consent.text varchar->jsonb fix
- `pnpm db:pull` copies prod content locally, excluding supporter PII
- docs (README, AGENTS.md) + agent skills for the local-db/migration workflow