{"slug": "my-claude-code-config-costs-9857-tokens-before-i-type-anything", "title": "My Claude Code config costs 9,857 tokens before I type anything", "summary": "A developer measured the token cost of their Claude Code configuration and found that 107 skills, 38 agents, and 15 commands consume 9,857 tokens in every session before any input is typed. The developer created a script called 'cc-tax' to estimate this overhead, highlighting that skill descriptions are always loaded into the context window, even if the skill is rarely used. The heaviest skill, 'continuous-learning-v2', costs 56,453 tokens per trigger, and the developer notes that this 'tax' reduces available context for actual work.", "body_md": "I installed 107 skills, 38 agents and 15 commands into Claude Code over a few months. Standard stuff — you see a skill recommended somewhere, it looks useful, you drop it in. Nobody ever tells you to take one out.\n\nLast week I finally measured what that pile costs. The answer is 9,857 tokens, and I pay it on every single session before I type a character.\n\nHere is how to check yours.\n\nA skill's **body** loads when the skill triggers. That cost is visible and roughly fair — you asked for the skill, you pay for the skill.\n\nA skill's **description** is different. Every description of every installed skill, agent and command sits in the context window for the whole session, whether or not the thing ever fires. It has to: that is how the model decides what is available.\n\nThat is not a load cost. That is rent, and you pay it forever.\n\nStandard library only, one file, short enough to read before you run it against your home directory — which is the only sane way to run a stranger's script:\n\n``` bash\n#!/usr/bin/env python3\n\"\"\"cc-tax — what your Claude Code config costs before you type anything.\"\"\"\nimport pathlib, re, sys\n\nCHARS_PER_TOKEN = 4\nDESC_RE = re.compile(r\"^description:[ \\t]*(.*?)(?=^[A-Za-z_][\\w-]*:|\\Z)\", re.S | re.M)\nFRONTMATTER_RE = re.compile(r\"\\A---\\r?\\n(.*?)\\r?\\n---\", re.S)\nBLOCK_MARKER_RE = re.compile(r\"\\A[>|][+-]?\\d*\\s*\")\n\ndef extract_description(text):\n    fm = FRONTMATTER_RE.search(text)\n    if not fm:\n        return \"\"\n    found = DESC_RE.search(fm.group(1))\n    if not found:\n        return \"\"\n    return BLOCK_MARKER_RE.sub(\"\", found.group(1).strip()).strip().strip(\"\\\"'\").strip()\n\ndef scan(root):\n    sources = (\n        (\"skill\", sorted(root.glob(\"skills/*/SKILL.md\")), lambda p: p.parent.name),\n        (\"agent\", sorted(root.glob(\"agents/*.md\")), lambda p: p.stem),\n        (\"command\", sorted(root.glob(\"commands/*.md\")), lambda p: p.stem),\n    )\n    return [(kind, name_of(p), len(extract_description(p.read_text(errors=\"ignore\"))) / CHARS_PER_TOKEN)\n            for kind, paths, name_of in sources for p in paths]\n\nroot = pathlib.Path(sys.argv[1]).expanduser() if sys.argv[1:] else pathlib.Path.home() / \".claude\"\nrows = scan(root)\ntotal = sum(r[2] for r in rows)\nfor kind in (\"skill\", \"agent\", \"command\"):\n    group = [r for r in rows if r[0] == kind]\n    print(f\"{kind + 's':<10}{len(group):>5}{sum(r[2] for r in group):>10,.0f}\")\nprint(f\"{'TOTAL':<10}{len(rows):>5}{total:>10,.0f}\")\nfor kind, name, cost in sorted(rows, key=lambda r: r[2], reverse=True)[:10]:\n    print(f\"  {cost:>5,.0f}  {name} ({kind})\")\n```\n\nTokens are estimated as characters ÷ 4, the usual rule of thumb. A real tokenizer moves the absolute numbers a few percent and changes no ranking, which is why it is not worth a dependency.\n\n```\nskills      107     7,470\nagents       38     1,999\ncommands     15       388\nTOTAL       160     9,857\n```\n\nAbout 5% of a 200k window, gone before anything happens.\n\nI want to be honest about that number rather than dress it up: 5% is not a catastrophe. The problem is not the size, it is the ratio. **I pay it 100% of the time for components I trigger maybe 2% of the time.** And it does not sit there alone — it stacks with the system prompt, tool definitions, every MCP server's tool schemas, your `CLAUDE.md`\n\n, and the actual files you need to read. The tax is not what breaks you. It is what leaves you with less room than you thought when something else does.\n\nThe ten heaviest descriptions in my install:\n\n```\n  244  loop-design-check (skill)\n  209  token-budget-advisor (skill)\n  184  prompt-optimizer (skill)\n  141  intent-driven-development (skill)\n  118  agent-architecture-audit (skill)\n```\n\nSecond place is `token-budget-advisor`\n\n— a skill whose entire purpose is helping me spend fewer tokens. It costs 209 tokens of permanent rent to offer to save me some.\n\nBody weight is even more lopsided. Total across 107 skills is ~322,990 tokens, median 1,932. The heaviest single skill is `continuous-learning-v2`\n\nat **56,453 tokens per trigger** — 29× the median, more than a quarter of the context window in one shot.\n\nThat one is also, as it turns out, half broken.\n\nOnce I started actually running the components instead of reading about them, a pattern showed up:\n\n`continuous-learning-v2`\n\n`delivery-gate`\n\n, `gateguard`\n\n, `safety-guard`\n\n`settings.json`\n\n. They advertise automatic enforcement. What you actually installed is documentation.`ck`\n\n`session-start.mjs`\n\nhook is not wired up, so the cross-session memory never loads itself.`deep-research`\n\nThe generalisable version: **a skill that depends on an MCP server or a hook is not a skill you installed. It is a skill you started installing.** The file lands, the description starts billing immediately, and the functionality shows up only after a second setup step nothing reminds you to do. There is no error. The skill just fires and underperforms, and you conclude the model is having an off day.\n\nOne more number that reframes what a \"skill\" even is: of my 107 skills, **11 ship any file other than SKILL.md**. The other 96 are pure prose. That is not automatically bad — a well-aimed paragraph steers a model better than most code. But it means the real question about the next skill someone recommends is not \"is this good?\" It is:\n\nFor most skills in most social feeds, it is not.\n\nMeasured, then deleted anything I had not triggered in a month. Takes ten minutes and it is most of the value in this whole exercise, which is why the script above is the whole script and not a teaser.\n\nIf it is useful to you, the file is on GitHub: [Aliwers/cc-tax](https://github.com/Aliwers/cc-tax), MIT.\n\nI also wrote up the longer version — the full breakdown of which components are dead on arrival, how I cut a 284-skill pack down to 104 and the criteria I used, the rules-library trap that costs zero tokens and does nothing until deployed right, and the symlink setup for running one config across two machines without breaking anyone else's settings. That one is [$5 here](https://amzotec.gumroad.com/l/token-tax), and it exists because I am running a 48-hour challenge to build something small and make exactly one sale. This post is not a teaser for it — everything above is the actual finding.\n\nGo measure yours. I would genuinely like to know if anyone beats 9,857.", "url": "https://wpnews.pro/news/my-claude-code-config-costs-9857-tokens-before-i-type-anything", "canonical_source": "https://dev.to/amzotec/my-claude-code-config-costs-9857-tokens-before-i-type-anything-3gin", "published_at": "2026-08-30 01:08:07+00:00", "updated_at": "2026-08-30 01:52:13.538552+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools", "large-language-models"], "entities": ["Claude Code", "Anthropic"], "alternates": {"html": "https://wpnews.pro/news/my-claude-code-config-costs-9857-tokens-before-i-type-anything", "markdown": "https://wpnews.pro/news/my-claude-code-config-costs-9857-tokens-before-i-type-anything.md", "text": "https://wpnews.pro/news/my-claude-code-config-costs-9857-tokens-before-i-type-anything.txt", "jsonld": "https://wpnews.pro/news/my-claude-code-config-costs-9857-tokens-before-i-type-anything.jsonld"}}