# `MimirAnalytics.Row.RoutingDecision`
[🔗](https://github.com/cash-mckeeman/mimir/blob/mimir_analytics-v0.8.1/mimir_analytics/lib/mimir_analytics/row/routing_decision.ex#L1)

One row of `routing_decisions` — a gateway `"routing_decision"` line.
`new/1` owns flattening the nested `descriptor`/`verdict`/`snapshot`
(and `descriptor.agent`) wire shape onto the table's flat columns —
formerly positional `d`/`v`/`s`/`agent` digs at the mapper call site.

# `t`

```elixir
@type t() :: %MimirAnalytics.Row.RoutingDecision{
  agent_digest: String.t() | nil,
  budget_ceiling_microdollars: integer() | nil,
  candidates: list(),
  chosen_lane: String.t() | nil,
  chosen_model: String.t() | nil,
  decision_id: String.t(),
  degraded_lanes: list(),
  grant_id: String.t() | nil,
  latency_tolerance_ms: integer() | nil,
  outcome: String.t() | nil,
  reasons: list(),
  runtime_preference: String.t() | nil,
  snapshot_at: String.t() | nil,
  source_file: String.t(),
  step_id: String.t() | nil,
  task_class: String.t() | nil,
  ts: String.t() | nil,
  workflow_id: String.t() | nil
}
```

# `new`

```elixir
@spec new(map()) :: t()
```

Build a `t()` from a decoded "routing_decision" line plus "source_file".

---

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