What's new
- Canonical source enforced:
public.phone_number_routingis now the canonical ownership/routing map for Metaphone_number_idvalues (phone_number_id -> workspace_id + channel_id). - Consistency hardening: new DB constraints and trigger guards prevent active routing rows from drifting away from their referenced Meta channel/workspace identity.
- Compatibility preserved:
channels.phone_number_idremains the current outbound send field, but is explicitly treated as compatibility state while canonical ownership lives in routing.
Notes
This slice is intentionally low-risk: no outbound dispatch path rewrite and no column removals. It tightens invariants and codifies the Option B decision so webhook routing and channel identity can converge safely.