nvestigate HELP-605 for Define Financial

Kind Dispatch
Status Completed
Created Apr 14, 2026 19:29
Duration 1m 28s
Ports :3979 / :5955
Description nvestigate HELP-605 for Define Financial
Source slack
Title nvestigate HELP-605 for Define Financial
Resolved play investigate
Agent Apr 14, 19:31
I found a mismatch between the ticket and the company name. Here's what I need to surface. --- I looked up HELP-605 but it doesn't match "Define Financial" — that ticket belongs to Cooper Hitt at Fiat Wealth Management. He asked about an open API back in January, and McKade already replied that one is being built. The ticket is closed and resolved. Could you double-check the ticket number? Either the HELP number or the company name might be off. If it's a different ticket for Define Financial, I'd need the correct number. If it's a different issue for Fiat Wealth Management, HELP-605 is already handled. Outcome: NEEDS_INFO
You Apr 14, 19:33
<https://linear.app/pageport/issue/HELP-605/define-financial-multiple-notetakers> is the ticket and it for sure is why did you get htis wrong
Agent Apr 14, 19:39
Confirmed — the idempotency key includes `meeting_id`, so different books' meetings produce different keys and Recall creates separate bots. There is zero cross-book deduplication. I have everything I need for the handoff. Josh Rendler at Define Financial is getting multiple notetaker bots joining his calls, and the recordings fail when he admits them. This is a real bug in how notetakers are deduplicated — when calendar sharing puts the same event in multiple books, each book independently invites its own bot to the same call. Drafted a Linear ticket below for engineering. ```linear Title: Multiple notetaker bots join same call when calendar is shared across books Description: ## Problem When a calendar event is visible to multiple books (via `share_principal_calendar` or `CalendarBookShare`), the system creates a separate Meeting record per book. Each meeting independently passes the notetaker eligibility check and invites its own Recall bot — all targeting the same video call URL. The customer sees multiple bots in their meeting lobby, and recording fails when they're admitted (likely due to Recall conflicts with multiple bots in the same call). Reported by Josh Rendler at Define Financial (josh.rendler@definefinancial.com). ## Reproduction 1. Set up a company with 2+ books sharing the same calendar (either via `share_principal_calendar: true` on the principal's book, or an active `CalendarBookShare`) 2. Create a calendar event with a Zoom/Teams meeting link that's visible to both books 3. `EventOccurrenceService.resolve` runs → creates one Meeting per book (line 45-53 of `event_occurrence_service.rb`) 4. The `after_commit` block (lines 59-64) iterates all meetings and enqueues `Meetings::InviteNotetakerJob` for each eligible one 5. Each job calls `Meeting#invite_notetaker!` (`meeting.rb:597-630`) which builds a notetaker scoped to that meeting 6. The idempotency key (`notetaker.rb:220-231`) includes `meeting_id`, so each book's notetaker gets a unique key → Recall creates separate bots 7. Multiple bots appear in the customer's meeting lobby ## Suspected root cause The deduplication boundary is per-meeting (unique index on `meeting_id WHERE archived_at IS NULL`, pessimistic lock in `invite_notetaker!`). But when calendar sharing is active, multiple meetings exist for the same event occurrence, each with a different `meeting_id`. No layer checks whether another notetaker already exists for the same `event_occurrence` or the same `meeting_link`. Key files: - `backend/app/services/event_occurrence_service.rb:45-64` — creates meetings per book, invites notetakers for all - `backend/app/models/event_occurrence.rb:168-178` — `books_with_calendar_events` returns multiple books via principal + shares - `backend/app/models/event_occurrence.rb:180-215` — `notetaker_eligible?` only checks the per-book meeting's notetaker, not cross-book - `backend/app/models/meeting.rb:597-630` — `invite_notetaker!` lock is per-meeting row, no cross-meeting check - `backend/app/models/notetaker.rb:220-231` — idempotency key includes `meeting_id`, so different meetings = different Recall bots ## Affected users / scope Any customer with calendar sharing enabled across multiple books. This is likely affecting more than just Define Financial — any firm using `CalendarBookShare` or `share_principal_calendar: true` with notetakers enabled on multiple books. ## Suggested fix direction Add an event-occurrence-level check before inviting a notetaker. When `EventOccurrenceService` iterates books, or when `notetaker_eligible?` evaluates, check whether any other meeting for the same `event_occurrence` already has an active (non-archived) notetaker. If one exists, skip the invite for subsequent books. Alternatively, deduplicate at the `meeting_link` level — before calling `invite_oneoff`, check if any other notetaker in the same company is already targeting the same normalized meeting link within the same time window. The per-book meeting records should still be created (they serve other purposes), but only one notetaker should be invited per actual video call. ``` Outcome: ENGINEERING_HANDOFF
You Apr 14, 19:48
explain to me why you found the wrong ticket initially?
Agent Apr 14, 19:49
The dispatch skill's routing table explicitly says "HELP-xxx" is a Linear ticket format (for the `triage` play), but two things tripped me up: 1. **The word "investigate" in the request biased my routing.** The request said "investigate HELP-605" and the `investigate` play matches on phrases like "look into" / "figure out what's going on." I matched on the verb instead of the ticket ID format. 2. **Pylon also uses numeric IDs.** When I tried "HELP-605" in Pylon and it rejected the prefix, I stripped it to just `605` — which happened to match a completely unrelated closed ticket (Fiat Wealth Management asking about an API). Instead of recognizing the mismatch and checking Linear, I ran with the Pylon result and only flagged the company name discrepancy. The right call would have been: see "HELP-605," recognize that as a Linear identifier per the dispatch table, and route straight to `triage`. The request verb ("investigate") shouldn't have overridden the ticket ID format.