Running agents

The install tax: your agents are paying for skills they never use

I opened a new session today. The instruction file it used to load was 748,980 tokens. We cut that to about 5,500. Then I counted 84 skill descriptions still bidding to fire.

17 August 2026 ยท written by the team behind freeapp.ai

I opened a new agent session today.

The instruction file it used to load was 748,980 tokens. We cut that to about 5,500.

Then I counted the skill descriptions still sitting in the prompt, bidding to fire without being asked. 84 of them. I was not doing Android migrations, Figma, or game tilesets. They still bid.

I have a name for this now: the install tax.

The install tax. Every session used to pay 2,995,922 bytes, about 748,980 tokens, loaded whether the work needed it or not. We replaced the dump with a map. Agents open one file. The map is 22,138 bytes, about 5,500 tokens, same 679 notes. A catalog of 610 public skills, installed from that list: zero. This session still carried 84 skill descriptions bidding to fire unasked. Only auto-trigger needs the prompt. Under 10 belong in that cell.
Same knowledge. The long tail is a path, not a resident.

The sort, about ten minutes

Run this on your own box. It is the whole point of the article, so take it and skip the rest if you are busy.

The two-question sort. Ask both, they are independent. Fire unasked is the only question that costs prompt tokens. Own copy is a folder in git, or follow theirs. Four cells, only one should be resident. No and no: read it when you name it, 0 tokens, the 610. No and yes: keep a copy, invoke by name, working set of 10 to 30. Yes and no: follow theirs, no local copy, provider stays current. Yes and yes: yours and firing, under 10, ours is 5. Do not install to try it out. A one-off pays the same standing tax as a daily playbook.
The sort as a card. Save this one and skip the rest of the page.

Two questions, asked of every skill you have installed:

  1. Should it fire without being asked?
  2. Do I want my own copy?

Under 10 belong there. On my box, five do.

# How many skill descriptions sit in every session?
find ~/.claude/skills ~/.claude/plugins -name SKILL.md 2>/dev/null | wc -l

# How fat is the file that loads whether you need it or not?
wc -c AGENTS.md CLAUDE.md

# Which descriptions are bids, not descriptions?
# A one-line when-to-use is a description. A paragraph of trigger law is a bid.
python3 - <<'PY'
from pathlib import Path
import re
for p in Path.home().joinpath(".claude/skills").rglob("SKILL.md"):
    t = p.read_text(errors="replace")
    desc = ""
    if t.startswith("---"):
        fm = t.split("---", 2)[1]
        m = re.search(r"^description:\s*[>|]?\s*(.*?)(?=\n[a-zA-Z0-9_-]+:|\Z)", fm, re.S|re.M)
        if m:
            desc = re.sub(r"\s+", " ", m.group(1)).strip()
    if len(desc) > 280:
        print(f"{len(desc):4}  {p.parent.name}")
PY

Three numbers come out: how many are resident, how fat the always-on file is, and which descriptions have stopped describing and started bidding.

The rest of this is why each line is there.

1. A map is not a dump

On August 16 I measured AGENTS.md. 2,995,922 bytes. About 748,980 tokens. It loaded at the start of every session, for every agent on the box, whether the work needed any of it or not.

The file was a full copy of 668 memory notes. The original reason was honest. Other agents on the machine had no memory system of their own. The only way to give them the same knowledge was to paste everything into one file they would actually read.

That reason aged badly. The corpus grew. The tax did not stay still. Every new lesson made every future session slower, for work that would never open that lesson.

We replaced the dump with a map. Same notes, one index. Agents open the file they need. The map is 22,138 bytes. About 5,500 tokens.

The trigger: you are about to add another always-on instruction file. Or you notice the one you have has become a folder with a different extension.

The rule: an index plus a path is knowledge. A concatenation is a tax. If the agent can open one file, it does not need all of them in the prompt.

2. Do not install to try it out

A month earlier I reviewed the public skill repos I had starred. The harvest was 610 distinct skills. Marketing, extra Android, observability, SEO, the usual pile.

I put them in a catalog I can search. I can open any one of them. Installed from that list: zero.

That was not taste. It was arithmetic. Each install puts a description into every future session. Trying a skill once would have cost the same standing price as a playbook I run every day. Under an install-only lifecycle the long tail has no cheaper path. The rational move is not to bother. Most of the corpus goes unread.

A description is supposed to say when to read the file. The long ones on my box do not do that. build-mobile-app is 1,341 characters of trigger and skip law. build-webpage is 1,134. archon is 1,076. Those are bids for a scarce slot, written because a miss is silent and the author never finds out the skill was there.

The trigger: you are about to install a skill, a plugin, or a bundle so it will be “available”.

The rule: search, then open, then decide. Availability is a path. Installation is a decision to pay rent.

3. Count the ones that fire unasked

The 5,500-token map fixed the dump. It did not fix the skills.

This session still carried about 84 descriptions. 33 I installed myself. 14 from a methods plugin I actually use. 12 from Figma, which I was not using. 22 bundled by the harness, including five game-asset skills and three “resume another vendor” skills.

I classified the 33. Five earn the right to fire without being named. A delete-first gate, a secrets rule, the outward-send path, and two checks that have to run before a build starts. Nineteen are a working set I want on disk and will name when I need them. Nine are migrations and integrations I reach for a few times a year.

The other fifty-one were never a decision. They arrived because a plugin was on, or because the harness ships a bundle.

The trigger: you open a new session and start working. Before the first tool call, ask which of the resident names you could not list from memory.

The rule: fire-without-being-asked is the only thing that earns prompt space. Everything else is a named path. If you cannot name it, it should not be bidding.

What is actually worth keeping

A repo called reverse-skill went up on May 13. As I write this it has 25,881 stars and 3,507 forks. Ninety-six days. MIT. GitHub lists the primary language as PowerShell.

Open it and you do not find a model, an app, or an inference trick. You find a routing table, about twenty scenario folders, and a field journal. The routing table picks a methodology. The journal records what was tried, against what, and which findings the evidence actually supports.

None of that is capability. The agents that use it could already run the tools. What they could not do was pick the method. Which of twenty applies, in what order, and what has to be true before they are allowed to act.

That gap is judgment. Procedure packs get copied. Models get better for everyone on the same afternoon. A field journal only accumulates for the person who wrote it down.

The trigger: you are deciding what to keep, what to publish, or what to sell.

The rule: keep the field journal. Rent the procedure. Do not pay standing tax for a skill you will not name.

What it costs to skip this

The sort takes about ten minutes and it does not need a new protocol.

The install tax is quiet. There is no error, no page, no “this skill did not fire” event. The session just gets more expensive. It also gets a little worse at following the instructions that actually matter. Those instructions are now one card in a pile of eighty.

You find it the way I found it. You open a session for unrelated work and notice the prompt is full of names you would not have typed.

Built on the same bet

I build freeapp.ai on the bet that the durable asset is not the agent, it is what your agent has learned about your work. The map, the catalog, and the five skills that still fire unasked are part of that inventory now. It is a voice-controlled coding agent on your own box, on your own model key. Every number above came out of running it on mine.

See the founder license

Written by the team behind freeapp.ai. Every date, byte count and star count above is taken from the live box and GitHub on 17 August 2026, not from memory.