Behavior for optional audit export sinks.
Sinks receive redacted envelope maps instead of internal structs so core Scoria stays decoupled from downstream relay libraries.
@type envelope() :: map()
@type result() :: {:ok, map()} | {:error, term()}
@callback publish(envelope()) :: result()