A comprehensive study of how Claude Code discovers, loads, injects, and manages skills at runtime — from SKILL.md frontmatter to context window budget enforcement.
Skills are reusable prompt templates that extend Claude's capabilities by injecting domain-specific instructions into conversations on-demand. Unlike CLAUDE.md (always loaded), skills use progressive disclosure.
/name)---
name: my-skill
description: "When to use this skill (max 250 chars)"
disable-model-invocation: false
user-invocable: true
allowed-tools: Read, Grep, Glob
model: claude-opus-4-6
effort: high
context: fork
metadata:
priority: 8
pathPatterns: ["app/api/chat/**"]
bashPatterns: ["\\bnpm\\s+install"]
promptSignals:
phrases: ["ai sdk"]
minScore: 6
---
# Markdown instructions here...
Full skill content loaded only on invoke.
Skills use a three-stage loading model to minimize context consumption. Only what's needed is loaded when it's needed.
Names + descriptions of all enabled skills
SLASH_COMMAND_TOOL_CHAR_BUDGET
Controls total budget (default: 1% of context, min 8K chars)
Full SKILL.md body loaded into conversation
PreToolUse: 18KB / 3-5 skills
UserPromptSubmit: 8KB / 2 skills
/name or Claude auto-detectsSupporting files: reference.md, examples.md, scripts/
Two independent paths inject skills at runtime. Each has its own budget, matching logic, and caps.
metadata.priority
.tsx file edits
Skills are tied to the session lifecycle. Once loaded, they persist until the session ends or conversation is compacted.
settings.json → enabledPluginsLIKELY_SKILLS/compact
Summarizes conversation. Dedup resets. Skills can re-inject.
/clear
Clears history. Dedup resets. Descriptions remain loaded.
resume
Full reload same as fresh session. History restored.
settings.jsonMultiple budget mechanisms work together to prevent skills from overwhelming the context window.
SLASH_COMMAND_TOOL_CHAR_BUDGET
export SLASH_COMMAND_TOOL_CHAR_BUDGET=20000
VERCEL_PLUGIN_INJECTION_BUDGET
VERCEL_PLUGIN_PROMPT_INJECTION_BUDGET
/clear
/compact
session end
Inventory of all skill-bearing plugins installed on this machine.
Only ~100 tokens/skill at startup. Full content on-demand saves massive context vs. CLAUDE.md approach.
Once injected, skills persist. /compact is the closest workaround (resets dedup, compresses context).
Plugin enable/disable requires session restart. settings.json is read once at startup.
69 unwanted skills injected from claude.ai with no opt-out mechanism (GitHub #39686).
Per-session tracking prevents skill spam. Resets on /clear and /compact.
Three env vars control description budget, PreToolUse injection, and prompt injection independently.