Part of #5.
What is there today
Step 1 opens the Full Disk Access pane (app/Uplink/desktop-agent.ts#L301) and the popover says
"Switch on Uplink in the list. It notices within a few seconds" (app/Uplink/menubar.html#L86). The
retry loop behind that promise is real and good: every five seconds while the grant is missing
(app/Uplink/desktop-agent.ts#L214).
Three things are missing.
- Uplink may not be in the list. For an app whose first protected read was refused before it was
ever toggled, the row does not exist, and the pane's "+" button is the only way in. The popover does
not say that, and does not reveal the bundle for the drag. The from-source path does this better:
uplink:installrunsopen -Ron the bundle (app/Commands/Uplink.ts#L180) so it is sitting in a Finder window ready to drag. The polished path lost it. - A rebuild voids the grant. The README states it for the source install
(
README.md#L98) andBUNDLE_IDexists precisely because macOS keys the grant to a bundle id plus its signature (app/Uplink/service.ts#L21). Nothing tells a DMG user that replacing the app means re-granting. - There is no way to tell "not granted" from "granted but chat.db unreadable". Both land in
messagesError(app/Uplink/desktop-agent.ts#L199), which reports the Full Disk Access sentence forMessagesAccessErrorand a rawString(error)otherwise.
Proposal
- Add a button that reveals
/Applications/Uplink.appin Finder, next to the one that opens the pane, with one line saying to drag it in if it is not listed. - Say what the app is waiting for while it retries, and how long it has been waiting. A silent five second loop is indistinguishable from nothing happening.
- Distinguish the two failure states in the check's detail, so a person who has granted access and still cannot read is not told to grant access again.
Requirements
- Do not claim the grant is active until a read succeeds. The retry loop is the witness.
- The pane cannot be opened to a specific app's row. Do not imply it can.
- Keep the five second retry. It is the reason this step does not need a relaunch, which is the best part of the current flow.
Acceptance
- With Uplink absent from the Full Disk Access list, the popover says how to add it and can reveal the bundle.
- After granting, the check flips without a relaunch, as it does today.
- A granted-but-unreadable database reports something other than "grant Full Disk Access".