gpt-5.2 @ xhigh · cursor

cursorxhigh
config
gpt-5.2-eff-xhigh--cli--cursor--dev
batch
2026-07-19--unified
transport
cursor-agent-cli-isolated-home
protocol
cli · plan
served model
gpt-5.2-xhigh
captured
Jul 18, 2026, 11:54 AM · N=2
variant
live
slot 0 · P-q · sandboxed iframe
gpt-5.2 @xhigh · cursor 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 neighborsNo similarity data for this session — this batch has no computed pairs.

Fidelity — does the card show the right data?

  • namematch
  • conditionmatch
  • datematch
  • max tempmatchshown: 25
  • min tempmatchshown: 16
  • hourlymismatchcoverage 0/24 · 0 match · 6 mismatch · 18 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" />
  <title>Weather</title>
  <style>
    :root{
      --bg0: #070a14;
      --bg1: #0b1020;
      --bg2: #0d1730;

      --text: rgba(255,255,255,.92);
      --muted: rgba(255,255,255,.68);
      --faint: rgba(255,255,255,.50);

      --card: rgba(255,255,255,.065);
      --panel: rgba(255,255,255,.060);
      --stroke: rgba(255,255,255,.14);
      --stroke2: rgba(255,255,255,.10);

      --accent: hsl(198 92% 60%);
      --accentSoft: hsl(198 92% 60% / 0.26);
      --accent2: hsl(265 86% 70%);
      --accent2Soft: hsl(265 86% 70% / 0.22);

      --shadow: 0 34px 60px rgba(0,0,0,.58);
      --shadow2: 0 10px 22px rgba(0,0,0,.38);

      --rCard: 26px;
      --rPanel: 20px;

      --mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
      --sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, "Apple Color Emoji","Segoe UI Emoji";
    }

    *{ box-sizing:border-box; }
    html,body{ height:100%; }
    body{
      margin:0;
      font-family: var(--sans);
      color: var(--text);
      background:
        radial-gradient(1100px 720px at 18% 14%, var(--accentSoft) 0%, rgba(0,0,0,0) 58%),
        radial-gradient(980px 740px at 84% 18%, var(--accent2Soft) 0%, rgba(0,0,0,0) 60%),
        radial-gradient(900px 720px at 50% 105%, rgba(255,255,255,.08) 0%, rgba(0,0,0,0) 60%),
        linear-gradient(180deg, var(--bg0) 0%, var(--bg1) 38%, var(--bg2) 100%);
      display:grid;
      place-items:center;
      overflow:hidden;
    }

    body::before{
      content:"";
      position:fixed;
      inset:-40px;
      pointer-events:none;
      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160' viewBox='0 0 160 160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='.55'/%3E%3C/svg%3E");
      opacity:.10;
      mix-blend-mode: overlay;
      filter: contrast(120%) brightness(115%);
    }

    body::after{
      content:"";
      position:fixed;
      inset:-2px;
      pointer-events:none;
      background:
        radial-gradient(1200px 800px at 50% 50%, rgba(0,0,0,0) 55%, rgba(0,0,0,.45) 100%);
      opacity:.85;
    }

    .frame{
      width:1280px;
      height:800px;
      padding:44px;
      display:grid;
      place-items:center;
      position:relative;
      z-index:1;
    }

    .card{
      width:1120px;
      height:680px;
      border-radius: var(--rCard);
      background: linear-gradient(180deg, rgba(255,255,255,.085) 0%, rgba(255,255,255,.055) 58%, rgba(255,255,255,.045) 100%);
      border: 1px solid var(--stroke);
      box-shadow: var(--shadow);
      position:relative;
      overflow:hidden;
      backdrop-filter: blur(16px);
      -webkit-backdrop-filter: blur(16px);
    }

    .card::before{
      content:"";
      position:absolute;
      inset:-2px;
      pointer-events:none;
      background:
        radial-gradient(740px 380px at 16% 6%, var(--accentSoft) 0%, rgba(0,0,0,0) 62%),
        radial-gradient(760px 420px at 86% 12%, var(--accent2Soft) 0%, rgba(0,0,0,0) 66%),
        linear-gradient(180deg, rgba(255,255,255,.10), rgba(255,255,255,0));
      opacity:1;
    }

    .inner{
      height:100%;
      display:grid;
      grid-template-rows: auto 1fr auto;
      position:relative;
      z-index:1;
    }

    .header{
      padding:28px 32px 16px;
      display:flex;
      align-items:flex-start;
      justify-content:space-between;
      gap:20px;
    }

    .place-name{
      font-weight: 720;
      letter-spacing: -0.02em;
      font-size: 34px;
      line-height: 1.05;
      text-shadow: 0 2px 20px rgba(0,0,0,.28);
      margin-bottom: 8px;
      max-width: 720px;
      white-space: nowrap;
      overflow:hidden;
      text-overflow: ellipsis;
    }

    .place-meta{
      display:flex;
      align-items:center;
      gap:10px;
      color: var(--muted);
      font-size: 14px;
      letter-spacing: 0.01em;
    }
    .dot{ opacity:.5; }

    .badge{
      display:flex;
      align-items:center;
      gap:10px;
      padding:10px 12px;
      border-radius: 999px;
      border: 1px solid var(--stroke2);
      background: rgba(255,255,255,.05);
      box-shadow: 0 10px 18px rgba(0,0,0,.22);
      color: var(--muted);
      font-size: 13px;
      letter-spacing: 0.02em;
      user-select:none;
    }
    .badge strong{
      color: var(--text);
      font-weight: 700;
    }
    .badge .chip{
      width:10px;
      height:10px;
      border-radius:999px;
      background: linear-gradient(135deg, var(--accent), var(--accent2));
      box-shadow: 0 0 0 4px rgba(255,255,255,.05);
    }

    .content{
      padding: 6px 32px 18px;
      display:grid;
      grid-template-columns: 410px 1fr;
      gap: 22px;
      align-items:stretch;
    }

    .panel{
      background: rgba(255,255,255,.055);
      border: 1px solid var(--stroke2);
      border-radius: var(--rPanel);
      box-shadow: var(--shadow2);
      position:relative;
      overflow:hidden;
    }
    .panel::before{
      content:"";
      position:absolute;
      inset:0;
      pointer-events:none;
      background:
        radial-gradient(520px 220px at 10% 0%, rgba(255,255,255,.08), rgba(0,0,0,0) 60%),
        linear-gradient(180deg, rgba(255,255,255,.04), rgba(0,0,0,0));
      opacity:.85;
    }
    .panel > *{ position:relative; z-index:1; }

    .summary{
      padding: 22px 22px 18px;
      display:flex;
      flex-direction:column;
      gap: 16px;
    }

    .icon-wrap{
      display:flex;
      align-items:center;
      justify-content:center;
      height: 180px;
      position:relative;
      margin-top: 4px;
    }
    .halo{
      position:absolute;
      width: 220px;
      height: 220px;
      border-radius: 999px;
      background:
        radial-gradient(closest-side, var(--accentSoft), rgba(0,0,0,0) 70%),
        radial-gradient(closest-side, var(--accent2Soft), rgba(0,0,0,0) 72%);
      filter: blur(2px);
      opacity: .95;
      transform: translateZ(0);
    }
    .wx-icon{
      width: 160px;
      height: 160px;
      position:relative;
      z-index:2;
      --icon-stroke: rgba(255,255,255,.92);
      --icon-fill: rgba(255,255,255,.06);
      --icon-soft: rgba(255,255,255,.16);
      filter: drop-shadow(0 18px 30px rgba(0,0,0,.34));
    }
    .wx-icon svg{ width:100%; height:100%; display:block; }

    .temps{
      display:grid;
      grid-template-columns: 1fr;
      gap: 8px;
      padding: 2px 4px 0;
    }

    .temp-max{
      display:flex;
      align-items:baseline;
      gap:10px;
      letter-spacing:-0.03em;
    }
    .temp-max .value{
      font-size: 68px;
      font-weight: 780;
      line-height: 0.95;
    }
    .unit{
      font-size: 20px;
      color: var(--muted);
      font-weight: 650;
    }

    .temp-min{
      display:flex;
      align-items:baseline;
      gap:10px;
      color: var(--muted);
      font-size: 16px;
      letter-spacing: 0.01em;
    }
    .temp-min .label{
      color: var(--faint);
      text-transform: uppercase;
      letter-spacing: 0.12em;
      font-size: 12px;
      font-weight: 700;
      margin-right: 2px;
    }
    .temp-min .value{
      font-size: 22px;
      color: var(--text);
      font-weight: 720;
      letter-spacing: -0.01em;
    }
    .condition{
      margin-top: 6px;
      font-size: 16px;
      color: var(--muted);
      line-height: 1.35;
    }

    .fineprint{
      margin-top:auto;
      padding-top: 10px;
      border-top: 1px solid rgba(255,255,255,.08);
      display:flex;
      justify-content:space-between;
      gap:14px;
      color: var(--faint);
      font-size: 12px;
      letter-spacing: 0.02em;
      font-family: var(--mono);
    }

    .hourly{
      padding: 18px 18px 16px;
      display:flex;
      flex-direction:column;
      gap: 12px;
    }

    .hourly-head{
      display:flex;
      align-items:baseline;
      justify-content:space-between;
      gap:12px;
      padding: 2px 4px 0;
    }
    .hourly-title{
      font-size: 14px;
      font-weight: 760;
      letter-spacing: 0.08em;
      text-transform: uppercase;
      color: rgba(255,255,255,.78);
    }
    .hourly-sub{
      font-family: var(--mono);
      font-size: 12px;
      color: var(--faint);
      letter-spacing: 0.02em;
      white-space: nowrap;
    }

    .chart-wrap{
      border-radius: 16px;
      overflow:hidden;
    }
    .chart{
      width:100%;
      height: 230px;
      display:block;
    }

    .hourly-grid{
      margin-top: 2px;
      display:grid;
      grid-template-columns: repeat(8, minmax(0, 1fr));
      gap: 10px;
      flex:1;
      align-content:start;
    }
    .hour{
      position:relative;
      border-radius: 14px;
      border: 1px solid rgba(255,255,255,.10);
      background: rgba(255,255,255,.045);
      padding: 10px 10px 9px;
      min-height: 62px;
      overflow:hidden;
      transform: translateZ(0);
    }
    .hour::before{
      content:"";
      position:absolute;
      inset:0;
      pointer-events:none;
      background:
        linear-gradient(180deg, rgba(255,255,255,.12), rgba(0,0,0,0) 70%),
        radial-gradient(140px 80px at 20% 10%, rgba(255,255,255,.08), rgba(0,0,0,0) 70%);
      opacity: calc(0.08 + (var(--p, 0.5) * 0.24));
    }
    .hour::after{
      content:"";
      position:absolute;
      inset:-1px;
      pointer-events:none;
      background: radial-gradient(120px 80px at 40% 0%, var(--accentSoft), rgba(0,0,0,0) 70%);
      opacity: calc(0.05 + (var(--p, 0.5) * 0.10));
      mix-blend-mode: screen;
    }
    .hour:hover{
      border-color: rgba(255,255,255,.18);
      background: rgba(255,255,255,.055);
    }
    .hour .h{
      font-family: var(--mono);
      font-size: 12px;
      color: var(--faint);
      letter-spacing: 0.02em;
      margin-bottom: 7px;
      position:relative;
      z-index:1;
    }
    .hour .v{
      display:flex;
      align-items:baseline;
      gap:6px;
      font-size: 18px;
      font-weight: 760;
      letter-spacing: -0.02em;
      position:relative;
      z-index:1;
    }
    .hour .v .u{
      font-size: 11px;
      font-weight: 700;
      color: var(--muted);
      letter-spacing: 0.06em;
    }
    .hour.is-max{
      border-color: color-mix(in srgb, var(--accent) 60%, rgba(255,255,255,.12));
      box-shadow: 0 0 0 1px rgba(255,255,255,.05) inset, 0 16px 26px rgba(0,0,0,.32);
    }
    .hour.is-min{
      border-color: color-mix(in srgb, var(--accent2) 55%, rgba(255,255,255,.12));
      box-shadow: 0 0 0 1px rgba(255,255,255,.05) inset, 0 16px 26px rgba(0,0,0,.32);
    }

    .footer{
      padding: 12px 32px 20px;
      display:flex;
      justify-content:space-between;
      align-items:center;
      gap: 18px;
      border-top: 1px solid rgba(255,255,255,.08);
      background: linear-gradient(180deg, rgba(0,0,0,0), rgba(0,0,0,.10));
    }
    .status{
      color: var(--muted);
      font-size: 13px;
      letter-spacing: 0.01em;
      white-space: nowrap;
      overflow:hidden;
      text-overflow: ellipsis;
      max-width: 70%;
    }
    .foot-right{
      color: var(--faint);
      font-family: var(--mono);
      font-size: 12px;
      letter-spacing: 0.02em;
      text-align:right;
      white-space: nowrap;
    }

    .error{
      grid-column: 1 / -1;
      padding: 22px;
      display:flex;
      flex-direction:column;
      gap: 10px;
      justify-content:center;
      min-height: 420px;
    }
    .error-title{
      font-size: 20px;
      font-weight: 760;
      letter-spacing: -0.01em;
    }
    .error-detail{
      font-family: var(--mono);
      color: var(--muted);
      font-size: 12.5px;
      line-height: 1.55;
      white-space: pre-wrap;
      word-break: break-word;
      opacity: .98;
    }
    .error-hint{
      color: var(--faint);
      font-size: 13px;
      line-height: 1.4;
    }

    .skel{
      border-radius: 999px;
    }
    .is-loading .skel{
      color: transparent !important;
      background:
        linear-gradient(90deg, rgba(255,255,255,.09), rgba(255,255,255,.18), rgba(255,255,255,.09));
      background-size: 200% 100%;
      animation: shimmer 1.18s linear infinite;
      text-shadow:none !important;
    }
    .is-loading .condition{ color: transparent; }
    .is-loading #tMax, .is-loading #tMin{ color: transparent; }
    .is-loading .hourly-grid{ opacity:.85; filter:saturate(.9); }

    @keyframes shimmer{
      0%{ background-position: 200% 0; }
      100%{ background-position: -200% 0; }
    }

    @media (prefers-reduced-motion: reduce){
      .is-loading .skel{ animation:none; }
      *{ scroll-behavior:auto !important; }
    }

    noscript{
      position:fixed;
      inset: 16px;
      z-index: 2;
      pointer-events:none;
      display:flex;
      justify-content:center;
      align-items:flex-start;
    }
    .noscript{
      pointer-events:auto;
      max-width: 880px;
      padding: 14px 16px;
      border-radius: 14px;
      background: rgba(0,0,0,.55);
      border: 1px solid rgba(255,255,255,.16);
      color: rgba(255,255,255,.90);
      font-family: var(--sans);
      box-shadow: 0 18px 40px rgba(0,0,0,.55);
    }
    .noscript strong{ font-weight: 780; }

    /* Fallback if color-mix unsupported */
    @supports not (color-mix(in srgb, white, black)){
      .hour.is-max{ border-color: rgba(125,211,252,.55); }
      .hour.is-min{ border-color: rgba(167,139,250,.55); }
    }
  </style>
