[6/12] feat: meeting platform — detection, session lifecycle, live transcription, import, notes - #15
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
🟡 Not ready to approve
There are correctness issues in crash-recovery WAV parsing and segment overlap logic (plus some detection/disclosure edge cases) that could cause corrupted audio repair or dropped transcript content.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.
Pull request overview
Implements the core “meeting platform” layer for the Windows-native app: meeting detection + corroboration signals, session lifecycle/journaling with crash recovery, live transcription with gap recovery, media import format support + progress mapping, notes/title composition, playback, and a single-source-of-truth disclosure model for summary providers.
Changes:
- Added meeting detection primitives (URL parsing, platform badges, presence signals, candidate resolver) and capture policies.
- Added durable session lifecycle components (state machine, journal store + WAV crash recovery, transcript timeline normalization) plus documentation contract.
- Added live transcription pipeline (streaming recognizer/VAD session, gap recovery), plus import formats/progress mapping, playback service, notes composition, and qualification runner.
File summaries
| File | Description |
|---|---|
| windows-native/Muesli.Windows/Services/SummaryProviderDisclosure.cs | Centralizes provider privacy disclosure + “leaves machine” logic (incl. Ollama endpoint special-case). |
| windows-native/Muesli.Windows/Services/MeetingUrlParser.cs | Strict meeting-URL recognition for supported platforms. |
| windows-native/Muesli.Windows/Services/MeetingTranscriptTimeline.cs | Maps concatenated-track timestamps back onto meeting-time for correct merges. |
| windows-native/Muesli.Windows/Services/MeetingSessionStateMachine.cs | Defines session states/triggers with bounded transition history. |
| windows-native/Muesli.Windows/Services/MeetingSessionJournalStore.cs | Persists session journal + manages part adoption/final track combine + WAV header repair. |
| windows-native/Muesli.Windows/Services/MeetingRecordingPlaybackService.cs | In-process NAudio playback service for meeting recordings. |
| windows-native/Muesli.Windows/Services/MeetingQualificationService.cs | Runs repeated ASR/diarization benchmarks and determinism checks for qualification. |
| windows-native/Muesli.Windows/Services/MeetingPresenceSignals.cs | Reads microphone/camera usage signals and dedicated-process heuristics. |
| windows-native/Muesli.Windows/Services/MeetingPlatformBadge.cs | Defines platform badge metadata for UI prompts. |
| windows-native/Muesli.Windows/Services/MeetingNotesComposer.cs | Deterministic title generation + safe resummarization/notes composition. |
| windows-native/Muesli.Windows/Services/MeetingLiveTranscriptionSession.cs | Streaming transcription session with bounded queueing, VAD commits, and gap ledgering. |
| windows-native/Muesli.Windows/Services/MeetingImportProgressMapper.cs | Maps pipeline stages/fractions to a monotonic overall progress indicator. |
| windows-native/Muesli.Windows/Services/MeetingGapRecoveryService.cs | Re-transcribes measured gaps from retained audio and merges recovered segments. |
| windows-native/Muesli.Windows/Services/MeetingCapturePolicies.cs | Defines repair backoff policy and auto-stop tracking rules. |
| windows-native/Muesli.Windows/Services/MeetingCandidateResolver.cs | Converts presence snapshots into prompt/ended decisions with hysteresis + dismissal memory. |
| windows-native/Muesli.Windows/Services/MeetingAudioHealthMonitor.cs | Detects missing/silent/clipping audio channels and produces user-safe warnings. |
| windows-native/Muesli.Windows/Services/MediaImportFormats.cs | Declares qualified import formats + actionable conversion guidance/filter string. |
| windows-native/Muesli.Windows/Services/LiveTranscriptOwnershipDescriptor.cs | Single definition of live/final/gap-recovery ownership labeling and settings projection. |
| docs/WINDOWS_MEETING_SESSION_LIFECYCLE.md | Documents the Windows meeting session lifecycle contract and operational expectations. |
Review details
- Files reviewed: 19/19 changed files
- Comments generated: 5
- Review effort level: Lite
We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.
| private static int FindDataChunk(ReadOnlySpan<byte> header) | ||
| { | ||
| for (var index = 12; index + 8 <= header.Length; index += 2) | ||
| { | ||
| if (header.Slice(index, 4).SequenceEqual("data"u8)) | ||
| { | ||
| return index; | ||
| } | ||
| } | ||
| return -1; | ||
| } |
| private static bool Overlaps(TranscriptSegment first, TranscriptSegment second) => | ||
| Math.Min(first.EndMs, second.EndMs) >= Math.Max(first.StartMs, second.StartMs); |
| public static bool IsLoopbackEndpoint(string? endpoint) | ||
| { | ||
| if (string.IsNullOrWhiteSpace(endpoint)) return true; | ||
| if (!Uri.TryCreate(endpoint.Trim(), UriKind.Absolute, out var uri)) return false; | ||
| return uri.IsLoopback; | ||
| } |
| if (path.StartsWith("l/meetup-join", StringComparison.Ordinal) || | ||
| path.StartsWith("meet/", StringComparison.Ordinal) || | ||
| path.StartsWith("l/message", StringComparison.Ordinal) == false && path.StartsWith("dl/launcher", StringComparison.Ordinal)) | ||
| { |
| "Zoom", | ||
| "Zoom Workplace", | ||
| "CptHost", // Zoom's in-meeting window host; present only during a live meeting | ||
| "ms-teams", | ||
| "Teams", | ||
| "Webex", | ||
| "webexmta", | ||
| "CiscoCollabHost", | ||
| "atmgr", // Webex meeting manager | ||
| "chime", | ||
| "Amazon Chime", | ||
| "slack", // Slack huddles run in the desktop client | ||
| "Discord" |
Adds parsing for Zoom, Teams and Meet URLs, resolution of the most likely active meeting from open windows and calendar entries, presence signals from process and audio state, and platform badges for the UI. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…nal store Models a meeting session as explicit states with legal transitions, keeps an ordered transcript timeline, records live-transcript window ownership, and journals session state to disk so a crash mid-meeting can be recovered. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…th monitoring Drives streaming recognition for the duration of a meeting, detects and backfills gaps where the stream dropped, and monitors capture health so silent or dead devices are reported rather than silently producing nothing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Declares the audio and video containers accepted for transcript import and maps decoder plus recogniser progress onto a single progress bar. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ider disclosure Composes structured notes from transcript and summary output, adds playback of the meeting recording aligned to the transcript, and states plainly which provider processed a summary and whether it left the device. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Runs an end-to-end readiness check over runtime, models and capture devices before a meeting starts so failures surface up front. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
210c5d4 to
c70ea3b
Compare
|
Claude finished @Mvkd108's task in 8m 36s —— View job Claude is reviewing this PR
|

This PR (6/12): meeting platform — detection, session lifecycle, live transcription, import, notes
Commits:
ca5c577feat: meeting URL parsing, candidate resolution and presence signals —Services/MeetingUrlParser.cs,Services/MeetingCandidateResolver.cs,Services/MeetingPresenceSignals.cs,Services/MeetingPlatformBadge.csb65fcdcfeat: meeting session state machine, transcript timeline and journal store —Services/MeetingSessionStateMachine.cs,Services/MeetingTranscriptTimeline.cs,Services/MeetingSessionJournalStore.cs,docs/WINDOWS_MEETING_SESSION_LIFECYCLE.md7c551cbfeat: live meeting transcription with gap recovery and audio health monitoring —Services/MeetingLiveTranscriptionSession.cs,Services/MeetingGapRecoveryService.cs,Services/MeetingAudioHealthMonitor.cs,Services/LiveTranscriptOwnershipDescriptor.cs15b61fdfeat: media import formats and import progress mapping —Services/MediaImportFormats.cs,Services/MeetingImportProgressMapper.cs5abf59cfeat: meeting notes composer, recording playback and summary provider disclosure —Services/MeetingNotesComposer.cs,Services/MeetingRecordingPlaybackService.cs,Services/SummaryProviderDisclosure.cs210c5d4feat: meeting qualification service —Services/MeetingQualificationService.cs,Services/MeetingCapturePolicies.cs19 files, +3,642.
Review focus
MeetingSessionStateMachine— detected → recording → finalizing → done transitions; abandonment and crash-resume viaMeetingSessionJournalStore(docs/WINDOWS_MEETING_SESSION_LIFECYCLE.mdis the contract).MeetingLiveTranscriptionSession+MeetingGapRecoveryService— behavior across audio route changes and dropouts (Bluetooth, device switch).MeetingAudioHealthMonitor— silence/dead-device detection thresholds.MediaImportFormats+MeetingImportProgressMapper— format coverage and progress reporting accuracy.SummaryProviderDisclosure— honesty about which provider produced notes (parity requirement).Expected — do not flag: live transcription ships Off by default (see Known limits); UI wiring lands in PR 9/10.
Known limits
Test evidence
--no-restore); 484/484 passing.Phase3MeetingLifecycleTests,Phase4LiveTranscriptionTests,Phase5FinalizationTests,Phase6DetectionTests,Phase7NotesTests,Phase8MediaImportTests,Phase8ImportCancellationTests,Phase8ExportTests.Previous: #14 | Next: #16