Defining Loops
Yaml Format
Loop definition YAML reference
This format is validated by LoopDefinitionSchema in @loop-engine/dsl.
Top-level fields
id: string(required)version: stringsemverx.y.z(required)description: string(required)domain: string(required)states: StateSpec[](required, at least 1)initialState: string(required, must exist instates)transitions: TransitionSpec[](required)outcome: OutcomeSpec(required)participants?: string[]spawnableLoops?: string[]metadata?: Record<string, unknown>
StateSpec
id: string(required)description?: stringisTerminal?: booleanisError?: boolean
TransitionSpec
id: stringfrom: stringto: stringallowedActors: ("human" | "automation" | "ai-agent" | "webhook" | "system")[]guards?: GuardSpec[]sideEffects?: SideEffectSpec[]description?: string
GuardSpec
id: stringdescription: stringfailureMessage: stringseverity: "hard" | "soft"evaluatedBy: "runtime" | "module" | "external"
OutcomeSpec
id: stringdescription: stringvalueUnit: stringmeasurable: booleanbusinessMetrics?: BusinessMetric[]
Annotated example (scm.procurement)
1id: scm.procurement2version: 1.0.03domain: scm4description: Purchase order lifecycle through settlement5 6states:7 - id: OPEN8 - id: PO_CONFIRMED9 - id: RECEIVED10 - id: INVOICE_MATCHED11 - id: SETTLED12 isTerminal: true13 - id: DISPUTED14 isError: true15 16initialState: OPEN17 18transitions:19 - id: confirm_po20 from: OPEN21 to: PO_CONFIRMED22 allowedActors: [human, automation, ai-agent]23 guards:24 - id: approval_obtained25 severity: hard26 evaluatedBy: external27 description: PO must be approved before confirmation28 failureMessage: PO confirmation requires explicit approval29 30outcome:31 id: po_settled32 description: Purchase order settled with matched invoice33 valueUnit: po_settled34 measurable: true35 businessMetrics:36 - id: cycle_time_days37 label: PO cycle time (days)38 unit: days39 improvableByAI: trueCommon validation errors
initialStatenot found instates- transition
from/toreferences unknown state - empty
allowedActors - duplicate state IDs
- invalid
versionformat (must be semver)