Defining Loops
Typescript Builder
LoopBuilder API (@loop-engine/dsl)
LoopBuilder is a fluent authoring API that validates on .build().
Signatures
1LoopBuilder.create(id: string, domain: string): LoopBuilder2version(v: string): LoopBuilder3description(d: string): LoopBuilder4state(id: string, options?: { isTerminal?: boolean; isError?: boolean }): LoopBuilder5initialState(id: string): LoopBuilder6transition(spec: {7 id: string8 from: string9 to: string10 actors: ActorType[]11 guards?: Partial<GuardSpec>[]12}): LoopBuilder13outcome(spec: {14 id?: string15 description?: string16 valueUnit?: string17 measurable?: boolean18 businessMetrics?: Array<{ id: string; label: string; unit: string; improvableByAI: boolean }>19}): LoopBuilder20build(): LoopDefinitionRuntime behavior notes
.transition()throws ifactorsis empty..build()throws if outcome is missing..build()validates viavalidateLoopDefinition().
Example: procurement-style loop in TypeScript
1import { LoopBuilder } from '@loop-engine/dsl'2 3const procurement = LoopBuilder4 .create('scm.procurement', 'scm')5 .version('1.0.0')6 .description('Purchase order lifecycle through settlement')7 .state('OPEN')8 .state('PO_CONFIRMED')9 .state('RECEIVED')10 .state('INVOICE_MATCHED')11 .state('SETTLED', { isTerminal: true })12 .initialState('OPEN')13 .transition({14 id: 'confirm_po',15 from: 'OPEN',16 to: 'PO_CONFIRMED',17 actors: ['human', 'automation', 'ai-agent'],18 guards: [19 {20 id: 'approval_obtained',21 severity: 'hard',22 evaluatedBy: 'external',23 description: 'PO must be approved',24 failureMessage: 'PO confirmation requires explicit approval'25 }26 ]27 })28 .outcome({29 id: 'po_settled',30 description: 'Purchase order settled',31 valueUnit: 'po_settled',32 measurable: true33 })34 .build()Use YAML when loop definitions are owned by ops/product teams; use builder when you prefer type-guided code review and composition.