What's fixed
- The CTWA enrichment adapter now sends the workspace Meta access token in the
Authorization: Bearer …header instead of the Graph URL query string, matching every other Meta Graph call in the codebase. Tokens no longer leak into Sentry breadcrumbs or proxy access logs. - Meta Graph error responses are JSON-parsed and classified by
error.code— only codes100(deleted/archived) and803(alias not found), plus HTTP404, mark the attribution asunavailable. Every other error staysfailedso the operator sees a real status badge. - CTWA referral image URLs are validated against a Meta CDN allowlist (
fbcdn.net/cdninstagram.com/fbsbx.com) at webhook write time and again at render time in the operator-only info card. A spoofed or future-format referral can no longer ship an attacker-controlled URL to operators' browsers. - The
persistFailureupdate onconversation_attributionsis now also scoped byworkspace_id, matching the rest of the adapter. - Refreshing the ad info card uses
router.refresh()instead ofwindow.location.reload(), so operators keep scroll position, draft messages, and unrelated inbox state across a manual refresh.
Notes
This release is a follow-up to v0.15.60 after an adversarial code review. The CTWA functionality and the operator-only info card itself are unchanged; only the implementation hardening is new.