fix: correct three dashboard miscounts — aliases, topology edges, and the Renovate dashboard issue - #28
Merged
Conversation
The forks wire themselves to their siblings with npm's alias syntax -
"buffer": "npm:@unabandoned/buffer@^6" - which keeps require('buffer')
working while pulling our fork. The scope lives in the SPEC, not the key,
and both readers here looked only at keys.
In dep_audit, the lockfile key is only WHERE a package was placed; `name`
is WHAT it is. Reading `node_modules/buffer` as "buffer" dated our own
freshly published fork from upstream buffer's 2020 packument and filed it
as an abandoned time bomb. It also invented an entire class of finding:
every aliased entry looked like a fork pulling its abandoned upstream, so
the audit reported 22 such packages across 11 forks when the real number
is 4, none of which any fork declares.
In build_dashboard, the same blind spot made every fork->fork topology
edge invisible, because a dependency keyed "buffer" never matched the
package id "@unabandoned/buffer". That is why the graph rendered as
isolated nodes with only used-by edges - the data was there all along.
Corrected totals across the 27 published forks: 147 unique packages, 46
time bombs, 44 inert, 57 alive - up from 34 alive, because our own forks
were being counted as their abandoned upstreams.
The remaining upstream copies enter through third-party intermediates
(browserify-sign, hash-base, through2 all depend on readable-stream@2/4),
so no fork's package.json can repoint them.
Renovate's "Dependency Dashboard" is a control surface, not work. It is always open and exists on every fork, and the card already surfaces it as its own "updates" link - so counting it as an issue double-counted it and put a permanent floor of 1 under every fork. Across the 27 forks the dashboard reported 29 open issues where only 2 are real work. The org-wide total was almost entirely noise, and no fork could ever show a clean zero. Matched on the bot author as well as the title, so a human-filed issue that happens to share the name still counts.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What & why
Three places where the dashboard reported numbers that were wrong. Two share a root cause; the third is independent.
1 & 2 — npm alias syntax read as the upstream package
The forks wire themselves to their siblings with npm's alias syntax:
That keeps
require('buffer')working unchanged while pulling our fork. The scope lives in the spec, not the key — and both readers added in #26 looked only at keys.dep_audit.py— forks counted as their own abandoned upstreamsA lockfile key is only where a package was placed;
nameis what it is. Readingnode_modules/bufferasbufferdated our freshly published fork from upstreambuffer's 2020 packument and filed it as an abandoned time bomb.Worse, it invented an entire class of finding. Every aliased entry looked like a fork pulling its abandoned upstream, so the audit reported 22 such packages across 11 forks. The real number is 4, and no fork declares any of them — they arrive through third-party intermediates (
browserify-signandhash-basedepend onreadable-stream@^2.3.8,through2on^4.7.0), so no fork'spackage.jsoncan repoint them. Theself_hostedsection was reporting the org's correct wiring as self-inflicted rot.build_dashboard.py— the topology graph was never emptyThe same blind spot made every
fork → forkedge invisible: a dependency keyedbuffernever matched the package id@unabandoned/buffer. That is why the graph rendered as isolated nodes with onlyused-byedges. The data was there the whole time.resolve_dep_name()now resolves annpm:spec to its target.This one predates #26 — it is the original cause of the sparse topology panel.
Corrected numbers
aliverises by 23 because our own forks stop being counted as the packages they replaced. The three classes still partition the total exactly (46 + 44 + 57 = 147).3 — the Renovate Dependency Dashboard counted as an open issue
It is a control surface, not work: always open, present on every fork, and already surfaced on the card as its own "updates" link. Counting it as an issue double-counted it and put a permanent floor of 1 under every fork, so no fork could ever show a clean zero.
Across the 27 forks the dashboard reported 29 open issues where only 2 are real work. The org-wide total was almost entirely noise.
Now matched on the bot author as well as the title, so a human-filed issue that happens to share the name still counts as real work.
Verification
dep_audit.audit()re-run against all 27 published forks: partition exact,self_hosteddown to the 4 genuine cases,@unabandoned/browserifycorrectly showing 17 sibling dependencies resolved through aliases.resolve_dep_name()checked againstnpm:@unabandoned/buffer@^6,npm:@unabandoned/jsonstream@^1,npm:@unabandoned/ret@^0.5,npm:plain-pkg@^1and^8.18.0.py_compileclean.Type of change
fix/feat/perf— consumer-facingdeps— dependency update (add thesecuritylabel if it fixes a CVE)chore/ci/build/docs/test/refactor— maintenanceChecklist
commitlintpasses)npm testpasses on Node 20 / 22 / 24 — n/a, this repo ships no npm package; the changed code is Pythonnode:testover new runners) — unchanged