claude-sonnet-5 @ medium · CC

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

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

similarity 邻居

限于 session 2026-07-19--unified

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

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

  • namematch
  • conditionmatch
  • datematch
  • max tempambiguous展示值:17max-equals-min
  • min tempambiguous展示值:17max-equals-min
  • 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">
<title>Weather</title>
<meta name="viewport" content="width=1280, height=800">
<style>
  :root {
    color-scheme: light;
  }
  * { box-sizing: border-box; }
  html, body {
    margin: 0;
    padding: 0;
    width: 1280px;
    height: 800px;
    overflow: hidden;
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  }
  body {
    display: flex;
    align-items: center;
    justify-content: center;
    background: linear-gradient(135deg, #1e3c72 0%, #2a5298 45%, #4f80c9 100%);
    position: relative;
  }

  /* soft decorative glow blobs */
  body::before, body::after {
    content: "";
    position: absolute;
    border-radius: 50%;
    filter: blur(60px);
    opacity: 0.35;
    pointer-events: none;
  }
  body::before {
    width: 420px; height: 420px;
    background: #ffd27a;
    top: -120px; left: -100px;
  }
  body::after {
    width: 360px; height: 360px;
    background: #7ad7ff;
    bottom: -140px; right: -80px;
  }

  .card {
    position: relative;
    width: 960px;
    height: 620px;
    background: rgba(255, 255, 255, 0.10);
    border: 1px solid rgba(255, 255, 255, 0.25);
    border-radius: 28px;
    backdrop-filter: blur(18px);
    -webkit-backdrop-filter: blur(18px);
    box-shadow: 0 30px 80px rgba(0, 0, 0, 0.35), inset 0 1px 0 rgba(255,255,255,0.3);
    color: #ffffff;
    padding: 44px 56px;
    display: flex;
    flex-direction: column;
    gap: 28px;
  }

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

  .location {
    font-size: 34px;
    font-weight: 700;
    letter-spacing: 0.3px;
  }

  .date {
    margin-top: 6px;
    font-size: 16px;
    font-weight: 400;
    color: rgba(255,255,255,0.75);
    text-transform: uppercase;
    letter-spacing: 1.5px;
  }

  .icon-wrap {
    text-align: right;
  }

  .icon {
    font-size: 72px;
    line-height: 1;
    filter: drop-shadow(0 8px 18px rgba(0,0,0,0.25));
  }

  .condition {
    margin-top: 6px;
    font-size: 16px;
    color: rgba(255,255,255,0.85);
    font-weight: 500;
  }

  .main-temps {
    display: flex;
    align-items: baseline;
    gap: 40px;
    padding: 10px 0 4px;
    border-top: 1px solid rgba(255,255,255,0.18);
    border-bottom: 1px solid rgba(255,255,255,0.18);
  }

  .temp-block {
    display: flex;
    flex-direction: column;
  }

  .temp-label {
    font-size: 13px;
    text-transform: uppercase;
    letter-spacing: 1.2px;
    color: rgba(255,255,255,0.65);
    margin-bottom: 4px;
  }

  .temp-value {
    font-size: 56px;
    font-weight: 700;
    line-height: 1;
  }

  .temp-value.max { color: #ffcf7a; }
  .temp-value.min { color: #9fd7ff; }

  .temp-value sup {
    font-size: 22px;
    font-weight: 500;
    margin-left: 2px;
  }

  .hourly-section {
    flex: 1;
    display: flex;
    flex-direction: column;
    min-height: 0;
  }

  .hourly-title {
    font-size: 13px;
    text-transform: uppercase;
    letter-spacing: 1.2px;
    color: rgba(255,255,255,0.65);
    margin-bottom: 14px;
  }

  .hourly-scroll {
    flex: 1;
    display: flex;
    align-items: flex-end;
    gap: 10px;
    overflow-x: auto;
    padding-bottom: 6px;
  }

  .hourly-scroll::-webkit-scrollbar { height: 6px; }
  .hourly-scroll::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.3); border-radius: 3px; }
  .hourly-scroll::-webkit-scrollbar-track { background: transparent; }

  .hour-item {
    flex: 0 0 auto;
    width: 46px;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 8px;
  }

  .hour-temp {
    font-size: 14px;
    font-weight: 600;
    color: #fff;
  }

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

  .hour-bar {
    width: 100%;
    border-radius: 6px;
    background: linear-gradient(180deg, #ffd27a 0%, #7ad7ff 100%);
  }

  .hour-label {
    font-size: 12px;
    color: rgba(255,255,255,0.6);
  }

  .state-message {
    display: flex;
    align-items: center;
    justify-content: center;
    flex: 1;
    font-size: 18px;
    color: rgba(255,255,255,0.85);
    text-align: center;
    padding: 0 40px;
  }

  .state-message.error {
    color: #ffb4b4;
  }

  .spinner {
    width: 34px;
    height: 34px;
    border-radius: 50%;
    border: 3px solid rgba(255,255,255,0.25);
    border-top-color: #fff;
    animation: spin 0.9s linear infinite;
    margin-right: 14px;
  }

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

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

<div class="card">
  <div id="loadingState" class="state-message">
    <div class="spinner"></div>
    <span>Loading weather data…</span>
  </div>

  <div id="errorState" class="state-message error hidden">
    Unable to load weather data. Please try again later.
  </div>

  <div id="content" class="hidden" style="display:flex; flex-direction:column; gap:28px; height:100%;">
    <div class="top">
      <div>
        <div class="location" id="locationName"></div>
        <div class="date" id="dateLabel"></div>
      </div>
      <div class="icon-wrap">
        <div class="icon" id="weatherIcon">☀️</div>
        <div class="condition" id="weatherCondition"></div>
      </div>
    </div>

    <div class="main-temps">
      <div class="temp-block">
        <div class="temp-label">High</div>
        <div class="temp-value max" id="tempMax">--<sup>°C</sup></div>
      </div>
      <div class="temp-block">
        <div class="temp-label">Low</div>
        <div class="temp-value min" id="tempMin">--<sup>°C</sup></div>
      </div>
    </div>

    <div class="hourly-section">
      <div class="hourly-title">Hourly Temperature</div>
      <div class="hourly-scroll" id="hourlyScroll"></div>
    </div>
  </div>
</div>

<script>
(function () {
  const WEATHER_CODES = {
    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 hail", "⛈️"],
    99: ["Thunderstorm with heavy hail", "⛈️"]
  };

  function getWeatherInfo(code) {
    return WEATHER_CODES[code] || ["Unknown", "🌡️"];
  }

  function todayUTC() {
    const now = new Date();
    return now.toISOString().slice(0, 10);
  }

  function getParams() {
    const params = new URLSearchParams(window.location.search);
    const lat = parseFloat(params.get("lat"));
    const lon = parseFloat(params.get("lon"));
    return {
      lat: Number.isFinite(lat) ? lat : 52.52,
      lon: Number.isFinite(lon) ? lon : 13.405,
      name: params.get("name") || "Berlin",
      date: params.get("date") || todayUTC()
    };
  }

  function formatDateLabel(dateStr) {
    const [y, m, d] = dateStr.split("-").map(Number);
    const dt = new Date(Date.UTC(y, m - 1, d));
    return dt.toLocaleDateString("en-US", {
      weekday: "long",
      year: "numeric",
      month: "long",
      day: "numeric",
      timeZone: "UTC"
    });
  }

  function formatHourLabel(isoHour) {
    const hour = parseInt(isoHour.split("T")[1].split(":")[0], 10);
    if (hour === 0) return "12A";
    if (hour === 12) return "12P";
    return hour > 12 ? (hour - 12) + "P" : hour + "A";
  }

  function showError() {
    document.getElementById("loadingState").classList.add("hidden");
    document.getElementById("errorState").classList.remove("hidden");
  }

  async function fetchWeather(p) {
    const isPast = p.date < todayUTC();
    const base = isPast ? "/api/om/archive" : "/api/om/forecast";
    const url = new URL(base, window.location.origin);
    url.searchParams.set("latitude", p.lat);
    url.searchParams.set("longitude", p.lon);
    url.searchParams.set("daily", "temperature_2m_max,temperature_2m_min,weather_code");
    url.searchParams.set("hourly", "temperature_2m");
    url.searchParams.set("timezone", "UTC");
    url.searchParams.set("temperature_unit", "celsius");
    url.searchParams.set("start_date", p.date);
    url.searchParams.set("end_date", p.date);

    const res = await fetch(url.toString());
    if (!res.ok) throw new Error("Bad response: " + res.status);
    const data = await res.json();
    if (!data || !data.daily || !data.hourly) throw new Error("Malformed data");
    return data;
  }

  function render(p, data) {
    const idx = data.daily.time.indexOf(p.date);
    if (idx === -1) throw new Error("Date not found in daily data");

    const tempMax = data.daily.temperature_2m_max[idx];
    const tempMin = data.daily.temperature_2m_min[idx];
    const code = data.daily.weather_code[idx];
    const [condText, icon] = getWeatherInfo(code);

    document.getElementById("locationName").textContent = p.name;
    document.getElementById("dateLabel").textContent = formatDateLabel(p.date);
    document.getElementById("weatherIcon").textContent = icon;
    document.getElementById("weatherCondition").textContent = condText;
    document.getElementById("tempMax").innerHTML = Math.round(tempMax) + "<sup>°C</sup>";
    document.getElementById("tempMin").innerHTML = Math.round(tempMin) + "<sup>°C</sup>";

    const hourlyScroll = document.getElementById("hourlyScroll");
    hourlyScroll.innerHTML = "";

    const times = data.hourly.time;
    const temps = data.hourly.temperature_2m;
    const dayIndices = [];
    for (let i = 0; i < times.length; i++) {
      if (times[i].startsWith(p.date)) dayIndices.push(i);
    }

    if (dayIndices.length === 0) throw new Error("No hourly data for date");

    const dayTemps = dayIndices.map(i => temps[i]);
    const maxT = Math.max(...dayTemps);
    const minT = Math.min(...dayTemps);
    const range = Math.max(maxT - minT, 1);

    dayIndices.forEach(i => {
      const t = temps[i];
      const heightPct = 15 + ((t - minT) / range) * 85;
      const item = document.createElement("div");
      item.className = "hour-item";
      item.innerHTML = `
        <div class="hour-temp">${Math.round(t)}°</div>
        <div class="hour-bar-wrap"><div class="hour-bar" style="height:${heightPct}%"></div></div>
        <div class="hour-label">${formatHourLabel(times[i])}</div>
      `;
      hourlyScroll.appendChild(item);
    });

    document.getElementById("loadingState").classList.add("hidden");
    document.getElementById("content").classList.remove("hidden");
  }

  async function init() {
    const p = getParams();
    try {
      const data = await fetchWeather(p);
      render(p, data);
    } catch (err) {
      showError();
    }
  }

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

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

bytes 总计11,538html / css / js1,442 / 4,515 / 5,581
dom 节点33dom 深度8
css 规则38含 js
brightness100.7contrast21.3
colorfulness49.7留白40.7%

该 slot 的 telemetry

prompt tokens4completion tokens5,647
total tokens5,651wall45.3 s
costrequest id
config.json578 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "claude-sonnet-5-eff-medium--cli--claude-code--dev",
  "effort": "medium",
  "family": "claude",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "claude-sonnet-5",
  "protocol": "cli",
  "served_model": "claude-sonnet-5",
  "telemetry": {
    "completion_tokens": 23437,
    "cost_usd": null,
    "prompt_tokens": 16,
    "total_tokens": 23453,
    "wall_ms": 188064
  },
  "transport": "claude-code-cli-headless",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-07-17--dev-cc-sonnet5",
  "config_id": "claude-sonnet-5-eff-medium--cli--claude-code--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-17T14:46:52.557527+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T14:45:50.928625+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-07-17T14:47:41.427598+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T14:46:56.114222+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-07-17T14:48:28.431934+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T14:47:45.312849+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-07-17T14:49:10.265359+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T14:48:32.258496+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
    }
  }
}