Buckets inserted via SQL (hosted pg_restore buckets failed on extra versioning_status column on storage.buckets; manual bucket row match is sufficient).
Metadata: API upload created object row + file (Gate B dump COPY storage.objects partially blocked; 1 object verified).
File migrate: downloaded from hosted public URL → uploaded to R940 via Storage API (LAST1APP_DB_PROD_SUPABASE_SERVICE_ROLE_KEY).
http://192.168.1.103:8000/functions/v1/* (Kong → Edge Runtime on same VM)
Edge reachable internally; does not call hosted; jobs stay inactive until T2-1 Edge smoke
T-5 cutover (DNS live)
https://api.last1.app/functions/v1/*
Public Supabase API hostname; matches iOS + webhooks post-cutover
Never post-cutover
https://tcthzakppndkykatoefx.supabase.co/...
R940 jobs must not fire against hosted after cutover
Enable timing: After T2-1 Edge HTTP smoke, Ryan can set active=true on R940 jobs (still internal URL). At T-5, run one-shot SQL to swap 192.168.1.103:8000 → api.last1.appbefore enabling traffic cutover.