Default CouncilEx.Recorder implementation backed by Ecto + Postgres.
Persists each run's lifecycle into <prefix>runs and
<prefix>run_events. Skips :member_token events by default — token
chunks are high volume and the design intentionally keeps them
PubSub-only.
Args
Passed via {module, args} in the :recorder option to
CouncilEx.start/3. Recognised keys (all optional except :repo):
:repo— your application'sEcto.Repo. Required. Falls back toApplication.get_env(:council_ex, CouncilEx.Recorder.Ecto)[:repo]if unset in args.:table_prefix— string prefix for therunsandrun_eventstables. Defaults to"council_ex_".:oban_job_id— bigint. Stored on the run row for forensic lookup. Set automatically byCouncilEx.Workers.Oban.:attempt— integer ≥ 1. Defaults to1.:parent_attempt_run_id— link to the previous attempt's run id. Set byWorkeron retries.:event_filter— controls which events get persisted torun_events. Either:{:exclude, [type, ...]}— persist all except listed types (the default is{:exclude, [:member_token]}){:include, [type, ...]}— persist only the listed types
Failure mode
Recorder crashes do not kill the run (per
CouncilEx.Runner.RecorderProcess semantics). If init/2 fails to
insert the run row it returns {:stop, reason} — the run still
starts but no history is written.