Microsoft’s package manager for Windows has a blind spot: it can silently install certain portable applications without recording them in the local inventory. That means no upgrade, no removal through winget, and an invisible presence that can trip up automation and compliance checks. The problem came into sharp focus with a May 2026 bug report targeting WinGet 1.28.240 and Anthropic’s Claude Code, but the underlying risk applies to any portable tool delivered through the command line.

The specific bug that broke inventory for Claude Code

On May 3, 2026, a user reported on GitHub that running winget install Anthropic.ClaudeCode completed without errors, yet the package never appeared in winget list. Attempts to upgrade or uninstall it with winget also failed — the tool was effectively unmanaged. The issue was closed on May 18 after two weeks of inactivity, without a linked fix or a formal resolution in the winget client.

The report pinned the failure to WinGet version 1.28.240. That detail is critical: earlier or later versions may behave differently, and no blanket statement covers every environment. For IT teams, the takeaway is straightforward — don’t assume a successful winget install proves the package is inventoried, patchable, or cleanly removable. You need to check.

Portable apps like Claude Code operate outside the traditional MSI‑ or .exe‑installer model. They’re dropped into a directory, often added to the system PATH, and tracked only by a registry key that WinGet uses for housekeeping. If that key isn’t written correctly — or if something else overwrites it — the package manager loses its grip. Microsoft has acknowledged this fragility. WinGet 1.29, released after the Claude Code issue was closed, introduced improvements for "portable-install ARP correlation" and "tracking-database healing." However, release notes stop short of declaring the May report resolved, and there’s no public evidence that the changes specifically address the Claude Code scenario.

Why this matters for everyday Windows users and pros

The practical fallout depends on who you are:

For developers and power users — if you grabbed Claude Code via winget and later try winget upgrade --all, that one package will be skipped. You’ll never see an update notification through winget for it, even though Anthropic documents winget upgrade Anthropic.ClaudeCode as the proper manual update method. The tool will sit on your disk, potentially outdated and insecure, while you assume package management has your back. Worse, if you attempt to uninstall with winget uninstall Anthropic.ClaudeCode, you’ll get an error or a no-op because winget can’t find it. You’ll have to delete its folder and PATH entry manually — a clumsy process for something that was supposed to be managed.

For IT administrators — a machine may pass initial provisioning because winget install returned a success code, but it will fail later compliance scans that rely on winget list. If you push winget upgrade --all through a maintenance script, any Claude Code installs will be silently ignored, leaving endpoints with stale tools. The uninstall path breaks as well, frustrating clean-up efforts. And because WinGet’s portable tracking uses a registry key based on the package identifier, not the executable name, you can’t diagnose the problem by looking for claude.exe — that file exists, but the winget record doesn’t. The result is an invisible installed app that undermines your inventory system.

There’s also a separate but related hazard: both the Claude desktop app and Claude Code can drop claude.exe into the PATH. If both are installed, typing claude might start the wrong one, breaking scripts, IDE tasks, or help-desk runbooks. That’s not a winget bug — it’s a deployment hygiene problem — but it amplifies the confusion caused by the inventory gap.

How we got here: portable apps and WinGet’s evolving model

WinGet has always had a more tenuous grip on portable applications than on classic installer‑based programs. Unlike the Microsoft Store or MSI packages that write thoroughly into the registry, portables often leave minimal footprints. WinGet tries to compensate by maintaining its own database of installed packages, using the portable’s package ID to create a registry marker. But if something disrupts that process — a permissions glitch, a race condition, or an unexpected exit code — the marker never appears, and WinGet loses track.

This isn’t the first time portable install tracking has caused headaches. Early versions of winget didn’t even support uninstalling portables; that was added later. The May 2026 incident follows a pattern: as more complex AI‑coding tools and CLIs flood WinGet, the package manager’s once‑simple model gets stressed. Claude Code is just a prominent example because its vendor explicitly documents WinGet as an install path, and a public issue shed light on the lifecycle gap.

Version 1.28.240 shipped through the Windows App Installer update channel. Microsoft hasn’t confirmed a regression, but the timing lines up. WinGet 1.29 introduced database‑healing logic that might auto‑repair a missing tracking record when you later run winget list or upgrade, but the closed issue didn’t link to a fix, so we can’t assume the problem is gone. Users on different App Installer versions may see different results, which is why version‑specific testing matters.

What to do now: workarounds, checks, and safer habits

Until Microsoft firms up portable lifecycle handling, you can protect yourself with a few deliberate steps. The forum community has already outlined a validation workflow that IT shops can adopt, and individuals can borrow parts of it.

Immediate check — after installing any portable package through winget, run winget list <PackageID> immediately. For Claude Code: winget list Anthropic.ClaudeCode. If the package doesn’t appear, do not trust that instance for future updates or removals. You have two choices: try reinstalling with the --force flag, or manually clean up and install from a different source (like the vendor’s installer).

Uninstalling a broken portable — since winget can’t see the package, use the manual method: delete the folder where the tool lives (often under C:\Users\<user>\AppData\Local\Microsoft\WinGet\Packages) and remove any PATH entry that points to it. This is messy, but effective. The winget uninstall command’s --purge and --preserve flags only work on packages it can enumerate, so they won’t help here.

For enterprise teams — before approving an AI coding CLI like Claude Code for broad deployment, pilot it on a disposable VM or test device that matches your production App Installer version. Execute and document:
- winget install Anthropic.ClaudeCode
- winget list Anthropic.ClaudeCode — confirm it appears
- winget upgrade Anthropic.ClaudeCode — even if no newer version exists, verify the command can resolve the package
- winget uninstall Anthropic.ClaudeCode
- winget list Anthropic.ClaudeCode again — must be absent
- Finally, check with a file search or PATH walk to ensure no claude.exe is left behind.

If any step fails, the package should be flagged as requiring a different management pipeline — maybe a scripted installer deployment, or installation outside of winget until the platform matures. Don’t accept a success from winget install alone.

Watch out for the shared executable name — if your environment already has the Claude desktop application, mapping which claude.exe launches is crucial. Use where claude in PowerShell to see all copies and their order. Adjust PATH or create aliases so that automation hits the intended one. This is especially important for IT runbooks that invoke claude for tasks.

Update strategy — Anthropic provides an environment variable, CLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATE=1, that tells Claude Code to trigger package-manager updates in the background. That’s fine for sole developers, but in managed fleets it may clash with centrally initiated updates. Decide on one update channel: either let the tool handle itself (and adjust winget expectations) or disable auto‑update and rely on scheduled winget upgrade runs — after confirming that winget can indeed see the package.

Outlook: what’s next for portable app management on Windows

Microsoft is investing in WinGet’s portable support, and the 1.29 changes suggest a trajectory toward self‑healing databases. But until a confirmed fix retroactively addresses the May report, each new portable package landing in the repository is a roll of the dice. Developers who distribute tools via winget portable manifests should test aggressively, and admins must retain a healthy skepticism. The Claude Code case isn’t an indictment of AI tools — it’s a reminder that a command‑line success isn’t the same as a managed state. As WinGet grows into its role as the default Windows package manager, expect more pressure to make portable‑app lifecycle as solid as traditional installs. In the meantime, test, verify, and never trust winget install alone.