Skip to content

fix: route update alerts through notification providers#1938

Merged
carlosflorencio merged 4 commits into
mainfrom
fix/update-notification-reliability
Jul 25, 2026
Merged

fix: route update alerts through notification providers#1938
carlosflorencio merged 4 commits into
mainfrom
fix/update-notification-reliability

Conversation

@carlosflorencio

@carlosflorencio carlosflorencio commented Jul 25, 2026

Copy link
Copy Markdown
Member

Update alerts introduced in #1924 bypassed the notification-provider contract and could be lost
during startup or denied native delivery. This routes releases through canonical provider
subscriptions, durable occurrence delivery, cached replay, and an in-app fallback.

Important Changes

  • Uses system.update_available with the release version as the provider-scoped occurrence ID.
  • Replays cached releases when the default user subscribes and retries unqueued Local delivery.
  • Removes the parallel update-only settings/API/state in favor of the existing provider matrix.
  • Requests native permission only from the Notifications settings user action and keeps the toast
    visible when native or browser delivery is unavailable.
  • Migrates existing Local/System providers once, preserves later opt-outs, and leaves Apprise
    unchanged until explicitly selected.

Validation

  • make fmt
  • make typecheck
  • make test
  • make lint
  • cargo fmt --check
  • cargo check --features desktop-runtime
  • cargo test --features desktop-runtime
  • pnpm e2e:run tests/settings/mobile-notification-events.spec.ts -- --project=mobile-chrome
  • node --test scripts/validate-public-docs.test.mjs
  • node scripts/validate-public-docs.mjs

Diagram

flowchart LR
    Poll[Release poll] --> Cache[Durable cached release]
    Cache --> Notify[Notification service]
    Notify --> Local[Local provider]
    Notify --> System[System provider]
    Notify --> Apprise[Apprise provider]
    Local -->|frame queued| History[Provider delivery history]
    Local -->|no eligible queue| Pending[Release Local claim]
    Subscribe[Default user subscribes] --> Replay[Replay cached release]
    Pending --> Replay
    Replay --> Notify
Loading

Possible Improvements

Low risk: singleton default-provider creation is serialized within the application's notification
service; a future multi-process deployment should enforce the invariant in the database.

