From 4b7f764aff4b65f31f692fdd01eb73dcd2ec9ba8 Mon Sep 17 00:00:00 2001 From: renovate-bot Date: Mon, 28 Sep 2026 02:41:32 +0000 Subject: [PATCH 1/4] chore(deps): update dependency coverlet.collector to 10.1.0 --- MeetingAssistant.Tests/MeetingAssistant.Tests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MeetingAssistant.Tests/MeetingAssistant.Tests.csproj b/MeetingAssistant.Tests/MeetingAssistant.Tests.csproj index 8cc0182..889db7f 100644 --- a/MeetingAssistant.Tests/MeetingAssistant.Tests.csproj +++ b/MeetingAssistant.Tests/MeetingAssistant.Tests.csproj @@ -8,7 +8,7 @@ - + From b9a0bf1f83797d37117fcfb2b569c7644e8d1647 Mon Sep 17 00:00:00 2001 From: renovate-bot Date: Tue, 29 Sep 2026 02:42:03 +0000 Subject: [PATCH 2/4] chore(deps): update microsoftspeechversion to 1.52.0 --- MeetingAssistant/MeetingAssistant.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MeetingAssistant/MeetingAssistant.csproj b/MeetingAssistant/MeetingAssistant.csproj index 416b61e..59b8962 100644 --- a/MeetingAssistant/MeetingAssistant.csproj +++ b/MeetingAssistant/MeetingAssistant.csproj @@ -5,7 +5,7 @@ enable enable true - 1.51.2 + 1.52.0 From 0a6afafb9b523da04c533b12e301ba62f4ac36f1 Mon Sep 17 00:00:00 2001 From: renovate-bot Date: Wed, 30 Sep 2026 02:43:03 +0000 Subject: [PATCH 3/4] chore(deps): update dependency microsoft.agents.ai.openai to 1.23.0 --- MeetingAssistant/MeetingAssistant.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MeetingAssistant/MeetingAssistant.csproj b/MeetingAssistant/MeetingAssistant.csproj index 416b61e..3e8b7b2 100644 --- a/MeetingAssistant/MeetingAssistant.csproj +++ b/MeetingAssistant/MeetingAssistant.csproj @@ -20,7 +20,7 @@ - + From eb1ee02ea8fdb2f4388e29f87a5c93e5c54cc1cc Mon Sep 17 00:00:00 2001 From: Codex Automation Date: Wed, 7 Oct 2026 14:43:27 +0200 Subject: [PATCH 4/4] Synchronize recording lifecycle regression tests --- .../RecordingCoordinatorTests.cs | 29 +++++++++++++++++-- .../specs/meeting-summary/spec.md | 6 ++++ .../specs/meeting-session/spec.md | 6 ++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/MeetingAssistant.Tests/RecordingCoordinatorTests.cs b/MeetingAssistant.Tests/RecordingCoordinatorTests.cs index cf26419..d26ca64 100644 --- a/MeetingAssistant.Tests/RecordingCoordinatorTests.cs +++ b/MeetingAssistant.Tests/RecordingCoordinatorTests.cs @@ -53,8 +53,14 @@ public sealed class RecordingCoordinatorTests { try { - return File.Exists(path) && - File.ReadAllText(path).Contains(text, StringComparison.Ordinal); + if (!File.Exists(path)) + { + return false; + } + + using var stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete); + using var reader = new StreamReader(stream); + return reader.ReadToEnd().Contains(text, StringComparison.Ordinal); } catch (IOException) { @@ -3290,6 +3296,7 @@ public sealed class RecordingCoordinatorTests await coordinator.StartAsync(CancellationToken.None); await audioSource.WaitUntilCapturedAsync(); + await artifactStore.WaitUntilTranscribingAsync(); await coordinator.StopAsync(CancellationToken.None); @@ -3433,6 +3440,7 @@ public sealed class RecordingCoordinatorTests { var audioSource = new CapturedChunkThenCancelAudioSource(new AudioChunk([1, 0, 2, 0], 16000, 1)); var artifactStore = new InMemoryMeetingArtifactStore(); + var metadataProvider = new BlockingMeetingMetadataProvider(new MeetingMetadata("Summary failure", [], "", null)); var coordinator = new MeetingRecordingCoordinator( audioSource, new TestSpeechRecognitionPipelineFactory(new FinalSegmentOnAudioCompletionProvider()), @@ -3443,11 +3451,15 @@ public sealed class RecordingCoordinatorTests new InMemoryRecordedAudioStore(), new CapturingMeetingSummaryPipeline(succeeded: false), Options.Create(CreateOptionsWithoutFinalizer()), - NullLogger.Instance); + NullLogger.Instance, + meetingMetadataProvider: metadataProvider); await coordinator.StartAsync(CancellationToken.None); + await metadataProvider.WaitUntilRequestedAsync(); await audioSource.WaitUntilCapturedAsync(); + metadataProvider.Release(); + await artifactStore.WaitUntilTranscribingAsync(); await coordinator.StopAsync(CancellationToken.None); Assert.Equal( @@ -3481,6 +3493,7 @@ public sealed class RecordingCoordinatorTests await coordinator.StartAsync(CancellationToken.None); await audioSource.WaitUntilCapturedAsync(); + await artifactStore.WaitUntilTranscribingAsync(); await coordinator.StopAsync(CancellationToken.None); @@ -4497,6 +4510,7 @@ public sealed class RecordingCoordinatorTests private sealed class InMemoryMeetingArtifactStore : IMeetingArtifactStore { + private readonly TaskCompletionSource transcribing = new(TaskCreationOptions.RunContinuationsAsynchronously); private readonly bool createAssistantContextFile; private bool failNextMetadataUpdate; @@ -4512,6 +4526,11 @@ public sealed class RecordingCoordinatorTests public List States { get; } = []; + public Task WaitUntilTranscribingAsync() + { + return transcribing.Task.WaitAsync(TimeSpan.FromSeconds(15)); + } + public string? Agenda { get; private set; } public DateTimeOffset? ScheduledEnd { get; private set; } @@ -4553,6 +4572,10 @@ public sealed class RecordingCoordinatorTests CancellationToken cancellationToken) { States.Add(state); + if (state == AssistantContextState.Transcribing) + { + transcribing.TrySetResult(); + } return Task.CompletedTask; } diff --git a/openspec/changes/archive/2026-05-19-define-meeting-assistant-v1/specs/meeting-summary/spec.md b/openspec/changes/archive/2026-05-19-define-meeting-assistant-v1/specs/meeting-summary/spec.md index 85c11a1..90a14d8 100644 --- a/openspec/changes/archive/2026-05-19-define-meeting-assistant-v1/specs/meeting-summary/spec.md +++ b/openspec/changes/archive/2026-05-19-define-meeting-assistant-v1/specs/meeting-summary/spec.md @@ -58,6 +58,12 @@ The summary agent SHALL be able to read and write the assistant context body as - **WHEN** transcription, final speaker recognition, and summary generation progress - **THEN** Meeting Assistant updates assistant context frontmatter state to `transcribing`, `speaker recognition`, `summarizing`, `finished`, or `error` as appropriate +#### Scenario: Summary failure follows initialized transcription +- **GIVEN** a meeting has completed its initial metadata collection and reached `transcribing` +- **WHEN** recording stops and automatic summary generation fails +- **THEN** assistant context transitions from `transcribing` to `summarizing` and then `error` +- **AND** observing captured audio alone does not establish that metadata collection has finished + #### Scenario: Summary pipeline is invoked - **WHEN** transcript processing finishes for the current meeting - **THEN** the agent can read the transcript, assistant context, user notes, glossary, and bound project knowledge, can write the finished markdown summary to the configured summary note, and can update existing project files diff --git a/openspec/changes/archive/2026-06-03-add-transcript-write-workflow-rules/specs/meeting-session/spec.md b/openspec/changes/archive/2026-06-03-add-transcript-write-workflow-rules/specs/meeting-session/spec.md index afd74bf..749302c 100644 --- a/openspec/changes/archive/2026-06-03-add-transcript-write-workflow-rules/specs/meeting-session/spec.md +++ b/openspec/changes/archive/2026-06-03-add-transcript-write-workflow-rules/specs/meeting-session/spec.md @@ -27,6 +27,12 @@ A `transcript_line` trigger MAY filter by speaker name. - **THEN** the written transcript line contains `[redacted]` - **AND** the written transcript line does not contain `*****` +#### Scenario: Live transcript verification does not obstruct durable writes +- **GIVEN** a live transcript line is being durably appended and then rewritten by a `transcript_line` rule +- **WHEN** automated behavior verification observes the live transcript file +- **THEN** its observer permits the ongoing append and rewrite rather than denying the writer access +- **AND** verification still requires the completed transcript line to contain the transformed text and no original masked profanity + ### Requirement: Meeting automation rules support conditions and steps Meeting Assistant SHALL support rule conditions using an expression engine.