gpt-5.6-sol @ low · codex-oauth

codex-oauthlow
config
gpt-5.6-sol-eff-low--cli--codex-oauth--dev
batch
2026-07-19--unified
transport
codex-cli-oauth-chatgpt
protocol
cli · plan
served model
gpt-5.6-sol
captured
Jul 18, 2026, 11:54 AM · N=2
variant
live
slot 0 · P-q · sandboxed iframe
gpt-5.6-sol @low · codex-oauth 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 tempmismatchshown: 17
  • min tempmatchshown: 16
  • hourlymatchcoverage 7/24 · 7 match · 0 mismatch · 17 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=device-width, initial-scale=1.0">
  <title>Weather Card</title>
  <style>
    :root {
      color-scheme: dark;
      --ink: #f7fbff;
      --muted: rgba(232, 242, 255, 0.66);
      --line: rgba(255, 255, 255, 0.13);
      --panel: rgba(13, 30, 51, 0.62);
      --accent: #ffd37a;
      --cool: #8ad8ff;
    }

    * { box-sizing: border-box; }

    html, body {
      width: 100%;
      min-height: 100%;
      margin: 0;
    }

    body {
      display: grid;
      place-items: center;
      min-height: 100vh;
      overflow: hidden;
      padding: 38px;
      font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      color: var(--ink);
      background:
        radial-gradient(circle at 15% 14%, rgba(111, 196, 255, 0.34), transparent 29%),
        radial-gradient(circle at 86% 86%, rgba(255, 172, 103, 0.22), transparent 31%),
        linear-gradient(135deg, #071523 0%, #102e4b 48%, #183f5b 100%);
    }

    body::before,
    body::after {
      position: fixed;
      content: "";
      border-radius: 999px;
      filter: blur(2px);
      pointer-events: none;
    }

    body::before {
      width: 390px;
      height: 390px;
      left: -145px;
      bottom: -210px;
      border: 1px solid rgba(255, 255, 255, 0.08);
      box-shadow: 0 0 0 62px rgba(255, 255, 255, 0.018);
    }

    body::after {
      width: 260px;
      height: 260px;
      right: -90px;
      top: -125px;
      background: rgba(255, 216, 141, 0.08);
      box-shadow: 0 0 90px rgba(255, 205, 111, 0.17);
    }

    .weather-card {
      position: relative;
      width: min(1160px, calc(100vw - 76px));
      height: min(690px, calc(100vh - 76px));
      min-height: 620px;
      overflow: hidden;
      padding: 44px 48px 36px;
      border: 1px solid rgba(255, 255, 255, 0.17);
      border-radius: 34px;
      background:
        linear-gradient(145deg, rgba(255, 255, 255, 0.13), rgba(255, 255, 255, 0.035)),
        var(--panel);
      box-shadow:
        0 34px 85px rgba(0, 8, 18, 0.42),
        inset 0 1px 0 rgba(255, 255, 255, 0.17);
      backdrop-filter: blur(28px);
    }

    .weather-card::before {
      position: absolute;
      top: -190px;
      right: -130px;
      width: 540px;
      height: 540px;
      content: "";
      border-radius: 50%;
      background: radial-gradient(circle, rgba(255, 213, 125, 0.19), transparent 65%);
      pointer-events: none;
    }

    header {
      position: relative;
      z-index: 1;
      display: flex;
      align-items: flex-start;
      justify-content: space-between;
    }

    .eyebrow {
      display: flex;
      align-items: center;
      gap: 10px;
      margin-bottom: 12px;
      color: var(--cool);
      font-size: 12px;
      font-weight: 750;
      letter-spacing: 0.19em;
      text-transform: uppercase;
    }

    .eyebrow::before {
      width: 7px;
      height: 7px;
      content: "";
      border-radius: 50%;
      background: var(--cool);
      box-shadow: 0 0 16px var(--cool);
    }

    h1 {
      max-width: 700px;
      margin: 0;
      overflow: hidden;
      font-size: clamp(38px, 4vw, 58px);
      font-weight: 650;
      letter-spacing: -0.045em;
      line-height: 1;
      text-overflow: ellipsis;
      white-space: nowrap;
    }

    .date {
      margin: 13px 0 0;
      color: var(--muted);
      font-size: 16px;
      letter-spacing: 0.01em;
    }

    .status-chip {
      display: flex;
      align-items: center;
      gap: 8px;
      margin-top: 4px;
      padding: 10px 14px;
      border: 1px solid var(--line);
      border-radius: 999px;
      color: rgba(240, 248, 255, 0.72);
      background: rgba(255, 255, 255, 0.055);
      font-size: 12px;
      font-weight: 650;
      letter-spacing: 0.04em;
    }

    .status-chip span {
      width: 6px;
      height: 6px;
      border-radius: 50%;
      background: #78dcac;
      box-shadow: 0 0 12px #78dcac;
    }

    .overview {
      position: relative;
      z-index: 1;
      display: grid;
      grid-template-columns: minmax(360px, 1.25fr) minmax(320px, 0.75fr);
      align-items: center;
      gap: 38px;
      margin-top: 42px;
    }

    .current {
      display: flex;
      align-items: center;
      gap: 28px;
    }

    .weather-icon {
      display: grid;
      flex: 0 0 136px;
      width: 136px;
      height: 136px;
      place-items: center;
      border: 1px solid rgba(255, 255, 255, 0.13);
      border-radius: 38px;
      background: linear-gradient(145deg, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.025));
      box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 20px 45px rgba(0, 12, 24, 0.18);
    }

    .weather-icon svg {
      width: 82px;
      height: 82px;
      filter: drop-shadow(0 10px 15px rgba(0, 10, 22, 0.24));
    }

    .condition {
      margin-bottom: 10px;
      color: rgba(242, 248, 255, 0.8);
      font-size: 20px;
      font-weight: 520;
    }

    .temperature {
      display: flex;
      align-items: flex-start;
      font-size: 96px;
      font-weight: 300;
      letter-spacing: -0.075em;
      line-height: 0.86;
    }

    .temperature sup {
      margin: 4px 0 0 9px;
      color: var(--accent);
      font-size: 25px;
      font-weight: 550;
      letter-spacing: -0.02em;
    }

    .range {
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 14px;
    }

    .metric {
      min-height: 126px;
      padding: 22px 22px 18px;
      border: 1px solid var(--line);
      border-radius: 25px;
      background: rgba(255, 255, 255, 0.05);
    }

    .metric-label {
      display: flex;
      align-items: center;
      gap: 8px;
      color: var(--muted);
      font-size: 12px;
      font-weight: 700;
      letter-spacing: 0.13em;
      text-transform: uppercase;
    }

    .metric-label::before {
      width: 8px;
      height: 8px;
      content: "";
      border-radius: 50%;
      background: var(--accent);
    }

    .metric.low .metric-label::before { background: var(--cool); }

    .metric-value {
      margin-top: 16px;
      font-size: 43px;
      font-weight: 450;
      letter-spacing: -0.04em;
    }

    .metric-value small {
      margin-left: 3px;
      color: var(--muted);
      font-size: 18px;
    }

    .hourly {
      position: absolute;
      z-index: 1;
      right: 48px;
      bottom: 36px;
      left: 48px;
      height: 208px;
      padding: 21px 23px 16px;
      border: 1px solid var(--line);
      border-radius: 27px;
      background: rgba(4, 17, 31, 0.29);
    }

    .hourly-header {
      display: flex;
      align-items: center;
      justify-content: space-between;
    }

    .hourly-title {
      margin: 0;
      font-size: 14px;
      font-weight: 700;
      letter-spacing: 0.08em;
      text-transform: uppercase;
    }

    .hourly-note {
      color: var(--muted);
      font-size: 12px;
    }

    .chart {
      position: relative;
      height: 145px;
      margin-top: 7px;
    }

    #chartSvg {
      display: block;
      width: 100%;
      height: 100%;
      overflow: visible;
    }

    .loading,
    .error {
      position: absolute;
      z-index: 5;
      inset: 0;
      display: grid;
      place-content: center;
      padding: 40px;
      text-align: center;
      background: rgba(7, 21, 35, 0.74);
      backdrop-filter: blur(18px);
      transition: opacity 0.35s ease, visibility 0.35s ease;
    }

    .loading.hidden,
    .error.hidden {
      visibility: hidden;
      opacity: 0;
    }

    .spinner {
      width: 42px;
      height: 42px;
      margin: 0 auto 18px;
      border: 3px solid rgba(255, 255, 255, 0.14);
      border-top-color: var(--cool);
      border-radius: 50%;
      animation: spin 0.85s linear infinite;
    }

    .loading p,
    .error p {
      margin: 0;
      color: var(--muted);
      font-size: 15px;
    }

    .error-symbol {
      margin-bottom: 17px;
      color: var(--accent);
      font-size: 42px;
    }

    .error h2 {
      margin: 0 0 10px;
      font-size: 25px;
      font-weight: 600;
    }

    @keyframes spin { to { transform: rotate(360deg); } }

    @media (max-height: 700px) {
      body { padding: 20px; }
      .weather-card { height: calc(100vh - 40px); min-height: 600px; }
      .overview { margin-top: 28px; }
      .hourly { bottom: 28px; }
    }
  </style>
