Full skill list re-injected on every tool call — token bloat, performance, cognitive load

Resolved 💬 3 comments Opened Apr 30, 2026 by doublefx Closed May 31, 2026

Summary

When skills are loaded in a session, the full skill catalog (description + name + trigger conditions for every available skill) appears to be re-injected as a <system-reminder> on most tool-call results — not just once at session start. On a session with ~32 skills loaded, this is roughly 5k tokens per re-injection.

Concrete data point from a single session:

  • Session total: 249,000 tokens
  • Skill list re-injections observed: ~13+
  • Estimated token cost from re-injection alone: ~65,000 tokens (~26% of total session tokens)

The same harness behaviour likely applies to any other invariant session-scoped content (rules, system reminders, configurations) that the harness re-asserts after every tool call. Skills are the most visible offender because the catalog itself is large.

This is a multi-faceted issue, not just a token cost:

1. Behavioural / correctness

The model's behaviour shifts subtly: every tool call now competes for attention with a re-asserted "here are all the skills you could be using". This biases the model toward second-guessing its current trajectory ("should I have used a skill instead?") at points where the sensible answer is just "continue the work". It also amplifies a confirmation bias — re-stated instructions feel authoritative even when they're stale relative to the current task.

2. Performance / latency

Every re-injection extends the request payload sent to the model. On long sessions, the cumulative latency adds up: 13× re-injections of 5k tokens = ~65k tokens of additional input that has to be tokenised, hashed, cached, and billed on every subsequent turn.

3. Cognitive load (model side)

The model has to repeatedly skim a list of names + descriptions that haven't changed since the last time it read them. The actual user content (their last message, the file diffs, the test output) gets diluted in a sea of static boilerplate. This is the same anti-pattern that makes very-long context-windows degrade reasoning quality.

4. Token / usage cost (user side)

The skill list re-inject is invisible to the user but counted against input-token quota and billed. In the observed session, ~26% of total token spend was attributable to repeated skill-list injection alone — content the user did not ask for and the model already had.

Reproduction

Any session that loads the full skill catalog (e.g., one with multiple plugins installed: claude-mem, atlassian-cli, context-mode, etc., plus the default skills) and then makes more than a handful of tool calls. A <system-reminder> containing the full skill catalog appears between consecutive tool results, repeatedly through the session.

Suggested fix

The skill catalog is invariant within a session. Inject it once at session start (or when the catalog actually changes via plugin install / uninstall), not after every tool call. If a periodic nudge toward proactive skill use is desired, inject a much smaller stub ("N skills available — open the skills picker if needed") instead of the full catalog.

Apply the same principle to other invariant session-scoped content the harness currently re-asserts on every tool call.

Environment

  • Claude Code session, Opus 4.7 (1M context)
  • ~32 skills loaded across multiple plugins
  • Long working session (~249k tokens total, multi-hour)

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