MachineTest
Property-based scenario generation and planner trace utilities.
Constructors
17declare function advanceCommand<Event = never>(duration: Input): RuntimeCommand<Event>
Constructs a command that advances Effect's TestClock.
declare function checkpointCommand<Event = never>(label?: string): RuntimeCommand<Event>
Constructs a no-op command used to synchronize with work enqueued by earlier commands. Its behavior is selected by the reference-model step.
declare function compileModel(model: FiniteModel): Any
Compiles a finite model into a real machine using only public definition, construction, and handler APIs.
Hand-authored models are validated before compilation. This compiler is a testing adapter, not the independent reference interpreter used by later conformance stages.
declare function finiteModels(options: FiniteModelOptions): FiniteModels
Generates bounded, structurally valid hierarchical statechart models.
Generation is composed from shrinkable topology, initial-state, event, and transition decisions. Paths and transition candidates are rebuilt after a topology shrink, so a shrink can never retain a dangling source or target. Generated automatic transitions are acyclic by construction: always transitions leave atomic sources and completion transitions leave compound or parallel sources. Separate focused witnesses cover cyclic stabilization.
declare const Invariant: {
readonly state: <M extends Any>(name: string, check: (context: StateInvariantContext<M>) => InvariantOutcome, options?: StateInvariantOptions<M>) => StateInvariant<M>;
readonly step: <M extends Any>(name: string, check: (context: StepInvariantContext<M>) => InvariantOutcome, options?: InvariantOptions<StepInvariantContext<M>>) => StepInvariant<M>;
readonly trace: <M extends Any>(name: string, check: (context: TraceInvariantContext<M>) => InvariantOutcome, options?: InvariantOptions<TraceInvariantContext<M>>) => TraceInvariant<M>;
}
Direct invariant constructors. Prefer invariants(machine) when contextual machine types should be inferred without an explicit type argument.
declare const invariants: <M extends AnyMachine>(machine: M) => InvariantBuilder<M>
Creates invariant constructors bound to a machine's exact state and event types. The machine is used only for inference; invariant evaluation remains pure and reusable across traces from that machine.
import { Schema } from "effect"
import { Machine } from "@typeonce/effect-machine"
import { MachineTest } from "@typeonce/effect-machine/testing"
class Count extends Schema.TaggedClass<Count>("Count")("Count", {
value: Schema.Number
}) {}
const States = Machine.defineStates({ Count })
const machine = Machine.make({
states: States.states,
events: [],
initial: () => States.initial.Count(new Count({ value: 0 }))
}).handle({ Count: {} })
const nonNegative = MachineTest.invariants(machine).state(
"count is non-negative",
({ snapshot }) => snapshot.value.value >= 0
)
declare const run: <M extends AnyMachine>(machine: ReadyMachine<M>, scenario: Scenario<M>) => Effect.Effect<Trace<M>, RunFailure<RunError<M>, M>, RunServices<M>>
Executes a generated scenario exclusively through planInitial and plan.
Staged actions are retained in each plan but are never executed. Every event is planned, including events that occur after a terminal configuration. Typed planning errors retain the scenario and successfully completed prefix in a RunFailure.
import { Schema } from "effect"
import { Machine } from "@typeonce/effect-machine"
import { MachineTest } from "@typeonce/effect-machine/testing"
class Idle extends Schema.TaggedClass<Idle>("Idle")("Idle", {}) {}
const States = Machine.defineStates({ Idle })
const machine = Machine.make({
states: States.states,
events: [],
initial: () => States.initial.Idle.from()
}).handle({ Idle: {} })
const trace = MachineTest.run(machine, { events: [] })
declare function runCausalCommands<M extends Any, Error, Output, Model, Expected, Observed = never, ModelError = never, ModelServices = never, InspectionError = never, InspectionServices = never, AssertionError = never, AssertionServices = never>(probe: Probe<M, Error, Output>, commands: Iterable<RuntimeCommand<InputEvent<M>>>, options: CausalRuntimeModelOptions<M, Model, Expected, Error, Output, Observed, ModelError, ModelServices, InspectionError, InspectionServices, AssertionError, AssertionServices>): Effect<CausalRuntimeTranscript<M, Model, Expected, Error, Output, Observed>, CausalRuntimeCommandFailure<Error | ModelError | InspectionError | AssertionError | RuntimeObservationError, M, Model, Expected, Error, Output, Observed>, ModelServices | InspectionServices | AssertionServices>
Runs typed commands against a probe and checks them against an Effect-native reference model.
Every accepted Send completes its exact managed runtime macrostep before inspection, assertion, and the next command. Use probe.await.until only for later asynchronous work such as timer, invoke, or child delivery. Processing failures are attributed to the exact submitted command and retain the successfully checked prefix for FastCheck shrinking and replay.
Use runEnqueuedCommands instead when the behavior under test intentionally depends on burst enqueueing or outstanding mailbox work.
declare function runEnqueuedCommands<Model, Expected, State, Event, Error, Output, Observed = never, ModelError = never, ModelServices = never, InspectionError = never, InspectionServices = never, AssertionError = never, AssertionServices = never>(ref: MachineRef<State, Event, Error, Output>, commands: Iterable<RuntimeCommand<Event>>, options: RuntimeModelOptions<Model, Expected, State, Event, Error, Output, Observed, ModelError, ModelServices, InspectionError, InspectionServices, AssertionError, AssertionServices>): Effect<RuntimeTranscript<Model, Expected, State, Event, Error, Output, Observed>, RuntimeCommandFailure<RuntimeObservationError | ModelError | InspectionError | AssertionError, Model, Expected, State, Event, Error, Output, Observed>, ModelServices | InspectionServices | AssertionServices>
Runs typed commands against a live MachineRef and checks them against a supplied Effect-native reference model.
The runner observes only public MachineRef behavior. In particular, a successful send means enqueue acceptance, not completed processing. A model must request Next/Until only when it predicts a publication, or use an explicit checkpoint to drain previously enqueued work. Machine emissions can be captured by the runtime service used by the machine and returned from the optional inspect effect.
Typed failures and defects from model transitions, command execution, inspection, and assertions are retained as full Cause values. A cause containing only interruption is propagated as interruption so cancelling a property run cannot be mistaken for a machine counterexample.
declare const runRuntimeCommands: typeof runEnqueuedCommands
Compatibility alias for enqueue-oriented runtime command execution.
declare function runtimeCommands<M extends Any>(machine: M, options: RuntimeCommandsOptions<M>): RuntimeCommands<M>
Derives a shrinkable command sequence from public event schemas and explicit clock/stop/checkpoint command choices.
This deliberately returns ordinary Effect FastCheck arbitraries instead of adapting the runner through asyncModelRun: the latter requires Promise callbacks and would erase Effect error and service channels.
declare const runtimeInvariants: <M extends AnyMachine>(machine: M) => RuntimeInvariantBuilder<M>
Creates reusable semantic laws for causal runtime evidence.
declare const RuntimeSynchronization: {
readonly current: {
readonly _tag: "Current";
};
readonly next: {
readonly _tag: "Next";
};
readonly none: {
readonly _tag: "None";
};
readonly until: <State, Error = never, Output = never>(predicate: (snapshot: RuntimeSnapshot<State, Error, Output>) => boolean) => RuntimeSynchronization<State, Error, Output>;
}
Constructors for runtime synchronization policies.
declare const scenarios: <M extends AnyMachine>(machine: M, options?: ScenarioOptions<M>) => Scenarios<M>
Derives valid machine inputs and public events from their schemas.
Unsupported schema derivations fail immediately through Schema.toArbitrary. Non-fatal derivation warnings are returned instead of being hidden.
import { Schema } from "effect"
import { Machine } from "@typeonce/effect-machine"
import { MachineTest } from "@typeonce/effect-machine/testing"
class Idle extends Schema.TaggedClass<Idle>("Idle")("Idle", {}) {}
class Reset extends Schema.TaggedClass<Reset>("Reset")("Reset", {}) {}
const States = Machine.defineStates({ Idle })
const machine = Machine.make({
states: States.states,
events: [Reset],
initial: () => States.initial.Idle.from()
}).handle({ Idle: { on: { Reset: () => States.initial.Idle.from() } } })
const generated = MachineTest.scenarios(machine, { maxEvents: 5 })
declare function sendCommand<Event>(event: Event): RuntimeCommand<Event>
Constructs a command that sends one public event.
declare function stopCommand<Event = never>(): RuntimeCommand<Event>
Constructs an idempotent command that stops the machine.
declare function verifyCausalCommands<M extends Any, Error, Output>(probe: Probe<M, Error, Output>, commands: Iterable<RuntimeCommand<InputEvent<M>>>, options: CausalVerificationOptions<M, Error, Output>): Effect<CausalVerificationTranscript<M, Error, Output>, CausalRuntimeCommandFailure<RuntimeObservationError | Error, M, undefined, undefined, Error, Output, never> | RuntimeInvariantError<M>>
Causally executes commands and checks reusable runtime invariants without requiring a dummy reference model. Use runCausalCommands when exact expected results come from an application model.
Errors
11declare class CausalRuntimeCommandFailure<Failure = unknown, M extends AnyMachine = AnyMachine, Model = unknown, Expected = unknown, Error = unknown, Output = unknown, Observed = unknown> extends YieldableError<this> & {
readonly _tag: "MachineTestCausalRuntimeCommandFailure";
} & Readonly<{
readonly attempted: CausalRuntimeCommandAttempt<M, Model, Expected, Error, Output, Observed> | undefined;
readonly cause: Cause<Failure>;
readonly command: RuntimeCommand<InputEvent<M>>;
readonly index: number;
readonly phase: "model" | "execution" | "observation" | "inspection" | "assertion";
readonly prefix: readonly Array<CausalRuntimeCommandRecord<M, Model, Expected, Error, Output, Observed>>;
}> {
constructor<Failure = unknown, M extends Any = Any, Model = unknown, Expected = unknown, Error = unknown, Output = unknown, Observed = unknown>(args: {
readonly attempted: CausalRuntimeCommandAttempt<M, Model, Expected, Error, Output, Observed> | undefined;
readonly cause: Cause<Failure>;
readonly command: RuntimeCommand<InputEvent<M>>;
readonly index: number;
readonly phase: "model" | "execution" | "observation" | "inspection" | "assertion";
readonly prefix: readonly Array<CausalRuntimeCommandRecord<M, Model, Expected, Error, Output, Observed>>;
});
readonly _tag: "MachineTestCausalRuntimeCommandFailure";
readonly ~effect/Effect: Variance<never, CausalRuntimeCommandFailure<Failure, M, Model, Expected, Error, Output, Observed>, never>;
readonly ~effect/ErrorReporter/attributes?: ReadonlyRecord<string, unknown>;
readonly ~effect/ErrorReporter/ignore?: boolean;
readonly ~effect/ErrorReporter/severity?: Severity;
readonly ~effect/Runtime/errorExitCode?: number;
readonly ~effect/Runtime/errorReported?: boolean;
readonly attempted: CausalRuntimeCommandAttempt<M, Model, Expected, Error, Output, Observed> | undefined;
cause: Cause<Failure>;
readonly command: RuntimeCommand<InputEvent<M>>;
readonly index: number;
message: string;
name: string;
readonly phase: "model" | "execution" | "observation" | "inspection" | "assertion";
readonly prefix: readonly Array<CausalRuntimeCommandRecord<M, Model, Expected, Error, Output, Observed>>;
stack?: string;
[iterator](): EffectIterator<Effect<never, CausalRuntimeCommandFailure<Failure, M, Model, Expected, Error, Output, Observed>, never>>;
[NodeInspectSymbol](): unknown;
pipe<A>(this: A): A;
pipe<A, B = never>(this: A, ab: (_: A) => B): B;
pipe<A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C;
pipe<A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D;
pipe<A, B = never, C = never, D = never, E = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E): E;
pipe<A, B = never, C = never, D = never, E = never, F = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F): F;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G): G;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H): H;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I): I;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J): J;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K): K;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L): L;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M): M;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N): N;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O): O;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P): P;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q): Q;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R): R;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S): S;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T): T;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
toJSON(): unknown;
toString(): string;
}
A typed causal command-model failure retaining the successfully checked prefix and exact attempted command.
declare class InvariantError<M extends AnyMachine = AnyMachine> extends YieldableError<this> & {
readonly _tag: "MachineTestInvariantError";
} & Readonly<{
readonly report: InvariantReport;
readonly trace: Trace<M>;
readonly violations: readonly Array<InvariantViolation<M>>;
}> {
constructor<M extends Any = Any>(args: {
readonly report: InvariantReport;
readonly trace: Trace<M>;
readonly violations: readonly Array<InvariantViolation<M>>;
});
readonly _tag: "MachineTestInvariantError";
readonly ~effect/Effect: Variance<never, InvariantError<M>, never>;
readonly ~effect/ErrorReporter/attributes?: ReadonlyRecord<string, unknown>;
readonly ~effect/ErrorReporter/ignore?: boolean;
readonly ~effect/ErrorReporter/severity?: Severity;
readonly ~effect/Runtime/errorExitCode?: number;
readonly ~effect/Runtime/errorReported?: boolean;
cause?: unknown;
message: string;
name: string;
readonly report: InvariantReport;
stack?: string;
readonly trace: Trace<M>;
readonly violations: readonly Array<InvariantViolation<M>>;
[iterator](): EffectIterator<Effect<never, InvariantError<M>, never>>;
[NodeInspectSymbol](): unknown;
pipe<A>(this: A): A;
pipe<A, B = never>(this: A, ab: (_: A) => B): B;
pipe<A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C;
pipe<A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D;
pipe<A, B = never, C = never, D = never, E = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E): E;
pipe<A, B = never, C = never, D = never, E = never, F = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F): F;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G): G;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H): H;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I): I;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J): J;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K): K;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L): L;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M): M;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N): N;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O): O;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P): P;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q): Q;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R): R;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S): S;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T): T;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
toJSON(): unknown;
toString(): string;
}
All semantic violations found in one trace, together with the complete counterexample and aggregate report.
declare class ModelVerificationError extends YieldableError<this> & {
readonly _tag: "MachineTestModelVerificationError";
} & Readonly<{
readonly mismatches: readonly Array<ModelVerificationMismatch>;
}> {
constructor(args: {
readonly mismatches: readonly Array<ModelVerificationMismatch>;
});
readonly _tag: "MachineTestModelVerificationError";
readonly ~effect/Effect: Variance<never, ModelVerificationError, never>;
readonly ~effect/ErrorReporter/attributes?: ReadonlyRecord<string, unknown>;
readonly ~effect/ErrorReporter/ignore?: boolean;
readonly ~effect/ErrorReporter/severity?: Severity;
readonly ~effect/Runtime/errorExitCode?: number;
readonly ~effect/Runtime/errorReported?: boolean;
cause?: unknown;
message: string;
readonly mismatches: readonly Array<ModelVerificationMismatch>;
name: string;
stack?: string;
[iterator](): EffectIterator<Effect<never, ModelVerificationError, never>>;
[NodeInspectSymbol](): unknown;
pipe<A>(this: A): A;
pipe<A, B = never>(this: A, ab: (_: A) => B): B;
pipe<A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C;
pipe<A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D;
pipe<A, B = never, C = never, D = never, E = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E): E;
pipe<A, B = never, C = never, D = never, E = never, F = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F): F;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G): G;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H): H;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I): I;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J): J;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K): K;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L): L;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M): M;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N): N;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O): O;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P): P;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q): Q;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R): R;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S): S;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T): T;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
toJSON(): unknown;
toString(): string;
}
All semantic disagreements found for one finite-model trace.
declare class PlannerRuntimeAgreementError<M extends AnyMachine = AnyMachine> extends YieldableError<this> & {
readonly _tag: "MachineTestPlannerRuntimeAgreementError";
} & Readonly<{
readonly evidence: CausalRuntimeEvidence<M, unknown, unknown>;
readonly violations: readonly Array<PlannerRuntimeAgreementViolation<M>>;
}> {
constructor<M extends Any = Any>(args: {
readonly evidence: CausalRuntimeEvidence<M, unknown, unknown>;
readonly violations: readonly Array<PlannerRuntimeAgreementViolation<M>>;
});
readonly _tag: "MachineTestPlannerRuntimeAgreementError";
readonly ~effect/Effect: Variance<never, PlannerRuntimeAgreementError<M>, never>;
readonly ~effect/ErrorReporter/attributes?: ReadonlyRecord<string, unknown>;
readonly ~effect/ErrorReporter/ignore?: boolean;
readonly ~effect/ErrorReporter/severity?: Severity;
readonly ~effect/Runtime/errorExitCode?: number;
readonly ~effect/Runtime/errorReported?: boolean;
cause?: unknown;
readonly evidence: CausalRuntimeEvidence<M, unknown, unknown>;
message: string;
name: string;
stack?: string;
readonly violations: readonly Array<PlannerRuntimeAgreementViolation<M>>;
[iterator](): EffectIterator<Effect<never, PlannerRuntimeAgreementError<M>, never>>;
[NodeInspectSymbol](): unknown;
pipe<A>(this: A): A;
pipe<A, B = never>(this: A, ab: (_: A) => B): B;
pipe<A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C;
pipe<A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D;
pipe<A, B = never, C = never, D = never, E = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E): E;
pipe<A, B = never, C = never, D = never, E = never, F = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F): F;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G): G;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H): H;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I): I;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J): J;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K): K;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L): L;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M): M;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N): N;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O): O;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P): P;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q): Q;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R): R;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S): S;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T): T;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
toJSON(): unknown;
toString(): string;
}
Raised when live causal evidence disagrees with a fresh pure plan.
declare class ProbeUnavailableError extends YieldableError<this> & {
readonly _tag: "MachineTestProbeUnavailableError";
} & Readonly<{
readonly message: string;
}> {
constructor(args: {
readonly message: string;
});
readonly _tag: "MachineTestProbeUnavailableError";
readonly ~effect/Effect: Variance<never, ProbeUnavailableError, never>;
readonly ~effect/ErrorReporter/attributes?: ReadonlyRecord<string, unknown>;
readonly ~effect/ErrorReporter/ignore?: boolean;
readonly ~effect/ErrorReporter/severity?: Severity;
readonly ~effect/Runtime/errorExitCode?: number;
readonly ~effect/Runtime/errorReported?: boolean;
cause?: unknown;
message: string;
name: string;
stack?: string;
[iterator](): EffectIterator<Effect<never, ProbeUnavailableError, never>>;
[NodeInspectSymbol](): unknown;
pipe<A>(this: A): A;
pipe<A, B = never>(this: A, ab: (_: A) => B): B;
pipe<A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C;
pipe<A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D;
pipe<A, B = never, C = never, D = never, E = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E): E;
pipe<A, B = never, C = never, D = never, E = never, F = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F): F;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G): G;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H): H;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I): I;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J): J;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K): K;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L): L;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M): M;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N): N;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O): O;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P): P;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q): Q;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R): R;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S): S;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T): T;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
toJSON(): unknown;
toString(): string;
}
Raised when a reference was not created by the managed statechart runtime.
declare class ReachabilityError<M extends AnyMachine = AnyMachine, Key extends ExplorationKey = ExplorationKey> extends YieldableError<this> & {
readonly _tag: "MachineTestReachabilityError";
} & Readonly<{
readonly completeness: ExplorationCompleteness<M, Key>;
readonly expectation: "reachable" | "unreachable";
readonly message: string;
readonly name: string;
readonly reason: ReachabilityFailure;
readonly witness?: ExplorationNode<M, Key>;
}> {
constructor<M extends Any = Any, Key extends PropertyKey = PropertyKey>(args: {
readonly completeness: ExplorationCompleteness<M, Key>;
readonly expectation: "reachable" | "unreachable";
readonly message: string;
readonly name: string;
readonly reason: ReachabilityFailure;
readonly witness?: ExplorationNode<M, Key>;
});
readonly _tag: "MachineTestReachabilityError";
readonly ~effect/Effect: Variance<never, ReachabilityError<M, Key>, never>;
readonly ~effect/ErrorReporter/attributes?: ReadonlyRecord<string, unknown>;
readonly ~effect/ErrorReporter/ignore?: boolean;
readonly ~effect/ErrorReporter/severity?: Severity;
readonly ~effect/Runtime/errorExitCode?: number;
readonly ~effect/Runtime/errorReported?: boolean;
cause?: unknown;
readonly completeness: ExplorationCompleteness<M, Key>;
readonly expectation: "reachable" | "unreachable";
message: string;
name: string;
readonly reason: ReachabilityFailure;
stack?: string;
readonly witness?: ExplorationNode<M, Key>;
[iterator](): EffectIterator<Effect<never, ReachabilityError<M, Key>, never>>;
[NodeInspectSymbol](): unknown;
pipe<A>(this: A): A;
pipe<A, B = never>(this: A, ab: (_: A) => B): B;
pipe<A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C;
pipe<A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D;
pipe<A, B = never, C = never, D = never, E = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E): E;
pipe<A, B = never, C = never, D = never, E = never, F = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F): F;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G): G;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H): H;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I): I;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J): J;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K): K;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L): L;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M): M;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N): N;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O): O;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P): P;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q): Q;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R): R;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S): S;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T): T;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
toJSON(): unknown;
toString(): string;
}
A failed or inconclusive reachability assertion.
type RunError<M extends AnyMachine> = Machine.Machine.InitialError<M> | Machine.Machine.Error<M> | Machine.InfiniteTransitionError | Machine.MachineSchemaDecodeError | Machine.StartupError
Errors that can be produced while planning a complete scenario.
declare class RuntimeCommandFailure<Failure = unknown, Model = unknown, Expected = unknown, State = unknown, Event = unknown, Error = unknown, Output = unknown, Observed = unknown> extends YieldableError<this> & {
readonly _tag: "MachineTestRuntimeCommandFailure";
} & Readonly<{
readonly attempted: RuntimeCommandRecord<Model, Expected, State, Event, Error, Output, Observed> | undefined;
readonly cause: Cause<Failure>;
readonly command: RuntimeCommand<Event>;
readonly index: number;
readonly phase: "model" | "execution" | "observation" | "inspection" | "assertion";
readonly prefix: readonly Array<RuntimeCommandRecord<Model, Expected, State, Event, Error, Output, Observed>>;
}> {
constructor<Failure = unknown, Model = unknown, Expected = unknown, State = unknown, Event = unknown, Error = unknown, Output = unknown, Observed = unknown>(args: {
readonly attempted: RuntimeCommandRecord<Model, Expected, State, Event, Error, Output, Observed> | undefined;
readonly cause: Cause<Failure>;
readonly command: RuntimeCommand<Event>;
readonly index: number;
readonly phase: "model" | "execution" | "observation" | "inspection" | "assertion";
readonly prefix: readonly Array<RuntimeCommandRecord<Model, Expected, State, Event, Error, Output, Observed>>;
});
readonly _tag: "MachineTestRuntimeCommandFailure";
readonly ~effect/Effect: Variance<never, RuntimeCommandFailure<Failure, Model, Expected, State, Event, Error, Output, Observed>, never>;
readonly ~effect/ErrorReporter/attributes?: ReadonlyRecord<string, unknown>;
readonly ~effect/ErrorReporter/ignore?: boolean;
readonly ~effect/ErrorReporter/severity?: Severity;
readonly ~effect/Runtime/errorExitCode?: number;
readonly ~effect/Runtime/errorReported?: boolean;
readonly attempted: RuntimeCommandRecord<Model, Expected, State, Event, Error, Output, Observed> | undefined;
cause: Cause<Failure>;
readonly command: RuntimeCommand<Event>;
readonly index: number;
message: string;
name: string;
readonly phase: "model" | "execution" | "observation" | "inspection" | "assertion";
readonly prefix: readonly Array<RuntimeCommandRecord<Model, Expected, State, Event, Error, Output, Observed>>;
stack?: string;
[iterator](): EffectIterator<Effect<never, RuntimeCommandFailure<Failure, Model, Expected, State, Event, Error, Output, Observed>, never>>;
[NodeInspectSymbol](): unknown;
pipe<A>(this: A): A;
pipe<A, B = never>(this: A, ab: (_: A) => B): B;
pipe<A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C;
pipe<A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D;
pipe<A, B = never, C = never, D = never, E = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E): E;
pipe<A, B = never, C = never, D = never, E = never, F = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F): F;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G): G;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H): H;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I): I;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J): J;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K): K;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L): L;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M): M;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N): N;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O): O;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P): P;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q): Q;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R): R;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S): S;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T): T;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
toJSON(): unknown;
toString(): string;
}
A typed command-model failure retaining the successfully checked prefix.
declare class RuntimeInvariantError<M extends AnyMachine = AnyMachine> extends YieldableError<this> & {
readonly _tag: "MachineTestRuntimeInvariantError";
} & Readonly<{
readonly report: RuntimeInvariantReport;
readonly transcript: RuntimeInvariantTranscript<M>;
readonly violations: readonly Array<RuntimeInvariantViolation<M>>;
}> {
constructor<M extends Any = Any>(args: {
readonly report: RuntimeInvariantReport;
readonly transcript: RuntimeInvariantTranscript<M>;
readonly violations: readonly Array<RuntimeInvariantViolation<M>>;
});
readonly _tag: "MachineTestRuntimeInvariantError";
readonly ~effect/Effect: Variance<never, RuntimeInvariantError<M>, never>;
readonly ~effect/ErrorReporter/attributes?: ReadonlyRecord<string, unknown>;
readonly ~effect/ErrorReporter/ignore?: boolean;
readonly ~effect/ErrorReporter/severity?: Severity;
readonly ~effect/Runtime/errorExitCode?: number;
readonly ~effect/Runtime/errorReported?: boolean;
cause?: unknown;
message: string;
name: string;
readonly report: RuntimeInvariantReport;
stack?: string;
readonly transcript: RuntimeInvariantTranscript<M>;
readonly violations: readonly Array<RuntimeInvariantViolation<M>>;
[iterator](): EffectIterator<Effect<never, RuntimeInvariantError<M>, never>>;
[NodeInspectSymbol](): unknown;
pipe<A>(this: A): A;
pipe<A, B = never>(this: A, ab: (_: A) => B): B;
pipe<A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C;
pipe<A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D;
pipe<A, B = never, C = never, D = never, E = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E): E;
pipe<A, B = never, C = never, D = never, E = never, F = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F): F;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G): G;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H): H;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I): I;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J): J;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K): K;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L): L;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M): M;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N): N;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O): O;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P): P;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q): Q;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R): R;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S): S;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T): T;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
toJSON(): unknown;
toString(): string;
}
All violations found in one causal runtime transcript.
declare class RuntimeObservationError extends YieldableError<this> & {
readonly _tag: "MachineTestRuntimeObservationError";
} & Readonly<{
readonly index: number;
readonly message: string;
readonly reason: "ended" | "timeout";
readonly synchronization: "Until" | "Next";
}> {
constructor(args: {
readonly index: number;
readonly message: string;
readonly reason: "ended" | "timeout";
readonly synchronization: "Until" | "Next";
});
readonly _tag: "MachineTestRuntimeObservationError";
readonly ~effect/Effect: Variance<never, RuntimeObservationError, never>;
readonly ~effect/ErrorReporter/attributes?: ReadonlyRecord<string, unknown>;
readonly ~effect/ErrorReporter/ignore?: boolean;
readonly ~effect/ErrorReporter/severity?: Severity;
readonly ~effect/Runtime/errorExitCode?: number;
readonly ~effect/Runtime/errorReported?: boolean;
cause?: unknown;
readonly index: number;
message: string;
name: string;
readonly reason: "ended" | "timeout";
stack?: string;
readonly synchronization: "Until" | "Next";
[iterator](): EffectIterator<Effect<never, RuntimeObservationError, never>>;
[NodeInspectSymbol](): unknown;
pipe<A>(this: A): A;
pipe<A, B = never>(this: A, ab: (_: A) => B): B;
pipe<A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C;
pipe<A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D;
pipe<A, B = never, C = never, D = never, E = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E): E;
pipe<A, B = never, C = never, D = never, E = never, F = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F): F;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G): G;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H): H;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I): I;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J): J;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K): K;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L): L;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M): M;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N): N;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O): O;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P): P;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q): Q;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R): R;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S): S;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T): T;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
toJSON(): unknown;
toString(): string;
}
Failure raised when an expected public change stream observation is absent.
declare class VerificationError extends YieldableError<this> & {
readonly _tag: "MachineTestVerificationError";
} & Readonly<{
readonly violations: readonly Array<VerificationViolation>;
}> {
constructor(args: {
readonly violations: readonly Array<VerificationViolation>;
});
readonly _tag: "MachineTestVerificationError";
readonly ~effect/Effect: Variance<never, VerificationError, never>;
readonly ~effect/ErrorReporter/attributes?: ReadonlyRecord<string, unknown>;
readonly ~effect/ErrorReporter/ignore?: boolean;
readonly ~effect/ErrorReporter/severity?: Severity;
readonly ~effect/Runtime/errorExitCode?: number;
readonly ~effect/Runtime/errorReported?: boolean;
cause?: unknown;
message: string;
name: string;
stack?: string;
readonly violations: readonly Array<VerificationViolation>;
[iterator](): EffectIterator<Effect<never, VerificationError, never>>;
[NodeInspectSymbol](): unknown;
pipe<A>(this: A): A;
pipe<A, B = never>(this: A, ab: (_: A) => B): B;
pipe<A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C;
pipe<A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D;
pipe<A, B = never, C = never, D = never, E = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E): E;
pipe<A, B = never, C = never, D = never, E = never, F = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F): F;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G): G;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H): H;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I): I;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J): J;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K): K;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L): L;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M): M;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N): N;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O): O;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P): P;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q): Q;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R): R;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S): S;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T): T;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
pipe<A, B = never, C = never, D = never, E = never, F = never, G = never, H = never, I = never, J = never, K = never, L = never, M = never, N = never, O = never, P = never, Q = never, R = never, S = never, T = never, U = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D, de: (_: D) => E, ef: (_: E) => F, fg: (_: F) => G, gh: (_: G) => H, hi: (_: H) => I, ij: (_: I) => J, jk: (_: J) => K, kl: (_: K) => L, lm: (_: L) => M, mn: (_: M) => N, no: (_: N) => O, op: (_: O) => P, pq: (_: P) => Q, qr: (_: Q) => R, rs: (_: R) => S, st: (_: S) => T, tu: (_: T) => U): U;
toJSON(): unknown;
toString(): string;
}
All violations found while checking one trace.
Exploration
17declare const assertReachable: <M extends AnyMachine, Key extends ExplorationKey>(exploration: Exploration<M, Key>, name: string, predicate: ExplorationPredicate<M, Key>) => Effect.Effect<ExplorationNode<M, Key>, internal.ReachabilityError<M, Key>>
Requires a matching state and returns its shortest witness.
A truncated exploration without a witness fails as inconclusive rather than claiming the state is unreachable.
declare const assertUnreachable: <M extends AnyMachine, Key extends ExplorationKey>(exploration: Exploration<M, Key>, name: string, predicate: ExplorationPredicate<M, Key>) => Effect.Effect<void, internal.ReachabilityError<M, Key>>
Requires that no explored state matches a predicate.
This assertion succeeds only for a complete exploration. A truncated result without a witness fails as inconclusive.
interface Exploration<M extends AnyMachine, Key extends ExplorationKey = ExplorationKey> {
readonly completeness: ExplorationCompleteness<M, Key>;
readonly graph: DirectedGraph<ExplorationNode<M, Key>, ExplorationEdge<M>>;
readonly limits: ResolvedExplorationLimits;
readonly nodes: readonly Array<ExplorationNode<M, Key>>;
readonly nodesByKey: ReadonlyMap<Key, number>;
readonly start: number;
readonly stats: ExplorationStats;
}
A bounded logical state graph and its shortest-path evidence.
type ExplorationCompleteness<M extends AnyMachine, Key extends ExplorationKey = ExplorationKey> = {
readonly _tag: "Complete";
} | {
readonly _tag: "Truncated";
readonly frontier: ReadonlyArray<ExplorationFrontier<M, Key>>;
readonly reasons: ReadonlyArray<"depth" | "states" | "transitions">;
}
Honest completeness status for the supplied event representatives and state key abstraction.
interface ExplorationEdge<M extends AnyMachine> {
readonly discovered: boolean;
readonly event: InputEvent<M>;
readonly step: TraceStep<M>;
}
One concretely planned public event in the exploration graph.
type ExplorationFrontier<M extends AnyMachine, Key extends ExplorationKey = ExplorationKey> = {
readonly _tag: "DepthLimit";
readonly event: Machine.Machine.InputEvent<M>;
readonly source: Key;
readonly trace: Trace<M>;
} | {
readonly _tag: "StateLimit";
readonly event: Machine.Machine.InputEvent<M>;
readonly source: Key;
readonly target: Key;
readonly targetTrace: Trace<M>;
readonly trace: Trace<M>;
} | {
readonly _tag: "TransitionLimit";
readonly event: Machine.Machine.InputEvent<M>;
readonly source: Key;
readonly trace: Trace<M>;
}
One boundary that could not be explored because a hard limit was reached.
type ExplorationKey = PropertyKey
User-defined identity for a logical exploration state.
Equal keys deliberately collapse snapshots into one explored state. The key therefore defines both finiteness and the semantic precision of an exploration.
interface ExplorationLimits {
readonly maxDepth?: number;
readonly maxStates?: number;
readonly maxTransitions?: number;
}
Hard bounds for one exploration.
Defaults are 20 public events, 1,000 states, and 10,000 planned transitions. A limit never makes an incomplete result appear exhaustive.
interface ExplorationNode<M extends AnyMachine, Key extends ExplorationKey = ExplorationKey> extends ExplorationStateContext<M> {
readonly configuration: readonly Array<StatePath<M>>;
readonly depth: number;
readonly key: Key;
readonly machine: M;
readonly snapshot: Snapshot<States<M>>;
readonly trace: Trace<M>;
}
One logical state discovered by breadth-first exploration.
trace is the first, and therefore shortest, trace that reached key.
type ExplorationPredicate<M extends AnyMachine, Key extends ExplorationKey = ExplorationKey> = (node: ExplorationNode<M, Key>) => boolean
A predicate over one explored logical state.
interface ExplorationStateContext<M extends AnyMachine> {
readonly configuration: readonly Array<StatePath<M>>;
readonly depth: number;
readonly machine: M;
readonly snapshot: Snapshot<States<M>>;
readonly trace: Trace<M>;
}
Evidence available while assigning a state key.
interface ExplorationStats {
readonly maxDepth: number;
readonly plannedTransitions: number;
readonly retainedEdges: number;
readonly states: number;
}
Deterministic breadth-first exploration counts.
declare const explore: <M extends AnyMachine, Key extends ExplorationKey>(machine: ReadyMachine<M>, options: ExploreOptions<M, Key>) => Effect.Effect<Exploration<M, Key>, RunFailure<RunError<M>, M> | internal.InvariantError<M>, RunServices<M>>
Explores the bounded logical state graph in breadth-first order.
Invariants are checked against startup and every concretely planned edge, so a failure retains a shortest discovered counterexample. Staged actions and runtime activities are not executed.
import { Schema } from "effect"
import { Machine } from "@typeonce/effect-machine"
import { MachineTest } from "@typeonce/effect-machine/testing"
class Count extends Schema.TaggedClass<Count>("Count")("Count", {
value: Schema.Number
}) {}
class Increment extends Schema.TaggedClass<Increment>("Increment")("Increment", {}) {}
const States = Machine.defineStates({ Count })
const machine = Machine.make({
states: States.states,
events: [Increment],
initial: () => States.initial.Count(new Count({ value: 0 }))
}).handle({
Count: { on: { Increment: ({ state }) =>
States.initial.Count(new Count({ value: state.value + 1 })) } }
})
const explored = MachineTest.explore(machine, {
events: ({ snapshot }) => snapshot.value.value < 2 ? [new Increment({})] : [],
stateKey: ({ snapshot }) => snapshot.value.value
})
type ExploreOptions<M extends AnyMachine, Key extends ExplorationKey = ExplorationKey> = ExploreOptionsBase<M, Key> & Machine.Machine.Input<M> extends typeof Schema.Void ? {
readonly input?: never;
} : {
readonly input: InputValue<M>;
}
Configuration for bounded planner exploration.
Event representatives may depend on the current state. Exploration is exhaustive only relative to those representatives and the equivalence relation defined by stateKey.
declare const findShortest: <M extends AnyMachine, Key extends ExplorationKey>(exploration: Exploration<M, Key>, predicate: ExplorationPredicate<M, Key>) => ExplorationNode<M, Key> | undefined
Finds the first, and therefore shortest, explored state matching a predicate.
type ReachabilityFailure = "NotFound" | "UnexpectedMatch" | "Inconclusive"
Why a reachability assertion failed.
interface ResolvedExplorationLimits {
readonly maxDepth: number;
readonly maxStates: number;
readonly maxTransitions: number;
}
Resolved bounds retained by an exploration result.
Formatting
4declare function formatCausalTranscript(value: CausalRuntimeTranscript<any, any, any, any, any, any> | CausalRuntimeCommandFailure<any, any, any, any, any, any, any>): string
Formats a causal runtime transcript or failure as replayable line-oriented evidence, including exact probe steps and explicit asynchronous observations.
declare function formatEnqueuedTranscript(value: RuntimeTranscript<any, any, any, any, any, any, any> | RuntimeCommandFailure<any, any, any, any, any, any, any, any>): string
Formats a runtime transcript or failure as replayable line-oriented evidence.
declare const formatRuntimeTranscript: typeof formatEnqueuedTranscript
Compatibility alias for enqueue-oriented transcript formatting.
declare const formatTrace: <M extends AnyMachine, Cause>(trace: Trace<M> | RunFailure<Cause, M>) => string
Formats a trace as deterministic, line-oriented counterexample evidence.
Object keys and map/set entries are canonicalized. Deferred effects are represented by counts so formatting never evaluates or inspects actions. Failures include their original cause and every available successful prefix.
Invariants
25type Invariant<M extends AnyMachine> = StateInvariant<M> | StepInvariant<M> | TraceInvariant<M>
A user-defined semantic property over a planner trace.
interface InvariantBuilder<M extends AnyMachine> {
readonly state: (name: string, check: (context: StateInvariantContext<M>) => InvariantOutcome, options?: StateInvariantOptions<M>) => StateInvariant<M>;
readonly step: (name: string, check: (context: StepInvariantContext<M>) => InvariantOutcome, options?: InvariantOptions<StepInvariantContext<M>>) => StepInvariant<M>;
readonly trace: (name: string, check: (context: TraceInvariantContext<M>) => InvariantOutcome, options?: InvariantOptions<TraceInvariantContext<M>>) => TraceInvariant<M>;
}
Machine-bound invariant constructors with complete contextual inference.
interface InvariantCheckResult {
readonly failures: number;
readonly invariant: string;
readonly observations: number;
readonly scope: InvariantScope;
readonly status: InvariantStatus;
}
Aggregate result for one invariant.
interface InvariantOptions<Context> {
readonly require?: {
readonly minObservations: number;
};
readonly when?: (context: Context) => boolean;
}
Controls conditional invariant evaluation and optional non-vacuity checks.
A condition that never matches is reported as untested. Set require.minObservations when that must fail the check instead.
type InvariantOutcome = boolean | string
The result of evaluating one semantic invariant.
true passes, false produces a default failure message, and a string fails with that string as its counterexample explanation.
interface InvariantReport {
readonly checks: readonly Array<InvariantCheckResult>;
}
Aggregate result for all checked invariants.
type InvariantScope = "state" | "step" | "trace"
The scope of a semantic invariant.
type InvariantStatus = "passed" | "failed" | "untested" | "insufficient"
Result status for one invariant.
untested is non-failing unless the invariant declares a minimum number of observations, in which case it becomes insufficient.
interface InvariantViolation<M extends AnyMachine = AnyMachine> {
readonly configuration?: readonly Array<StatePath<M>>;
readonly event?: InitialEvent | Event<M>;
readonly eventIndex: number | undefined;
readonly invariant: string;
readonly kind: "predicate" | "observations";
readonly message: string;
readonly microstepIndex?: number;
readonly observationIndex?: number;
readonly phase?: StateObservation;
readonly scope: InvariantScope;
}
One semantic invariant violation with its precise trace location.
interface RuntimeCommandInvariant<M extends AnyMachine> extends InvariantOptions<RuntimeCommandInvariantContext<M>> {
readonly _tag: "RuntimeCommandInvariant";
readonly check: (context: RuntimeCommandInvariantContext<M>) => InvariantOutcome;
readonly name: string;
readonly require?: {
readonly minObservations: number;
};
readonly when?: (context: RuntimeCommandInvariantContext) => boolean;
}
A semantic property checked after every completed causal command.
type RuntimeInvariant<M extends AnyMachine> = RuntimeSnapshotInvariant<M> | RuntimeCommandInvariant<M> | RuntimeTranscriptInvariant<M>
A user-defined semantic property over retained live runtime evidence.
type RuntimeInvariantScope = "snapshot" | "command" | "transcript"
Scope of a runtime invariant.
interface RuntimeSnapshotInvariant<M extends AnyMachine> extends InvariantOptions<RuntimeSnapshotInvariantContext<M>> {
readonly _tag: "RuntimeSnapshotInvariant";
readonly check: (context: RuntimeSnapshotInvariantContext<M>) => InvariantOutcome;
readonly name: string;
readonly observe: RuntimeSnapshotObservationMode;
readonly require?: {
readonly minObservations: number;
};
readonly when?: (context: RuntimeSnapshotInvariantContext) => boolean;
}
A semantic property checked against selected live runtime snapshots.
type RuntimeSnapshotObservation = "initial" | "command" | "awaited" | "final"
The semantic location of one retained runtime snapshot.
type RuntimeSnapshotObservationMode = "settled" | "awaited" | "all" | "final"
The runtime snapshots selected by one snapshot invariant.
interface RuntimeTranscriptInvariant<M extends AnyMachine> extends InvariantOptions<RuntimeTranscriptInvariantContext<M>> {
readonly _tag: "RuntimeTranscriptInvariant";
readonly check: (context: RuntimeTranscriptInvariantContext<M>) => InvariantOutcome;
readonly name: string;
readonly require?: {
readonly minObservations: number;
};
readonly when?: (context: RuntimeTranscriptInvariantContext) => boolean;
}
A semantic property checked once against a complete causal transcript.
interface StateInvariant<M extends AnyMachine> extends InvariantOptions<StateInvariantContext<M>> {
readonly _tag: "StateInvariant";
readonly check: (context: StateInvariantContext<M>) => InvariantOutcome;
readonly name: string;
readonly observe: StateObservationMode;
readonly require?: {
readonly minObservations: number;
};
readonly when?: (context: StateInvariantContext) => boolean;
}
A semantic property checked against selected state observations.
interface StateInvariantContext<M extends AnyMachine> {
readonly configuration: readonly Array<StatePath<M>>;
readonly event: InitialEvent | Event<M> | undefined;
readonly eventIndex: number | undefined;
readonly machine: M;
readonly microstepIndex: number | undefined;
readonly observationIndex: number;
readonly phase: StateObservation;
readonly snapshot: Snapshot<States<M>>;
readonly trace: Trace<M>;
}
Evidence passed to a state invariant.
interface StateInvariantOptions<M extends AnyMachine> extends InvariantOptions<StateInvariantContext<M>> {
readonly observe?: StateObservationMode;
readonly require?: {
readonly minObservations: number;
};
readonly when?: (context: StateInvariantContext) => boolean;
}
Options for a state invariant.
type StateObservation = "initial" | "event" | "microstep" | "final"
The semantic location of one state observation.
type StateObservationMode = "settled" | "microsteps" | "all" | "final"
The portions of a trace that a state invariant may observe.
settledobserves startup and the state after every public event.microstepsobserves every internal microstep.allobserves both settled states and microsteps.finalobserves only the final state.
interface StepInvariant<M extends AnyMachine> extends InvariantOptions<StepInvariantContext<M>> {
readonly _tag: "StepInvariant";
readonly check: (context: StepInvariantContext<M>) => InvariantOutcome;
readonly name: string;
readonly require?: {
readonly minObservations: number;
};
readonly when?: (context: StepInvariantContext) => boolean;
}
A semantic property checked after every public event.
interface StepInvariantContext<M extends AnyMachine> {
readonly after: Snapshot<States<M>>;
readonly afterConfiguration: readonly Array<StatePath<M>>;
readonly before: Snapshot<States<M>>;
readonly beforeConfiguration: readonly Array<StatePath<M>>;
readonly event: InputEvent<M>;
readonly index: number;
readonly machine: M;
readonly plan: EventPlan<M>;
readonly step: TraceStep<M>;
readonly trace: Trace<M>;
}
Evidence passed to an invariant for one public event step.
interface TraceInvariant<M extends AnyMachine> extends InvariantOptions<TraceInvariantContext<M>> {
readonly _tag: "TraceInvariant";
readonly check: (context: TraceInvariantContext<M>) => InvariantOutcome;
readonly name: string;
readonly require?: {
readonly minObservations: number;
};
readonly when?: (context: TraceInvariantContext) => boolean;
}
A semantic property checked once against a complete trace.
interface TraceInvariantContext<M extends AnyMachine> {
readonly machine: M;
readonly trace: Trace<M>;
}
Evidence passed to a whole-trace invariant.
Models
112interface CausalRuntimeAssertionContext<M extends AnyMachine, Model, Expected, Error, Output, Observed> extends CausalRuntimeInspectionContext<M, Error, Output> {
readonly actual: CausalRuntimeCommandActual<M, Error, Output, Observed>;
readonly awaited: readonly Array<RuntimeSnapshot<Snapshot<States<M>>, Error, Output>>;
readonly command: RuntimeCommand<InputEvent<M>>;
readonly expected: Expected;
readonly index: number;
readonly model: Model;
readonly probe: Probe<M, Error, Output>;
readonly ref: MachineRef<Snapshot<States<M>>, InputEvent<M>, Error, Output>;
readonly result: CausalRuntimeCommandResult<M>;
readonly snapshot: RuntimeSnapshot<Snapshot<States<M>>, Error, Output>;
}
Context supplied to a causal reference-model assertion.
interface CausalRuntimeCommandActual<M extends AnyMachine, Error, Output, Observed> {
readonly awaited: readonly Array<RuntimeSnapshot<Snapshot<States<M>>, Error, Output>>;
readonly inspected: Observed | undefined;
readonly result: CausalRuntimeCommandResult<M>;
readonly snapshot: RuntimeSnapshot<Snapshot<States<M>>, Error, Output>;
}
Actual causal evidence made available to inspection and assertions.
interface CausalRuntimeCommandRecord<M extends AnyMachine, Model, Expected, Error, Output, Observed> {
readonly actual: CausalRuntimeCommandActual<M, Error, Output, Observed>;
readonly command: RuntimeCommand<InputEvent<M>>;
readonly expected: Expected;
readonly index: number;
readonly model: Model;
}
One successfully checked causal command.
type CausalRuntimeCommandResult<M extends AnyMachine> = {
readonly _tag: "SendProcessed";
readonly step: ProbeStep<M>;
} | {
readonly _tag: "SendRejected";
readonly error: Machine.StoppedError;
} | {
readonly _tag: "ClockAdvanced";
} | {
readonly _tag: "Stopped";
} | {
readonly _tag: "Checkpoint";
}
Exact execution result for one causal runtime command.
interface CausalRuntimeEvidence<M extends AnyMachine, Error, Output> {
readonly commands: readonly Array<RuntimeCommand<InputEvent<M>>>;
readonly final: RuntimeSnapshot<Snapshot<States<M>>, Error, Output>;
readonly initial: RuntimeSnapshot<Snapshot<States<M>>, Error, Output>;
readonly records: readonly Array<CausalRuntimeEvidenceRecord<M, Error, Output>>;
}
The model-independent evidence shared by causal command transcripts.
interface CausalRuntimeEvidenceRecord<M extends AnyMachine, Error, Output> {
readonly actual: CausalRuntimeCommandActual<M, Error, Output, unknown>;
readonly command: RuntimeCommand<InputEvent<M>>;
readonly index: number;
}
A causal command record projected independently of a reference model.
interface CausalRuntimeInspectionContext<M extends AnyMachine, Error, Output> {
readonly awaited: readonly Array<RuntimeSnapshot<Snapshot<States<M>>, Error, Output>>;
readonly command: RuntimeCommand<InputEvent<M>>;
readonly index: number;
readonly probe: Probe<M, Error, Output>;
readonly ref: MachineRef<Snapshot<States<M>>, InputEvent<M>, Error, Output>;
readonly result: CausalRuntimeCommandResult<M>;
readonly snapshot: RuntimeSnapshot<Snapshot<States<M>>, Error, Output>;
}
Context supplied to a custom causal runtime inspection effect.
interface CausalRuntimeModelOptions<M extends AnyMachine, Model, Expected, Error, Output, Observed = never, ModelError = never, ModelServices = never, InspectionError = never, InspectionServices = never, AssertionError = never, AssertionServices = never> {
readonly assert: (context: CausalRuntimeAssertionContext<M, Model, Expected, Error, Output, Observed>) => Effect<void, AssertionError, AssertionServices>;
readonly initialModel: Model;
readonly inspect?: (context: CausalRuntimeInspectionContext<M, Error, Output>) => Effect<Observed, InspectionError, InspectionServices>;
readonly observationTimeout?: Input;
readonly transition: (model: Model, command: RuntimeCommand<InputEvent<M>>, index: number) => Effect<CausalRuntimeModelStep<Model, Expected, Snapshot<States<M>>, Error, Output>, ModelError, ModelServices>;
}
Configuration for causally checking runtime commands against a reference model.
interface CausalRuntimeModelStep<Model, Expected, State, Error, Output> {
readonly await?: RuntimeAwait<State, Error, Output>;
readonly expected: Expected;
readonly model: Model;
}
The pure/reference-model result for one causally executed command.
await is only for asynchronous behavior after the command boundary. A submitted Send always completes its exact managed macrostep first.
interface CausalRuntimeTranscript<M extends AnyMachine, Model, Expected, Error, Output, Observed> {
readonly commands: readonly Array<RuntimeCommand<InputEvent<M>>>;
readonly final: RuntimeSnapshot<Snapshot<States<M>>, Error, Output>;
readonly finalModel: Model;
readonly initial: RuntimeSnapshot<Snapshot<States<M>>, Error, Output>;
readonly records: readonly Array<CausalRuntimeCommandRecord<M, Model, Expected, Error, Output, Observed>>;
}
A complete causally executed command-model transcript.
Every accepted send in records completed its managed macrostep. This does not claim that later timer, invoke, or child work has completed unless the corresponding model step requested probe.await.until.
interface CausalVerificationAwaitContext<M extends AnyMachine, Error, Output> {
readonly command: RuntimeCommand<InputEvent<M>>;
readonly index: number;
readonly probe: Probe<M, Error, Output>;
}
Context used to select additional asynchronous observation for a law-oriented command run.
interface CausalVerificationOptions<M extends AnyMachine, Error, Output> {
readonly await?: (context: CausalVerificationAwaitContext<M, Error, Output>) => RuntimeAwait<Snapshot<States<M>>, Error, Output>;
readonly invariants: readonly Array<RuntimeInvariant<M>>;
readonly observationTimeout?: Input;
}
Configuration for causal verification without a separate reference model.
interface CausalVerificationTranscript<M extends AnyMachine, Error, Output> extends CausalRuntimeEvidence<M, Error, Output> {
readonly commands: readonly Array<RuntimeCommand<InputEvent<M>>>;
readonly final: RuntimeSnapshot<Snapshot<States<M>>, Error, Output>;
readonly initial: RuntimeSnapshot<Snapshot<States<M>>, Error, Output>;
readonly records: readonly Array<CausalRuntimeEvidenceRecord<M, Error, Output>>;
}
A law-oriented causal transcript without dummy model or expected fields.
interface CompletionCoverageEvidence<Path extends string = string> {
readonly donePlans: number;
readonly paths: readonly Array<Path>;
readonly recordObservations: number;
}
Directly observed completion evidence.
interface Coverage<M extends AnyMachine> {
readonly completion: CompletionCoverageEvidence<StatePath<M>>;
readonly events: EventCoverage<TagOf<InputEvents<M>[number]>>;
readonly history: HistoryCoverageEvidence<StateNodePath<M>>;
readonly logicalConfigurations: LogicalConfigurationCoverage;
readonly microsteps: MicrostepCoverageEvidence;
readonly scenarios: ScenarioCoverage;
readonly startup: {
readonly traces: number;
readonly withMicrosteps: number;
};
readonly states: StateCoverage<StatePath<M>>;
readonly transitions: CoverageSummary<TransitionCoverageItem<StateNodePath<M>, TagOf<Events<M>[number]>, StateNodePath<M>>>;
}
Coverage computed only from observable machine definitions and planner traces.
interface CoverageSummary<Item> {
readonly hit: number;
readonly hits: readonly Array<Item>;
readonly misses: readonly Array<Item>;
readonly missing: number;
readonly total: number;
}
A deterministic hit/miss summary for a finite set declared by a machine.
type EnqueuedRuntimeAssertionContext<Model, Expected, State, Event, Error, Output, Observed> = RuntimeAssertionContext<Model, Expected, State, Event, Error, Output, Observed>
Enqueue-oriented name for runtime assertion context.
type EnqueuedRuntimeCommandActual<State, Error, Output, Observed> = RuntimeCommandActual<State, Error, Output, Observed>
Enqueue-oriented name for actual runtime command evidence.
type EnqueuedRuntimeCommandRecord<Model, Expected, State, Event, Error, Output, Observed> = RuntimeCommandRecord<Model, Expected, State, Event, Error, Output, Observed>
Enqueue-oriented name for a checked runtime command record.
type EnqueuedRuntimeInspectionContext<State, Event, Error, Output> = RuntimeInspectionContext<State, Event, Error, Output>
Enqueue-oriented name for runtime inspection context.
type EnqueuedRuntimeModelOptions<Model, Expected, State, Event, Error, Output, Observed = never, ModelError = never, ModelServices = never, InspectionError = never, InspectionServices = never, AssertionError = never, AssertionServices = never> = RuntimeModelOptions<Model, Expected, State, Event, Error, Output, Observed, ModelError, ModelServices, InspectionError, InspectionServices, AssertionError, AssertionServices>
Enqueue-oriented options for a runtime reference model.
type EnqueuedRuntimeModelStep<Model, Expected, State, Error, Output> = RuntimeModelStep<Model, Expected, State, Error, Output>
Explicit name for the model step used by the enqueue-oriented command runner. The RuntimeModelStep name remains as a compatibility alias.
type EnqueuedRuntimeTranscript<Model, Expected, State, Event, Error, Output, Observed> = RuntimeTranscript<Model, Expected, State, Event, Error, Output, Observed>
Enqueue-oriented name for a complete runtime transcript.
type EventCoverage<Tag extends PropertyKey = PropertyKey> = {
readonly available: true;
readonly diagnostics: readonly [];
readonly hit: number;
readonly hits: ReadonlyArray<EventCoverageItem<Tag>>;
readonly misses: ReadonlyArray<EventCoverageItem<Tag>>;
readonly missing: number;
readonly observed: ReadonlyArray<EventCoverageItem<Tag>>;
readonly total: number;
} | {
readonly available: false;
readonly diagnostics: ReadonlyArray<{
readonly message: string;
readonly schemaIndex: number;
}>;
readonly hit: undefined;
readonly hits: undefined;
readonly misses: undefined;
readonly missing: undefined;
readonly observed: ReadonlyArray<EventCoverageItem<Tag>>;
readonly total: undefined;
}
Public event coverage, including events that no transition retained.
interface EventCoverageItem<Tag extends PropertyKey = PropertyKey> {
readonly count: number;
readonly tag: Tag;
}
One public event tag declared by the machine.
type EventPlan<M extends AnyMachine> = {
readonly commands: ReadonlyArray<Machine.Command>;
readonly emittedEvents: ReadonlyArray<Machine.Machine.Emit<M>>;
readonly microsteps: ReadonlyArray<Microstep<M>>;
readonly next: Machine.Machine.Snapshot<Machine.Machine.States<M>>;
} & PlanCompletion<M>
The complete data returned while planning one public event.
interface FiniteAtomicState {
readonly _tag: "Atomic";
readonly key: string;
readonly value: number;
}
An atomic state in a finite generated model.
type FiniteAutomaticTransition = FiniteTransitionBase & {
readonly trigger: Exclude<FiniteTransitionTrigger, {
readonly type: "event";
}>;
}
An always or completion transition. Automatic transitions deliberately omit the event-only reentry option.
interface FiniteCompoundState {
readonly _tag: "Compound";
readonly initial: string;
readonly key: string;
readonly states: readonly Array<FiniteState>;
readonly value: number;
}
A compound state in a finite generated model.
type FiniteEventTransition = FiniteTransitionBase & {
readonly reenter: boolean;
readonly trigger: Extract<FiniteTransitionTrigger, {
readonly type: "event";
}>;
}
A public event transition may explicitly request source reentry.
interface FiniteFinalState {
readonly _tag: "Final";
readonly key: string;
readonly output: string;
readonly value: number;
}
A final state in a finite generated model.
interface FiniteHistoryMutation {
readonly event: string;
readonly source: string;
readonly target: string;
readonly value: number;
}
The exact generated transition that changes a value before history capture.
The source and target are the same active atomic state. value is distinct from that state's generated default value.
interface FiniteHistoryScenario {
readonly events: readonly [string, string, string];
readonly history: string;
readonly historyType: "shallow" | "deep";
readonly leave: FiniteHistoryTransfer;
readonly mutation: FiniteHistoryMutation;
readonly owner: string;
readonly resume: FiniteHistoryTransfer;
}
A replayable value-mutation, capture, and restoration witness generated for one history pseudo-state.
events is exactly [mutation.event, leave.event, resume.event]. Replaying it changes a schema-valid atomic value, exits the history owner through its root, and restores the remembered non-default value through history.
interface FiniteHistoryState {
readonly _tag: "History";
readonly fallback: string;
readonly history: "shallow" | "deep";
readonly key: string;
}
A shallow or deep history pseudo-state in a finite generated model.
History states never carry values, become active, or act as transition sources. fallback is a concrete descendant of the direct compound or parallel owner and is used only before that history register is captured.
interface FiniteHistoryTransfer {
readonly event: string;
readonly source: string;
readonly target: string;
}
One exact transition in a generated history witness.
interface FiniteModel {
readonly events: readonly Array<string>;
readonly historyScenarios?: readonly Array<FiniteHistoryScenario>;
readonly initial: string;
readonly roots: readonly Array<FiniteState>;
readonly transitions: readonly Array<FiniteTransition>;
}
A small immutable statechart model suitable for generation and shrinking.
State paths use dot-separated state keys. Transitions are unique by source/event pair. A transition may target any state under its source root, or a different root as a complete configuration.
interface FiniteModelDiagnostics {
readonly guarantees: {
readonly acyclicAutomaticTransitions: true;
readonly choiceInitialWitnesses: true;
readonly choiceStates: true;
readonly compoundOnly: false;
readonly eventlessTransitions: true;
readonly historyLeaveResumeSequences: true;
readonly historyStates: true;
readonly historyValueScenarios: true;
readonly parallelStates: true;
readonly shrinkPreservesValidity: true;
readonly structurallyValid: true;
};
readonly limits: {
readonly maxChildren: number;
readonly maxChoiceStates: number;
readonly maxDepth: number;
readonly maxEvents: number;
readonly maxHistoryStates: number;
readonly maxParallelRegions: 2 | 3;
readonly maxRoots: 1 | 2 | 3;
readonly maxTransitions: number;
};
}
Resolved limits and structural guarantees for a finite model arbitrary.
interface FiniteModelOptions {
readonly maxChildren?: number;
readonly maxChoiceStates?: number;
readonly maxDepth?: number;
readonly maxEvents?: number;
readonly maxHistoryStates?: number;
readonly maxParallelRegions?: 3 | 2;
readonly maxRoots?: 1 | 3 | 2;
readonly maxTransitions?: number;
}
Limits controlling finite model generation.
interface FiniteModels {
readonly arbitrary: Arbitrary<FiniteModel>;
readonly diagnostics: FiniteModelDiagnostics;
}
A finite model arbitrary and the exact limits used to construct it.
interface FiniteParallelState {
readonly _tag: "Parallel";
readonly key: string;
readonly output: string;
readonly states: readonly Array<FiniteState>;
readonly value: number;
}
A parallel state in a finite generated model.
Every direct child is an orthogonal region and is active whenever the parallel state is active. The output is deterministic so completion can be compared without sharing executable callbacks with the reference model.
type FiniteState = FiniteAtomicState | FiniteFinalState | FiniteCompoundState | FiniteParallelState | FiniteHistoryState | FiniteChoiceState
A finite model state.
type FiniteTransition = FiniteEventTransition | FiniteAutomaticTransition
One deterministic event or automatic transition in a finite model.
type FiniteTransitionTrigger = {
readonly event: string;
readonly type: "event";
} | {
readonly type: "always";
} | {
readonly type: "done";
}
The single trigger representation used by generated and hand-authored finite transitions. Event, always, and completion registrations therefore share the same validation, compilation, and reference interpretation path.
interface HistoryCoverageEvidence<Path extends string = string> {
readonly recorded: readonly Array<{
readonly modes: readonly Array<"shallow" | "deep">;
readonly path: Path;
}>;
readonly recordObservations: number;
readonly resolvedTargets: number;
readonly targets: number;
}
Directly observed history records and history-target transitions.
type InitialPlan<M extends AnyMachine> = {
readonly commands: ReadonlyArray<Machine.Command>;
readonly emittedEvents: ReadonlyArray<Machine.Machine.Emit<M>>;
readonly initialEntryPaths: ReadonlyArray<StatePath<M>>;
readonly microsteps: ReadonlyArray<Microstep<M, Machine.Machine.InitialServices<M> | Machine.Machine.Services<M>>>;
readonly startingState: Machine.Machine.Snapshot<Machine.Machine.States<M>>;
readonly state: Machine.Machine.Snapshot<Machine.Machine.States<M>>;
} & PlanCompletion<M>
The complete data returned while planning machine startup.
interface InitialTrace<M extends AnyMachine> {
readonly configuration: readonly Array<StatePath<M>>;
readonly initialEntryPaths: readonly Array<StatePath<M>>;
readonly plan: InitialPlan<M>;
readonly startingConfiguration: readonly Array<StatePath<M>>;
readonly startingState: Snapshot<States<M>>;
}
Startup portion of an executable planner trace.
interface LogicalConfigurationCoverage {
readonly hit: number;
readonly identities: readonly Array<string>;
readonly observations: number;
}
Trace-derived logical configuration counts. There is no claimed exhaustive total.
interface Microstep<M extends AnyMachine, Requirements = Machine.Machine.Services<M>> {
readonly changed: boolean;
readonly commands: readonly Array<Command>;
readonly emittedEvents: readonly Array<Emit<M>>;
readonly entryPaths: readonly Array<string>;
readonly event: InitialEvent | Event<M>;
readonly exitPaths: readonly Array<string>;
readonly next: Snapshot<States<M>>;
readonly raisedEvents: readonly Array<Event<M>>;
readonly transitions: readonly Array<RetainedTransition<StatePath<M>, TagOf<Events<M>[number]>, StateNodePath<M>>>;
}
One public planned microstep, including retained post-conflict transitions.
interface MicrostepCoverageEvidence {
readonly alwaysTriggered: number;
readonly changed: number;
readonly choiceTriggered: number;
readonly doneTriggered: number;
readonly emitted: number;
readonly eventTriggered: number;
readonly raised: number;
readonly targetless: number;
readonly total: number;
}
Directly observed startup and microstep evidence.
type ModelVerificationField = `${ModelStateField}.${"activePaths" | "values" | "completions" | "history"}` | "event.tag" | "initial.startingConfiguration" | "initial.initialEntryPaths" | "initial.plan.initialEntryPaths" | "initial.configuration" | "initial.plan.microsteps" | "initial.plan.done" | "initial.plan.output" | "trace.steps.length" | "step.index" | "step.event" | "step.beforeConfiguration" | "step.plan.microsteps.length" | "microstep.event" | "microstep.transitions" | "microstep.exitPaths" | "microstep.entryPaths" | "microstep.changed" | "step.afterConfiguration" | "step.plan.done" | "step.plan.output" | "trace.finalConfiguration"
Stable semantic observation compared by the finite-model oracle.
interface ModelVerificationLocation {
readonly eventIndex?: number;
readonly microstepIndex?: number;
readonly phase: "final" | "event" | "initial";
}
Location of one planner/reference disagreement.
interface ModelVerificationMismatch {
readonly actual: unknown;
readonly expected: unknown;
readonly field: ModelVerificationField;
readonly location: ModelVerificationLocation;
readonly message: string;
}
One structured semantic disagreement with the independent interpreter.
interface ObservedGraph<M extends AnyMachine> {
readonly graph: DirectedGraph<ObservedGraphNode<M>, ObservedGraphEdge<M>>;
readonly nodesById: ReadonlyMap<string, number>;
readonly starts: readonly Array<number>;
readonly startupSources: readonly Array<number>;
}
An Effect directed graph plus stable indexes useful to graph algorithms.
type ObservedGraphEdge<M extends AnyMachine> = {
readonly _tag: "Startup";
readonly completion: PlanCompletion<M>;
readonly microsteps: ReadonlyArray<ObservedGraphMicrostep<M>>;
readonly traceIndex: number;
} | {
readonly _tag: "Event";
readonly completion: PlanCompletion<M>;
readonly event: Machine.Machine.InputEvent<M>;
readonly eventIndex: number;
readonly microsteps: ReadonlyArray<ObservedGraphMicrostep<M>>;
readonly traceIndex: number;
}
A startup or public-event macrostep retained by the observed graph.
interface ObservedGraphMicrostep<M extends AnyMachine> {
readonly changed: boolean;
readonly emittedEvents: readonly Array<Emit<M>>;
readonly entryPaths: readonly Array<StatePath<M>>;
readonly event: InitialEvent | Event<M>;
readonly exitPaths: readonly Array<StatePath<M>>;
readonly next: string;
readonly raisedEvents: readonly Array<Event<M>>;
readonly transitions: readonly Array<RetainedTransition<StatePath<M>, TagOf<Events<M>[number]>, StateNodePath<M>>>;
}
Retained evidence for one microstep inside an observed graph edge.
interface ObservedGraphNode<M extends AnyMachine> {
readonly configuration: readonly Array<StatePath<M>>;
readonly encoded: EncodedSnapshot;
readonly id: string;
readonly observations: ObservedGraphNodeObservations;
readonly snapshot: Snapshot<States<M>>;
}
One full encoded logical snapshot stored in the observed Effect graph.
interface ObservedGraphNodeObservations {
readonly event: number;
readonly microstep: number;
readonly startup: number;
readonly total: number;
}
The observation roles summarized for one logical graph node.
type PlanCompletion<M extends AnyMachine> = {
readonly done: true;
readonly output: Machine.Machine.Output<M>;
} | {
readonly done: false;
readonly output: undefined;
}
Completion information retained by an initial or event plan.
interface PlannerRuntimeAgreementViolation<M extends AnyMachine = AnyMachine> {
readonly command: RuntimeCommand<InputEvent<M>>;
readonly commandIndex: number;
readonly field: "commands" | "emittedEvents" | "planning" | "handled" | "configurationChanged" | "planNext" | "after" | "completion" | "microsteps";
readonly message: string;
}
One disagreement between pure planning and a causally processed send.
interface ReferenceCompletion {
readonly output: string;
readonly path: string;
}
One output retained for an actively completed state.
interface ReferenceHistoryRecord {
readonly active: readonly Array<string>;
readonly mode: "shallow" | "deep";
readonly values: Readonly<Record<string, ReferenceStateValue>>;
}
One independently captured shallow or deep history register.
interface ReferenceInitialStep {
readonly done: boolean;
readonly initialEntryPaths: readonly Array<string>;
readonly microsteps: readonly Array<ReferenceMicrostep>;
readonly output: string | undefined;
readonly startingState: ReferenceState;
readonly state: ReferenceState;
}
Startup semantics calculated without executing the real machine.
interface ReferenceMicrostep {
readonly changed: boolean;
readonly entryPaths: readonly Array<string>;
readonly event: string;
readonly exitPaths: readonly Array<string>;
readonly next: ReferenceState;
readonly transitions: readonly Array<ReferenceTransition>;
}
The independently calculated planner microstep for one selected event.
interface ReferenceState {
readonly activePaths: readonly Array<string>;
readonly completions: readonly Array<ReferenceCompletion>;
readonly history: Readonly<Record<string, ReferenceHistoryRecord>>;
readonly output: string | undefined;
readonly status: "active" | "done";
readonly values: Readonly<Record<string, ReferenceStateValue>>;
}
An independently interpreted finite-model configuration.
interface ReferenceStateValue {
readonly _tag: string;
readonly value: number;
}
The deterministic value assigned to one active finite-model state.
interface ReferenceStep {
readonly after: ReferenceState;
readonly before: ReferenceState;
readonly done: boolean;
readonly event: string;
readonly index: number;
readonly microsteps: readonly Array<ReferenceMicrostep>;
readonly output: string | undefined;
}
One public event interpreted against a reference configuration.
interface ReferenceTrace {
readonly events: readonly Array<string>;
readonly final: ReferenceState;
readonly initial: ReferenceInitialStep;
readonly steps: readonly Array<ReferenceStep>;
}
A complete, pure interpretation of a finite model and event sequence.
interface ReferenceTransition {
readonly reenter: boolean;
readonly resolvedTarget: string | undefined;
readonly source: string;
readonly target: string | undefined;
readonly trigger: {
readonly event: string;
readonly type: "event";
} | {
readonly type: "always";
} | {
readonly type: "done";
} | {
readonly type: "choice";
};
}
One transition retained by the independent reference step.
type RunFailure<Cause, M extends AnyMachine = AnyMachine> = {
readonly _tag: "MachineTestRunFailure";
readonly cause: Cause;
readonly event: undefined;
readonly eventIndex: undefined;
readonly initial: undefined;
readonly phase: "initial";
readonly scenario: Scenario<M>;
readonly steps: readonly [];
} | {
readonly _tag: "MachineTestRunFailure";
readonly cause: Cause;
readonly event: Machine.Machine.InputEvent<M>;
readonly eventIndex: number;
readonly initial: InitialTrace<M>;
readonly phase: "event";
readonly scenario: Scenario<M>;
readonly steps: ReadonlyArray<TraceStep<M>>;
}
A typed planning failure together with every successfully completed trace segment preceding it.
type RunServices<M extends AnyMachine> = IsAny<Machine.PlanningServices<Machine.Machine.InitialServices<M> | Machine.Machine.Services<M>>> extends true ? Machine.PlanningServices<Machine.Machine.InitialServices<M> | Machine.Machine.Services<M>> : never
Services required while planning a complete scenario.
Scenario execution delegates exclusively to the service-free planInitial and plan APIs. Invoke services and managed runtime capabilities belong to later execution, not synchronous planning.
interface RuntimeAssertionContext<Model, Expected, State, Event, Error, Output, Observed> extends RuntimeInspectionContext<State, Event, Error, Output> {
readonly actual: RuntimeCommandActual<State, Error, Output, Observed>;
readonly command: RuntimeCommand<Event>;
readonly expected: Expected;
readonly index: number;
readonly model: Model;
readonly published: readonly Array<RuntimeSnapshot<State, Error, Output>>;
readonly ref: MachineRef<State, Event, Error, Output>;
readonly result: RuntimeCommandResult;
readonly snapshot: RuntimeSnapshot<State, Error, Output> | undefined;
}
Context supplied to the reference-model assertion.
type RuntimeAwait<State, Error, Output> = {
readonly _tag: "None";
} | {
readonly _tag: "Until";
readonly predicate: (snapshot: Machine.RuntimeSnapshot<State, Error, Output>) => boolean;
}
Additional asynchronous observation requested after a causal command has completed. None never guesses that later invoke, timer, or child work is finished. Until observes the current runtime snapshot and subsequent publications until its predicate matches.
type RuntimeCommand<Event> = {
readonly _tag: "Send";
readonly event: Event;
} | {
readonly _tag: "Advance";
readonly duration: Duration.Input;
} | {
readonly _tag: "Stop";
} | {
readonly _tag: "Checkpoint";
readonly label: string | undefined;
}
A command applied to a running machine during model-based testing.
interface RuntimeCommandActual<State, Error, Output, Observed> {
readonly inspected: Observed | undefined;
readonly published: readonly Array<RuntimeSnapshot<State, Error, Output>>;
readonly result: RuntimeCommandResult;
readonly snapshot: RuntimeSnapshot<State, Error, Output> | undefined;
}
Actual evidence made available to a runtime command assertion.
interface RuntimeCommandInvariantContext<M extends AnyMachine> {
readonly awaited: readonly Array<RuntimeSnapshot<Snapshot<States<M>>, RuntimeInvariantErrorChannel<M>, Output<M>>>;
readonly command: RuntimeCommand<InputEvent<M>>;
readonly index: number;
readonly machine: M;
readonly previous: RuntimeInvariantRecord<M> | undefined;
readonly record: RuntimeInvariantRecord<M>;
readonly result: CausalRuntimeCommandResult<M>;
readonly snapshot: RuntimeSnapshot<Snapshot<States<M>>, RuntimeInvariantErrorChannel<M>, Output<M>>;
readonly transcript: RuntimeInvariantTranscript<M>;
}
Evidence passed to an invariant for one completed causal command.
interface RuntimeCommandRecord<Model, Expected, State, Event, Error, Output, Observed> {
readonly actual: RuntimeCommandActual<State, Error, Output, Observed>;
readonly command: RuntimeCommand<Event>;
readonly expected: Expected;
readonly index: number;
readonly model: Model;
}
One successfully checked command in a replayable runtime transcript.
type RuntimeCommandResult = {
readonly _tag: "SendAccepted";
} | {
readonly _tag: "SendRejected";
readonly error: Machine.StoppedError;
} | {
readonly _tag: "ClockAdvanced";
} | {
readonly _tag: "Stopped";
} | {
readonly _tag: "Checkpoint";
}
The result of executing one runtime command.
interface RuntimeCommands<M extends AnyMachine> {
readonly arbitrary: Arbitrary<readonly Array<RuntimeCommand<InputEvent<M>>>>;
readonly diagnostics: RuntimeCommandsDiagnostics;
}
A shrinkable runtime command arbitrary and its derivation diagnostics.
interface RuntimeCommandsDiagnostics {
readonly events: "none" | "schema" | "override";
readonly includesAdvance: boolean;
readonly includesCheckpoint: boolean;
readonly includesStop: boolean;
readonly schemaReports: readonly Array<SchemaArbitraryReport>;
}
Diagnostics describing a schema-derived runtime command arbitrary.
interface RuntimeCommandsOptions<M extends AnyMachine> {
readonly additionalCommands?: readonly Array<Arbitrary<RuntimeCommand<InputEvent<M>>>>;
readonly advanceArbitrary?: Arbitrary<Input>;
readonly eventArbitrary?: Arbitrary<InputEvent<M>>;
readonly includeAdvance?: boolean;
readonly includeCheckpoint?: boolean;
readonly includeStop?: boolean;
readonly maxCommands?: number;
readonly minCommands?: number;
}
Options controlling schema-derived runtime command generation.
interface RuntimeInspectionContext<State, Event, Error, Output> {
readonly command: RuntimeCommand<Event>;
readonly index: number;
readonly published: readonly Array<RuntimeSnapshot<State, Error, Output>>;
readonly ref: MachineRef<State, Event, Error, Output>;
readonly result: RuntimeCommandResult;
readonly snapshot: RuntimeSnapshot<State, Error, Output> | undefined;
}
Context supplied to a custom runtime inspection effect.
interface RuntimeInvariantBuilder<M extends AnyMachine> {
readonly command: (name: string, check: (context: RuntimeCommandInvariantContext<M>) => InvariantOutcome, options?: InvariantOptions<RuntimeCommandInvariantContext<M>>) => RuntimeCommandInvariant<M>;
readonly snapshot: (name: string, check: (context: RuntimeSnapshotInvariantContext<M>) => InvariantOutcome, options?: RuntimeSnapshotInvariantOptions<M>) => RuntimeSnapshotInvariant<M>;
readonly transcript: (name: string, check: (context: RuntimeTranscriptInvariantContext<M>) => InvariantOutcome, options?: InvariantOptions<RuntimeTranscriptInvariantContext<M>>) => RuntimeTranscriptInvariant<M>;
}
Machine-bound runtime invariant constructors with exact event inference.
interface RuntimeInvariantCheckResult {
readonly failures: number;
readonly invariant: string;
readonly observations: number;
readonly scope: RuntimeInvariantScope;
readonly status: InvariantStatus;
}
Aggregate result for one runtime invariant.
interface RuntimeInvariantRecord<M extends AnyMachine> {
readonly awaited: readonly Array<RuntimeSnapshot<Snapshot<States<M>>, RuntimeInvariantErrorChannel<M>, Output<M>>>;
readonly command: RuntimeCommand<InputEvent<M>>;
readonly index: number;
readonly result: CausalRuntimeCommandResult<M>;
readonly snapshot: RuntimeSnapshot<Snapshot<States<M>>, RuntimeInvariantErrorChannel<M>, Output<M>>;
}
A model-independent command record supplied to runtime laws.
interface RuntimeInvariantReport {
readonly checks: readonly Array<RuntimeInvariantCheckResult>;
}
Aggregate result for all checked runtime invariants.
interface RuntimeInvariantTranscript<M extends AnyMachine> {
readonly commands: readonly Array<RuntimeCommand<InputEvent<M>>>;
readonly final: RuntimeSnapshot<Snapshot<States<M>>, RuntimeInvariantErrorChannel<M>, Output<M>>;
readonly initial: RuntimeSnapshot<Snapshot<States<M>>, RuntimeInvariantErrorChannel<M>, Output<M>>;
readonly records: readonly Array<RuntimeInvariantRecord<M>>;
}
A model-independent causal transcript supplied to runtime laws.
interface RuntimeInvariantViolation<M extends AnyMachine = AnyMachine> {
readonly awaitedIndex?: number;
readonly command?: RuntimeCommand<InputEvent<M>>;
readonly commandIndex: number | undefined;
readonly invariant: string;
readonly kind: "predicate" | "observations";
readonly message: string;
readonly observationIndex?: number;
readonly phase?: RuntimeSnapshotObservation;
readonly scope: RuntimeInvariantScope;
}
One runtime invariant violation and its exact retained location.
interface RuntimeModelOptions<Model, Expected, State, Event, Error, Output, Observed = never, ModelError = never, ModelServices = never, InspectionError = never, InspectionServices = never, AssertionError = never, AssertionServices = never> {
readonly assert: (context: RuntimeAssertionContext<Model, Expected, State, Event, Error, Output, Observed>) => Effect<void, AssertionError, AssertionServices>;
readonly initialModel: Model;
readonly inspect?: (context: RuntimeInspectionContext<State, Event, Error, Output>) => Effect<Observed, InspectionError, InspectionServices>;
readonly observationTimeout?: Input;
readonly transition: (model: Model, command: RuntimeCommand<Event>, index: number) => Effect<RuntimeModelStep<Model, Expected, State, Error, Output>, ModelError, ModelServices>;
}
Configuration for an Effect-native runtime command-model run.
interface RuntimeModelStep<Model, Expected, State, Error, Output> {
readonly expected: Expected;
readonly model: Model;
readonly synchronize: RuntimeSynchronization<State, Error, Output>;
}
The pure/reference-model result for one runtime command.
interface RuntimeSnapshotInvariantContext<M extends AnyMachine> {
readonly awaitedIndex: number | undefined;
readonly command: RuntimeCommand<InputEvent<M>> | undefined;
readonly commandIndex: number | undefined;
readonly machine: M;
readonly observationIndex: number;
readonly phase: RuntimeSnapshotObservation;
readonly result: CausalRuntimeCommandResult<M> | undefined;
readonly snapshot: RuntimeSnapshot<Snapshot<States<M>>, RuntimeInvariantErrorChannel<M>, Output<M>>;
readonly transcript: RuntimeInvariantTranscript<M>;
}
Evidence passed to a runtime snapshot invariant.
interface RuntimeSnapshotInvariantOptions<M extends AnyMachine> extends InvariantOptions<RuntimeSnapshotInvariantContext<M>> {
readonly observe?: RuntimeSnapshotObservationMode;
readonly require?: {
readonly minObservations: number;
};
readonly when?: (context: RuntimeSnapshotInvariantContext) => boolean;
}
Options for a runtime snapshot invariant.
type RuntimeSynchronization<State, Error, Output> = {
readonly _tag: "None";
} | {
readonly _tag: "Current";
} | {
readonly _tag: "Next";
} | {
readonly _tag: "Until";
readonly predicate: (snapshot: Machine.RuntimeSnapshot<State, Error, Output>) => boolean;
}
Defines how a model step synchronizes with public machine observations.
None is appropriate when a send is intentionally only enqueued. Next consumes the next snapshot published after the previously consumed one. Until also consumes intermediate snapshots and is useful for a checkpoint after several queued sends. Current is only a sample; it should be used when the model already knows there is no outstanding asynchronous work.
interface RuntimeTranscript<Model, Expected, State, Event, Error, Output, Observed> {
readonly commands: readonly Array<RuntimeCommand<Event>>;
readonly final: RuntimeSnapshot<State, Error, Output>;
readonly finalModel: Model;
readonly initial: RuntimeSnapshot<State, Error, Output>;
readonly records: readonly Array<RuntimeCommandRecord<Model, Expected, State, Event, Error, Output, Observed>>;
readonly synchronized: boolean;
}
A complete command-model execution transcript.
interface RuntimeTranscriptInvariantContext<M extends AnyMachine> {
readonly machine: M;
readonly transcript: RuntimeInvariantTranscript<M>;
}
Evidence passed to a whole-runtime-transcript invariant.
type Scenario<M extends AnyMachine> = Machine.Machine.Input<M> extends typeof Schema.Void ? {
readonly events: ReadonlyArray<Machine.Machine.InputEvent<M>>;
} : {
readonly events: ReadonlyArray<Machine.Machine.InputEvent<M>>;
readonly input: InputValue<M>;
}
A generated public-input scenario for a machine.
Machines without an input schema omit input; machines with one retain its exact decoded type. Events use only the public input protocol.
interface ScenarioCoverage {
readonly empty: number;
readonly events: number;
readonly traces: number;
}
Trace-derived scenario counts. There is no finite declared scenario space.
interface ScenarioDiagnostics {
readonly events: "schema" | "override" | "empty";
readonly input: "none" | "schema" | "override";
readonly schemas: readonly Array<SchemaArbitraryDiagnostic>;
}
Diagnostics describing how a scenario arbitrary was assembled.
type ScenarioOptions<M extends AnyMachine> = {
readonly eventsArbitrary?: FastCheck.Arbitrary<ReadonlyArray<Machine.Machine.InputEvent<M>>>;
readonly maxEvents?: number;
readonly minEvents?: number;
} & Machine.Machine.Input<M> extends typeof Schema.Void ? {
readonly inputArbitrary?: never;
} : {
readonly inputArbitrary?: FastCheck.Arbitrary<InputValue<M>>;
}
Options for schema-derived scenario generation.
inputArbitrary and eventsArbitrary replace their complete generated value. An events override therefore owns its own length distribution.
interface Scenarios<M extends AnyMachine> {
readonly arbitrary: Arbitrary<Scenario<M>>;
readonly diagnostics: ScenarioDiagnostics;
}
A scenario arbitrary together with schema-derivation diagnostics.
interface SchemaArbitraryDiagnostic {
readonly boundary: "event" | "input";
readonly index: number | undefined;
readonly report: SchemaArbitraryReport;
}
Diagnostics for one schema-derived arbitrary.
interface SchemaArbitraryOpaqueFilterWarning {
readonly _tag: "OpaqueFilter";
readonly description?: string;
readonly path: readonly Array<PropertyKey>;
}
Warning emitted when schema arbitrary generation must enforce an opaque filter through rejection sampling.
interface SchemaArbitraryReport {
readonly warnings: readonly Array<SchemaArbitraryOpaqueFilterWarning>;
}
Diagnostics collected while deriving a schema arbitrary.
type SchemaArbitraryWarning = SchemaArbitraryOpaqueFilterWarning
Non-fatal diagnostic emitted while deriving a schema arbitrary.
interface StateCoverage<Path extends string = string> {
readonly activation: CoverageSummary<StateCoverageItem<Path>>;
readonly entry: CoverageSummary<StateCoverageItem<Path>>;
readonly exit: CoverageSummary<StateCoverageItem<Path>>;
}
State activation and lifecycle coverage.
interface StateCoverageItem<Path extends string = string> {
readonly path: Path;
readonly type: "final" | "parallel" | "choice" | "atomic" | "compound";
}
One active (non-history) state node in a state coverage summary.
interface Trace<M extends AnyMachine> {
readonly final: Snapshot<States<M>>;
readonly finalConfiguration: readonly Array<StatePath<M>>;
readonly initial: InitialTrace<M>;
readonly scenario: Scenario<M>;
readonly steps: readonly Array<TraceStep<M>>;
}
A scenario and every plan produced by executing it without running actions.
interface TraceStep<M extends AnyMachine> {
readonly after: Snapshot<States<M>>;
readonly afterConfiguration: readonly Array<StatePath<M>>;
readonly before: Snapshot<States<M>>;
readonly beforeConfiguration: readonly Array<StatePath<M>>;
readonly event: InputEvent<M>;
readonly index: number;
readonly plan: EventPlan<M>;
}
One event portion of an executable planner trace.
interface TransitionCoverageItem<SourcePath extends string = string, EventTag extends PropertyKey = PropertyKey, TargetPath extends string = SourcePath> {
readonly id: string;
readonly index: number;
readonly reenter: boolean;
readonly source: SourcePath;
readonly targets: TransitionTargets<TargetPath>;
readonly trigger: TransitionTrigger<EventTag>;
}
One stable transition-definition identity in definition order.
type VerificationLaw = "configuration.shape" | "configuration.path" | "configuration.schema" | "configuration.hierarchy" | "configuration.compound" | "configuration.parallel" | "configuration.duplicate" | "configuration.trace" | "microsteps.unique" | "microsteps.order" | "microsteps.activeBefore" | "microsteps.activeAfter" | "microsteps.changed" | "microsteps.continuity" | "microsteps.reentry" | "completion.record" | "completion.output" | "completion.done" | "history.record" | "history.mode" | "history.path" | "history.value" | "history.shallow" | "history.deep" | "targetBounds.definition" | "targetBounds.target"
Stable identifiers for individual planner laws.
type VerificationLawGroup = "configuration" | "microsteps" | "completion" | "history" | "targetBounds"
Independently checked families of planner laws.
interface VerificationViolation {
readonly eventIndex: number | undefined;
readonly law: VerificationLaw;
readonly message: string;
readonly microstepIndex?: number;
readonly path?: string;
}
One independently observed violation in a planner trace.
interface VerifyOptions {
readonly laws?: readonly Array<VerificationLawGroup>;
}
Selects law families for the single canonical verifier. All run by default.
Runtime Testing
5declare const probe: <M extends AnyMachine, Error, Output>(machine: ReadyMachine<M>, ref: Machine.MachineRef<Machine.Machine.Snapshot<Machine.Machine.States<M>>, Machine.Machine.InputEvent<M>, Error, Output>) => Effect.Effect<Probe<M, Error, Output>, internal.ProbeUnavailableError>
Attaches testing-only causal event delivery to a running statechart.
The returned probe exposes sendAndAwait; ordinary production sends remain available exclusively through MachineRef.send and retain their asynchronous enqueue-only semantics.
import { Effect, Schema } from "effect"
import { Machine } from "@typeonce/effect-machine"
import { MachineTest } from "@typeonce/effect-machine/testing"
class Idle extends Schema.TaggedClass<Idle>("Idle")("Idle", {}) {}
const States = Machine.defineStates({ Idle })
const machine = Machine.make({
states: States.states,
events: [],
initial: () => States.initial.Idle.from()
}).handle({ Idle: {} })
const program = Effect.gen(function*() {
const ref = yield* Machine.start(machine)
return yield* MachineTest.probe(machine, ref)
})
interface Probe<M extends AnyMachine, Error = never, Output = never> {
readonly await: {
readonly none: RuntimeAwait<Snapshot<States<M>>, Error, Output>;
readonly until: (predicate: (snapshot: RuntimeSnapshot<Snapshot<States<M>>, Error, Output>) => boolean) => RuntimeAwait<Snapshot<States<M>>, Error, Output>;
};
readonly machine: M;
readonly ref: MachineRef<Snapshot<States<M>>, InputEvent<M>, Error, Output>;
readonly sendAndAwait: (event: InputEvent<M>) => Effect<ProbeStep<M>, StoppedError | Error>;
}
Testing-only causal access to a managed statechart reference.
A probe does not change ordinary machine scheduling. sendAndAwait uses an acknowledged mailbox delivery so an ignored event can be proven processed without waiting for a snapshot that will never be published.
type ProbeMicrostep<M extends AnyMachine> = Omit<Microstep<M>, "transitions">
One runtime microstep retained by the execution strategy used by a probe.
Transition-definition metadata is intentionally not reconstructed here: optimized runtimes retain execution evidence, while run and plan remain the APIs for complete diagnostic transition metadata.
type ProbePlan<M extends AnyMachine> = {
readonly commands: ReadonlyArray<Machine.Command>;
readonly emittedEvents: ReadonlyArray<Machine.Machine.Emit<M>>;
readonly microsteps: ReadonlyArray<ProbeMicrostep<M>>;
readonly next: Machine.Machine.Snapshot<Machine.Machine.States<M>>;
} & PlanCompletion<M>
Runtime plan evidence associated with one acknowledged public event.
interface ProbeStep<M extends AnyMachine> {
readonly after: Snapshot<States<M>>;
readonly before: Snapshot<States<M>>;
readonly configurationChanged: boolean;
readonly event: InputEvent<M>;
readonly handled: boolean;
readonly plan: ProbePlan<M>;
}
Causal evidence produced after one event has completed its managed runtime macrostep.
handled distinguishes an ignored event from a retained transition that deliberately leaves the logical state unchanged. configurationChanged reports whether any microstep changed or reentered the active statechart configuration; compare before and after for state-value assertions.
Utility Types
1type RuntimeInvariantErrorChannel<M extends AnyMachine> = Machine.Machine.Error<M> | Machine.ActionError<Machine.Machine.Services<M>> | Machine.InfiniteTransitionError | Machine.MachineSchemaDecodeError | Machine.StoppedError
The runtime error channel exposed by a managed reference for a machine.
Verification
10declare const assertInvariants: <M extends AnyMachine>(machine: M, trace: Trace<M>, invariants: ReadonlyArray<Invariant<M>>) => Effect.Effect<void, internal.InvariantError<M>>
Asserts user-defined semantic invariants and discards the success report.
This is the property-test-oriented form of checkInvariants: its void success works directly with it.effect.prop, while failures retain the same complete report and trace evidence.
declare const assertPlannerRuntimeAgreement: <M extends AnyMachine, Error, Output>(machine: ReadyMachine<M>, transcript: CausalRuntimeEvidence<M, Error, Output>) => Effect.Effect<void, internal.PlannerRuntimeAgreementError<M>, RunServices<M>>
Checks that every processed public send agrees with a fresh pure plan.
declare const assertRuntimeInvariants: <M extends AnyMachine, Error, Output>(machine: M, transcript: CausalRuntimeEvidence<M, Error, Output>, invariants: ReadonlyArray<RuntimeInvariant<M>>) => Effect.Effect<void, internal.RuntimeInvariantError<M>>
Asserts runtime invariants against an existing causal transcript.
declare const checkInvariants: <M extends AnyMachine>(machine: M, trace: Trace<M>, invariants: ReadonlyArray<Invariant<M>>) => Effect.Effect<InvariantReport, internal.InvariantError<M>>
Checks user-defined semantic invariants against an existing planner trace.
Every invariant and matching observation is evaluated so one failure contains all relevant evidence. Combine this with scenarios and run in an Effect property test to retain FastCheck shrinking.
declare const checkRuntimeInvariants: <M extends AnyMachine, Error, Output>(machine: M, transcript: CausalRuntimeEvidence<M, Error, Output>, invariants: ReadonlyArray<RuntimeInvariant<M>>) => Effect.Effect<RuntimeInvariantReport, internal.RuntimeInvariantError<M>>
Checks runtime invariants and returns their complete non-vacuity report.
declare const coverage: <M extends AnyMachine>(machine: M, traceOrTraces: Trace<M> | ReadonlyArray<Trace<M>>) => Coverage<M>
Computes deterministic, definition-aware coverage from completed planner traces. Finite declared sets report hits and misses; scenarios and logical configurations report observations only because their complete spaces are generally infinite.
import { Effect, Schema } from "effect"
import { Machine } from "@typeonce/effect-machine"
import { MachineTest } from "@typeonce/effect-machine/testing"
class Idle extends Schema.TaggedClass<Idle>("Idle")("Idle", {}) {}
const States = Machine.defineStates({ Idle })
const machine = Machine.make({
states: States.states,
events: [],
initial: () => States.initial.Idle.from()
}).handle({ Idle: {} })
const report = Effect.map(
MachineTest.run(machine, { events: [] }),
(trace) => MachineTest.coverage(machine, trace)
)
declare const interpretModel: (model: FiniteModel, events: ReadonlyArray<string>) => ReferenceModel.ReferenceTrace
Purely interprets a finite hierarchical model without compiling a machine.
declare const observedGraph: <M extends AnyMachine>(machine: M, traceOrTraces: Trace<M> | ReadonlyArray<Trace<M>>) => Effect.Effect<ObservedGraph<M>, Machine.MachineSchemaEncodeError, Machine.Machine.SnapshotEncodingServices<Machine.Machine.States<M>>>
Converts concrete planner traces into an observed logical-state graph. Nodes are deduplicated by the public snapshot encoding and every edge is a concrete startup or public-event macrostep. This intentionally does not claim to be a static or exhaustive graph of the machine.
declare const verify: <M extends AnyMachine>(machine: M, trace: Trace<M>, options?: VerifyOptions) => Effect.Effect<void, VerificationError>
Verifies an executed trace using only public machine inspection and raw snapshot data. The verifier deliberately does not reuse planner normalization, encoding, finality, or other internal helpers.
Every selected law is evaluated and returned in one structured error so a shrunk property-test counterexample retains all relevant evidence.
import { Effect, Schema } from "effect"
import { Machine } from "@typeonce/effect-machine"
import { MachineTest } from "@typeonce/effect-machine/testing"
class Idle extends Schema.TaggedClass<Idle>("Idle")("Idle", {}) {}
const States = Machine.defineStates({ Idle })
const machine = Machine.make({
states: States.states,
events: [],
initial: () => States.initial.Idle.from()
}).handle({ Idle: {} })
const checked = Effect.gen(function*() {
const trace = yield* MachineTest.run(machine, { events: [] })
yield* MachineTest.verify(machine, trace)
})
declare const verifyModel: <M extends AnyMachine>(model: FiniteModel, actualTrace: Trace<M>) => Effect.Effect<void, ReferenceModel.ModelVerificationError>
Checks a real planner trace against the independent finite statechart model interpreter.
The oracle does not import the machine compiler, planner, snapshot helpers, or target builders. It compares semantic projections of the public trace and accumulates every disagreement in one structured error.