> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trajectory.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Termination reasons

> Record why a trajectory stopped and how that affects training and evaluation.

Your harness sends `termination_reason`; Trajectory does not infer it from model replies.
Log a valid native grade, including zero, before calling
`client.trajectories.complete(tid, termination_reason=...)`. It returns `status`
`completed` or `finalizing`; both mean the ending was accepted. A `finalizing` trajectory's
capture is still being built: poll `client.trajectories.retrieve(tid)` until its `status`
is `completed` before reading its steps.

| Reason | When the harness sends it |
| - | - |
| `ENV_DONE` | The trajectory finished normally, including a graded wrong answer. This is the default. |
| `ERROR` | A model, environment, or grader failure prevented a valid trajectory. Do not publish an incidental grade as reward. |
| `TIMEOUT` | The harness stopped the actor at its time limit. |
| `TRUNCATION` | A turn, step, output-token, or context limit stopped the actor, or the task required a submission and the actor stopped without one. |

The platform can also record `LIMIT_REACHED` for token or context limits, `MAX_STEPS` for
its turn limit, and `STALE`, `CANCELLED`, or `SANDBOX_*` for execution failures. It preserves
a platform ending even if the harness later calls `complete()`. The
[completion API reference](https://docs.trajectory.ai/api-reference/trajectories/complete-trajectory-route.md) lists all
reasons. A `CANCELLED` status on `trajectory.rollout` does not establish the recorded
termination reason; retrieve the trajectory to check it.

Check `response.choices[0].finish_reason` before dispatching tool calls. A value of
`"length"` or `"max_tokens"` means the reply was cut off; do not execute tool calls from
that reply. If the source evaluator grades the partial answer, log its native grade and
complete with `TRUNCATION`. A clean harness process exit alone does not mean `ENV_DONE`.

Training admits graded `ENV_DONE` trajectories by default. `train_on_truncation`
opts into truncated trajectories, including token and turn limits and missing submissions;
`train_on_timeout` opts into timeouts; `train_on_error` opts into execution errors, grading
errors, and missing grades. All three default to `false`, except that `density_aware_training`
sets `train_on_truncation` to `true`. Included trajectories use training
reward 0 while recorded rewards remain unchanged. Other training filters can still reject a
trajectory or group.

`LIMIT_REACHED` and `MAX_STEPS` count as `TRUNCATION`, and `SANDBOX_*` counts as `ERROR`. In
evaluation, truncations use zero if ungraded and cap positive rewards at zero. `ERROR` counts
as failed in evaluation even when training admits it, and counts toward the training failure
limit unless `train_on_error` is enabled.

After a platform turn, token, or context limit, model requests may return an empty
reply with `metadata.trajectory_termination_reason: "trajectory_cancelled"`. Stop
calling the model and inspect the trajectory's recorded reason. Leave room between
`max_output_tokens_per_turn` and `max_output_tokens_per_trajectory` if the harness must
grade a reply that fills its per-turn allowance.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.