Installing a command, a skill, a sub-agent or a server takes an afternoon. Keeping a catalog of them good is the standing job, and it is a different job. Every capability charges rent on every turn and pays out only when it fires. A constraint that fails to fire lets a violation through, and you find out. A capability that fails to fire produces work that is merely worse, and nobody measures that. This page is the ledger, the determinism, and the four numbers that make the silence audible.
A catalog does not stay good on its own. Three sections on the forces that pull it apart: the bill that compounds, the failure that makes no sound, and the five ways a working set of capabilities goes quietly stale.
Every capability has a standing cost and an invoked cost. The standing cost is what it puts in the window on every turn, whether it fires or not. The invoked cost is what it puts there when it does. Teams size capabilities by the second number and pay the first one thousands of times a week.
Context is a budget and it is spent on every request. A rule you wrote crowds out a rule you need. A tool schema you never call crowds out both. This is the resource capabilities compete for, and it is the reason the four rungs exist as four rungs rather than as one file format.
Read the standing column first. It is the one that compounds.
| Rung | Who invokes it | Standing cost · every turn | Invoked cost · once | What returns | Boundary |
|---|---|---|---|---|---|
| command | a human types it. A model may too, unless you turn that off | a name and one line, and nothing at all when model invocation is off | the whole body, expanded in place | nothing. It is the turn | none. A macro |
| skill | the model, from the description. Or a human, by name | a name and one line | the body, then bundled files on demand | text, into this same window | convention. The model can read the file |
| sub-agent | the parent turn | a name and one line | a task out, a summary back. The work never lands here | a summary, and the parent chose its shape | context. Its own window, its own grant |
| MCP server | the model, by schema | every tool's schema, on every turn. The largest bill on this page | arguments out, a result back | a result, and no implementation | process. Another language, another machine if you like |
The four rungs split cleanly in two, and the split is not about power. It is about which window pays. A command and a skill put their work in front of you. A sub-agent and an MCP server put their work somewhere else and hand back a result.
flowchart TD
N["a need arises in this turn"] --> C{"which rung carries it"}
C -->|"command"| A["the body lands in this window"]
C -->|"skill"| B["the body lands in this window"]
C -->|"sub-agent"| S["the reading happens in another window"]
C -->|"MCP server"| T["the work happens in another process"]
S --> SR["a summary lands in this window"]
T --> TR["a result lands in this window"]
A --> W["this window, now smaller"]
B --> W
SR --> W
TR --> W
class N dim
class C dim
class A warn
class B warn
class S pass
class T pass
class SR pass
class TR pass
class W block
So the sub-agent is the one rung that can hand context back. It spends a one-line description on every turn and saves you a thousand lines of reading when it fires. Nothing else on the ladder does that, and it is why a research task that would fill your window belongs there rather than in a skill.
Standing cost is not a file size. It is a file size multiplied by every turn of every session that has the capability in scope. Get the multiplier and the choice usually makes itself.
/context in a fresh session. It reports what is standing in the window before you have asked for anything: system prompt, memory files, tool schemas, and the descriptions of every command, skill and sub-agent in scope.
I am not publishing a token table for the four rungs. The honest ranges are wide, and mine would be wrong for your repository within a week. What holds across setups is the shape: a description is tens of tokens, a skill body is hundreds to thousands, and a chatty MCP server can stand for more than every skill you own put together. Measure the last one first.
An MCP server does not charge for the tools you call. It charges for the tools it declares. Twelve tools you never touch stand in the window on every turn, in full schema, with every parameter description. Enable a server for one tool and you have bought all twelve. The four cuts in The Capability Ladder are what to do about it.
Push cost from the standing column into the invoked column. That is the entire reason progressive disclosure exists, and it is the one rule that applies to all four rungs. Keep the trigger short and the body as long as the job needs. Then keep the body out of this window whenever the job is bulk reading.
A rule that does not fire lets a violation through. The violation shows up in a diff, a review or an incident, and you learn that the rule was wrong. A capability that does not fire produces a turn that was merely worse than it could have been. No diff records that. No review catches it. This is the central failure mode of the whole family.
Watch the two failures side by side. A hook that should have blocked a migration and did not leaves a migration in the tree. A skill that should have been loaded and was not leaves a commit message in the wrong format, or a test written the way the model likes rather than the way your suite is written. The second one merges.
So a capability needs an instrument that a constraint does not. A constraint gets audited by its violations. A capability has to be audited by its invocations, and the invocation is the thing nobody is looking at. Between installing a capability and it doing any good, there are five gates, and every one of them fails quietly.
flowchart TD
I["you install the capability"] --> G1{"is it in scope for this session"}
G1 -->|"no"| D1["dead: wrong scope"]
G1 -->|"yes"| G2{"did the description match the need"}
G2 -->|"no"| D2["dead: never matched"]
G2 -->|"yes"| G3{"did a sibling match harder"}
G3 -->|"yes"| D3["dead: lost a collision"]
G3 -->|"no"| G4{"did the body carry what it assumed"}
G4 -->|"no"| D4["dead: broken on load"]
G4 -->|"yes"| G5{"did the return get used"}
G5 -->|"no"| D5["dead: result ignored"]
G5 -->|"yes"| OK["the turn is better than it was"]
class I dim
class G1 dim
class G2 dim
class G3 dim
class G4 dim
class G5 dim
class D1 block
class D2 block
class D3 block
class D4 block
class D5 block
class OK pass
Helpers for database work matches nothing a user actually types. Tell: invoking it by name works perfectly, and it never fires on its own.
Four of those five are description and interface problems rather than implementation problems. The capability worked. Nobody found it, or nobody could use what came back. That ratio is why The Capability Ladder gives a whole section to one line of frontmatter, and another to what comes back.
Count invocations per capability per week, from the transcript rather than from memory. A capability with a standing cost and no invocations is not neutral. It is a tax with a good reputation. Section 8 names the four numbers worth having, and section 9 is the counting procedure.
A capability that worked in March can be useless in September without anybody touching it. The repository moved, a plugin updated, a sibling arrived, the model changed. Four of the five failures below leave no trace in any diff, which is why maintenance here is a measurement problem before it is a writing problem.
| Rot | What happens | What you see | The number that catches it |
|---|---|---|---|
| catalog bloat | the set grows because adding is easy and removing feels like a loss | the standing bill rises quarter over quarter | standing lines, counted. Section 11 |
| trigger drift | the words people use change, or a new sibling starts winning the match | nothing. It quietly stops firing | fires per week. Section 8 |
| body staleness | the procedure names a path, a script or a convention the repository has moved on from | it fires, then the model works around it by hand | used after it fires |
| grant creep | a tool gets added to make one task work, and never gets removed | nothing, until the day something writes what it should not have | read the grants. There is no metric for this one |
| variance | a decidable question is left to a model, so the answer moves between runs | a check that passes on Tuesday and fails on Thursday with no change between | the same input, judged five times. Section 3 |
The five have one thing in common worth naming. Every one of them is a change in the relationship between a capability and its surroundings, rather than a change in the capability. The file is the same file. The repository, the catalog, the vocabulary and the model around it are not, and none of those movements sends you a notification.
Two of the five have a repair that removes the failure mode instead of detecting it. Variance goes away when a decidable question is decided by code, which is Part II. Bloat goes away when the catalog has a fixed budget, which is section 11. The other three you have to watch for, and Part III is how.
Body staleness is the failure that looks like success. The capability fires, the transcript shows it loaded, the invocation count looks healthy, and the model quietly ignores what it said because the paths are wrong. A count of fires cannot see it. Only reading what happened after the fire can, which is why section 8 keeps a number that costs human attention rather than a query.
One of the five rots has a real cure rather than a detector. Anything decidable can be decided by code, and the code is cheaper than the rung people buy to get it. Five sections: what determinism is worth, the pattern that installs it, the one predicate behind several mounts, the questions no script can answer, and the order to spend in.
A model that reads a file and judges it returns a distribution. Ask twice and you may get two verdicts. That is tolerable for advice and intolerable for a check, because a check exists so that somebody downstream can stop paying attention. Determinism is the property that makes not paying attention safe.
Measure it before you argue about it. Take a question a capability answers, run it five times on the same input, and count the distinct answers. One is determinism. Two is a coin flip wearing a procedure. The count takes ten minutes and it settles more arguments about agent reliability than any amount of prompt editing.
| The answer feeds | Variance costs | Acceptable? |
|---|---|---|
| a suggestion to a human | a second opinion, occasionally a worse one | yes. This is what models are for |
| a step the agent then takes | a different path through the same job. Sometimes a wrong one | sometimes, if the next check is deterministic |
| a gate somebody trusts | a green run that means nothing, and a red one nobody believes | no. This is the case that must be code |
So the design question is never is the model good at this. It is is this decidable. If it is, code decides it, and the model's job becomes choosing when to run the code and fixing what it reports. That division survives model changes, which is the other thing determinism buys and the one that matters over a year.
Decidable is not the same as important, and it is not the same as easy. Whether a migration is reversible is decidable. Whether a name is clear is not, however much you want it to be. Section 6 draws that line, because putting a judgment behind a script gives you a confident wrong answer with no distribution left to warn you.
The pattern is one line in a skill body and it is the whole of practical determinism. A capability that says read the migration and confirm it is reversible has invited variance into a decidable question. One that says run the checker and fix what it reports has removed it, at the price of a file in a directory.
Section 3 said the answer has to stop moving. This is how you make it stop, and the mechanism is a file in a directory plus one sentence telling the model to run it rather than think about it. No new rung, no schema, no process to keep alive.
Two phrasings matter and one of them is load-bearing. Naming the script is not enough, because a model that has already read the file will often answer from what it read. The instruction has to say the script is the authority: run it, do not reimplement it. That clause is what turns a suggestion into a procedure with one answer.
# in SKILL.md, the step that matters
3. Run scripts/check_reversible.py against the new file.
Do not reimplement this check by reading the file yourself.
Fix every line it prints, then run it again.
# the script's contract, written down where the caller can see it
exit 0 nothing to report
exit 1 findings on stdout, one per line:
path:line · rule · what to change
exit 2 the script itself could not run. Say so, do not guess
The third exit code is the part people leave out and the one that keeps a script honest. A checker that cannot distinguish nothing wrong from I could not look will report clean on the day it breaks, and the model will believe it. That failure has an exact analogue on the constraint side, where Layers and Promotion found a pipeline reporting done over a tree with two violations in it.
allowed-tools, run by name. No standing cost, no schema, no process to manage. This is the default and it is where most determinism belongs.
! at expansion, so the prompt arrives holding facts rather than asking for them. Determinism at rung 0, and it cannot be forgotten because it is part of the text.
The same script can sit in a skill, in a command, behind a context wall, or in a hook where the agent cannot decline it. Those are four mounts of one predicate, and choosing between them is a constraint decision rather than a capability one. Conflating the two is how a check ends up somewhere it can be argued with.
Take one decidable check and carry it three ways. The variance column is what you are buying. The skippable column is what you are not.
| Carried as | Variance | Standing cost | Can be skipped | Use when |
|---|---|---|---|---|
| prose in a skill: check that… | high. The model judges | a line | yes, silently | the question needs taste and cannot be decided |
| a bundled script the skill runs | none, when it runs | none | yes, if the model skips the step | decidable, and the agent should fix what it finds |
| a hook that runs the same script | none | none in the window | no | the answer must hold whether the agent cooperates or not |
The three rows are one script with three mounts, which is the property Constraint Engineering asks of a good constraint: one identity, one predicate, many mounts. Write the predicate once. Then decide separately whether the agent may skip it, because that decision is a constraint decision and it does not belong to this ladder at all.
A script decides. It does not judge. Whether a migration is reversible is decidable. Whether a name is clear, whether a test asserts the thing that matters, whether an abstraction earns its keep: none of those are predicates, and a script that pretends otherwise returns a confident wrong answer with no distribution left to warn you.
Try to write the failing condition down. If you can state it without a word that requires taste, it is decidable and a script should own it. If the sentence needs clear, reasonable, appropriate, idiomatic or meaningful, you are holding a judgment, and no amount of scripting turns it into a predicate.
The useful move is not to pick a side. It is to split the question. Almost every judgment contains a smaller decidable claim, and the script takes that part while the model keeps the rest. You get one answer where one answer is possible and an opinion only where an opinion is unavoidable.
| The question | The decidable shadow | What is left for judgment |
|---|---|---|
| is this test meaningful | does it fail when the behavior it names is reverted | whether the behavior was worth pinning |
| is this migration safe | is it reversible, and does it lock a table | whether the backfill window is acceptable to the business |
| does this follow our conventions | the conventions a linter can express | the ones that are actually taste, which is most of the interesting ones |
| is this abstraction earning its keep | how many callers it has, and how many it had last quarter | all of it. The count is evidence, not a verdict |
There is a trap in the last column and it is worth naming, because I fell into it. Layers and Promotion found that a gate enforcing the decidable shadow of a rule makes the judging rung look deletable. The counts go green, the shadow is covered, and the part that needed taste is quietly no longer being asked. Keep both, and keep them labeled.
Those questions belong to a model, and a model's answers need the apparatus in The Eval Loop: a golden set, a distribution rather than one run, and a number that moves. The division of labor is the useful part. Code for verdicts, models for selection and repair. A capability that mixes them into one prose instruction gets the variance of the model on the question the script could have settled.
Four ways to make an answer repeatable, and they are not equally priced. A script costs nothing standing. A CLI costs nothing standing. A hook costs nothing in the window and takes the choice away from the agent. A server costs a schema on every turn forever. Buy from the top of that list down.
Determinism has a price ladder of its own, and it runs in the opposite direction to the capability ladder in The Capability Ladder. The cheapest option sits at the bottom, so start there and climb only when a rung above buys something the rung below cannot.
| Buy | Standing cost | What it adds over the row above | Take it when |
|---|---|---|---|
| a bundled script | none | the answer stops moving | always, first. This is the default and it is usually enough |
| a CLI the agent already has | none | somebody else maintains it, and it is already authenticated | a good tool exists. Pin the invocations in a skill so nothing is guessed |
| the same script in a hook | none in the window | the agent can no longer skip it | the answer must hold whether the agent cooperates or not |
| an MCP server | a schema per tool, every turn | a credential the model never holds, other clients, a versioned contract | one of the five reasons, and repeatability is not one of them |
The last row is the one to be strict about. Reaching for a server to get repeatable answers is paying a schema on every turn for something a fifty-line script does for nothing. The five reasons that do justify it are in the first half of this pair, and repeatability is deliberately absent from the list.
A bundled script first. Then the same script mounted in a hook, if the agent must not skip it. Then an MCP server, and only for one of the five reasons in the first half of this pair: several clients, an interactive sign-in, a broad surface worth typing, a vendor implementation, or a contract other teams build against. Reaching for a server to get repeatable answers is paying a schema on every turn for something a fifty-line script does for free.
A capability that fails silently needs an instrument, and the instrument is not a feeling about which skills are useful. Two sections: the four numbers worth having, and how to get three of them out of transcripts you already have.
Three of these come out of session transcripts with a query. The fourth needs a week where you turn something off, or a golden set you maintain. Nobody has the fourth, and it is the one this whole page is about.
| Number | What it tells you | Where it comes from | What a bad value means |
|---|---|---|---|
| fires per week | whether the trigger works at all | the transcript | zero means a dead capability paying rent. Fix the description or delete it |
| right when it fires | whether it is winning the collisions it should | the transcript, read by hand | a general capability is eating a specific one. the discovery section of the first half |
| used after it returns | whether the return value was worth crossing the boundary | the transcript, read by hand | the model did the job by hand afterward. Your return shape is wrong |
| missed when it should have fired | the invocation gap itself | a week with it disabled, or a golden set of six requests | this is the number nobody has, and it is the one the page is about |
I ran twelve experiments on constraint placement and wrote them up in Layers and Promotion, including the two bugs in my own measurement. I have not run the equivalent for capability placement. The experiment I would run is the same shape: one task set, four arms, the same job carried as a command, a skill, a sub-agent and a server, measuring task quality, tokens standing and tokens invoked. Until somebody runs it, treat this page's ranking as accounting plus opinion, and the accounting is the part you can check today on your own machine.
Memory flatters the capabilities you were proud of. The record does not. Session transcripts hold every tool call, every skill load and every sub-agent dispatch, so the first three numbers are a query away and the fourth is a habit.
Session transcripts are line-delimited JSON under the project directory in
~/.claude/projects/. Their shape is not a published contract, so look at one
record before trusting a query. Then count tool calls by name.
# every tool call, by name, most used first
jq -r 'select(.type=="assistant")
| .message.content[]?
| select(.type=="tool_use")
| .name' ~/.claude/projects/<project>/*.jsonl \
| sort | uniq -c | sort -rn
# which skills actually loaded
jq -r 'select(.type=="assistant")
| .message.content[]?
| select(.type=="tool_use" and .name=="Skill")
| .input.skill' ~/.claude/projects/<project>/*.jsonl \
| sort | uniq -c | sort -rn
# MCP tools carry their server in the name: mcp__server__tool
# A server with one busy tool and nineteen silent ones shows up here
# as one row, and it is billing you for twenty.
Join that count to the standing bill from /context and you have the cost ratio
from section 0, per capability, from your own work rather than
from a table on a web page. Every capability with a standing line and a zero in the count
column is a decision waiting to be made.
The fourth number resists transcripts, because a capability that never fired left no trace of what it would have improved. Two ways to get at it, and the second is cheaper.
What to do with the numbers. Three sections: when to move a capability up or down the ladder, how to hold the standing bill flat, and the standard with the cadence attached.
Climbing the ladder costs standing tokens and blindness. Descending costs nothing but pride. Move a capability on an observation and write down which one, because the argument six months later will be about whether it was ever justified.
The signals below are the ones I trust, and each row is an observation rather than a feeling. Record the observation next to the change. The argument two quarters later is always about whether the move was ever justified, and the answer is either in a commit message or it is gone.
| What you observe | Move | Why |
|---|---|---|
| promotion | ||
| a command gets typed on most tasks of a kind | command → skill | the trigger is predictable, so give it to the model |
| a skill's load fills the window with reading | skill → sub-agent | the byproduct is the cost. Wall it off |
| a sub-agent's job needs a credential or a second client | sub-agent → MCP server | the process wall is the only rung that holds a secret |
| a bundled script is being called by three skills | script → MCP server | one implementation, several callers, one schema |
| demotion | ||
| a server declares many tools and you call one | MCP server → skill with a script | you were paying for nineteen schemas to use one |
| a sub-agent gets asked follow-ups every time | sub-agent → skill | the wall is in the wrong place, or the job is small |
| a skill never triggers, and works when named | skill → command | the trigger belongs to a human. Stop paying for the description |
| a capability fires and nothing in the output changes | delete it | a standing cost with no effect is the worst row in the ledger |
Constraint charters get held to a fixed size because everyone can feel the cost of a rule. Nobody feels the cost of a skill, so capability catalogs grow without opposition. The repair is the same one: a number decided in advance, and a day in the calendar where the counts decide.
Anatomy of a Charter holds the constraint side to a fixed budget, because growth is the default. Capabilities need the same discipline and get it less often, because a skill nobody uses feels harmless. It is not harmless. It stands in every turn and it competes for selection with the capability you needed.
So: a fixed number of standing lines, decided in advance. Adding one means removing one or making the case that the budget should rise. On deletion day, the invocation count decides, and the argument that it might be useful later does not, because a bundled file or a command can hold it at no standing cost until later arrives.
These are the shortcuts I actually use, offered as opinion. They are the ledger applied, and each one is a way of not paying standing cost for something that could be paid for on demand.
You are trading window space for reach. Rungs 0 and 1 put text in front of the model, so buy them for knowledge that changes what it does and keep the always-on part to a line. Rungs 2 and 3 put a wall between the model and the work, so buy them when the work would otherwise crowd out the job. Everything else on these two pages is the accounting behind that sentence.
A standard that cannot be failed is a mood. These are checkable, mostly by looking at files and twice by running a query. The rules that describe a capability's shape belong to the first half of this pair, and they are restated here because a standard split across two pages is not a standard.
/context in a fresh session and be able to say what stands there and why.§0 · §9| Level | Rules | Cadence | What it gets you |
|---|---|---|---|
| 1 · declared | 1, 2, 5, 6, 9, 10 | at review time, like code | every capability has a designed trigger, grant and return. No dead files by accident |
| 2 · measured | level 1, plus 4, 7, 8, 15 | monthly, and on every description edit | you know what stands in the window and what fires. The silent failure stops being silent |
| 3 · budgeted | level 2, plus 3, 11, 12, 16 | quarterly, on a date in the calendar | the catalog stops growing on its own, and the ladder is climbed on evidence |
The cadence column matters more than the rule list. Every rule here that has ever slipped for me slipped because it had no date attached, and a maintenance standard without a date is a preference. Put the monthly count and the quarterly deletion day in the same calendar the rest of your engineering rituals live in.
I am at level 2 and not level 3. The rule I miss is the last one: I have the invocation counts and I have never held a deletion day for capabilities, so my own catalog has grown for months while the constraint side of the same charter stayed inside a fixed budget. That asymmetry is the thing that made me write this page, and it is exactly the bias the page describes. Removing a rule feels like accepting risk, so it gets argued. Removing a skill feels like losing something for nothing, so it never gets raised.
Capabilities are the half of the charter that fails quietly. Spend standing cost on triggers and invoked cost on everything else. Decide anything decidable with a script, and buy a process wall only for the five reasons that justify one. Then count the fires, because a capability you cannot show firing is indistinguishable from one you never wrote, except that you are paying for it on every turn.