Skip to content

fix(discovery): drop uninstall entries and dead-path ghosts from the AppsFolder scan#73

Merged
Alpaq92 merged 2 commits into
mainfrom
fix/discovery-ghosts-and-spinner
Jul 11, 2026
Merged

fix(discovery): drop uninstall entries and dead-path ghosts from the AppsFolder scan#73
Alpaq92 merged 2 commits into
mainfrom
fix/discovery-ghosts-and-spinner

Conversation

@Alpaq92

@Alpaq92 Alpaq92 commented Jul 11, 2026

Copy link
Copy Markdown
Owner

What

Two fixes batched for the 0.9.0 release (the first commit carries Release-As: 0.9.0):

1. fix(discovery) — uninstalled apps lingered in the menu (reported live)

"Uninstall wxNotepad++" + "wxNotepad++" survived their uninstall; launching the former opened the Documents folder. Live forensics on the affected machine found the same ghost class for Node.js and VirtualBox uninstall entries. Three holes closed:

  • MergeUwp had no uninstall filter (only the .lnk scanner did) — shell:AppsFolder lists Win32 uninstallers too.
  • The shell's app-resolver cache keeps listing uninstalled Win32 apps for a while with a raw exe path as the AUMID; the mid-uninstall watcher rescan ingested the ghost and persisted it into the discovery cache, where nothing ever removed it (its later disappearance from AppsFolder changes no file → fingerprint never flips). Launching one routed explorer.exe to an invalid shell:AppsFolder item → Documents opens. Dead drive-rooted-path AUMIDs are now skipped; real AUMIDs are untouched.
  • FromShortcut's filter ran after the info is null early-return, letting broken shortcuts bypass it.

Self-healing: the every-launch backstop rescan now produces a ghost-free list and re-persists it — no cache purge needed.

2. fix(settings) — "8" not vertically centered

A wrapping localized label makes its row two lines tall; the default-Stretch NumericUpDown fills it with text stuck at the top. VerticalAlignment=Center on all three spinners (locale-proof).

Verification

Release build 0 warnings / 0 errors. Cache inspection confirms the four ghost specimens currently persisted will drop on the first post-update rescan.

🤖 Generated with Claude Code

Alpaq92 and others added 2 commits July 11, 2026 13:59
…AppsFolder scan

Uninstalled apps could linger in the menu indefinitely: "Uninstall
wxNotepad++" and "wxNotepad++" survived their uninstall, and launching
the former opened the Documents folder.

Three holes, one per mechanism:

- MergeUwp had no uninstall filter: shell:AppsFolder lists
  AUMID-registered Win32 uninstallers too ("Uninstall wxNotepad++",
  "Uninstall Node.js", VirtualBox's bare "Uninstall"), and only the
  .lnk scanner (FromShortcut) filtered them. Mirror the same
  case-insensitive name check.
- The shell's app-resolver cache keeps listing uninstalled Win32 apps
  for a while, reporting a raw exe path as the "AUMID". A rescan in
  that window (exactly what the .lnk-deletion watcher triggers mid
  uninstall) ingested the ghost and persisted it into the discovery
  cache, where it survived indefinitely - the ghost's later
  disappearance from AppsFolder changes no file, so the fingerprint
  never flips and nothing re-scans it away. Launching one routed
  explorer.exe to an invalid shell:AppsFolder item, which falls back to
  opening Documents. Skip AppsFolder entries whose AUMID is a
  drive-rooted path that no longer exists; real AUMIDs (Package!App,
  Microsoft.AutoGenerated.{...}, {KNOWNFOLDERID}\...) skip the check.
- FromShortcut's uninstall filter sat after the info-null early return,
  so a shortcut whose ShellLink read failed bypassed the filter and
  surfaced as a launchable "Uninstall ..." tile. The name checks now
  run first.

Self-healing: the every-launch confirming backstop rescan produces a
ghost-free list, SameApps flags the difference, and the corrected list
is applied and re-persisted - no cache purge or schema bump needed.

Release-As: 0.9.0
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A localized label that wraps to two lines ("Ostatnie pliki w menu
kontekstowym" in Polish) makes its grid row taller, and the
default-Stretch NumericUpDown then fills that height with its text
stuck at the top. VerticalAlignment=Center on all three spinners keeps
them at natural height in any locale.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 11, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@Alpaq92, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 13 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e0419c99-2764-44ad-a4b9-0c8ebc1695ae

📥 Commits

Reviewing files that changed from the base of the PR and between cd7f9d6 and 2692644.

📒 Files selected for processing (2)
  • src/MenYou/Services/AppDiscoveryService.cs
  • src/MenYou/Views/SettingsWindow.axaml
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/discovery-ghosts-and-spinner

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Alpaq92
Alpaq92 enabled auto-merge (squash) July 11, 2026 12:00
@Alpaq92
Alpaq92 disabled auto-merge July 11, 2026 12:10
@Alpaq92
Alpaq92 merged commit 1870e1a into main Jul 11, 2026
10 checks passed
@Alpaq92
Alpaq92 deleted the fix/discovery-ghosts-and-spinner branch July 11, 2026 12:10
Alpaq92 added a commit that referenced this pull request Jul 11, 2026
…ullet (#76)

PR #73 carried "Release-As: 0.9.0" inside the first bulleted sub-message
of its two-commit squash body and release-please ignored it, computing
0.8.16 instead. Document the pitfall and the reliable vehicle (a
single-commit micro-PR whose own message carries the footer) - which is
exactly what this commit is: it pins the next release.

Supersedes #75 (CodeRabbit's MD018 fix folded in; amending that PR
would have required a force-push, and adding a second commit would
have buried this footer in a squash bullet - the very bug documented).

Release-As: 0.9.0

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant