jjbruntonandClaude Opus 5 ce0b188776 feat(dares): ship the dares loop to mobile
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>
2026-08-28 20:03:11 +01:00
2026-01-24 20:16:01 +00:00
2025-12-30 15:54:34 +00:00
2025-12-27 19:10:11 +00:00

Sauci

Sauci is a couples connection product built as a full-stack npm/Turborepo workspace.

Applications

Path Surface
apps/mobile Expo React Native customer app
apps/admin Vite/React administration app
apps/web Next.js marketing and redemption app
apps/supabase database, auth, realtime, storage, and Edge Functions
apps/mcp authenticated internal MCP service
packages/shared shared TypeScript contracts

Bootstrap and run

Use Node 20.10.0 from .nvmrc, Docker-compatible containers, and tmux.

npm ci
scripts/dev-local.sh reset
scripts/dev-local.sh up

The launcher starts local Supabase, Edge Functions, web, admin, MCP, and Expo in one tmux session. See local stack documentation for ports, logs, native launch commands, and troubleshooting.

Verify

npm run verify:fast  # lint, typecheck, unit/contract tests
npm run verify:full  # fast checks, builds, Supabase integration
npm run verify:e2e   # running-stack Playwright journeys
npm run verify       # complete pre-PR gate

Native black-box flows use npm run test:mobile:e2e. Pull requests run static and full-stack gates and retain browser traces/screenshots/videos on failure.

Agent harness

Start with AGENTS.md and the documentation index. Task/risk agent routing lives in docs/agents/routing.md, repository skills live under .codex/skills, and verified lessons follow the learning promotion lifecycle.

Database schema changes must use committed files in apps/supabase/migrations. Remote migration tools and DDL through MCP SQL execution are forbidden.

S
Description
No description provided
Readme
73 MiB
0 Stars 1 Watchers 0 Forks
Languages
TypeScript 79.3%
Python 7.6%
PLpgSQL 6.2%
HTML 2.8%
JavaScript 1.5%
Other 2.3%