claude-opus-4-8 @ high · CC

CChigh
config
claude-opus-4-8-eff-high--cli--claude-code--dev
batch
2026-07-19--unified
transport
claude-code-cli-headless
protocol
cli · plan
served model
claude-opus-4-8
captured
Jul 18, 2026, 11:54 AM · N=2
variant
live
slot 0 · P-q · sandboxed iframe
claude-opus-4-8 @high · CC P-q slot 0 screenshot

The screenshot is the exact frozen pixels the similarity channels measured. Run live re-executes the raw output in a sandboxed iframe; its rendering depends on your browser and fonts and is not guaranteed to match the measured pixels.

similarity neighbors

within session 2026-07-19--unified

similarity measures convergence within this session — not quality.

Fidelity — does the card show the right data?

  • namematch
  • conditionmatch
  • datematch
  • max tempmatchshown: 25
  • min tempmatchshown: 16
  • hourlymismatchcoverage 0/24 · 0 match · 2 mismatch · 22 not shown
  • request sidematch0 violation(s)

extractor fidelity-extractor-v1+Berlin-2026-07-15

Source — raw model output, one byte unchanged

download card.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1280, initial-scale=1">
<title>Weather Card</title>
<style>
  :root {
    --ink: #0f172a;
    --muted: #64748b;
    --line: #e2e8f0;
    --card-bg: rgba(255, 255, 255, 0.72);
  }

  * { margin: 0; padding: 0; box-sizing: border-box; }

  html, body {
    width: 1280px;
    height: 800px;
    overflow: hidden;
  }

  body {
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
    color: var(--ink);
    display: flex;
    align-items: center;
    justify-content: center;
    background: #dbe4ee;
    -webkit-font-smoothing: antialiased;
    transition: background 0.8s ease;
  }

  /* Scene gradients keyed by condition group */
  body[data-scene="clear"]   { background: linear-gradient(140deg, #4a90d9 0%, #6cb2eb 45%, #b8dcf5 100%); }
  body[data-scene="cloudy"]  { background: linear-gradient(140deg, #6b7b8c 0%, #8ea1b3 50%, #c3ced9 100%); }
  body[data-scene="fog"]     { background: linear-gradient(140deg, #8a94a0 0%, #aab2bd 50%, #d6dbe1 100%); }
  body[data-scene="rain"]    { background: linear-gradient(140deg, #3d5568 0%, #5a7489 50%, #92a8bb 100%); }
  body[data-scene="snow"]    { background: linear-gradient(140deg, #7d93ad 0%, #a9bdd4 50%, #e3ecf5 100%); }
  body[data-scene="storm"]   { background: linear-gradient(140deg, #2b2f45 0%, #4a4f6e 50%, #7f86a8 100%); }

  .card {
    width: 980px;
    background: var(--card-bg);
    backdrop-filter: blur(24px) saturate(140%);
    -webkit-backdrop-filter: blur(24px) saturate(140%);
    border-radius: 32px;
    border: 1px solid rgba(255, 255, 255, 0.55);
    box-shadow: 0 40px 90px -30px rgba(15, 23, 42, 0.45),
                0 2px 8px rgba(15, 23, 42, 0.08),
                inset 0 1px 0 rgba(255, 255, 255, 0.6);
    padding: 44px 52px 40px;
    opacity: 0;
    transform: translateY(14px);
    transition: opacity 0.6s ease, transform 0.6s ease;
  }
  .card.ready { opacity: 1; transform: translateY(0); }

  .top {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    gap: 24px;
  }

  .place {
    display: flex;
    flex-direction: column;
    gap: 6px;
  }
  .place .eyebrow {
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--muted);
  }
  .place h1 {
    font-size: 40px;
    font-weight: 700;
    letter-spacing: -0.02em;
    line-height: 1.05;
  }
  .place .date {
    font-size: 16px;
    color: var(--muted);
    font-weight: 500;
  }

  .hero {
    display: flex;
    align-items: center;
    gap: 20px;
    margin-top: 34px;
  }
  .icon-wrap {
    width: 108px;
    height: 108px;
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    background: linear-gradient(160deg, rgba(255,255,255,0.85), rgba(255,255,255,0.35));
    border-radius: 26px;
    box-shadow: inset 0 1px 0 rgba(255,255,255,0.8), 0 8px 20px -10px rgba(15,23,42,0.3);
  }
  .icon-wrap svg { width: 72px; height: 72px; }

  .hero-main { display: flex; flex-direction: column; gap: 2px; }
  .temp-big {
    font-size: 84px;
    font-weight: 700;
    letter-spacing: -0.04em;
    line-height: 0.95;
  }
  .temp-big .deg { font-weight: 400; color: var(--muted); }
  .condition {
    font-size: 20px;
    font-weight: 600;
    color: #334155;
  }

  .hero-stats {
    margin-left: auto;
    display: flex;
    gap: 14px;
  }
  .stat {
    min-width: 120px;
    padding: 16px 20px;
    background: rgba(255, 255, 255, 0.55);
    border-radius: 18px;
    border: 1px solid rgba(255, 255, 255, 0.6);
    display: flex;
    flex-direction: column;
    gap: 8px;
  }
  .stat .label {
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--muted);
    display: flex;
    align-items: center;
    gap: 6px;
  }
  .stat .value { font-size: 30px; font-weight: 700; letter-spacing: -0.02em; }
  .stat.max .dot { color: #e8663b; }
  .stat.min .dot { color: #3b82f6; }
  .stat .dot { width: 9px; height: 9px; border-radius: 50%; background: currentColor; display: inline-block; }

  .chart-section {
    margin-top: 38px;
    padding-top: 28px;
    border-top: 1px solid var(--line);
  }
  .chart-head {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 14px;
  }
  .chart-head h2 {
    font-size: 14px;
    font-weight: 700;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--muted);
  }
  .chart-head .range { font-size: 13px; color: var(--muted); font-weight: 500; }

  .chart { width: 100%; height: 200px; display: block; }
  .chart .grid { stroke: var(--line); stroke-width: 1; }
  .chart .area { fill: url(#areaGrad); }
  .chart .line { fill: none; stroke: #ef7a4d; stroke-width: 2.5; stroke-linejoin: round; stroke-linecap: round; }
  .chart .pt { fill: #fff; stroke: #ef7a4d; stroke-width: 2; }
  .chart .pt.hi { stroke: #e8663b; }
  .chart .pt.lo { stroke: #3b82f6; }
  .chart .xlabel { fill: var(--muted); font-size: 11px; font-weight: 500; text-anchor: middle; }
  .chart .vlabel { fill: #475569; font-size: 11px; font-weight: 600; text-anchor: middle; }
  .chart .peak { fill: #e8663b; font-size: 11px; font-weight: 700; text-anchor: middle; }

  .state {
    padding: 60px 20px;
    text-align: center;
  }
  .state .msg { font-size: 22px; font-weight: 600; margin-bottom: 8px; }
  .state .sub { font-size: 15px; color: var(--muted); }
  .spinner {
    width: 42px; height: 42px; margin: 0 auto 22px;
    border: 4px solid var(--line);
    border-top-color: #6cb2eb;
    border-radius: 50%;
    animation: spin 0.9s linear infinite;
  }
  @keyframes spin { to { transform: rotate(360deg); } }

  .error-icon {
    width: 52px; height: 52px; margin: 0 auto 18px;
    color: #dc6a4a;
  }
</style>
</head>
<body data-scene="clear">
  <div class="card" id="card">
    <div class="state" id="loading">
      <div class="spinner"></div>
      <div class="msg">Loading weather…</div>
      <div class="sub" id="loadingSub"></div>
    </div>
  </div>

<script>
(function () {
  "use strict";

  // ---- Params ----
  var qp = new URLSearchParams(location.search);
  var lat = parseFloat(qp.get("lat"));
  var lon = parseFloat(qp.get("lon"));
  if (!isFinite(lat)) lat = 52.52;
  if (!isFinite(lon)) lon = 13.405;
  var name = qp.get("name") || "Berlin";

  function todayUTC() {
    var d = new Date();
    return d.getUTCFullYear() + "-" +
      String(d.getUTCMonth() + 1).padStart(2, "0") + "-" +
      String(d.getUTCDate()).padStart(2, "0");
  }
  var dateStr = qp.get("date");
  if (!dateStr || !/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) dateStr = todayUTC();

  // Past dates use the archive API; today & future use the forecast API.
  var isPast = dateStr < todayUTC();
  var endpoint = isPast ? "/api/om/archive" : "/api/om/forecast";

  var apiParams = new URLSearchParams({
    latitude: lat,
    longitude: lon,
    daily: "temperature_2m_max,temperature_2m_min,weather_code",
    hourly: "temperature_2m",
    timezone: "UTC",
    temperature_unit: "celsius",
    start_date: dateStr,
    end_date: dateStr
  });

  // ---- WMO weather code mapping ----
  var WMO = {
    0:  {t: "Clear sky",            g: "clear"},
    1:  {t: "Mainly clear",         g: "clear"},
    2:  {t: "Partly cloudy",        g: "partly"},
    3:  {t: "Overcast",             g: "cloudy"},
    45: {t: "Fog",                  g: "fog"},
    48: {t: "Depositing rime fog",  g: "fog"},
    51: {t: "Light drizzle",        g: "rain"},
    53: {t: "Moderate drizzle",     g: "rain"},
    55: {t: "Dense drizzle",        g: "rain"},
    56: {t: "Freezing drizzle",     g: "rain"},
    57: {t: "Freezing drizzle",     g: "rain"},
    61: {t: "Slight rain",          g: "rain"},
    63: {t: "Moderate rain",        g: "rain"},
    65: {t: "Heavy rain",           g: "rain"},
    66: {t: "Freezing rain",        g: "rain"},
    67: {t: "Heavy freezing rain",  g: "rain"},
    71: {t: "Slight snowfall",      g: "snow"},
    73: {t: "Moderate snowfall",    g: "snow"},
    75: {t: "Heavy snowfall",       g: "snow"},
    77: {t: "Snow grains",          g: "snow"},
    80: {t: "Slight rain showers",  g: "rain"},
    81: {t: "Rain showers",         g: "rain"},
    82: {t: "Violent rain showers", g: "rain"},
    85: {t: "Slight snow showers",  g: "snow"},
    86: {t: "Heavy snow showers",   g: "snow"},
    95: {t: "Thunderstorm",         g: "storm"},
    96: {t: "Thunderstorm w/ hail", g: "storm"},
    99: {t: "Thunderstorm w/ hail", g: "storm"}
  };

  var ICONS = {
    clear:  '<circle cx="32" cy="32" r="14" fill="#f7b733"/><g stroke="#f7b733" stroke-width="4" stroke-linecap="round"><line x1="32" y1="4" x2="32" y2="12"/><line x1="32" y1="52" x2="32" y2="60"/><line x1="4" y1="32" x2="12" y2="32"/><line x1="52" y1="32" x2="60" y2="32"/><line x1="12" y1="12" x2="18" y2="18"/><line x1="46" y1="46" x2="52" y2="52"/><line x1="52" y1="12" x2="46" y2="18"/><line x1="18" y1="46" x2="12" y2="52"/></g>',
    partly: '<circle cx="24" cy="22" r="11" fill="#f7b733"/><g stroke="#f7b733" stroke-width="3.5" stroke-linecap="round"><line x1="24" y1="2" x2="24" y2="8"/><line x1="6" y1="22" x2="12" y2="22"/><line x1="10" y1="8" x2="14" y2="12"/><line x1="38" y1="8" x2="34" y2="12"/></g><path d="M22 50a12 12 0 0 1 1.6-23.9 15 15 0 0 1 28.4 5A10 10 0 0 1 50 50z" fill="#e8eef4" stroke="#c3ced9" stroke-width="2"/>',
    cloudy: '<path d="M20 48a13 13 0 0 1 1.7-25.9 16 16 0 0 1 30.6 5.4A11 11 0 0 1 50 48z" fill="#e8eef4" stroke="#b6c2cf" stroke-width="2.5"/>',
    fog:    '<path d="M20 40a13 13 0 0 1 1.7-25.9 16 16 0 0 1 30.6 5.4A11 11 0 0 1 50 40z" fill="#e8eef4" stroke="#b6c2cf" stroke-width="2.5"/><g stroke="#9aa7b4" stroke-width="4" stroke-linecap="round"><line x1="16" y1="50" x2="48" y2="50"/><line x1="22" y1="58" x2="54" y2="58"/></g>',
    rain:   '<path d="M20 40a13 13 0 0 1 1.7-25.9 16 16 0 0 1 30.6 5.4A11 11 0 0 1 50 40z" fill="#dfe7ef" stroke="#aab7c4" stroke-width="2.5"/><g stroke="#4a90d9" stroke-width="4" stroke-linecap="round"><line x1="24" y1="46" x2="20" y2="58"/><line x1="34" y1="46" x2="30" y2="58"/><line x1="44" y1="46" x2="40" y2="58"/></g>',
    snow:   '<path d="M20 38a13 13 0 0 1 1.7-25.9 16 16 0 0 1 30.6 5.4A11 11 0 0 1 50 38z" fill="#eef3f8" stroke="#b6c2cf" stroke-width="2.5"/><g fill="#6ea8e0"><circle cx="24" cy="50" r="3"/><circle cx="36" cy="56" r="3"/><circle cx="44" cy="49" r="3"/></g>',
    storm:  '<path d="M20 38a13 13 0 0 1 1.7-25.9 16 16 0 0 1 30.6 5.4A11 11 0 0 1 50 38z" fill="#cfd8e2" stroke="#96a3b1" stroke-width="2.5"/><path d="M34 40l-10 14h8l-4 12 14-18h-9l5-8z" fill="#f7b733" stroke="#e0a422" stroke-width="1.5" stroke-linejoin="round"/>'
  };

  function fmtDate(s) {
    var parts = s.split("-");
    var d = new Date(Date.UTC(+parts[0], +parts[1] - 1, +parts[2]));
    return d.toLocaleDateString("en-US", {
      weekday: "long", year: "numeric", month: "long", day: "numeric", timeZone: "UTC"
    });
  }

  var card = document.getElementById("card");
  var sub = document.getElementById("loadingSub");
  sub.textContent = name + " · " + fmtDate(dateStr);

  function showError(detail) {
    card.classList.remove("ready");
    card.innerHTML =
      '<div class="state">' +
        '<svg class="error-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">' +
          '<path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/>' +
          '<line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/>' +
        '</svg>' +
        '<div class="msg">Weather data could not be loaded</div>' +
        '<div class="sub">' + esc(detail || "Please try again later.") + '</div>' +
      '</div>';
    requestAnimationFrame(function () { card.classList.add("ready"); });
  }

  function esc(s) {
    return String(s).replace(/[&<>"]/g, function (c) {
      return {"&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;"}[c];
    });
  }

  function render(data) {
    var daily = data.daily || {};
    var hourly = data.hourly || {};
    var tmax = daily.temperature_2m_max && daily.temperature_2m_max[0];
    var tmin = daily.temperature_2m_min && daily.temperature_2m_min[0];
    var code = daily.weather_code && daily.weather_code[0];
    var temps = hourly.temperature_2m || [];
    var times = hourly.time || [];

    if (tmax == null || tmin == null || temps.length === 0) {
      showError("The API response did not include data for this date.");
      return;
    }

    var info = WMO[code] || {t: "Unknown conditions", g: "cloudy"};
    var scene = info.g === "partly" ? "clear" : info.g;
    document.body.setAttribute("data-scene", scene);

    var iconKey = ICONS[info.g] ? info.g : "cloudy";

    card.innerHTML =
      '<div class="top">' +
        '<div class="place">' +
          '<span class="eyebrow">Weather</span>' +
          '<h1>' + esc(name) + '</h1>' +
          '<span class="date">' + esc(fmtDate(dateStr)) + '</span>' +
        '</div>' +
      '</div>' +
      '<div class="hero">' +
        '<div class="icon-wrap"><svg viewBox="0 0 64 64">' + ICONS[iconKey] + '</svg></div>' +
        '<div class="hero-main">' +
          '<div class="temp-big">' + Math.round(tmax) + '<span class="deg">°C</span></div>' +
          '<div class="condition">' + esc(info.t) + '</div>' +
        '</div>' +
        '<div class="hero-stats">' +
          '<div class="stat max"><span class="label"><span class="dot"></span>High</span>' +
            '<span class="value">' + Math.round(tmax) + '°</span></div>' +
          '<div class="stat min"><span class="label"><span class="dot"></span>Low</span>' +
            '<span class="value">' + Math.round(tmin) + '°</span></div>' +
        '</div>' +
      '</div>' +
      '<div class="chart-section">' +
        '<div class="chart-head">' +
          '<h2>Hourly temperature</h2>' +
          '<span class="range">00:00 – 23:00 UTC</span>' +
        '</div>' +
        buildChart(temps, times) +
      '</div>';

    requestAnimationFrame(function () { card.classList.add("ready"); });
  }

  function buildChart(temps, times) {
    var W = 876, H = 200;
    var padL = 8, padR = 8, padT = 26, padB = 26;
    var plotW = W - padL - padR, plotH = H - padT - padB;

    var vals = temps.filter(function (v) { return v != null; });
    var lo = Math.min.apply(null, vals);
    var hi = Math.max.apply(null, vals);
    if (hi === lo) { hi += 1; lo -= 1; }
    var span = hi - lo;

    var n = temps.length;
    function x(i) { return padL + (n <= 1 ? plotW / 2 : (i / (n - 1)) * plotW); }
    function y(v) { return padT + plotH - ((v - lo) / span) * plotH; }

    var hiIdx = 0, loIdx = 0;
    for (var k = 0; k < n; k++) {
      if (temps[k] != null) {
        if (temps[k] > temps[hiIdx]) hiIdx = k;
        if (temps[k] < temps[loIdx]) loIdx = k;
      }
    }

    var pts = [];
    for (var i = 0; i < n; i++) {
      if (temps[i] != null) pts.push([x(i), y(temps[i]), i]);
    }
    if (!pts.length) return '<div class="sub">No hourly data.</div>';

    var linePath = pts.map(function (p, idx) {
      return (idx ? "L" : "M") + p[0].toFixed(1) + " " + p[1].toFixed(1);
    }).join(" ");
    var areaPath = "M" + pts[0][0].toFixed(1) + " " + (padT + plotH) +
      " " + linePath.replace(/^M/, "L") +
      " L" + pts[pts.length - 1][0].toFixed(1) + " " + (padT + plotH) + " Z";

    // gridlines
    var grid = "";
    for (var g = 0; g <= 2; g++) {
      var gy = padT + (plotH / 2) * g;
      grid += '<line class="grid" x1="' + padL + '" y1="' + gy.toFixed(1) +
              '" x2="' + (W - padR) + '" y2="' + gy.toFixed(1) + '"/>';
    }

    // x labels every 3 hours
    var xlabels = "";
    for (var h = 0; h < n; h += 3) {
      xlabels += '<text class="xlabel" x="' + x(h).toFixed(1) + '" y="' + (H - 6) + '">' +
                 String(h).padStart(2, "0") + '</text>';
    }

    // points + hi/lo callouts
    var dots = "";
    pts.forEach(function (p) {
      var cls = "pt" + (p[2] === hiIdx ? " hi" : p[2] === loIdx ? " lo" : "");
      var r = (p[2] === hiIdx || p[2] === loIdx) ? 4 : 2.4;
      dots += '<circle class="' + cls + '" cx="' + p[0].toFixed(1) + '" cy="' + p[1].toFixed(1) + '" r="' + r + '"/>';
    });
    var hx = x(hiIdx), hy = y(temps[hiIdx]);
    var lx = x(loIdx), ly = y(temps[loIdx]);
    var callouts =
      '<text class="peak" x="' + hx.toFixed(1) + '" y="' + (hy - 10).toFixed(1) + '">' + Math.round(temps[hiIdx]) + '°</text>' +
      '<text class="vlabel" x="' + lx.toFixed(1) + '" y="' + (ly + 18).toFixed(1) + '">' + Math.round(temps[loIdx]) + '°</text>';

    return '<svg class="chart" viewBox="0 0 ' + W + ' ' + H + '" preserveAspectRatio="none">' +
      '<defs><linearGradient id="areaGrad" x1="0" y1="0" x2="0" y2="1">' +
        '<stop offset="0%" stop-color="#ef7a4d" stop-opacity="0.28"/>' +
        '<stop offset="100%" stop-color="#ef7a4d" stop-opacity="0.02"/>' +
      '</linearGradient></defs>' +
      grid +
      '<path class="area" d="' + areaPath + '"/>' +
      '<path class="line" d="' + linePath + '"/>' +
      dots + callouts + xlabels +
    '</svg>';
  }

  // ---- Fetch ----
  fetch(endpoint + "?" + apiParams.toString(), {headers: {"Accept": "application/json"}})
    .then(function (res) {
      if (!res.ok) throw new Error("Server responded with " + res.status);
      return res.json();
    })
    .then(function (data) {
      if (data && data.error) throw new Error(data.reason || "API error");
      render(data);
    })
    .catch(function (err) {
      showError(err && err.message ? err.message : "Network request failed.");
    });
})();
</script>
</body>
</html>

L1 — cheap deterministic descriptors

bytes total17,780html / css / js452 / 5,713 / 11,615
dom nodes13dom depth5
css rules52js presentyes
brightness171.5contrast52.4
colorfulness22.9whitespace53.9%

This slot's telemetry

prompt tokens2completion tokens9,651
total tokens9,653wall102.5 s
costrequest id
config.json574 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "claude-opus-4-8-eff-high--cli--claude-code--dev",
  "effort": "high",
  "family": "claude",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "claude-opus-4-8",
  "protocol": "cli",
  "served_model": "claude-opus-4-8",
  "telemetry": {
    "completion_tokens": 30117,
    "cost_usd": null,
    "prompt_tokens": 10,
    "total_tokens": 30127,
    "wall_ms": 333782
  },
  "transport": "claude-code-cli-headless",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-07-17--dev-cc-opus48",
  "config_id": "claude-opus-4-8-eff-high--cli--claude-code--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-17T13:46:01.522534+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:44:53.109607+00:00"
        }
      ],
      "block_index": 0,
      "model_reaching_attempt_index": 0,
      "slot_index": 0,
      "terminal_state": "valid",
      "variant": "P-min"
    },
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-17T13:47:48.653258+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:46:06.106738+00:00"
        }
      ],
      "block_index": 0,
      "model_reaching_attempt_index": 0,
      "slot_index": 0,
      "terminal_state": "valid",
      "variant": "P-q"
    },
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-17T13:49:49.277629+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:47:52.197323+00:00"
        }
      ],
      "block_index": 1,
      "model_reaching_attempt_index": 0,
      "slot_index": 1,
      "terminal_state": "valid",
      "variant": "P-q"
    },
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-17T13:50:38.574438+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:49:52.826406+00:00"
        }
      ],
      "block_index": 1,
      "model_reaching_attempt_index": 0,
      "slot_index": 1,
      "terminal_state": "valid",
      "variant": "P-min"
    }
  ],
  "retry_policy": {
    "max_unreachable_retries": 5,
    "rate_limit_backoff": {
      "max_attempts": 4,
      "max_total_ms": 60000
    }
  }
}