Current Limitations
WOML rejects unsupported behavior instead of silently approximating it. These boundaries describe the reviewed v1 product; they help authors choose a correct design and prevent accidental dependence on half-implemented behavior.
Language and control flow
- No arbitrary
after,from,to, ordepends-ongraph edges. - No nested for-each, batching, race, or first-success primitive.
- No nested fork inside a fork-owned subtree.
- No multi-step direct children or continue-on-error mode in
<parallel>. - No declarative HTTP, database, or storage operation tags.
- No arbitrary structural custom tags.
Use the structured primitives that exist today. Put ordinary local computation in JavaScript. Use a local module for reusable code, a reusable WOML step for reusable durable work, and a reusable notification provider for project-specific delivery.
<parallel> is intentionally narrower than <fork>: it handles independent direct steps. Use <fork> when a lane needs multiple steps or selective join behavior.
Modules and services
- No npm imports, default exports, CommonJS, or dynamic module installation.
- No custom trigger providers.
- No NoSQL driver,
services.queue, orservices.slack.send().
Local modules use named JavaScript or TypeScript exports. WOML does not dynamically install npm packages or execute arbitrary package lifecycle scripts. Vendor required code deliberately in the project until a reviewed package trust model exists.
SQLite and PostgreSQL are the built-in database drivers. Call another database through a local module and managed HTTP or native Fetch when appropriate, but understand that it does not become a first-class built-in driver automatically.
Runtime
- No
context.run,context.env, secret enumeration, orwoml.resume()API. - No synchronous workflow call that waits through Human Approval.
- No automatic child cancellation, compensation, or saga primitive.
- No managed distributed multi-node control plane.
The supported production profile is one runtime/state authority. Several workflows can be active in that deployment and can call, start, or broadcast events to one another, but v1 does not claim active-active coordination across independent authorities.
Human Approval is durable, but a synchronous services.workflows.call() cannot wait through a child approval. Use services.workflows.start() when the child may wait for a person.
Cancellation is cooperative and does not roll back committed external effects. Automatic compensation and saga semantics remain outside the v1 contract.
Security boundaries
Bun worker isolation is not a hostile multi-tenant sandbox. Native Fetch and managed HTTP are not an SSRF firewall. The SQLite state file has hardened local permissions where supported but is not transparently encrypted. Deploy WOML inside a reviewed operating-system, network, and secret-management boundary.
Why the list is explicit
These boundaries describe the current product; they are not promises that every item will become syntax later.
Adding syntax is easy; supporting durable recovery, diagnostics, cancellation, idempotency, security, and cross-platform packaging is the real contract. WOML keeps unsupported features visible so the language stays trustworthy instead of appearing to work only on the happy path.