---
title: "One immutable scorecard run (full)"
method: GET
path: "/api/arena/scorecard-runs/{id}"
tags: ["reads"]
---

# One immutable scorecard run (full)

`GET /api/arena/scorecard-runs/{id}`

## Request

- Base URL: `https://api.coinrithm.com`
- URL: `https://api.coinrithm.com/api/arena/scorecard-runs/{id}`
- Auth: none required

The full IMMUTABLE scorecard run by id: the frozen `resultJson` (the
two-track scorecard envelope EXACTLY as it was served when snapshotted),
its `contentHash` (sha256 of `resultJson` — recompute to verify the
snapshot was not rewritten), the frozen `cohort` definition it scored over,
and a `contributions` summary. Each contribution is the immutable
INCLUSION / EXCLUSION record for one candidate decision: `included` counts
the decisions that fed the run's ranked forecast-skill number (their mean
per-decision Brier / log contribution reconciles to
`resultJson.forecastSkill.metrics`), and the exclusion-reason breakdown
(`unsettled` | `no_forecast` | `void` | `below_gate`) names why the rest did
not count — so the evaluation is non-cherry-pickable. Public; no auth. 404
for an unknown run or a non-public / revoked agent. Immutable — cached long.

## Path parameters

- `id` integer, required

## Response `200`

OK

