Skip to main content

Plan

Struct Plan 

Source
pub struct Plan {
    pub goal: Option<String>,
    pub aggregation: Aggregation,
    pub subtasks: Vec<Subtask>,
}
Expand description

A complete plan, or a fragment of one.

Serializes to TOML as an optional goal + aggregation scalar plus a [[subtask]] array-of-tables. goal is optional precisely so a bare [[subtask]] fragment parses (fragment-validity, §module docs).

Fields§

§goal: Option<String>

The overall goal this plan pursues. None in a fragment.

§aggregation: Aggregation

How child results are combined back into the plan (default Concat).

§subtasks: Vec<Subtask>

The subtasks, as TOML [[subtask]] tables. (Rust field subtasks, TOML key subtask.)

Implementations§

Source§

impl Plan

Source

pub fn from_toml_str(s: &str) -> Result<Self, Error>

Parse a plan (or fragment) from its TOML form.

§Errors

Returns the toml deserialization error on malformed input or an unknown field (the schema is deny_unknown_fields — one canonical shape).

Source

pub fn to_toml_string(&self) -> Result<String, Error>

Serialize this plan to its canonical TOML form.

§Errors

Returns the toml serialization error (should not occur for a well-formed Plan).

Source

pub fn subtask(&self, id: &str) -> Option<&Subtask>

The subtask with id id, if present.

Source

pub fn roots(&self) -> Vec<&Subtask>

Root subtasks — those with no Subtask::parent (the top of the decomposition tree).

Source

pub fn children(&self, id: &str) -> Vec<&Subtask>

Direct children of id — subtasks whose parent is id.

Source

pub fn leaves(&self) -> Vec<&Subtask>

Leaves — subtasks that no other subtask names as parent. A leaf is the dispatch/execute unit (a leaf is a CrewTask); a non-leaf is a branch (grouping / aggregation). In a flat, single-level plan every subtask is a leaf, so this degrades to “all subtasks” — the pre-tree behaviour, so existing flat plans are unaffected.

Source

pub fn next_ready_leaf(&self) -> Option<&Subtask>

The next ready leaf to dispatch — the execution cursor. A leaf that is SubtaskStatus::Pending and whose every dep is SubtaskStatus::Done. None when nothing is ready (all done, every pending leaf is dep-blocked, or work is in flight). A dep counts as satisfied iff the named subtask exists and is Done; an absent (e.g. cross-fragment) dep is treated as unsatisfied, so a plan never runs a leaf ahead of a prerequisite it cannot see.

Source

pub fn next_dispatch(&self, parent: &Caveats) -> Option<(String, CrewTask)>

The next leaf to dispatch, as (id, CrewTask)next_ready_leaf projected through Subtask::to_crew_task. This is the drive loop’s read step: dispatch the CrewTask, then mark the id Done/Failed and call again. None when the plan is complete or stalled (every remaining leaf blocked by a non-Done dep). The id is returned because the projected CrewTask deliberately drops it (it is the plan’s bookkeeping, not the child’s).

Source

pub fn mark(&mut self, id: &str, status: SubtaskStatus, result: Option<String>)

Record a leaf’s outcome — set its status and, when result is Some, its result. No-op if id is absent. The drive loop calls this after each dispatch; marking a leaf Done may unblock its dependents on the next next_dispatch, and marking it Failed leaves them blocked (deps require Done), so the run stops honestly at the first failure without a separate “stop” flag.

Source

pub fn set_instruction(&mut self, id: &str, instruction: &str)

Overwrite a subtask’s instruction by id — used by failure-driven re-grounding (#692) to steer a retried leaf at the symbol’s real file.

Source

pub fn clear_context(&mut self, id: &str)

Drop a subtask’s file scope by id (#812). Used by re-grounding: a reground means the leaf’s grounding was demonstrably wrong, so a derived-from-the-same-grounding fence is stale — the retry runs unfenced rather than deterministically re-refusing the corrected edit.

Source

pub fn set_artifact_commit( &mut self, id: &str, commit: &str, branch: Option<&str>, )

#1062: bind a node to the commit that realizes it — set artifact_ref.commit (and branch when given), preserving any existing pr/branch. This is what lets the objective evaluator (crate::roadmap_eval) close a Task from git truth instead of a human mark. No-op if id is absent.

Source

pub fn set_artifact_issue(&mut self, id: &str, issue: u64)

#1083: bind node id to the forge issue it realizes, preserving any existing branch/commit/pr refs, so the objective evaluator (crate::roadmap_eval) can require the issue CLOSED before Done. No-op if id is absent (same contract as set_artifact_commit).

Source

pub fn next_uncaptured_task_under(&self, plan_id: &str) -> Option<&Subtask>

#1062 auto-capture: the next Task under plan_id that still needs a commit — the leftmost Pending Task in plan_id’s subtree whose artifact_ref.commit is unset. None if plan_id isn’t a Plan, or every Task beneath it is already captured or closed. Document order encodes sibling order, so “leftmost” is the first match — the same rule the DFS cursor uses — giving the 1-commit-→-1-Task default.

Source

pub fn is_complete(&self) -> bool

Every leaf is Done — the plan finished successfully (branches are grouping nodes, so only leaf completion is load-bearing). An empty plan is trivially complete.

Source

pub fn next_ready_node(&self) -> Option<&Subtask>

#1030 tree cursor: the next node to act on in depth-first, sibling order — the leftmost SubtaskStatus::Pending subtask whose every dep is Done and whose direct children are all Done. Generalizes next_ready_leaf to interior nodes: a leaf (no children) is ready as soon as its deps clear; a branch (Roadmap/Phase/Plan grouping) becomes ready only once its subtree has completed — which is exactly when its evaluator should run and fold the children’s results upward, then the cursor returns to the branch’s parent. Document order encodes sibling order, so “leftmost” is the first match. None when nothing is ready (all done, or every pending node is blocked by a dep or an open child).

Source

pub fn subtree_complete(&self, id: &str) -> bool

#1030: is node id and its entire subtree Done? A missing id is false — a node we cannot see is not provably complete (mirroring the unsatisfied-absent-dep rule). The traversal uses this to decide when a branch’s children have all finished so it may return up to the parent.

Source

pub fn path_to(&self, id: &str) -> Vec<String>

#1030: the ancestor chain from the root down to id (inclusive) as a vec of ids — the breadcrumb a driver shows and a resume uses to descend. Empty when id is absent. A cycle in the soft parent pointers is broken by stopping at the first revisited id.

Source

pub fn nodes_of_kind(&self, kind: NodeKind) -> Vec<&Subtask>

#1030: all subtasks of a given NodeKind, in document (sibling) order.

Trait Implementations§

Source§

impl Clone for Plan

Source§

fn clone(&self) -> Plan

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 Plan

Source§

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

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

impl Default for Plan

Source§

fn default() -> Plan

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for Plan

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 Eq for Plan

Source§

impl PartialEq for Plan

Source§

fn eq(&self, other: &Plan) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl Serialize for Plan

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
Source§

impl StructuralPartialEq for Plan

Auto Trait Implementations§

§

impl Freeze for Plan

§

impl RefUnwindSafe for Plan

§

impl Send for Plan

§

impl Sync for Plan

§

impl Unpin for Plan

§

impl UnsafeUnpin for Plan

§

impl UnwindSafe for Plan

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> AnyEq for T
where T: Any + PartialEq,

Source§

fn equals(&self, other: &(dyn Any + 'static)) -> bool

Source§

fn as_any(&self) -> &(dyn Any + 'static)

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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 = 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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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