# `Squidie.ReadModel.Listing`
[🔗](https://github.com/dark-trench/squidie/blob/main/lib/squidie/read_model/listing.ex#L1)

Projection-backed run listing for the journal-backed runtime.

The journal catalog is a global lookup projection, so this module can list all
known journal-backed runs without adapter-specific storage scans.

# `list_error`

```elixir
@type list_error() ::
  {:invalid_option,
   {:filters, :invalid}
   | {:filter, atom()}
   | {:workflow, :invalid | :required}
   | {:status, :invalid}
   | {:limit, :invalid}
   | {:opts, :invalid}
   | {:option, atom()}
   | {:queue, :invalid}
   | {:now, :invalid}}
  | {:run_catalog_anomalies, [Squidie.Runtime.RunCatalogProjection.anomaly()]}
  | {:run_catalog_summary_failed, String.t(), term()}
  | term()
```

# `list_filter`

```elixir
@type list_filter() ::
  {:workflow, module() | String.t()}
  | {:status, atom()}
  | {:limit, pos_integer()}
```

# `list_option`

```elixir
@type list_option() :: {:queue, atom() | String.t()} | {:now, DateTime.t()}
```

# `list`

```elixir
@spec list(Squidie.Runtime.Journal.storage_config(), [list_filter()], [list_option()]) ::
  {:ok, [Squidie.ReadModel.Listing.Summary.t()]} | {:error, list_error()}
```

Lists redacted summaries from the global journal run catalog.

Results are ordered newest first by the durable catalog timestamp. Optional
`:workflow` and `:status` filters are applied without scanning journal storage
tables. The `:status` filter is applied after rebuilding each run-thread
projection so it reflects current journal state instead of stale catalog
metadata. Use `Squidie.inspect_run/2` when callers need detailed attempts,
inputs, results, or claim metadata for one run.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
