pub struct PlanGraph {
pub nodes: Vec<String>,
pub edges: Vec<PlanEdge>,
pub out_edges: Vec<Vec<usize>>,
pub in_edges: Vec<Vec<usize>>,
pub scc_of: Vec<usize>,
pub cycle_edge: Vec<bool>,
pub retries: Vec<u32>,
pub bindings: Vec<Option<String>>,
}Expand description
A validated, indexed plan. Immutable once built — the runtime never mutates a plan, only its own scheduler state.
Fields§
§nodes: Vec<String>§edges: Vec<PlanEdge>§out_edges: Vec<Vec<usize>>Per node: out-edge indices in declaration order — the canonical evaluation order (§6.2).
in_edges: Vec<Vec<usize>>§scc_of: Vec<usize>Per node: SCC id (condensation vertex).
cycle_edge: Vec<bool>Per edge: true iff it is a DFS back-edge in the entry-rooted
traversal (its destination is an ancestor on the recursion path
when the edge is walked) — i.e. it closes a cycle. Removing exactly
the back-edges always leaves an acyclic graph (a standard DFS
edge-classification theorem), which is what lets the scheduler
treat a cycle’s re-entry point as ANY node, not only the plan’s
entry: a back-edge into node i cannot possibly have resolved
before i’s own first run, so step.rs::refresh_readiness excludes
it from i’s generation-0 AND-join (RUN issue #33).
retries: Vec<u32>Per node: re-attempt budget (retries[n] = n re-attempts, so up to
n+1 executions — §6.3’s pinned reading of the field).
bindings: Vec<Option<String>>Per node: the raw binding string from the Workflow (a Tool Definition hash for Bound nodes). Resolution to grains is the driver’s V3/V7.