Claude Code Context Audit: Cutting Superpowers and 8 Plugins
Ran /doctor over the Claude Code setup, then worked through the findings. Install health, version currency, hooks, and permission posture were all clean. The whole finding was extension bloat: ~7.2k est tokens/session of always-resident context from plugins with 0-1 dispatches since install.
The methodological correction that drove everything
My first verdict on superpowers was “keep — 321 lifetime dispatches, second-most-used plugin.” That reasoning was circular and the correction came from the other side of the conversation: superpowers ships a SessionStart hook that mandates skill invocation at a 1% relevance threshold. Dispatch counts under a mandate measure compliance, not value. Usage data is not evidence when the thing being measured also authors the instruction to do it.
Re-assessed against the Claude 5 context-engineering guide instead of usage. The plugin splits cleanly in two:
- 14 skills (563 est tok) — lazily loaded, one-line triggering descriptions. Exemplary progressive disclosure.
using-superpowersSessionStart injection (1,355 est tok) — fails every principle in the guide: always-resident, maximal mandatory framing (“YOU DO NOT HAVE A CHOICE”), forces invocation, ships a 12-row table of forbidden thoughts (the guide: “giving examples actually constrains them to a certain exploration space”), and is a 1.4k addition to a system prompt Anthropic themselves cut by 80%+ with no measurable loss.
Why the workflow didn’t compose
Separately diagnosed why the brainstorm → spec → plan → implement chain felt manual:
- Hardcoded transitions.
brainstormingends with “Do NOT invoke any other skill. writing-plans is the next step.” A state machine with fixed edges — a two-file change gets the same ceremony as a subsystem rewrite. - Written for a weak executor.
writing-planssays to assume “the engineer has zero context for our codebase and questionable taste.” That forces exhaustive plan docs before any code, and it’s precisely the assumption the guide retires. - Markdown on disk is the only channel between phases. Prose can’t be verified, so each phase re-derives intent by re-reading it.
The guide’s counter-direction: “a spec may also be a detailed test suite.” An executable spec composes automatically — handoff needs no prose fidelity and “done” is green rather than a reviewer’s judgment.
Ended up removing superpowers entirely (user didn’t want brainstorming either, which was the piece I’d argued to keep).
What was removed
| Item | Est. tok/session |
|---|---|
| superpowers (preamble + skill listing) | 1,918 |
| pr-review-toolkit (6 verbose agent descriptions) | 2,729 |
| javascript-typescript | 935 |
| shell-scripting | 529 |
| tdd-workflows | 354 |
| feature-dev | 273 |
| debugging-toolkit | 200 |
| agent-sdk-dev | 165 |
| code-simplifier | 54 |
| finalize skill | 15 |
| context7 MCP server | 0 (deferred) |
| Total | ~7,172 |
Enabled plugins: 21 → 12.
Dependency chain worth remembering
finalize (28 uses, dormant 85 days) hard-throwed at eval time if either superpowers or tdd-workflows was disabled — so one dead skill was pinning two plugins and would have failed hm switch outright, not degraded. Removing it first unblocked everything else. Its constituent skills (commit 318 uses, comments 31) are used constantly; only the orchestrator went quiet.
Nested AGENTS.md audit (same session)
Checked the nine CLAUDE.md/AGENTS.md files in the repo. The two Python-script ones (claude-ops, gh-review-preview) were 106 lines each and 96% identical — cookiecutter output differing in 4 lines, including an unfilled [Document key architectural decisions here] placeholder.
Three claims in both were factually wrong, verified against the projects rather than eyeballed:
| Doc claimed | Reality |
|---|---|
| ”ruff defaults (100 char line length)“ | pyproject.toml → line-length = 88 |
| ”NumPy style docstrings” | no ruff convention configured — unenforced |
| 19 lines of @claude/@gemini-cli GitHub Actions | .github/workflows/ doesn’t exist in either project |
The line-length one is the dangerous shape: a session working in that directory formats to 100, ruff reformats to 88. Derivable-but-stale is worse than absent.
Trimmed both to 16 lines. Only two things survived verification as non-derivable and unenforced: type hints on public APIs, and the >90% coverage target (no fail_under set anywhere). Two I’d expected to keep didn’t survive: conventional commits is enforced by pre-commit, and TDD is already in the always-loaded global CLAUDE.md. The kept text records why the file is thin and names the three rot points — otherwise the next reader helpfully repopulates it.
nvim/AGENTS.md (28 lines) is the model: a baseline → fix → verify protocol, zero derivable content, pointers to DEBUG.md/KEYMAPS.md for detail.
Also noticed common/context/AGENTS.md double-loads — it’s the source deployed to ~/.claude/CLAUDE.md (always loaded everywhere) and loads again as nested context when working in its own directory.
Loose ends
docs/superpowers/and the unanchoredsuperpowers/at.gitignore:99are now vestigial. Two ADRs (0002, 0017) cite spec files under that path which the gitignore may have prevented ever being committed. See reference_gitignore_unanchored_patterns.- Three completed plan docs under
claude-ops/docs/plans/open with “REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development” — now unfollowable. context7was never Nix-managed (manually added to~/.claude.json); removed viaclaude mcp remove. Claude Desktop keeps its own separate connector atclaude-desktop.nix:132.