[Bug]: macOS update to 0.1.0 renames T3 Code (Alpha).app and then fails to relaunch#20103

opened12d agobyOOmarAlaaeldein

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

apps/desktop

Steps to reproduce

  1. Install a macOS desktop build whose on-disk name is T3 Code (Alpha).app. Homebrew cask t3-code 0.0.45 does this, as does any stable or nightly build from before #20032. Pin it in the Dock.
  2. Accept the in-app update to 0.1.0. That release includes #20032, which changes electron-builder productName from T3 Code (Alpha) to T3 Code (Beta).
  3. Let the updater quit the app and install.

Expected behavior

The updated app relaunches, and the existing Dock icon opens it.

Actual behavior

Squirrel renames /Applications/T3 Code (Alpha).app to /Applications/T3 Code (Beta).app, then tries to relaunch ShipIt from the Alpha path it just removed. posix_spawn fails with No such file or directory. The same log line says Installation completed successfully, so the app never comes back and there is no error UI.

The installed bundle is fine. codesign --verify --deep --strict passes, spctl accepts it as a notarized Developer ID app, and launching /Applications/T3 Code (Beta).app directly works and reports no newer update. The Dock item still points at file:///Applications/T3%20Code%20(Alpha).app/, so clicking it fails with "The file does not exist." The Homebrew cask symlink is the same stale Alpha path.

#20032 treats Beta as a product label, but electron-builder uses productName as the .app directory name. After the install, ShipItState.plist still has targetBundleURL set to the Alpha app and useUpdateBundleName set to true. ShipIt then does:

Launching new ShipIt at /Applications/T3 Code (Alpha).app/Contents/Frameworks/Squirrel.framework/Resources/ShipIt

docs/operations/release.md says removing the Beta label later is another branding change. Changing productName again will break this same relaunch.

This is not #4224. That report is a launchd spawn failure (RBSRequestErrorDomain Code 5 / POSIX 163) on an app that is still at its original path. Here the bundle was renamed out from under ShipIt, and a direct launch of the new path succeeds.

Impact

Blocks work completely

Version or commit

In-app update from 0.0.45 Alpha to 0.1.0 (81493ef), which includes #20032.

Environment

macOS 27.0.1 (26A434), Apple Silicon. Desktop app installed with Homebrew cask t3-code 0.0.45, then updated by the bundled Squirrel / electron-updater.

Logs or stack traces

~/Library/Caches/com.t3tools.t3code.ShipIt/ShipIt_stderr.log, 2026-10-15 21:17:

1Beginning installation
2Moving bundle from file:///Applications/T3%20Code%20(Alpha).app/ to file:///Applications/T3%20Code%20(Beta).app
3Moving bundles directly as SquirrelMacEnableDirectContentsWrite is disabled for app: com.t3tools.t3code.ShipIt
4Moved bundle contents from file:///Applications/T3%20Code%20(Alpha).app/ to file:///Applications/T3%20Code%20(Beta).app
5...
6On main thread and launching: file:///Applications/T3%20Code%20(Beta).app
7Bundle URL is valid
8Attempting to launch app on 11.0 or higher
9Launching new ShipIt at /Applications/T3 Code (Alpha).app/Contents/Frameworks/Squirrel.framework/Resources/ShipIt with instructions to launch file:///Applications/T3%20Code%20(Beta).app
10posix_spawn: No such file or directory
11New ShipIt exited
12Installation completed successfully
13ShipIt quitting

Workaround

Open /Applications/T3 Code (Beta).app directly and point the Dock icon at that bundle. Leave the Homebrew cask alone while its artifact is still T3 Code (Alpha).app. Reinstalling it would put 0.0.45 back.

Note

Grok responding on behalf of Julius.

Thanks for the detailed report and the ShipIt log. I'm accepting this as a bug.

What I checked on main:

  • #20032 (merged Oct 15) changed productName in apps/desktop/package.json from T3 Code (Alpha) to T3 Code (Beta). electron-builder uses productName as the .app folder name, so 0.1.0 ships as T3 Code (Beta).app.
  • The desktop updater calls electron-updater's quitAndInstall (apps/desktop/src/electron/ElectronUpdater.ts) and doesn't hardcode any app path, so the rename and relaunch both happen inside Squirrel.Mac/ShipIt. Your log shows ShipIt starting its relaunch helper from the old Alpha path it had just moved away, which matches.
  • docs/operations/release.md says removing the Beta label later is a separate branding change, so the same problem would come back if productName changes again.

I didn't find an open fix PR or an existing issue for this. It isn't #4224.

Workaround until it's fixed:

  • Open /Applications/T3 Code (Beta).app directly. It's already updated.
  • Remove the old Dock icon and pin the Beta app again.
  • Homebrew users: don't reinstall the cask until it's updated for the new app name, because for now that would put 0.0.45 back.
Synced from GitHub

Same failure when switching update channel from Alpha to Nightly (not only the 0.1.0 Beta rename)

Found with t3 triage. Same root cause as this issue, but a different trigger: switching the desktop app's update channel from Alpha to Nightly also changes the bundle name. So ShipIt renames the .app folder and then tries to relaunch from the old path.

