white-glove window
Day 1 through Day 7 ops for pilot brand #1.
Five-minute morning check. Green is healthy. Yellow means watch closely. Red means investigate before the operator notices. Every claim links to a SQL probe.
Headline KPIs
Ingest chain
bronze → silver → gold → platinum-
bronze.raw_pos_events last row · 4 min ago
-
silver.sales_transactions promoted 1,847 · 0 errors
-
gold.agg_daily_metrics behind 1 day · backfill running
-
platinum.morning_briefings 1 row · formatted_text 1,184 chars
Customer state and monitors
- /api/pilot/register · auto-scaffold 200 OK · organization + brand + location
- Square OAuth callback tokens stored · expires 60d
- webhook registration · 7 events manual · via Square dashboard
- first $1 test order received visible in bronze · 04:11 ET
- notification delivery · email manual day 1, automated day 3+
-
monitor_briefing_webhook_health 0 dead in 24h
fires hourly · queries ops.outbound_http_queue
-
monitor_data_freshness 1.2 days · < 2 SLO
fires every 6h · queries gold.agg_daily_metrics
-
slack alert path app.ops_slack_webhook_url GUC
unset returns log-only · safe fallback
Day-1 through Day-7 timeline
white-glove cadenceAction queue
ranked by leverage-
01
Verify briefing endpoint mount shipped
curl with Bearer service token returns 200 (was 404 across 8 days of pg_cron retries).
-
02
Square OAuth · automatic post-callback webhook register manual today
Post-pilot ticket. For Day 1, register webhook via Square dashboard with signature key. Confirm bronze.webhook_registrations populated.
-
03
Notification service end-to-end verification day 3 check
Email path is manual Day 1 only. Confirm auto-delivery from ProactiveBriefingService on Day 3 morning.
-
04
Per-merchant signature keys post-pilot
Single Render env var works for one pilot. Multi-tenant requires encrypted per-merchant keys in integration.square_oauth_tokens.
Verification probes (run from psql)
Every status above resolves to one of these SQL queries against Supabase production.
SELECT MAX(business_date) AS latest, NOW()::date - MAX(business_date) AS days_stale FROM gold.agg_daily_metrics WHERE organization_id = $1;
SELECT COUNT(*) FROM bronze.raw_pos_events WHERE organization_id = $1 AND created_at > NOW() - INTERVAL '24 hours';
SELECT title, briefing_date, length(formatted_text) AS chars FROM platinum.morning_briefings WHERE organization_id = $1 ORDER BY briefing_date DESC LIMIT 3;
SELECT job_name, status, COUNT(*) FROM ops.outbound_http_queue WHERE enqueued_at > NOW() - INTERVAL '24 hours' GROUP BY 1,2 ORDER BY 1;
Risk register
Square ETL silent 0-rows
Same pattern as 2026-04-12. Mitigated by monitor_data_freshness fail-loud alert. If days_stale > 2, page on-call.
Webhook signature key drift
Single Render env var SQUARE_WEBHOOK_SIGNATURE_KEY. Rotate on Square side breaks ingest silently. Mitigation: 401 alert on bronze receiver.
OAuth refresh path
60-day token. Refresh failure pre-expiry needs human intervention. Mitigation: 7-day warning probe scheduled.