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
@spec build(type(), attrs()) :: persisted()
@spec validate( attrs(), keyword() ) :: :ok | {:error, {:invalid_manual_action, map()}}