Skip to content

What is left after the 2026-09-01 release: ops rollout, open PRs, DB and hygiene #1312

Description

@teetangh

Written after the 2026-09-01 release (devprod, merge 14422133, 60 commits). At time of writing dev and prod are identical and the production deploy is still pending.

This is a state-of-the-world list, not a plan. It supersedes the "what is left" section of #1299.


1 · Blocking production today

#1298 — production email delivery has been dead since 2026-06-18. Invalid RESEND_API_KEY. Signup and password reset are both broken, and checkout dies at the auth wall. This is an environment variable, not code — the 60-commit release changed nothing about it. This is the highest-value fix available and nothing else on this list competes with it.


2 · Stream ops rollout — unblocked, and order matters

The rollout was gated on the server-side join/end routes being live in production. They now are. Run in exactly this order:

  1. Confirm POST /api/meetings/[meetingId]/join and POST /api/meetings/[meetingId]/end are serving production traffic.
  2. npx tsx scripts/stream/backfill-call-member-role.ts --applymust be first. The grants pre-flight currently reports 7 members across 4 calls that do not hold call_member. Revoking before backfilling locks those people out of their own calls.
  3. npx tsx scripts/stream/ensure-call-type-grants.ts --apply --routes-are-deployed
  4. npx tsx scripts/stream/ensure-app-settings.ts --apply
  5. npx tsx scripts/stream/ensure-webhook-subscription.ts --apply
  6. Delete the ~10 mock calls from the Stream app. Note dev, preview and prod share one Stream app — a "test" deletion is a real deletion.
  7. Email Stream support the two open questions from Stream: what the SDK offers that we have not assessed, with costs #1160: whether recording_external_storage also covers transcription output, and confirmation of the $6.00 / 1,000 call-minute HD recording rate (the public pricing page lists only the $1.50 audio figure; $6.00 comes from a blog post).

3 · Open PRs

PR State Note
#1311 CLEAN, green Line-terminator splitter fix. Ready to merge.
#1266 open DPDP Rule 8(2)/(3) docs
#1268 open Per-call feedback / per-consultant review
#1213 open Landing/explore/detail UI overhaul
#1229 open Explore booking calendar responsive
#1148 open ISR + RSC seeding for explore pages
#434 open Legal pages for Razorpay KYC
#731 BEHIND CSMO launch strategy docs

12 open Dependabot PRs (#1288#1296, #411, #460, #736). #1293 is the Stream one: the recommendation on record is to close it, add a Dependabot ignore for stream-chat-react major, and take the @stream-io/node-sdk 0.7.64 → 0.8.3 bump separately (it is a no-op beyond a Node ≥22.12 floor we already meet). Deliberate version holds are recorded in #1283.


4 · Parked by decision

  • Recordings → external storage. Blocked on the bucket-vendor choice. Do not retire the transfer pipeline or its workflow until it lands. The SDK is already capable — no version bump needed. Supabase is not viable for shipping: the org is on the free plan, whose 50 MB/object cap clamps the bucket's nominal 500 MB against real recordings of 450–900 MB.
  • Background blur (Stream: restore noise cancellation and background blur, and put a size budget on the server function #1158). The only honest verification is a real Netlify deploy against the non-raisable 250 MB Lambda cap, and the server function already sits at ~245 MB. Blur itself is unmetered and @stream-io/video-filters-web is already on disk; Krisp (@stream-io/audio-filters-web) is the paid, per-participant-minute half and is what failed the deploy 18 times out of 18.
  • Two-party browser session, >30 min. Still needs a human. Cannot use a deploy preview — BETTER_AUTH_TRUSTED_ORIGINS is the prod URL in every Netlify context, so preview sign-in 403s INVALID_ORIGIN. Needs a local dev server on node@22.

5 · Database

Production schema is fully current with dev as of this release — verified at 145/145 tables, 0 missing columns, 118/118 enums with no missing or stale labels (the SUPABASEPLATFORM rename is fully applied), and both sidecar objects present (onboarding_draft_payload_size CHECK, consultant_review_legacy_pair_key partial unique index).

Two follow-ups fall out of that:

  • prisma db push cannot run against this database. Prisma's migrate engine fails P1017 through Supabase's session pooler, even though a plain pg client connects fine. Schema work currently needs either the Supabase API or the offline route: prisma migrate diff --from-empty --to-schema to generate expected DDL, then diff it against information_schema / pg_enum / pg_indexes with pg.
  • Two columns exist in the database but not in the schema, and a db push would drop both: ConsultantReview.isAnonymous (62/62 rows populated) and AppointmentFeedback.slotOfAppointmentId (3/4). Harmless while nothing pushes, but a db push --accept-data-loss in CI would take them silently. Someone should decide deliberately whether isAnonymous is dead.

6 · Quality and hygiene


7 · Filed, not fixed

  • Staff hold Stream's global admin role (lib/user.ts), which carries global read-channel — one stolen staff session reads every DM platform-wide, with no audit row. Stream subsystem — the tail #1134's PR train did not close #1144 separately proposes granting admin more widely; reconcile before either moves.
  • MeetingSession.organizationId uses appointment funding while chat uses plan-then-appointment, so an org that delivers a self-funded session sees nothing in its Recordings tab. Fixing it widens org visibility — an ADR-20 amendment, not a bug fix.
  • Call duration is never measured. MeetingSession has no startedAt, and one call can have many sessions, which the one-row-per-call model cannot represent. The fix is to read video_query_call_stats (one row per session, with call_duration_seconds), not to build attendance tracking.

Metadata

Metadata

Assignees

No one assigned

    Labels

    launch: pre-mvpGates launch — money, data, or a failure we would not detectproductionProduction deployment and readiness

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions