Data flow
How a meeting flows — capture → diarize → identify → enrich → view.
There are four flows. All of them keep capture identity-free and all naming consent-gated.
Online (live)
Conclave dispatch → recato-bot joins Meet/Teams/Zoom (structural diarization)
→ Redis transcription_segments → Conclave TEE (persist)
→ VFTE identify(ws) → provisional tags shown liveIn-person (live)
browser / OS mic → capture-diart WS (diart live + per-span NEAR Whisper ASR)
→ Redis transcription_segments → Conclave live-view (SSE at /recording/[id])Post-meeting (authoritative)
Conclave finalize → durable diarize job (Redis diarize_jobs stream)
→ GPU DiariZen worker claims over HTTP, fetches audio by reference (GET /api/diarize/audio/{uid})
→ authoritative {start,end,local_speaker}
→ POST /api/diarize/result → VFTE /v1/identify-spans(ws, audio, spans)
→ reconcile (authoritative overwrite of raw_diarization) → merge_by_timestamp
→ [speaker] text transcript → enrich → KB index/extractManual tag
Conclave UI → (a) resolved_speakers overlay (instant, raw stays immutable)
→ (b) VFTE consent-gated feedback
(self-tag auto-confirms; else PENDING until the subject confirms)The segment contract
The split between diarization and identity is exact — segment_dict:
| Field | Owner |
|---|---|
start, end, local_speaker | Capture |
voiceprint_id, name, decision, confidence | VFTE |
A second meeting recognizes the same voices — the voiceprint count does not grow. The durable
job queue (#16) makes finalize crash-safe: restarting Conclave, the worker, or the GPU box loses no
jobs (Redis XAUTOCLAIM + dead-letter).
Source: DIARIZATION-MIGRATION.md, FEATURE-SPEC.md §1.