Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Identifies dependencies at heightened risk of exploitation or takeover. Use when assessing supply chain attack surface, evaluating dependency health, or scoping security engagements.
.claude/skills/trailofbits-supply-chain-risk-auditor/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 29% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 800% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 1% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 45% | 0% |
Generates a supply-chain risk report for a project's direct dependencies (npm, PyPI, Go), plus an advisory sweep of everything its lockfile resolves. Two deterministic scripts do the measuring; your job is the judgment they refuse to automate.
Every figure in this report is a claim about somebody else's project, and hand-collected figures were measured wrong before this skill was rebuilt around scripts: GitHub contributor counts said five-plus people maintain lodash where npm's ACL says one, and gh saw zero downloads for a package that moves 164 million a week. Do not estimate maintainer counts, downloads, staleness, or CVE history from gh, web search, or memory — run the collector, and quote what it measured.
The scripts enforce two rules worth knowing before you read their output:
assessed-clean, assessed-flagged, or unassessable-with-a-reason.
non-zero instead of printing a report that finds nothing.
package.json, pyproject.toml,requirements*.txt, or go.mod. If none exist, say so and stop — do not audit an ecosystem this collector does not parse by hand. Lockfiles read for exact versions and the transitive sweep: package-lock.json/npm-shrinkwrap.json, uv.lock, and a go 1.17+ go.mod. yarn.lock, pnpm-lock.yaml, and poetry.lock are not read — the report says so when they are present, and versions fall back to pins or the latest release.
gh auth status. Unauthenticated GitHub allows 60 requests/hour against 5,000,and the collector makes several per dependency; expect repository criteria to come back unassessable without it. Say so rather than fixing it silently.
asked otherwise:
sh uv run {baseDir}/scripts/collect.py <project-dir> --json <out-dir>/findings.json uv run {baseDir}/scripts/render.py <out-dir>/findings.json --out <out-dir>/report.md
Expect a few minutes for ~50 dependencies — several HTTP requests per dependency, more with many Go modules, and slower without authenticated gh. If collect.py exits non-zero, it is refusing to report — relay its message verbatim instead of retrying or working around it.
report.md and findings.json. The report is the deliverable; the JSON carriesthe datum behind every verdict when you need to cite one.
version away.
exists in the registry before naming it, and label these as judgment, not measurement.
npm ci --ignore-scripts is viable for thisproject's build.
Write added prose the way a security report reads, and apply the same register to the report addendum and the final reply alike — replies get pasted into tickets and reports verbatim. State the finding, the datum behind it, and the action.
should upgrade"), no contractions, no exclamation points.
25 advisories", not "it is recommended that axios be upgraded".
"fortunately"), and no guesses about why the project chose what it chose.
future for the consequences of acting or not.
If the report-writing:writing-style skill is available in the session, follow it — it is the full version of this register.
The rendered report carries facts only. The interpretive rules below are instructions to you, not content for the reader — do not copy them into the deliverable as caveats or framing.
those rows say what could not be known, not what is wrong.
assessed" — check the assessed count before repeating a clean verdict.
numbers; every one is reproducible from the artifact.
measured against these criteria only.
gh can give me maintainer counts faster than the collector." Measured wrong — repocontributors and registry publish rights are different populations.
half the criteria are structurally unassessable.
boundary of every claim in the report. Dropping them turns partial coverage into a clean bill of health, which is the failure this skill was rebuilt to prevent.
lockfile-resolved version are different claims; the report labels which one it makes. Keep the label.
reads dependency source, only registry, advisory, and repository metadata.
nothing more than the dependency list — manifests and lockfiles — and never installs, builds, or executes anything. Broken installs and import-time breakage are out of scope, and worth saying so if the user seems to expect them.
improvising an audit for it.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 4,958 | 6,838 | +38% | 1 | 1 | 0% | 266 | 1,884 | +608% | 0 | 0 | — |
case-02 | fail→fail | 30,209 | 11,060 | -63% | 1 | 1 | 0% | 2,423 | 1,914 | -21% | 0 | 0 | — |
case-03 | fail→fail | 20,795 | 5,484 | -74% | 1 | 1 | 0% | 3,511 | 1,785 | -49% | 0 | 0 | — |
case-04 | fail→pass | 17,973 | 4,653 | -74% | 1 | 1 | 0% | 1,826 | 2,347 | +29% | 0 | 0 | — |
case-05 | fail→pass | 11,471 | 3,058 | -73% | 1 | 1 | 0% | 2,069 | 1,992 | -4% | 0 | 0 | — |
case-06 | pass→pass | 6,438 | 7,002 | +9% | 1 | 1 | 0% | 564 | 2,241 | +297% | 0 | 0 | — |
case-07 | fail→pass | 3,170 | 6,745 | +113% | 1 | 1 | 0% | 278 | 2,503 | +800% | 0 | 0 | — |
case-08 | fail→pass | 15,392 | 5,171 | -66% | 1 | 1 | 0% | 2,436 | 2,469 | +1% | 0 | 0 | — |
case-09 | fail→fail | 11,289 | 11,215 | -1% | 1 | 1 | 0% | 1,841 | 1,768 | -4% | 0 | 0 | — |
case-10 | pass→pass | 5,064 | 5,785 | +14% | 1 | 1 | 0% | 755 | 2,527 | +235% | 0 | 0 | — |
case-11 | pass→pass | 12,707 | 5,299 | -58% | 1 | 1 | 0% | 1,814 | 2,406 | +33% | 0 | 0 | — |
case-12 | fail→fail | 13,338 | 8,464 | -37% | 1 | 1 | 0% | 1,921 | 2,774 | +44% | 0 | 0 | — |
case-13 | pass→pass | 11,865 | 4,609 | -61% | 1 | 1 | 0% | 1,644 | 2,326 | +41% | 0 | 0 | — |
case-14 | pass→pass | 12,435 | 6,704 | -46% | 1 | 1 | 0% | 1,863 | 2,589 | +39% | 0 | 0 | — |
case-15 | fail→pass | 9,651 | 3,276 | -66% | 1 | 1 | 0% | 1,477 | 2,139 | +45% | 0 | 0 | — |
case-16 | pass→pass | 7,361 | 2,603 | -65% | 1 | 1 | 0% | 1,080 | 1,955 | +81% | 0 | 0 | — |
case-17 | fail→pass | 7,577 | 1,696 | -78% | 1 | 1 | 0% | 1,042 | 1,759 | +69% | 0 | 0 | — |
case-18 | pass→pass | 5,026 | 5,634 | +12% | 1 | 1 | 0% | 779 | 2,395 | +207% | 0 | 0 | — |
case-19 | pass→pass | 5,279 | 2,670 | -49% | 1 | 1 | 0% | 882 | 1,891 | +114% | 0 | 0 | — |
case-20 | pass→pass | 9,617 | 2,178 | -77% | 1 | 1 | 0% | 1,585 | 1,872 | +18% | 0 | 0 | — |
case-21 | pass→pass | 12,323 | 6,002 | -51% | 1 | 1 | 0% | 1,802 | 2,403 | +33% | 0 | 0 | — |
case-22 | fail→pass | 8,914 | 2,609 | -71% | 1 | 1 | 0% | 1,477 | 1,932 | +31% | 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. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 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 +32 percentage points is the difference between those two pass rates over the 18 comparable cases. 1 case got worse with the skill loaded, and it is 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.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/7/2026 | +23% |
Other measured skills in the registry, with their headline benchmark lift.