# RunErrorClass

> Tracon documentation. Tracon is a .NET package family that adds a control
> plane on Microsoft Agent Framework, published as NuGet packages that run
> inside your own ASP.NET Core application.
>
> Page: https://tracon.dev/api/tracon.runerrorclass/
> Summary: RunErrorClass: A run error's class.

<div class="api-provenance">Namespace Tracon · Assembly <code>Tracon.Abstractions.dll</code></div>

A run error's class.

```csharp
[JsonConverter(typeof(JsonStringEnumConverter<RunErrorClass>))]
public enum RunErrorClass
```

## Fields

`Canceled = 10` 

Cancelled.

`CompilationFailed = 8` 

The agent definition failed to compile.

`ContentBlocked = 11` 

The content was blocked by Tracon's own [IContentGuard](/api/tracon.icontentguard/)
policy ([TraconContentBlockedException](/api/tracon.traconcontentblockedexception/)).

Separate from [RunErrorClass.ContentFiltered](/api/tracon.runerrorclass/): 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](/api/tracon.runerrorclass/). 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](/api/tracon.loopsettings/#Tracon_LoopSettings_OnExhausted) fails the run
([TraconLoopUnsatisfiedException](/api/tracon.traconloopunsatisfiedexception/)).

A quality rejection, not a fault: the agent and its model answered. A criterion
that THROWS under [LoopSettings.OnCriterionError](/api/tracon.loopsettings/#Tracon_LoopSettings_OnCriterionError) keeps its own class
(for an unreachable judge, [RunErrorClass.ProviderUnavailable](/api/tracon.runerrorclass/) or
[RunErrorClass.Timeout](/api/tracon.runerrorclass/)), 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](/api/tracon.traconoutputtruncatedexception/)).

Separate from [RunErrorClass.StructuredResponseInvalid](/api/tracon.runerrorclass/): the model did not write
the wrong JSON, it ran out of room. The action is to raise
[ModelBinding.MaxOutputTokens](/api/tracon.modelbinding/#Tracon_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](/api/tracon.runeventcustomtypes/#Tracon_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](/api/tracon.traconproviderunavailableexception/)).

`QuotaExceeded = 4` 

A Tracon quota was exhausted, a tenant's quota refused new work inside a run
tree that was already running ([TraconTenantQuotaExceededException](/api/tracon.tracontenantquotaexceededexception/)),
or a run tree's token, cost, or time budget ran out mid-run
([TraconRunBudgetExceededException](/api/tracon.traconrunbudgetexceededexception/)).

`RateLimited = 3` 

The provider returned 429.

`StructuredResponseInvalid = 14` 

The response failed structured output validation
([TraconStructuredResponseException](/api/tracon.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](/api/tracon.runerrorclass/) and [RunErrorClass.ProviderError](/api/tracon.runerrorclass/):
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](/api/tracon.tracontooltimeoutexception/)).

Separate from [RunErrorClass.Canceled](/api/tracon.runerrorclass/): the wrapper's own linked
cancellation looks identical to a user cancellation at the exception
type level ([OperationCanceledException](https://learn.microsoft.com/dotnet/api/system.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.

## Remarks

The taxonomy is kept small and stable. [RunErrorClass.Unknown](/api/tracon.runerrorclass/) 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](/api/tracon.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.
