Raised out of #1166, and deliberately left out of it because it changes what a report says on hosts that change did not otherwise touch.
The gap
In host-setup/windows/install-tools.ps1, the python record carries Family = '':
@{ Name = 'python'; Package = 'Python.Python.3.13'; Probe = 'py'; Optional = @(); Family = '' }
Family is what Resolve-ToolPackage uses to work out which package id an installed version actually belongs to, by matching that version against every id in the family read from a plain source search. node is the only tool that sets it today, because it ships under several ids.
Python ships under one id per minor line, so it has exactly the shape Family exists for, and a host that installed 3.12 or 3.14 by hand is currently misread rather than told that -Reinstall python is what moves it to the managed line. This host carries 3.12 and 3.13 side by side, which is the ordinary outcome of moving between lines since each id installs its own copy and uninstalling one does not touch another.
The fix, and the trap in it
Family = 'Python.Python.', with the trailing dot.
The dot is not cosmetic. Read-WingetSearchTable takes the family as a prefix, and a bare Python.Python also prefixes Python.PythonEmbeddablePackage.3.14 and Python.PythonInstallManager, both of which are in the catalog. Either would be matched into the family and could resolve as the installed id. The trailing dot excludes both.
Why it was not folded into #1166
It changes Get-ToolStatus output for hosts carrying a non-managed line, which is a reporting change independent of that change's subject. Worth its own diff and its own verification on a host with two lines installed.
Raised out of #1166, and deliberately left out of it because it changes what a report says on hosts that change did not otherwise touch.
The gap
In
host-setup/windows/install-tools.ps1, thepythonrecord carriesFamily = '':Familyis whatResolve-ToolPackageuses to work out which package id an installed version actually belongs to, by matching that version against every id in the family read from a plain source search.nodeis the only tool that sets it today, because it ships under several ids.Python ships under one id per minor line, so it has exactly the shape
Familyexists for, and a host that installed 3.12 or 3.14 by hand is currently misread rather than told that-Reinstall pythonis what moves it to the managed line. This host carries 3.12 and 3.13 side by side, which is the ordinary outcome of moving between lines since each id installs its own copy and uninstalling one does not touch another.The fix, and the trap in it
Family = 'Python.Python.', with the trailing dot.The dot is not cosmetic.
Read-WingetSearchTabletakes the family as a prefix, and a barePython.Pythonalso prefixesPython.PythonEmbeddablePackage.3.14andPython.PythonInstallManager, both of which are in the catalog. Either would be matched into the family and could resolve as the installed id. The trailing dot excludes both.Why it was not folded into #1166
It changes
Get-ToolStatusoutput for hosts carrying a non-managed line, which is a reporting change independent of that change's subject. Worth its own diff and its own verification on a host with two lines installed.