listeners — Deterministic In-Process Reactions

Listeners run synchronously within the same write transaction as the emitting action. They are deterministic and side-effect free (no I/O, no submit).

listeners:
  - on: RATING_SUBMITTED
    priority: 0
    where: event.payload.score > 0       # optional filter (plain expression string)
    resolve:
      show: lookup(rating_summary, event.payload.show_id)
    mutate:
      - op: increment
        field: score_sum
        value: event.payload.score
      - op: increment
        field: score_count
        value: 1
      - op: set
        field: updated_at
        value: event.payload.ts
        on: show                          # target the resolved entity

Listener fields

FieldRequiredDescription
onyesEvent type to react to
prioritynoExecution order (lower = earlier; default 0)
wherenoFilter expression (plain string)
resolvenoNamed entity lookups via lookup(entity, id_expr)
mutateyesList of mutation ops

Listener mutate ops

OpDescription
incrementAdd a value to a numeric field
setSet a field to a value
updateUpdate a field using an expression
appendAppend to an array
removeRemove from an array

mutate.field uses slash-separated paths: stats/home_score.

mutate.on targets a resolved alias. Without on, the mutation targets the entity the event belongs to.