athola/dependency-verification
Verifies a package exists before install, defending against hallucination and slopsquatting. Use when adding, recommending, or installing a package.
npx skills add https://github.com/athola/claude-night-market --skill dependency-verification
> A package name the model produced is a claim, not a fact. The
> registry is the fact. Verify before you install.
Code-generating language models recommend packages that do not
exist at a measured rate of 5.2% (commercial models) to 21.7%
(open models) across 576,000 samples (Spracklen et al. 2024,
arXiv 2406.10279). Worse, 58% of hallucinated names recur across
reruns, so an attacker can predict them, register the empty name,
and ship malware. This is "slopsquatting." A proof-of-concept
package (huggingface-cli) drew over 30,000 downloads after being
registered against a commonly hallucinated name. Package
hallucination is also inversely correlated with coding-benchmark
score, so a better model does not make this go away.
The defense is cheap: confirm the name exists in its registry
before installing or recommending it. This skill defines that
check and is enforced by the guard_package_hallucination.py
PreToolUse hook.
Apply before any of these:
pip install, uv add, npm install, pnpm add,yarn add, cargo add, poetry add, or pdm add.
pyproject.toml, requirements.txt,package.json, or Cargo.toml.
sanctum:version-updates)
leyline:supply-chain-advisory)
A package fails verification on either signal:
a likely hallucination. Do not install it. Search for the
correct name or confirm the package was renamed or removed.
popular package (for example reqeusts versus requests).
This is either a typo or a deliberate impersonation. Confirm
the exact name you intend before proceeding.
A name that is unknown to the bundled popular-package set but
present in the registry passes. A name that cannot be checked
because the registry is unreachable is reported as unverified,
never blocked: the guard does not fail closed on a network error.
Registry existence is the pass/fail check. Real-world usage is a
separate, softer signal that builds confidence on top of it. Once a
package clears the two signals above, cross-checking that it is
actually used by other projects raises your confidence that the name
is the established one rather than a freshly-registered impostor that
happens to exist.
Useful confidence signals, none of them blocking:
(an established package is imported across many repositories).
the package's source.
name registered yesterday is a red flag; a modest name with years
of releases is reassuring).
Treat low usage as a prompt to look closer, never as a reason to
reject on its own. New, niche, internal, and private packages are
legitimately low-usage, so a missing GitHub footprint must not block
an install the registry already confirmed. Use this signal to build
confidence and to disambiguate between two similarly-named packages,
not to gate.
would fetch (strip version specifiers and flags).
registry-checks.md for the
per-ecosystem endpoints and the offline-degradation rule.
name and confirm it is the one you meant.
HTTP status) when the install lands in a PR, per
imbue:proof-of-work.
The guard_package_hallucination.py hook runs this check
automatically on every Bash install command. Shadow mode (warn
only) is the default; set VOW_SHADOW_MODE=0 to block
typosquat and nonexistent installs. Disable the network lookup
with IMBUE_PKG_REGISTRY_CHECK=0 to rely on the offline
typosquat signal alone. The hook is a backstop, not a substitute:
verify deliberately when you add a dependency rather than waiting
for the gate.
imbue:proof-of-work: capture the registry check as evidence.leyline:supply-chain-advisory: broader dependency supply-chainauditing (lockfile drift, artifact integrity, bad versions).
confirmed present in its registry, or the install is
abandoned.
and confirmed before install.
unverified and not silently installed.
proof-of-work evidence.
Take athola/dependency-verification from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference pip, npm, yarn, pnpm.
Without those the skill loads but fails at the first command.