any other vendor facet — notably x-suluk-cost (an agent/skill boundary's declared cost; PROVISIONAL per C026).
required, routing-oriented — the field the serving LLM selects on (a lint rejects empty/one-word).
Optionalscopestatic resource:action authz; the agent's complete reachable surface is statically enumerable from the document.
Optionalskillsinstruction bundles; PRESENCE of model is the hard static skill(LLM)-vs-route(deterministic) discriminator.
Optionalroutesdeterministic routes: by-name $refs into EXISTING operations; NO model field, ever.
Optionalagentsby-name sub-agent refs (never inline — inlining would fork C009 identity).
Optionalresourcesby-name refs into the top-level x-suluk-resources catalog (C036) — the loadable, on-demand instructions/references/scripts this agent can ACTIVATE (CF "Agent Skills" alignment; lazy + advisory; resolved at projection, never by the matcher).
OptionalmaxREQUIRED when agents is non-empty (a lint, not the schema): the recursion depth ceiling; a leaf is 0.
Optionaltrustmarks a tier whose retrieved / lower-tier content may NOT escalate scope or upgrade a figure's provenance.
Optionalcontextadvisory per-tier context budget (basis: estimate); fail-loud, never silent-zero.
OptionalthinkingTHINKING ENVELOPE (C029) — a static cap on WITHIN-agent iteration (reason→tool→reason in the SAME completion,
context accreting), orthogonal to maxDepth (which bounds cross-agent nesting depth, a fresh context per hop).
maxRounds is REQUIRED when thinking is present. DECLARED-not-enforced: it bounds re-entries and is consumed
by the context analyzer (round-accretion) + the linter; it NEVER enforces termination, and is NEVER read by the
matcher. The loop TRAJECTORY (when/why each round stops) stays runtime-opaque (matching Strands / the Claude
Agent SDK / OpenAI Agents). There is deliberately NO stopCondition vocabulary — that would model runtime control
flow a generator could only echo. Absent ⇒ opaque single pass (zero-migration default). Conin's 6-round loop.
A composition agent (C027) — an LLM-orchestrated unit. The map KEY is its stable wire-level identity (the emitted MCP-tool / OpenRouter-function id; C009 by-name, never by index). It carries NO Request/Response and is NEVER consulted by the request→operation matcher (D1).
descriptionis required + routing-oriented (the field the serving LLM selects on).routesare deterministic (a by-nameoperationRefinto an existing operation, NOmodel);skillsare LLM (amodelis present).agentsare by-name sub-agent refs;maxDepthis REQUIRED wheneveragentsis non-empty (a typed LEAF =maxDepth0,agents{}), and a cycle-linter rejects name-cycles at author/install time (JSON-Schema cannot express acyclicity). A child's effective scope is INTERSECTION(child, caller), never union. Determinism is DECLARED, never schema-enforced.