API referenceError Reference

Error Reference


Compiler Errors

Compiler errors are printed to stderr and cause a non-zero exit code. All error codes begin with VERR_.

VERR_FIELD_NOT_DECLARED

A field referenced in an expression does not exist in the entity’s state: block.

VERR_FIELD_NOT_DECLARED: field 'follwing_count' not declared in state 'user'

Fix: Check for typos in field names. Ensure the field is declared in the state: block.


VERR_NON_DETERMINISTIC_EXPRESSION

An expression uses a non-deterministic function (now(), random(), uuid()).

VERR_NON_DETERMINISTIC_EXPRESSION: 'now()' is forbidden in expressions — use event.ts for timestamps

Fix: Replace now() with event.ts. For entity IDs, pass the ID as an intent input field rather than generating it inside the DSL.


VERR_SPEL_FORBIDDEN_FUNCTION

A SpEL expression calls a disallowed method or accesses external I/O.

VERR_SPEL_FORBIDDEN_FUNCTION: method 'System.currentTimeMillis' is not permitted

Fix: Use only permitted expression operators and scopes. See Expressions.


VERR_INTENT_EVENT_CONFLICT

An action attempts to emit an event that is bound to a different entity type than the action’s state.

VERR_INTENT_EVENT_CONFLICT: action 'FOLLOW_ARTIST' (state: user) cannot emit event 'SHOW_ANNOUNCED' (state: artist)

Fix: Only emit events whose state: matches the action’s state:. To affect another entity, use a listener or saga.


VERR_CROSS_STREAM_WRITE

A projection handler attempts to write to a table owned by a different entity stream.

VERR_CROSS_STREAM_WRITE: projection 'artist_followers' cannot write to table 'user_following'

VERR_OP_UNKNOWN

An unrecognized operation name is used in a rule’s then: block.

VERR_OP_UNKNOWN: operation 'update' is not recognized. Valid ops: set, add, sub, push, filter, remove, find, map, unset, merge, emit, emit_each, submit, reject, schedule, lookup, relationship_create, relationship_remove, if, for_each

Fix: Replace the op with the correct name from the valid ops list.


VERR_MODE_UNKNOWN

A rule block uses an unrecognized mode: value.

VERR_MODE_UNKNOWN: mode 'always' is not valid. Valid modes: preflight, core, side_effects

VERR_EXPRESSION

A SpEL expression fails to parse or evaluate during compilation validation.

VERR_EXPRESSION: cannot parse expression 'entity.count +' — unexpected end of expression

Fix: Check expression syntax. Ensure all parentheses and operators are balanced.


VERR_PRODUCT_STRUCTURE

The app folder is missing required files or has an invalid manifest structure.

VERR_PRODUCT_STRUCTURE: app.causet not found in './my-app'

Fix: Ensure app.causet exists in the folder passed to the compiler.


ClassCastException — filter.where is an object, not a string

java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class java.lang.String
  at parseFilterOperation

Cause: A filter op has where: specified as a YAML object instead of a string expression.

Fix: Write where: as a quoted SpEL string:

# Wrong
where:
  field: value
 
# Correct
where: "entity.field == 'value'"

ClassCastException — scalar field given YAML object

java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class java.lang.String
  at parseRule

Cause: A field that expects a string expression is given a YAML map.

Fix: Wrap the value in quotes or restructure the YAML:

# Wrong
value:
  some_key: some_val
 
# Correct
value: "some_key"

Runtime Errors (HTTP)

400 UNKNOWN_ACTION

The action field in the intent request does not match any action defined in the active IR for this fork.

{
  "error": "UNKNOWN_ACTION",
  "action": "CREATE_WIDGET",
  "message": "Action 'CREATE_WIDGET' not found in active IR for fork 'main'"
}

Cause: The action was not compiled into the active release, or the fork has no active release.


400 PREFLIGHT_REJECTION

A preflight rule’s reject op fired. The response includes the DSL-defined rejection code.

{
  "error": "PREFLIGHT_REJECTION",
  "code": "TICKET_LIMIT_EXCEEDED",
  "rule": "max_tickets_per_user",
  "message": "Preflight rejection: TICKET_LIMIT_EXCEEDED"
}

The code value is the string from the DSL reject op:

then:
  - op: reject
    code: TICKET_LIMIT_EXCEEDED

This is a normal business outcome — handle PREFLIGHT_REJECTION in application code the same way you handle any expected validation error.


404 ENTITY_NOT_FOUND

The target entity has no events in the ledger for this fork.

{
  "error": "ENTITY_NOT_FOUND",
  "entityType": "user",
  "entityId":   "user-999",
  "forkId":     "main"
}

Note: In Causet, entities are created implicitly by the first event that references them. A 404 means no action has ever been successfully submitted for this entity on this fork.


409 CONCURRENT_WRITE

Another writer modified the entity between when it was loaded and when the runtime attempted to persist the new events (cursor contention).

{
  "error": "CONCURRENT_WRITE",
  "entityId": "item-1",
  "message": "Cursor version mismatch — retry the request"
}

Fix: Retry with exponential backoff. The runtime serializes writes per entity — under normal load this error is rare.


503 SERVICE_UNAVAILABLE

The database or Kafka is unreachable.

{
  "error": "SERVICE_UNAVAILABLE",
  "message": "Cannot connect to event store database"
}

Query Errors

400 QUERY_NOT_FOUND

The query name does not exist in the active IR for this fork.

{
  "error": "QUERY_NOT_FOUND",
  "queryName": "shows_for_followed_artists",
  "forkId":    "main"
}

400 INVALID_PARAMS

A required query parameter is missing or has the wrong type.

{
  "error": "INVALID_PARAMS",
  "missing": ["user_id"],
  "message": "Required parameter 'user_id' was not provided"
}

404 SCHEMA_NOT_FOUND

The tenant schema for this platform/application/fork does not exist in the projections database. The fork has not been deployed.

{
  "error": "SCHEMA_NOT_FOUND",
  "schema": "my_platform_concert_app_staging",
  "message": "Tenant schema not found — deploy a release to this fork first"
}

Fix: Deploy a release to the fork via the control plane. Deployment creates the schema and applies DDL.