During testing, I ran a plugin that did exactly one thing: print a few marker lines to its own standard output when a session started. In the next session, opened on the same project, I asked Claude what it knew about that plugin. It recited my marker lines back to me, verbatim. They were nowhere in the code, in no file it could have read - only in a hook's output.
That measurement set a hard rule for the auditor I'm publishing today: whatever a plugin hook prints enters the model's context. Every printed line is paid for in tokens, on every session, in every project that installs the plugin. So deadweight, the auditor in question, says nothing at startup. It measures silently and caches the result outside the repository; what you see is a status line - free, because it runs on your machine and never touches the network.
What "deadweight" means
I've been writing CLAUDE.md files, skills and rules for every project for months now - this site has one, so do the client projects I run. A configuration like that only ever grows: one more rule, one more skill, until nobody can say which part is still earning its place. The word names exactly that: dead weight. Instructions paid for on every turn that nothing reads. A rule whose glob no longer matches a single file. A link to a page that's gone. Two skills quietly fighting over the same request, unnoticed.
Deadweight audits all of it - CLAUDE.md, skills, sub-agents, rules, hooks, settings - in ten families of checks, from what a block of instructions costs to a plain-text secret in a .mcp.json. It says why each finding matters, not just that it exists.
Measured on 600 public repositories
I measured it against public repositories it had never seen: 600 in all, in four samples of 150, no repository reused from one round to the next. On the first, 84 of the 98 errors it reported were wrong or misgraded. Once fixed, the same sample gives 28 errors in 10 repositories, each read by hand, all real. On the last round, 69 of its 82 errors are right on a strict reading (release 0.17.0 in the CHANGELOG, September 27, 2026), under the 9 in 10 set before measuring: the misses are specimens (placeholder links, example files) that a reading rule can only guess at.
Across those 600 repositories it also found 2 literal credentials in committed .mcp.json files; I checked one, and it was a real key. The CHANGELOG records every defect found in the tool itself.
A floor that doesn't slip
--set-floor freezes today's counts; --check-floor fails CI the day they rise. Deadweight's own repository applies this floor to its own code, on every push. So does this site - the floor set here on September 29 reads 0 errors and 0 warnings, visible in the git history of the file that carries it. Here is the audit as it runs on this repository.

A real audit.py run on this site's own repository: 51 check groups, 0 errors, 0 warnings, 0 notices, and the floor at zero.
Install it, try it, read the source
Deadweight is at version 0.20.1, MIT-licensed. It has not reached 1.0 yet. It needs nothing but python3 3.9 or newer, no other dependency, and nothing ever leaves the machine. Installing it is two commands:
claude plugin marketplace add e-xode/deadweight --scope project
claude plugin install deadweight@e-xode --scope projectThe two identifiers read alike and aren't the same thing: e-xode/deadweight is the GitHub repository, deadweight@e-xode is the plugin, taken from the marketplace named e-xode. With --scope project on both, anyone who clones the repository gets them too. Then open a new session (plugins are read at startup) and ask Claude to run deadweight. Installed before 0.16.0 as deadweight@deadweight? It keeps working; the README covers the move to the new name.
The source is public on GitHub, and the product page covers what it checks. Happy to discuss - what it finds on your own setup, or the governance behind it.

Comments (0)