microsoft / microsoft/winget-pkgs

Unstable installer URLs cause perpetual hash mismatch failures

Open
#379,027 1 comment 2 reactions 0 assignees View on GitHub
Area-Validation-Pipeline Error-Hash-Mismatch Issue-Feature
Dominant language
No language data
Stars
11.1k
Forks
9.7k
Avg merge
1h 32m
Merged PRs (30d)
616

Description

## Summary

Publishers overwrite release binaries at the same URL (vanity/unstable URLs), causing the installer hash to change frequently. This creates a cycle where:

1. The automation bot detects the hash mismatch and submits a PR with the new hash
2. By the time the validation pipeline runs (hours later), the publisher has replaced the binary again
3. The pipeline's Installers Scan step fails with "Specified hash doesn't match"
4. The bot detects the mismatch again and creates another PR — cycle repeats indefinitely

## Impact

- Perpetually failing bot PRs that will never pass validation
- Merged manifests with stale hashes that cause install failures for users (`winget install` will fail hash verification)
- Wasted pipeline compute on PRs that cannot succeed

## Affected Packages (Examples)

| Package | URL Type | Behavior |
|---------|----------|----------|
| Okabe-Rintarou-0.SJTUCanvasHelper | GitHub release (re-tagged) | Binary changes with each CI build pushed to same tag |
| AnInsomniacy.MotrixNext | GitHub release | Same |
| axpnet.AeroFTP | GitHub release | Same |
| IvanCharapanau.Harbor | GitHub release | Same |
| PostgreSQL.psqlODBC | GitHub release | Same |
| MoeruAI.AIRI | GitHub release | Same |
| Neovim.Neovim.Nightly | GitHub nightly release | By design — nightly builds overwrite |
| Abnerla.AI_paper | GitHub release | Same |
| IvyScience.ivySCI | CDN | Binary replaced at same URL |
| Folge.Folge | CDN | Same |
| Fiorilli.FiorilliWebExtensionClient | CDN | Same |

## Possible Mitigations

- **Pipeline-level:** If hash mismatch is detected at Installers Scan, re-hash the downloaded binary and compare against the PR's proposed hash at download time (not against the merged manifest). If the URL serves a different binary than what the bot computed, fail fast with a clear "unstable URL" label rather than generic hash mismatch.
- **Bot-level:** Detect repeatedly-failing hash updates for the same version and stop retrying after N attempts. Apply a label like `Unstable-URL` so maintainers can triage differently.
- **Manifest-level:** Require or encourage publishers to use versioned/pinned URLs (e.g., `/download/v1.0.0/app-v1.0.0.exe`) rather than overwriting the same artifact. Consider a manifest field or documentation guidance for URL stability expectations.
- **Policy-level:** Consider removing manifests with known-stale hashes from the index, or marking them with a warning, so users aren't served broken installs.

## Related PRs (perpetually failing)

- https://github.com/microsoft/winget-pkgs/pull/376233
- https://github.com/microsoft/winget-pkgs/pull/376230
- https://github.com/microsoft/winget-pkgs/pull/378832
- https://github.com/microsoft/winget-pkgs/pull/377408
- https://github.com/microsoft/winget-pkgs/pull/376894
- https://github.com/microsoft/winget-pkgs/pull/376862
- https://github.com/microsoft/winget-pkgs/pull/376210
- https://github.com/microsoft/winget-pkgs/pull/376229
- https://github.com/microsoft/winget-pkgs/pull/376176
- https://github.com/microsoft/winget-pkgs/pull/378853
- https://github.com/microsoft/winget-pkgs/pull/378264

Contributor guide

Open the contributing guide

Research direction

No repository files or tests are named. Start by reviewing the Installers Scan failures and the related pull requests listed in the issue, then identify which mitigation maintainers select. Done would require an agreed behavior for unstable URLs, such as detection, retry limits, labeling, or publisher guidance, with validation that the failure is handled as intended.

Written by the indexing model from the issue text.

Assessment

Tech stack
github
Domain
ci-cd, devops, release, tooling
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.