Token Efficiency: Where the Tokens Go

Referencing a skill instead of installing it

@skills: Attention is all you have proposes a delivery protocol for agent skills where a path is the address and reading a skill is using it. The authors are from SylphAI and UT Austin, and they ship a reference implementation plus a hub.

I measured what my own installed skills cost, then ran the reference client against real provider repositories to see what the alternative does.

The accounting claim

Installing a skill does three things at once: it fetches content, keeps it for next time, and puts the skill’s one-line description into the system prompt so the model can fire it without being asked. The paper’s point is that only the third needs prompt space, and prompt space is what runs out.

Their July 2026 crawl counted 56,804 SKILL.md directories across 1,133 public repositories. The paper argues that all of them compete for fewer than a hundred reliable auto-trigger slots per agent, and it is explicit that the hundred is bounded by argument and by the positional-attention literature rather than measured. They list the controlled measurement as future work.

What 29 installed skills cost me

~/.claude/skills holds 31 directories, 29 of which have a SKILL.md. I parsed the YAML frontmatter of each, joined the skills into one block with a row per skill in the form - name: description, and counted it with cl100k_base:

skills                : 29
resident block tokens : 2225
per-skill min/med/max : 7 68 188
largest               : docx
body-only total chars : 190298

2,225 tokens on every message. The median skill costs 68 tokens and the largest, docx, costs 188. The bodies those descriptions point at come to 190,298 characters and stay on disk until something fires.

That per-skill spread sits inside the 50 to 280 tokens the paper reports from its own working setup. It is the one number in the argument I can check against my own machine.

Reading a skill by path

The repo ships a CLI with one npm dependency. I cloned it at e3c802d and pointed it at Cloudflare’s skills:

$ atskills get gh:cloudflare/skills/skills/wrangler
⎿ read ~/.cache/atskills/gh/cloudflare/skills/skills/wrangler/SKILL.md
  (cloud·fresh) · review: https://github.com/cloudflare/skills/tree/HEAD/skills/wrangler (922 lines)

That printed the 922-line skill and took 5.5 seconds. The second run took 1.6 seconds and changed one word in the status line, cloud·fresh to cloud·cache. Nothing was written into the project.

A directory prints a menu

Point the same command at a repository root and it lists what is under it, one line per skill, each line a valid reference. Two of the thirteen, with the rest elided:

$ atskills get gh:cloudflare/skills
⎿ read skills directory ~/.cache/atskills/gh/cloudflare/skills/ (13 skills) (cloud)  ·  review: ...
- agents-sdk: Build AI agents on Cloudflare Workers using the Agents SDK. Load when...
- durable-objects: Create and review Cloudflare Durable Objects. Use when building...

Doing the same to gh:anthropics/skills returned 18 skills, and one of those descriptions is the pattern the paper spends a section on. Anthropic’s own claude-api skill writes its description as a YAML block, three long lines that I have wrapped and truncated here:

description: |-
  Reference for the Claude API / Anthropic SDK — model ids, pricing, params, ...
  TRIGGER — read BEFORE opening the target file; don't skip because it "looks
    like a one-liner" — whenever: the prompt names Claude/Anthropic in any
    form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, ...
  SKIP only when another provider is being worked on (overrides all triggers):
    OpenAI/GPT/Gemini/Llama/Mistral/Cohere/Ollama named in the query; OR ...

I measured that description at 293 tokens, 124 words. frontend-design, in the same repository, costs 38. Both are paid on every message once installed, and the paper’s reading is that the 293 is a bid for a trigger slot rather than documentation. Its own example is Stripe, at roughly 150 words. Anthropic publishes the format and writes its own descriptions this way.

Where the 128-skill cap fires

A single reference may load at most 128 skills. Two aggregator repos tripped it, and the refusal names paths that work:

$ atskills get gh:wshobson/agents
✗ gh:wshobson/agents holds 180 skills — over the 128 a single reference may load.
  Reference a specific skill, or one of the collections inside it:
    gh:wshobson/agents/plugins/python-development  (16)
    gh:wshobson/agents/plugins/developer-essentials  (11)

gh:ComposioHQ/awesome-claude-skills reported 864. Both refusals came back in under 10 seconds, because the count is read from git tree metadata before any file content transfers.

Save detaches

save vendors a copy at the path that addresses it, so the copy answers its own address:

$ atskills save gh:cloudflare/skills/skills/wrangler
saved: .atskills/gh/cloudflare/skills/skills/wrangler/ — yours now, detached

The folder holds the SKILL.md and a two-line .source:

gh:cloudflare/skills/skills/wrangler
2026-08-17 rev:f96bff754e428838818017f75817f0f9428acd48

Line two is the upstream commit. There is no lockfile and no update command; the recorded revision is what tells you later whether you edited the copy or upstream moved.

Install is one line

Everything that fires unprompted lives in .atskills/.autotrigger, with gitignore syntax. I wrote two lines, one for the saved copy and one following a cloud skill:

gh/cloudflare/skills/skills/wrangler
@gh:obra/superpowers/skills/brainstorming

atskills triggers resolved both and reported ~141 resident tokens (frontmatter only; bodies load on trigger). atskills prompt printed the injected block itself and reported ~188 tokens for the same two skills, because that block adds a header line and the resolved file path per skill. 188 is the number to trust, since it counts the text the model receives.

What the hub adds

The live counter on the hub read 54,929 skills when I loaded it, against the 56,804 in the paper and the 60,000+ in the site’s own meta description. Every result carries a copyable @skills:gh:... reference and a link to the skill’s source on GitHub. The hub is for search, which is the one job a path cannot do.

None of my runs touched it. gh: paths resolved through git and the cache at ~/.cache/atskills, which is what the paper promises when it says the hub is optional.

Worth using?

The measurement holds on my machine. 2,225 tokens standing, against 190,298 characters of body text that loads only on a match that may not happen. I cannot verify the hundred-slot figure and the paper does not claim to have measured it. The author discloses that he founded the company running AdaL and the hub, and states that the format and protocol are open so neither is required.

The file layout survives independent of both the estimate and the hub. A folder at .atskills/<path> holds the skills a project keeps, .autotrigger holds one gitignore-style line per skill that should fire unprompted, and .source records two lines of provenance per saved copy. All three are text files in the repository, so a change to what the model reads on every message shows up as a diff in review. My 29 installed skills produce no diff.