gpt-5.6-sol @ medium · codex-oauth

codex-oauthmedium
config
gpt-5.6-sol-eff-medium--cli--codex-oauth--dev
batch
2026-07-19--unified
transport
codex-cli-oauth-chatgpt
protocol
cli · plan
served model
gpt-5.6-sol
采集于
2026年7月18日 11:54 · N=2
variant
live
slot 0 · P-q · sandboxed iframe
gpt-5.6-sol @medium · codex-oauth P-q slot 0 截图

截图是 similarity 通道测量时的原始像素。运行 live 会在 sandboxed iframe 中重新执行原始输出;渲染结果取决于你的浏览器和字体,不保证与测量像素一致。

similarity 邻居

限于 session 2026-07-19--unified

similarity 衡量本 session 内的趋同程度 —— 不是质量。

Fidelity —— 卡片展示的数据对不对?

  • namematch
  • conditionmatch
  • datematch
  • max tempmismatch展示值:28
  • min tempmismatch展示值:23
  • hourlyambiguouscoverage · 0 命中 · 0 不符 · 24 未展示
  • request sidematch0 处违规

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

源码 —— 原始模型输出,一字节未改

下载 card.html
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <title>Weather Card</title>
  <style>
    :root {
      color-scheme: dark;
      font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      --ink: #f7fbff;
      --muted: rgba(235, 245, 255, .66);
      --line: rgba(255, 255, 255, .12);
      --glass: rgba(9, 25, 49, .62);
      --accent: #ffc86b;
      --cool: #80d8ff;
    }

    * { box-sizing: border-box; }

    body {
      margin: 0;
      min-width: 320px;
      min-height: 100vh;
      overflow: hidden;
      color: var(--ink);
      background:
        radial-gradient(circle at 78% 8%, rgba(85, 189, 255, .33), transparent 34%),
        radial-gradient(circle at 13% 84%, rgba(112, 84, 255, .27), transparent 38%),
        linear-gradient(135deg, #07142b 0%, #102b50 48%, #0b3155 100%);
    }

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

    body::before {
      width: 420px;
      height: 420px;
      right: -110px;
      top: -170px;
      background: rgba(255, 207, 112, .10);
      box-shadow: 0 0 100px rgba(255, 198, 88, .13);
    }

    body::after {
      width: 310px;
      height: 310px;
      left: -130px;
      bottom: -130px;
      background: rgba(84, 213, 255, .09);
    }

    .stage {
      width: 100vw;
      height: 100vh;
      min-height: 620px;
      display: grid;
      place-items: center;
      padding: 42px;
    }

    .card {
      position: relative;
      width: min(1160px, calc(100vw - 84px));
      height: min(700px, calc(100vh - 84px));
      min-height: 620px;
      overflow: hidden;
      border: 1px solid rgba(255, 255, 255, .15);
      border-radius: 34px;
      background:
        linear-gradient(145deg, rgba(255,255,255,.11), transparent 38%),
        var(--glass);
      box-shadow:
        0 34px 90px rgba(0, 5, 20, .46),
        inset 0 1px 0 rgba(255, 255, 255, .12);
      backdrop-filter: blur(28px);
    }

    .card::after {
      content: "";
      position: absolute;
      inset: 0;
      pointer-events: none;
      background: linear-gradient(100deg, transparent 45%, rgba(255,255,255,.025));
    }

    .content {
      position: relative;
      z-index: 2;
      height: 100%;
      display: grid;
      grid-template-rows: auto 1fr auto;
      gap: 22px;
      padding: 44px 48px 38px;
    }

    header {
      display: flex;
      align-items: flex-start;
      justify-content: space-between;
      gap: 30px;
    }

    .eyebrow {
      margin: 0 0 10px;
      color: var(--cool);
      font-size: 11px;
      font-weight: 750;
      letter-spacing: .18em;
      text-transform: uppercase;
    }

    h1 {
      max-width: 680px;
      margin: 0;
      overflow: hidden;
      font-size: clamp(34px, 4vw, 54px);
      font-weight: 560;
      letter-spacing: -.045em;
      line-height: 1;
      text-overflow: ellipsis;
      white-space: nowrap;
    }

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

    .utc {
      margin-top: 3px;
      color: rgba(235,245,255,.42);
      font-size: 11px;
      letter-spacing: .12em;
      text-transform: uppercase;
    }

    .condition-pill {
      display: flex;
      align-items: center;
      gap: 10px;
      margin-top: 4px;
      padding: 10px 15px 10px 11px;
      border: 1px solid var(--line);
      border-radius: 999px;
      color: rgba(247,251,255,.86);
      background: rgba(255,255,255,.055);
      font-size: 13px;
      font-weight: 600;
      white-space: nowrap;
    }

    .condition-pill span:first-child {
      display: grid;
      width: 29px;
      height: 29px;
      place-items: center;
      border-radius: 50%;
      background: rgba(255, 200, 107, .15);
      font-size: 17px;
    }

    .overview {
      min-height: 225px;
      display: grid;
      grid-template-columns: 1fr 1.08fr;
      align-items: center;
      gap: 50px;
    }

    .weather-main {
      display: flex;
      align-items: center;
      gap: 34px;
      padding-left: 8px;
    }

    .art {
      position: relative;
      width: 184px;
      height: 160px;
      flex: 0 0 184px;
    }

    .sun {
      position: absolute;
      top: 3px;
      left: 52px;
      width: 105px;
      height: 105px;
      border-radius: 50%;
      background: linear-gradient(145deg, #ffe59c, #ffad45);
      box-shadow:
        0 0 38px rgba(255, 191, 84, .38),
        0 0 90px rgba(255, 174, 67, .17);
    }

    .sun::after {
      content: "";
      position: absolute;
      inset: 13px;
      border: 1px solid rgba(255,255,255,.28);
      border-radius: inherit;
    }

    .cloud {
      position: absolute;
      left: 12px;
      bottom: 17px;
      width: 149px;
      height: 61px;
      border-radius: 34px;
      background: linear-gradient(150deg, #f7fbff 10%, #a7c5dc 92%);
      box-shadow: 0 16px 27px rgba(0, 8, 25, .28);
    }

    .cloud::before,
    .cloud::after {
      content: "";
      position: absolute;
      border-radius: 50%;
      background: inherit;
    }

    .cloud::before {
      width: 75px;
      height: 75px;
      left: 21px;
      bottom: 20px;
    }

    .cloud::after {
      width: 58px;
      height: 58px;
      right: 20px;
      bottom: 18px;
    }

    .art.clear .cloud { display: none; }
    .art.clear .sun { left: 38px; top: 23px; width: 122px; height: 122px; }
    .art.cloudy .sun { opacity: .38; filter: saturate(.45); }
    .art.cloudy .cloud { transform: scale(1.07); transform-origin: bottom left; }
    .art.precip .sun { opacity: .3; filter: saturate(.4); }

    .rain,
    .snow {
      position: absolute;
      left: 42px;
      bottom: -6px;
      display: none;
      gap: 22px;
    }

    .precip.rainy .rain { display: flex; }
    .precip.snowy .snow { display: flex; }

    .rain i {
      width: 4px;
      height: 20px;
      border-radius: 10px;
      background: #78d8ff;
      transform: rotate(18deg);
      box-shadow: 0 0 10px rgba(120,216,255,.35);
    }

    .snow i {
      color: #dff6ff;
      font-style: normal;
      font-size: 20px;
    }

    .temperature {
      display: flex;
      align-items: flex-start;
      line-height: .82;
    }

    .temperature strong {
      font-size: clamp(82px, 8.4vw, 116px);
      font-weight: 350;
      letter-spacing: -.075em;
    }

    .temperature sup {
      margin: 4px 0 0 8px;
      color: var(--accent);
      font-size: 25px;
      font-weight: 550;
    }

    .temperature-label {
      margin-top: 17px;
      color: var(--muted);
      font-size: 13px;
    }

    .metrics {
      display: grid;
      grid-template-columns: 1fr 1fr;
      overflow: hidden;
      border: 1px solid var(--line);
      border-radius: 25px;
      background: rgba(255,255,255,.04);
    }

    .metric {
      min-height: 150px;
      padding: 25px 28px;
    }

    .metric + .metric { border-left: 1px solid var(--line); }

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

    .metric-label i {
      width: 8px;
      height: 8px;
      border-radius: 50%;
      background: var(--accent);
      box-shadow: 0 0 12px rgba(255,200,107,.45);
    }

    .metric:last-child .metric-label i {
      background: var(--cool);
      box-shadow: 0 0 12px rgba(128,216,255,.42);
    }

    .metric-value {
      margin-top: 20px;
      font-size: 53px;
      font-weight: 380;
      letter-spacing: -.055em;
    }

    .metric-value span {
      margin-left: 3px;
      color: var(--muted);
      font-size: 20px;
      vertical-align: top;
    }

    .chart-panel {
      min-height: 245px;
      padding: 22px 24px 15px;
      border: 1px solid var(--line);
      border-radius: 26px;
      background: rgba(2, 14, 32, .26);
    }

    .chart-heading {
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin: 0 3px 10px;
    }

    .chart-heading h2 {
      margin: 0;
      font-size: 14px;
      font-weight: 650;
      letter-spacing: .02em;
    }

    .chart-heading span {
      color: rgba(235,245,255,.46);
      font-size: 11px;
      letter-spacing: .12em;
      text-transform: uppercase;
    }

    #chart {
      display: block;
      width: 100%;
      height: 190px;
      overflow: visible;
    }

    .grid-line {
      stroke: rgba(255,255,255,.075);
      stroke-width: 1;
    }

    .axis-label {
      fill: rgba(235,245,255,.42);
      font-size: 10px;
      font-family: inherit;
    }

    .area { fill: url(#areaGradient); }

    .curve {
      fill: none;
      stroke: #84ddff;
      stroke-width: 3;
      stroke-linecap: round;
      stroke-linejoin: round;
      filter: drop-shadow(0 0 6px rgba(92,207,255,.38));
    }

    .point {
      fill: #e9faff;
      stroke: #47c8ff;
      stroke-width: 2;
    }

    .point-label {
      fill: rgba(247,251,255,.82);
      font-size: 10px;
      font-weight: 650;
      font-family: inherit;
      text-anchor: middle;
    }

    .status {
      position: absolute;
      z-index: 5;
      inset: 0;
      display: grid;
      place-items: center;
      background: rgba(5, 18, 38, .76);
      backdrop-filter: blur(18px);
      transition: opacity .35s ease, visibility .35s ease;
    }

    .status.hidden {
      opacity: 0;
      visibility: hidden;
    }

    .status-inner {
      max-width: 440px;
      padding: 36px;
      text-align: center;
    }

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

    .status.error .spinner {
      display: grid;
      place-items: center;
      border: 1px solid rgba(255,130,130,.35);
      border-radius: 50%;
      color: #ffb1b1;
      background: rgba(255,90,90,.08);
      animation: none;
    }

    .status.error .spinner::after {
      content: "!";
      font-size: 22px;
      font-weight: 750;
    }

    .status-title {
      margin: 0;
      font-size: 21px;
      font-weight: 600;
    }

    .status-copy {
      margin: 9px 0 0;
      color: var(--muted);
      font-size: 14px;
      line-height: 1.55;
    }

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

    @media (max-width: 900px), (max-height: 700px) {
      body { overflow: auto; }
      .stage { height: auto; min-height: 100vh; padding: 24px; }
      .card { width: 100%; height: auto; min-height: 0; }
      .content { padding: 32px; }
      .overview { grid-template-columns: 1fr; gap: 22px; }
      .weather-main { justify-content: center; }
    }
  </style>
</head>
<body>
  <main class="stage">
    <article class="card" aria-label="Daily weather">
      <div class="status" id="status" role="status" aria-live="polite">
        <div class="status-inner">
          <div class="spinner"></div>
          <p class="status-title" id="statusTitle">Loading the forecast</p>
          <p class="status-copy" id="statusCopy">Gathering the day’s temperatures…</p>
        </div>
      </div>

      <div class="content">
        <header>
          <div>
            <p class="eyebrow">Daily weather</p>
            <h1 id="location">Berlin</h1>
            <p class="date" id="dateLabel"></p>
            <div class="utc">Coordinated Universal Time</div>
          </div>
          <div class="condition-pill">
            <span id="conditionIcon" aria-hidden="true">◐</span>
            <span id="condition">Loading</span>
          </div>
        </header>

        <section class="overview">
          <div class="weather-main">
            <div class="art precip" id="weatherArt" aria-hidden="true">
              <div class="sun"></div>
              <div class="cloud"></div>
              <div class="rain"><i></i><i></i><i></i></div>
              <div class="snow"><i>✦</i><i>✦</i><i>✦</i></div>
            </div>
            <div>
              <div class="temperature">
                <strong id="headlineTemp">—</strong><sup>°C</sup>
              </div>
              <div class="temperature-label">Daily high</div>
            </div>
          </div>

          <div class="metrics">
            <div class="metric">
              <div class="metric-label"><i></i>Maximum</div>
              <div class="metric-value"><b id="maxTemp">—</b><span>°C</span></div>
            </div>
            <div class="metric">
              <div class="metric-label"><i></i>Minimum</div>
              <div class="metric-value"><b id="minTemp">—</b><span>°C</span></div>
            </div>
          </div>
        </section>

        <section class="chart-panel" aria-labelledby="hourlyTitle">
          <div class="chart-heading">
            <h2 id="hourlyTitle">Hourly temperature</h2>
            <span>00:00–23:00 UTC</span>
          </div>
          <svg id="chart" role="img" aria-label="Hourly temperature chart" viewBox="0 0 1040 190" preserveAspectRatio="none"></svg>
        </section>
      </div>
    </article>
  </main>

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

      const params = new URLSearchParams(location.search);
      const now = new Date();
      const todayUTC = [
        now.getUTCFullYear(),
        String(now.getUTCMonth() + 1).padStart(2, "0"),
        String(now.getUTCDate()).padStart(2, "0")
      ].join("-");

      const numericParam = (key, fallback, min, max) => {
        const value = Number(params.get(key));
        return Number.isFinite(value) && value >= min && value <= max ? value : fallback;
      };

      const validDate = value => {
        if (!/^\d{4}-\d{2}-\d{2}$/.test(value || "")) return false;
        const parsed = new Date(value + "T00:00:00Z");
        return !Number.isNaN(parsed.getTime()) &&
          parsed.toISOString().slice(0, 10) === value;
      };

      const latitude = numericParam("lat", 52.52, -90, 90);
      const longitude = numericParam("lon", 13.405, -180, 180);
      const requestedName = (params.get("name") || "Berlin").trim().slice(0, 90) || "Berlin";
      const requestedDate = validDate(params.get("date")) ? params.get("date") : todayUTC;

      const $ = id => document.getElementById(id);
      $("location").textContent = requestedName;
      $("dateLabel").textContent = new Intl.DateTimeFormat(undefined, {
        weekday: "long",
        day: "numeric",
        month: "long",
        year: "numeric",
        timeZone: "UTC"
      }).format(new Date(requestedDate + "T12:00:00Z"));
      document.title = requestedName + " weather";

      const conditionFor = code => {
        const conditions = {
          0: ["Clear sky", "☀", "clear"],
          1: ["Mainly clear", "◐", ""],
          2: ["Partly cloudy", "◒", ""],
          3: ["Overcast", "☁", "cloudy"],
          45: ["Fog", "≋", "cloudy"],
          48: ["Rime fog", "≋", "cloudy"],
          51: ["Light drizzle", "⌁", "precip rainy"],
          53: ["Drizzle", "⌁", "precip rainy"],
          55: ["Heavy drizzle", "⌁", "precip rainy"],
          56: ["Freezing drizzle", "❄", "precip snowy"],
          57: ["Freezing drizzle", "❄", "precip snowy"],
          61: ["Light rain", "☂", "precip rainy"],
          63: ["Rain", "☂", "precip rainy"],
          65: ["Heavy rain", "☂", "precip rainy"],
          66: ["Freezing rain", "❄", "precip snowy"],
          67: ["Heavy freezing rain", "❄", "precip snowy"],
          71: ["Light snow", "❄", "precip snowy"],
          73: ["Snow", "❄", "precip snowy"],
          75: ["Heavy snow", "❄", "precip snowy"],
          77: ["Snow grains", "❄", "precip snowy"],
          80: ["Light showers", "☂", "precip rainy"],
          81: ["Rain showers", "☂", "precip rainy"],
          82: ["Heavy showers", "☂", "precip rainy"],
          85: ["Snow showers", "❄", "precip snowy"],
          86: ["Heavy snow showers", "❄", "precip snowy"],
          95: ["Thunderstorm", "ϟ", "precip rainy"],
          96: ["Thunderstorm with hail", "ϟ", "precip rainy"],
          99: ["Severe thunderstorm", "ϟ", "precip rainy"]
        };
        return conditions[code] || ["Unknown conditions", "◌", "cloudy"];
      };

      const createSVG = (tag, attrs = {}, text = "") => {
        const node = document.createElementNS("http://www.w3.org/2000/svg", tag);
        Object.entries(attrs).forEach(([key, value]) => node.setAttribute(key, value));
        if (text) node.textContent = text;
        return node;
      };

      function renderChart(values, times) {
        const svg = $("chart");
        svg.replaceChildren();

        const width = 1040;
        const height = 190;
        const left = 34;
        const right = 18;
        const top = 24;
        const bottom = 31;
        const chartW = width - left - right;
        const chartH = height - top - bottom;
        const minValue = Math.floor(Math.min(...values) - 2);
        const maxValue = Math.ceil(Math.max(...values) + 2);
        const range = Math.max(4, maxValue - minValue);

        const defs = createSVG("defs");
        const gradient = createSVG("linearGradient", {
          id: "areaGradient", x1: "0", y1: "0", x2: "0", y2: "1"
        });
        gradient.append(
          createSVG("stop", { offset: "0%", "stop-color": "#6bd5ff", "stop-opacity": ".28" }),
          createSVG("stop", { offset: "100%", "stop-color": "#6bd5ff", "stop-opacity": "0" })
        );
        defs.appendChild(gradient);
        svg.appendChild(defs);

        for (let i = 0; i < 4; i++) {
          const y = top + chartH * i / 3;
          const value = maxValue - range * i / 3;
          svg.appendChild(createSVG("line", {
            x1: left, y1: y, x2: width - right, y2: y, class: "grid-line"
          }));
          svg.appendChild(createSVG("text", {
            x: 0, y: y + 4, class: "axis-label"
          }, Math.round(value) + "°"));
        }

        const points = values.map((value, i) => ({
          x: left + chartW * i / Math.max(1, values.length - 1),
          y: top + (maxValue - value) / range * chartH,
          value
        }));

        const linePath = points.map((p, i) =>
          (i ? "L" : "M") + p.x.toFixed(2) + " " + p.y.toFixed(2)
        ).join(" ");
        const areaPath = linePath +
          " L " + points[points.length - 1].x + " " + (top + chartH) +
          " L " + points[0].x + " " + (top + chartH) + " Z";

        svg.appendChild(createSVG("path", { d: areaPath, class: "area" }));
        svg.appendChild(createSVG("path", { d: linePath, class: "curve" }));

        const labelIndexes = new Set([0, 6, 12, 18, values.length - 1].filter(i => i < values.length));
        points.forEach((point, i) => {
          if (labelIndexes.has(i)) {
            svg.appendChild(createSVG("circle", {
              cx: point.x, cy: point.y, r: 4, class: "point"
            }));
            svg.appendChild(createSVG("text", {
              x: point.x,
              y: Math.max(12, point.y - 11),
              class: "point-label"
            }, Math.round(point.value) + "°"));
          }
        });

        labelIndexes.forEach(i => {
          const hour = (times[i] || "").slice(11, 16) || String(i).padStart(2, "0") + ":00";
          svg.appendChild(createSVG("text", {
            x: points[i].x,
            y: height - 5,
            class: "axis-label",
            "text-anchor": i === 0 ? "start" : i === values.length - 1 ? "end" : "middle"
          }, hour));
        });
      }

      function fail(message) {
        const status = $("status");
        status.classList.add("error");
        $("statusTitle").textContent = "Weather unavailable";
        $("statusCopy").textContent = message || "The data could not be loaded. Please try again.";
      }

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

        try {
          const response = await fetch(endpoint + "?" + query.toString(), {
            headers: { Accept: "application/json" }
          });
          if (!response.ok) throw new Error("Weather service returned " + response.status + ".");

          const data = await response.json();
          const dailyIndex = data.daily?.time?.indexOf(requestedDate);
          if (dailyIndex == null || dailyIndex < 0) throw new Error("No daily data was returned for this date.");

          const high = Number(data.daily.temperature_2m_max?.[dailyIndex]);
          const low = Number(data.daily.temperature_2m_min?.[dailyIndex]);
          const code = Number(data.daily.weather_code?.[dailyIndex]);
          if (![high, low, code].every(Number.isFinite)) throw new Error("The daily weather data is incomplete.");

          const hourlyTimes = data.hourly?.time || [];
          const temperatures = data.hourly?.temperature_2m || [];
          const entries = hourlyTimes
            .map((time, index) => ({ time, value: Number(temperatures[index]) }))
            .filter(entry => entry.time.startsWith(requestedDate) && Number.isFinite(entry.value));

          if (!entries.length) throw new Error("No hourly temperatures were returned for this date.");

          const [condition, icon, artClass] = conditionFor(code);
          $("condition").textContent = condition;
          $("conditionIcon").textContent = icon;
          $("headlineTemp").textContent = Math.round(high);
          $("maxTemp").textContent = high.toFixed(1);
          $("minTemp").textContent = low.toFixed(1);
          $("weatherArt").className = "art " + artClass;
          renderChart(entries.map(entry => entry.value), entries.map(entry => entry.time));

          requestAnimationFrame(() => $("status").classList.add("hidden"));
        } catch (error) {
          fail(error instanceof Error ? error.message : "");
        }
      }

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

L1 —— 廉价的确定性描述量

bytes 总计22,575html / css / js2,617 / 10,767 / 9,191
dom 节点61dom 深度10
css 规则76含 js
brightness42.7contrast27.6
colorfulness23.6留白53.8%

该 slot 的 telemetry

prompt tokens0completion tokens12,520
total tokens0wall122 s
costrequest id
config.json563 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "gpt-5.6-sol-eff-medium--cli--codex-oauth--dev",
  "effort": "medium",
  "family": "gpt",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "gpt-5.6-sol",
  "protocol": "cli",
  "served_model": "gpt-5.6-sol",
  "telemetry": {
    "completion_tokens": 45846,
    "cost_usd": null,
    "prompt_tokens": null,
    "total_tokens": null,
    "wall_ms": 417751
  },
  "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-medium--cli--codex-oauth--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-17T14:02:45.345059+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T14:00:43.350207+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-17T14:04:42.919217+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T14:02:48.991847+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-17T14:06:22.192903+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T14:04:46.276957+00:00"
        }
      ],
      "block_index": 1,
      "model_reaching_attempt_index": 0,
      "slot_index": 1,
      "terminal_state": "valid",
      "variant": "P-min"
    },
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-17T14:07:51.764852+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T14:06:25.841017+00:00"
        }
      ],
      "block_index": 1,
      "model_reaching_attempt_index": 0,
      "slot_index": 1,
      "terminal_state": "valid",
      "variant": "P-q"
    }
  ],
  "retry_policy": {
    "max_unreachable_retries": 5,
    "rate_limit_backoff": {
      "max_attempts": 4,
      "max_total_ms": 60000
    }
  }
}