Repository navigation
Conversation
When the provider cannot generate the meeting notes (a signed-out Claude CLI, a timeout, an HTTP error), the job still finishes with its transcript and the warning "Protocol generation failed — transcript saved". The only notification was "Transcript Saved", which reads like success, so a signed-out CLI went unnoticed for weeks while every meeting lost its notes. The job now keeps the provider's message as protocolFailure, and the done notification for such a job reads "Meeting Notes Failed" with the reason, time-sensitive since the user can still act on it. A signed-out Claude CLI also gets the hint to sign in with /login. "Notify when meeting notes fail" in Settings > Output turns it off; it is on by default. The message is already content-free (see the catch in generateProtocol), so it can go into a notification as it is.
This was referenced Nov 12, 2026
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Mick
What changed and why
When the meeting notes cannot be generated (the Claude CLI signed out, a timeout, an unreachable OpenAI-compatible endpoint), the job still finishes with its transcript and the only sign is the notification "Transcript Saved". That reads like success: with the CLI signed out, every meeting ends that way, and it can take weeks to notice. This announces the failure, with the reason, behind a setting that is on by default.
Settings → Output Meeting Notes … Use AI title for filenames + Notify when meeting notes fail on by defaultChange
PipelineJob.protocolFailure: the provider's error message when generation failed, nil otherwise and for snapshots written before it existed. Set in the existing catch ingenerateProtocol(recordProtocolFailure), next to the warning it already adds. The message is the content-free one that catch already logs at.public.PipelineQueue.doneNotification(for:announceNotesFailure:)picks the done notification: "Meeting Notes Ready" or "Transcript Saved" as before, or "Meeting Notes Failed" with"<title>": <reason>. The transcript is saved., time-sensitive. A reason that mentions login or authentication gets "Run claude in Terminal and sign in with /login."PipelineController.configureCallbackscalls it instead of choosing the title itself.AppSettings.notifyOnMeetingNotesFailure, persisted undernotifyOnMeetingNotesFailure, default on. Off gives the old "Transcript Saved".docs/architecture/pipeline.md("Protocol generation"), the README settings table, and theOutputSettingsViewrow indocs/architecture-macos.md.Nothing changes for a job whose notes were generated or not asked for (provider None), and the job still ends
.done.Tests
PipelineQueue+Stages.swift:1097,recordProtocolFailure(id: jobID, reason: error.localizedDescription)removedWorkflowIntegrationTests.testWorkflowProtocolGenerationFailureRecordsTheReasonPipelineController.swift:387,announceNotesFailure: settings.notifyOnMeetingNotesFailureset tosettings.notifyOnMeetingNotesFailure || true(a plaintruedoes not compile: the capture becomes unused)AppStateTests.testConfigureCallbacksFailedNotesWithTheSettingOffFireTranscriptSaved(the setting off, the non-default value)Also:
MeetingNotesFailureNotificationTests(7 tests: default on, persistence, toggle wiring viaA11yID.notifyOnMeetingNotesFailureToggle, and the ready, failed, login-hint and setting-off texts), andAppStateTests.testConfigureCallbacksFailedNotesFireTheFailedNotification.AI assistance
Checklist
main, no merge commits, since a merge commit pulls commits that arealready on
maininto this branch and the review reads it commit by commit:git fetch https://github.com/pasrom/meeting-transcriber main && git rebase FETCH_HEAD(the URL spelled out because in a fork clone
originis your fork)./scripts/lint.shis clean, and./scripts/lint.sh --analyzetoo (CI runs both)cd app/MeetingTranscriber && swift test(
MenuBarIconSnapshotTestscompare pixels and depend on the macOS version, so CIskips them; if only they fail, add
--skip MenuBarIconSnapshotTestsand tick this)