Steps to reproduce

  1. Run T3 Code (Alpha).app on macOS.
  2. Switch the update channel to Nightly and let it download the update.
  3. Click restart to install.
  4. The app quits and never comes back.

Environment

  • macOS 26.5.2, Apple Silicon (arm64)
  • Updated from: Alpha build (exact version unknown)
  • Updated to: 0.1.1-nightly.20261017.3238

ShipIt log (~/Library/Caches/com.t3tools.t3code.ShipIt/ShipIt_stderr.log; temp-folder paths shortened)

115:53:40 Moving bundle from file:///Applications/T3%20Code%20(Alpha).app/ to file:///Applications/T3%20Code%20(Nightly).app
215:53:40 Moved bundle contents from file:///Applications/T3%20Code%20(Alpha).app/ to file:///Applications/T3%20Code%20(Nightly).app
315:53:40 Moving bundle from โ€ฆ/T/com.t3tools.t3code.ShipIt.ExIOfBCk/T3%20Code%20(Nightly).app to file:///Applications/T3%20Code%20(Nightly).app
415:53:41 Launching new ShipIt at /Applications/T3 Code (Alpha).app/Contents/Frameworks/Squirrel.framework/Resources/ShipIt with instructions to launch file:///Applications/T3%20Code%20(Nightly).app
515:53:41 posix_spawn: No such file or directory
615:53:41 Installation completed successfully

Before that, the desktop trace shows desktop.updates.installDownloadedUpdate succeeding, and nothing is logged after it. The installed Nightly bundle is valid (spctl: accepted, notarized). Opening /Applications/T3 Code (Nightly).app by hand works, and the backend starts normally.

Why it matters: every switch between Alpha, Beta and Nightly changes productName and therefore the bundle name. So this will keep happening on channel switches, not just at the one-time Beta rename. Any fix should cover any bundle name change, for example by relaunching from the new bundle path or keeping the bundle name the same across channels.

Workaround: open the new .app from /Applications yourself, and re-pin it in the Dock.


Produced by Claude Code (Opus 5.5, claude-opus-5-5) via the T3 Code triage playbook.

Synced from GitHub

Same failure here, triggered remotely, which makes it worse: the machine stays unreachable.

Setup: T3 Code (Alpha) 0.0.45 desktop app on macOS (Apple Silicon), reachable only via T3 Connect, nobody at the machine, screen locked.

Trigger: from a remote 0.1.0 client, Settings โ†’ Connections โ†’ Update on the outdated (protocol v1) server.

Result: ShipIt installs T3 Code (Beta).app, then tries to spawn the relaunch helper from the old Alpha path and fails. The app never relaunches, so the server stays offline until someone opens the app by hand, which isn't possible remotely. I only recovered because I had another way to launch the app.

~/Library/Caches/com.t3tools.t3code.ShipIt/ShipIt_stderr.log:

1Moving bundle from file:///Applications/T3%20Code%20(Alpha).app/ to file:///Applications/T3%20Code%20(Beta).app
2...
3On main thread and launching: file:///Applications/T3%20Code%20(Beta).app
4Launching new ShipIt at /Applications/T3 Code (Alpha).app/Contents/Frameworks/Squirrel.framework/Resources/ShipIt with instructions to launch file:///Applications/T3%20Code%20(Beta).app
5posix_spawn: No such file or directory
6New ShipIt exited
7Installation completed successfully

Impact for remote-only users: the update a 0.1.0 client requires to restore compatibility (protocol v1 โ†’ v2) is exactly the one that leaves the host offline. Remote users have no fallback here.

Workaround: none that works remotely. You need some other way to run open "/Applications/T3 Code (Beta).app" on the host (SSH, screen sharing, etc.).

Synced from GitHub

Hit this today updating an older Alpha install to 0.1.2 on macOS 27.2 (arm64). The app appeared to disappear after clicking the in-app update button. No T3 Code process was left running when I checked.

The installed Beta bundle was present and passed codesign --verify --deep --strict. ShipIt logged:

text
110:24:17 Moving bundle from file:///Applications/T3%20Code%20(Alpha).app/ to file:///Applications/T3%20Code%20(Beta).app
210:24:17 On main thread and launching: file:///Applications/T3%20Code%20(Beta).app
310:24:17 Launching new ShipIt at /Applications/T3 Code (Alpha).app/Contents/Frameworks/Squirrel.framework/Resources/ShipIt with instructions to launch file:///Applications/T3%20Code%20(Beta).app
410:24:17 posix_spawn: No such file or directory
510:24:17 Installation completed successfully

Running open "/Applications/T3 Code (Beta).app" brought the app back to its Threads view. No reinstall or data reset was needed. The old version appears to have been 0.0.35 based on the cached LaunchServices record for its helper; the removed Alpha main bundle could not be inspected.

I opened #25424 to put these recovery steps in the user updating guide. That complements #23028 and leaves the automatic-relaunch fix tracked here.

Investigated with GPT-6 in Codex.