Skip to content

Lessons

Cestercian edited this page Aug 8, 2026 · 1 revision

Lessons (high-signal)

Curated from HANDOFF.md §17. Read the full entry before acting on one.

# One-liner
18 CoreDeviceError 3002 is install-stage; signing team must live in project.yml; delete old same-bundle-id apps from other teams
21 "Load the whole roster once" was load-bearing — search scaling was a cache refactor
22 Trigger-name ordering + recycled enum rawValues silently rot
23 Column-level REVOKE can't subtract from table-level SELECT; Realtime publishes full rows
24 / 26 Redaction scrap: 0071 supersedes held 0061never apply 0061 after 0071
27 pg_get_functiondef includes comments — self-asserts can match their own docs
28 Parallel agents can double-number migrations; "DONE" in a plan ≠ applied to any DB
29 Fixing a migration in place leaves the old file as a poisoned template (extensions.http_post → booking outage)
30 Artist "Profile" tab was EPK — no account/sign-out/delete until AccountSettingsSection extraction
31 Instagram business_discovery needs Facebook-Login flavor; Instagram-Login tokens only read own account
32 Per-artist social-connect architecture (00930095) — where credentials live
33 Failure paths lie; device-global UserDefaults can make one user become another

Layout footgun (every designer hits this)

Image.scaledToFill() as a ZStack child grows the ZStack past the screen. .clipped() is a render clip, not a layout bound.

Fix: put the image in .background() of a fixed-size container; explicit .frame(maxWidth: .infinity, height: N) on content layers.

Migration workflow (post–Lesson 28/29)

supabase link --project-ref <dev-or-prod>
supabase db push          # passwords in operator keychain → non-interactive

Never template new SQL off an old migration file that was later fixed in place — read the latest migration that redefines the function.

Clone this wiki locally