pub struct ExplorationReport {
pub workflow: WorkflowKey,
pub workflow_version: WorkflowVersion,
pub limits: ExplorationLimits,
pub states_explored: usize,
pub transitions_simulated: usize,
pub max_depth_reached: usize,
pub truncated: bool,
pub reached_phases: Vec<Value>,
pub reached_outcomes: Vec<Value>,
pub violations: Vec<ExplorationViolation>,
}Expand description
Everything one bounded exploration observed.
Fields§
§workflow: WorkflowKeyThe workflow explored.
workflow_version: WorkflowVersionThe version that produced the projections.
limits: ExplorationLimitsThe limits the search ran under.
states_explored: usizeNumber of distinct states visited.
transitions_simulated: usizeNumber of candidate commands simulated.
max_depth_reached: usizeGreatest depth reached.
truncated: booltrue when a limit stopped the search before the frontier was empty.
A truncated report proves that nothing it visited is broken, not that
nothing is; the unreachable-outcome check is skipped for it.
reached_phases: Vec<Value>Canonical JSON of every phase projected by a reachable state, in the order first reached.
§Why a count of states was not enough
states_explored and truncated say how much was looked at, never
where. A workflow’s eleven required fields are eleven steps of a
breadth-first search, and the standard budget ran out at depth eight:
four phases of the workflow — the optional question, the summary, its
rejection and the promotion — were never projected at all. Every
invariant reported clean over half a workflow for months, and the
catalogue check found nothing because it never reached the phase where
something was wrong.
truncated did say so, and it is a blunt instrument: a workflow with a
large collection half truncates every time, so the flag stops carrying
information. The question worth asking is whether the search saw every
phase, and that is Self::reached_phase.
reached_outcomes: Vec<Value>Canonical JSON of every outcome projected by a reachable state, in the order first reached.
violations: Vec<ExplorationViolation>Every rule broken, in the order found.
Implementations§
Source§impl ExplorationReport
impl ExplorationReport
Sourcepub fn reached_phase<T: Serialize + ?Sized>(&self, phase: &T) -> bool
pub fn reached_phase<T: Serialize + ?Sized>(&self, phase: &T) -> bool
Returns true when a reachable state projected phase.
What turns “no violations found” into “no violations found, and here is where I looked”. Assert it for every phase a workflow declares, and a budget that stops short becomes a failing test instead of a clean one.
Trait Implementations§
Source§impl Clone for ExplorationReport
impl Clone for ExplorationReport
Source§impl Debug for ExplorationReport
impl Debug for ExplorationReport
Source§impl<'de> Deserialize<'de> for ExplorationReport
impl<'de> Deserialize<'de> for ExplorationReport
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for ExplorationReport
Source§impl PartialEq for ExplorationReport
impl PartialEq for ExplorationReport
Source§impl Serialize for ExplorationReport
impl Serialize for ExplorationReport
impl StructuralPartialEq for ExplorationReport
Auto Trait Implementations§
impl Freeze for ExplorationReport
impl RefUnwindSafe for ExplorationReport
impl Send for ExplorationReport
impl Sync for ExplorationReport
impl Unpin for ExplorationReport
impl UnsafeUnpin for ExplorationReport
impl UnwindSafe for ExplorationReport
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.