Skip to content

feat(app): notify when meeting notes fail - #969

Open
mickvdv wants to merge 1 commit into
pasrom:mainfrom
mickvdv:feat/notes-failure-notification
Open

mickvdv wants to merge 1 commit into
pasrom:mainfrom
mickvdv:feat/notes-failure-notification

Conversation

@mickvdv

@mickvdv mickvdv commented Nov 12, 2026

Copy link
Copy Markdown
Contributor

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 default

Change

  • PipelineJob.protocolFailure: the provider's error message when generation failed, nil otherwise and for snapshots written before it existed. Set in the existing catch in generateProtocol (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.configureCallbacks calls it instead of choosing the title itself.
  • AppSettings.notifyOnMeetingNotesFailure, persisted under notifyOnMeetingNotesFailure, default on. Off gives the old "Transcript Saved".
  • Docs: docs/architecture/pipeline.md ("Protocol generation"), the README settings table, and the OutputSettingsView row in docs/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

  • Reverted, or line set to a constant: PipelineQueue+Stages.swift:1097, recordProtocolFailure(id: jobID, reason: error.localizedDescription) removed
  • Test that went red: WorkflowIntegrationTests.testWorkflowProtocolGenerationFailureRecordsTheReason
  • Reverted, or line set to a constant: PipelineController.swift:387, announceNotesFailure: settings.notifyOnMeetingNotesFailure set to settings.notifyOnMeetingNotesFailure || true (a plain true does not compile: the capture becomes unused)
  • Test that went red: AppStateTests.testConfigureCallbacksFailedNotesWithTheSettingOffFireTranscriptSaved (the setting off, the non-default value)
  • Not checked: the notification on screen with Focus on; the text was checked by test only.

Also: MeetingNotesFailureNotificationTests (7 tests: default on, persistence, toggle wiring via A11yID.notifyOnMeetingNotesFailureToggle, and the ready, failed, login-hint and setting-off texts), and AppStateTests.testConfigureCallbacksFailedNotesFireTheFailedNotification.

AI assistance

  • Written with: Claude (Anthropic), via Claude Code
  • Reviewed or simplified with: the same

Checklist

  • Rebased on main, no merge commits, since a merge commit pulls commits that are
    already on main into 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 origin is your fork)
  • ./scripts/lint.sh is clean, and ./scripts/lint.sh --analyze too (CI runs both)
  • Tests pass: cd app/MeetingTranscriber && swift test
    (MenuBarIconSnapshotTests compare pixels and depend on the macOS version, so CI
    skips them; if only they fail, add --skip MenuBarIconSnapshotTests and tick this)
  • Conventional Commits, one logical change per commit

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 branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant