Menu

#425 fix(setup): notification pane deep-link opens Meridian's settings, skip redundant re-request

closed
nobody
None
2026-07-10
2026-07-09
Anonymous
No

Originally created by: Akarsh-Hegde

Summary

  • open_permission_pane's notifications URL had no app anchor, so "Open Settings" landed on the general Notifications list instead of Meridian's own row. Anchored it with ?id=<bundle-id> — verified live against NotificationsSettings.appex's metadata, which documents support for this param (allowsXAppleSystemPreferencesURLScheme).
  • grantNotifications always called request_notifications first, even when already denied. macOS never re-prompts after a deny, so this was a pointless async round-trip through the Swift notification-plugin bridge before ever reaching the Settings pane — a plausible source of the reported "flickers, doesn't open" behavior. Now skips straight to open_permission_pane when the caller already knows the state is denied.
  • Notifications card flicker (found during live manual testing above): check_notifications polls every 2s; a transient Swift-bridge hiccup can make the Rust command return 'unavailable' as a normal (non-error) result for a single poll tick, which the card's hide-when-unavailable check then treats as the plugin having vanished — flashing the whole card away and back. Bundled-ness is fixed for the process lifetime, so once a real state (prompt/granted/denied) has been observed, a later 'unavailable' can only be that glitch, never a genuine regression — the poll now keeps the last known-good state instead.
  • Notifications row now omits the REQUIRED/OPTIONAL badge (Accessibility/Screen Recording still show REQUIRED). Intentional, requested during live wizard testing: unlike those two, notifications doesn't gate canNext on the Permissions step — nothing about the row conveys a requirement to satisfy, so the OPTIONAL label was pure visual noise where REQUIRED on the other two rows is actually meaningful (it signals what blocks continuing). Dropping it declutters the row without losing information.
  • Copy: notifications description now uses a plain hyphen (Quiet by default - you control…) instead of an em dash, matching the hyphen style used everywhere else in the wizard's copy.
  • New: semi-circular gauge (MemoryGauge in atoms.tsx) for the Local-intelligence step's "Expected memory" panel, replacing the straight Bar there. Kept Bar itself untouched/reused as-is for download progress elsewhere — the two are visually distinct on purpose (straight = loading, arc = capacity). Drawn as two arcs meeting at the footprint percentage: amber for what Meridian expects to use, green for the unified memory left over.

All found/requested while manually testing PR [#418] (notifications permission card) on a staging build, then a locally packaged build of this branch.

Test plan

  • [x] cargo fmt --check + cargo clippy -- -D warnings clean
  • [x] npm run build (ui) succeeds, /setup route compiles
  • [x] Verified the ?id=com.meridiona.tray deep link lands on Meridian's specific notification detail pane (Allow toggle, Alert Style, etc.) rather than the general app list, via direct open testing against this machine's NotificationsSettings.appex
  • [x] Manual: clicked "Open Settings" on a denied Notifications permission in a locally packaged build of this branch — opens directly to Meridian's row, no flicker
  • [x] Manual: verified the memory gauge renders correctly (amber/green split arc) in the same packaged build

Related

Tickets: #418
Tickets: #431
Tickets: #440

Discussion

  • Anonymous

    Anonymous - 2026-07-09

    Originally posted by: coderabbitai[bot]

    [!IMPORTANT]

    Review skipped

    Auto reviews are disabled on base/target branches other than the default branch.

    Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.


    ⚙️ Run configuration

    Configuration used: Organization UI

    Review profile: ASSERTIVE

    Plan: Pro Plus

    Run ID: e7dfec60-5b94-4590-a239-420cd7c76d77

    You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

    Use the checkbox below for a quick retry:
    - [ ] 🔍 Trigger review

    ✨ Finishing Touches
    🧪 Generate unit tests (beta) - [ ] Create PR with unit tests - [ ] Commit unit tests in branch `fix/notifications-pane-deep-link`

    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 - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

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

     
  • Anonymous

    Anonymous - 2026-07-09

    Originally posted by: Akarsh-Hegde

    Thanks for the review — addressing the one open question and updating on scope.

    REQUIRED/OPTIONAL badge removal — intentional, not a leftover. This row is the only permission in the list that doesn't gate canNext on the Permissions step (canNext: e => !!(e.perms.accessibility && e.perms.screen) — notifications isn't in that check). So REQUIRED on the other two rows is meaningful signal (it tells you what's blocking Continue), but OPTIONAL on this one wasn't conveying anything actionable — it was just visual noise. Dropped it, kept REQUIRED on Accessibility/Screen Recording. Explained in the updated PR summary now.

    Also pushed since your review (all found/requested during the same live manual test pass, on both a staging build and a locally packaged build of this branch):

    • Root-caused and fixed the actual notifications-card flicker: check_notifications polls every 2s, and a transient Swift-bridge hiccup can make the Rust command return 'unavailable' as a normal result for a single tick — which was hiding the whole card for that tick since bundled-ness can't actually change mid-session. Now sticky on the last known-good state.
    • Copy fix: em dash → plain hyphen in the notifications description, matching the rest of the wizard's copy style.
    • New: semi-circular gauge for the "Expected memory" panel (Local-intelligence step) — amber/green split arc instead of the straight Bar (which stays untouched/reused as-is for download progress elsewhere).

    Last test-plan checkbox is now checked too — verified the no-flicker Open Settings behavior and the new gauge live in a packaged build. PR summary is updated to match everything currently in the diff.

     
  • Anonymous

    Anonymous - 2026-07-10

    Ticket changed by: Akarsh-Hegde

    • status: open --> closed
     

Log in to post a comment.