For the wallet piece, I'd add tests proving users only read their own transactions and that SECURITY DEFINER functions never trust caller-provided user IDs.
Glad it helped. If latency gets tight, I’d cache/materialize the per-user feature vector behind that RPC before reaching for more client-side reads.
For cold-start, I’d use global priors per club/handicap and shrink user estimates toward them until enough shots. For latency, one Edge Function -> one RLS-safe RPC usually beats several client reads.
i’d keep one migration owner for shared schema and let app-owned schemas have separate migration tables, but CI should apply all migrations against a disposable DB together.
yeah, that test is the useful signal. if 10k hot messages makes the app look huge, the next thing i'd watch is drain rate after the spike, not just peak throughput.
at 2-3k users i'd watch queues/cron more than MAU. one runaway background job can make a small app look huge fast.
yeah, exactly. stale-but-alive dashboards are worse than a hard failure because nobody gets paged.
i’d split import from apply: stage + validate async, then make the final merge as small and boring as possible.
same take here: great wakeup signal, bad durable queue. shipping ids and letting a worker re-read the row is the sane shape.
the scary part is the dashboard still looked alive. i'd want last\_refresh + row-count sanity sitting right next to the chart.