Known Limitations

Features that are designed but not yet fully implemented, and constraints of the current implementation.

What you'll learn: What to expect from the current Grove release and what's coming next.

Area 2: Workflows

Workflow orchestration (Area 2) is designed and parsed but the runtime implementation is in progress:

FeatureStatus
Workflow declarationsParsed and checked
Activity declarationsParsed and checked
Service declarationsParsed and checked
Route declarationsParsed and checked
Query declarationsParsed and checked
Trigger declarationsParsed and checked
Schedule declarationsParsed and checked
Webhook declarationsParsed and checked
In-process orchestratorIn development
Temporal backendIn development

You can write and type-check workflow code today. Runtime execution is being implemented.

Agent System

The agent system is in preview:

FeatureStatus
Agent declarationsDesign finalized
Tool declarationsDesign finalized
MCP serverDesign finalized
Agent runtimeIn development
Prompt evaluationIn development

Temporal Integration

FeatureStatus
Bridge architectureDesigned
Activity registrationIn development
Signal/cancel/awaitNot yet implemented
SDK interopNot yet implemented

Runtime Limits

Event payload size

Individual event payloads are capped at 256 KiB. The runtime enforces this on the write path; oversized events return HTTP 413 Payload Too Large with code Z4004 (see Error Reference).

The ceiling is chosen to fit comfortably under the smallest downstream delivery mechanism Grove targets (SQS/SNS/Lambda-async all accept 256 KiB body payloads) while leaving margin inside the 6 MiB TiDB transaction budget for the surrounding commit.

When you hit the limit. Store the bulk payload in blob/object storage (S3, R2, GCS) and put only the reference (URL, key, ETag) in the event. The runtime offers the File type for records that need large attachments — see File Uploads. For event-level attachments, include a URL field in the event and upload separately.

Language Limitations

LimitationDetails
No block commentsOnly // line comments are supported
No mutable variablesAll let bindings are immutable
For loop restrictionsOnly in action apply blocks, max 3 levels deep
No nested type declarationsTypes must be declared at module top level
Single record per moduleEach module can have at most one record block
No generic functionsFunctions cannot have type parameters
No recursive typesType declarations cannot reference themselves

Runtime Gotchas

These issues compile successfully but cause unexpected behavior at runtime:

IssueSymptomWorkaround
?? null coalesceCompiles but fails at runtime with "unknown function 'coalesce'"Use sentinel defaults with if conditionals instead
State machine field co-declarationstate status { ... } in a record requires a matching field declaration status: Status = Status.draftAlways declare both the field with its default and the state machine
Duration literals in assertionsassert record.prep_time == 2m fails even when the value matchesUse the string form: assert record.prep_time == "2m"
Events must set state field explicitlyEmitting a state-transition event like published without a status field in the event doesn't update the statusAdd status: Status = Status.published with a default value to the event declaration

Null Coalesce Workaround

Instead of:

// Does NOT work at runtime:
let name = input.name ?? "default"

Use:

// Works:
if input.name != null {
  let name = input.name
} else {
  let name = "default"
}

State Machine Co-declaration

The state block and the field it controls must both be declared:

record {
  kind "post"
  status: ArticleStatus = ArticleStatus.draft   // Required field declaration

  state status {                                  // State machine references the field
    ArticleStatus.draft -> ArticleStatus.published on published
  }
}

Event Status Field

State-transition events must explicitly include the status field with a default:

event published {
  status: ArticleStatus = ArticleStatus.published   // Required for state transition
}

Database Backends

BackendStatus
SQLiteImplemented
PostgreSQLImplemented
MySQLImplemented
TiDBImplemented
DynamoDBNot planned
MongoDBNot planned

See Also