Skip to content

Runs, steps, turns and actions

Everything Brutor measures about an AI System — cost, drift, health, conformance — is counted in a small set of units. They are worth learning precisely, because they are the same names the wider ecosystem uses: a number here means the same thing as the number on your orchestrator’s dashboard.

If you are new to the AI stack, six terms carry everything that follows:

Term What it means
LLM A Large Language Model: a text engine — you send text, it returns text. Crucially it is non-deterministic: the same input can produce different output on every call. You cannot write assertEquals against it.
Token The unit of LLM work and billing, roughly ¾ of a word. Cost is per token, so cost is a runtime variable, not a fixed line item.
Action One individual call through the gateway — an LLM request, a tool call, a delegation to another agent, a skill execution. The leaf of everything below.
Turn One pass of the agent loop: a model call plus the actions it triggered. If you build on the OpenAI or Anthropic SDKs this is the unit their max_turns counts.
Step A logical phase of the plan — “research”, “settle”. One step contains one or more turns. Only your orchestrator knows where a phase begins, so Brutor records it only if you tell it.
Run One end-to-end task: everything it took to finish one job, tied together by a correlation ID.
Run one task, start to finish
└── Step a phase of the plan — you assert it, or it is absent
└── Turn one pass of the agent loop — asserted, or inferred
└── Action one governed call — always observed

The distinction is load-bearing: one model call plus two tool calls is three actions but one turn. An agent that classifies a question, looks a customer up, loads a policy skill, escalates to a peer agent and composes an answer has made six calls to do one job — and that is one run.

When an agent delegates to another agent (over A2A), the crossing is a hop — what the orchestration frameworks call a handoff. The delegated agent’s work still belongs to the same run; the run records its delegation depth.

What Brutor observes, infers, or only records on your word

Section titled “What Brutor observes, infers, or only records on your word”

Each unit has a different epistemic status, and Brutor never rounds them up:

  • Actions are observed. Every governed call passes through the gateway; the leaf count is always real.
  • Turns are inferred or asserted. A model call opens a turn, so turn boundaries can be worked out from traffic — unless you assert them precisely with X-Brutor-Turn-Id. The ledger records which way it got the count, so an inferred number is never reported as one you gave it.
  • Steps are asserted only, never inferred. Nothing in the traffic distinguishes “still researching” from “now drafting” — that decision lives in your orchestrator. A run where you assert no phases reads unphased, which is a different statement from “this run had one phase”.
  • Runs are grouped two ways: gateway-delegated calls ride an HMAC-signed call chain the gateway mints; self-driving loops group their own calls with one header, x-brutor-run-id. The mechanics — and what happens when you send no headers at all — are on the run ledger page.