Archive completed meeting assistant changes
PR and Push Build/Test / build-and-test (push) Successful in 9m19s

This commit is contained in:
2026-06-26 13:15:47 +02:00
parent 7d16b0cad7
commit aecef30627
72 changed files with 2914 additions and 406 deletions
+60 -2
View File
@@ -55,6 +55,18 @@ Meeting Assistant SHALL clamp mixed samples after gain is applied.
Meeting Assistant SHALL write only the mixed stream to the temporary WAV used by transcription and finalization.
Meeting Assistant SHALL allow `Recording:MicrophoneDeviceId` to select a Windows microphone capture endpoint.
When `Recording:MicrophoneDeviceId` is blank or absent, Meeting Assistant SHALL use the Windows default capture endpoint.
When a microphone is selected from the tray icon menu, Meeting Assistant SHALL use that selected microphone for later recording starts until another microphone is selected or the process exits.
The tray icon right-click menu SHALL expose a `Microphone` submenu listing active microphone capture endpoints.
The `Microphone` submenu SHALL mark exactly one effective microphone as checked.
When no runtime microphone override is selected, the checked microphone SHALL be the configured microphone when it is available, otherwise the Windows default capture endpoint.
#### Scenario: Both sources produce audio
- **WHEN** microphone and computer output audio chunks are available
- **THEN** Meeting Assistant mixes them into one PCM stream before transcription
@@ -101,6 +113,29 @@ Meeting Assistant SHALL write only the mixed stream to the temporary WAV used by
- **WHEN** automated tests run without live audio devices
- **THEN** Meeting Assistant verifies the audio mixer through deterministic source abstractions rather than depending on physical microphone or speaker devices
#### Scenario: Configured microphone is used for capture
- **GIVEN** `Recording:MicrophoneDeviceId` identifies an active microphone endpoint
- **WHEN** Meeting Assistant starts microphone capture
- **THEN** it captures from that endpoint
#### Scenario: Blank microphone setting uses Windows default
- **GIVEN** `Recording:MicrophoneDeviceId` is blank
- **WHEN** Meeting Assistant starts microphone capture
- **THEN** it captures from the Windows default capture endpoint
#### Scenario: Tray menu lists microphones with current selection checked
- **GIVEN** active microphone endpoints `integrated microphone` and `other microphone`
- **AND** `integrated microphone` is the effective microphone
- **WHEN** the taskbar menu is opened
- **THEN** it shows a `Microphone` submenu
- **AND** the `integrated microphone` item is checked
- **AND** the `other microphone` item is unchecked
#### Scenario: Tray microphone selection changes later capture
- **GIVEN** active microphone endpoints `integrated microphone` and `other microphone`
- **WHEN** the user selects `other microphone` from the taskbar microphone submenu
- **THEN** later recording starts capture from `other microphone`
### Requirement: Stopping recording drains captured audio through transcription
Meeting Assistant SHALL stop capturing new audio when recording mode is stopped, but it SHALL allow already captured audio to finish running through the configured speech recognition pipeline before the recording session completes.
@@ -180,7 +215,7 @@ When switching profiles during an active meeting, Meeting Assistant SHALL keep t
When switching profiles during an active meeting, Meeting Assistant SHALL NOT create new meeting artifacts, SHALL NOT collect calendar metadata again, and SHALL NOT run the summary pipeline for the old profile segment.
When switching profiles during an active meeting, Meeting Assistant SHALL stop and drain the current speech recognition pipeline, append a transcript marker indicating the target profile, start a new speech recognition pipeline using the target profile's resolved options, and continue writing live transcription to the same transcript file.
When switching profiles during an active meeting, Meeting Assistant SHALL stop and drain the current speech recognition pipeline, append a transcript marker indicating the target profile and that speaker recognition and identities were reset, start a new speech recognition pipeline using the target profile's resolved options, and continue writing live transcription to the same transcript file.
When audio is captured while the old speech recognition pipeline is draining, Meeting Assistant SHALL buffer that audio and send it to the new profile's speech recognition pipeline after it is ready.
@@ -192,6 +227,7 @@ When switching profiles during an active meeting, Meeting Assistant SHALL clear
- **THEN** Meeting Assistant keeps the existing meeting artifacts
- **AND** drains the old speech recognition pipeline without running summary generation
- **AND** appends a transcript marker for the profile switch
- **AND** the transcript marker states that speaker recognition and identities were reset
- **AND** starts transcription with the resolved `english` profile
- **AND** continues writing transcript segments to the same transcript file
@@ -199,7 +235,7 @@ When switching profiles during an active meeting, Meeting Assistant SHALL clear
- **GIVEN** a meeting is switching from one launch profile to another
- **WHEN** audio chunks are captured before the new speech recognition pipeline is ready
- **THEN** Meeting Assistant buffers those chunks
- **AND** sends the buffered chunks to the new speech recognition pipeline after it starts
- **AND** sends the buffered chunks to the new profile's speech recognition pipeline after it starts
#### Scenario: Switching clears future speaker mappings only
- **GIVEN** a live speaker label was mapped to a named speaker before switching profiles
@@ -216,6 +252,8 @@ When a new meeting is actively recording while an older stopped meeting is still
The taskbar icon right-click menu SHALL expose recording controls based on the current state and configured launch profiles.
The taskbar icon right-click menu SHALL expose an Exit action in every recording state.
When Meeting Assistant is idle or only processing older stopped meetings, the menu SHALL allow starting a meeting recording for each configured launch profile.
When a meeting is actively recording, the menu SHALL allow stopping the recording and continuing transcription/summary generation.
@@ -224,6 +262,10 @@ When a meeting is actively recording, the menu SHALL allow canceling the recordi
When a meeting is actively recording, the menu SHALL allow switching to each configured launch profile other than the current active profile.
Selecting Exit while Meeting Assistant is idle SHALL stop the application without an additional confirmation prompt.
Selecting Exit while Meeting Assistant is recording, transcribing, recognizing speakers, or summarizing SHALL show a confirmation dialog before stopping the application.
#### Scenario: Idle tray menu can start configured profiles
- **GIVEN** launch profiles `default` and `english` are configured
- **AND** no meeting recording is active
@@ -243,6 +285,21 @@ When a meeting is actively recording, the menu SHALL allow switching to each con
- **WHEN** a newer meeting is actively recording
- **THEN** the taskbar icon indicates recording
#### Scenario: Tray menu always exposes Exit
- **GIVEN** Meeting Assistant is running
- **WHEN** the taskbar menu is opened
- **THEN** it offers an Exit action
#### Scenario: Idle Exit stops immediately
- **GIVEN** no recording, transcription, speaker recognition, or summary work is running
- **WHEN** the user selects Exit from the taskbar menu
- **THEN** Meeting Assistant stops the application without an additional confirmation prompt
#### Scenario: In-progress Exit asks for confirmation
- **GIVEN** Meeting Assistant is recording, transcribing, recognizing speakers, or summarizing
- **WHEN** the user selects Exit from the taskbar menu
- **THEN** Meeting Assistant asks for confirmation before stopping the application
### Requirement: Recording inactivity safeguard stops forgotten meetings
Meeting Assistant SHALL track transcript inactivity during an active recording from the later of meeting start or the most recent live transcript segment that contains text.
@@ -305,3 +362,4 @@ When a recording stops normally and its meeting note, transcript, and assistant
- **WHEN** the recording stops normally
- **THEN** Meeting Assistant deletes the run artifacts
- **AND** does not run summary generation
+34
View File
@@ -80,6 +80,8 @@ Meeting Assistant SHALL gate Outlook Classic COM enrichment behind the Windows c
When the Windows build starts a meeting and Outlook Classic has exactly one current Teams appointment, Meeting Assistant SHALL copy the appointment title to the meeting note and copy the appointment agenda and scheduled end time to the assistant-context frontmatter.
Meeting Assistant SHALL exclude canceled Outlook appointments from current Teams appointment metadata lookup.
Meeting Assistant SHALL copy the appointment attendees to the meeting note only when the raw appointment attendee count is less than or equal to the configured `Recording:MaxMetadataAttendeeImportCount`. The default maximum SHALL be 30 attendees.
The agenda SHALL be extracted from the appointment body content before the Teams join separator or Teams join text.
@@ -91,6 +93,12 @@ The agenda SHALL be extracted from the appointment body content before the Teams
- **AND** writes the appointment agenda into assistant-context frontmatter
- **AND** writes the appointment end time as `scheduled_end` into assistant-context frontmatter
#### Scenario: Canceled appointment is ignored during metadata lookup
- **GIVEN** Outlook Classic exposes one canceled current Teams appointment
- **AND** Outlook Classic exposes one active current Teams appointment at the same time
- **WHEN** a Windows build starts a meeting
- **THEN** Meeting Assistant selects the active appointment metadata
#### Scenario: Oversized attendee list is not imported
- **GIVEN** the configured metadata attendee import limit is 30
- **WHEN** a Windows build starts a meeting while Outlook Classic exposes exactly one current Teams appointment with 31 attendees
@@ -115,6 +123,8 @@ Meeting Assistant SHALL schedule recording-start prompts from the cached calenda
Meeting Assistant SHALL consider Teams appointments from Outlook calendar data as initial prompt candidates. The detection MAY be extended later for other meeting providers.
Meeting Assistant SHALL exclude canceled Outlook appointments from recording-start prompt candidates.
When a Teams appointment reaches its scheduled start window, Meeting Assistant SHALL show a native Windows app notification asking whether to record the meeting, with affirmative and negative actions.
On Windows, the recording-start notification SHALL request reminder-style toast behavior and remain actionable for 5 minutes.
@@ -127,6 +137,14 @@ If the user accepts the recording prompt while another recording is active, Meet
When stopping an active recording for an accepted prompt, Meeting Assistant SHALL use the normal stop path so empty or too-short recordings are removed according to existing settings and other completed recordings continue normal transcription, speaker recognition, and summary processing.
When the user accepts a recording prompt, Meeting Assistant SHALL start the recording with the accepted cached appointment's metadata and SHALL NOT perform a separate current-meeting metadata lookup for that prompted start.
Prompted-start metadata SHALL include the accepted appointment title, attendees, agenda, and scheduled end when those values are available from the cached appointment.
Prompted starts SHALL run the normal meeting workflow `created` rules before applying the accepted appointment metadata.
After `created` rules run, prompted starts SHALL apply the accepted appointment metadata and then run the normal `collecting metadata` to `transcribing` state-transition workflow rules with that metadata available in the meeting note.
#### Scenario: Teams meeting start prompts the user
- **GIVEN** scheduled Outlook recording prompts are enabled
- **AND** Meeting Assistant has synced Outlook Classic Teams appointments for today
@@ -135,6 +153,12 @@ When stopping an active recording for an accepted prompt, Meeting Assistant SHAL
- **AND** the notification remains actionable for 5 minutes
- **AND** marks that appointment as prompted for the day
#### Scenario: Canceled Teams meeting does not prompt recording
- **GIVEN** scheduled Outlook recording prompts are enabled
- **AND** Meeting Assistant has synced a canceled Outlook Classic Teams appointment for today
- **WHEN** the canceled appointment reaches its scheduled start window
- **THEN** Meeting Assistant does not show a recording prompt for that appointment
#### Scenario: Back-to-back cached Teams meetings prompt without another Outlook sync
- **GIVEN** scheduled Outlook recording prompts are enabled
- **AND** Meeting Assistant has synced two Teams appointments for today that start ten minutes apart
@@ -155,6 +179,15 @@ When stopping an active recording for an accepted prompt, Meeting Assistant SHAL
- **THEN** Meeting Assistant stops the active recording normally
- **AND** starts a new recording normally after the stop request
#### Scenario: Accepted prompt supplies meeting metadata
- **GIVEN** scheduled Outlook recording prompts are enabled
- **AND** Meeting Assistant has cached two current Teams appointments with different metadata
- **WHEN** the user accepts the recording prompt for one appointment
- **THEN** Meeting Assistant starts the recording with the accepted appointment's metadata
- **AND** does not perform a standalone current-meeting metadata lookup for that recording
- **AND** runs `created` workflow rules before writing the cached appointment metadata
- **AND** runs `collecting metadata` to `transcribing` workflow rules after writing the cached appointment metadata
#### Scenario: Prompt is disabled
- **GIVEN** scheduled Outlook recording prompts are disabled
- **WHEN** a Teams appointment reaches its scheduled start
@@ -366,3 +399,4 @@ Meeting Assistant SHALL provide a diagnostic endpoint that opens the workflow ru
- **GIVEN** the rules editor chat window content fits without scrolling or is already near the bottom
- **WHEN** a new user or assistant message is appended
- **THEN** the conversation scrolls to the bottom of the newly rendered message content
+31 -22
View File
@@ -4,32 +4,22 @@
TBD - created by archiving change define-meeting-assistant-v1. Update Purpose after archive.
## Requirements
### Requirement: Meeting Assistant generates meeting outputs
The summary note SHALL keep frontmatter links to meeting artifacts and SHALL copy `title`, `start_time`, `end_time`, `attendees`, and `projects` from the meeting note when available. If the meeting note has no title, the summary agent SHALL be able to provide a title when writing the summary.
The settings/logs agent SHALL instruct meeting-note correction workflows to keep project knowledge consistent when the corrected meeting note has project references.
When the summary agent calls `write_summary` with a non-empty `title` parameter, Meeting Assistant SHALL update the current meeting note title and write that title to the summary note frontmatter.
When a corrected meeting note adds a new project reference, the settings/logs agent SHALL inspect the corrected note broadly enough to find project-relevant information that should be written to that project.
When the summary agent calls `write_summary` without a `title` parameter or with a blank `title` parameter, Meeting Assistant SHALL keep the existing meeting note title and summary title behavior.
When a corrected meeting note changes specific content for an existing project reference, the settings/logs agent SHALL check whether corresponding project knowledge needs the same correction.
The summary instructions SHALL tell the summary agent to provide a concise `title` parameter to `write_summary` when the meeting note still has a generated default title and the meeting purpose is clear from context.
For each affected project, when an `AGENTS.md` file exists directly in the project folder, the settings/logs agent SHALL follow those project instructions before updating the project. When no project `AGENTS.md` exists, the settings/logs agent SHALL use judgment to decide what project file updates are warranted by the note correction.
#### Scenario: Summary agent renames default-titled meeting
- **GIVEN** the current meeting note has a generated default title
- **AND** the meeting purpose is clear from transcript, user notes, or assistant context
- **WHEN** the summary agent writes the summary
- **THEN** the summary instructions tell the agent to provide a concise `title` parameter
- **AND** Meeting Assistant updates the meeting note title and summary note title to the provided title
#### Scenario: Summary title parameter is omitted
- **GIVEN** the current meeting note has an existing title
- **WHEN** the summary agent writes the summary without a title parameter
- **THEN** Meeting Assistant keeps the existing meeting note title
- **AND** writes the existing title to the summary note frontmatter
#### Scenario: Summary title parameter is blank
- **GIVEN** the current meeting note has an existing title
- **WHEN** the summary agent writes the summary with a blank title parameter
- **THEN** Meeting Assistant keeps the existing meeting note title
- **AND** writes the existing title to the summary note frontmatter
#### Scenario: Settings/logs agent syncs corrected meeting notes to projects
- **GIVEN** the settings/logs agent corrects a meeting note with project references
- **WHEN** a referenced project has an `AGENTS.md`
- **THEN** the settings/logs instructions tell the agent to follow that project's instructions before updating the project
- **WHEN** a corrected note adds a new project reference
- **THEN** the instructions tell the agent to review the corrected note for project-relevant information to add to that project
- **WHEN** a corrected note changes specific information for an existing project reference
- **THEN** the instructions tell the agent to check whether project knowledge needs a matching correction
### Requirement: Meeting screenshots are captured into assistant context
Meeting Assistant SHALL expose a configurable screenshot hotkey.
@@ -50,6 +40,14 @@ When OCR returns valid crop coordinates within the original image bounds, Meetin
When OCR returns no crop coordinates or invalid crop coordinates, Meeting Assistant SHALL keep the original screenshot link and OCR result without writing a cropped image.
After transcription finishes and before summarization starts, Meeting Assistant SHALL scan the meeting note for user-authored Obsidian image embeds and Markdown image embeds.
When configured screenshot OCR is enabled and the meeting note contains image embeds, Meeting Assistant SHALL append each resolvable image to the assistant context note, state that the image came from the meeting note, preserve the original embed text for cross-reference, and run OCR for the linked image.
Meeting-note image OCR SHALL NOT copy the image file, SHALL NOT write crop images, SHALL NOT add attendees from OCR metadata, and SHALL NOT modify the meeting note.
Meeting Assistant SHALL wait for meeting-note image OCR to finish or time out before transitioning the assistant context to summarizing.
When screenshot OCR is not configured, Meeting Assistant SHALL skip OCR and keep the screenshot link.
The default OCR prompt SHALL explain that the image is from a meeting and ask the model to identify who is talking, who is presenting, what is presented, capture slide text in markdown, convert diagrams to Mermaid when possible, indicate whether visible people are clearly the exact meeting participants or only a partial result, return crop coordinates only for confidently isolated presentation/shared-screen content, and otherwise describe the scene.
@@ -73,6 +71,16 @@ The default OCR prompt SHALL explain that the image is from a meeting and ask th
- **THEN** Meeting Assistant saves a cropped screenshot beside the original image
- **AND** links the cropped screenshot before the OCR text in assistant context
#### Scenario: Meeting note image embeds are OCRed before summarization
- **GIVEN** screenshot OCR is configured
- **AND** the meeting note contains `![[whiteboard.png]]`
- **AND** the meeting note contains `![Diagram](attachments/diagram.png)`
- **WHEN** transcription finishes
- **THEN** Meeting Assistant appends both images to the assistant context as images from the meeting note
- **AND** includes the original embed text for each image
- **AND** runs OCR for each image without copying files, writing crop images, adding attendees, or modifying the meeting note
- **AND** waits for this OCR to finish or time out before transitioning to summarizing
#### Scenario: OCR is skipped when not configured
- **GIVEN** screenshot OCR is not configured
- **WHEN** the user captures a screenshot
@@ -131,3 +139,4 @@ The summary-agent instructions SHALL tell the agent to keep the one-line summary
- **WHEN** the summary agent calls `write_summary` with a one-line summary containing a line break
- **THEN** Meeting Assistant refuses the write
- **AND** does not mark the summary as written
@@ -125,6 +125,24 @@ When Azure Speech is the configured speech recognition pipeline, Meeting Assista
When Azure Speech is the configured speech recognition pipeline, Meeting Assistant SHALL use the live Azure conversation transcription segments as the finished transcript without running pyannote finalization.
When Azure Speech reports a transient connectivity interruption, Meeting Assistant SHALL keep accepting captured audio into the active in-process pipeline buffer.
When Azure Speech is reconnecting, Meeting Assistant SHALL write a transcript marker in the form `<Reconnecting... n/m>`.
When Azure Speech emits the next real transcript segment after reconnecting, Meeting Assistant SHALL replace the latest reconnect marker with that transcript segment.
When Azure Speech cannot reconnect after the configured immediate retry attempts, Meeting Assistant SHALL write a transcript marker explaining that Azure Speech is disconnected, recording can continue, and transcription/summarization will continue after Azure reconnects.
After Azure Speech reconnects through a new SDK session, Meeting Assistant SHALL clear live speaker-label assumptions for future Azure speaker labels.
When Azure Speech is still unavailable after recording stops and transcription cannot drain before the configured stop-processing timeout, Meeting Assistant SHALL persist the stopped meeting as a durable transcription backlog item that references the completed mixed WAV and meeting artifacts.
When a stopped meeting is persisted to the durable transcription backlog, Meeting Assistant SHALL release the active recording slot so another meeting can be recorded while the stopped meeting waits for Azure Speech to become available.
When Azure Speech becomes available again, Meeting Assistant SHALL retry durable backlog items, rewrite the transcript from the recorded WAV, run the normal post-transcription meeting completion and summary flow, and remove the backlog item after successful completion.
When Meeting Assistant starts, it SHALL preserve WAV files that are referenced by durable transcription backlog items instead of deleting them as stale temporary recordings.
#### Scenario: Azure Speech pipeline is configured
- **WHEN** the configured provider is `azure-speech`
- **THEN** Meeting Assistant streams captured PCM chunks to Azure AI Speech conversation transcription through the configured speech recognition pipeline without changing recording control or transcript persistence code
@@ -145,6 +163,32 @@ When Azure Speech is the configured speech recognition pipeline, Meeting Assista
- **WHEN** the configured provider is `azure-speech` and live Azure transcript segments exist
- **THEN** Meeting Assistant uses the live Azure conversation transcript segments as the finished transcript
#### Scenario: Azure reconnect marker is replaced by next transcript line
- **GIVEN** Azure Speech reports a transient connectivity interruption
- **WHEN** Meeting Assistant writes `<Reconnecting... 1/5>` and Azure later emits a transcript segment
- **THEN** Meeting Assistant replaces the reconnect marker with the transcript segment
- **AND** keeps later transcript lines intact
#### Scenario: Azure disconnected marker keeps meeting recording alive
- **GIVEN** Azure Speech cannot reconnect after the configured immediate retry attempts
- **WHEN** meeting audio continues to be captured
- **THEN** Meeting Assistant writes a transcript marker explaining that Azure Speech is disconnected
- **AND** keeps buffering captured audio in the active process for later transcription
#### Scenario: Stopped Azure meeting is queued durably while offline
- **GIVEN** Azure Speech cannot finish transcription before the recording stop-processing timeout
- **WHEN** the user stops the meeting
- **THEN** Meeting Assistant persists a durable backlog item for the stopped meeting
- **AND** keeps the completed mixed WAV referenced by that backlog item
- **AND** returns to an idle recording state so another meeting can start
#### Scenario: Durable Azure backlog resumes after connectivity returns
- **GIVEN** a stopped Azure meeting exists in the durable transcription backlog
- **WHEN** Azure Speech can transcribe the recorded WAV
- **THEN** Meeting Assistant rewrites the transcript from the recorded WAV
- **AND** runs meeting completion and summarization
- **AND** removes the durable backlog item and its temporary WAV after successful completion
### Requirement: FunASR can provide speaker-attributed streaming transcription
Meeting Assistant SHALL provide a FunASR speech recognition pipeline that streams PCM audio to a configured FunASR WebSocket endpoint.
@@ -521,3 +565,4 @@ When pyannote secondary validation is enabled, Meeting Assistant SHALL start a n
- **WHEN** Meeting Assistant starts
- **THEN** it begins preparing the configured pyannote runtime image and model cache without waiting for the first validation request
- **AND** application startup is not blocked by the warm-up task