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-superpowers SessionStart 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:

  1. Hardcoded transitions. brainstorming ends 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.
  2. Written for a weak executor. writing-plans says 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.
  3. 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

ItemEst. tok/session
superpowers (preamble + skill listing)1,918
pr-review-toolkit (6 verbose agent descriptions)2,729
javascript-typescript935
shell-scripting529
tdd-workflows354
feature-dev273
debugging-toolkit200
agent-sdk-dev165
code-simplifier54
finalize skill15
context7 MCP server0 (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 claimedReality
”ruff defaults (100 char line length)“pyproject.tomlline-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 unanchored superpowers/ at .gitignore:99 are 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.
  • context7 was never Nix-managed (manually added to ~/.claude.json); removed via claude mcp remove. Claude Desktop keeps its own separate connector at claude-desktop.nix:132.

Related: Dotfiles Host Profiles via Private Flake