Share one configured PostgreSQL pool across worker repositories and make API and worker connection budgets explicit.
Add privacy-safe aggregate request, query, pool, sync, and outbox telemetry, a loopback-only representative load fixture, bounded worker shutdown, and focused regression and integration coverage.
Document the database-wide budget formula and defer pg_stat_statements activation to a reviewed migration and planned restart.
Share bounded database pools across API repositories, consolidate sync and chat queries, and make mobile refreshes cache-aware and foreground-aware.
Add focused regression coverage, client freshness documentation, and repository agent role configuration.
Completes the half-built dares feature: send a dare, respond, report done,
confirm, and get a push notification on every transition.
Backend (apps/api):
- New `dares` domain with couple-shared premium entitlement, a free weekly
send allowance, and server-enforced actor/state rules on every transition.
- `submitted` status so the recipient reports completion and the sender
confirms, rather than the sender guessing.
- Notifications ride the existing operations outbox via a trigger on
`sent_dares`. Push copy is generic; store compliance forbids dare text in a
preview and a test asserts no payload leaks it.
- Worker expiry sweep now covers `pending` as well as `active`/`submitted`;
an invitation nobody opened previously stayed open forever.
Fixes two latent defects:
- Deleting any dare that had been sent aborted with a check violation, because
`dare_id` is ON DELETE SET NULL while `sent_dares_dare_or_custom_check`
required it. Dare text is now snapshotted at send time, which also keeps a
couple's history stable across catalogue edits.
- The free send allowance was raceable: concurrent requests all read the same
count and every one succeeded. The count and insert are now serialized on
the sender's profile row.
Also ports `content_status` review metadata to the API catalogue, which had no
store-safety gating at all, and mirrors the review decision already enforced on
the legacy catalogue.
Mobile: dares screen (active/send/history), send sheet with duration presets,
home tile badging incoming dares, paywall on both proactive and 402 paths.
Verified: lint, typecheck, 379 unit tests, build, 71 integration tests against
local PostgreSQL.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Replace the Supabase application data plane with the Node/PostgreSQL API, migrate mobile, admin, web, and MCP callers, add controlled cutover tooling, and define hardened Dokploy infrastructure.