Skip to content
Tracon

RunErrorClass

Namespace Tracon · Assembly Tracon.Abstractions.dll

A run error’s class.

[JsonConverter(typeof(JsonStringEnumConverter<RunErrorClass>))]
public enum RunErrorClass

Canceled = 10

Cancelled.

CompilationFailed = 8

The agent definition failed to compile.

ContentBlocked = 11

The content was blocked by Tracon’s own IContentGuard policy (TraconContentBlockedException).

Separate from RunErrorClass.ContentFiltered: the cause is not the provider but the installation’s own rule set. The corresponding action is also different — one calls for loosening provider settings, the other for reviewing the policy.

ContentFiltered = 5

The model response was cut off by the provider’s safety/content filter.

This is not the class for a decision made by Tracon’s own guard; see RunErrorClass.ContentBlocked. Merging the two would make the operator lose the distinction between “the model refused” and “our policy refused.”

Infrastructure = 12

The process running the run disappeared without ever talking to the provider (example: an agent.RunAsync crash with no retry).

Only orphaned-run reconciliation falls into this class. Every other class relies on a response from the provider/tool/quota; this one requires a separate class because no response was ever received.

LoopUnsatisfied = 15

A harness loop reached its iteration ceiling while a criterion still asked for another iteration, and its LoopSettings.OnExhausted fails the run (TraconLoopUnsatisfiedException).

A quality rejection, not a fault: the agent and its model answered. A criterion that THROWS under LoopSettings.OnCriterionError keeps its own class (for an unreachable judge, RunErrorClass.ProviderUnavailable or RunErrorClass.Timeout), so a provider outage is never counted here.

OutputTruncated = 16

The model stopped at its output token limit before a structured (JSON) response was complete (TraconOutputTruncatedException).

Separate from RunErrorClass.StructuredResponseInvalid: the model did not write the wrong JSON, it ran out of room. The action is to raise ModelBinding.MaxOutputTokens, not to change the prompt or the schema, and a repair turn would hit the same limit again, so none runs. A plain-text response cut off at the limit does not fail its run; the run records a RunEventCustomTypes.OutputTruncated event instead.

ProviderError = 1

The model provider or an HTTP call failed: a 5xx, a 4xx, or a connection failure that is not a timeout.

This class tells which fault occurred, not whether a retry helps. A permanent 4xx (any 4xx except 408 and 429, for example a 401 or a 404) is in this class too, and a workflow node retry and the model fallback chain never repeat it.

ProviderUnavailable = 2

The circuit breaker is open (TraconProviderUnavailableException).

QuotaExceeded = 4

A Tracon quota was exhausted, a tenant’s quota refused new work inside a run tree that was already running (TraconTenantQuotaExceededException), or a run tree’s token, cost, or time budget ran out mid-run (TraconRunBudgetExceededException).

RateLimited = 3

The provider returned 429.

StructuredResponseInvalid = 14

The response failed structured output validation (TraconStructuredResponseException).

TenantProviderRefused = 17

The tenant’s provider rules refused the call before it left the process: the tenant’s egress policy does not allow the provider, or the tenant has its own credential for a provider path that cannot use it, or a binding whose key has no value. The error type is tenant_provider_refused.

Separate from RunErrorClass.CompilationFailed and RunErrorClass.ProviderError: no provider was called, and the agent definition is not at fault. The action is to change the tenant’s egress policy or provider binding. The model, a fallback, the summarizer, image generation, speech, embeddings and live voice all report it the same way, and a retry never repeats it.

Timeout = 7

The run exceeded its time limit.

ToolError = 6

A tool threw an exception.

ToolTimeout = 13

A tool call did not settle within its configured timeout (TraconToolTimeoutException).

Separate from RunErrorClass.Canceled: the wrapper’s own linked cancellation looks identical to a user cancellation at the exception type level (OperationCanceledException), and merging the two would hide the reason for every tool timeout behind “the user canceled”. This class does not fail a run — the run continues with a tool error — but the taxonomy applies wherever this exception’s stable identity is classified.

Unknown = 0

Matched no rule. Not a failure, a measurement tool.

The taxonomy is kept small and stable. RunErrorClass.Unknown is not a failure but a measurement tool: a classifier that finds no matching rule does not GUESS an error’s class, it writes into this bucket. A high proportion here shows the taxonomy is incomplete.

Written as a name in JSON; stored as smallint in the database (the same pattern as every other runs enum, for example RunKind). Once assigned, numeric values are never renumbered: they are stored permanently in past rows. A new class is added to the end of the list, not inserted in order.