Packages
@loop-engine/observability
@loop-engine/observability converts instance + transition data into metrics and replayable timelines.
Install
1npm install @loop-engine/observabilityMetrics
1interface LoopMetrics {2 loopId: LoopId3 period: { from: string; to: string }4 totalInstances: number5 openInstances: number6 closedInstances: number7 errorInstances: number8 avgDurationMs: number9 medianDurationMs: number10 p95DurationMs: number11 completionRate: number12 guardFailureRate: number13 aiActorRate: number14 humanActorRate: number15 avgTransitionCount: number16}17 18declare function computeMetrics(19 instances: LoopInstance[],20 history: TransitionRecord[],21 period: { from: string; to: string }22): LoopMetricsThe open/closed/error instance counters reflect LoopStatus groupings: openInstances counts pending | active | suspended, closedInstances counts completed | cancelled, and errorInstances counts failed.
1"cmt">// @no-typecheck2import { computeMetrics } from "@loop-engine/observability"3 4const metrics = computeMetrics(instances, history, {5 from: "2026-03-01T00:00:00.000Z",6 to: "2026-03-31T23:59:59.999Z"7})Timeline
1declare function buildTimeline(2 instance: LoopInstance,3 history: TransitionRecord[]4): LoopTimeline5 6declare function getStateResidency(7 timeline: LoopTimeline8): StateResidency[]LoopTimeline surfaces the ordered sequence of state entries and transitions for a single instance; StateResidency reports total duration spent in each state. Use them to power audit UIs and state-duration debugging.
Replay
1declare function replayLoop(2 definition: LoopDefinition,3 history: TransitionRecord[]4): { valid: boolean; errors: string[] }Replay verifies that recorded transitions are valid against the current loop definition.