Skip to content

ADR-0006: Controlled Tool Execution

Status: Accepted

Date: 2026-08-21

Context

Tool execution can cross a critical trust boundary. Treating model-supplied input as commands, code, filesystem paths, URLs, or provider configuration would allow unbounded side effects and leakage. The runtime needs a useful extension point without granting ambient authority to models or HTTP callers.

Decision

Trussium will execute only explicitly registered, in-process tool objects through a dedicated tools.executions capability. Each tool has a stable name, immutable public definition, Pydantic-validated JSON-object input, and an asynchronous handler. A request identifies one registered tool and validated arguments.

The initial capability uses a positive shared timeout and returns a provider-neutral structured result with stable HTTP failures. Tool names, execution context, and stable outcomes may be logged; arguments, results, credentials, and exception messages must not be logged. No tool is executable unless application composition registers it.

Consequences

  • Models and callers have no arbitrary command, code, filesystem, network, or plugin authority.
  • Applications retain explicit ownership of every side-effecting handler.
  • Approval workflows, policy engines, remote tools, dynamic discovery, and agent-directed selection require separate future decisions.

Alternatives Considered

  • Shell or subprocess execution: rejected because command input cannot be safely bounded by a generic runtime.
  • Arbitrary HTTP tools: rejected because SSRF, credentials, and egress policy require a separate security architecture.
  • Implicit function discovery: rejected because declared registration is the auditable allowlist.