KDCube
← Our Journal

We switched the code-execution tool off for an agent and asked it what it can do. It answered, among other things: “Execute code (Python, shell, etc.) to process data.” It had no such tool. The rendered instruction showed why it believed otherwise: the reply protocol still taught the code channel in every section, a catalog section listed helpers callable only from generated code, and the read tool's own documentation said “inspect binary files with code and exec tool.”

The lesson generalizes past exec. The concepts in an instruction exist for the model only through that instruction — it has no prior about our channels, our tools, our contracts. Whatever the text teaches, the agent has; whatever it teaches about a tool that is absent, the agent hallucinates. So the instruction cannot be a fixed document that mentions capabilities. It must be computed from what the agent actually has.

One authority

What an agent has is its effective tool roster: the tools its app config declares for it, intersected with what the user selected for the conversation. At turn start the roster binds into adapters — one record per tool — and the set of adapter ids is the single input every conditioning decision reads. There is one mapping from ids to consequences, so the body, the protocol, and the catalogs can never disagree about whether a capability exists.

effective tool roster app config ⊕ user pick web_tools.web_search rendering_tools.write_pdf exec_tools.execute_code…? one authority adapter ids → teaching conditional rendering capability blocks · code channel · body sections · code-snippet catalog section roster-proof text generic surfaces speak capability classes: file-processing · computation · capped outputs composition from the roster named-services block lists exactly the connected namespaces catalog contract renders in full — never cut
One authority, three kinds of consequence.

Six mechanisms, three kinds

Conditional rendering — teaching that appears exactly when its tool is wired:

  • Capability blocks. The exec, rendering, and web teaching blocks render only with their tool present — even when a named profile lists them. A profile is an administrator's convenience, never authority to advertise a tool the user disabled.
  • The reply protocol's code channel. The protocol teaches the base channels — thinking, action, an optional final summary — and says that a connected tool may extend the protocol with a channel of its own. The code channel is such an extension: with exec present the protocol says “4 channel types” and shows rounds with code; without it, “3 channel types”, and the worked examples use the workspace write tool. The parser accepts both shapes.
  • The extended body's exec sections. The full default body drops its code-generation sections through the same gate — derived from the same id set, so the tiers cannot drift apart.
  • The code-snippet catalog section. Tools callable only from generated code are advertised only when there is a way to generate code. Listing them without exec is exactly the misread that opened this entry.

Roster-proof text — the inverse mechanism:

  • Generic surfaces speak in capability classes. The always-present text — the loop's own tool docs, the protocol's visibility rule, the paths and workspace guidance — names no opt-outable tool. It says file-processing tools (operate on local physical files), computation tools (create smaller derived artifacts), the producing tool's external visibility, every tool output is capped. A present tool matches its class through its own catalog entry; an absent tool is simply never named. A regression test fails the build if any exec signal appears in an exec-less composition.

Composition from the roster

  • The named-services block. The namespace teaching renders only when named-service connections are configured, and closes with the roster of exactly the connected namespaces. No connections, no vocabulary.

The catalog's own rule: never cut a contract

The tool catalog — the rendered inventory of the roster — has a companion rule. It renders in a full or a compact form, and the difference is purely format: dense lines and no prose examples versus banner layout. Each tool's contract — purpose, every parameter description, the return description, the constraints — renders in full in both.

We learned this the same week: a compact form that trimmed a 7,700-character purpose to 240 characters had silently cut the middle of the exec contract, and the model acted on the missing half. A truncated description is a lost contract; if catalog size must shrink, the honest lever is fewer tools in the roster — never shorter truths about them.

The meter

Because the projection in the agent configuration forge composes through these same functions, every lever shows its real price while you configure: toggle the exec tool off in a draft and the projected instruction shrinks in the body and the catalog at once — exactly what the live agent would receive. On one measured roster, the catalog alone moved from 10.7k tokens (full form) to 3.1k (compact); removing a tool moves both numbers and the teaching with them.

The full picture

This entry owns conditioning: how the roster decides what the instruction teaches. Its companions: the input's anatomy (what the model input is made of), the choice (profiles, custom sets, and the per-conversation pick), and signal parity (how three instruction sizes keep the same rules).

KDCube Journal · Entry № 22 · 26.07.2026