Abandonment heuristic produces false positives for mature tools with server-side data (e.g., govulncheck) #42727
AndriyKalashnykov
started this conversation in
Suggest an Idea
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
Summary
Renovate's abandonment heuristic (
abandonmentThreshold) relies solely on release-date age. For packages whose CLI is intentionally stable while their functional data updates server-side, this produces a confident false positive — the package is marked abandoned in the Dependency Dashboard even when the project is actively maintained.A representative example is
golang.org/x/vuln/cmd/govulncheck:v1.1.4on 2025-01-13mastergolang/(official Go sub-repo)vuln.go.devThe tool is explicitly designed with a stable CLI because the thing that actually moves — the CVE database — lives on a remote endpoint. A release-age-only heuristic can't distinguish "abandoned" from "mature, stable, server-updated".
Why this matters
Users see
govulncheck(and tools like it) reported as abandoned on their Dependency Dashboard, then have to either:packageRules+abandonmentThreshold: "5 years", which every downstream repo has to re-discover independently.This noise erodes trust in the Dependency Dashboard's abandonment signal.
Proposal
Extend the abandonment heuristic to consider at least one additional signal beyond release age. Candidates in rough order of preference:
archived: true, regardless of release age. (Already a strong signal for the opposite conclusion.)Implementation sketch: for any
datasourcethat Renovate already looks up through the GitHub API (which returnspushed_atandarchived), fold those fields into the abandonment decision. A package is abandoned iff bothage(last_release) > thresholdandage(last_push) > threshold— never by release age alone.Motivating cases beyond govulncheck
Other mature CLIs that could trip the same false positive:
benchstat(golang.org/x/perf/cmd/benchstat) — Go team's benchmark diff tool, similar "stable CLI / active data" pattern.shellcheckwhen its release cadence slows (project is very active historically but releases are uneven).actionlint(similar pattern — long periods between releases).Current workaround
Per-package
abandonmentThresholdoverride inrenovate.json:{ "packageRules": [ { "matchDepNames": ["golang.org/x/vuln/cmd/govulncheck"], "abandonmentThreshold": "5 years" } ] }Works, but every downstream repo must re-discover and apply it. A heuristic fix would help the whole ecosystem.
Environment
43.128.0custom.regex(via# renovate:inline comment in.mise.toml)gogolang.org/x/vuln/cmd/govulncheckPreviously filed as Issue
Originally filed as #42725 and auto-closed per the Issues-are-for-maintainers policy (
needs-discussionlabel). Re-filing here as requested.Happy to open a PR if the maintainers agree with the general approach; let me know if you'd prefer a specific implementation direction (e.g., fold
pushed_atintoisAbandonedat the datasource level vs. in a separate post-lookup step).Beta Was this translation helpful? Give feedback.
All reactions