gpt-5.6-luna @ low · cursor

cursorlow
config
gpt-5.6-luna-eff-low--cli--cursor--dev
batch
2026-07-19--unified
transport
cursor-agent-cli-isolated-home
protocol
cli · plan
served model
gpt-5.6-luna-low
采集于
2026年7月18日 11:54 · N=2
variant
live
slot 0 · P-q · sandboxed iframe
gpt-5.6-luna @low · cursor P-q slot 0 截图

渲染不确定 — 同一份输入重复渲染会得到不同像素(随机/时间相关的内容),因此视觉通道对这张卡的读数不如其他卡稳定。

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

similarity 邻居

限于 session 2026-07-19--unified

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

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

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

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

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

下载 card.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Weather Card</title>
  <style>
    :root {
      --ink: #10233f;
      --muted: #6e7d92;
      --line: #e8edf4;
      --blue: #4e89e8;
      --blue-deep: #3267bf;
      --sky: #eaf4ff;
      --warm: #ffb45d;
      --surface: rgba(255, 255, 255, .88);
    }

    * { box-sizing: border-box; }

    body {
      margin: 0;
      min-width: 1000px;
      min-height: 800px;
      display: grid;
      place-items: center;
      color: var(--ink);
      font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      background:
        radial-gradient(circle at 18% 10%, rgba(255,255,255,.95) 0 5%, transparent 28%),
        radial-gradient(circle at 92% 82%, rgba(126,184,255,.3), transparent 32%),
        linear-gradient(135deg, #cfe6ff 0%, #eef7ff 48%, #d9ebff 100%);
    }

    .shell {
      width: 1120px;
      min-height: 650px;
      padding: 42px;
      overflow: hidden;
      position: relative;
      border: 1px solid rgba(255,255,255,.8);
      border-radius: 34px;
      background: var(--surface);
      box-shadow: 0 28px 80px rgba(39, 82, 135, .18), 0 2px 8px rgba(40, 76, 120, .08);
      backdrop-filter: blur(20px);
    }

    .shell::before, .shell::after {
      content: "";
      position: absolute;
      border-radius: 50%;
      pointer-events: none;
      filter: blur(2px);
    }

    .shell::before {
      width: 250px;
      height: 250px;
      right: -100px;
      top: -110px;
      background: rgba(159, 211, 255, .24);
    }

    .shell::after {
      width: 180px;
      height: 180px;
      left: -90px;
      bottom: -100px;
      background: rgba(255, 213, 153, .18);
    }

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

    .eyebrow {
      margin: 0 0 9px;
      color: var(--blue-deep);
      font-size: 12px;
      font-weight: 800;
      letter-spacing: .15em;
      text-transform: uppercase;
    }

    h1 {
      margin: 0;
      font-size: 36px;
      line-height: 1.05;
      letter-spacing: -.045em;
    }

    .date {
      margin: 10px 0 0;
      color: var(--muted);
      font-size: 15px;
      font-weight: 600;
    }

    .status {
      display: flex;
      align-items: center;
      gap: 8px;
      margin-top: 5px;
      color: #718096;
      font-size: 12px;
      font-weight: 700;
    }

    .status-dot {
      width: 8px;
      height: 8px;
      border-radius: 50%;
      background: #64c697;
      box-shadow: 0 0 0 4px rgba(100,198,151,.14);
    }

    .status.error { color: #c04b5b; }
    .status.error .status-dot {
      background: #dc6576;
      box-shadow: 0 0 0 4px rgba(220,101,118,.14);
    }

    .overview {
      position: relative;
      z-index: 1;
      display: grid;
      grid-template-columns: 1.05fr 1fr;
      gap: 26px;
      margin-bottom: 27px;
    }

    .hero {
      min-height: 208px;
      padding: 30px 34px;
      display: flex;
      align-items: center;
      gap: 27px;
      border-radius: 24px;
      color: white;
      background:
        radial-gradient(circle at 82% 13%, rgba(255,255,255,.28) 0 5%, transparent 6%),
        radial-gradient(circle at 79% 16%, rgba(255,255,255,.12) 0 17%, transparent 18%),
        linear-gradient(135deg, #629bea, #3c70c8);
      box-shadow: 0 13px 28px rgba(58, 113, 202, .22);
    }

    .weather-icon {
      width: 108px;
      height: 108px;
      flex: 0 0 108px;
      display: grid;
      place-items: center;
      border-radius: 50%;
      background: rgba(255,255,255,.15);
    }

    .weather-icon svg { width: 78px; height: 78px; }

    .condition {
      margin: 0 0 8px;
      font-size: 18px;
      font-weight: 750;
    }

    .temperature {
      margin: 0;
      font-size: 68px;
      line-height: .9;
      font-weight: 800;
      letter-spacing: -.08em;
    }

    .temperature span {
      margin-left: 5px;
      font-size: 29px;
      vertical-align: top;
      letter-spacing: -.04em;
    }

    .range {
      margin-top: 16px;
      color: rgba(255,255,255,.78);
      font-size: 13px;
      font-weight: 650;
    }

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

    .metric {
      padding: 22px 20px;
      border: 1px solid var(--line);
      border-radius: 18px;
      background: rgba(255,255,255,.75);
    }

    .metric-label {
      display: block;
      margin-bottom: 14px;
      color: var(--muted);
      font-size: 11px;
      font-weight: 800;
      letter-spacing: .08em;
      text-transform: uppercase;
    }

    .metric-value {
      font-size: 25px;
      font-weight: 800;
      letter-spacing: -.04em;
    }

    .metric-value small {
      color: var(--muted);
      font-size: 13px;
      font-weight: 700;
      letter-spacing: 0;
    }

    .hourly-panel {
      position: relative;
      z-index: 1;
      padding: 25px 27px 21px;
      border: 1px solid var(--line);
      border-radius: 24px;
      background: rgba(255,255,255,.72);
    }

    .panel-heading {
      display: flex;
      align-items: baseline;
      justify-content: space-between;
      margin-bottom: 21px;
    }

    .panel-heading h2 {
      margin: 0;
      font-size: 17px;
      letter-spacing: -.02em;
    }

    .panel-heading span {
      color: var(--muted);
      font-size: 12px;
      font-weight: 650;
    }

    .hours {
      display: grid;
      grid-template-columns: repeat(12, 1fr);
      gap: 8px;
    }

    .hour {
      min-width: 0;
      padding: 12px 5px 11px;
      text-align: center;
      border-radius: 14px;
      background: #f5f8fc;
    }

    .hour:nth-child(6n+1) {
      background: #eef5ff;
    }

    .hour-time {
      display: block;
      margin-bottom: 15px;
      color: var(--muted);
      font-size: 10px;
      font-weight: 750;
    }

    .hour-temp {
      display: block;
      margin-top: 14px;
      font-size: 13px;
      font-weight: 800;
    }

    .bar-wrap {
      height: 62px;
      display: flex;
      align-items: flex-end;
      justify-content: center;
    }

    .bar {
      width: 7px;
      min-height: 8px;
      border-radius: 8px;
      background: linear-gradient(to top, var(--blue), #9bc7ff);
      box-shadow: 0 3px 8px rgba(78,137,232,.18);
    }

    .footer {
      position: relative;
      z-index: 1;
      display: flex;
      justify-content: space-between;
      margin-top: 18px;
      color: #9aa7b8;
      font-size: 11px;
      font-weight: 650;
    }

    .loading, .error-message {
      position: absolute;
      inset: 0;
      display: grid;
      place-items: center;
      padding: 40px;
      text-align: center;
      color: var(--muted);
      font-weight: 700;
      background: rgba(255,255,255,.82);
      border-radius: 34px;
      z-index: 5;
    }

    .spinner {
      width: 28px;
      height: 28px;
      margin: 0 auto 14px;
      border: 3px solid #dbe8f8;
      border-top-color: var(--blue);
      border-radius: 50%;
      animation: spin .8s linear infinite;
    }

    @keyframes spin { to { transform: rotate(360deg); } }
  </style>
</head>
<body>
  <main class="shell">
    <div class="loading" id="loading">
      <div><div class="spinner"></div>Loading weather data…</div>
    </div>

    <header>
      <div>
        <p class="eyebrow">Daily forecast</p>
        <h1 id="location">Berlin</h1>
        <p class="date" id="date">—</p>
      </div>
      <div class="status" id="status"><span class="status-dot"></span><span>Live data</span></div>
    </header>

    <section class="overview">
      <div class="hero">
        <div class="weather-icon" id="weatherIcon"></div>
        <div>
          <p class="condition" id="condition">—</p>
          <p class="temperature" id="temperature">—<span>°C</span></p>
          <div class="range" id="range">High — · Low —</div>
        </div>
      </div>
      <div class="metrics">
        <div class="metric">
          <span class="metric-label">Maximum</span>
          <div class="metric-value" id="maximum">— <small>°C</small></div>
        </div>
        <div class="metric">
          <span class="metric-label">Minimum</span>
          <div class="metric-value" id="minimum">— <small>°C</small></div>
        </div>
        <div class="metric">
          <span class="metric-label">Location</span>
          <div class="metric-value" id="coordinates">—</div>
        </div>
        <div class="metric">
          <span class="metric-label">Timezone</span>
          <div class="metric-value">UTC</div>
        </div>
      </div>
    </section>

    <section class="hourly-panel">
      <div class="panel-heading">
        <h2>Hourly temperature</h2>
        <span>Every 2 hours · °C</span>
      </div>
      <div class="hours" id="hours"></div>
    </section>

    <div class="footer">
      <span>Open-Meteo compatible forecast</span>
      <span id="updated">—</span>
    </div>
  </main>

  <script>
    (() => {
      const params = new URLSearchParams(location.search);
      const lat = Number(params.get("lat") || 52.52);
      const lon = Number(params.get("lon") || 13.405);
      const name = params.get("name") || "Berlin";

      const today = new Date().toISOString().slice(0, 10);
      const requestedDate = /^\d{4}-\d{2}-\d{2}$/.test(params.get("date") || "")
        ? params.get("date")
        : today;

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

      const icons = {
        sun: `<svg viewBox="0 0 100 100" fill="none" aria-hidden="true"><circle cx="50" cy="50" r="20" fill="#FFD477"/><g stroke="#FFE8AE" stroke-width="6" stroke-linecap="round"><path d="M50 12v12M50 76v12M12 50h12M76 50h12M23 23l9 9M68 68l9 9M77 23l-9 9M32 68l-9 9"/></g></svg>`,
        cloud: `<svg viewBox="0 0 100 100" fill="none" aria-hidden="true"><circle cx="63" cy="35" r="17" fill="#FFD477"/><path d="M25 76h49a15 15 0 0 0 2-29 25 25 0 0 0-47 5 12 12 0 0 0-4 24Z" fill="#fff"/></svg>`,
        rain: `<svg viewBox="0 0 100 100" fill="none" aria-hidden="true"><path d="M25 58h49a15 15 0 0 0 2-29 25 25 0 0 0-47 5 12 12 0 0 0-4 24Z" fill="#fff"/><g stroke="#A9D5FF" stroke-width="5" stroke-linecap="round"><path d="m32 70-5 12M50 70l-5 12M68 70l-5 12"/></g></svg>`,
        snow: `<svg viewBox="0 0 100 100" fill="none" aria-hidden="true"><path d="M25 58h49a15 15 0 0 0 2-29 25 25 0 0 0-47 5 12 12 0 0 0-4 24Z" fill="#fff"/><g stroke="#D5EEFF" stroke-width="4" stroke-linecap="round"><path d="M31 73v14M24 80h14M27 76l9 9M36 76l-9 9M54 73v14M47 80h14M50 76l9 9M59 76l-9 9"/></g></svg>`,
        storm: `<svg viewBox="0 0 100 100" fill="none" aria-hidden="true"><path d="M25 58h49a15 15 0 0 0 2-29 25 25 0 0 0-47 5 12 12 0 0 0-4 24Z" fill="#EAF4FF"/><path d="m53 58-14 23h12l-4 15 18-27H53l9-11Z" fill="#FFD477"/></svg>`
      };

      function iconFor(code) {
        if (code >= 95) return icons.storm;
        if (code >= 71 && code <= 86) return icons.snow;
        if (code >= 51 && code <= 67 || code >= 80 && code <= 82) return icons.rain;
        if (code >= 1 && code <= 3) return icons.cloud;
        return icons.sun;
      }

      function conditionFor(code) {
        return weatherNames[code] || "Variable conditions";
      }

      function formatDate(value) {
        return new Date(value + "T12:00:00Z").toLocaleDateString("en-US", {
          weekday: "long", month: "long", day: "numeric", year: "numeric", timeZone: "UTC"
        });
      }

      function number(value) {
        return Number.isFinite(Number(value)) ? Math.round(Number(value)) : "—";
      }

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

        try {
          const response = await fetch(`${endpoint}?${query.toString()}`, { headers: { Accept: "application/json" } });
          if (!response.ok) throw new Error("Weather request failed");
          const data = await response.json();
          const daily = data.daily;
          const hourly = data.hourly;
          if (!daily || !hourly || !daily.time?.length || !hourly.temperature_2m?.length) throw new Error("Incomplete weather data");

          const max = number(daily.temperature_2m_max[0]);
          const min = number(daily.temperature_2m_min[0]);
          const code = Number(daily.weather_code[0]);
          const temps = hourly.temperature_2m.filter((_, i) => i % 2 === 0);
          const times = hourly.time.filter((_, i) => i % 2 === 0);
          const validTemps = temps.filter(v => Number.isFinite(Number(v)));
          const lo = Math.min(...validTemps);
          const hi = Math.max(...validTemps);

          document.getElementById("location").textContent = name;
          document.getElementById("date").textContent = formatDate(requestedDate);
          document.getElementById("condition").textContent = conditionFor(code);
          document.getElementById("weatherIcon").innerHTML = iconFor(code);
          document.getElementById("temperature").innerHTML = `${max}<span>°C</span>`;
          document.getElementById("range").textContent = `High ${max}° · Low ${min}°`;
          document.getElementById("maximum").innerHTML = `${max} <small>°C</small>`;
          document.getElementById("minimum").innerHTML = `${min} <small>°C</small>`;
          document.getElementById("coordinates").textContent = `${lat.toFixed(2)}°, ${lon.toFixed(2)}°`;
          document.getElementById("updated").textContent = `Fetched ${new Date().toLocaleTimeString([], { hour: "numeric", minute: "2-digit" })}`;

          document.getElementById("hours").innerHTML = times.map((time, i) => {
            const value = Number(temps[i]);
            const height = validTemps.length && Number.isFinite(value)
              ? 14 + ((value - lo) / Math.max(hi - lo, 1)) * 46
              : 14;
            const hour = time.slice(11, 13);
            const label = `${hour}:00`;
            return `<div class="hour"><span class="hour-time">${label}</span><div class="bar-wrap"><i class="bar" style="height:${height}px"></i></div><span class="hour-temp">${number(value)}°</span></div>`;
          }).join("");

          document.getElementById("loading").remove();
        } catch (error) {
          const loading = document.getElementById("loading");
          loading.className = "error-message";
          loading.innerHTML = `<div><div style="font-size:30px;margin-bottom:12px">☁︎</div>Weather data could not be loaded.<br><small style="display:block;margin-top:8px;font-weight:600">Please try again later.</small></div>`;
          const status = document.getElementById("status");
          status.className = "status error";
          status.innerHTML = '<span class="status-dot"></span><span>Unavailable</span>';
        }
      }

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

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

bytes 总计16,141html / css / js2,066 / 7,124 / 6,951
dom 节点51dom 深度8
css 规则44含 js是
brightness232.0contrast37.3
colorfulness41.7留白86.1%

该 slot 的 telemetry

prompt tokens3completion tokens4,973
total tokens4,976wall32 s
cost—request id—
config.json565 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "gpt-5.6-luna-eff-low--cli--cursor--dev",
  "effort": "low",
  "family": "gpt",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "gpt-5.6-luna",
  "protocol": "cli",
  "served_model": "gpt-5.6-luna-low",
  "telemetry": {
    "completion_tokens": 15053,
    "cost_usd": null,
    "prompt_tokens": 12,
    "total_tokens": 15065,
    "wall_ms": 109572
  },
  "transport": "cursor-agent-cli-isolated-home",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-08-13--cursor-s1",
  "config_id": "gpt-5.6-luna-eff-low--cli--cursor--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-08-13T01:20:25.200811+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T01:19:53.163022+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:20:53.056962+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T01:20:28.603896+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:21:19.351203+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T01:20:55.982787+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:21:52.658455+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-13T01:21:22.942149+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
    }
  }
}