</head>
<body>
  <div class="frame">
    <main class="card is-loading" id="card" role="region" aria-label="Weather card">
      <div class="inner">
        <header class="header">
          <div>
            <div class="place-name skel" id="placeName">Berlin</div>
            <div class="place-meta">
              <span id="dateLabel" class="skel">—</span>
              <span class="dot">·</span>
              <span id="coordsLabel" class="skel">—</span>
            </div>
          </div>

          <div class="badge" id="badge" aria-label="Data source">
            <span class="chip" aria-hidden="true"></span>
            <span><strong id="sourceBadge">—</strong> · <span id="tzBadge">UTC</span></span>
          </div>
        </header>

        <section class="content">
          <div class="panel summary" id="summaryPanel">
            <div class="icon-wrap">
              <div class="halo" aria-hidden="true"></div>
              <div class="wx-icon" id="iconSlot" aria-hidden="true"></div>
            </div>

            <div class="temps">
              <div class="temp-max">
                <span class="value skel" id="tMax">—</span>
                <span class="unit">°C</span>
              </div>

              <div class="temp-min">
                <span class="label">Low</span>
                <span class="value skel" id="tMin">—</span>
                <span class="unit">°C</span>
              </div>

              <div class="condition" id="condition">Loading…</div>
            </div>

            <div class="fineprint">
              <span id="fineLeft" class="skel">—</span>
              <span id="fineRight" class="skel">—</span>
            </div>
          </div>

          <div class="panel hourly" id="hourlyPanel">
            <div class="hourly-head">
              <div class="hourly-title">Hourly temperature</div>
              <div class="hourly-sub" id="hourlySub" class="skel">—</div>
            </div>

            <div class="chart-wrap">
              <svg id="chart" class="chart" viewBox="0 0 720 230" preserveAspectRatio="none" role="img" aria-label="Hourly temperature chart">
                <defs>
                  <linearGradient id="gArea" x1="0" x2="0" y1="0" y2="1">
                    <stop offset="0%" stop-color="var(--accent)" stop-opacity="0.38"></stop>
                    <stop offset="100%" stop-color="var(--accent)" stop-opacity="0"></stop>
                  </linearGradient>
                  <linearGradient id="gLine" x1="0" x2="1" y1="0" y2="0">
                    <stop offset="0%" stop-color="var(--accent)"></stop>
                    <stop offset="100%" stop-color="var(--accent2)"></stop>
                  </linearGradient>
                  <filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
                    <feGaussianBlur stdDeviation="4" result="b"></feGaussianBlur>
                    <feColorMatrix type="matrix" values="
                      1 0 0 0 0
                      0 1 0 0 0
                      0 0 1 0 0
                      0 0 0 0.55 0" result="c"></feColorMatrix>
                    <feMerge>
                      <feMergeNode in="c"></feMergeNode>
                      <feMergeNode in="SourceGraphic"></feMergeNode>
                    </feMerge>
                  </filter>
                </defs>

                <rect x="0.5" y="0.5" width="719" height="229" rx="16" ry="16" fill="rgba(255,255,255,0.05)" stroke="rgba(255,255,255,0.10)"></rect>

                <g id="chartGrid"></g>
                <path id="chartArea" fill="url(#gArea)" d=""></path>
                <path id="chartLine" fill="none" stroke="url(#gLine)" stroke-width="3.1" stroke-linecap="round" stroke-linejoin="round" filter="url(#glow)" d=""></path>
                <g id="chartDots"></g>
                <g id="chartXLabels"></g>
                <g id="chartYLabels"></g>
              </svg>
            </div>

            <div class="hourly-grid" id="hourlyGrid" aria-label="Hourly temperatures"></div>
          </div>

          <div class="panel error" id="errorBox" hidden>
            <div class="error-title">Weather data couldn’t be loaded.</div>
            <div class="error-detail" id="errorDetail">—</div>
            <div class="error-hint">Make sure `lat`, `lon`, and `date` (YYYY-MM-DD) are valid, then refresh.</div>
          </div>
        </section>

        <footer class="footer">
          <div class="status" id="status">Loading weather data…</div>
          <div class="foot-right">Units: °C · Timezone: UTC</div>
        </footer>
      </div>
    </main>
  </div>

  <noscript>
    <div class="noscript"><strong>Weather data couldn’t be loaded.</strong> JavaScript is required to fetch and render the weather card.</div>
  </noscript>

  <script>
    (() => {
      const $ = (id) => document.getElementById(id);

      const card = $("card");
      const placeNameEl = $("placeName");
      const dateLabelEl = $("dateLabel");
      const coordsLabelEl = $("coordsLabel");
      const sourceBadgeEl = $("sourceBadge");
      const tzBadgeEl = $("tzBadge");

      const tMaxEl = $("tMax");
      const tMinEl = $("tMin");
      const conditionEl = $("condition");
      const iconSlotEl = $("iconSlot");

      const fineLeftEl = $("fineLeft");
      const fineRightEl = $("fineRight");

      const hourlySubEl = $("hourlySub");
      const hourlyGridEl = $("hourlyGrid");
      const chartEl = $("chart");

      const summaryPanel = $("summaryPanel");
      const hourlyPanel = $("hourlyPanel");
      const errorBox = $("errorBox");
      const errorDetailEl = $("errorDetail");
      const statusEl = $("status");

      const chartGridG = chartEl.querySelector("#chartGrid");
      const chartArea = chartEl.querySelector("#chartArea");
      const chartLine = chartEl.querySelector("#chartLine");
      const chartDotsG = chartEl.querySelector("#chartDots");
      const chartXLabelsG = chartEl.querySelector("#chartXLabels");
      const chartYLabelsG = chartEl.querySelector("#chartYLabels");

      function clamp(n, lo, hi) { return Math.min(hi, Math.max(lo, n)); }
      function parseNumber(raw, def) {
        const n = Number(raw);
        return Number.isFinite(n) ? n : def;
      }
      function pad2(n){ return String(n).padStart(2, "0"); }

      function utcDateFromIso(iso){
        const parts = iso.split("-").map(Number);
        if (parts.length !== 3) return new Date(Date.now());
        const [y,m,d] = parts;
        return new Date(Date.UTC(y, (m||1) - 1, d||1));
      }

      function formatDateLabel(iso){
        const d = utcDateFromIso(iso);
        const pretty = new Intl.DateTimeFormat(undefined, {
          weekday: "long", year: "numeric", month: "short", day: "2-digit", timeZone: "UTC"
        }).format(d);
        return `${pretty} · ${iso}`;
      }

      function wmoInfo(code){
        const c = Number(code);
        if (c === 0) return { label: "Clear sky", icon: "sun" };
        if (c === 1) return { label: "Mostly clear", icon: "sun-cloud" };
        if (c === 2) return { label: "Partly cloudy", icon: "sun-cloud" };
        if (c === 3) return { label: "Overcast", icon: "cloud" };
        if (c === 45 || c === 48) return { label: "Fog", icon: "fog" };
        if (c >= 51 && c <= 57) return { label: (c >= 56 ? "Freezing drizzle" : "Drizzle"), icon: "drizzle" };
        if (c >= 61 && c <= 67) return { label: (c >= 66 ? "Freezing rain" : "Rain"), icon: "rain" };
        if (c >= 71 && c <= 77) return { label: "Snow", icon: "snow" };
        if (c >= 80 && c <= 82) return { label: "Rain showers", icon: "showers" };
        if (c === 85 || c === 86) return { label: "Snow showers", icon: "snow" };
        if (c === 95) return { label: "Thunderstorm", icon: "storm" };
        if (c === 96 || c === 99) return { label: "Thunderstorm with hail", icon: "storm" };
        if (Number.isFinite(c)) return { label: `Weather code ${c}`, icon: "unknown" };
        return { label: "Unknown conditions", icon: "unknown" };
      }

      function iconSvg(kind){
        const svgOpen = `<svg viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg" fill="none">`;
        const svgClose = `</svg>`;
        const cloudPath = `M20.8 44.8H46.2c5.4 0 9.8-4.1 9.8-9.2 0-4.7-3.7-8.6-8.5-9.1-1.3-7-7.4-12.3-14.9-12.3-6 0-11.2 3.3-13.7 8.1-5.2.6-9.2 4.8-9.2 10 0 6 4.9 10.9 11.1 10.9Z`;

        if (kind === "sun"){
          return `${svgOpen}
            <defs>
              <radialGradient id="sunG" cx="50%" cy="45%" r="65%">
                <stop offset="0%" stop-color="var(--accent)" stop-opacity="1"/>
                <stop offset="100%" stop-color="var(--accent2)" stop-opacity="1"/>
              </radialGradient>
            </defs>
            <circle cx="32" cy="32" r="11.8" fill="url(#sunG)" opacity="0.96"/>
            <g stroke="var(--icon-stroke)" stroke-width="3" stroke-linecap="round">
              <line x1="32" y1="6.5" x2="32" y2="14"/>
              <line x1="32" y1="50" x2="32" y2="57.5"/>
              <line x1="6.5" y1="32" x2="14" y2="32"/>
              <line x1="50" y1="32" x2="57.5" y2="32"/>
              <line x1="13.2" y1="13.2" x2="18.6" y2="18.6"/>
              <line x1="45.4" y1="45.4" x2="50.8" y2="50.8"/>
              <line x1="45.4" y1="18.6" x2="50.8" y2="13.2"/>
              <line x1="13.2" y1="50.8" x2="18.6" y2="45.4"/>
            </g>
          ${svgClose}`;
        }

        if (kind === "sun-cloud"){
          return `${svgOpen}
            <defs>
              <radialGradient id="scG" cx="40%" cy="38%" r="70%">
                <stop offset="0%" stop-color="var(--accent)" stop-opacity="1"/>
                <stop offset="100%" stop-color="var(--accent2)" stop-opacity="1"/>
              </radialGradient>
            </defs>
            <circle cx="24" cy="24" r="9.2" fill="url(#scG)" opacity="0.95"/>
            <g stroke="var(--icon-stroke)" stroke-width="2.6" stroke-linecap="round" opacity="0.95">
              <line x1="24" y1="7" x2="24" y2="11.7"/>
              <line x1="24" y1="36.3" x2="24" y2="41"/>
              <line x1="7" y1="24" x2="11.7" y2="24"/>
              <line x1="36.3" y1="24" x2="41" y2="24"/>
              <line x1="12.2" y1="12.2" x2="15.5" y2="15.5"/>
              <line x1="32.5" y1="32.5" x2="35.8" y2="35.8"/>
            </g>
            <path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.8" stroke-linejoin="round" opacity="0.98"/>
          ${svgClose}`;
        }

        if (kind === "cloud"){
          return `${svgOpen}
            <path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="3.0" stroke-linejoin="round" opacity="0.98"/>
            <path d="M16 47.5c6.2 3.1 12.4 3.1 18.6 0" stroke="var(--icon-soft)" stroke-width="2.4" stroke-linecap="round" opacity="0.9"/>
          ${svgClose}`;
        }

        if (kind === "fog"){
          return `${svgOpen}
            <path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.9" stroke-linejoin="round" opacity="0.98"/>
            <g stroke="var(--icon-soft)" stroke-width="3" stroke-linecap="round" opacity="0.92">
              <line x1="14" y1="50" x2="50" y2="50"/>
              <line x1="10" y1="56" x2="44" y2="56"/>
            </g>
          ${svgClose}`;
        }

        if (kind === "drizzle"){
          return `${svgOpen}
            <path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.9" stroke-linejoin="round" opacity="0.98"/>
            <g stroke="var(--accent)" stroke-width="2.8" stroke-linecap="round" opacity="0.95">
              <line x1="24" y1="49" x2="21" y2="54"/>
              <line x1="34" y1="49" x2="31" y2="54"/>
              <line x1="44" y1="49" x2="41" y2="54"/>
            </g>
          ${svgClose}`;
        }

        if (kind === "rain"){
          return `${svgOpen}
            <path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.9" stroke-linejoin="round" opacity="0.98"/>
            <g stroke="var(--accent)" stroke-width="3" stroke-linecap="round" opacity="0.95">
              <line x1="22" y1="48" x2="18" y2="56"/>
              <line x1="32" y1="48" x2="28" y2="58"/>
              <line x1="42" y1="48" x2="38" y2="56"/>
            </g>
          ${svgClose}`;
        }

        if (kind === "showers"){
          return `${svgOpen}
            <path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.9" stroke-linejoin="round" opacity="0.98"/>
            <g fill="none" stroke="var(--accent)" stroke-width="3.2" stroke-linecap="round" opacity="0.95">
              <path d="M22 48c-2.3 4.2-2.3 4.2-4.8 8.6"/>
              <path d="M32 48c-2.6 4.9-2.6 4.9-5.4 10.2"/>
              <path d="M42 48c-2.3 4.2-2.3 4.2-4.8 8.6"/>
            </g>
          ${svgClose}`;
        }

        if (kind === "snow"){
          return `${svgOpen}
            <path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.9" stroke-linejoin="round" opacity="0.98"/>
            <g stroke="var(--accent2)" stroke-width="2.4" stroke-linecap="round" opacity="0.98">
              <path d="M24 49l0 10M20 52l8 4M28 52l-8 4"/>
              <path d="M40 49l0 10M36 52l8 4M44 52l-8 4"/>
            </g>
          ${svgClose}`;
        }

        if (kind === "storm"){
          return `${svgOpen}
            <path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.9" stroke-linejoin="round" opacity="0.98"/>
            <path d="M31 48l-5 8h6l-3 8 10-14h-6l3-6Z" fill="url(#boltG)" opacity="0.96"/>
            <defs>
              <linearGradient id="boltG" x1="26" y1="48" x2="42" y2="64" gradientUnits="userSpaceOnUse">
                <stop offset="0%" stop-color="var(--accent)"/>
                <stop offset="100%" stop-color="var(--accent2)"/>
              </linearGradient>
            </defs>
          ${svgClose}`;
        }

        return `${svgOpen}
          <circle cx="32" cy="32" r="18" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.8" opacity="0.95"/>
          <path d="M26 26c2-3 10-3 12 1 2 4-3 6-6 8-2 2-2 3-2 5" stroke="var(--accent)" stroke-width="3.2" stroke-linecap="round" opacity="0.95"/>
          <circle cx="32" cy="46" r="2.2" fill="var(--accent2)" opacity="0.95"/>
        ${svgClose}`;
      }

      function applyThemeFromTemp(avgC){
        const t = clamp((avgC + 10) / 45, 0, 1); // -10..35 -> 0..1
        const hue = 210 - (t * 180); // blue -> orange
        const sat = 92;
        const light = 60;
        const hue2 = (hue + 42) % 360;

        const accent = `hsl(${hue} ${sat}% ${light}%)`;
        const accentSoft = `hsl(${hue} ${sat}% ${light}% / 0.26)`;
        const accent2 = `hsl(${hue2} ${Math.max(72, sat - 10)}% ${Math.max(58, light + 8)}%)`;
        const accent2Soft = `hsl(${hue2} ${Math.max(72, sat - 10)}% ${Math.max(58, light + 8)}% / 0.22)`;

        const root = document.documentElement.style;
        root.setProperty("--accent", accent);
        root.setProperty("--accentSoft", accentSoft);
        root.setProperty("--accent2", accent2);
        root.setProperty("--accent2Soft", accent2Soft);
      }

      function safeText(v){
        return (v === null || v === undefined) ? "" : String(v);
      }

      function showError(msg, detail){
        summaryPanel.hidden = true;
        hourlyPanel.hidden = true;
        errorBox.hidden = false;
        card.classList.remove("is-loading");

        statusEl.textContent = "Weather data couldn’t be loaded.";
        conditionEl.textContent = "—";
        tMaxEl.textContent = "—";
        tMinEl.textContent = "—";
        iconSlotEl.innerHTML = iconSvg("unknown");

        const d = detail ? `${msg}\n\n${detail}` : msg;
        errorDetailEl.textContent = safeText(d);
      }

      function createSvgEl(tag){
        return document.createElementNS("http://www.w3.org/2000/svg", tag);
      }

      function catmullRomPath(pts){
        if (pts.length < 2) return "";
        let d = `M ${pts[0].x.toFixed(2)} ${pts[0].y.toFixed(2)}`;
        for (let i = 0; i < pts.length - 1; i++){
          const p0 = pts[i - 1] || pts[i];
          const p1 = pts[i];
          const p2 = pts[i + 1];
          const p3 = pts[i + 2] || p2;

          const cp1x = p1.x + (p2.x - p0.x) / 6;
          const cp1y = p1.y + (p2.y - p0.y) / 6;
          const cp2x = p2.x - (p3.x - p1.x) / 6;
          const cp2y = p2.y - (p3.y - p1.y) / 6;

          d += ` C ${cp1x.toFixed(2)} ${cp1y.toFixed(2)}, ${cp2x.toFixed(2)} ${cp2y.toFixed(2)}, ${p2.x.toFixed(2)} ${p2.y.toFixed(2)}`;
        }
        return d;
      }

      function renderChart(points){
        const W = 720, H = 230;
        const padL = 44, padR = 18, padT = 18, padB = 32;

        const temps = points.map(p => p.t);
        let minT = Math.min(...temps);
        let maxT = Math.max(...temps);

        if (!Number.isFinite(minT) || !Number.isFinite(maxT)){
          chartArea.setAttribute("d", "");
          chartLine.setAttribute("d", "");
          return;
        }

        if ((maxT - minT) < 4){
          const mid = (maxT + minT) / 2;
          minT = mid - 2;
          maxT = mid + 2;
        }

        const minTick = Math.floor(minT);
        const maxTick = Math.ceil(maxT);
        const span = Math.max(1, maxTick - minTick);

        function xForIndex(i, n){
          if (n <= 1) return padL;
          return padL + (i / (n - 1)) * (W - padL - padR);
        }
        function yForTemp(t){
          const f = (t - minTick) / span;
          return padT + (1 - f) * (H - padT - padB);
        }

        const pts = points.map((p, i) => ({ x: xForIndex(i, points.length), y: yForTemp(p.t), h: p.h, t: p.t }));
        const curve = catmullRomPath(pts);
        const bottomY = H - padB;

        chartArea.setAttribute("d", `${curve} L ${pts[pts.length - 1].x.toFixed(2)} ${bottomY.toFixed(2)} L ${pts[0].x.toFixed(2)} ${bottomY.toFixed(2)} Z`);
        chartLine.setAttribute("d", curve);

        // grid + labels
        chartGridG.innerHTML = "";
        chartXLabelsG.innerHTML = "";
        chartYLabelsG.innerHTML = "";
        chartDotsG.innerHTML = "";

        const ticks = 5;
        for (let i = 0; i < ticks; i++){
          const f = i / (ticks - 1);
          const y = padT + f * (H - padT - padB);
          const val = Math.round(maxTick - f * (maxTick - minTick));

          const line = createSvgEl("line");
          line.setAttribute("x1", padL);
          line.setAttribute("x2", W - padR);
          line.setAttribute("y1", y);
          line.setAttribute("y2", y);
          line.setAttribute("stroke", "rgba(255,255,255,0.08)");
          line.setAttribute("stroke-width", "1");
          chartGridG.appendChild(line);

          const txt = createSvgEl("text");
          txt.setAttribute("x", padL - 10);
          txt.setAttribute("y", y + 4);
          txt.setAttribute("text-anchor", "end");
          txt.setAttribute("fill", "rgba(255,255,255,0.48)");
          txt.setAttribute("font-size", "11.5");
          txt.setAttribute("font-family", "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace");
          txt.textContent = `${val}°`;
          chartYLabelsG.appendChild(txt);
        }

        // x labels at 00, 06, 12, 18, 23 (if present)
        const markHours = [0, 6, 12, 18, 23];
        for (const mh of markHours){
          const idx = pts.findIndex(p => p.h === mh);
          if (idx < 0) continue;
          const p = pts[idx];

          const vline = createSvgEl("line");
          vline.setAttribute("x1", p.x);
          vline.setAttribute("x2", p.x);
          vline.setAttribute("y1", padT);
          vline.setAttribute("y2", H - padB);
          vline.setAttribute("stroke", "rgba(255,255,255,0.06)");
          vline.setAttribute("stroke-width", "1");
          chartGridG.appendChild(vline);

          const txt = createSvgEl("text");
          txt.setAttribute("x", p.x);
          txt.setAttribute("y", H - 10);
          txt.setAttribute("text-anchor", "middle");
          txt.setAttribute("fill", "rgba(255,255,255,0.50)");
          txt.setAttribute("font-size", "11.5");
          txt.setAttribute("font-family", "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace");
          txt.textContent = `${pad2(mh)}`;
          chartXLabelsG.appendChild(txt);
        }

        // highlight min/max
        let minIdx = 0, maxIdx = 0;
        for (let i = 1; i < pts.length; i++){
          if (pts[i].t < pts[minIdx].t) minIdx = i;
          if (pts[i].t > pts[maxIdx].t) maxIdx = i;
        }

        function addDot(i, label, color){
          const p = pts[i];

          const ring = createSvgEl("circle");
          ring.setAttribute("cx", p.x);
          ring.setAttribute("cy", p.y);
          ring.setAttribute("r", "7.2");
          ring.setAttribute("fill", "rgba(0,0,0,0)");
          ring.setAttribute("stroke", color);
          ring.setAttribute("stroke-opacity", "0.55");
          ring.setAttribute("stroke-width", "2");
          chartDotsG.appendChild(ring);

          const dot = createSvgEl("circle");
          dot.setAttribute("cx", p.x);
          dot.setAttribute("cy", p.y);
          dot.setAttribute("r", "3.2");
          dot.setAttribute("fill", color);
          dot.setAttribute("fill-opacity", "0.95");
          chartDotsG.appendChild(dot);

          const txt = createSvgEl("text");
          txt.setAttribute("x", p.x + 10);
          txt.setAttribute("y", p.y - 10);
          txt.setAttribute("text-anchor", "start");
          txt.setAttribute("fill", "rgba(255,255,255,0.86)");
          txt.setAttribute("font-size", "12.2");
          txt.setAttribute("font-weight", "700");
          txt.setAttribute("font-family", "ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial");
          txt.textContent = `${label} ${Math.round(p.t)}°`;
          chartDotsG.appendChild(txt);
        }

        addDot(maxIdx, "High", "var(--accent)");
        addDot(minIdx, "Low", "var(--accent2)");

        // animate line draw (unless reduced motion)
        const reduce = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
        if (!reduce){
          try{
            const len = chartLine.getTotalLength();
            chartLine.style.transition = "none";
            chartLine.style.strokeDasharray = String(len);
            chartLine.style.strokeDashoffset = String(len);
            chartArea.style.transition = "none";
            chartArea.style.opacity = "0";
            requestAnimationFrame(() => {
              chartLine.style.transition = "stroke-dashoffset 900ms cubic-bezier(.2,.9,.2,1)";
              chartLine.style.strokeDashoffset = "0";
              chartArea.style.transition = "opacity 900ms ease";
              chartArea.style.opacity = "1";
            });
          } catch (_) {}
        } else {
          chartLine.style.strokeDasharray = "none";
          chartLine.style.strokeDashoffset = "0";
          chartArea.style.opacity = "1";
        }
      }

      function renderHourlyGrid(points){
        hourlyGridEl.innerHTML = "";

        const temps = points.map(p => p.t);
        const min = Math.min(...temps);
        const max = Math.max(...temps);
        const span = Math.max(0.001, max - min);

        for (const p of points){
          const cell = document.createElement("div");
          cell.className = "hour";
          if (Math.abs(p.t - max) < 0.0001) cell.classList.add("is-max");
          if (Math.abs(p.t - min) < 0.0001) cell.classList.add("is-min");

          const norm = (p.t - min) / span;
          cell.style.setProperty("--p", norm.toFixed(3));

          cell.innerHTML = `
            <div class="h">${pad2(p.h)}:00</div>
            <div class="v">${Math.round(p.t)}<span class="u">°C</span></div>
          `;
          hourlyGridEl.appendChild(cell);
        }
      }

      // Read URL params + defaults
      const params = new URLSearchParams(window.location.search);
      const rawLat = params.get("lat");
      const rawLon = params.get("lon");
      const rawName = params.get("name");
      const rawDate = params.get("date");

      const lat = clamp(parseNumber(rawLat, 52.52), -90, 90);
      const lon = clamp(parseNumber(rawLon, 13.405), -180, 180);
      const name = (safeText(rawName || "Berlin")).trim() || "Berlin";

      const todayIso = new Date().toISOString().slice(0, 10); // UTC
      let dateIso = (safeText(rawDate || todayIso)).trim();
      if (!/^\d{4}-\d{2}-\d{2}$/.test(dateIso)) dateIso = todayIso;

      placeNameEl.textContent = name;
      coordsLabelEl.textContent = `${lat.toFixed(3)}, ${lon.toFixed(3)}`;
      dateLabelEl.textContent = formatDateLabel(dateIso);
      tzBadgeEl.textContent = "UTC";

      document.title = `${name} · ${dateIso} · Weather`;

      const endpoint = (dateIso < todayIso) ? "/api/om/archive" : "/api/om/forecast";
      sourceBadgeEl.textContent = endpoint.includes("archive") ? "Archive" : "Forecast";

      const url = new URL(endpoint, window.location.origin);
      url.search = 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: dateIso,
        end_date: dateIso
      }).toString();

      // placeholders
      iconSlotEl.innerHTML = iconSvg("unknown");
      fineLeftEl.textContent = "—";
      fineRightEl.textContent = "—";
      hourlySubEl.textContent = "—";

      async function load(){
        statusEl.textContent = "Loading weather data…";
        errorBox.hidden = true;
        summaryPanel.hidden = false;
        hourlyPanel.hidden = false;
        card.classList.add("is-loading");

        try{
          const res = await fetch(url.toString(), {
            method: "GET",
            headers: { "Accept": "application/json" },
            cache: "no-store"
          });

          if (!res.ok){
            const text = await res.text().catch(() => "");
            throw new Error(`HTTP ${res.status}${text ? ` — ${text.slice(0, 240)}` : ""}`);
          }

          const data = await res.json();

          if (data && data.error){
            throw new Error(safeText(data.reason || "API returned an error."));
          }

          const daily = data && data.daily;
          const hourly = data && data.hourly;

          if (!daily || !hourly) throw new Error("Response is missing `daily` or `hourly` fields.");

          const timesDaily = Array.isArray(daily.time) ? daily.time : [];
          const idx = timesDaily.indexOf(dateIso);
          const i = (idx >= 0) ? idx : 0;

          const tMax = daily.temperature_2m_max && daily.temperature_2m_max[i];
          const tMin = daily.temperature_2m_min && daily.temperature_2m_min[i];
          const wCode = daily.weather_code && daily.weather_code[i];

          if (!Number.isFinite(Number(tMax)) || !Number.isFinite(Number(tMin)) || !Number.isFinite(Number(wCode))){
            throw new Error("Daily values for max/min temperature or weather code are missing for the requested date.");
          }

          const maxC = Number(tMax);
          const minC = Number(tMin);
          const info = wmoInfo(wCode);

          tMaxEl.textContent = String(Math.round(maxC));
          tMinEl.textContent = String(Math.round(minC));
          conditionEl.textContent = info.label;
          iconSlotEl.innerHTML = iconSvg(info.icon);

          applyThemeFromTemp((maxC + minC) / 2);

          fineLeftEl.textContent = `Lat ${lat.toFixed(3)} · Lon ${lon.toFixed(3)}`;
          fineRightEl.textContent = `Code ${Number(wCode)}`;

          const ht = Array.isArray(hourly.time) ? hourly.time : [];
          const hv = Array.isArray(hourly.temperature_2m) ? hourly.temperature_2m : [];

          if (ht.length !== hv.length) throw new Error("Hourly time/value arrays have different lengths.");

          const points = [];
          for (let j = 0; j < ht.length; j++){
            const ts = ht[j];
            const temp = hv[j];
            if (typeof ts !== "string") continue;
            if (!ts.startsWith(dateIso)) continue;

            const hourStr = ts.slice(11, 13);
            const h = Number(hourStr);
            const t = Number(temp);

            if (!Number.isFinite(h) || !Number.isFinite(t)) continue;
            points.push({ h, t });
          }

          if (!points.length) throw new Error("No hourly temperatures were found for the requested date.");

          points.sort((a,b) => a.h - b.h);

          const minH = Math.min(...points.map(p => p.t));
          const maxH = Math.max(...points.map(p => p.t));
          hourlySubEl.textContent = `${Math.round(minH)}–${Math.round(maxH)}°C · ${points.length} points`;

          renderChart(points);
          renderHourlyGrid(points);

          const now = new Date();
          const hm = now.toISOString().slice(11, 16);
          statusEl.textContent = `Loaded ${sourceBadgeEl.textContent} data for ${name} on ${dateIso} (UTC). Updated at ${hm} UTC.`;
          card.classList.remove("is-loading");
        } catch (err){
          const msg = "Unable to fetch weather data from the API.";
          const detail = (err && err.message) ? err.message : String(err);
          showError(msg, `Request: ${url.pathname}\nParams: ${url.search}\n\n${detail}`);
        }
      }

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

L1 — cheap deterministic descriptors

bytes total43,523html / css / js5,030 / 13,489 / 25,004
dom nodes77dom depth13
css rules75js presentyes
brightness67.6contrast33.3
colorfulness26.0whitespace35.1%

This slot's telemetry

prompt tokens17,671completion tokens30,031
total tokens47,702wall393.2 s
costrequest id
config.json562 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "gpt-5.2-eff-xhigh--cli--cursor--dev",
  "effort": "xhigh",
  "family": "gpt",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "gpt-5.2",
  "protocol": "cli",
  "served_model": "gpt-5.2-xhigh",
  "telemetry": {
    "completion_tokens": 130059,
    "cost_usd": null,
    "prompt_tokens": 82889,
    "total_tokens": 212948,
    "wall_ms": 1688025
  },
  "transport": "cursor-agent-cli-isolated-home",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-08-13--cursor-s2",
  "config_id": "gpt-5.2-eff-xhigh--cli--cursor--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-08-12T21:49:16.474684+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-12T21:42:43.276149+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-08-12T21:54:49.684199+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-12T21:49:20.702872+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-08-12T22:01:50.360894+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-12T21:54:53.460076+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-08-12T22:11:03.333633+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-12T22:01:54.390788+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
    }
  }
}