gpt-5.4 @ medium · cursor

cursormedium
config
gpt-5.4-eff-medium--cli--cursor--dev
batch
2026-07-19--unified
transport
cursor-agent-cli-isolated-home
protocol
cli · plan
served model
gpt-5.4-medium
captured
Jul 18, 2026, 11:54 AM · N=2
variant
live
slot 0 · P-q · sandboxed iframe
gpt-5.4 @medium · 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 tempambiguousinsufficient-distinct-temperature-nodes
  • min tempambiguousinsufficient-distinct-temperature-nodes
  • hourlyambiguouscoverage · 0 match · 0 mismatch · 24 not shown
  • request sidematch0 violation(s)

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

Source — raw model output, one byte unchanged

download card.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=1280, initial-scale=1.0" />
  <title>Weather Card</title>
  <style>
    :root {
      --bg-1: #0b1020;
      --bg-2: #111a33;
      --bg-3: #1a2752;
      --card: rgba(15, 23, 42, 0.72);
      --card-border: rgba(255, 255, 255, 0.14);
      --text: #eef4ff;
      --muted: #aab6d3;
      --accent: #7dd3fc;
      --accent-2: #c4b5fd;
      --good: #86efac;
      --bad: #fca5a5;
      --shadow: 0 24px 80px rgba(0, 0, 0, 0.45);
    }

    * {
      box-sizing: border-box;
    }

    html, body {
      width: 100%;
      height: 100%;
      margin: 0;
      font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      color: var(--text);
      background:
        radial-gradient(circle at 15% 20%, rgba(125, 211, 252, 0.18), transparent 28%),
        radial-gradient(circle at 85% 18%, rgba(196, 181, 253, 0.16), transparent 24%),
        radial-gradient(circle at 50% 100%, rgba(59, 130, 246, 0.22), transparent 36%),
        linear-gradient(135deg, var(--bg-1), var(--bg-2) 45%, var(--bg-3));
      overflow: hidden;
    }

    body {
      display: grid;
      place-items: center;
      padding: 28px;
    }

    .frame {
      position: relative;
      width: 1180px;
      height: 740px;
      border-radius: 32px;
      background:
        linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.03)),
        rgba(255, 255, 255, 0.02);
      border: 1px solid rgba(255, 255, 255, 0.1);
      box-shadow: var(--shadow);
      backdrop-filter: blur(20px);
      overflow: hidden;
    }

    .frame::before,
    .frame::after {
      content: "";
      position: absolute;
      border-radius: 999px;
      filter: blur(6px);
      opacity: 0.85;
      pointer-events: none;
    }

    .frame::before {
      width: 320px;
      height: 320px;
      top: -110px;
      right: -80px;
      background: radial-gradient(circle at 30% 30%, rgba(125, 211, 252, 0.5), rgba(125, 211, 252, 0.03) 65%, transparent 75%);
    }

    .frame::after {
      width: 420px;
      height: 420px;
      bottom: -180px;
      left: -100px;
      background: radial-gradient(circle at 50% 50%, rgba(196, 181, 253, 0.28), rgba(196, 181, 253, 0.03) 70%, transparent 78%);
    }

    .shell {
      position: relative;
      z-index: 1;
      display: grid;
      grid-template-columns: 1.05fr 1fr;
      gap: 22px;
      height: 100%;
      padding: 24px;
    }

    .panel {
      border-radius: 28px;
      background: var(--card);
      border: 1px solid var(--card-border);
      backdrop-filter: blur(18px);
      overflow: hidden;
      min-width: 0;
    }

    .hero {
      padding: 28px;
      display: flex;
      flex-direction: column;
      justify-content: space-between;
      background:
        linear-gradient(180deg, rgba(125, 211, 252, 0.08), rgba(196, 181, 253, 0.05)),
        rgba(15, 23, 42, 0.75);
    }

    .meta-row {
      display: flex;
      align-items: flex-start;
      justify-content: space-between;
      gap: 16px;
    }

    .eyebrow {
      display: inline-flex;
      align-items: center;
      gap: 8px;
      padding: 8px 12px;
      border-radius: 999px;
      font-size: 12px;
      letter-spacing: 0.08em;
      text-transform: uppercase;
      color: #dbeafe;
      background: rgba(255, 255, 255, 0.08);
      border: 1px solid rgba(255, 255, 255, 0.12);
    }

    .eyebrow-dot {
      width: 8px;
      height: 8px;
      border-radius: 50%;
      background: linear-gradient(180deg, #7dd3fc, #c4b5fd);
      box-shadow: 0 0 14px rgba(125, 211, 252, 0.75);
    }

    .location {
      margin-top: 18px;
      font-size: 54px;
      line-height: 1.02;
      letter-spacing: -0.04em;
      font-weight: 700;
      max-width: 560px;
    }

    .date {
      margin-top: 12px;
      font-size: 18px;
      color: var(--muted);
      letter-spacing: 0.01em;
    }

    .condition-chip {
      display: inline-flex;
      align-items: center;
      gap: 10px;
      padding: 12px 16px;
      border-radius: 18px;
      font-size: 14px;
      color: #f8fbff;
      background: rgba(255, 255, 255, 0.08);
      border: 1px solid rgba(255, 255, 255, 0.12);
      white-space: nowrap;
    }

    .condition-icon {
      width: 12px;
      height: 12px;
      border-radius: 50%;
      background: linear-gradient(180deg, var(--accent), var(--accent-2));
      box-shadow: 0 0 18px rgba(125, 211, 252, 0.9);
      flex: 0 0 auto;
    }

    .stats {
      display: grid;
      grid-template-columns: 1.2fr 1fr;
      gap: 18px;
      align-items: end;
    }

    .temperature-block {
      display: flex;
      flex-direction: column;
      gap: 12px;
    }

    .temperature-main {
      display: flex;
      align-items: flex-end;
      gap: 18px;
      flex-wrap: wrap;
    }

    .big-max {
      font-size: 132px;
      line-height: 0.88;
      letter-spacing: -0.07em;
      font-weight: 800;
      text-shadow: 0 14px 42px rgba(125, 211, 252, 0.15);
    }

    .min-wrap {
      padding-bottom: 18px;
      color: var(--muted);
      font-size: 20px;
    }

    .range-card {
      padding: 18px;
      border-radius: 24px;
      background: rgba(255, 255, 255, 0.06);
      border: 1px solid rgba(255, 255, 255, 0.1);
    }

    .range-title {
      font-size: 12px;
      text-transform: uppercase;
      letter-spacing: 0.1em;
      color: var(--muted);
      margin-bottom: 14px;
    }

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

    .range-item {
      padding: 14px;
      border-radius: 18px;
      background: rgba(255, 255, 255, 0.05);
    }

    .range-label {
      font-size: 12px;
      text-transform: uppercase;
      letter-spacing: 0.08em;
      color: var(--muted);
      margin-bottom: 8px;
    }

    .range-number {
      font-size: 34px;
      font-weight: 700;
      letter-spacing: -0.04em;
    }

    .hours-panel {
      display: grid;
      grid-template-rows: auto 1fr;
      background:
        linear-gradient(180deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.02)),
        rgba(15, 23, 42, 0.7);
    }

    .hours-header {
      display: flex;
      align-items: center;
      justify-content: space-between;
      gap: 16px;
      padding: 26px 26px 18px;
      border-bottom: 1px solid rgba(255, 255, 255, 0.08);
    }

    .hours-title {
      font-size: 22px;
      font-weight: 650;
      letter-spacing: -0.02em;
    }

    .hours-subtitle {
      font-size: 14px;
      color: var(--muted);
      margin-top: 4px;
    }

    .utc-badge {
      padding: 10px 14px;
      border-radius: 999px;
      font-size: 12px;
      letter-spacing: 0.08em;
      text-transform: uppercase;
      color: #dbeafe;
      background: rgba(255, 255, 255, 0.06);
      border: 1px solid rgba(255, 255, 255, 0.1);
    }

    .hours-wrap {
      padding: 18px 20px 20px;
      overflow: auto;
    }

    .hours-grid {
      display: grid;
      grid-template-columns: repeat(4, minmax(0, 1fr));
      gap: 14px;
    }

    .hour-card {
      position: relative;
      min-height: 118px;
      padding: 16px;
      border-radius: 22px;
      background:
        linear-gradient(180deg, rgba(125, 211, 252, 0.06), rgba(255, 255, 255, 0.03)),
        rgba(255, 255, 255, 0.04);
      border: 1px solid rgba(255, 255, 255, 0.08);
      overflow: hidden;
    }

    .hour-card::after {
      content: "";
      position: absolute;
      left: 0;
      right: 0;
      bottom: 0;
      height: calc(var(--fill, 0.4) * 100%);
      background: linear-gradient(180deg, rgba(125, 211, 252, 0.08), rgba(125, 211, 252, 0.22));
      pointer-events: none;
    }

    .hour-card > * {
      position: relative;
      z-index: 1;
    }

    .hour-time {
      font-size: 13px;
      letter-spacing: 0.08em;
      text-transform: uppercase;
      color: var(--muted);
    }

    .hour-temp {
      margin-top: 12px;
      font-size: 34px;
      font-weight: 750;
      letter-spacing: -0.05em;
    }

    .hour-label {
      margin-top: 8px;
      font-size: 13px;
      color: #d7e4ff;
      opacity: 0.88;
    }

    .loading,
    .error {
      display: grid;
      place-items: center;
      width: 100%;
      height: 100%;
      padding: 32px;
      text-align: center;
    }

    .loading-card,
    .error-card {
      max-width: 760px;
      padding: 32px 36px;
      border-radius: 28px;
      background: rgba(15, 23, 42, 0.76);
      border: 1px solid rgba(255, 255, 255, 0.12);
      box-shadow: var(--shadow);
      backdrop-filter: blur(18px);
    }

    .loading-title,
    .error-title {
      font-size: 34px;
      font-weight: 700;
      letter-spacing: -0.04em;
      margin: 0 0 12px;
    }

    .loading-copy,
    .error-copy {
      margin: 0;
      font-size: 16px;
      line-height: 1.6;
      color: var(--muted);
    }

    .error-title {
      color: #fff1f2;
    }

    .error-copy strong {
      color: #ffffff;
      font-weight: 650;
    }

    .footer-note {
      margin-top: 14px;
      font-size: 12px;
      color: rgba(255, 255, 255, 0.55);
      letter-spacing: 0.03em;
    }

    @media (max-width: 1279px), (max-height: 799px) {
      body {
        min-width: 1280px;
        min-height: 800px;
      }
    }
  </style>
</head>
<body>
  <div id="app" class="loading" aria-live="polite">
    <div class="loading-card">
      <h1 class="loading-title">Loading weather</h1>
      <p class="loading-copy">Preparing the daily forecast card and hourly temperatures for the requested location.</p>
    </div>
  </div>

  <script>
    (function () {
      function getUtcToday() {
        return new Date().toISOString().slice(0, 10);
      }

      function parseParams() {
        var params = new URLSearchParams(window.location.search);
        var lat = Number(params.get("lat"));
        var lon = Number(params.get("lon"));
        var name = params.get("name");
        var date = params.get("date");

        return {
          lat: Number.isFinite(lat) ? lat : 52.52,
          lon: Number.isFinite(lon) ? lon : 13.405,
          name: (name && name.trim()) || "Berlin",
          date: /^\d{4}-\d{2}-\d{2}$/.test(date || "") ? date : getUtcToday()
        };
      }

      function weatherLabel(code) {
        var map = {
          0: "Clear sky",
          1: "Mainly clear",
          2: "Partly cloudy",
          3: "Overcast",
          45: "Fog",
          48: "Depositing rime fog",
          51: "Light drizzle",
          53: "Moderate drizzle",
          55: "Dense drizzle",
          56: "Light freezing drizzle",
          57: "Dense freezing drizzle",
          61: "Slight rain",
          63: "Moderate rain",
          65: "Heavy rain",
          66: "Light freezing rain",
          67: "Heavy freezing rain",
          71: "Slight snow fall",
          73: "Moderate snow fall",
          75: "Heavy snow fall",
          77: "Snow grains",
          80: "Slight rain showers",
          81: "Moderate rain showers",
          82: "Violent rain showers",
          85: "Slight snow showers",
          86: "Heavy snow showers",
          95: "Thunderstorm",
          96: "Thunderstorm with slight hail",
          99: "Thunderstorm with heavy hail"
        };
        return map.hasOwnProperty(code) ? map[code] : "Unknown conditions";
      }

      function formatDate(dateStr) {
        var dt = new Date(dateStr + "T00:00:00Z");
        return new Intl.DateTimeFormat("en-US", {
          weekday: "long",
          month: "long",
          day: "numeric",
          year: "numeric",
          timeZone: "UTC"
        }).format(dt);
      }

      function padHour(dateTimeStr) {
        var match = /T(\d{2}):(\d{2})/.exec(dateTimeStr);
        if (!match) return "--:--";
        return match[1] + ":" + match[2];
      }

      function celsius(value) {
        return Math.round(value) + "°C";
      }

      function getEndpoint(dateStr) {
        var today = getUtcToday();
        return dateStr < today ? "/api/om/archive" : "/api/om/forecast";
      }

      function buildUrl(config) {
        var endpoint = getEndpoint(config.date);
        var query = new URLSearchParams({
          latitude: String(config.lat),
          longitude: String(config.lon),
          daily: "temperature_2m_max,temperature_2m_min,weather_code",
          hourly: "temperature_2m",
          timezone: "UTC",
          temperature_unit: "celsius",
          start_date: config.date,
          end_date: config.date
        });
        return endpoint + "?" + query.toString();
      }

      function safeNumber(value) {
        return typeof value === "number" && Number.isFinite(value);
      }

      function renderError(message) {
        var app = document.getElementById("app");
        app.className = "error";
        app.innerHTML =
          '<div class="error-card">' +
            '<h1 class="error-title">Weather data could not be loaded</h1>' +
            '<p class="error-copy"><strong>Please try again.</strong> ' + escapeHtml(message) + '</p>' +
            '<div class="footer-note">The page fetches daily and hourly weather from the local Open-Meteo compatible API.</div>' +
          '</div>';
      }

      function escapeHtml(text) {
        return String(text).replace(/[&<>"']/g, function (char) {
          return ({
            "&": "&amp;",
            "<": "&lt;",
            ">": "&gt;",
            '"': "&quot;",
            "'": "&#39;"
          })[char];
        });
      }

      function renderWeather(config, data) {
        var daily = data && data.daily;
        var hourly = data && data.hourly;

        if (
          !daily ||
          !hourly ||
          !Array.isArray(daily.temperature_2m_max) ||
          !Array.isArray(daily.temperature_2m_min) ||
          !Array.isArray(daily.weather_code) ||
          !Array.isArray(hourly.time) ||
          !Array.isArray(hourly.temperature_2m) ||
          !safeNumber(daily.temperature_2m_max[0]) ||
          !safeNumber(daily.temperature_2m_min[0]) ||
          !safeNumber(daily.weather_code[0])
        ) {
          renderError("The weather API returned an incomplete response for the requested date.");
          return;
        }

        var maxTemp = daily.temperature_2m_max[0];
        var minTemp = daily.temperature_2m_min[0];
        var code = daily.weather_code[0];
        var condition = weatherLabel(code);

        var hourlyItems = [];
        for (var i = 0; i < hourly.time.length; i++) {
          var temp = hourly.temperature_2m[i];
          if (!safeNumber(temp)) continue;
          hourlyItems.push({
            time: hourly.time[i],
            temp: temp
          });
        }

        if (!hourlyItems.length) {
          renderError("No hourly temperatures were available for the requested date.");
          return;
        }

        var minHourly = Math.min.apply(null, hourlyItems.map(function (item) { return item.temp; }));
        var maxHourly = Math.max.apply(null, hourlyItems.map(function (item) { return item.temp; }));
        var span = Math.max(1, maxHourly - minHourly);

        var hoursMarkup = hourlyItems.map(function (item) {
          var fill = 0.22 + ((item.temp - minHourly) / span) * 0.62;
          return (
            '<div class="hour-card" style="--fill:' + fill.toFixed(4) + '">' +
              '<div class="hour-time">' + padHour(item.time) + '</div>' +
              '<div class="hour-temp">' + celsius(item.temp) + '</div>' +
              '<div class="hour-label">Hourly temperature</div>' +
            '</div>'
          );
        }).join("");

        var app = document.getElementById("app");
        app.className = "";
        app.innerHTML =
          '<div class="frame">' +
            '<div class="shell">' +
              '<section class="panel hero">' +
                '<div>' +
                  '<div class="meta-row">' +
                    '<div>' +
                      '<div class="eyebrow"><span class="eyebrow-dot"></span>Weather overview</div>' +
                      '<div class="location">' + escapeHtml(config.name) + '</div>' +
                      '<div class="date">' + escapeHtml(formatDate(config.date)) + '</div>' +
                    '</div>' +
                    '<div class="condition-chip"><span class="condition-icon"></span>' + escapeHtml(condition) + '</div>' +
                  '</div>' +
                '</div>' +
                '<div class="stats">' +
                  '<div class="temperature-block">' +
                    '<div class="temperature-main">' +
                      '<div class="big-max">' + celsius(maxTemp) + '</div>' +
                      '<div class="min-wrap">Low ' + celsius(minTemp) + '</div>' +
                    '</div>' +
                  '</div>' +
                  '<div class="range-card">' +
                    '<div class="range-title">Daily range</div>' +
                    '<div class="range-values">' +
                      '<div class="range-item">' +
                        '<div class="range-label">Maximum</div>' +
                        '<div class="range-number">' + celsius(maxTemp) + '</div>' +
                      '</div>' +
                      '<div class="range-item">' +
                        '<div class="range-label">Minimum</div>' +
                        '<div class="range-number">' + celsius(minTemp) + '</div>' +
                      '</div>' +
                    '</div>' +
                  '</div>' +
                '</div>' +
              '</section>' +
              '<section class="panel hours-panel">' +
                '<div class="hours-header">' +
                  '<div>' +
                    '<div class="hours-title">Hourly Temperatures</div>' +
                    '<div class="hours-subtitle">Full day timeline for ' + escapeHtml(config.date) + '</div>' +
                  '</div>' +
                  '<div class="utc-badge">UTC</div>' +
                '</div>' +
                '<div class="hours-wrap">' +
                  '<div class="hours-grid">' + hoursMarkup + '</div>' +
                '</div>' +
              '</section>' +
            '</div>' +
          '</div>';
      }

      async function load() {
        var config = parseParams();
        var url = buildUrl(config);

        try {
          var response = await fetch(url, {
            method: "GET",
            headers: {
              "Accept": "application/json"
            }
          });

          if (!response.ok) {
            throw new Error("API responded with status " + response.status + ".");
          }

          var data = await response.json();
          renderWeather(config, data);
        } catch (error) {
          renderError(error && error.message ? error.message : "Unexpected network error.");
        }
      }

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

L1 — cheap deterministic descriptors

bytes total18,933html / css / js509 / 9,157 / 9,267
dom nodes12dom depth5
css rules51js presentyes
brightness58.1contrast33.7
colorfulness16.7whitespace56.5%

This slot's telemetry

prompt tokens16,101completion tokens5,802
total tokens21,903wall44.5 s
costrequest id
config.json562 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "gpt-5.4-eff-medium--cli--cursor--dev",
  "effort": "medium",
  "family": "gpt",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "gpt-5.4",
  "protocol": "cli",
  "served_model": "gpt-5.4-medium",
  "telemetry": {
    "completion_tokens": 22334,
    "cost_usd": null,
    "prompt_tokens": 50555,
    "total_tokens": 72889,
    "wall_ms": 315742
  },
  "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-medium--cli--cursor--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-08-12T21:37:02.601361+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-12T21:36:25.053766+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-12T21:37:50.236567+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-12T21:37:05.752880+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:38:58.676490+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-12T21:37:53.883150+00:00"
        }
      ],
      "block_index": 1,
      "model_reaching_attempt_index": 0,
      "slot_index": 1,
      "terminal_state": "valid",
      "variant": "P-q"
    },
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-08-12T21:41:51.224313+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-12T21:39:02.298034+00:00"
        }
      ],
      "block_index": 1,
      "model_reaching_attempt_index": 0,
      "slot_index": 1,
      "terminal_state": "valid",
      "variant": "P-min"
    }
  ],
  "retry_policy": {
    "max_unreachable_retries": 5,
    "rate_limit_backoff": {
      "max_attempts": 4,
      "max_total_ms": 60000
    }
  }
}