Conversation
RClick quit the instant it launched on macOS 27, leaving nothing behind but a SIGTRAP crash report. The stack ended in SharedDataManager.sharedModelContainer and the log held only _assertionFailure; the real reason — which file, and why it would not open — died with the process. The container was a static lazy var whose do/catch ended in fatalError, so every possible failure collapsed into the same silent trap. The failure seen in the wild is a build that is not properly code-signed: with no provisioning profile backing com.apple.security.application-groups, the sandbox never puts the App Group container in the process profile, and SQLite refuses the store with NSSQLiteErrorDomain=23. The crash reports carry the fingerprint (codeSigningTeamID ""), and reproducing it is just CODE_SIGNING_ALLOWED=NO. So both fatalErrors are gone: - SharedDataManager grows bootstrap() and a throwing makeSharedModelContainer(), plus a SharedStoreError that at least separates "no App Group container" from "container found, store unreadable" - StartupFailure logs the cause at .fault with privacy .public so it actually reaches the log store, shows it in an alert, then exits cleanly. It returns Never, which is what lets the call sites stay non-failable - AppDelegate opens the store in init() before anything touches AppState. appState had to become lazy: a default-valued property initializer runs before the init body, which would have inverted exactly that order Deliberately not done: falling back to a local or in-memory store. That would leave the app looking healthy while the extension read a different database, which is worse than refusing to start. Also clears the five Xcode 27 warnings and bumps to 2.3.0, build 20260916001: - four ImplicitStrongCapture in RClickApp, where the inner [weak self] captures were meaningless while the enclosing closure held self strongly - NoUseUnstructuredThrowingTask in MenuBarView, where the discarded throw is a cancellation we do not want to honour anyway Verified: Debug and Release both build warning-free under Xcode 27, the test suite passes, and the unsigned build now shows the alert and exits cleanly with no crash report instead of trapping. Co-Authored-By: Claude Code <noreply@anthropic.com>
Issue #155 reports two unrelated symptoms. Sidebar icons. Every external disk and mounted disk image showed RClick's icon. This had already been "fixed" once — 25b69e8 replaced random badge identifiers with an explicit empty string and closed #128 — and it came back. The empty string is not the fix. FinderSync draws badges from loose <identifier>.png files in the extension's Resources, and the extension ships none (only Assets.car and the .lproj directories), so every setBadgeIdentifier call — empty string included — hands Finder an identifier it cannot draw and it falls back to the extension's own icon. RClick uses no badges, so requestBadgeIdentifier is now a no-op. Not calling is what "no badge" means. Authorization. A grant for "/" never matched anything, so a user who added it was left with no working grant at all and got the NSOpenPanel on whatever they touched. hasAccess built "/" + "/" = "//" and asked whether the target starts with that; nothing does. Matching is now done on path components, where "/" is just ["/"] — no special case needed, and it also cannot leak a grant for /Users/lixu onto /Users/lixu2. That second one may be the whole of a separate report where a folder had to be re-authorized after every reboot. With the only broad grant dead, nothing was ever really authorized, so every operation prompted — which is also why no log ever showed a bookmark failing to resolve. The destructive half of restoreBookmarks is deliberately untouched: it still deletes a grant when the bookmark fails to resolve, which is how eight grants were lost on 2026-09-13. That is a separate defect. Co-Authored-By: Claude Code <noreply@anthropic.com>
b697cc3 turned requestBadgeIdentifier into a no-op and justified it with a mechanism that is not true: the comment claimed an empty string still triggers the icon overlay, and that not calling is what stops it. That was measured and it is false. The running extension was loaded from a binary with no setBadgeIdentifier call anywhere in it, and the volume icons were unchanged. So nothing here changes at runtime. The override stays empty, which remains the right way to say "this extension has no badges" — it ships no badge images at all, and FinderSync can only draw badges from loose <id>.png files in the extension's Resources. What changes is the comment: it now records that badges were blamed twice for this symptom (25b69e8 first, closing #128) and that neither attempt fixed it, so the next person does not repeat them, and it points at where the cause actually appears to be — the extension putting every volume root into directoryURLs. Co-Authored-By: Claude Code <noreply@anthropic.com>
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.
Summary
Type of Change
Related Issue
Screenshots
Testing
Manual Testing
Build Verification
Checklist
devAdditional Notes