Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Audits dependency supply chains for bad versions, lockfile drift, and artifact integrity. Use when adding deps, handling incidents, or releasing a plugin.
.claude/skills/athola-supply-chain-advisory/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 3% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 25% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 5% | 0% |
Supply chain attacks bypass traditional code review by compromising upstream dependencies. This skill provides patterns for detecting, preventing, and responding to compromised packages in Python ecosystems.
The blocklist is at ${CLAUDE_SKILL_DIR}/known-bad-versions.json. It is consumed by:
versions detected
make supply-chain-scan: CI/local scanning targetjson{ "package_name": [{ "versions": ["x.y.z"], "date": "YYYY-MM-DD", "description": "What the attack did", "indicators": ["files or patterns to search for"], "source": "advisory URL", "severity": "critical|high|medium" }] }
${CLAUDE_SKILL_DIR}/known-bad-versions.json!=x.y.z) to affected pyproject.toml filesdocs/dependency-audit.md under Supply Chain Incidentsmake supply-chain-scan to verify detection worksbash# Scan uv.lock files for a specific compromised version grep -r "package_name.*version" --include="uv.lock" /path/to/projects # Search for malicious artifacts find /path/to/projects -name "suspicious_file.pth" 2>/dev/null # Check installed versions in virtualenvs find /path/to/projects -path "*/.venv/lib/*/PACKAGE*/METADATA" \ -exec grep "^Version:" {} +
uv.lock includes SHA256 hashes for every package. If a package is re-published with different content under the same version, uv sync will fail with a hash mismatch. This is your strongest automatic defense.
| Layer | Tool | Catches | |-------|------|---------| | Lockfile hashes | uv.lock SHA256 | Tampered re-published versions | | Version exclusions | pyproject.toml != | Known-bad versions on fresh resolve | | SessionStart hook | sanctum hook | Per-session warning for compromised deps | | CI scanning | OSV, Safety | CVE database, and advisory matching | | Artifact scanning | make supply-chain-scan | Malicious files (.pth, scripts) |
are the only automatic defense during the attack window
${CLAUDE_SKILL_DIR}/known-bad-versions.json checked againstall lockfiles in scope; any match reported with package name, bad version, severity, and advisory URL
(!=x.y.z) added to the affected pyproject.toml, entry documented in docs/dependency-audit.md, and make supply-chain-scan run to confirm detection works
uv.lock SHA256 hash integrity verified; uv sync failureon hash mismatch surfaces as an explicit supply-chain warning rather than a generic install error
.pthfiles, unexpected scripts) in virtualenv paths before the session proceeds
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-08 | fail→pass | 16,157 | 10,154 | -37% | 1 | 1 | 0% | 2,623 | 2,705 | +3% | 0 | 0 | — |
case-09 | fail→pass | 14,739 | 7,186 | -51% | 1 | 1 | 0% | 2,402 | 2,127 | -11% | 0 | 0 | — |
case-19 | fail→pass | 7,356 | 1,772 | -76% | 1 | 1 | 0% | 1,004 | 1,253 | +25% | 0 | 0 | — |
case-07 | fail→pass | 13,520 | 7,868 | -42% | 1 | 1 | 0% | 2,308 | 2,517 | +9% | 0 | 0 | — |
case-01 | fail→fail | 12,969 | 6,357 | -51% | 1 | 1 | 0% | 2,048 | 1,276 | -38% | 0 | 0 | — |
case-02 | fail→fail | 28,682 | 6,308 | -78% | 1 | 1 | 0% | 6,025 | 1,180 | -80% | 0 | 0 | — |
case-03 | fail→fail | 4,165 | 4,825 | +16% | 1 | 1 | 0% | 234 | 1,248 | +433% | 0 | 0 | — |
case-04 | pass→pass | 18,295 | 13,412 | -27% | 1 | 1 | 0% | 3,124 | 3,306 | +6% | 0 | 0 | — |
case-05 | pass→pass | 13,247 | 9,946 | -25% | 1 | 1 | 0% | 2,585 | 2,856 | +10% | 0 | 0 | — |
case-06 | fail→pass | 18,994 | 13,741 | -28% | 1 | 1 | 0% | 3,118 | 3,283 | +5% | 0 | 0 | — |
case-10 | pass→pass | 9,889 | 3,629 | -63% | 1 | 1 | 0% | 1,563 | 1,570 | +0% | 0 | 0 | — |
case-11 | fail→pass | 10,714 | 5,059 | -53% | 1 | 1 | 0% | 1,945 | 1,897 | -2% | 0 | 0 | — |
case-12 | fail→pass | 10,791 | 4,027 | -63% | 1 | 1 | 0% | 1,968 | 1,790 | -9% | 0 | 0 | — |
case-13 | pass→pass | 8,370 | 6,928 | -17% | 1 | 1 | 0% | 1,620 | 2,269 | +40% | 0 | 0 | — |
case-14 | pass→pass | 7,062 | 4,805 | -32% | 1 | 1 | 0% | 1,290 | 1,786 | +38% | 0 | 0 | — |
case-15 | pass→pass | 21,250 | 16,657 | -22% | 1 | 1 | 0% | 3,412 | 3,638 | +7% | 0 | 0 | — |
case-16 | pass→pass | 13,077 | 4,661 | -64% | 1 | 1 | 0% | 2,025 | 1,741 | -14% | 0 | 0 | — |
case-17 | fail→pass | 12,334 | 4,907 | -60% | 1 | 1 | 0% | 1,950 | 1,827 | -6% | 0 | 0 | — |
case-18 | fail→pass | 9,090 | 3,755 | -59% | 1 | 1 | 0% | 1,428 | 1,705 | +19% | 0 | 0 | — |
case-20 | pass→pass | 5,114 | 3,158 | -38% | 1 | 1 | 0% | 883 | 1,511 | +71% | 0 | 0 | — |
case-21 | fail→pass | 13,261 | 3,343 | -75% | 1 | 1 | 0% | 2,220 | 1,327 | -40% | 0 | 0 | — |
case-22 | fail→pass | 15,809 | 1,719 | -89% | 1 | 1 | 0% | 2,507 | 1,131 | -55% | 0 | 0 | — |
case-23 | pass→pass | 7,232 | 2,568 | -64% | 1 | 1 | 0% | 1,178 | 1,381 | +17% | 0 | 0 | — |
case-24 | fail→pass | 11,877 | 2,318 | -80% | 1 | 1 | 0% | 1,776 | 1,354 | -24% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 21 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +50 percentage points is the difference between those two pass rates over the 21 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.