Skip to main content

Outcome

Enum Outcome 

Source
pub enum Outcome {
#[non_exhaustive]
Done { text: Option<String>, iters: u32, tools_called: u32, usage: Usage, verified: Option<Verdict>, contract: SealSet, seal_breach: Option<String>, },
#[non_exhaustive]
BudgetExhausted { iters: u32, last_text: Option<String>, tools_called: u32, usage: Usage, deadline_reached: bool, },
#[non_exhaustive]
Stuck { reason: String, repeated: u32, iters: u32, last_text: Option<String>, tools_called: u32, usage: Usage, },
#[non_exhaustive]
Cancelled { iters: u32, last_text: Option<String>, tools_called: u32, usage: Usage, }, }
Expand description

Where a run finished. Each variant is #[non_exhaustive] so new fields don’t break downstream matches — always include .. when destructuring.

Variants§

§

#[non_exhaustive]
Done

Model returned text with no tool calls (natural end).

Fields

This variant is marked as non-exhaustive
Non-exhaustive enum variants could have additional fields added in future. Therefore, non-exhaustive enum variants cannot be constructed in external crates and cannot be matched against.
§iters: u32
§tools_called: u32
§usage: Usage
§verified: Option<Verdict>

What the acceptance checks said. None means nothing was asked — so “the model stopped” is all this outcome claims.

§contract: SealSet

The sealed contract as it stood before the model’s first turn.

Carried out of the run because a receipt has to say what was measured, not only that the measurement held. Empty when nothing was sealed.

§seal_breach: Option<String>

Set when a sealed acceptance contract changed during the run.

Distinct from a plain failed verified because the two mean different things to a caller: a failed check is work not finished, this is the measuring instrument having been moved. A host may want to fail a build on the first and page someone on the second.

§

#[non_exhaustive]
BudgetExhausted

Policy budget exhausted before the model stopped requesting tools. Carries everything we know so the caller can recover partial work (saved notes, files written by tools, the last assistant text, etc.) instead of seeing a single bare “budget out” string.

Fields

This variant is marked as non-exhaustive
Non-exhaustive enum variants could have additional fields added in future. Therefore, non-exhaustive enum variants cannot be constructed in external crates and cannot be matched against.
§iters: u32
§last_text: Option<String>
§tools_called: u32
§usage: Usage
§deadline_reached: bool

True when Task::deadline stopped the run rather than max_iters. Both end the same way — a forced final answer — but “ran out of time” and “ran out of steps” call for different responses from the caller, and an unattended long run only ever hits the first.

§

#[non_exhaustive]
Stuck

The agent got stuck and the loop terminated early to save the rest of the budget. Carries partial work (last text, files already written by tools) like BudgetExhausted.

Two independent detectors end here, and reason says which: it repeated the same tool call for StuckPolicy::abort_after rounds without progress, or it worked a single tool for MonotonyPolicy::abort_after rounds without touching anything else. Only the second forces a final synthesis before returning — see the abort site for why.

Fields

This variant is marked as non-exhaustive
Non-exhaustive enum variants could have additional fields added in future. Therefore, non-exhaustive enum variants cannot be constructed in external crates and cannot be matched against.
§reason: String

Human-readable reason, e.g. “repeated read_file(...) 6× without progress” or “called graph_find for 16 consecutive rounds without using any other tool”.

§repeated: u32

How many consecutive rounds the detector counted before aborting.

§iters: u32
§last_text: Option<String>
§tools_called: u32
§usage: Usage
§

#[non_exhaustive]
Cancelled

The caller stopped the run through AgentLoop::with_cancellation before the model reached a natural end. Carries partial work like Stuck does, because the user who pressed Ctrl-C still wants what was done. The loop makes no further model call after this — not even the forced final synthesis the other early exits perform.

A tool that was mid-flight when the token fired may still finish its side effects — a file write on a blocking thread completes, a child process keeps running unless its runner kills it on drop — but its result is discarded before it reaches history. The dispatch is still counted in tools_called — the telemetry run.end line reconciles against that number.

Fields

This variant is marked as non-exhaustive
Non-exhaustive enum variants could have additional fields added in future. Therefore, non-exhaustive enum variants cannot be constructed in external crates and cannot be matched against.
§iters: u32

Iterations completed before the cancel. 0 means the token was already cancelled on entry.

§last_text: Option<String>
§tools_called: u32
§usage: Usage

Trait Implementations§

Source§

impl Clone for Outcome

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Outcome

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more