Host-facing API boundary for submitting workflow progression signals.
Host applications call track/4 with a tenant id, actor id, event name, and
optional payload. The function durably persists a Chimeway.Signals.Signal
row and atomically enqueues a Chimeway.Dispatch.SignalRouterWorker job
carrying the new signal's id. The worker (Phase 27-02) is responsible for
routing the signal to whichever workflow runs are waiting on it.
Both side effects share a single Ecto.Multi transaction — if the Oban
insert fails, the Signal row is rolled back; no orphaned signals or jobs.
Summary
Functions
@spec track(String.t(), String.t(), String.t(), map()) :: {:ok, Chimeway.Signals.Signal.t()} | {:error, Ecto.Changeset.t() | term()}