Checklist

  • I have performed a self-review of my code.
  • I have manually tested my changes and they work as expected.
  • My changes have tests that cover the new functionality and edge cases.
  • If my change touches UI files (apps/web/), I have added or updated Playwright e2e tests in apps/web/e2e/ and verified them with make test-e2e.
  • I checked whether this affects public docs in docs/public/** and updated them or noted why no docs change is needed.

Screenshots

Desktop

Desktop notification provider matrix

Mobile

Mobile notification provider matrix

Review in cubic

@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Update availability now uses the canonical notification provider pipeline with durable subscriptions, provider-scoped delivery, cached replay on user subscription, and shared frontend handling. Dedicated update notification settings were removed, while native permission management, mobile event selection, and related documentation were added or updated.

Changes

Update notification pipeline

Layer / File(s) Summary
Provider event and delivery contracts
apps/backend/internal/notifications/service/*, apps/backend/internal/notifications/providers/*
Adds system.update_available, release payload propagation, provider defaults, concurrency protection, and provider-scoped delivery tests.
Cached replay and subscription wiring
apps/backend/internal/system/updates/*, apps/backend/internal/gateway/websocket/*, apps/backend/internal/backendapp/main.go
Injects the notification service into update handling, replays cached releases after default-user subscription, and reports whether local WebSocket delivery was queued.
Subscription migration
apps/backend/internal/notifications/store/*
Adds idempotent migration tracking and creates update subscriptions for eligible existing providers while preserving opt-outs.
Native permission bridge
apps/desktop/src-tauri/*, apps/web/lib/desktop/*
Adds permission query/request commands, Tauri permissions, display-failure handling, and typed frontend transport methods.
Frontend notification surface
apps/web/components/settings/*, apps/web/hooks/*, apps/web/lib/*, apps/web/src/settings-routes.tsx
Adds update event handling and permission controls, keeps in-app update toasts, and removes update-specific settings APIs, state, hydration, and UI.
Mobile coverage and documentation
apps/web/e2e/*, docs/*
Adds mobile provider-event coverage and documents update delivery, replay, permissions, payloads, and settings behavior.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

  • kdlbs/kandev#1924: Touches the earlier WebSocket broadcaster and persisted update-notification settings flow that this change replaces.

Poem

A bunny hops where updates bloom,
Through provider paths and WebSocket rooms.
Cached releases wait, then cheer,
Native permissions now stay clear.
Toasts remain when popups fail—
Hop, hop, reliable mail!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title accurately summarizes the main change: routing update alerts through canonical notification providers.
Description check ✅ Passed The description matches the template well, with a concise summary, key changes, validation, diagram, improvements, and checklist.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/update-notification-reliability

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cde566226e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/web/components/settings/notifications-settings-actions.ts
Comment thread apps/web/components/settings/notification-permission-section.tsx
@carlosflorencio
carlosflorencio force-pushed the fix/update-notification-reliability branch from cde5662 to 04c797a Compare July 25, 2026 00:37
@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

Claude finished @carlosflorencio's task in 1s —— View job


I'll analyze this and get back to you.

@github-actions

github-actions Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Cloudflare Pages docs preview

Open the docs preview

Built from docs commit 257ca5c.

Stable PR alias: https://docs-pr-1938.landing-87j.pages.dev/docs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/decisions/0039-native-desktop-integration-boundary.md (1)

49-56: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Keep session-failure outside the “selected events” list.

This wording groups session-failure with user-selected events, but docs/specs/desktop-tauri-app/spec.md defines it as an independent safety alert whenever Local is enabled. Clarify the sentence so implementations do not gate session-failure on an event subscription.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/decisions/0039-native-desktop-integration-boundary.md` around lines 49 -
56, Update the desktop-owned launch notification description to separate
session-failure from the user-selected turn-finished, clarification-requested,
and update-available events. State that session-failure is always delivered
through the native notifier whenever Local is enabled, without being gated by
event subscriptions, while preserving the existing suppression and channel
behavior for the selected events.
🧹 Nitpick comments (1)
apps/web/lib/desktop/native-notification-client.ts (1)

26-39: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider guarding permission.get()/request() like show().

show() short-circuits when transport.isAvailable() is false, but permission.get()/permission.request() don't, so a future caller that skips the isAvailable() check gets an unhandled rejection instead of a safe fallback. All current callers guard correctly, so this isn't an active bug today.

♻️ Optional defensive guard
   permission: {
     get(): Promise<NativeNotificationPermission> {
+      if (!transport.isAvailable()) return Promise.resolve("prompt");
       return transport.invoke(
         "get_native_notification_permission",
       ) as Promise<NativeNotificationPermission>;
     },
     request(): Promise<NativeNotificationPermission> {
+      if (!transport.isAvailable()) return Promise.resolve("prompt");
       return transport.invoke(
         "request_native_notification_permission",
       ) as Promise<NativeNotificationPermission>;
     },
   },
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/lib/desktop/native-notification-client.ts` around lines 26 - 39,
Update the permission.get() and permission.request() methods in
nativeNotifications to guard against unavailable transport like show(),
returning the established safe fallback instead of invoking transport when
transport.isAvailable() is false. Preserve the existing native permission
behavior when the transport is available.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/backend/internal/notifications/providers/local.go`:
- Around line 37-38: Extend the notification forwarding test around the payload
construction in the local provider to register a subscribed WebSocket client,
decode its queued notification, and assert that the forwarded payload preserves
both the version and url fields. Retain the existing no-subscriber coverage and
ensure the new assertions exercise the subscribed-client path.

In `@apps/backend/internal/system/updates/service.go`:
- Around line 395-406: The synchronous notifier call in
Service.notifyUpdateAvailable blocks websocket subscription responses because
HandleUpdateAvailable may wait on slow providers. Update
apps/backend/internal/system/updates/service.go:395-406 to enforce a bounded
timeout or dispatch the notification through a bounded asynchronous queue,
returning the subscription callback promptly; preserve the existing
updateAvailable and nil-notifier checks. The wiring in
apps/backend/internal/backendapp/main.go:786-794 requires no direct change if
the fix is contained in notifyUpdateAvailable.

In `@apps/web/components/settings/notification-permission-section.tsx`:
- Around line 120-144: The exported useNotificationPermission hook lacks direct
test coverage for its branching behavior. Add a dedicated *.test.ts test file
covering refreshPermission’s error state, native permission path, browser
Notification permission path, unsupported environment, and caught exceptions,
using the project’s established hook-testing utilities and mocking
nativeNotifications as needed.
- Around line 63-77: The icon-only refresh Button in the notification permission
section lacks an accessible name. Add a clear accessible label, such as
aria-label or title, directly to the Button wrapping IconRefresh, while
preserving its existing refresh behavior and tooltip.

In `@docs/public/websocket-api.md`:
- Line 763: Update the system.update_available payload documentation in the
subscribed user event table to mark url as optional, while keeping the remaining
payload fields and subscription guidance unchanged.

In `@docs/specs/platform/notifications.md`:
- Around line 97-99: Update the notification-provider API description to avoid
implying that only the two semantic events and system.update_available exist;
state that the available-event catalog includes these events, or explicitly add
office.inbox_item. Keep the provider create/update persistence behavior
unchanged.

---

Outside diff comments:
In `@docs/decisions/0039-native-desktop-integration-boundary.md`:
- Around line 49-56: Update the desktop-owned launch notification description to
separate session-failure from the user-selected turn-finished,
clarification-requested, and update-available events. State that session-failure
is always delivered through the native notifier whenever Local is enabled,
without being gated by event subscriptions, while preserving the existing
suppression and channel behavior for the selected events.

---

Nitpick comments:
In `@apps/web/lib/desktop/native-notification-client.ts`:
- Around line 26-39: Update the permission.get() and permission.request()
methods in nativeNotifications to guard against unavailable transport like
show(), returning the established safe fallback instead of invoking transport
when transport.isAvailable() is false. Preserve the existing native permission
behavior when the transport is available.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 79b1acee-e82e-4f58-a03a-3bbceb5a8a94

📥 Commits

Reviewing files that changed from the base of the PR and between 919a39e and cde5662.

⛔ Files ignored due to path filters (4)
  • apps/desktop/src-tauri/gen/schemas/acl-manifests.json is excluded by !**/gen/**
  • apps/desktop/src-tauri/gen/schemas/capabilities.json is excluded by !**/gen/**
  • apps/desktop/src-tauri/gen/schemas/desktop-schema.json is excluded by !**/gen/**
  • apps/desktop/src-tauri/gen/schemas/linux-schema.json is excluded by !**/gen/**
📒 Files selected for processing (71)
  • apps/backend/internal/backendapp/main.go
  • apps/backend/internal/gateway/websocket/hub.go
  • apps/backend/internal/gateway/websocket/hub_broadcast_test.go
  • apps/backend/internal/gateway/websocket/hub_user_subscription_test.go
  • apps/backend/internal/notifications/providers/local.go
  • apps/backend/internal/notifications/providers/local_test.go
  • apps/backend/internal/notifications/providers/provider.go
  • apps/backend/internal/notifications/service/service.go
  • apps/backend/internal/notifications/service/service_test.go
  • apps/backend/internal/notifications/store/sqlite.go
  • apps/backend/internal/notifications/store/sqlite_test.go
  • apps/backend/internal/persistence/meta.go
  • apps/backend/internal/persistence/meta_test.go
  • apps/backend/internal/persistence/postgres_meta_test.go
  • apps/backend/internal/system/system.go
  • apps/backend/internal/system/updates/handler.go
  • apps/backend/internal/system/updates/handler_notify_test.go
  • apps/backend/internal/system/updates/notify_dispatch_test.go
  • apps/backend/internal/system/updates/notify_settings.go
  • apps/backend/internal/system/updates/notify_settings_test.go
  • apps/backend/internal/system/updates/notify_store.go
  • apps/backend/internal/system/updates/notify_store_test.go
  • apps/backend/internal/system/updates/service.go
  • apps/desktop/src-tauri/build.rs
  • apps/desktop/src-tauri/capabilities/default.json
  • apps/desktop/src-tauri/permissions/autogenerated/get_native_notification_permission.toml
  • apps/desktop/src-tauri/permissions/autogenerated/request_native_notification_permission.toml
  • apps/desktop/src-tauri/src/backend.rs
  • apps/desktop/src-tauri/src/main.rs
  • apps/desktop/src-tauri/src/native_notifications.rs
  • apps/web/components/settings/notification-permission-section.tsx
  • apps/web/components/settings/notifications-settings-actions.test.tsx
  • apps/web/components/settings/notifications-settings-actions.ts
  • apps/web/components/settings/notifications-settings.tsx
  • apps/web/components/settings/system/update-notifications-card.test.tsx
  • apps/web/components/settings/system/update-notifications-card.tsx
  • apps/web/e2e/tests/settings/mobile-notification-events.spec.ts
  • apps/web/e2e/tests/system/update-notifications-settings.spec.ts
  • apps/web/hooks/use-update-available-toast.test.ts
  • apps/web/hooks/use-update-available-toast.ts
  • apps/web/lib/api/domains/system-api.test.ts
  • apps/web/lib/api/domains/system-api.ts
  • apps/web/lib/desktop/native-notification-client.test.ts
  • apps/web/lib/desktop/native-notification-client.ts
  • apps/web/lib/notifications/events.ts
  • apps/web/lib/state/hydration/hydrator.test.ts
  • apps/web/lib/state/hydration/hydrator.ts
  • apps/web/lib/state/slices/system/system-slice.ts
  • apps/web/lib/state/slices/system/types.ts
  • apps/web/lib/state/slices/ui/types.ts
  • apps/web/lib/types/backend.ts
  • apps/web/lib/types/system.ts
  • apps/web/lib/ws/handlers/notifications.test.ts
  • apps/web/lib/ws/handlers/notifications.ts
  • apps/web/lib/ws/handlers/system-events.test.ts
  • apps/web/lib/ws/handlers/system-events.ts
  • apps/web/src/settings-routes.test.ts
  • apps/web/src/settings-routes.tsx
  • docs/decisions/0039-native-desktop-integration-boundary.md
  • docs/decisions/2026-07-24-semantic-notification-events.md
  • docs/plans/update-notification-reliability/plan.md
  • docs/plans/update-notification-reliability/task-01-provider-event-and-delivery.md
  • docs/plans/update-notification-reliability/task-02-update-replay-and-wiring.md
  • docs/plans/update-notification-reliability/task-03-native-permission-bridge.md
  • docs/plans/update-notification-reliability/task-04-frontend-provider-delivery.md
  • docs/plans/update-notification-reliability/task-05-mobile-e2e-and-docs.md
  • docs/public/operations.md
  • docs/public/websocket-api.md
  • docs/specs/desktop-tauri-app/spec.md
  • docs/specs/platform/notifications.md
  • docs/specs/system-page/spec.md
💤 Files with no reviewable changes (21)
  • apps/backend/internal/system/updates/notify_settings_test.go
  • apps/web/lib/ws/handlers/system-events.test.ts
  • apps/web/components/settings/system/update-notifications-card.test.tsx
  • apps/backend/internal/system/updates/notify_settings.go
  • apps/web/lib/types/system.ts
  • apps/web/components/settings/system/update-notifications-card.tsx
  • apps/backend/internal/system/updates/notify_store.go
  • apps/backend/internal/system/updates/notify_store_test.go
  • apps/web/lib/state/hydration/hydrator.test.ts
  • apps/backend/internal/persistence/meta.go
  • apps/backend/internal/system/updates/handler_notify_test.go
  • apps/web/lib/state/slices/system/types.ts
  • apps/backend/internal/system/system.go
  • apps/web/e2e/tests/system/update-notifications-settings.spec.ts
  • apps/web/lib/state/slices/system/system-slice.ts
  • apps/backend/internal/persistence/postgres_meta_test.go
  • apps/backend/internal/system/updates/handler.go
  • apps/backend/internal/persistence/meta_test.go
  • apps/web/lib/ws/handlers/system-events.ts
  • apps/web/lib/api/domains/system-api.ts
  • apps/web/lib/api/domains/system-api.test.ts

Comment thread apps/backend/internal/notifications/providers/local.go
Comment thread apps/backend/internal/system/updates/service.go
Comment thread apps/web/components/settings/notification-permission-section.tsx
Comment thread apps/web/components/settings/notification-permission-section.tsx
Comment thread docs/public/websocket-api.md Outdated
Comment thread docs/specs/platform/notifications.md
@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

Claude finished @carlosflorencio's task in 0s —— View job


I'll analyze this and get back to you.

@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

Claude finished @carlosflorencio's task in 0s —— View job


I'll analyze this and get back to you.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
docs/plans/update-notification-reliability/task-04-frontend-provider-delivery.md (1)

27-38: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Cover all changed notification paths in verification.

The plan lists apps/web/lib/ws/handlers/system-events.test.ts as a touched test, but the verification command does not run it. Add that test, or explicitly document that another task/CI job owns it; otherwise the completed task can miss regressions in update-event routing.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@docs/plans/update-notification-reliability/task-04-frontend-provider-delivery.md`
around lines 27 - 38, The Verification command omits the touched system-events
test, leaving update-event routing unverified. Add
apps/web/lib/ws/handlers/system-events.test.ts to the listed Vitest targets, or
explicitly document that another task or CI job owns its execution.
docs/specs/system-page/spec.md (1)

44-46: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

Use the shared Notifications route wording.

The actual page lives under /settings/general/notifications, but the spec has drifted between this section and section 140. Use one consistent label there; keeping it as Notifications settings page is safer than a breadcrumb-style path.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/specs/system-page/spec.md` around lines 44 - 46, Update the
notification-page reference in the section near the diff to use the consistent
label “Notifications settings page,” matching the wording used in section 140,
and avoid breadcrumb-style route wording.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/backend/internal/notifications/providers/local_test.go`:
- Around line 45-51: Register t.Cleanup immediately after starting the hub.Run
goroutine in the local notification provider tests, before dialing or any fatal
assertion. The cleanup must cancel cancelHub and wait for hubDone, and the same
ordering must be applied to the additional setup referenced around lines 70–83.

In `@apps/backend/internal/notifications/store/sqlite.go`:
- Around line 104-107: Update repository initialization and its operation chain
to accept and propagate the startup context into
migrateUpdateAvailableSubscriptions. Replace the context.Background() call in
the migration flow with that propagated context, while preserving the existing
migrateLegacySubscriptions error handling.

---

Nitpick comments:
In
`@docs/plans/update-notification-reliability/task-04-frontend-provider-delivery.md`:
- Around line 27-38: The Verification command omits the touched system-events
test, leaving update-event routing unverified. Add
apps/web/lib/ws/handlers/system-events.test.ts to the listed Vitest targets, or
explicitly document that another task or CI job owns its execution.

In `@docs/specs/system-page/spec.md`:
- Around line 44-46: Update the notification-page reference in the section near
the diff to use the consistent label “Notifications settings page,” matching the
wording used in section 140, and avoid breadcrumb-style route wording.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 747c88fa-c50d-4c1a-a5c2-56bfb6d730c1

📥 Commits

Reviewing files that changed from the base of the PR and between cde5662 and 2d85dc2.

⛔ Files ignored due to path filters (4)
  • apps/desktop/src-tauri/gen/schemas/acl-manifests.json is excluded by !**/gen/**
  • apps/desktop/src-tauri/gen/schemas/capabilities.json is excluded by !**/gen/**
  • apps/desktop/src-tauri/gen/schemas/desktop-schema.json is excluded by !**/gen/**
  • apps/desktop/src-tauri/gen/schemas/linux-schema.json is excluded by !**/gen/**
📒 Files selected for processing (72)
  • apps/backend/internal/backendapp/main.go
  • apps/backend/internal/gateway/websocket/hub.go
  • apps/backend/internal/gateway/websocket/hub_broadcast_test.go
  • apps/backend/internal/gateway/websocket/hub_user_subscription_test.go
  • apps/backend/internal/notifications/providers/local.go
  • apps/backend/internal/notifications/providers/local_test.go
  • apps/backend/internal/notifications/providers/provider.go
  • apps/backend/internal/notifications/service/service.go
  • apps/backend/internal/notifications/service/service_test.go
  • apps/backend/internal/notifications/store/sqlite.go
  • apps/backend/internal/notifications/store/sqlite_test.go
  • apps/backend/internal/persistence/meta.go
  • apps/backend/internal/persistence/meta_test.go
  • apps/backend/internal/persistence/postgres_meta_test.go
  • apps/backend/internal/system/system.go
  • apps/backend/internal/system/updates/handler.go
  • apps/backend/internal/system/updates/handler_notify_test.go
  • apps/backend/internal/system/updates/notify_dispatch_test.go
  • apps/backend/internal/system/updates/notify_settings.go
  • apps/backend/internal/system/updates/notify_settings_test.go
  • apps/backend/internal/system/updates/notify_store.go
  • apps/backend/internal/system/updates/notify_store_test.go
  • apps/backend/internal/system/updates/service.go
  • apps/desktop/src-tauri/build.rs
  • apps/desktop/src-tauri/capabilities/default.json
  • apps/desktop/src-tauri/permissions/autogenerated/get_native_notification_permission.toml
  • apps/desktop/src-tauri/permissions/autogenerated/request_native_notification_permission.toml
  • apps/desktop/src-tauri/src/backend.rs
  • apps/desktop/src-tauri/src/main.rs
  • apps/desktop/src-tauri/src/native_notifications.rs
  • apps/web/components/settings/notification-permission-section.test.tsx
  • apps/web/components/settings/notification-permission-section.tsx
  • apps/web/components/settings/notifications-settings-actions.test.tsx
  • apps/web/components/settings/notifications-settings-actions.ts
  • apps/web/components/settings/notifications-settings.tsx
  • apps/web/components/settings/system/update-notifications-card.test.tsx
  • apps/web/components/settings/system/update-notifications-card.tsx
  • apps/web/e2e/tests/settings/mobile-notification-events.spec.ts
  • apps/web/e2e/tests/system/update-notifications-settings.spec.ts
  • apps/web/hooks/use-update-available-toast.test.ts
  • apps/web/hooks/use-update-available-toast.ts
  • apps/web/lib/api/domains/system-api.test.ts
  • apps/web/lib/api/domains/system-api.ts
  • apps/web/lib/desktop/native-notification-client.test.ts
  • apps/web/lib/desktop/native-notification-client.ts
  • apps/web/lib/notifications/events.ts
  • apps/web/lib/state/hydration/hydrator.test.ts
  • apps/web/lib/state/hydration/hydrator.ts
  • apps/web/lib/state/slices/system/system-slice.ts
  • apps/web/lib/state/slices/system/types.ts
  • apps/web/lib/state/slices/ui/types.ts
  • apps/web/lib/types/backend.ts
  • apps/web/lib/types/system.ts
  • apps/web/lib/ws/handlers/notifications.test.ts
  • apps/web/lib/ws/handlers/notifications.ts
  • apps/web/lib/ws/handlers/system-events.test.ts
  • apps/web/lib/ws/handlers/system-events.ts
  • apps/web/src/settings-routes.test.ts
  • apps/web/src/settings-routes.tsx
  • docs/decisions/0039-native-desktop-integration-boundary.md
  • docs/decisions/2026-07-24-semantic-notification-events.md
  • docs/plans/update-notification-reliability/plan.md
  • docs/plans/update-notification-reliability/task-01-provider-event-and-delivery.md
  • docs/plans/update-notification-reliability/task-02-update-replay-and-wiring.md
  • docs/plans/update-notification-reliability/task-03-native-permission-bridge.md
  • docs/plans/update-notification-reliability/task-04-frontend-provider-delivery.md
  • docs/plans/update-notification-reliability/task-05-mobile-e2e-and-docs.md
  • docs/public/operations.md
  • docs/public/websocket-api.md
  • docs/specs/desktop-tauri-app/spec.md
  • docs/specs/platform/notifications.md
  • docs/specs/system-page/spec.md
💤 Files with no reviewable changes (20)
  • apps/web/e2e/tests/system/update-notifications-settings.spec.ts
  • apps/backend/internal/system/updates/notify_settings_test.go
  • apps/web/lib/types/system.ts
  • apps/web/components/settings/system/update-notifications-card.tsx
  • apps/backend/internal/system/updates/notify_store_test.go
  • apps/web/lib/ws/handlers/system-events.test.ts
  • apps/backend/internal/system/updates/notify_settings.go
  • apps/backend/internal/system/updates/notify_store.go
  • apps/web/lib/api/domains/system-api.test.ts
  • apps/backend/internal/persistence/postgres_meta_test.go
  • apps/backend/internal/system/updates/handler_notify_test.go
  • apps/backend/internal/persistence/meta.go
  • apps/web/lib/state/hydration/hydrator.test.ts
  • apps/web/lib/ws/handlers/system-events.ts
  • apps/backend/internal/persistence/meta_test.go
  • apps/web/lib/state/slices/system/types.ts
  • apps/web/lib/state/slices/system/system-slice.ts
  • apps/web/components/settings/system/update-notifications-card.test.tsx
  • apps/backend/internal/system/updates/handler.go
  • apps/web/lib/api/domains/system-api.ts
🚧 Files skipped from review as they are similar to previous changes (42)
  • apps/desktop/src-tauri/src/main.rs
  • docs/plans/update-notification-reliability/task-02-update-replay-and-wiring.md
  • apps/desktop/src-tauri/capabilities/default.json
  • apps/desktop/src-tauri/build.rs
  • docs/public/websocket-api.md
  • apps/desktop/src-tauri/permissions/autogenerated/request_native_notification_permission.toml
  • apps/backend/internal/gateway/websocket/hub_user_subscription_test.go
  • apps/backend/internal/notifications/providers/local.go
  • docs/plans/update-notification-reliability/task-03-native-permission-bridge.md
  • apps/desktop/src-tauri/permissions/autogenerated/get_native_notification_permission.toml
  • docs/plans/update-notification-reliability/task-05-mobile-e2e-and-docs.md
  • docs/plans/update-notification-reliability/task-01-provider-event-and-delivery.md
  • apps/desktop/src-tauri/src/backend.rs
  • apps/backend/internal/gateway/websocket/hub_broadcast_test.go
  • apps/web/lib/state/hydration/hydrator.ts
  • apps/backend/internal/system/system.go
  • apps/web/components/settings/notifications-settings-actions.ts
  • apps/web/lib/state/slices/ui/types.ts
  • apps/web/lib/types/backend.ts
  • apps/web/lib/desktop/native-notification-client.ts
  • docs/decisions/2026-07-24-semantic-notification-events.md
  • docs/public/operations.md
  • apps/web/lib/desktop/native-notification-client.test.ts
  • apps/web/components/settings/notification-permission-section.tsx
  • apps/backend/internal/notifications/store/sqlite_test.go
  • apps/web/hooks/use-update-available-toast.test.ts
  • docs/decisions/0039-native-desktop-integration-boundary.md
  • docs/plans/update-notification-reliability/plan.md
  • apps/web/lib/notifications/events.ts
  • apps/backend/internal/system/updates/notify_dispatch_test.go
  • apps/web/lib/ws/handlers/notifications.ts
  • apps/web/components/settings/notifications-settings.tsx
  • apps/backend/internal/gateway/websocket/hub.go
  • apps/web/hooks/use-update-available-toast.ts
  • docs/specs/desktop-tauri-app/spec.md
  • apps/web/lib/ws/handlers/notifications.test.ts
  • apps/web/components/settings/notifications-settings-actions.test.tsx
  • apps/web/e2e/tests/settings/mobile-notification-events.spec.ts
  • apps/backend/internal/notifications/service/service.go
  • apps/web/src/settings-routes.tsx
  • apps/backend/internal/notifications/service/service_test.go
  • apps/backend/internal/system/updates/service.go

Comment thread apps/backend/internal/notifications/providers/local_test.go
Comment thread apps/backend/internal/notifications/store/sqlite.go Outdated
@claude

claude Bot commented Jul 25, 2026

Copy link
Copy Markdown

Claude finished @carlosflorencio's task in 0s —— View job


I'll analyze this and get back to you.

@carlosflorencio
carlosflorencio merged commit 715a203 into main Jul 25, 2026
68 checks passed
@carlosflorencio
carlosflorencio deleted the fix/update-notification-reliability branch July 25, 2026 10:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant