<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Package Rating]]></title><description><![CDATA[Package Rating]]></description><link>https://packagerating.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6a8e272345863ab1d73e5393/1397f07b-eba1-4709-8c53-e9f815af219d.png</url><title>Package Rating</title><link>https://packagerating.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 02:20:44 GMT</lastBuildDate><atom:link href="https://packagerating.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Your AI agent doesn't read READMEs — we scored 95,000 packages to see what it's installing anyway]]></title><description><![CDATA[By Marcelo, builder of Package Rating
Over the past few months I've been crawling npm, PyPI, crates.io, and RubyGems — pulling real GitHub activity, dependency health, and known vulnerability data for]]></description><link>https://packagerating.hashnode.dev/your-ai-agent-doesn-t-read-readmes-we-scored-95-000-packages-to-see-what-it-s-installing-anyway</link><guid isPermaLink="true">https://packagerating.hashnode.dev/your-ai-agent-doesn-t-read-readmes-we-scored-95-000-packages-to-see-what-it-s-installing-anyway</guid><category><![CDATA[Open Source]]></category><category><![CDATA[AI]]></category><category><![CDATA[Security]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Marcelo]]></dc:creator><pubDate>Tue, 25 Aug 2026 23:46:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a8e272345863ab1d73e5393/9aadb3ac-82ab-4e65-81d0-7a0fb64f7253.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>By Marcelo, builder of</em> <a href="https://packagerating.com"><em>Package Rating</em></a></p>
<p>Over the past few months I've been crawling npm, PyPI, crates.io, and RubyGems — pulling real GitHub activity, dependency health, and known vulnerability data for every package I can find — and scoring each one on a 0-100 scale. The goal was simple: before you <code>npm install</code> something, you should be able to see, in one number, whether it's actually worth trusting.</p>
<p>95,338 packages in, here's what the data actually shows.</p>
<h2>Almost nothing scores well</h2>
<table>
<thead>
<tr>
<th>Band</th>
<th>Packages</th>
<th>Share</th>
</tr>
</thead>
<tbody><tr>
<td>Excellent (90–100)</td>
<td>34</td>
<td>0.04%</td>
</tr>
<tr>
<td>Good (70–89)</td>
<td>1,893</td>
<td>2.0%</td>
</tr>
<tr>
<td>Fair (50–69)</td>
<td>49,707</td>
<td>52.1%</td>
</tr>
<tr>
<td>Poor (25–49)</td>
<td>43,717</td>
<td>45.8%</td>
</tr>
<tr>
<td>Critical (0–24)</td>
<td>36</td>
<td>0.04%</td>
</tr>
</tbody></table>
<p>Almost half the open-source ecosystem sits in "Poor." Barely 2% clears "Good." This isn't a judgment on any individual maintainer — most of these projects are unpaid, unfunded, and doing fine by the standards their authors set for themselves. But it does mean the median package you depend on is, by objective signals (maintenance activity, dependency health, versioning discipline, known vulnerabilities), mediocre — not because open source is bad, but because most of it was never resourced to be excellent.</p>
<h2>Popularity doesn't buy you much safety</h2>
<p>I expected the most-downloaded packages to score meaningfully better than obscure ones — more users, more scrutiny, more pressure to keep things solid. The data doesn't really back that up:</p>
<table>
<thead>
<tr>
<th>Weekly downloads</th>
<th>Avg. score</th>
<th>Sample size</th>
</tr>
</thead>
<tbody><tr>
<td>&gt;1M</td>
<td>54.6</td>
<td>11,148</td>
</tr>
<tr>
<td>100k–1M</td>
<td>54.3</td>
<td>9,983</td>
</tr>
<tr>
<td>10k–100k</td>
<td>52.6</td>
<td>11,610</td>
</tr>
<tr>
<td>&lt;10k</td>
<td>48.4</td>
<td>62,646</td>
</tr>
</tbody></table>
<p>A 6-point spread on a 100-point scale, between the most- and least-downloaded tiers. Heavy usage correlates with <em>slightly</em> better scores, not dramatically better ones. The package with 40 million weekly downloads sitting in your <code>node_modules</code> right now is not obviously safer than one with 4,000 — you have to actually check.</p>
<h2>412 popular packages carry a known critical vulnerability right now</h2>
<p>This is the number that should make you go check your own lockfile. Across the packages we've scored, 412 currently carry at least one <strong>critical</strong>-severity finding, and another 942 carry a <strong>high</strong>-severity one — not hypothetical risk, but flagged, known issues in versions people are installing today. Some examples, picked from packages with over 100 million weekly downloads:</p>
<ul>
<li><p><code>pyyaml</code> — 279M weekly downloads, 4 critical findings, score 33.5</p>
</li>
<li><p><code>litellm</code> — 190M weekly downloads, 6 critical / 17 high findings, score 56.3</p>
</li>
<li><p><code>pillow</code> — 125M weekly downloads, 10 critical / 50 high findings, score 38</p>
</li>
<li><p><code>numpy</code> — 260M weekly downloads, 1 critical / 4 high findings, score 38</p>
</li>
<li><p><code>js-yaml</code> — 279M weekly downloads, 1 critical / 3 high findings, score 37.5</p>
</li>
</ul>
<p>None of these are obscure. All five are foundational, near-universal dependencies across their respective ecosystems — the kind of package nobody thinks to double-check because "everyone uses it." That's exactly the assumption worth re-examining.</p>
<h2>Your AI agent doesn't read READMEs</h2>
<p>Here's the part that changes the calculus on all of the above: a growing share of the packages landing in <code>package.json</code> and <code>requirements.txt</code> today were never chosen by a person. An AI coding agent hit a missing-import error, picked the first plausible package, and installed it — no README, no GitHub tab, no "huh, last commit was three years ago" gut check. That gut check was never a great safety net to begin with, but at least it existed. For agent-driven installs, it usually doesn't.</p>
<p>That's not a hypothetical shift — it's already how a lot of code gets written. And it means the 412-critical-finding numbers above aren't just a "read more carefully" problem anymore; they're a "the thing choosing your dependencies can't read at all" problem. The fix isn't asking agents to be more careful — it's giving the <em>build</em> a signal an agent (or its CI pipeline) can act on without human judgment in the loop. That's the actual reason we built this as a score and an API, not a blog post: <a href="https://github.com/marketplace/actions/audit-dependencies"><code>audit-dependencies</code></a> can fail a build the moment an agent adds something with a critical finding, before it ever reaches a PR a human skims and approves.</p>
<h2>Check yours</h2>
<p>Every score above comes from data anyone can pull for free: <a href="https://packagerating.com">packagerating.com</a> scores any npm, PyPI, crates.io, or RubyGems package on demand, and the <a href="https://github.com/marketplace/actions/audit-dependencies"><code>audit-dependencies</code> GitHub Action</a> drops the same scoring straight into your CI, with an optional threshold gate if you want your build to fail on packages below a bar you set.</p>
<p>I'll be publishing this as a recurring monthly report as the dataset grows — if there's a specific ecosystem or angle (governance/compliance, a particular language, "most improved" packages) you'd want to see next, reply and let me know.</p>
<hr />
<p><em>Methodology note: scores are computed from six weighted signals — liveness (recent commit activity), community health, dependency risk, known-vulnerability findings, versioning discipline, and general dependency hygiene. Full breakdown at</em> <a href="https://packagerating.com/github-action"><em>packagerating.com/github-action</em></a><em>. Figures in this post reflect the catalog as of August 2026; the "abandoned popular packages" angle we originally scoped for this piece is being held back for a follow-up — a recent bug-fix recrawl of a subset of the catalog is still working through GitHub's API rate limits, and we didn't want to publish maintenance-activity claims about specific packages before that backlog fully clears.</em></p>
]]></content:encoded></item></channel></rss>