Validation and serialization helpers for durable manual workflow actions.
Pause resume, approval, and rejection flows all persist a small audit payload so the read model can reconstruct who acted and when.
@type attrs() :: %{ optional(:actor) => String.t() | map(), optional(:comment) => String.t(), optional(:metadata) => map() }
@type persisted() :: map()
@type type() :: :resumed | :approved | :rejected