Harness Engineering / Keeping Capabilities Honest / design standard

A capability is bought once and paid for every turn.

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.

the argument · a capability is a trade, not an install. You spend context to buy reach, and the spending never stops
the first half · The Capability Ladder covers the mechanics: what each primitive is, and what makes a good one
the other half of the charter · Constraint Engineering models what an agent may not do
the numbers · standing cost is measurable on your own machine and section 9 gives the queries. I publish no token table, because mine would be wrong for your repository within a week
what is honest · I have measured constraint placement to a standard I trust. I have not measured capability placement the same way, and section 8 says what I would run
where I fail it · level 2 of my own standard, and section 12 names the rule I miss
reads alongside · The Capability Ladder · Anatomy of a Charter · Layers and Promotion · The Eval Loop
license · CC BY 4.0. Take the ledger, not the vocabulary
Standing cost
What the capability charges on every turn, whether or not it fires. Paid in context, multiplied by turns.
Invoked cost
What it charges when it does fire. Paid once, and the rung decides which window pays.
Variance
How much the answer moves between two identical asks. What determinism is for, and what a script removes.
Evidence
Whether it fired, whether it was right, and whether anything used what came back.
Part I

What decays

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.

0 Two prices

Two prices, and teams only ever look at one of them

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.

standing every turn, forever invoked once, when it fires returned the rung that pays you back

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.

0.1 · The ledger

Read the standing column first. It is the one that compounds.

the capability ledger · four rungs, from open to hiddenthe standing column compounds
RungWho invokes itStanding cost · every turnInvoked cost · onceWhat returnsBoundary
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

0.2 · Where the invoked tokens land, which is the actual trade

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.

which window pays for the workthe lower two rungs wall it off
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.

0.3 · The arithmetic, which you can run today

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.

  1. count the bill Run /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.
  2. count the turns Take a normal working session and count assistant turns. Twenty is a small one. The standing bill is paid once per turn, so multiply.
  3. count the fires Count how many times the capability actually fired in that session. Section 9 gets this from the transcript rather than from memory, because memory flatters the capabilities you were proud of.
  4. divide Standing cost times turns, divided by fires, is what one invocation really cost. A capability that fires twice a month and stands in every turn is not cheap because its file is short.

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.

The bill nobody itemizes

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.

The design rule the ledger produces

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.

1 The invocation gap

A constraint fails loudly, and a capability fails by producing slightly worse work

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.

constraint fails into evidence capability fails into silence

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.

five gates between an install and a benefitevery failure here is silent
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

1.1 · The five deaths, and what each one looks like from the outside

  1. wrong scope The capability exists in a personal directory and the work happens in a repository, or it lives in a plugin nobody enabled. From the outside the agent looks like it ignored a skill it never had. Tell: it works for the author and nobody else.
  2. never matched The description says what the capability is, and the model needs to know when to use it. Helpers for database work matches nothing a user actually types. Tell: invoking it by name works perfectly, and it never fires on its own.
  3. lost a collision Two capabilities overlap and the more general one keeps winning. Tell: the specific one fires only when the general one is disabled, which is how most people discover the collision.
  4. broken on load The body assumes a path, a tool, a credential or a convention that is not there. The capability fires and then flounders, and the model works around it silently. Tell: transcripts show it loaded, then show the model doing the job by hand.
  5. result ignored A sub-agent returned a summary that did not answer the question, or an MCP tool returned four pages of JSON where a field was needed. The parent re-derives the answer and pays twice. Tell: the same lookup happens after the tool call that the tool call was supposed to settle.

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.

The instrument, stated early because the rest of the page assumes it

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.

2 Five kinds of rot

Five ways a working catalog goes stale, and only one of them is visible

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.

bloat the bill grows drift the trigger stops matching staleness the body describes a repository that moved
five kinds of capability rotonly the first one shows up in a review
RotWhat happensWhat you seeThe 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.

The one that gets people

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.

Part II

Determinism

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.

3 What it buys

One green run tells you nothing, and that is what you are paying to fix

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.

variance the same input, two answers decidable then code decides it

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.

what variance costs, by what the answer is used forthe last row is the one that hurts
The answer feedsVariance costsAcceptable?
a suggestion to a humana second opinion, occasionally a worse oneyes. This is what models are for
a step the agent then takesa different path through the same job. Sometimes a wrong onesometimes, if the next check is deterministic
a gate somebody trustsa green run that means nothing, and a red one nobody believesno. 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.