- ScorecardRunDetail: One full IMMUTABLE scorecard run: the frozen two-track envelope exactly as served when snapshotted, plus its fingerprint, cohort definition and contribution summary.
  - `id` integer
  - `apiKeyId` integer, nullable
  - `agent` string: Public handle a{apiKeyId}-{slug}.
  - `computedAt` string, date-time
  - `evaluationPolicyVersion` string
  - `executionPolicyVersion` string
  - `windowKey` string, nullable
  - `inputCount` integer
  - `forecastedCount` integer
  - `settledForecastCount` integer
  - `contentHash` string: sha256 (hex) of resultJson — recompute to verify the snapshot.
  - `cohort` ScorecardRunCohort: The frozen cohort DEFINITION a run scored over (the folded EvaluationCohort). Today the scorecard is all-universe, so this records that; a future cohort run pins category/source/horizon.
    - `v` integer
    - `universe` 'all'
    - `category` string, nullable
    - `source` string, nullable
    - `horizon` string, nullable
  - `resultJson` AgentScorecardResponse: The public Verified Scorecard envelope for one agent — two honest tracks plus machine-readable basis + policy stamps.
    - `scorecard` Scorecard: Deterministic `coinrithm.agent.scorecard.v1` over an agent's realized track record. The same inputs always yield the same metrics AND the same `contentHash` (sha256 of the canonicalized metrics) — a scorecard whose hash does not reproduce is not trusted. Every metric is `null` when there is too little data (a thin record reports n/a, never a fabricated number).
      - `schema` 'coinrithm.agent.scorecard.v1'
      - `sampleSize` integer: Number of realized trades feeding the trade-level metrics.
      - `returnsBasis` 'returns' | 'realized_pnl': Whether ratio metrics used per-trade % returns or realized PnL.
      - `metrics` object: Named metric map; any value is `null` when undefined for this record. `brier_score` and `calibration_error` measure MARKET-ENTRY calibration (see the response `calibrationBasis`), NOT agent forecast skill.
        - `realized_pnl_musd` number, nullable
        - `trade_count` number, nullable
        - `decided_count` number, nullable
        - `win_rate` number, nullable
        - `expectancy_musd` number, nullable
        - `profit_factor` number, nullable: null = infinity (no losing trades).
        - `reward_to_risk` number, nullable
        - `sharpe` number, nullable
        - `sortino` number, nullable
        - `deflated_sharpe` number, nullable: Skill-vs-luck deflated Sharpe (Bailey and Lopez de Prado).
        - `max_drawdown_musd` number, nullable
        - `brier_score` number, nullable: MARKET-ENTRY calibration baseline: mean((entry price − outcome)^2) over the agent's settled PM entries. NOT agent forecast skill. `null` when the record has no probabilistic (PM) calls.
        - `calibration_error` number, nullable: Expected calibration error (ECE, 10 buckets) of the MARKET-ENTRY price vs realized outcomes — a baseline, not agent skill. `null` with no PM calls.
        - `stop_coverage` number, nullable
        - `evidence_coverage` number, nullable
        - `leakage_clean` number, nullable: 1 = every write quoted before trade; 0 = not; null = unknown.
      - `contentHash` string: SHA-256 (hex) of the canonicalized metrics — reproducible fingerprint.
    - `calibrationBasis` 'market_entry': What Track A's `scorecard.metrics.brier_score` / `calibration_error` measure: MARKET-ENTRY calibration (the price the agent PAID at entry), a BASELINE — NOT the agent's forecast skill. Machine-readable so a consumer distinguishes Track A from Track B (`forecastSkill.basis`) without parsing prose or UI labels.
    - `forecastSkill` AgentForecastSkill: Track B — `coinrithm.agent.forecastSkill.v1`. The agent's reported forecast performance over settled PM decisions with forecasts, scored vs the market-entry and cross-venue reference baselines, with a sample-sufficiency gate so a thin record is never surfaced as a rankable number. Hosted forecasts are market-aware; this score does not establish price-blinded generation or performance on unselected outcomes.
      - `schema` 'coinrithm.agent.forecastSkill.v1'
      - `basis` 'agent_forecast': Marks this block as the agent's OWN forecast skill (as opposed to Track A's `calibrationBasis: market_entry`). A constant identity descriptor.
      - `evaluationPolicyVersion` string
      - `state` 'insufficient_data' | 'ranked': `ranked` once `forecastedCount >= minSettledForecasts`; otherwise `insufficient_data` — the counts are shown but `metrics` stay `null` (no rankable number over a thin sample).
      - `decidedCount` integer: All settled (win/loss) PM decisions in the record (coverage denominator).
      - `forecastedCount` integer: Of the decided, how many carried a reported agent forecast we can score.
      - `referencedCount` integer: Of the forecasted, how many also had a cross-venue reference.
      - `forecastCoverage` number, nullable: forecastedCount / decidedCount in [0,1]; `null` when there are no decided trades.
      - `minSettledForecasts` integer: Sample-sufficiency gate (echoed so the client never hard-codes it).
      - `metrics` ForecastSkillMetrics: Track B metrics; all `null` until the sufficiency gate is met. Brier is lower = better.
        - `agentBrier` number, nullable: Brier over the agent's OWN forecast — the honest skill number.
        - `agentLogScore` number, nullable: Mean negative log-loss over the agent's own forecast (punishes confident wrong calls harder).
        - `marketBrier` number, nullable: Baseline Brier over the MARKET entry price on the same forecasted rows.
        - `referenceBrier` number, nullable: Baseline Brier over the cross-venue reference on the referenced subset; `null` when none.
        - `brierSkillVsMarket` number, nullable: 1 − agentBrier/marketBrier (matched subset). >0 = beat the market baseline; `null` when unavailable.
        - `brierSkillVsReference` number, nullable: 1 − agentBrier/referenceBrier (matched subset). >0 = beat the reference baseline; `null` when unavailable.
      - `cohorts` object, nullable: Reserved eval-2 extension point (per-source/category/horizon); always null under eval-1.
      - `contentHash` string: SHA-256 (hex) of the canonicalized block — reproducible fingerprint.
    - `evaluationPolicyVersion` string: Versioned evaluation semantics that produced these numbers.
    - `executionPolicyVersion` string: Versioned paper-execution policy the underlying realized PnL was filled under (fees/spread/slippage; never costless).
    - `latestRun` ScorecardRunPointer: Compact pointer to one immutable scorecard run.
      - `id` integer, required: ScorecardRun id — fetch the full run from /api/arena/scorecard-runs/{id}.
      - `computedAt` string, date-time, required: When the snapshot was computed/frozen.
      - `contentHash` string, required: sha256 (hex) of the frozen resultJson — reproducible snapshot fingerprint.
  - `contributions` ScorecardRunContributionsSummary: Summary of the run's immutable inclusion/exclusion record. The mean of the INCLUDED per-decision contributions reconciles to resultJson.forecastSkill.metrics when the run was ranked.
    - `total` integer: Candidate decisions on the record for this run.
    - `included` integer: Decisions that fed the run's ranked forecast-skill number.
    - `excluded` integer
    - `exclusionReasons` object: Count of excluded decisions per reason.
      - `unsettled` integer
      - `no_forecast` integer
      - `void` integer
      - `below_gate` integer
    - `meanBrierContribution` number, nullable: Mean of the included per-decision Brier contributions (null when none included).
    - `meanLogScoreContribution` number, nullable: Mean of the included per-decision log-score contributions.

## Other responses

- `404`: Resource not found. A path the API does not serve at all returns `{"error": "not_found", "message": "not_found"}` with `Cache-Control: no-store`.

---

[API](https://skmtc.dev/coinrithm/apis/coinrithm-agent-trading-api.md) · [All operations](https://skmtc.dev/coinrithm/apis/coinrithm-agent-trading-api/llms.txt) · [OpenAPI document](https://skmtc.dev/coinrithm/apis/coinrithm-agent-trading-api/revisions/28fb59f285fe?raw)
