#6574·winget-cli

Removing a manifest version (rather than superseding it) can cause `winget upgrade` to silently downgrade, reproducing the known duplicate-entry bug via an unusual trigger

Author: cdonnellytxCreated Sep 28, 2026Updated Sep 28, 2026
LabelsIssue-BugNeeds-TriageCommand-UninstallCommand-Upgrade

Relevant area(s)

WinGet CLI

Relevant command(s)

winget upgrade, winget uninstall

Brief description of your issue

The "upgrade leaves two Add/Remove Programs entries" symptom is already well documented (#4066, #1376, #2269, #5615) and has been reported since at least 2021. What doesn't appear to be documented is one specific way to trigger it: removing a manifest version from the repo (as opposed to replacing it with a newer one) rather than a routine version bump. When that happens, "latest" can resolve backward to a much older version line than what's installed, and winget upgrade treats that as a normal forward upgrade with no downgrade warning — reproducing the duplicate-entry bug plus an actual downgrade, from a trigger that none of the linked issues describe.

Note then I hit a second issue, wherein winget uninstall --id REALiX.HWiNFO --all-versions only removed the first one because both installed entries referenced the same uninstaller .exe file. The upgrade bug is the main one, however.

Concrete case

  • REALiX.HWiNFO 8.50 had a dead installer URL (winget-pkgs #437631).
  • Because manifest edits aren't allowed under repo policy, 8.50 was removed outright rather than fixed (winget-pkgs #438028).
  • The replacement, 8.52, was sitting unmerged in winget-pkgs #423793 at the time.
  • With no 8.x manifest available, the highest remaining version resolved to 7.72 — several major versions behind what I had installed.
  • Running winget upgrade treated 7.72 as a valid forward upgrade over the installed 8.50. It installed 7.72 without removing 8.50, resulting in two Add/Remove Programs entries.
  • winget uninstall REALiX.HWiNFO only removed one of the two. The other was orphaned and invisible to winget; I had to remove it manually with a third-party tool (BCUninstaller).

Why this isn't just "another instance" of the existing reports

The Blender/WinPaletter/Cyotek/SSMS reports (#4066, #4475, #1376, #2269) all involve a normal version bump splitting into two tracked entries — seemingly a metadata-matching issue between version lines. Mine involves the available version moving backward relative to what's installed, because the manifest for the installed version disappeared from the repo entirely. That's a different root cause even though the client-side symptom looks identical, and it means the fix isn't just "match versions better" — it's "detect when the target version is older than the installed version and refuse/warn instead of treating it as an upgrade," which is exactly the gap #929 and #1543 already point at but haven't been tied to a repo-side removal scenario.

Steps to reproduce

  1. Have REALiX.HWiNFO 8.50 installed via winget.
  2. Manifest 8.50 removed from winget-pkgs (#438028) while replacement 8.52 (#423793) is unmerged, leaving 7.72 as the highest available manifest.
  3. winget upgrade REALiX.HWiNFO.
  4. Observe: 7.72 installs without removing 8.50; two entries appear in Add/Remove Programs; winget uninstall clears only one.

Expected behavior

  • winget upgrade should compare the target manifest version against the actually installed version and refuse (or explicitly flag as a downgrade, per the denelon comment on #1192 about the "unknown" vs "latest" distinction) rather than silently installing something older.
  • Whatever dedupe/identity logic causes the two-entries problem in #4066 etc. applies here too and should get fixed once, not per-package.
  • winget uninstall should be able to find and remove both entries when this has already happened, rather than leaving one orphaned.

Actual behavior

  • winget upgrade installs HWiNFO 7.72 side-by-side with HWiNFO 8.50.
  • winget uninstall --id REALiX.HWiNFO --all-versions only uninstalls 8.50, as both use the same uninstall executable and the first uninstall removes it.

Environment

bash
Windows Package Manager (Preview) v1.30.140-preview
© 2026 Microsoft. All rights reserved.

Windows: Windows.Desktop v10.0.26200.9448
System Architecture: X64
Package: Microsoft.DesktopAppInstaller v1.30.140.0

WinGet Directories                 
-------------------------------------------------------------------------------------------------------------------------------
Logs                               %LOCALAPPDATA%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\DiagOutputDir
User Settings                      %LOCALAPPDATA%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\settings.json
Portable Links Directory (User)    %LOCALAPPDATA%\Microsoft\WinGet\Links
Portable Links Directory (Machine) C:\Program Files\WinGet\Links
Portable Package Root (User)       %LOCALAPPDATA%\Microsoft\WinGet\Packages
Portable Package Root              C:\Program Files\WinGet\Packages
Portable Package Root (x86)        C:\Program Files (x86)\WinGet\Packages
Installer Downloads                %USERPROFILE%\Downloads
Configuration Modules              %LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules

Links               
---------------------------------------------------------------------------
Privacy Statement   https://aka.ms/winget-privacy
License Agreement   https://aka.ms/winget-license
Third Party Notices https://aka.ms/winget-3rdPartyNotice
Homepage            https://aka.ms/winget
Windows Store Terms https://www.microsoft.com/en-us/storedocs/terms-of-sale

Admin Setting                             State
--------------------------------------------------
LocalManifestFiles                        Disabled
BypassCertificatePinningForMicrosoftStore Enabled
InstallerHashOverride                     Disabled
LocalArchiveMalwareScanOverride           Disabled
ProxyCommandLineOptions                   Disabled
ConfigurationProcessorPath                Disabled
DefaultProxy                              Disabled