The distinction to hold

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.

4 Run, do not read

Run the checker, do not read the file

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.

run do not read no standing cost a script is free until it runs exit codes the contract

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.

4.1 · The sentence that carries it

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.

a bundled script and its contractmachine-shaped output, so nothing has to be interpreted
# 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.

4.2 · Where a script can live

  1. in a skill Bundled beside the procedure, granted by 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.
  2. in a command Injected with ! 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.
  3. in a sub-agent The same trick behind a context wall. A child that runs the checker and returns its findings is cheaper than a child that reads the tree and forms an opinion.
  4. in a hook or a gate The same script, mounted where the agent cannot decline it. Now it is a constraint, and the other page owns the design.
5 One predicate, many mounts

Write the predicate once, then decide separately who may skip it

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.

one predicate many mounts skippable is a separate decision

5.1 · The same job, three ways

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.

three ways to answer one decidable questiona script the model may skip is still a script
Carried asVarianceStanding costCan be skippedUse when
prose in a skill: check that…high. The model judgesa lineyes, silentlythe question needs taste and cannot be decided
a bundled script the skill runsnone, when it runsnoneyes, if the model skips the stepdecidable, and the agent should fix what it finds
a hook that runs the same scriptnonenone in the windownothe 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.

6 Verdicts and judgment

Code for verdicts, models for judgment, and the line between them is the design

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.

decidable code settles it judgment needs an eval, not a script

6.1 · The word test for decidable

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.

6.2 · Most judgments have a decidable shadow, and it is worth finding

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.

splitting a judgment from its shadowthe shadow goes in a script, the rest stays a judgment
The questionThe decidable shadowWhat is left for judgment
is this test meaningfuldoes it fail when the behavior it names is revertedwhether the behavior was worth pinning
is this migration safeis it reversible, and does it lock a tablewhether the backfill window is acceptable to the business
does this follow our conventionsthe conventions a linter can expressthe ones that are actually taste, which is most of the interesting ones
is this abstraction earning its keephow many callers it has, and how many it had last quarterall 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.

6.3 · Judgment needs an eval, not a script

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.

7 What order to buy in

Buy the cheapest determinism that answers the question

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.

script first cli if one exists hook if it must not be skipped server for five reasons only

7.1 · The price ladder for a repeatable answer

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.

four ways to buy the same repeatable answerbuy from the top down
BuyStanding costWhat it adds over the row aboveTake it when
a bundled scriptnonethe answer stops movingalways, first. This is the default and it is usually enough
a CLI the agent already hasnonesomebody else maintains it, and it is already authenticateda good tool exists. Pin the invocations in a skill so nothing is guessed
the same script in a hooknone in the windowthe agent can no longer skip itthe answer must hold whether the agent cooperates or not
an MCP servera schema per tool, every turna credential the model never holds, other clients, a versioned contractone 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.

If you keep one ordering

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.

Part III

Observability

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.

8 Four numbers

Four numbers, and the transcript already has three of them

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.

fires per week right when it fires used after it returns missed when it should have
the four numbersthree are free, one costs a week
NumberWhat it tells youWhere it comes fromWhat a bad value means
fires per weekwhether the trigger works at allthe transcriptzero means a dead capability paying rent. Fix the description or delete it
right when it fireswhether it is winning the collisions it shouldthe transcript, read by handa general capability is eating a specific one. the discovery section of the first half
used after it returnswhether the return value was worth crossing the boundarythe transcript, read by handthe model did the job by hand afterward. Your return shape is wrong
missed when it should have firedthe invocation gap itselfa week with it disabled, or a golden set of six requeststhis is the number nobody has, and it is the one the page is about
What I have measured, and what I have not

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.

9 Instrumenting it

Count it from the record, not from memory

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.

transcripts line-delimited json golden set six requests per capability ablation a week with it off

9.1 · Counting the fires

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.

counting invocations across every session in a projectcheck one record first, then run it
# 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.

9.2 · The week with it turned off

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.

  1. the ablation Disable one capability for a week and read the work it should have touched. Slow, noisy, and the only method that measures the real thing rather than the trigger.
  2. the golden set Six requests per capability: three that should fire it, three near misses that should not. Run them in fresh sessions after every description edit. This measures the trigger rather than the benefit, and the trigger is where four of the twelve anti-patterns live.
Part IV

The loop

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.

10 Promotion

Rungs are not ranks, and demotion is the direction nobody goes

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.

