
Signals in Rind are typed event definitions emitted into the Flow runtime. A signal does not persist in the State Machine; it is emitted, validated against its payload type, and used to trigger dependent transitions.
Core Definition
The base signal metadata defines identity and payload type.
name: The unique signal name.payload: Payload type. Valid values arejson,string,bytes,none.
[[signal]]
name = "activate"
payload = "string"[[signal]]
name = "request_login"
payload = "json"Dependent Signal Chains

Signals can trigger other signals via after.
after: List ofFlowItemconditions that must match.- Runtime emits dependent signal only when all
afterconditions are active/matching. - This is evaluated in
reconcile_signal_transcendenceafteremit_signal.
[[signal]]
name = "request_logout"
payload = "json"
after = ["sessions@request_login"]FlowItem Matching (after Details)
after accepts simple or detailed condition entries.
- Simple:
"name" - Detailed:
{ state = "..." }or{ signal = "..." }- Optional
target/branchoperations: - String equality, or
- option object:
{ binary = true },{ contains = "..." },{ as = { ... } }
[[signal]]
name = "notify-admin"
payload = "json"
after = [
{ state = "backup-result", target = { as = { status = "failed" } } }
]Transport Subscribers
Signals can publish set/remove events to configured Transport subscribers.
subscribers: Defined on signal metadata and parsed from TOML.- Current flow runtime does not publish signal events through this field.
- Signal transport publication currently occurs through event/transport runtime paths, not
Signal.subscribers.
Permission Gates
Signal emission through incoming transport can be permission-gated.
permissions: List of permission IDs (eitheru16or full name to Permissions).- Checked in transport incoming handling before
flow.emit_signaldispatch.
[[signal]]
name = "deactivate"
payload = "string"
permissions = [2001, "myperm"]Broadcast
broadcast: Defined on the model and accepted in TOML.- Current flow runtime path does not consume this field yet.
Service Integration

Services emit signals through lifecycle hooks, and flow consumes them immediately.
[[service]]
name = "backup-job"
run.exec = "/usr/bin/backup"
on-stop = [{ signal = "backup@complete", payload = { status = "success" } }]