Check P6 · provenance family · severity HIGH · automatic · one of the 12 npm and PyPI package checks
Maps to OWASP LLM03 ATLAS AML.T0079 A listing younger than the campaign that uses it — the capability staged on infrastructure the adversary controls.
The question this check asks: how long has this package existed? A typosquat or a dependency-confusion package is published days before it is used, and a package that has been on the registry for years has had years of people installing it.
Age is the cheapest signal there is and one of the most telling. A package impersonating another is new; a package published to catch a mistyped name is new; a package published for one campaign is new. The repository roster reads the same shape as repository age, for the same reason. Age proves nothing about a package's intent — every package was new once — which is why it warns and never blocks.
The first publication date is npm's time.created from the package's whole record, or on PyPI the earliest upload time across all releases. pkg-age is HIGH and 12 points when the package was first published less than 30 days ago and MEDIUM and 5 points under 90 days. Both are warnings under the default profile, never a block on their own; the finding prints the number of days.
The same 90-day line decides what “established” means on every page of this roster: an install script, a missing repository or a lookalike name is graded harder on a package younger than that.
An npm record too large to read in full belongs to a package with a great many versions. The age is then a stated skip, never a guess, and such a package counts as established only when its name is on the vendored list of the most-used npm packages — a list a publisher cannot put themselves on. If the release history could not be read at all, the scan is partial and P6 is listed as not checked.
Every honest new package. A first release is a REVIEW for thirty days at HIGH and sixty more at MEDIUM; the finding states the age so the reader is judging a number, and an override records the reason.
The age of a version. This check reads when the package first appeared, not when its latest version did; a new release of an old package is P7's and P8's question. The age of the publisher's account. Neither registry publishes it in the record read. The package's code is not read.
Scope, the same on every page of this roster: RepoGates does not see git clone, package managers or curl — outside Claude Code with the RepoGates plugin, whose hook refuses a clone or install that names a blocked repository on the command line, before it runs. The hook sees Bash tool calls in that one client and nothing else; a package named on the line (npm install express, pip install flask, npx, npm create) is judged by its own verdict under this roster, its declared repository riding along. Direct dependencies named on the command line only; transitive dependencies and lockfiles are not resolved. A package added by editing package.json or requirements.txt and installed later is not a line the hook judges. Edit and Write are read for one thing only — an API key about to be saved — checked on the machine and never sent; that guard asks, it never denies. This roster reads what npmjs.org and pypi.org publish about a package — its record, its release history, its declared repository — and never the package's code or what it installs after it. A registry other than those two (a --registry or --index-url on the line) is asked about, not assessed. A package the registry no longer serves is not assessed, never a pass. A PASS means nothing matched on what was read.
npm view NAME time.created
curl -s https://pypi.org/pypi/NAME/json | jq -r '[.releases[][].upload_time] | min'
Why does a new package warn but never block? Because every package was new once. Age is a reason to look, not evidence of anything; the check prints the number of days and leaves the judgement to the reader, and an override records the reason.
How is the first publication date read on PyPI? As the earliest upload time across every release in the project's JSON. PyPI does not publish a separate creation date for the project.
What happens when the npm record is too large to read? The package has a great many versions. The age check is a stated skip rather than a guess, and the package is treated as established only when its name is on the vendored list of the most-used npm packages; otherwise the stricter grades of a new package stand.
P7 Dormant then released · P9 Traction mismatch · C2 Repository age.
Add RepoGates to Chrome Pricing
Sources for this page: the thresholds and weights from the product's own roster and scoring tables.