promote on a signal demote on the same evidence

10.1 · Move on an observation, and record which one

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.

move on evidencethe demotion rows are the ones I use most
What you observeMoveWhy
promotion
a command gets typed on most tasks of a kindcommand → skillthe trigger is predictable, so give it to the model
a skill's load fills the window with readingskill → sub-agentthe byproduct is the cost. Wall it off
a sub-agent's job needs a credential or a second clientsub-agent → MCP serverthe process wall is the only rung that holds a secret
a bundled script is being called by three skillsscript → MCP serverone implementation, several callers, one schema
demotion
a server declares many tools and you call oneMCP server → skill with a scriptyou were paying for nineteen schemas to use one
a sub-agent gets asked follow-ups every timesub-agent → skillthe wall is in the wrong place, or the job is small
a skill never triggers, and works when namedskill → commandthe trigger belongs to a human. Stop paying for the description
a capability fires and nothing in the output changesdelete ita standing cost with no effect is the worst row in the ledger
11 The budget

A fixed standing budget, and a deletion day to enforce it

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.

budget standing lines, fixed deletion day the count decides

11.1 · Deletion day, for capabilities

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.

11.2 · The trade, as five rules of thumb

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.

  1. Pay standing cost for triggers, never for knowledge. A description is a trigger. A reference table is knowledge and belongs behind one. §0
  2. When two rungs both work, take the one with the smaller standing cost. When the standing costs match, take the one whose failure is louder. §1
  3. A capability that fires less than weekly does not earn a line in every turn. Fold it into a neighbor as a bundled file, or let a human invoke it by name. ladder §7
  4. Reach for a sub-agent when the byproduct is the cost, not when the task feels big. Volume of reading is the signal. Importance is not. ladder §3
  5. Reach for a process wall only for several clients, an interactive sign-in, a broad surface worth typing, a vendor implementation, or a contract other teams build against. Repeatability is a script. Five reasons, and tidiness is not among them. ladder §5
The compression, if you only keep one paragraph

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.

12 Conformance

Sixteen rules, three levels, a cadence, and the one I fail

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.

12.1 · The rules

  1. Every capability names its four attributes: trigger, rung, grant, return.ladder §0
  2. Run the family test before choosing a rung. A component whose removal lets the agent do more is a constraint, whatever file it lives in.ladder §0
  3. Pay standing cost for triggers and never for knowledge.§0
  4. Know the standing bill. Run /context in a fresh session and be able to say what stands there and why.§0 · §9
  5. Every description states what, when, and when not. The negative trigger is not optional where a sibling exists.ladder §9
  6. Every pair of capabilities in scope has a one-sentence distinction. If you cannot say it, the model cannot infer it.ladder §9
  7. Every capability has a golden set of six requests: three that fire it, three near misses.§9
  8. Re-run the golden set after any description edit, including one that arrived in a plugin update. A trigger change is a behavior change.§2 · §9
  9. Every sub-agent declares its grant and its return shape. An omitted grant is the widest one.ladder §10
  10. Skills keep procedure in the body and reference in bundled files. A body that loads a manual is a defect.ladder §2
  11. Anything decidable is decided by code. Measure variance on any answer a gate trusts, and move it to a script when the count is above one.§3 · §6
  12. Buy determinism from the cheap end: a script, then a CLI, then a hook, then a server. Repeatability is not one of the five reasons for a process wall.§7
  13. Tools are shaped like the task, not like the upstream API, and they return the answer rather than the payload.ladder §4
  14. Anything crossing a process wall from outside is data, not instruction, and the constraint that enforces that lives in your harness.ladder §4
  15. Count invocations per capability per week from the transcript. Zero with a standing line is a decision, not a neutral state.§8
  16. Hold a fixed standing budget and a deletion day. Adding a line means removing one or arguing for the budget.§11

12.2 · Three levels, and a cadence for each

conformance levelslevel 2 is where the silence stops
LevelRulesCadenceWhat it gets you
1 · declared1, 2, 5, 6, 9, 10at review time, like codeevery capability has a designed trigger, grant and return. No dead files by accident
2 · measuredlevel 1, plus 4, 7, 8, 15monthly, and on every description edityou know what stands in the window and what fires. The silent failure stops being silent
3 · budgetedlevel 2, plus 3, 11, 12, 16quarterly, on a date in the calendarthe 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.

12.3 · Where I fail it

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.

The one paragraph to keep

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.