Two new read-only Braze tools for drift detection, plus the audit now names every custom event and attribute
Three read-only additions aimed at the same job: auditing a Braze workspace against the source of truth that's supposed to feed it. Most lifecycle programs accrete custom attributes and segment filters faster than anyone documents them, and the drift between what the warehouse / PostHog / Stripe says and what's actually populated on Braze profiles is where personalisation quietly breaks. orbit_export_braze_user_by_id reads up to 50 raw user profiles by external_id and returns custom_attributes, custom_events, campaigns_received and the identity fields exactly as Braze stores them — pass-through, no QA-style filtering, so you can diff billingLifecycleState / planType / hasActiveSubscription against your warehouse and see where the wires crossed. orbit_read_braze_segment returns a single segment's full definition — name, description, filter logic, tags, analytics-tracking status — so segment targeting can be audited against canonical attribute names without clicking through the dashboard. And orbit_audit_braze_instance now surfaces the actual NAMES of custom events and custom attributes alongside the existing counts, so naming hygiene checks (case drift, plural-vs-singular, leftover test attributes) are one call instead of three. All three tools are read-only; none of them write to Braze.
What shipped
•New tool — orbit_export_braze_user_by_id. Reads up to 50 Braze user profiles by external_id and returns custom_attributes, custom_events, campaigns_received, canvas_steps_received, and identity fields exactly as Braze stores them. Pass-through wrapper over POST /users/export/ids with no QA-style filtering on top — for the QA-flavoured 'are test users populated correctly' check, orbit_validate_test_users is still the right call. Optional fields_to_export argument narrows the response to a specific subset of profile fields when you only need a few. Use case the tool exists for: drift detection. Given a list of external_ids and a warehouse export, the assistant can now diff what Braze has against what the source of truth says — billingLifecycleState, planType, hasActiveSubscription, any custom attribute that should be moving in lockstep with another system. Returns the requested / found / not_found counts so missing profiles surface immediately rather than getting lost in the user array.
•New tool — orbit_read_braze_segment. Reads one Braze segment's full definition via GET /segments/details: name, description, text_description, tags, created_at, updated_at, analytics_tracking_enabled, the full filter logic JSON, and the dashboard URL. The use case is auditing segment targeting against canonical attribute names — e.g. checking whether a 'Paying customers' segment actually filters on billingLifecycleState equals active, or whether it's pointing at a stale attribute name from before a schema rename. The tool returns the filter as Braze structures it, so the assistant can read the targeting logic without manual dashboard clicking. Read-only by design — segment edits still happen in Braze's UI.
•Enhancement — orbit_audit_braze_instance now returns the actual names of custom events and custom attributes alongside the existing totals. Previously the audit summary gave you the count of custom events and custom attributes but not their names, so any naming-hygiene question (is the casing consistent, are there plural / singular duplicates, are there leftover test_* attributes from a long-ago experiment) required a follow-up tool call. Now the summary's custom_events and custom_attributes blocks carry a names array alongside total, matching the existing shape of standard_attributes. One audit call, full attribute inventory, ready to diff against the warehouse schema or the canonical naming convention.