</head>
<body>
  <main class="weather-card" aria-live="polite">
    <header>
      <div>
        <div class="eyebrow">Daily weather</div>
        <h1 id="location">Berlin</h1>
        <p class="date" id="dateLabel"></p>
      </div>
      <div class="status-chip"><span></span> UTC forecast</div>
    </header>

    <section class="overview">
      <div class="current">
        <div class="weather-icon" id="weatherIcon" aria-hidden="true"></div>
        <div>
          <div class="condition" id="condition">—</div>
          <div class="temperature">
            <span id="heroTemp">—</span><sup>°C</sup>
          </div>
        </div>
      </div>

      <div class="range">
        <div class="metric high">
          <div class="metric-label">Daily high</div>
          <div class="metric-value"><span id="maxTemp">—</span><small>°C</small></div>
        </div>
        <div class="metric low">
          <div class="metric-label">Daily low</div>
          <div class="metric-value"><span id="minTemp">—</span><small>°C</small></div>
        </div>
      </div>
    </section>

    <section class="hourly">
      <div class="hourly-header">
        <h2 class="hourly-title">Hourly temperature</h2>
        <span class="hourly-note">00:00–23:00 · UTC</span>
      </div>
      <div class="chart" id="chart"></div>
    </section>

    <div class="loading" id="loading">
      <div>
        <div class="spinner"></div>
        <p>Gathering the day’s weather…</p>
      </div>
    </div>

    <div class="error hidden" id="error">
      <div>
        <div class="error-symbol">☁</div>
        <h2>Weather unavailable</h2>
        <p>The weather data could not be loaded. Please try again.</p>
      </div>
    </div>
  </main>

  <script>
    (() => {
      const params = new URLSearchParams(location.search);
      const lat = Number.isFinite(Number(params.get("lat"))) ? Number(params.get("lat")) : 52.52;
      const lon = Number.isFinite(Number(params.get("lon"))) ? Number(params.get("lon")) : 13.405;
      const name = (params.get("name") || "Berlin").trim() || "Berlin";
      const today = new Date().toISOString().slice(0, 10);
      const requestedDate = /^\d{4}-\d{2}-\d{2}$/.test(params.get("date") || "")
        ? params.get("date")
        : today;

      const conditions = {
        0: ["Clear sky", "clear"],
        1: ["Mainly clear", "partly"],
        2: ["Partly cloudy", "partly"],
        3: ["Overcast", "cloud"],
        45: ["Fog", "fog"],
        48: ["Rime fog", "fog"],
        51: ["Light drizzle", "rain"],
        53: ["Drizzle", "rain"],
        55: ["Heavy drizzle", "rain"],
        56: ["Freezing drizzle", "sleet"],
        57: ["Freezing drizzle", "sleet"],
        61: ["Light rain", "rain"],
        63: ["Rain", "rain"],
        65: ["Heavy rain", "rain"],
        66: ["Freezing rain", "sleet"],
        67: ["Heavy freezing rain", "sleet"],
        71: ["Light snow", "snow"],
        73: ["Snow", "snow"],
        75: ["Heavy snow", "snow"],
        77: ["Snow grains", "snow"],
        80: ["Light showers", "rain"],
        81: ["Rain showers", "rain"],
        82: ["Heavy showers", "rain"],
        85: ["Snow showers", "snow"],
        86: ["Heavy snow showers", "snow"],
        95: ["Thunderstorm", "storm"],
        96: ["Thunderstorm with hail", "storm"],
        99: ["Severe thunderstorm", "storm"]
      };

      const icons = {
        clear: `<svg viewBox="0 0 100 100"><circle cx="50" cy="50" r="20" fill="#FFD579"/><g stroke="#FFD579" stroke-width="5" stroke-linecap="round"><path d="M50 8v10M50 82v10M8 50h10M82 50h10M20 20l7 7M73 73l7 7M80 20l-7 7M27 73l-7 7"/></g></svg>`,
        partly: `<svg viewBox="0 0 100 100"><circle cx="62" cy="35" r="19" fill="#FFD579"/><g stroke="#FFD579" stroke-width="4" stroke-linecap="round"><path d="M62 7v8M89 35h-8M81 16l-6 6"/></g><path d="M73 75H28a17 17 0 1 1 6-33 23 23 0 0 1 43 11 12 12 0 0 1-4 22Z" fill="#DDEEFF" stroke="#F5FAFF" stroke-width="3"/></svg>`,
        cloud: `<svg viewBox="0 0 100 100"><path d="M78 75H24a19 19 0 1 1 7-36 27 27 0 0 1 51 13 14 14 0 0 1-4 23Z" fill="#DCEEFF" stroke="#F5FAFF" stroke-width="3"/></svg>`,
        rain: `<svg viewBox="0 0 100 100"><path d="M78 61H24a18 18 0 1 1 7-35 26 26 0 0 1 50 13 13 13 0 0 1-3 22Z" fill="#DCEEFF"/><g stroke="#75D1FF" stroke-width="5" stroke-linecap="round"><path d="M34 71l-5 10M53 71l-5 10M72 71l-5 10"/></g></svg>`,
        snow: `<svg viewBox="0 0 100 100"><path d="M78 58H24a18 18 0 1 1 7-35 26 26 0 0 1 50 13 13 13 0 0 1-3 22Z" fill="#DCEEFF"/><g fill="#A9E5FF"><circle cx="30" cy="75" r="4"/><circle cx="50" cy="82" r="4"/><circle cx="70" cy="74" r="4"/></g></svg>`,
        fog: `<svg viewBox="0 0 100 100"><path d="M75 53H27a16 16 0 1 1 6-31 23 23 0 0 1 44 12 11 11 0 0 1-2 19Z" fill="#DCEEFF"/><g stroke="#A9DDF4" stroke-width="5" stroke-linecap="round"><path d="M19 67h62M27 80h46"/></g></svg>`,
        sleet: `<svg viewBox="0 0 100 100"><path d="M78 57H24a18 18 0 1 1 7-35 26 26 0 0 1 50 13 13 13 0 0 1-3 22Z" fill="#DCEEFF"/><g stroke="#75D1FF" stroke-width="5" stroke-linecap="round"><path d="M33 68l-4 9M65 68l-4 9"/></g><circle cx="48" cy="78" r="4" fill="#D7F3FF"/></svg>`,
        storm: `<svg viewBox="0 0 100 100"><path d="M78 57H24a18 18 0 1 1 7-35 26 26 0 0 1 50 13 13 13 0 0 1-3 22Z" fill="#C9DDEF"/><path d="M53 61 38 80h12l-4 14 19-24H53Z" fill="#FFD36F"/></svg>`
      };

      function formatDate(value) {
        const date = new Date(value + "T12:00:00Z");
        if (Number.isNaN(date.getTime())) return value;
        return new Intl.DateTimeFormat("en", {
          weekday: "long",
          day: "numeric",
          month: "long",
          year: "numeric",
          timeZone: "UTC"
        }).format(date);
      }

      function number(value) {
        return Number.isFinite(Number(value)) ? Number(value) : null;
      }

      function drawChart(values, times) {
        const clean = values.map(number);
        if (!clean.length || clean.every(v => v === null)) throw new Error("Missing hourly data");

        const width = 1000;
        const height = 142;
        const left = 18;
        const right = 18;
        const top = 22;
        const bottom = 28;
        const valid = clean.filter(v => v !== null);
        const low = Math.floor(Math.min(...valid) - 2);
        const high = Math.ceil(Math.max(...valid) + 2);
        const span = Math.max(1, high - low);
        const x = i => left + i * (width - left - right) / Math.max(1, clean.length - 1);
        const y = v => top + (high - v) * (height - top - bottom) / span;

        const points = clean
          .map((v, i) => v === null ? null : [x(i), y(v)])
          .filter(Boolean);
        const line = points.map((p, i) => `${i ? "L" : "M"}${p[0].toFixed(2)},${p[1].toFixed(2)}`).join(" ");
        const area = `${line} L${points[points.length - 1][0]},${height - bottom} L${points[0][0]},${height - bottom} Z`;

        const labels = clean.map((v, i) => {
          if (v === null || (i % 3 !== 0 && i !== clean.length - 1)) return "";
          const hour = times[i] ? times[i].slice(11, 16) : String(i).padStart(2, "0") + ":00";
          return `<g>
            <text x="${x(i)}" y="${height - 5}" text-anchor="middle" fill="rgba(231,242,255,.55)" font-size="10">${hour}</text>
            <text x="${x(i)}" y="${Math.max(12, y(v) - 10)}" text-anchor="middle" fill="rgba(248,252,255,.82)" font-size="10" font-weight="650">${Math.round(v)}°</text>
          </g>`;
        }).join("");

        const grid = [0, .5, 1].map(f => {
          const gy = top + f * (height - top - bottom);
          return `<line x1="${left}" y1="${gy}" x2="${width - right}" y2="${gy}" stroke="rgba(255,255,255,.08)" stroke-width="1"/>`;
        }).join("");

        document.getElementById("chart").innerHTML = `
          <svg id="chartSvg" viewBox="0 0 ${width} ${height}" preserveAspectRatio="none" role="img" aria-label="Hourly temperature chart">
            <defs>
              <linearGradient id="areaGradient" x1="0" y1="0" x2="0" y2="1">
                <stop offset="0" stop-color="#76D3FF" stop-opacity=".30"/>
                <stop offset="1" stop-color="#76D3FF" stop-opacity="0"/>
              </linearGradient>
              <linearGradient id="lineGradient" x1="0" y1="0" x2="1" y2="0">
                <stop offset="0" stop-color="#78D7FF"/>
                <stop offset=".55" stop-color="#C5EDFF"/>
                <stop offset="1" stop-color="#FFD47A"/>
              </linearGradient>
            </defs>
            ${grid}
            <path d="${area}" fill="url(#areaGradient)"/>
            <path d="${line}" fill="none" stroke="url(#lineGradient)" stroke-width="3.3" stroke-linecap="round" stroke-linejoin="round" vector-effect="non-scaling-stroke"/>
            ${points.map(p => `<circle cx="${p[0]}" cy="${p[1]}" r="2.5" fill="#EAF8FF" opacity=".8"/>`).join("")}
            ${labels}
          </svg>`;
      }

      async function load() {
        document.getElementById("location").textContent = name;
        document.getElementById("dateLabel").textContent = formatDate(requestedDate);
        document.title = `${name} weather · ${requestedDate}`;

        try {
          const endpoint = requestedDate < today ? "/api/om/archive" : "/api/om/forecast";
          const query = new URLSearchParams({
            latitude: String(lat),
            longitude: String(lon),
            daily: "temperature_2m_max,temperature_2m_min,weather_code",
            hourly: "temperature_2m",
            timezone: "UTC",
            temperature_unit: "celsius",
            start_date: requestedDate,
            end_date: requestedDate
          });

          const response = await fetch(`${endpoint}?${query}`);
          if (!response.ok) throw new Error(`Weather request failed: ${response.status}`);

          const data = await response.json();
          const max = number(data.daily?.temperature_2m_max?.[0]);
          const min = number(data.daily?.temperature_2m_min?.[0]);
          const code = number(data.daily?.weather_code?.[0]);

          if (max === null || min === null || code === null) throw new Error("Incomplete weather data");

          const [label, iconType] = conditions[code] || ["Unknown conditions", "cloud"];
          document.getElementById("condition").textContent = label;
          document.getElementById("weatherIcon").innerHTML = icons[iconType];
          document.getElementById("heroTemp").textContent = Math.round(max);
          document.getElementById("maxTemp").textContent = max.toFixed(1);
          document.getElementById("minTemp").textContent = min.toFixed(1);

          const hourlyTimes = data.hourly?.time || [];
          const hourlyValues = data.hourly?.temperature_2m || [];
          const selectedValues = [];
          const selectedTimes = [];

          hourlyTimes.forEach((time, index) => {
            if (String(time).slice(0, 10) === requestedDate) {
              selectedTimes.push(time);
              selectedValues.push(hourlyValues[index]);
            }
          });

          drawChart(
            selectedValues.length ? selectedValues : hourlyValues,
            selectedTimes.length ? selectedTimes : hourlyTimes
          );

          document.getElementById("loading").classList.add("hidden");
        } catch (err) {
          document.getElementById("loading").classList.add("hidden");
          document.getElementById("error").classList.remove("hidden");
        }
      }

      load();
    })();
  </script>
</body>
</html>

L1 — cheap deterministic descriptors

bytes total19,950html / css / js1,972 / 8,207 / 9,771
dom nodes49dom depth8
css rules49js presentyes
brightness55.3contrast20.3
colorfulness18.8whitespace56.8%

This slot's telemetry

prompt tokens0completion tokens12,256
total tokens0wall119.9 s
costrequest id
config.json557 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "gpt-5.6-sol-eff-low--cli--codex-oauth--dev",
  "effort": "low",
  "family": "gpt",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "gpt-5.6-sol",
  "protocol": "cli",
  "served_model": "gpt-5.6-sol",
  "telemetry": {
    "completion_tokens": 43774,
    "cost_usd": null,
    "prompt_tokens": null,
    "total_tokens": null,
    "wall_ms": 379283
  },
  "transport": "codex-cli-oauth-chatgpt",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-07-17--dev-codex-oauth-gpt-5.6-sol",
  "config_id": "gpt-5.6-sol-eff-low--cli--codex-oauth--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-17T13:55:23.263996+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:54:09.035404+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:57:27.360859+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:55:27.427233+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:59:06.166100+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:57:31.001140+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-17T14:00:39.730415+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T13:59:09.763692+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
    }
  }
}