Skip to content

fix(desktop): the Windows installer check looks for the uninstaller packaging writes - #240

Merged
jayleaton merged 1 commit into
mainfrom
fix/ada-windows-uninstaller-20261113
Nov 13, 2026
Merged

jayleaton merged 1 commit into
mainfrom
fix/ada-windows-uninstaller-20261113

Conversation

@jayleaton

Copy link
Copy Markdown
Owner

The first nightly built as Ada (run 43445916151) failed at Desktop Windows x64 / Verify and arm64 / Verify, on test-agents-windows-installer.ps1:52, where Start-Process could not find Uninstall Ada.exe.

The installer was right; the check was wrong. electron-builder's NSIS template defines UNINSTALL_FILENAME as Uninstall ${PRODUCT_FILENAME}.exe. PRODUCT_FILENAME is appInfo.productFilename, which is win.executableName when one is set. Since #238 pins the exe to "T3 Agents", an Ada build ships:

Ada build
Exe %LOCALAPPDATA%\Programs\t3agents\T3 Agents.exe
Uninstaller …\t3agents\Uninstall T3 Agents.exe
Registry UninstallString "…\t3agents\Uninstall T3 Agents.exe" /currentuser (same define, so Settings → Apps works)
Apps entry DisplayName, shortcuts Ada <version>, Ada.lnk (from the product name)

The uninstaller file name is the same before and after the rename, so an existing "T3 Agents" install's uninstaller is replaced in place on update.

Changes

  • The exe-name rule moves from build-desktop-artifact.ts to a dependency-free scripts/lib/windows-package-names.ts, which also derives the uninstaller name. Packaging, the payload check and the release Verify step all use it. Verify runs it with node and passes both names to the PowerShell check, so no names are hard-coded in the test.
  • The check now uninstalls through the registered UninstallString, the path Settings → Apps uses. It asserts that the string names the installed uninstaller, and that uninstalling removes the Apps entry and the shortcuts. The update path from "T3 Agents" (one Ada shortcut afterwards, an Ada Apps entry) is still covered, and now ends in that same uninstall.
  • New fork-windows-installer-check.yml, path-filtered to the installer files, the check, the packaging script and release-desktop.yml. It builds an unsigned Ada installer through the nightly's own release-desktop.yml (bundle, Linux x64 for the WSL CLI archive, then Windows x64 with a windows-2025 Verify) and runs the same Verify step. It's about 4 jobs and roughly 15 minutes, only on PRs that touch those paths, plus workflow_dispatch. This PR triggers it.

Merge risk

Low. Packaging output is unchanged; only the check, its inputs and a new CI workflow change. The new workflow passes no secrets.

vp run check:changed passes. The PowerShell runs only on Windows; this PR's Fork Windows installer check is its proof.

Opus 5.5 via Claude Code in Ada.

🤖 Generated with Claude Code

…ackaging writes

With productName Ada and the exe pinned to "T3 Agents", NSIS names the uninstaller after
electron-builder's productFilename, the exe name: "Uninstall T3 Agents.exe". The installer
was right; the check looked for "Uninstall Ada.exe" and failed every Ada nightly.

- The exe-name rule moves to a dependency-free scripts/lib/windows-package-names.ts, which also
  derives the uninstaller name. The release Verify step passes both names to the check.
- The check uninstalls through the registered UninstallString, the path Settings > Apps uses,
  and asserts it removes the Apps entry and the shortcuts.
- A path-filtered PR workflow builds an unsigned Ada installer through release-desktop.yml and
  runs the same Verify step, so installer changes no longer wait for a nightly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added vouch:trusted Author is trusted by repo permissions or the VOUCHED list. size:L labels Nov 13, 2026
@github-actions

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 5.0 KiB 5.0 KiB 0 B (0.0%) 6.8 KiB ✅
Codex Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Codex Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Codex Live turn WebSocket decoded 21.5 KiB 21.5 KiB 0 B (0.0%) 24.4 KiB ✅
Codex Live turn messages 1 1 0 (0.0%) 8 ✅
Claude Total thread wire 5.0 KiB 5.0 KiB 0 B (0.0%) 6.8 KiB ✅
Claude Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Claude Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Claude Live turn WebSocket decoded 21.9 KiB 21.9 KiB 0 B (0.0%) 24.4 KiB ✅
Claude Live turn messages 1 1 0 (0.0%) 8 ✅

Baseline: 89b5cb1 · PR result: 0dbe6ce · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 108.5 KiB
  • Claude decoded thread snapshot: 108.8 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@jayleaton
jayleaton marked this pull request as ready for review November 13, 2026 15:40
@jayleaton
jayleaton merged commit 57ef5ff into main Nov 13, 2026
34 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L vouch:trusted Author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant