gpt-5.4 @ high · cursor

cursorhigh
config
gpt-5.4-eff-high--cli--cursor--dev
batch
2026-07-19--unified
transport
cursor-agent-cli-isolated-home
protocol
cli · plan
served model
gpt-5.4-high
captured
Jul 18, 2026, 11:54 AM · N=2
variant
live
slot 0 · P-q · sandboxed iframe
gpt-5.4 @high · 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.3
  • min tempmatchshown: 16
  • hourlymatchcoverage 24/24 · 24 match · 0 mismatch · 0 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">
  <meta name="color-scheme" content="dark">
  <link rel="icon" href="data:,">
  <title>Weather Card</title>
  <style>
    :root {
      --bg-a: #07111f;
      --bg-b: #12365d;
      --bg-c: #070d18;
      --glow-a: rgba(86, 187, 255, 0.34);
      --glow-b: rgba(255, 183, 85, 0.2);
      --card-bg-top: rgba(8, 14, 28, 0.82);
      --card-bg-bottom: rgba(10, 18, 34, 0.64);
      --panel-bg: rgba(255, 255, 255, 0.055);
      --panel-bg-strong: rgba(255, 255, 255, 0.075);
      --stroke: rgba(255, 255, 255, 0.14);
      --stroke-strong: rgba(255, 255, 255, 0.2);
      --text: #f6f8ff;
      --muted: #a7bad9;
      --accent: #8be8ff;
      --accent-2: #ffbc66;
      --shadow: 0 30px 90px rgba(0, 0, 0, 0.32);
      --shadow-soft: 0 18px 45px rgba(0, 0, 0, 0.22);
      --warm-rgb: 255, 188, 102;
      --cool-rgb: 139, 232, 255;
      --error-rgb: 255, 123, 145;
    }

    * {
      box-sizing: border-box;
    }

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

    body {
      margin: 0;
      min-width: 1280px;
      min-height: 800px;
      display: grid;
      place-items: center;
      overflow: hidden;
      color: var(--text);
      font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      background:
        radial-gradient(circle at 18% 18%, var(--glow-a), transparent 34%),
        radial-gradient(circle at 82% 14%, var(--glow-b), transparent 30%),
        linear-gradient(155deg, var(--bg-a), var(--bg-b) 58%, var(--bg-c));
      transition: background 320ms ease;
    }

    body::before,
    body::after {
      content: "";
      position: fixed;
      inset: auto;
      border-radius: 50%;
      pointer-events: none;
      filter: blur(30px);
      opacity: 0.55;
      animation: drift 16s ease-in-out infinite;
    }

    body::before {
      width: 420px;
      height: 420px;
      left: -110px;
      bottom: -120px;
      background: radial-gradient(circle, rgba(var(--cool-rgb), 0.22), transparent 68%);
    }

    body::after {
      width: 320px;
      height: 320px;
      right: -60px;
      top: -80px;
      background: radial-gradient(circle, rgba(var(--warm-rgb), 0.18), transparent 70%);
      animation-delay: -6s;
    }

    @keyframes drift {
      0%, 100% {
        transform: translate3d(0, 0, 0) scale(1);
      }
      50% {
        transform: translate3d(0, -14px, 0) scale(1.03);
      }
    }

    body[data-theme="clear"] {
      --bg-a: #07111f;
      --bg-b: #12365d;
      --bg-c: #070d18;
      --glow-a: rgba(86, 187, 255, 0.34);
      --glow-b: rgba(255, 183, 85, 0.2);
      --accent: #8be8ff;
      --accent-2: #ffbc66;
      --warm-rgb: 255, 188, 102;
      --cool-rgb: 139, 232, 255;
    }

    body[data-theme="cloudy"] {
      --bg-a: #0d1524;
      --bg-b: #2a3f5f;
      --bg-c: #0a0f18;
      --glow-a: rgba(154, 185, 244, 0.24);
      --glow-b: rgba(199, 220, 255, 0.14);
      --accent: #b8d1ff;
      --accent-2: #91a9d8;
      --warm-rgb: 145, 169, 216;
      --cool-rgb: 184, 209, 255;
    }

    body[data-theme="rain"] {
      --bg-a: #07111a;
      --bg-b: #153a56;
      --bg-c: #08111f;
      --glow-a: rgba(96, 194, 255, 0.28);
      --glow-b: rgba(92, 121, 255, 0.16);
      --accent: #70dcff;
      --accent-2: #7ea3ff;
      --warm-rgb: 126, 163, 255;
      --cool-rgb: 112, 220, 255;
    }

    body[data-theme="snow"] {
      --bg-a: #0b1520;
      --bg-b: #21415a;
      --bg-c: #08111a;
      --glow-a: rgba(211, 243, 255, 0.28);
      --glow-b: rgba(116, 186, 255, 0.14);
      --accent: #e4f8ff;
      --accent-2: #93cfff;
      --warm-rgb: 147, 207, 255;
      --cool-rgb: 228, 248, 255;
    }

    body[data-theme="storm"] {
      --bg-a: #0d1020;
      --bg-b: #2d2458;
      --bg-c: #090d15;
      --glow-a: rgba(143, 120, 255, 0.28);
      --glow-b: rgba(96, 184, 255, 0.12);
      --accent: #b6c0ff;
      --accent-2: #8c73ff;
      --warm-rgb: 140, 115, 255;
      --cool-rgb: 182, 192, 255;
    }

    .frame {
      width: 100%;
      height: 100%;
      padding: 48px;
      display: grid;
      place-items: center;
    }

    .card {
      position: relative;
      width: min(1120px, calc(100vw - 96px));
      min-height: 690px;
      padding: 32px;
      border-radius: 34px;
      overflow: hidden;
      background: linear-gradient(180deg, var(--card-bg-top), var(--card-bg-bottom));
      border: 1px solid var(--stroke);
      box-shadow: var(--shadow);
      backdrop-filter: blur(18px);
      -webkit-backdrop-filter: blur(18px);
      display: grid;
      grid-template-rows: auto auto 1fr;
      gap: 24px;
    }

    .card::before {
      content: "";
      position: absolute;
      inset: 1px;
      border-radius: 33px;
      pointer-events: none;
      border: 1px solid rgba(255, 255, 255, 0.05);
    }

    .shine {
      position: absolute;
      right: -10%;
      top: -18%;
      width: 460px;
      height: 300px;
      background: radial-gradient(circle, rgba(var(--cool-rgb), 0.18), transparent 68%);
      filter: blur(8px);
      pointer-events: none;
    }

    .topbar,
    .hero,
    .hourly-panel {
      position: relative;
      z-index: 1;
    }

    .topbar {
      display: flex;
      justify-content: space-between;
      align-items: center;
      gap: 16px;
    }

    .badge-row {
      display: flex;
      flex-wrap: wrap;
      gap: 10px;
    }

    .badge,
    .status-pill {
      border: 1px solid rgba(255, 255, 255, 0.12);
      background: rgba(255, 255, 255, 0.06);
      color: var(--muted);
      padding: 10px 14px;
      border-radius: 999px;
      font-size: 13px;
      line-height: 1;
      letter-spacing: 0.02em;
      backdrop-filter: blur(10px);
      -webkit-backdrop-filter: blur(10px);
    }

    .status-pill {
      color: var(--text);
      border-color: rgba(var(--cool-rgb), 0.28);
      box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);
    }

    .status-pill[data-state="loading"] {
      color: rgba(255, 255, 255, 0.9);
    }

    .status-pill[data-state="ready"] {
      background: linear-gradient(180deg, rgba(var(--cool-rgb), 0.16), rgba(var(--cool-rgb), 0.09));
    }

    .status-pill[data-state="error"] {
      background: linear-gradient(180deg, rgba(var(--error-rgb), 0.2), rgba(var(--error-rgb), 0.1));
      border-color: rgba(var(--error-rgb), 0.28);
    }

    .hero {
      display: grid;
      grid-template-columns: 1.4fr 0.9fr;
      gap: 24px;
      align-items: stretch;
    }

    .hero-copy,
    .hero-panel,
    .hourly-panel {
      background: linear-gradient(180deg, var(--panel-bg-strong), var(--panel-bg));
      border: 1px solid var(--stroke);
      border-radius: 28px;
      box-shadow: var(--shadow-soft);
    }

    .hero-copy {
      padding: 28px 30px 30px;
      display: flex;
      flex-direction: column;
      justify-content: center;
    }

    .kicker {
      margin: 0 0 12px;
      font-size: 12px;
      text-transform: uppercase;
      letter-spacing: 0.22em;
      color: var(--accent);
    }

    h1 {
      margin: 0;
      font-size: clamp(52px, 6vw, 78px);
      line-height: 0.96;
      letter-spacing: -0.04em;
      font-weight: 750;
      text-wrap: balance;
    }

    .date-line {
      margin: 16px 0 0;
      color: rgba(255, 255, 255, 0.84);
      font-size: 20px;
      line-height: 1.4;
    }

    .summary-row {
      display: flex;
      align-items: center;
      gap: 18px;
      margin-top: 24px;
    }

    .condition-badge {
      flex: 0 0 92px;
      width: 92px;
      height: 92px;
      display: grid;
      place-items: center;
      border-radius: 24px;
      color: var(--accent-2);
      background:
        radial-gradient(circle at 30% 25%, rgba(255, 255, 255, 0.12), transparent 42%),
        linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.04));
      border: 1px solid rgba(255, 255, 255, 0.14);
      box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
    }

    .condition-badge svg {
      width: 48px;
      height: 48px;
      filter: drop-shadow(0 8px 18px rgba(0, 0, 0, 0.18));
    }

    .condition-label {
      font-size: 32px;
      line-height: 1.08;
      font-weight: 680;
      letter-spacing: -0.03em;
    }

    .range-line {
      display: flex;
      flex-wrap: wrap;
      gap: 12px;
      margin-top: 14px;
    }

    .temp-pill {
      min-width: 130px;
      padding: 12px 16px;
      border-radius: 18px;
      border: 1px solid rgba(255, 255, 255, 0.12);
      background: rgba(255, 255, 255, 0.06);
      box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
    }

    .temp-pill span {
      display: block;
      font-size: 13px;
      color: var(--muted);
    }

    .temp-pill strong {
      display: block;
      margin-top: 4px;
      font-size: 27px;
      line-height: 1;
      color: var(--text);
      letter-spacing: -0.03em;
    }

    .temp-pill.hot {
      background: linear-gradient(180deg, rgba(var(--warm-rgb), 0.14), rgba(255, 255, 255, 0.04));
    }

    .temp-pill.cold {
      background: linear-gradient(180deg, rgba(var(--cool-rgb), 0.13), rgba(255, 255, 255, 0.04));
    }

    .message {
      margin: 22px 0 0;
      max-width: 650px;
      color: var(--muted);
      font-size: 16px;
      line-height: 1.55;
    }

    .hero-panel {
      padding: 24px;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
      gap: 18px;
    }

    .panel-title {
      font-size: 12px;
      text-transform: uppercase;
      letter-spacing: 0.18em;
      color: var(--muted);
    }

    .split-temps {
      display: grid;
      gap: 14px;
    }

    .metric {
      padding: 18px 18px 16px;
      border-radius: 22px;
      border: 1px solid rgba(255, 255, 255, 0.12);
      background: rgba(255, 255, 255, 0.05);
      box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
    }

    .metric span {
      display: block;
      color: var(--muted);
      font-size: 13px;
      margin-bottom: 10px;
    }

    .metric strong {
      display: block;
      font-size: 44px;
      line-height: 0.95;
      letter-spacing: -0.05em;
      font-weight: 760;
    }

    .metric.hot {
      background: linear-gradient(180deg, rgba(var(--warm-rgb), 0.15), rgba(255, 255, 255, 0.05));
    }

    .metric.cold {
      background: linear-gradient(180deg, rgba(var(--cool-rgb), 0.14), rgba(255, 255, 255, 0.05));
    }

    .meta-grid {
      display: grid;
      grid-template-columns: repeat(2, minmax(0, 1fr));
      gap: 12px;
    }

    .meta-card {
      padding: 15px 16px;
      border-radius: 18px;
      background: rgba(255, 255, 255, 0.05);
      border: 1px solid rgba(255, 255, 255, 0.1);
    }

    .meta-card span {
      display: block;
      color: var(--muted);
      font-size: 12px;
      margin-bottom: 8px;
      text-transform: uppercase;
      letter-spacing: 0.12em;
    }

    .meta-card strong {
      display: block;
      font-size: 15px;
      font-weight: 650;
      line-height: 1.35;
      word-break: break-word;
    }

    .hourly-panel {
      padding: 22px 24px 26px;
      display: flex;
      flex-direction: column;
    }

    .section-head {
      display: flex;
      justify-content: space-between;
      align-items: flex-end;
      gap: 16px;
      margin-bottom: 18px;
    }

    .section-head h2 {
      margin: 0;
      font-size: 24px;
      line-height: 1.1;
      letter-spacing: -0.03em;
    }

    .section-head p {
      margin: 6px 0 0;
      color: var(--muted);
      font-size: 14px;
    }

    .legend {
      display: flex;
      gap: 16px;
      color: var(--muted);
      font-size: 13px;
      white-space: nowrap;
    }

    .legend span {
      display: inline-flex;
      align-items: center;
      gap: 8px;
    }

    .legend-dot {
      width: 10px;
      height: 10px;
      display: inline-block;
      border-radius: 999px;
      box-shadow: 0 0 0 4px rgba(255, 255, 255, 0.03);
    }

    .legend-dot.warm {
      background: rgb(var(--warm-rgb));
    }

    .legend-dot.cool {
      background: rgb(var(--cool-rgb));
    }

    .hourly-grid {
      display: grid;
      gap: 10px;
      align-items: end;
      min-height: 300px;
      flex: 1 1 auto;
    }

    .hour-item {
      height: 100%;
      padding: 14px 8px 12px;
      border-radius: 20px;
      background: linear-gradient(180deg, rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0.035));
      border: 1px solid rgba(255, 255, 255, 0.1);
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: flex-end;
      gap: 10px;
      transition: transform 180ms ease, border-color 180ms ease, background 180ms ease;
    }

    .hour-item:hover {
      transform: translateY(-4px);
      border-color: rgba(255, 255, 255, 0.18);
    }

    .hour-item.peak {
      border-color: rgba(var(--warm-rgb), 0.32);
      background: linear-gradient(180deg, rgba(var(--warm-rgb), 0.12), rgba(255, 255, 255, 0.035));
    }

    .hour-item.trough {
      border-color: rgba(var(--cool-rgb), 0.3);
      background: linear-gradient(180deg, rgba(var(--cool-rgb), 0.12), rgba(255, 255, 255, 0.035));
    }

    .hour-label {
      font-size: 12px;
      color: var(--muted);
      letter-spacing: 0.03em;
    }

    .bar-shell {
      width: 18px;
      height: 176px;
      padding: 2px;
      border-radius: 999px;
      background: linear-gradient(180deg, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.04));
      box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
      display: flex;
      align-items: flex-end;
    }

    .bar {
      width: 100%;
      height: var(--fill, 0px);
      border-radius: 999px;
      background:
        linear-gradient(
          180deg,
          hsl(var(--hue, 200), 100%, 77%),
          hsl(calc(var(--hue, 200) - 18), 90%, 57%)
        );
      box-shadow:
        0 10px 24px rgba(0, 0, 0, 0.22),
        0 0 18px rgba(var(--cool-rgb), 0.12);
    }

    .hour-temp {
      font-size: 14px;
      font-weight: 650;
      letter-spacing: -0.01em;
      color: var(--text);
    }

    .placeholder {
      min-height: 250px;
      border-radius: 24px;
      border: 1px dashed rgba(255, 255, 255, 0.14);
      display: grid;
      place-items: center;
      color: var(--muted);
      font-size: 18px;
      background: rgba(255, 255, 255, 0.035);
      text-align: center;
      padding: 24px;
    }

    @media (max-width: 1120px) {
      body {
        min-width: 0;
      }

      .frame {
        padding: 24px;
      }

      .card {
        width: calc(100vw - 48px);
      }

      .hero {
        grid-template-columns: 1fr;
      }

      .section-head {
        flex-direction: column;
        align-items: flex-start;
      }
    }
  </style>
</head>
<body data-theme="clear">
  <div class="frame">
    <main class="card" aria-live="polite">
      <div class="shine"></div>

      <header class="topbar">
        <div class="badge-row">
          <span class="badge">UTC data</span>
          <span class="badge" id="coordsBadge">52.52, 13.405</span>
        </div>
        <span class="status-pill" id="statusPill" data-state="loading">Loading weather</span>
      </header>

      <section class="hero">
        <div class="hero-copy">
          <p class="kicker">Weather Snapshot</p>
          <h1 id="locationName">Berlin</h1>
          <p class="date-line" id="dateLine">Loading date</p>

          <div class="summary-row">
            <div class="condition-badge" id="conditionIcon" aria-hidden="true"></div>
            <div>
              <div class="condition-label" id="conditionLabel">Fetching conditions</div>
              <div class="range-line">
                <div class="temp-pill hot">
                  <span>High</span>
                  <strong id="maxTemp">--</strong>
                </div>
                <div class="temp-pill cold">
                  <span>Low</span>
                  <strong id="minTemp">--</strong>
                </div>
              </div>
            </div>
          </div>

          <p class="message" id="message">Fetching the selected day's daily summary and hourly temperatures.</p>
        </div>

        <aside class="hero-panel">
          <div class="panel-title">Daily Range</div>

          <div class="split-temps">
            <div class="metric hot">
              <span>Maximum</span>
              <strong id="maxTempBig">--</strong>
            </div>
            <div class="metric cold">
              <span>Minimum</span>
              <strong id="minTempBig">--</strong>
            </div>
          </div>

          <div class="meta-grid">
            <div class="meta-card">
              <span>Source</span>
              <strong id="sourceLabel">Awaiting data</strong>
            </div>
            <div class="meta-card">
              <span>Units</span>
              <strong>Celsius</strong>
            </div>
          </div>
        </aside>
      </section>

      <section class="hourly-panel">
        <div class="section-head">
          <div>
            <h2>Hourly Temperatures</h2>
            <p>Selected date in UTC</p>
          </div>
          <div class="legend">
            <span><i class="legend-dot warm"></i> Warmer</span>
            <span><i class="legend-dot cool"></i> Cooler</span>
          </div>
        </div>

        <div class="hourly-grid" id="hourlyGrid">
          <div class="placeholder">Waiting for weather data.</div>
        </div>
      </section>
    </main>
  </div>

  <script>
    (function () {
      const defaults = {
        lat: 52.52,
        lon: 13.405,
        name: "Berlin"
      };

      const icons = {
        clear: '<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="24" cy="24" r="8"></circle><path d="M24 6v5"></path><path d="M24 37v5"></path><path d="M6 24h5"></path><path d="M37 24h5"></path><path d="M11.3 11.3l3.6 3.6"></path><path d="M33.1 33.1l3.6 3.6"></path><path d="M36.7 11.3l-3.6 3.6"></path><path d="M14.9 33.1l-3.6 3.6"></path></svg>',
        cloudy: '<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M17 33.5h17.5a7 7 0 0 0 .3-14 10.5 10.5 0 0 0-20.2-2.1A7.4 7.4 0 0 0 17 33.5Z"></path><path d="M16 17a8 8 0 0 1 8-8"></path></svg>',
        rain: '<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M16 29h18a7 7 0 0 0 .3-14 10.5 10.5 0 0 0-20.4-1.5A7.2 7.2 0 0 0 16 29Z"></path><path d="M19 33l-2.5 5"></path><path d="M27 33l-2.5 5"></path><path d="M35 33l-2.5 5"></path></svg>',
        snow: '<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M16 27h18a7 7 0 0 0 .3-14 10.5 10.5 0 0 0-20.4-1.5A7.2 7.2 0 0 0 16 27Z"></path><path d="M18 35h.01"></path><path d="M24 32v6"></path><path d="M21 34.5l6 1"></path><path d="M27 34.5l-6 1"></path><path d="M32 35h.01"></path></svg>',
        storm: '<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15.5 28h18.2a7 7 0 0 0 .2-14 10.5 10.5 0 0 0-20.4-1.5A7.2 7.2 0 0 0 15.5 28Z"></path><path d="M24 29l-3.5 6h4l-2.5 7 8-10h-4l2.2-3Z"></path></svg>'
      };

      const locationName = document.getElementById("locationName");
      const dateLine = document.getElementById("dateLine");
      const coordsBadge = document.getElementById("coordsBadge");
      const statusPill = document.getElementById("statusPill");
      const conditionIcon = document.getElementById("conditionIcon");
      const conditionLabel = document.getElementById("conditionLabel");
      const maxTemp = document.getElementById("maxTemp");
      const minTemp = document.getElementById("minTemp");
      const maxTempBig = document.getElementById("maxTempBig");
      const minTempBig = document.getElementById("minTempBig");
      const message = document.getElementById("message");
      const sourceLabel = document.getElementById("sourceLabel");
      const hourlyGrid = document.getElementById("hourlyGrid");

      const utcToday = () => new Date().toISOString().slice(0, 10);

      const isValidDate = (value) => {
        if (!/^\d{4}-\d{2}-\d{2}$/.test(value || "")) return false;
        return !Number.isNaN(Date.parse(value + "T00:00:00Z"));
      };

      const toNumber = (value, fallback) => {
        const parsed = Number(value);
        return Number.isFinite(parsed) ? parsed : fallback;
      };

      const formatCoordinate = (value) => {
        return (Math.round(value * 1000) / 1000).toFixed(3).replace(/\.?0+$/, "");
      };

      const formatTemp = (value, withUnit) => {
        if (!Number.isFinite(value)) return "--";
        const rounded = Math.round(value * 10) / 10;
        const text = Number.isInteger(rounded) ? String(rounded.toFixed(0)) : rounded.toFixed(1);
        return withUnit ? text + "°C" : text + "°";
      };

      const formatDisplayDate = (value) => {
        const date = new Date(value + "T00:00:00Z");
        return new Intl.DateTimeFormat(undefined, {
          weekday: "long",
          day: "numeric",
          month: "long",
          year: "numeric",
          timeZone: "UTC"
        }).format(date);
      };

      const describeWeather = (code) => {
        if (code === 0) return { label: "Clear sky", theme: "clear", icon: "clear" };
        if (code === 1) return { label: "Mainly clear", theme: "clear", icon: "clear" };
        if (code === 2) return { label: "Partly cloudy", theme: "cloudy", icon: "cloudy" };
        if (code === 3) return { label: "Overcast", theme: "cloudy", icon: "cloudy" };
        if ([45, 48].includes(code)) return { label: "Foggy", theme: "cloudy", icon: "cloudy" };
        if ([51, 53, 55, 56, 57].includes(code)) return { label: "Drizzle", theme: "rain", icon: "rain" };
        if ([61, 63, 65, 66, 67].includes(code)) return { label: "Rain", theme: "rain", icon: "rain" };
        if ([71, 73, 75, 77, 85, 86].includes(code)) return { label: "Snow", theme: "snow", icon: "snow" };
        if ([80, 81, 82].includes(code)) return { label: "Rain showers", theme: "rain", icon: "rain" };
        if ([95, 96, 99].includes(code)) return { label: "Thunderstorm", theme: "storm", icon: "storm" };
        return { label: "Mixed conditions", theme: "cloudy", icon: "cloudy" };
      };

      const setStatus = (text, state) => {
        statusPill.textContent = text;
        statusPill.dataset.state = state;
      };

      const setPlaceholder = (text) => {
        hourlyGrid.style.gridTemplateColumns = "1fr";
        hourlyGrid.innerHTML = '<div class="placeholder">' + text + "</div>";
      };

      const renderHourly = (entries) => {
        if (!entries.length) {
          setPlaceholder("Hourly temperatures are unavailable for the selected date.");
          return;
        }

        const temps = entries.map((entry) => entry.temp).filter(Number.isFinite);
        const min = Math.min.apply(null, temps);
        const max = Math.max.apply(null, temps);
        const spread = Math.max(max - min, 1);

        hourlyGrid.style.gridTemplateColumns = "repeat(" + entries.length + ", minmax(0, 1fr))";
        hourlyGrid.innerHTML = entries.map((entry) => {
          const label = entry.time.includes("T") ? entry.time.slice(11, 16) : entry.time;
          const ratio = (entry.temp - min) / spread;
          const fill = Math.round(42 + ratio * 96);
          const hue = Math.round(208 - ratio * 155);
          const isPeak = entry.temp === max;
          const isTrough = entry.temp === min;
          const className = "hour-item" + (isPeak ? " peak" : "") + (isTrough ? " trough" : "");

          return (
            '<article class="' + className + '" style="--fill:' + fill + 'px; --hue:' + hue + ';">' +
              '<span class="hour-label">' + label + "</span>" +
              '<div class="bar-shell"><div class="bar"></div></div>' +
              '<span class="hour-temp">' + formatTemp(entry.temp, false) + "</span>" +
            "</article>"
          );
        }).join("");
      };

      const showError = (selectedName, selectedDate, reason) => {
        document.body.dataset.theme = "storm";
        locationName.textContent = selectedName;
        dateLine.textContent = formatDisplayDate(selectedDate) + " \u00b7 UTC";
        conditionIcon.innerHTML = icons.storm;
        conditionLabel.textContent = "Unable to load weather";
        maxTemp.textContent = "--";
        minTemp.textContent = "--";
        maxTempBig.textContent = "--";
        minTempBig.textContent = "--";
        sourceLabel.textContent = "Unavailable";
        message.textContent = reason || "The weather data could not be loaded for the selected date.";
        setStatus("Load failed", "error");
        setPlaceholder("Weather data could not be loaded.");
        document.title = selectedName + " weather unavailable";
      };

      const params = new URLSearchParams(window.location.search);
      const selectedDate = isValidDate(params.get("date")) ? params.get("date") : utcToday();
      const lat = toNumber(params.get("lat"), defaults.lat);
      const lon = toNumber(params.get("lon"), defaults.lon);
      const selectedName = (params.get("name") || defaults.name).trim() || defaults.name;

      const todayUtc = utcToday();
      const useArchive = selectedDate < todayUtc;
      const endpoint = useArchive ? "/api/om/archive" : "/api/om/forecast";

      locationName.textContent = selectedName;
      dateLine.textContent = formatDisplayDate(selectedDate) + " \u00b7 UTC";
      coordsBadge.textContent = formatCoordinate(lat) + ", " + formatCoordinate(lon);
      conditionIcon.innerHTML = icons.clear;
      sourceLabel.textContent = endpoint;
      setStatus(useArchive ? "Loading archive" : "Loading forecast", "loading");

      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: selectedDate,
        end_date: selectedDate
      });

      fetch(endpoint + "?" + query.toString(), {
        method: "GET",
        headers: {
          "Accept": "application/json"
        }
      })
        .then((response) => {
          if (!response.ok) {
            throw new Error("Request failed with status " + response.status);
          }
          return response.json();
        })
        .then((data) => {
          const daily = data && data.daily;
          const hourly = data && data.hourly;

          const maxValue = daily && Array.isArray(daily.temperature_2m_max) ? Number(daily.temperature_2m_max[0]) : NaN;
          const minValue = daily && Array.isArray(daily.temperature_2m_min) ? Number(daily.temperature_2m_min[0]) : NaN;
          const weatherCode = daily && Array.isArray(daily.weather_code) ? Number(daily.weather_code[0]) : NaN;
          const hourlyTimes = hourly && Array.isArray(hourly.time) ? hourly.time : [];
          const hourlyTemps = hourly && Array.isArray(hourly.temperature_2m) ? hourly.temperature_2m : [];

          if (!Number.isFinite(maxValue) || !Number.isFinite(minValue) || !hourlyTimes.length || !hourlyTemps.length) {
            throw new Error("Incomplete weather payload");
          }

          const descriptor = describeWeather(weatherCode);
          document.body.dataset.theme = descriptor.theme;
          conditionIcon.innerHTML = icons[descriptor.icon] || icons.cloudy;
          conditionLabel.textContent = descriptor.label;
          maxTemp.textContent = formatTemp(maxValue, true);
          minTemp.textContent = formatTemp(minValue, true);
          maxTempBig.textContent = formatTemp(maxValue, true);
          minTempBig.textContent = formatTemp(minValue, true);
          sourceLabel.textContent = endpoint;
          message.textContent = "Daily summary and hourly temperatures for " + formatDisplayDate(selectedDate) + " in UTC.";
          setStatus(useArchive ? "Archive loaded" : "Forecast loaded", "ready");

          const entries = hourlyTimes
            .map((time, index) => ({
              time: String(time),
              temp: Number(hourlyTemps[index])
            }))
            .filter((entry) => entry.time.startsWith(selectedDate) && Number.isFinite(entry.temp));

          if (!entries.length) {
            throw new Error("No hourly data for selected date");
          }

          renderHourly(entries);
          document.title = selectedName + " weather on " + selectedDate;
        })
        .catch((error) => {
          showError(selectedName, selectedDate, "The weather data could not be loaded for the selected date.");
          console.error(error);
        });
    })();
  </script>
</body>
</html>

L1 — cheap deterministic descriptors

bytes total29,192html / css / js3,050 / 14,571 / 11,571
dom nodes63dom depth11
css rules81js presentyes
brightness45.8contrast25.4
colorfulness19.9whitespace54.9%

This slot's telemetry

prompt tokens16,094completion tokens16,996
total tokens33,090wall135.5 s
costrequest id
config.json557 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "gpt-5.4-eff-high--cli--cursor--dev",
  "effort": "high",
  "family": "gpt",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "gpt-5.4",
  "protocol": "cli",
  "served_model": "gpt-5.4-high",
  "telemetry": {
    "completion_tokens": 52507,
    "cost_usd": null,
    "prompt_tokens": 50544,
    "total_tokens": 103051,
    "wall_ms": 404856
  },
  "transport": "cursor-agent-cli-isolated-home",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-08-13--cursor-s0",
  "config_id": "gpt-5.4-eff-high--cli--cursor--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-08-13T01:03:19.657302+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T01:01:04.164840+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-13T01:04:31.468134+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T01:03:23.485984+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-13T01:05:36.985952+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T01:04:34.993181+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-13T01:07:59.683904+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T01:05:40.295069+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
    }
  }
}