Skip to content

macOS service updates require new privacy approvals for each versioned t3 executable #17225

Description

@rashidgg

What happened

I run T3 Code as a background service on my Mac so I can access my threads from other computers and mobile devices.

After server updates, macOS asks me to approve folder access again. I also get notifications saying t3 was blocked from App Management.

System Settings now contains multiple entries named t3 under both App Management and Full Disk Access. Approving one version does not cover subsequent versions.

Expected behavior: permissions granted to the service should persist across updates without requiring another local approval for every new executable path. Repeated prompts are particularly disruptive when updating an unattended remote host.

Diagnosis

The service runs executables from version-specific directories:

<T3_HOME>/runtime/versions/<version>/t3

Read-only inspection of macOS’s system TCC database confirmed that the service’s Full Disk Access entries are keyed to these executable paths (client_type = 1). Multiple releases have separate permission records.

The compared binaries are already Developer ID signed and have identical designated requirements:

Identifier: t3
TeamIdentifier: ARK85ZXQ4Z

The changing executable path is therefore the confirmed identity difference associated with the separate Full Disk Access records.

The source matches the observed installation:

  • bootService.ts configures the service to run the pinned runtime executable with __service-launcher.
  • serviceLauncher.ts constructs the version-specific executable path and launches it with serve.

A stable command symlink alone would not change the version-specific server executable selected by this launcher.

The App Management notifications were reported by the user, and duplicate entries are visible in the supplied screenshot. The specific operation triggering that notification was not captured during triage.

Steps to reproduce

Reported reproduction; no additional update or permission reset was performed during triage:

  1. Install and run T3 Code as a macOS background service.
  2. Approve folder access and grant the current t3 executable Full Disk Access.
  3. Update the server to another nightly release and allow the service to switch to the new runtime.
  4. Perform agent work that accesses protected folders.
  5. Observe renewed permission prompts and another t3 entry in System Settings.
  6. Repeat server updates; separate permission entries accumulate.

Version

Active server: 0.0.46-nightly.20261008.2819
Source commit: 5e2225671f705fcd33f1ea5591b79ba612fb6974

The npx t3 triage CLI reported version 0.0.45; the running service version was verified separately.

Environment

macOS 27.0.1, build 26A434; Apple Silicon arm64; launchd user service. Remote access from other computers and mobile devices. Node v26.8.2 reported by triage.

Evidence

<T3_HOME> replaces the user’s installation root.

launchd ProgramArguments:
<T3_HOME>/runtime/versions/0.0.46-nightly.20261007.2787/t3
__service-launcher

Service state activeVersion:
0.0.46-nightly.20261008.2819

Selected system TCC records:
service: kTCCServiceSystemPolicyAllFiles
client_type: 1

Version                              auth_value
0.0.43-nightly.20260928.2375           2
0.0.44-nightly.20260929.2456           2
0.0.46-nightly.20261003.2632           0
0.0.46-nightly.20261007.2787           0

Each client path:
<T3_HOME>/runtime/versions/<version>/t3

Screenshots show multiple t3 entries under App Management and Full Disk Access:

Image Image

Related issues

#5285 concerns permissions attributed to the desktop app during agent CLI probes at startup. This report concerns previously granted permissions failing to carry across CLI service updates that change the executable path. No exact duplicate was found.

Fix applied or workaround

No service configuration, binaries, or permission databases were modified. Reapproving individual executable versions provides temporary access but does not address subsequent updates.

Please provide a supported service installation/update mechanism that preserves macOS permission identity across releases.

Filed by

Codex, GPT-6 family, via t3 triage.

Activity

  1. ziyadakl commented on Oct 8, 2026

    @ziyadakl

    Confirmed the cause on macOS 27. TCC stores the grant for the launch agent's program by path: TCC.db shows client=~/.t3/runtime/versions/<version>/t3, client_type=1. Every update changes that path.

    Only the launch agent's path matters. I ran a test launch agent at a fixed path and granted Full Disk Access to that path only. Children started from two other paths could both read ~/Library/Safari. Before the grant, both got errno=1.

    Proposed fix: on macOS, t3 service install copies versions/<v>/ to runtime/launcher/, and the plist runs runtime/launcher/t3 __service-launcher. serve still runs from versions/<v>. Running in my fork since today: ziyadakl#13. The grant on runtime/launcher/t3 covers serve from a fresh version folder.

    Happy to open a PR against main if this direction works for you.

  2. jssblck commented on Oct 9, 2026

    @jssblck

    Same root cause on two Macs here, and it reaches past Full Disk Access. Processes an agent starts are checked against the service's versioned t3 as their responsible process, so Screen Recording and Accessibility grants go there too, and an update drops them.

    System TCC.db rows with client = ~/.t3/runtime/versions/<version>/t3, client_type = 1:

    Mac Service Version auth_value
    1 kTCCServiceAccessibility 0.0.43-nightly.20260923.2150 2
    1 kTCCServiceScreenCapture 0.0.43-nightly.20260923.2150 2
    1 kTCCServiceSystemPolicyAllFiles 0.0.46-nightly.20261003.2610 0
    1 kTCCServiceSystemPolicyAllFiles 0.0.46-nightly.20261008.2833 0
    2 kTCCServiceAccessibility 0.0.43-nightly.20260922.2110 2
    2 kTCCServiceScreenCapture 0.0.46-nightly.20261003.2610 0

    Mac 1 runs 0.0.46-nightly.20261009.2861 (launchd) and 20261009.2886 (its child) and has no row for either. It took three nightlies in about a day, so a grant lasts hours.

    The Screen Recording row on Mac 1 was written at 2026-09-29 20:42:37 UTC, the minute a coding agent's screencapture failed in a T3 thread and the user granted access to "the app that runs my shell". The grant landed on that version's t3, not on T3 Code.app. Agents in other T3 threads on both Macs have hit screencapture ("could not create image from display") and System Events through osascript ("osascript is not allowed assistive access").

    +1 to the fixed launcher path proposed above. It would keep these grants as well as Full Disk Access.

  3. Armand-Lluka commented on Nov 4, 2026

    @Armand-Lluka

    Still happening on the 0.1.x nightlies. On one headless Mac (launchd service, macOS 27) the launcher path in ProgramArguments changed four times in three days:

    0.1.7-nightly.20261102.4066
    0.1.7-nightly.20261103.4119
    0.1.8-nightly.20261104.4165
    0.1.8-nightly.20261104.4179
    

    Every build is Developer ID signed with the same designated requirement (identifier t3, team ARK85ZXQ4Z), so the path is the only thing that changes. With daily nightlies, keeping Full Disk Access means a manual grant on the host's screen every day, so we've stopped relying on it.

    A fixed launcher path would fix this, for example <T3_HOME>/runtime/launcher/t3, replaced in place on update, with only the server it spawns kept per version. TCC re-checks the stored code requirement against the new binary, so one grant would carry over between builds.

  4. added a commit that references this issue on Nov 13, 2026
    d9f0b6f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions