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

One evaluation case joined with its matching judge result by `case_id`.
Report-level agent, suite and runtime fields accompany the case.
Missing optional source fields remain `nil`.

# `t`

```elixir
@type t() :: %MimirAnalytics.Row.EvalOutcome{
  agent: String.t() | nil,
  case_id: String.t(),
  elapsed_ms: integer() | nil,
  judge_elapsed_ms: integer() | nil,
  judge_passed: boolean() | nil,
  judge_reasoning: String.t() | nil,
  mode: String.t(),
  pass_rate: float(),
  passed: boolean() | nil,
  reason: String.t() | nil,
  run_id: String.t() | nil,
  runtime: String.t() | nil,
  source_file: String.t(),
  suite: String.t() | nil,
  threshold: float(),
  ts: String.t() | nil
}
```

# `new`

```elixir
@spec new(%{
  case: MimirAnalytics.Row.EvalOutcome.Case.t(),
  agent: String.t() | nil,
  suite: String.t() | nil,
  runtime: String.t() | nil,
  mode: String.t(),
  threshold: float(),
  pass_rate: float(),
  ts: String.t() | nil,
  source_file: String.t()
}) :: t()
```

Build a `t()` from a `Case.t()` (the joined case+judge shape) plus the
report-level `agent`/`suite`/`runtime`/`mode`/`threshold`/`pass_rate`/`ts`
context and `source_file`. `run_id` renames the case's `session_id` (see
`Case.new/2`) — the eval-report analog of the Capture-session rename
centralized in `Row.Run.run_id/2`.

---

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