tools
The agent-tool projection (EXPERIMENTAL x/ tier; stream 18): ONE tool-descriptor model derived from command definitions ([effects]-bearing [?def]s — clause presence is the discriminator) at list time, no materialized manifest. Two lanes over the same module source: [$cx:ast] for the structured defs (params, effects, requires, idempotent, returns, Tier-1 def text), [$cx:parse] for the [fn-doc] blocks ([summary] required for projectability — fail-loud; [param-doc] → per-property descriptions). Descriptors carry name, description, inputSchema/outputSchema (stream-16 carrier conventions), the L142 hint set (read-only / idempotent / destructive / open-world), and [meta] with the Tier-1 source address, the Tier-2 code address, schema content hashes, and cap: requirements. The MCP and A2A adapters consume these descriptors; annotations are HINTS — enforcement stays at the effect point and the propose boundary.
Experimental x/ tier — imported as cx-x/tools. Bundled and gated in-tree like any other module, but EXEMPT from the frozen-surface stability promise (std-lib README, decision D3): a semver-breaking change is allowed here while the surface settles, and the frozen-surface canary never counts it. Pin behaviour you depend on with your own fixtures.
tools:type-schema-of
[$tools:type-schema-of] ($kind::string) -> map — Map one scalar/collection kind name to its JSON-Schema fragment (stream-16 carrier conventions: decimal/bigint/temporals/bytes ride string carriers).
tools:descriptors-of
[$tools:descriptors-of] ($source::string) -> [sequence element] | [err …] — Project a module's command defs to tool descriptors — the ONE descriptor model both protocol adapters consume. Fail-loud: a command def without a [fn-doc][summary] refuses the whole projection with one [err [missing-summary def=…]…] value.