claude-fable-5 @ medium · cursor

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

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

similarity 邻居本 session 没有 similarity 数据 —— 这个 batch 没有计算 pairs。

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

  • namematch
  • conditionmatch
  • datematch
  • max tempmatch展示值:25.3
  • min tempmatch展示值:16
  • hourlymatchcoverage 24/24 · 24 命中 · 0 不符 · 0 未展示
  • 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 {
    --bg-1: #0f1b33;
    --bg-2: #1b2c52;
    --card: rgba(255, 255, 255, 0.06);
    --card-border: rgba(255, 255, 255, 0.12);
    --text: #eef3fb;
    --text-dim: #9fb0cc;
    --accent: #7cc4ff;
    --accent-warm: #ffc46b;
    --radius: 24px;
  }

  * { margin: 0; padding: 0; box-sizing: border-box; }

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

  body {
    font-family: "Avenir Next", "Segoe UI", "Helvetica Neue", Arial, sans-serif;
    color: var(--text);
    background:
      radial-gradient(1100px 700px at 15% -10%, #2b4a86 0%, transparent 55%),
      radial-gradient(900px 600px at 95% 110%, #23407a 0%, transparent 55%),
      linear-gradient(160deg, var(--bg-1), var(--bg-2));
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 800px;
    overflow: hidden;
    -webkit-font-smoothing: antialiased;
  }

  .stars {
    position: fixed;
    inset: 0;
    pointer-events: none;
    opacity: 0.5;
  }

  .card {
    position: relative;
    width: 880px;
    border-radius: var(--radius);
    background: var(--card);
    border: 1px solid var(--card-border);
    backdrop-filter: blur(18px);
    box-shadow:
      0 30px 80px rgba(0, 0, 0, 0.45),
      inset 0 1px 0 rgba(255, 255, 255, 0.08);
    padding: 44px 48px 40px;
    animation: rise 0.7s cubic-bezier(0.2, 0.8, 0.25, 1) both;
  }

  @keyframes rise {
    from { opacity: 0; transform: translateY(22px) scale(0.985); }
    to   { opacity: 1; transform: translateY(0) scale(1); }
  }

  .top {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    gap: 32px;
  }

  .place h1 {
    font-size: 42px;
    font-weight: 600;
    letter-spacing: -0.5px;
    line-height: 1.1;
  }

  .place .date {
    margin-top: 8px;
    font-size: 16px;
    color: var(--text-dim);
    letter-spacing: 0.4px;
  }

  .hero {
    display: flex;
    align-items: center;
    gap: 22px;
    text-align: right;
  }

  .hero .icon {
    width: 96px;
    height: 96px;
    filter: drop-shadow(0 6px 18px rgba(124, 196, 255, 0.35));
  }

  .hero .cond {
    font-size: 20px;
    font-weight: 500;
    color: var(--text);
  }

  .hero .range {
    margin-top: 6px;
    font-size: 15px;
    color: var(--text-dim);
  }

  .temps {
    display: flex;
    align-items: baseline;
    gap: 28px;
    margin-top: 34px;
  }

  .temp-block .label {
    font-size: 12px;
    letter-spacing: 2px;
    text-transform: uppercase;
    color: var(--text-dim);
    margin-bottom: 6px;
  }

  .temp-block .value {
    font-size: 64px;
    font-weight: 250;
    letter-spacing: -2px;
    font-variant-numeric: tabular-nums;
  }

  .temp-block.max .value { color: var(--accent-warm); }
  .temp-block.min .value { color: var(--accent); }

  .divider {
    height: 1px;
    background: linear-gradient(90deg, transparent, rgba(255,255,255,0.18), transparent);
    margin: 34px 0 26px;
  }

  .hourly-title {
    font-size: 12px;
    letter-spacing: 2px;
    text-transform: uppercase;
    color: var(--text-dim);
    margin-bottom: 16px;
  }

  .hourly {
    display: flex;
    gap: 6px;
    overflow-x: auto;
    padding-bottom: 10px;
    scrollbar-width: thin;
    scrollbar-color: rgba(255,255,255,0.25) transparent;
  }

  .hour {
    flex: 0 0 auto;
    min-width: 58px;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 8px;
    padding: 12px 6px 10px;
    border-radius: 14px;
    background: rgba(255, 255, 255, 0.045);
    border: 1px solid rgba(255, 255, 255, 0.06);
    transition: background 0.2s, transform 0.2s;
  }

  .hour:hover {
    background: rgba(255, 255, 255, 0.10);
    transform: translateY(-2px);
  }

  .hour .h-time {
    font-size: 11px;
    color: var(--text-dim);
    letter-spacing: 0.5px;
  }

  .hour .h-bar-wrap {
    width: 6px;
    height: 64px;
    border-radius: 3px;
    background: rgba(255, 255, 255, 0.08);
    display: flex;
    align-items: flex-end;
    overflow: hidden;
  }

  .hour .h-bar {
    width: 100%;
    border-radius: 3px;
    background: linear-gradient(180deg, var(--accent-warm), var(--accent));
    animation: grow 0.8s cubic-bezier(0.2, 0.8, 0.25, 1) both;
  }

  @keyframes grow {
    from { height: 0 !important; }
  }

  .hour .h-temp {
    font-size: 13px;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
  }

  .state {
    text-align: center;
    padding: 70px 0;
  }

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

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

  .state p { color: var(--text-dim); font-size: 16px; }

  .state.error .err-icon {
    font-size: 44px;
    margin-bottom: 14px;
  }

  .state.error h2 {
    font-size: 22px;
    font-weight: 600;
    margin-bottom: 8px;
  }

  .hidden { display: none !important; }
</style>
</head>
<body>

<canvas class="stars" id="stars"></canvas>

<div class="card">
  <div id="loading" class="state">
    <div class="spinner"></div>
    <p>Loading weather data…</p>
  </div>

  <div id="error" class="state error hidden">
    <div class="err-icon">⚠️</div>
    <h2>Weather data could not be loaded</h2>
    <p id="error-msg">Please try again later.</p>
  </div>

  <div id="content" class="hidden">
    <div class="top">
      <div class="place">
        <h1 id="loc-name"></h1>
        <div class="date" id="loc-date"></div>
      </div>
      <div class="hero">
        <div>
          <div class="cond" id="condition"></div>
          <div class="range" id="range"></div>
        </div>
        <svg class="icon" id="icon" viewBox="0 0 100 100" aria-hidden="true"></svg>
      </div>
    </div>

    <div class="temps">
      <div class="temp-block max">
        <div class="label">High</div>
        <div class="value" id="t-max"></div>
      </div>
      <div class="temp-block min">
        <div class="label">Low</div>
        <div class="value" id="t-min"></div>
      </div>
    </div>

    <div class="divider"></div>

    <div class="hourly-title">Hourly temperature (UTC)</div>
    <div class="hourly" id="hourly"></div>
  </div>
</div>

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

  /* ---------- background stars ---------- */
  var canvas = document.getElementById("stars");
  var ctx = canvas.getContext("2d");
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
  for (var i = 0; i < 90; i++) {
    var x = Math.random() * canvas.width;
    var y = Math.random() * canvas.height;
    var r = Math.random() * 1.3 + 0.2;
    ctx.beginPath();
    ctx.arc(x, y, r, 0, Math.PI * 2);
    ctx.fillStyle = "rgba(255,255,255," + (Math.random() * 0.5 + 0.15).toFixed(2) + ")";
    ctx.fill();
  }

  /* ---------- params ---------- */
  var params = new URLSearchParams(window.location.search);
  var lat = parseFloat(params.get("lat"));
  var lon = parseFloat(params.get("lon"));
  if (!isFinite(lat)) lat = 52.52;
  if (!isFinite(lon)) lon = 13.405;
  var name = params.get("name") || "Berlin";

  function todayUTC() {
    var d = new Date();
    return d.toISOString().slice(0, 10);
  }
  var dateStr = params.get("date");
  if (!dateStr || !/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) dateStr = todayUTC();

  /* ---------- weather codes ---------- */
  var WMO = {
    0: ["Clear sky", "sun"],
    1: ["Mainly clear", "sun"],
    2: ["Partly cloudy", "suncloud"],
    3: ["Overcast", "cloud"],
    45: ["Fog", "fog"],
    48: ["Depositing rime fog", "fog"],
    51: ["Light drizzle", "rain"],
    53: ["Moderate drizzle", "rain"],
    55: ["Dense drizzle", "rain"],
    56: ["Light freezing drizzle", "rain"],
    57: ["Dense freezing drizzle", "rain"],
    61: ["Slight rain", "rain"],
    63: ["Moderate rain", "rain"],
    65: ["Heavy rain", "rain"],
    66: ["Light freezing rain", "rain"],
    67: ["Heavy freezing rain", "rain"],
    71: ["Slight snowfall", "snow"],
    73: ["Moderate snowfall", "snow"],
    75: ["Heavy snowfall", "snow"],
    77: ["Snow grains", "snow"],
    80: ["Slight rain showers", "rain"],
    81: ["Moderate rain showers", "rain"],
    82: ["Violent rain showers", "rain"],
    85: ["Slight snow showers", "snow"],
    86: ["Heavy snow showers", "snow"],
    95: ["Thunderstorm", "storm"],
    96: ["Thunderstorm with slight hail", "storm"],
    99: ["Thunderstorm with heavy hail", "storm"]
  };

  var ICONS = {
    sun: '<circle cx="50" cy="50" r="20" fill="#ffd66b"/><g stroke="#ffd66b" stroke-width="5" stroke-linecap="round"><line x1="50" y1="8" x2="50" y2="20"/><line x1="50" y1="80" x2="50" y2="92"/><line x1="8" y1="50" x2="20" y2="50"/><line x1="80" y1="50" x2="92" y2="50"/><line x1="20" y1="20" x2="29" y2="29"/><line x1="71" y1="71" x2="80" y2="80"/><line x1="80" y1="20" x2="71" y2="29"/><line x1="29" y1="71" x2="20" y2="80"/></g>',
    suncloud: '<circle cx="38" cy="38" r="16" fill="#ffd66b"/><g stroke="#ffd66b" stroke-width="4" stroke-linecap="round"><line x1="38" y1="10" x2="38" y2="18"/><line x1="10" y1="38" x2="18" y2="38"/><line x1="18" y1="18" x2="24" y2="24"/><line x1="58" y1="18" x2="52" y2="24"/></g><path d="M34 78a14 14 0 0 1 2-27.8A18 18 0 0 1 70 52a13 13 0 0 1 2 26z" fill="#dfe9f5"/>',
    cloud: '<path d="M28 74a16 16 0 0 1 2-31.8A20 20 0 0 1 69 45a14 14 0 0 1 3 29z" fill="#dfe9f5"/><path d="M28 74a16 16 0 0 1 2-31.8A20 20 0 0 1 69 45" fill="none" stroke="#b9c9dd" stroke-width="2" opacity="0.4"/>',
    fog: '<path d="M30 50a14 14 0 0 1 2-27.8A17 17 0 0 1 65 24a12 12 0 0 1 3 26z" fill="#dfe9f5"/><g stroke="#9fb0cc" stroke-width="5" stroke-linecap="round"><line x1="24" y1="64" x2="76" y2="64"/><line x1="30" y1="76" x2="70" y2="76"/><line x1="36" y1="88" x2="64" y2="88"/></g>',
    rain: '<path d="M28 58a15 15 0 0 1 2-29.8A19 19 0 0 1 68 30a13 13 0 0 1 3 28z" fill="#dfe9f5"/><g stroke="#7cc4ff" stroke-width="5" stroke-linecap="round"><line x1="36" y1="68" x2="32" y2="82"/><line x1="52" y1="68" x2="48" y2="82"/><line x1="68" y1="68" x2="64" y2="82"/></g>',
    snow: '<path d="M28 58a15 15 0 0 1 2-29.8A19 19 0 0 1 68 30a13 13 0 0 1 3 28z" fill="#dfe9f5"/><g fill="#cfe6ff"><circle cx="35" cy="72" r="4"/><circle cx="52" cy="80" r="4"/><circle cx="68" cy="72" r="4"/></g>',
    storm: '<path d="M28 54a15 15 0 0 1 2-29.8A19 19 0 0 1 68 26a13 13 0 0 1 3 28z" fill="#dfe9f5"/><polygon points="52,58 40,78 50,78 44,94 62,70 52,70 58,58" fill="#ffd66b"/>'
  };

  /* ---------- fetch ---------- */
  var isPast = dateStr < todayUTC();
  var endpoint = isPast ? "/api/om/archive" : "/api/om/forecast";
  var qs = new URLSearchParams({
    latitude: lat,
    longitude: lon,
    daily: "temperature_2m_max,temperature_2m_min,weather_code",
    hourly: "temperature_2m",
    timezone: "UTC",
    temperature_unit: "celsius",
    start_date: dateStr,
    end_date: dateStr
  });

  function show(id) {
    ["loading", "error", "content"].forEach(function (s) {
      document.getElementById(s).classList.toggle("hidden", s !== id);
    });
  }

  function fail(msg) {
    document.getElementById("error-msg").textContent = msg || "Please try again later.";
    show("error");
  }

  function fmtDate(s) {
    var parts = s.split("-");
    var d = new Date(Date.UTC(+parts[0], +parts[1] - 1, +parts[2]));
    return d.toLocaleDateString("en-US", {
      weekday: "long", year: "numeric", month: "long", day: "numeric", timeZone: "UTC"
    });
  }

  function round1(v) {
    return (Math.round(v * 10) / 10).toFixed(1).replace(/\.0$/, "");
  }

  fetch(endpoint + "?" + qs.toString())
    .then(function (res) {
      if (!res.ok) throw new Error("Server responded with status " + res.status);
      return res.json();
    })
    .then(function (data) {
      var daily = data && data.daily;
      var hourly = data && data.hourly;
      if (!daily || !daily.time || !daily.time.length ||
          !hourly || !hourly.time || !hourly.time.length) {
        throw new Error("No weather data available for this date.");
      }

      var tMax = daily.temperature_2m_max[0];
      var tMin = daily.temperature_2m_min[0];
      var code = daily.weather_code[0];
      if (tMax == null || tMin == null) {
        throw new Error("No weather data available for this date.");
      }

      var wmo = WMO[code] || ["Unknown conditions", "cloud"];

      document.getElementById("loc-name").textContent = name;
      document.getElementById("loc-date").textContent = fmtDate(dateStr) + " · UTC";
      document.getElementById("condition").textContent = wmo[0];
      document.getElementById("t-max").textContent = round1(tMax) + "°";
      document.getElementById("t-min").textContent = round1(tMin) + "°";
      document.getElementById("range").textContent = round1(tMin) + "° / " + round1(tMax) + "° C";
      document.getElementById("icon").innerHTML = ICONS[wmo[1]];

      var hours = [];
      for (var i = 0; i < hourly.time.length; i++) {
        if (hourly.time[i].slice(0, 10) === dateStr && hourly.temperature_2m[i] != null) {
          hours.push({ t: hourly.time[i].slice(11, 16), v: hourly.temperature_2m[i] });
        }
      }
      if (!hours.length) throw new Error("No hourly data available for this date.");

      var vals = hours.map(function (h) { return h.v; });
      var lo = Math.min.apply(null, vals);
      var hi = Math.max.apply(null, vals);
      var span = Math.max(hi - lo, 0.1);

      var wrap = document.getElementById("hourly");
      hours.forEach(function (h, idx) {
        var pct = 20 + 80 * ((h.v - lo) / span);
        var el = document.createElement("div");
        el.className = "hour";
        el.innerHTML =
          '<span class="h-time">' + h.t + "</span>" +
          '<span class="h-bar-wrap"><span class="h-bar" style="height:' + pct.toFixed(0) +
          "%;animation-delay:" + (idx * 25) + 'ms"></span></span>' +
          '<span class="h-temp">' + round1(h.v) + "°</span>";
        wrap.appendChild(el);
      });

      show("content");
    })
    .catch(function (err) {
      fail(err && err.message ? err.message : "Weather data could not be loaded.");
    });
})();
</script>
</body>
</html>

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

bytes 总计14,304html / css / js1,480 / 4,955 / 7,869
dom 节点37dom 深度8
css 规则40含 js
brightness45.4contrast15.0
colorfulness20.8留白79.6%

该 slot 的 telemetry

prompt tokens2completion tokens6,917
total tokens6,919wall74.2 s
costrequest id
config.json582 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "claude-fable-5-eff-medium--cli--cursor--dev",
  "effort": "medium",
  "family": "claude",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "claude-fable-5",
  "protocol": "cli",
  "served_model": "claude-fable-5-medium",
  "telemetry": {
    "completion_tokens": 22403,
    "cost_usd": null,
    "prompt_tokens": 8,
    "total_tokens": 22411,
    "wall_ms": 253887
  },
  "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": "claude-fable-5-eff-medium--cli--cursor--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-08-12T19:32:07.049173+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-12T19:31:22.730336+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-12T19:33:24.946153+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-12T19:32:10.789717+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-12T19:35:00.616410+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-12T19:33:28.438585+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-12T19:35:47.209321+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-08-12T19:35:03.968070+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
    }
  }
}