| Rust agent ecosystem churn (rig 0.43–0.46 changed heavily) | rig is confined to crates/llm. Structured output and embeddings use plain OpenAI-compatible HTTP. Exact pins |
| graph-flow has one maintainer | It is confined to app/src/engine and the Task impls in app/src/kinds. YAML definitions are engine-neutral. Be ready to fork |
| graph-flow runs without its own Postgres storage | Our SessionStorage is about 60 lines and is covered by the restart-and-resume test |
Stale ag-ui-core; AG-UI 1.0 versus CopilotKit client mismatch | Own agui crate, protocol-version negotiation, legacy event path, golden event tests against the pinned CopilotKit |
CopilotKit useInterrupt quirks | Non-tool-bound confirmation interrupts, server-side validation, an end-to-end browser test |
| Loco 1.x API drift | Exact pin. Loco types stay inside app/; library crates do not depend on Loco |
| YAML turns into a programming language | Conditions are limited to structured comparisons. Anything more complex becomes a task kind with tests |
| Config errors found only in production | deny_unknown_fields, boot-time cross-validation, config_validate in CI, generated JSON Schemas in editors |
| Secrets leaking into YAML | Only get_env references are allowed; CI scans config/ |
| Long steps inside an SSE request | Steps over a time budget are handed to a Loco worker, and the stream reports progress from the session |
| Open-core drift (Activepieces, Langfuse, SeaweedFS) | Native connectors and Jaeger by default. Optional services sit behind compose profiles. Quarterly LICENSE diff |
| Extraction quality | Schema-constrained decoding, deterministic rules, mandatory approval, eval gate, model swap in YAML |
| Model license changes | Revision-pinned weights mirrored internally, allow-list check at boot |
| Prompt injection through documents | Data fencing, no autonomous payment tools, forced approval for bank-detail changes |