[Bug]: t3 update / service install moves launchd log paths into T3CODE_HOME; service exits 78 when T3CODE_HOME is on an external volume#24910
Before submitting
- I searched existing issues and did not find a duplicate.
- I included enough detail to reproduce or investigate the problem.
Area
apps/server
Steps to reproduce
- On macOS, put the T3 home on an external APFS volume, for example
~/.t3→/Volumes/<external>/…/T3Code. Install the background service. It runs fine while the unit logs to~/Library/Logs/T3Code/boot-service.log. - Run
t3 update --yes(here:0.1.2-nightly.20261021.3457→0.1.2).t3 service install --base-dir ~/.t3shows the same result. - Check
launchctl list | grep t3code.
Expected behavior
The service restarts on the new version. The launchd unit keeps a log path that launchd can open, either the existing custom path or one under ~/Library/Logs/T3Code.
Actual behavior
The installer rewrites StandardOutPath/StandardErrorPath to $T3CODE_HOME/userdata/logs/boot-service.log. That file is on the external volume, and launchd is not allowed to open it (TCC). The job exits with 78 (EX_CONFIG) before t3 runs. The server stays down and writes nothing to any T3 log. service install reports success (Updated T3 Code service with t3@0.1.2.).
The t3 executable on the same external volume starts fine. Only the log path fails. Setting both paths back to ~/Library/Logs/T3Code/boot-service.log and running launchctl bootout/bootstrap fixes it immediately.
Impact
Blocks work completely
Version or commit
0.1.2 (updated from 0.1.2-nightly.20261021.3457)
Environment
macOS 27.2, Apple silicon (Mac mini), headless background service, T3CODE_HOME on an external APFS SSD
Logs or stack traces
| 1 | $ launchctl list | grep t3code |
| 2 | - 78 com.t3tools.t3code.service |
| 3 | |
| 4 | $ plutil -p ~/Library/LaunchAgents/com.t3tools.t3code.service.plist | grep Path |
| 5 | "StandardErrorPath" => "/Users/<user>/.t3/userdata/logs/boot-service.log" |
| 6 | "StandardOutPath" => "/Users/<user>/.t3/userdata/logs/boot-service.log" |
Workaround
After every t3 update / t3 service install, set the unit's log paths back to ~/Library/Logs/T3Code/boot-service.log, then run launchctl bootout gui/$UID/com.t3tools.t3code.service and launchctl bootstrap gui/$UID ~/Library/LaunchAgents/com.t3tools.t3code.service.plist.
Suggested fix: write launchd log paths under ~/Library/Logs/T3Code, or keep the paths of an existing unit on reinstall. Also check after bootstrap that the job has a PID or exit code 0, so service install does not report success while the service is down.