Repository navigation
[compass] Fix: the uninstaller points at the anode.exe it just removed, and names only some of what it leaves - #26
Merged
Conversation
…xe (B-010) After removing anode.exe, the uninstaller pointed at SECURITY.md, whose answer is 'anode setup --undo', to turn child sessions off, and named only %LOCALAPPDATA%\Anode. It now ends with what really stays, read without anode.exe: Anode state folders (a packaged app's too) and any rendering backup in them, the seat's browser and Android Studio profiles (still signed in), child sessions (WTSIsChildSessionsEnabled via Add-Type), the Remote Desktop host and the --fps 60/--gpu values, each with how to remove it. A failing probe is skipped, never failing a finished removal. A rendering restore that fails during removal is now reported instead of ignored. SECURITY.md shows how to turn child sessions off and restore the rendering preference without anode.exe; INSTALL.md links it. test-install.ps1 checks the list with a stand-in %LOCALAPPDATA%. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…B-010)
GitHub's Windows runners have a short TEMP (C:\Users\RUNNER~1\...). The uninstaller finds packaged
state folders through a wildcard, which spells the path out in full, so the test now expects the
packaged folder the same way. Windows PowerShell 5.1's New-Item also refuses nested folders under
an 8.3 path ("is not a subdirectory of"), so the stand-in folders are made with
[IO.Directory]::CreateDirectory. Both were replayed here with a short workspace path.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The by-hand rendering restore, like 'anode rendering --restore', changes the value only while it is still Anode's 2, and the list says a backup is out of date when it isn't, with each backup's saved value. - When another Anode is on the machine (a running process or anode.exe on PATH), the list says the items are shared with it; the child-session line says "with no Anode running". - The copies of agent client settings connect-agents.ps1 saved, which can hold other servers' tokens, are listed. - Packaged folders are found with Get-ChildItem -LiteralPath, as rendering --restore does; a missing LOCALAPPDATA skips only the folder lines; the Remote Desktop line hedges for a host that was on before setup; the frame-cap and GPU values are named separately. - SECURITY.md: what False means, and restart first if a seat may still be signed in. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
… depends on the machine (B-010) CI failed on 7870fbb: the runner's own rendering value isn't Anode's 2, so the uninstaller rightly called the stand-in backup out of date, while the test expected the "set it back" wording, which holds only where a daemon has run. Both wordings name the backup's path, which is what the test now checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- SECURITY.md's by-hand rendering restore reads the backup into one object and acts only when it read one and the value is still 2, deleting the backup only then. A wrong path or an empty file, or a $previous left from an earlier paste, can no longer delete the value instead of restoring it (checked: missing, empty, changed-later and both saved values). - The list says "unreadable" for a backup it can't read, and "none (the value was absent)" as rendering --restore does. - With another Anode present, the heading says it still uses the logs, profiles and machine settings among the items, which no longer takes in the client-settings copies. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner
Author
|
Compass review: ready to merge Tested by compass-merge on 2026-10-08 on head
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Report
B-010 in Compass's
ANODE-BUGS.md(filed 2026-10-03 by compass-followup, from C-024's sales gate: the release's ownuninstall.ps1 -Quieton a scratch install of 0.11.1, read by an independent customer review).Root cause
The uninstaller's closing lines (
scripts/uninstall.ps1, 140 to 142 onmain) were written before the seat kept anything outside%LOCALAPPDATA%\Anode:anode setup --undo, after it had just removedanode.exe.%LOCALAPPDATA%\Anode. The seat's browser profiles (AnodeChrome,AnodeEdge, still signed in), Android Studio's seat profile, a packaged app's state folder (since [compass] Fix: a packaged app's daemon keeps its state in the app's package folder, which the docs and rendering --restore missed #21), the copies of client settings it saves, the Remote Desktop host, an unrestored rendering preference and the--fps 60/--gpuvalues went unmentioned.anode rendering --restoreand ignored the exit code, so a refused restore (inside a packaged app since [compass] Fix: a packaged app's daemon keeps its state in the app's package folder, which the docs and rendering --restore missed #21, or several backups) passed silently, and thenanode.exewas gone.Fix
Get-Leftoversreads what really stays, withoutanode.exe, and the closing message lists each item with how to remove it without Anode:%LOCALAPPDATA%\Anodeand anyPackages\<app>\LocalCache\Local\Anode, found asrendering --restorefinds them), and before it a rendering backup still in that folder: with its saved value and the by-hand restore while the preference is still Anode's2, or marked out of date when it isn't;connect-agents.ps1saved before changing them (config.toml.anode-backup-*,.claude.json.anode-backup-*, this removal's included), which can hold other servers' tokens;WTSIsChildSessionsEnabledthroughAdd-Type; if that can't be read (for example in Constrained Language Mode), the old "if you rananode setup" wording;fDenyTSConnections = 0), with Settings > System > Remote Desktop, hedged for a host that was on before setup;DWMFRAMEINTERVAL = 15andbEnumerateHWBeforeSW = 1, each named, with the existing SECURITY.md steps.anode.exe, or one on PATH), the list says these are shared with it.Add-Typecall toWTSEnableChildSessions(false), the callsetup --undomakes after signing the seat out), and a by-hand rendering restore fromrdp-rendering-backup.json. INSTALL.md links the first. CHANGELOG entry added.test-install.ps1(CI's install step) runs the uninstaller with a stand-in%LOCALAPPDATA%holding a state folder, a packaged one with a rendering backup, andAnodeChrome, and checks that the closing message names each and no longer sayssetup --undo.How it was tested
scripts\build.ps1 -QuickTest -OutputDirectory artifacts\pkg-build): pass, 93/93, docs links and anchors consistent, at each commit.uninstall.ps1 -Quietin Windows PowerShell 5.1, on a fake installation and a stand-in%LOCALAPPDATA%in scratch (the marker's shortcut and registry key don't exist, so nothing outside the sandbox changed): exit 0 in about 1 s, the user's file kept, user PATH unchanged. The list named the backup with its value, both state folders,AnodeChromeandAnodeAndroidStudio(not the absentAnodeEdge), and this PC's real child sessions, Remote Desktop host and frame-cap and GPU values.test-install.ps1's new setup and assertion, replayed on their own with an 8.3 short workspace path, as on GitHub's runners (RUNNER~1). That caught two CI-only traps before pushing:Get-ChildItemspells a short path out in full, and Windows PowerShell 5.1'sNew-Itemrefuses nested folders under an 8.3 path. The test handles both. On this PC the replay also showed the "shared with another Anode" heading (the installed 0.11.0 is running) and listed the real config copies in the user profile (names only).PreviousValue0 gives a DWORD 0; 2 withnullremoves the value; a value changed later (5) is left alone; the backup is deleted each time; the key was removed afterwards. The child-session command was compiled and its signature checked, not called, because it changes a machine setting.test-install.ps1itself wasn't run here (this routine runs only the quick checks); this PR's CI runs it. CI failed once, on 7870fbb: the runner's own rendering value isn't Anode's2, so the uninstaller rightly called the stand-in backup out of date, while the test expected the "set it back" wording, which holds only where a daemon has run. 359d3c0 checks only the backup's path, which both wordings name. So CI has now run both branches of that line, and this PC the other.Second review
A fresh read-only Claude subagent (Codex is at its usage limit until Fri 10-09) found no P1. It ran the extracted
Get-Leftoversunder$ErrorActionPreference = 'Stop'for aPackagesfolder that denies listing, Constrained Language Mode and an unsetLOCALAPPDATA: each ends with exit 0. Fixed in 7870fbb:2, so a stale backup could overwrite a newer value. The snippet now checks it, asrendering --restoredoes. The list marks such a backup out of date and shows each backup's saved value.Get-ChildItem -LiteralPath(no wildcard surprises with[);LOCALAPPDATAskips only the folder lines;Falsemeans and to restart first if a seat may still be signed in.Anode-SeatLaunch-*scheduled tasks after a failedDeleteTask. That is a rare product fault, not a leftover the script can see cheaply.A second pass on 7870fbb found no open P1 or P2. It ran the functions in Windows PowerShell 5.1 with brackets in a path, no
LOCALAPPDATA, noUSERPROFILEand an invalidCODEX_HOME: nothing threw. It confirmed the CI fix in 359d3c0. Fixed in 50e6977:$previousleft from an earlier paste, the by-hand restore could delete the value instead of restoring it. It now reads the backup into one object and acts, and deletes the backup, only when it read one and the value is still2. Checked on a throwaway key in five cases: both saved values, a value changed later, a missing backup and an empty one.rendering --restoredoes.SKILL.md.anode-backup-*copies of the skill file; they hold no tokens.Manual check in a seat
None needs a seat. Worth one look on a real machine at the next release: uninstall from Settings > Apps after
anode setup, and read the list.🤖 Generated with Claude Code