Version 0.1.0. Grade R3/S4.

# F406 Projects that ship a surface to other agents put a counted ceiling on what it costs the consuming agent, held by a test

| Field | Value |
|---|---|
| Status | active |
| Topic | Environment, permissions, and agent-facing products |
| Grade | R3/S4 |
| Cases | Shio, roadkeep, freewilly, winwright |
| Contrary | none |
| Harness facts | H3, H9 |

## Claim

Each project that ships tools, a skill or a command surface for other agents measured what
that surface costs a consuming agent (tool schema, skill text, responses) and held it
under a declared ceiling that a test or lint enforces, and in Shio that check fired and
the change was reshaped rather than the ceiling raised.

## Mechanism

A tool schema or a skill description is paid by every session of every consumer, whether
or not it is used, and it grows one reasonable sentence at a time. A ceiling stated in a
file a test reads turns growth into a failure the author has to answer: trim, split, or
raise the number with a reason. The projects priced the two costs apart: what loads before
any work (tool lists, skill descriptions) and what loads on use (skill bodies, H3; command
responses).

## Observations

- **shio.** "the MCP tool list is a measured budget" [shio@821f18d74:docs/CHANGELOG.md#L31]
  (SH132): the serialized tool list, not the tool count, is held by a test against ceilings
  in a properties file, added on 2026-07-26 [shio@4dd43d396]. The check fired twice in the
  ledger. Adding an op the next day [shio@3312e3035] took the list
  "3 tokens over its 2200 ceiling" [shio@821f18d74:docs/CHANGELOG.md#L22] and a description
  was "trimmed instead of the ceiling raised" [shio@821f18d74:docs/CHANGELOG.md#L22]; a
  proposed op "measured 18 tokens over the per-tool ceiling and pushed" [shio@821f18d74:docs/CHANGELOG.md#L326]
  the list over its total, and was moved off the schema. The response side is benchmarked
  too: "token economy, measured" [shio@f3bc1b51e].
- **roadkeep.** RK1059 named the gap, "the largest every-turn surface is measured and held by nothing" [roadkeep@91754240:docs/CHANGELOG.md#L645],
  and set a per-tool ceiling, "characters = 2850" [roadkeep@91754240:roadkeep.toml#L95],
  raised twice with the reason written beside it ("Raised from 2600" [roadkeep@91754240:roadkeep.toml#L82]),
  and a session ceiling, "session = 69665" [roadkeep@91754240:roadkeep.toml#L232]. The shipped
  skill was measured and split: "the skill names all 44 verbs and costs 65k units a turn" [roadkeep@91754240:docs/CHANGELOG.md#L1099],
  and "the split landed at 11,148 against 65,885 before it" [roadkeep@91754240:tests/test_skill.py#L133].
  Query output is capped as well, after "RK1455 measured one at 117,815 refused" [roadkeep@91754240:roadkeep.toml#L307].
- **freewilly.** The product's agent-facing CLI carries "Ceilings on what the agent surface costs, read by AgentBudgetTests" [freewilly@c1c2eaf:agent-budget.json#L5],
  with tokens estimated as "characters / 4, rounded up" [freewilly@c1c2eaf:agent-budget.json#L15].
  One canonical task is recorded at 6 calls and 11,711 tokens through the raw transport
  [freewilly@c1c2eaf:agent-budget.json#L47-L50] and 4 calls and 812 tokens through the
  shaped surface [freewilly@c1c2eaf:agent-budget.json#L82-L86]. The choice of a CLI over an
  MCP server rests on Shio's schema cost, "Measured at roughly" [freewilly@c1c2eaf:docs/specs/DD33-mcp-is-a-second-head.md#L26]
  2,400 tokens across eleven tools, and a future MCP head is capped at six tools and 1,100
  schema tokens [freewilly@c1c2eaf:agent-budget.json#L256-L257].
- **winwright.** The shipped skill's two costs are tested apart, because "the description sits in context on every" [winwright@861b82e:tests/Winwright.Tests/SkillTests.cs#L12]
  "turn whether or not the skill is ever used, and the body is paid once" [winwright@861b82e:tests/Winwright.Tests/SkillTests.cs#L13]:
  "private const int Description = 700;" [winwright@861b82e:tests/Winwright.Tests/SkillTests.cs#L27]
  and "private const int Body = 6000;" [winwright@861b82e:tests/Winwright.Tests/SkillTests.cs#L33].

## Independence

Four origins. Shio's SH132 is the earliest and is its own. roadkeep's ceilings are its own
lint and tests, recorded against its own growth. freewilly borrowed the argument from Shio,
as its decision record says, but built its own budget file and changed it in response to
its own failures: a band in which a "response that grew by 100 tokens landed inside it silently" [freewilly@c1c2eaf:agent-budget.json#L109]
(DD78), and a gate red for the wrong reason (DD64, [freewilly@ecaad33]), so it counts as a second origin under the copy rule. winwright's skill
test (WW69, 2026-08-26) predates roadkeep's skill split (RK1437, 2026-08-31) and is its own.

## Counter-evidence

H9 weakens the shared premise for tool schemas: with tool search on, which the
documentation read on 2026-09-24 calls the default, Claude Code does not send every tool
definition up front, so the cost Shio and freewilly describe as re-sent on every turn may
now be smaller than their figures. Their measurements count the serialized schema, not
what reached a model's context. The gates also cost something: freewilly's budget gate
went red for the wrong reason, "the budget gate that can go red for the wrong reason" [freewilly@f514e11],
and needed deterministic inputs before it could be trusted. polyweave's surface has no
such ceiling at the pin; its filed task on it is outside the pin.

## Grade

R3: four independent origins in four projects; polyweave has none, so R4 is not reached.
S4: Shio's ledger records its tool-list ceiling being exceeded by a change on two
occasions, and the change was reshaped to pass, which is a check that encodes the finding
seen to fire. The other three projects reach S3 with counted figures.
