Two surfaces, one shared event model. The right-side summary card stays compact (no playback). The Full Timeline modal opens via "View full timeline" and is where recording playback lives — same hybrid call-card primitive as the conversation thread, plus filter chips for slicing by event type.
CampaignLead.appointmentAt. No change./api/admin/leads/[id]/timeline?counts=1 query so chip badges stay accurate after filter changes./api/calls/<outbound|personal|inbound>_<dbId>/recording — prefix encoded by the shared lib/leads/call-events.ts helper.#{type}-{id} in the URL hash).