Skip to content

Carry speaker assignments into the live transcript engine - #7286

Merged
ComputelessComputer merged 3 commits into
mainfrom
fix/live-speaker-assignments-in-engine
Sep 3, 2026
Merged

Carry speaker assignments into the live transcript engine#7286
ComputelessComputer merged 3 commits into
mainfrom
fix/live-speaker-assignments-in-engine

Conversation

@ComputelessComputer

@ComputelessComputer ComputelessComputer commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Naming a speaker mid-meeting only relabeled the main transcript view through
a JavaScript overlay; the live engine kept emitting unlabeled segments, so
the meeting float and plugin snapshot still showed "Speaker N", and a
listener refresh started a fresh engine that knew nothing about the pick.

The desktop config sync now follows the captured session's newest transcript
and pushes its resolved identity assignments with the participant list. The
engine folds them into segment building the same way the settled render does
(hints first, participant channel defaults after), re-renders the retained
window on an identity update so on-screen segments relabel without waiting
for the next stream response, and seeds a refreshed listener with the same
assignments. Assignment changes never trigger a listener refresh.


Note

Medium Risk
Touches live transcription identity resolution and capture config sync across desktop and listener-core; mis-synced assignments could mislabel speakers in live UI, but behavior is heavily tested and failures degrade to unnamed capture.

Overview
Live capture now receives the same speaker identity assignments as the settled transcript render, so meeting float and plugin live segments show real names instead of generic speaker labels after mid-meeting picks or after a capture restart.

The desktop live capture config sync watches the active session’s newest transcript (words + speaker hints), resolves assignments via the same render path as the main UI, and debounces updateCaptureConfig with speaker_assignments alongside participants and languages. It waits for the first transcript snapshot before pushing (an empty list clears engine-held names), falls back to unnamed capture if the transcript query fails early, and re-pushes when captureGenerationBySession changes on the same session.

On the Rust side, speaker_assignments flows through session params, CaptureConfigUpdate, and listener startup via LiveTranscriptEngine::with_speaker_assignments. Identity updates call update_identities, merge persisted hints with participant channel defaults when building segments, re-render the retained window so on-screen segments relabel immediately, and emit segment deltas without waiting for the next stream chunk. Assignment-only config changes do not force a listener refresh (only language or expected speaker-count changes do).

Reviewed by Cursor Bugbot for commit 7f4b649. Bugbot is set up for automated code reviews on this repo. Configure here.

@netlify

netlify Bot commented Sep 3, 2026

Copy link
Copy Markdown

Deploy Preview for anarlog canceled.

Name Link
🔨 Latest commit 7f4b649
🔍 Latest deploy log https://app.netlify.com/projects/anarlog/deploys/6a9960984c912400083c1158

Comment thread apps/desktop/src/services/event-listeners.tsx
Comment thread apps/desktop/src/services/event-listeners.tsx
@ComputelessComputer
ComputelessComputer force-pushed the fix/live-speaker-assignments-in-engine branch from cad6b3b to 8c0f273 Compare September 3, 2026 09:39
@ComputelessComputer
ComputelessComputer force-pushed the fix/live-speaker-assignments-in-engine branch from 8c0f273 to c67c3c8 Compare September 3, 2026 10:00
Comment thread apps/desktop/src/services/event-listeners.tsx
@ComputelessComputer
ComputelessComputer force-pushed the fix/live-speaker-assignments-in-engine branch from c67c3c8 to a9f1afd Compare September 3, 2026 10:06
@ComputelessComputer
ComputelessComputer force-pushed the fix/live-speaker-assignments-in-engine branch from a9f1afd to f3a2de5 Compare September 3, 2026 10:18
Comment thread apps/desktop/src/services/event-listeners.tsx
@ComputelessComputer
ComputelessComputer force-pushed the fix/live-speaker-assignments-in-engine branch from f3a2de5 to 333c46e Compare September 3, 2026 10:28
@ComputelessComputer
ComputelessComputer force-pushed the fix/live-speaker-assignments-in-engine branch from 333c46e to ba0ee06 Compare September 3, 2026 10:30
@ComputelessComputer
ComputelessComputer force-pushed the fix/live-speaker-assignments-in-engine branch from ba0ee06 to 3dca13c Compare September 3, 2026 10:52
Comment thread apps/desktop/src/services/event-listeners.tsx
@ComputelessComputer
ComputelessComputer force-pushed the fix/live-speaker-assignments-in-engine branch 2 times, most recently from 980c2cc to f73bcd3 Compare September 3, 2026 11:24
Comment thread apps/desktop/src/services/event-listeners.tsx
Base automatically changed from fix/system-audio-follows-meeting-app to main September 3, 2026 11:41
@ComputelessComputer
ComputelessComputer force-pushed the fix/live-speaker-assignments-in-engine branch from 87f5307 to fa8adfe Compare September 3, 2026 11:41
Naming a speaker mid-meeting only relabeled the main transcript view through
a JavaScript overlay; the live engine kept emitting unlabeled segments, so
the meeting float and plugin snapshot still showed "Speaker N", and a
listener refresh started a fresh engine that knew nothing about the pick.

The desktop config sync now follows the captured session's newest transcript
and pushes its resolved identity assignments with the participant list. The
engine folds them into segment building the same way the settled render does
(hints first, participant channel defaults after), re-renders the retained
window on an identity update so on-screen segments relabel without waiting
for the next stream response, and seeds a refreshed listener with the same
assignments. Assignment changes never trigger a listener refresh.
The config signature that dedupes live capture pushes outlived the capture: restarting on the same session recomputed the same config, the push was skipped, and the fresh engine, which always starts with no speaker assignments, never got the names. Scope the signature to the store's capture generation so a new capture always pushes once.
@ComputelessComputer
ComputelessComputer force-pushed the fix/live-speaker-assignments-in-engine branch from fa8adfe to 75df9ba Compare September 3, 2026 11:41

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 75df9ba. Configure here.

Comment thread apps/desktop/src/services/event-listeners.tsx
The wait-for-snapshot gate held every push until the transcript query answered, and a query error or a rejected subscription never opened it, so a failed transcript read also froze participant and language updates for the rest of the session. A failure before the first rows now counts as an empty snapshot and the config runs without names; a failure after them keeps the last known assignments.
@ComputelessComputer
ComputelessComputer merged commit d2da3cc into main Sep 3, 2026
21 of 22 checks passed
@ComputelessComputer
ComputelessComputer deleted the fix/live-speaker-assignments-in-engine branch September 3, 2026 14:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant