Skip to main content

NextMove

Enum NextMove 

Source
pub enum NextMove {
    Batch {
        purpose: String,
        steps: Vec<Step>,
    },
    Done {
        summary: String,
        extracted_data: Value,
    },
    Fail {
        reason: String,
    },
    Clarify {
        question: String,
    },
}
Expand description

What the reactive planner decides to do next, given the current state.

Each turn of the agent loop is: observe → ask planner for the next move → execute it → observe again. The planner never commits past the next batch; if the first step of a batch reveals something surprising the planner will see it on the next call and pivot.

The old “upfront Plan with a fixed list of SubGoals” is gone — it forced the LLM to commit to a structure before it had perception, which meant Numbers-on-launch-shows-Open-dialog and similar surprises broke whole runs.

Variants§

§

Batch

Execute this batch of steps one after another, then ask the planner again. A batch is “commit to this short sequence” — typically 1–5 steps. Larger commitments are a smell; use smaller batches and trust the loop to re-plan.

Fields

§purpose: String

Short natural-language description of what this batch is trying to accomplish. Surfaced in logs and failure reports.

§steps: Vec<Step>
§

Done

Goal achieved — return success.

Fields

§summary: String
§extracted_data: Value
§

Fail

Give up — goal can’t be completed given the state.

Fields

§reason: String
§

Clarify

Refuse to act — the goal is too ambiguous or destructive to attempt safely, and the planner is asking the user for clarification instead of guessing.

Terminal like Fail, but distinct in intent: the agent isn’t stuck, it’s deliberately declining to act on insufficient information. Surfaced as GoalOutcome::Refused with question in the summary so the eval harness, CLI, and MCP server can display it back to the user without rendering it as an error.

Use cases (see NEXT_MOVE_SYSTEM_PROMPT for the prompt rule):

  • “Delete it” with no clear referent on screen.
  • “Send the email” with no recipient identified.
  • Destructive prompts (delete / overwrite / send / pay) without explicit confirmation in the goal text.

Fields

§question: String

Trait Implementations§

Source§

impl Clone for NextMove

Source§

fn clone(&self) -> NextMove

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 NextMove

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for NextMove

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Serialize for NextMove

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. 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> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> 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 = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.