TL;DR: After months exploring multi-agent orchestration with OpenClaw and Lobster, I hit a wall: no existing tool offered simple declarative spec + runtime-agnostic execution + first-class control flow. So I designed duckflux, a minimal YAML-based workflow DSL with loops, conditionals, parallelism, and events built in. The spec is now at v0.7, the TypeScript runtime ships as a CLI (
quack) and an embeddable library (@duckflux/core), with pluggable event hub backends (in-memory, NATS, Redis) and built-in execution tracing. Full docs at duckflux.openvibes.tech.
This article is the third in a series about building deterministic multi-agent development pipelines. If you're joining now, here's the short version.
In the first article, I documented two months of trial and error trying to build a code -> review -> test pipeline with autonomous AI agents. The core thesis: LLMs are unreliable routers, they forget steps, miscount iterations, skip transitions. Orchestration must be deterministic and implemented in code, not delegated to inference. After five failed attempts (Ralph Orchestrator, OpenClaw sub-agents, a custom event bus, skill-driven self-orchestration, and plugin hooks), I found Lobster, OpenClaw's built-in workflow engine. It was close, but lacked native loop support. I contributed a pull request adding sub-workflow steps with loops.
In the second article, I zoomed out. The problem wasn't just orchestration, it was multi-agents x multi-projects x multi-providers x multi-channels. I compiled a dataset of agent configuration formats across providers, proposed the Monoswarm pattern (a monorepo layout for managing agent swarms), and identified the still-missing piece: an orchestration layer that ties agent events to workflow transitions across projects.
Both articles ended with the same conclusion: we need a proper workflow DSL.
Lobster was the closest thing to what I needed, but it was designed for linear pipelines with approval gates. My pull request added loops, but the deeper issues remained:
if/then/else).I looked at the broader landscape:
| Tool | Where it falls short |
|---|---|
| Argo Workflows | Turing-complete YAML disguised as config. A conditional loop requires template recursion, manual iteration counters, and string-interpolated type casting. |
| GitHub Actions | No conditional loops. Workarounds require unrolling or recursive reusable workflows. |
| Temporal / Inngest | Code-first (Go/TS/Python SDKs). The code IS the spec. No declarative layer. |
| Airflow / Prefect | DAGs are acyclic by definition, conditional loops are architecturally impossible. |
| n8n / Make | Visual-first, JSON-heavy specs. Loop constructs require JavaScript function nodes. Specs are unreadable as text. |
| Lobster | Linear pipelines with approval gates. No native loops, no parallelism, no conditionals. |
The gap was clear: no existing tool combines a simple declarative spec + runtime-agnostic execution + first-class control flow (loops, conditionals, parallelism) + events.