Skip to main content

16. Decision log

ADRDecisionRationale
001Ports-and-adapters: traits in core, adapters in library cratesSwap any component without touching the others
002Hand-written AG-UI 1.0 types instead of ag-ui-core 0.1.0The crate predates outcomes and interrupts. Revisit when the ag-ui 1.0 crate is published
003graph-flow with all default features off, confined to engine/ and kinds/Avoids a second rig-core (0.42) and a second sqlx (0.8). Limits the blast radius of a small dependency
004Native connectors by default; Activepieces CE optional with enterprise code removedStrict open-source requirement, fewer moving parts
005OpenTelemetry Collector and Jaeger by default; Opik or Langfuse OSS optional; Phoenix rejectedElastic License is not OSI. AGPL avoided under the permissive preference
006Valkey for Redis and SeaweedFS for MinIO, in optional services onlyBSD-3 and Apache-2.0 instead of RSAL/SSPL and AGPL
007Qwen3.8-27B and Qwen3-Embedding-0.6B, re-evaluated quarterlyApache-2.0, vLLM recipes, single-GPU capable
008Approval interrupts use reason: "confirmation"Avoids the client synthesising tool results
009Postgres for data, vectors, queue and checkpointsOne stateful dependency in the core
010The backend is one Loco app plus framework-free library cratesLoco supplies boot, config, CLI, database, queue, scheduler and auth
011Two YAML layers: Loco environment files and config/agents/ definitionsDeployment values vary per environment. Business behaviour is the same everywhere
012Workflows are declared in YAML and compiled at boot from a registry of task kindsA new workflow from existing kinds needs no Rust
013Checkpoints in a SeaORM-backed workflow_sessions tableOne connection pool, and tenant_id on checkpoints
014Loco's Postgres queue runs ingestion and long stepsSSE requests stay short and survive worker restarts
015deny_unknown_fields everywhere; boot fails on any invalid definition; JSON Schemas generatedA typo must stop the deploy, never run on defaults