Data & limits
Everything is fetched live from public sources and disk-cached under .cache/; nothing is
invented and no number is estimated.
| source | what we take |
|---|---|
| GitHub REST API | lockfile commit history and contents per watched repository — package-lock.json (npm lockfileVersion 2/3) or pnpm-lock.yaml (pnpm 6.x/9.x), root only; yarn/bun are refused, not guessed; the repository tree for the import scan; code search for "beyond the watched set" |
| registry.npmjs.org | versions, publish times (the time map survives version removal — that is how removed and exact live_from are known), maintainers |
| api.npmjs.org | weekly downloads (unscoped packages) |
| OSV.dev | advisories (MAL-*, GHSA-*, CVE-*), affected ranges expanded against the ingested versions |
The installable window
live_from is exact (npm keeps the publish timestamp after erasing a version). live_to is an
upper bound: npm publishes no takedown time, so we use the earlier of the next surviving
publish and the advisory's published time, and say upper bound wherever it applies. Two evidence
classes follow: in window (a lockfile committed inside the window — it does not prove an install
happened) and pins removed (a lockfile pins a version npm has since erased, which is only
possible while it was live — commit time is irrelevant).
Caps that are stated, never hidden
- Q4 exposure is computed for the eight most-downloaded co-maintained packages; the rest read
— not computed. - Explanation paths are the three shortest per lockfile, not all of them.
- Whole-graph counts are refused by the engine above certain sizes; the Graph page says so instead of showing a stale number.
twofa/account_createdare not exposed by the public registry — shown as unknown.- pnpm lockfiles record resolved versions but not the declared range per dependency, so
DEPENDS_ONedges from pnpm carry norangeproperty (npm edges keep it verbatim). - Reachability is import-level (L0/L1) from a regex scan of first-party JS/TS at the exposed commit; symbol-level (L2) is only claimed when an advisory names a symbol and the scan finds it.
Cohorts
The watched set is disclosed in demo/services.txt: eight well-maintained repositories, four
real victims of the 2025-09-08 npm incident found by code-searching the malicious tarball names,
and anything added through the console.