Triage
Accepted as a high-severity Linux AppImage update bug. The download was intact (100%, sha512 verified, update-info.json written). The working binary was destroyed during install and left as a 0-byte t3code.AppImage. An empty AppImage exits 0 with no window, which matches the report.
This is not a duplicate of #8944 / #8983 / #9945 / #9946 (those are versioned filenames breaking dock pins and .desktop entries).
What the code does
t3code does not implement AppImage install itself:
apps/desktop/src/updates/DesktopUpdates.tslogsupdate downloaded, then callsquitAndInstall({ isSilent: true, isForceRunAfter: true }). There is no install log line and no post-install size/sha512 check. Failed-install recovery only runs ifquitAndInstallthrows.apps/desktop/src/electron/ElectronUpdater.tsis a thin wrapper overelectron-updater6.8.3.autoUpdater.loggeris not wired into the desktop trace.
Stock AppImageUpdater.doInstall (6.8.3 and current upstream) is:
unlinkSync($APPIMAGE)— old binary gone first- If the current name has no
x.y.z(here:t3code.AppImage), overwrite that same path mv -ffrom~/.cache/t3code-updater/pending/— across filesystems this is copy+delete, notrename(2)- No verify of the installed file
spawnLogthe destination (isForceRunAfter: true) and return success
A “successful” 0-byte copy therefore quits the app, relaunches an empty file (exit 0), and leaves nothing to roll back. Timestamps in the report (birth at 01:37:14, mtime copied from the download, pending AppImage gone, only update-info.json left) match this path.
The exact reason that one mv wrote 0 bytes is still unknown (dest FS had space; / was 99% full). The brick is the install design, not the missing mv root cause.
Related work
- #8944, #8983, #9945, #9946 are filename/dock-pin issues, not this.
- No open PR for same-filesystem staging or post-install verify.
- #8983 would expand this. A stable
T3-Code-${arch}.AppImagename has nox.y.z, so every Linux user would take the overwrite-in-place branch. Do not land that without a safer install. - Upstream still uses unlink-then-
mv(AppImageUpdater.ts). A dependency bump will not fix this.
Next step
Harden Linux install on our side (wrapper or pre-quitAndInstall path):
- Stage the downloaded artifact on the same filesystem as
$APPIMAGE - Verify size + sha512 against
update-info.jsonbefore replacing - Keep the old AppImage until the new file is verified, then atomic
rename(2) - Log the install step and wire
autoUpdater.loggerintodesktop-updatertraces
User workaround (already applied): re-download onto the AppImage filesystem, verify against nightly-linux.yml, mv into place, chmod 755, keep a backup copy.