glm-5.2 · go

go
config
glm-5.2--opencode-go--dev
batch
2026-07-19--unified
transport
opencode-go-gateway
protocol
api · plan
served model
glm-5.2
captured
Jul 18, 2026, 11:54 AM · N=2
variant
live
slot 0 · P-q · sandboxed iframe
glm-5.2 · go 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 neighbors

within session 2026-07-19--unified

similarity measures convergence within this session — not quality.

Fidelity — does the card show the right data?

  • namematch
  • conditionmatch
  • datematch
  • max tempmismatchshown: 13.4
  • min tempmismatchshown: 52.52
  • hourlymismatchcoverage 0/24 · 0 match · 3 mismatch · 21 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">
<title>Weather</title>
<style>
  * { margin: 0; padding: 0; box-sizing: border-box; }
  html, body { width: 100%; height: 100%; overflow: hidden; }
  body {
    font-family: -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
    background: #070b18;
    color: #e8ecf5;
    display: flex;
    align-items: center;
    justify-content: center;
    position: relative;
  }

  /* Ambient background */
  .bg-layer {
    position: absolute;
    inset: 0;
    overflow: hidden;
    z-index: 0;
  }
  .blob {
    position: absolute;
    border-radius: 50%;
    filter: blur(90px);
    opacity: 0.55;
    animation: drift 22s ease-in-out infinite alternate;
  }
  .blob.b1 { width: 520px; height: 520px; background: #1b3a6b; top: -120px; left: -100px; }
  .blob.b2 { width: 460px; height: 460px; background: #2a6b8f; bottom: -160px; right: -120px; animation-delay: -8s; }
  .blob.b3 { width: 380px; height: 380px; background: #c95d3a; top: 40%; left: 55%; opacity: 0.25; animation-delay: -14s; }
  @keyframes drift {
    0%   { transform: translate(0,0) scale(1); }
    100% { transform: translate(40px,-30px) scale(1.1); }
  }
  .grain {
    position: absolute; inset: 0;
    background-image:
      radial-gradient(rgba(255,255,255,0.04) 1px, transparent 1px);
    background-size: 3px 3px;
    opacity: 0.6;
    mix-blend-mode: overlay;
    pointer-events: none;
  }

  /* Card */
  .card {
    position: relative;
    z-index: 1;
    width: 1120px;
    min-height: 660px;
    backdrop-filter: blur(28px) saturate(140%);
    -webkit-backdrop-filter: blur(28px) saturate(140%);
    background: linear-gradient(160deg, rgba(28,36,58,0.72), rgba(14,20,38,0.72));
    border: 1px solid rgba(255,255,255,0.08);
    border-radius: 32px;
    box-shadow:
      0 30px 80px rgba(0,0,0,0.55),
      inset 0 1px 0 rgba(255,255,255,0.06);
    padding: 48px 56px 44px;
    display: grid;
    grid-template-rows: auto auto 1fr auto;
    gap: 26px;
  }

  /* Header row */
  .head {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
  }
  .head-left .eyebrow {
    font-size: 11px;
    letter-spacing: 0.32em;
    text-transform: uppercase;
    color: #7d89a8;
    margin-bottom: 10px;
  }
  .head-left h1 {
    font-size: 38px;
    font-weight: 300;
    letter-spacing: -0.01em;
    color: #fff;
    line-height: 1.05;
  }
  .head-left h1 .thin { color: #9aa4c0; font-weight: 200; }
  .head-right {
    text-align: right;
  }
  .head-right .date {
    font-size: 15px;
    color: #d8def0;
    font-variant-numeric: tabular-nums;
    letter-spacing: 0.02em;
  }
  .head-right .weekday {
    font-size: 11px;
    letter-spacing: 0.32em;
    text-transform: uppercase;
    color: #7d89a8;
    margin-top: 6px;
  }

  /* Main reading */
  .reading {
    display: grid;
    grid-template-columns: 1.1fr 1fr;
    gap: 32px;
    align-items: center;
    padding: 8px 0 4px;
    border-top: 1px solid rgba(255,255,255,0.06);
    border-bottom: 1px solid rgba(255,255,255,0.06);
    padding-top: 28px;
    padding-bottom: 28px;
  }
  .hero {
    display: flex;
    align-items: center;
    gap: 28px;
  }
  .glyph {
    width: 116px;
    height: 116px;
    flex-shrink: 0;
  }
  .hero-text .temp {
    font-size: 92px;
    font-weight: 200;
    line-height: 0.9;
    letter-spacing: -0.04em;
    color: #fff;
    font-variant-numeric: tabular-nums;
  }
  .hero-text .temp .deg {
    font-size: 48px;
    vertical-align: top;
    color: #9aa4c0;
    margin-left: 4px;
    font-weight: 200;
  }
  .hero-text .condition {
    margin-top: 14px;
    font-size: 17px;
    color: #d8def0;
    letter-spacing: 0.02em;
  }
  .hero-text .feels {
    margin-top: 4px;
    font-size: 12px;
    color: #7d89a8;
    letter-spacing: 0.1em;
    text-transform: uppercase;
  }

  .extremes {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 16px;
  }
  .extreme {
    padding: 18px 22px;
    background: rgba(255,255,255,0.03);
    border: 1px solid rgba(255,255,255,0.06);
    border-radius: 18px;
  }
  .extreme .label {
    font-size: 11px;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: #7d89a8;
    display: flex;
    align-items: center;
    gap: 8px;
  }
  .extreme .label .arr { font-size: 14px; line-height: 1; }
  .extreme.hi .arr { color: #f0a35e; }
  .extreme.lo .arr { color: #6fb8d8; }
  .extreme .val {
    margin-top: 10px;
    font-size: 38px;
    font-weight: 300;
    color: #fff;
    font-variant-numeric: tabular-nums;
    letter-spacing: -0.02em;
  }
  .extreme .val .u {
    font-size: 18px;
    color: #9aa4c0;
    margin-left: 2px;
  }
  .extreme .sub {
    margin-top: 4px;
    font-size: 11px;
    color: #7d89a8;
    letter-spacing: 0.06em;
  }

  /* Hourly chart */
  .chart-block {
    display: grid;
    grid-template-rows: auto 1fr;
    gap: 14px;
  }
  .chart-head {
    display: flex;
    justify-content: space-between;
    align-items: center;
  }
  .chart-title {
    font-size: 11px;
    letter-spacing: 0.32em;
    text-transform: uppercase;
    color: #7d89a8;
  }
  .legend {
    display: flex;
    gap: 22px;
    font-size: 11px;
    color: #9aa4c0;
    letter-spacing: 0.06em;
  }
  .legend span { display: flex; align-items: center; gap: 7px; }
  .legend i {
    display: inline-block;
    width: 10px; height: 10px;
    border-radius: 10px;
  }
  .legend .dot-hi { background: #f0a35e; }
  .legend .dot-lo { background: #6fb8d8; }
  .legend .dot-avg { background: #c9d0e6; }

  .chart-wrap {
    position: relative;
    width: 100%;
    height: 220px;
  }
  #chart { width: 100%; height: 100%; display: block; }

  .foot {
    display: flex;
    justify-content: space-between;
    align-items: center;
    font-size: 11px;
    color: #6c7796;
    letter-spacing: 0.18em;
    text-transform: uppercase;
  }
  .foot .pulse {
    display: inline-flex;
    align-items: center;
    gap: 8px;
  }
  .pulse i {
    width: 7px; height: 7px;
    border-radius: 50%;
    background: #4ade80;
    box-shadow: 0 0 10px #4ade80;
    animation: blink 1.6s ease-in-out infinite;
  }
  @keyframes blink { 0%,100%{opacity:1} 50%{opacity:0.3} }

  /* Error state */
  .error {
    position: relative;
    z-index: 1;
    width: 560px;
    max-width: 92vw;
    backdrop-filter: blur(28px);
    background: linear-gradient(160deg, rgba(40,22,28,0.72), rgba(20,16,22,0.72));
    border: 1px solid rgba(255,120,120,0.18);
    border-radius: 24px;
    padding: 44px 40px;
    text-align: center;
    box-shadow: 0 30px 80px rgba(0,0,0,0.55);
  }
  .error h2 {
    font-size: 22px;
    font-weight: 300;
    color: #ffd8d8;
    margin-bottom: 12px;
    letter-spacing: 0.02em;
  }
  .error p {
    font-size: 13px;
    color: #b69;
    line-height: 1.6;
    letter-spacing: 0.04em;
  }
  .error .mark {
    width: 56px; height: 56px;
    border-radius: 50%;
    border: 1.5px solid rgba(255,150,150,0.4);
    margin: 0 auto 22px;
    display: flex; align-items: center; justify-content: center;
    color: #ff9b9b;
    font-size: 26px;
    font-weight: 200;
  }

  .hidden { display: none !important; }
</style>
</head>
<body>
  <div class="bg-layer">
    <div class="blob b1"></div>
    <div class="blob b2"></div>
    <div class="blob b3"></div>
    <div class="grain"></div>
  </div>

  <div id="error" class="error hidden">
    <div class="mark">!</div>
    <h2>We couldn't load the weather</h2>
    <p id="errMsg">The forecast service is unreachable right now. Please check your connection or try again in a moment.</p>
  </div>

  <div id="card" class="card hidden">
    <div class="head">
      <div class="head-left">
        <div class="eyebrow">Atmospheric report</div>
        <h1 id="locName">Berlin <span class="thin">/ Germany</span></h1>
      </div>
      <div class="head-right">
        <div class="date" id="dateStr">—</div>
        <div class="weekday" id="weekday">—</div>
      </div>
    </div>

    <div class="reading">
      <div class="hero">
        <svg class="glyph" id="glyph" viewBox="0 0 116 116"></svg>
        <div class="hero-text">
          <div class="temp" id="refTemp">—<span class="deg">°</span></div>
          <div class="condition" id="condition">—</div>
          <div class="feels" id="feels">midday reference</div>
        </div>
      </div>
      <div class="extremes">
        <div class="extreme hi">
          <div class="label"><span class="arr">↑</span> High</div>
          <div class="val"><span id="tMax">—</span><span class="u">°C</span></div>
          <div class="sub" id="tMaxTime">—</div>
        </div>
        <div class="extreme lo">
          <div class="label"><span class="arr">↓</span> Low</div>
          <div class="val"><span id="tMin">—</span><span class="u">°C</span></div>
          <div class="sub" id="tMinTime">—</div>
        </div>
      </div>
    </div>

    <div class="chart-block">
      <div class="chart-head">
        <div class="chart-title">Hourly temperature · 24h</div>
        <div class="legend">
          <span><i class="dot-hi"></i> daily high</span>
          <span><i class="dot-lo"></i> daily low</span>
          <span><i class="dot-avg"></i> hourly</span>
        </div>
      </div>
      <div class="chart-wrap">
        <svg id="chart" viewBox="0 0 1000 220" preserveAspectRatio="none"></svg>
      </div>
    </div>

    <div class="foot">
      <span class="pulse"><i></i> Live · Open-Meteo compatible</span>
      <span id="coord">— · —</span>
    </div>
  </div>

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

  // --- Parse parameters ---
  var params = new URLSearchParams(location.search);
  var lat = parseFloat(params.get("lat"));
  var lon = parseFloat(params.get("lon"));
  var name = params.get("name");
  var dateStr = params.get("date");

  if (isNaN(lat)) lat = 52.52;
  if (isNaN(lon)) lon = 13.405;
  if (!name) name = "Berlin";

  function todayUTC() {
    var d = new Date();
    var y = d.getUTCFullYear();
    var m = ("0" + (d.getUTCMonth() + 1)).slice(-2);
    var day = ("0" + d.getUTCDate()).slice(-2);
    return y + "-" + m + "-" + day;
  }
  if (!dateStr || !/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) dateStr = todayUTC();

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

  // --- Decide endpoint (past date -> archive, else forecast) ---
  var today = todayUTC();
  var isPast = dateStr < today;
  var endpoint = isPast ? "/api/om/archive" : "/api/om/forecast";

  var qs = new URLSearchParams({
    latitude: lat.toFixed(4),
    longitude: lon.toFixed(4),
    daily: "temperature_2m_max,temperature_2m_min,weather_code",
    hourly: "temperature_2m",
    timezone: "UTC",
    temperature_unit: "celsius",
    start_date: dateStr,
    end_date: dateStr
  });

  // --- DOM refs ---
  var card = document.getElementById("card");
  var errorBox = document.getElementById("error");
  var errMsg = document.getElementById("errMsg");

  function fail(msg) {
    card.classList.add("hidden");
    errorBox.classList.remove("hidden");
    errMsg.textContent = msg;
  }

  function fmtDateNice(d) {
    var months = ["January","February","March","April","May","June","July",
      "August","September","October","November","December"];
    var wd = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
    return {
      date: d.getUTCDate() + " " + months[d.getUTCMonth()] + " " + d.getUTCFullYear(),
      weekday: wd[d.getUTCDay()]
    };
  }

  function setName(name) {
    var parts = name.split(",").map(function(s){return s.trim();});
    var main = parts[0];
    var sub = parts.slice(1).join(", ");
    var html = main;
    if (sub) html += ' <span class="thin">/ ' + sub + '</span>';
    else html += ' <span class="thin">/ ' + (lat>=0?"N":"S") + Math.abs(lat).toFixed(2) + '° ' + (lon>=0?"E":"W") + Math.abs(lon).toFixed(2) + '°</span>';
    document.getElementById("locName").innerHTML = html;
  }

  // --- Weather glyph (SVG) ---
  function drawGlyph(kind) {
    var g = document.getElementById("glyph");
    var s = "";
    if (kind === "clear") {
      s += '<circle cx="58" cy="58" r="20" fill="#ffd27a"/>';
      for (var i = 0; i < 12; i++) {
        var a = (i * 30) * Math.PI / 180;
        var x1 = 58 + Math.cos(a) * 32, y1 = 58 + Math.sin(a) * 32;
        var x2 = 58 + Math.cos(a) * 42, y2 = 58 + Math.sin(a) * 42;
        s += '<line x1="'+x1+'" y1="'+y1+'" x2="'+x2+'" y2="'+y2+'" stroke="#ffd27a" stroke-width="2.5" stroke-linecap="round" opacity="0.85"/>';
      }
    } else if (kind === "partly") {
      s += '<circle cx="44" cy="46" r="16" fill="#ffd27a"/>';
      s += '<path d="M 40 70 a 18 18 0 0 1 0 -36 a 22 22 0 0 1 38 6 a 14 14 0 0 1 4 30 z" fill="#cdd4e8"/>';
    } else if (kind === "cloudy" || kind === "fog") {
      s += '<path d="M 30 68 a 18 18 0 0 1 0-36 a 24 24 0 0 1 46 4 a 14 14 0 0 1 4 32 z" fill="#a8b1cd"/>';
      if (kind === "fog") {
        for (var j = 0; j < 3; j++) {
          s += '<line x1="28" y1="'+(78+j*8)+'" x2="86" y2="'+(78+j*8)+'" stroke="#cfd6ea" stroke-width="2" stroke-linecap="round" opacity="0.7"/>';
        }
      }
    } else if (kind === "drizzle" || kind === "rain") {
      s += '<path d="M 30 60 a 18 18 0 0 1 0-36 a 24 24 0 0 1 46 4 a 14 14 0 0 1 4 32 z" fill="#7d89aa"/>';
      var drops = kind === "rain" ? 5 : 3;
      for (var k = 0; k < drops; k++) {
        var dx = 38 + k * 11;
        s += '<line x1="'+dx+'" y1="72" x2="'+(dx-3)+'" y2="86" stroke="#6fb8d8" stroke-width="2.2" stroke-linecap="round"/>';
      }
    } else if (kind === "snow") {
      s += '<path d="M 30 60 a 18 18 0 0 1 0-36 a 24 24 0 0 1 46 4 a 14 14 0 0 1 4 32 z" fill="#cdd4e8"/>';
      for (var m = 0; m < 4; m++) {
        var sx = 40 + m * 12;
        s += '<circle cx="'+sx+'" cy="80" r="2.4" fill="#fff"/>';
      }
    } else if (kind === "storm") {
      s += '<path d="M 30 56 a 18 18 0 0 1 0-36 a 24 24 0 0 1 46 4 a 14 14 0 0 1 4 32 z" fill="#5a627d"/>';
      s += '<path d="M 56 66 L 48 82 L 56 82 L 50 96 L 70 76 L 60 76 L 66 66 Z" fill="#ffd27a"/>';
    }
    g.innerHTML = s;
  }

  // --- Build chart ---
  function buildChart(hours, temps, tMax, tMin) {
    var svg = document.getElementById("chart");
    var W = 1000, H = 220, padL = 56, padR = 20, padT = 22, padB = 40;
    var cw = W - padL - padR;
    var ch = H - padT - padB;

    var minT = Math.min.apply(null, temps);
    var maxT = Math.max.apply(null, temps);
    var range = (maxT - minT) || 1;
    // pad range a bit
    var pmin = minT - range * 0.18;
    var pmax = maxT + range * 0.18;
    var pr = pmax - pmin;

    var xOf = function(i) { return padL + (cw * i / (temps.length - 1)); };
    var yOf = function(v) { return padT + ch * (1 - (v - pmin) / pr); };

    // Path
    var pts = temps.map(function(t, i) { return [xOf(i), yOf(t)]; });
    var lineD = pts.map(function(p, i) {
      return (i === 0 ? "M" : "L") + " " + p[0].toFixed(2) + " " + p[1].toFixed(2);
    }).join(" ");
    var areaD = lineD + " L " + pts[pts.length - 1][0].toFixed(2) + " " + (padT + ch) +
                " L " + pts[0][0].toFixed(2) + " " + (padT + ch) + " Z";

    var s = "";
    s += '<defs>' +
         '<linearGradient id="areaGrad" x1="0" y1="0" x2="0" y2="1">' +
         '<stop offset="0%" stop-color="#f0a35e" stop-opacity="0.42"/>' +
         '<stop offset="100%" stop-color="#f0a35e" stop-opacity="0"/>' +
         '</linearGradient>' +
         '<linearGradient id="lineGrad" x1="0" y1="0" x2="1" y2="0">' +
         '<stop offset="0%" stop-color="#6fb8d8"/>' +
         '<stop offset="100%" stop-color="#f0a35e"/>' +
         '</linearGradient>' +
         '</defs>';

    // Y grid + labels
    var steps = 4;
    for (var i = 0; i <= steps; i++) {
      var v = pmin + (pr * i / steps);
      var y = padT + ch * (1 - i / steps);
      s += '<line x1="'+padL+'" y1="'+y+'" x2="'+(W-padR)+'" y2="'+y+'" stroke="rgba(255,255,255,0.05)" stroke-width="1"/>';
      s += '<text x="'+(padL-10)+'" y="'+(y+3)+'" text-anchor="end" fill="#6c7796" font-size="10" font-family="inherit" letter-spacing="0.06em">'+ Math.round(v) + '°</text>';
    }

    // X labels (every 3h)
    for (var h = 0; h < hours.length; h += 3) {
      var x = xOf(h);
      var label = ("0" + hours[h]).slice(-2);
      s += '<text x="'+x+'" y="'+(H-padB+18)+'" text-anchor="middle" fill="#6c7796" font-size="10" font-family="inherit" letter-spacing="0.06em">'+label+'</text>';
    }

    // High/low reference dashed lines
    s += '<line x1="'+padL+'" y1="'+yOf(tMax)+'" x2="'+(W-padR)+'" y2="'+yOf(tMax)+'" stroke="#f0a35e" stroke-width="1" stroke-dasharray="3 4" opacity="0.45"/>';
    s += '<line x1="'+padL+'" y1="'+yOf(tMin)+'" x2="'+(W-padR)+'" y2="'+yOf(tMin)+'" stroke="#6fb8d8" stroke-width="1" stroke-dasharray="3 4" opacity="0.45"/>';

    // Area + line
    s += '<path d="'+areaD+'" fill="url(#areaGrad)"/>';
    s += '<path d="'+lineD+'" fill="none" stroke="url(#lineGrad)" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"/>';

    // Points - accent the max and min, plus noon reference
    var maxIdx = temps.indexOf(maxT);
    var minIdx = temps.indexOf(tMin);
    var noonIdx = 12;

    for (var pi = 0; pi < pts.length; pi++) {
      var p = pts[pi];
      var isMax = pi === maxIdx;
      var isMin = pi === minIdx;
      var col = (isMax ? "#f0a35e" : (isMin ? "#6fb8d8" : "#c9d0e6"));
      var r = (isMax || isMin) ? 4.5 : 2.5;
      s += '<circle cx="'+p[0]+'" cy="'+p[1]+'" r="'+r+'" fill="'+col+'"/>';
      if (isMax || isMin) {
        var val = temps[pi];
        s += '<text x="'+p[0]+'" y="'+(p[1]-10)+'" text-anchor="middle" fill="'+col+'" font-size="11" font-family="inherit" font-weight="500" letter-spacing="0.04em">'+val.toFixed(1)+'°</text>';
      }
    }

    svg.innerHTML = s;
  }

  // --- Render ---
  function render(data) {
    if (!data || !data.daily || !data.hourly) {
      fail("The data returned by the service did not contain the expected fields.");
      return;
    }
    var d = data.daily;
    var h = data.hourly;

    var tMax = d.temperature_2m_max[0];
    var tMin = d.temperature_2m_min[0];
    var wcode = d.weather_code[0];
    if (tMax === null || tMin === null || wcode === null) {
      fail("Part of the requested data is missing for this date.");
      return;
    }

    var wmo = WMO[wcode] || { label: "Unknown", kind: "cloudy" };

    // Location, date
    setName(name);
    var dd = new Date(dateStr + "T00:00:00Z");
    var nd = fmtDateNice(dd);
    document.getElementById("dateStr").textContent = nd.date;
    document.getElementById("weekday").textContent = nd.weekday;
    document.getElementById("coord").textContent =
      Math.abs(lat).toFixed(3) + (lat>=0?"°N ":"°S ") + Math.abs(lon).toFixed(3) + (lon>=0?"°E":"°W");

    // Reference temp: try noon hour
    var hourLabels = [], temps = [];
    if (h.time && h.temperature_2m) {
      for (var i = 0; i < h.time.length; i++) {
        var hh = h.time[i].indexOf("T") >= 0
          ? parseInt(h.time[i].split("T")[1].slice(0,2), 10)
          : i;
        hourLabels.push(hh);
        temps.push(h.temperature_2m[i]);
      }
    }
    // If only one day returned, should be 24 entries. Sometimes returns fewer for archive; pad with what we have.
    if (temps.length === 0) {
      fail("No hourly temperature values were returned for this date.");
      return;
    }

    // Reference display value: prefer hour 12, else max
    var refIdx = hourLabels.indexOf(12);
    if (refIdx < 0) refIdx = Math.min(temps.length - 1, Math.floor(temps.length / 2));
    var refVal = temps[refIdx];

    document.getElementById("refTemp").innerHTML =
      (refVal >= 0 ? "" : "") + Math.round(refVal) + '<span class="deg">°C</span>';
    document.getElementById("condition").textContent = wmo.label;
    document.getElementById("feels").textContent =
      refIdx + ":00 UTC · reference observation";

    document.getElementById("tMax").textContent = (tMax >= 0 ? "" : "") + tMax.toFixed(1);
    document.getElementById("tMin").textContent = (tMin >= 0 ? "" : "") + tMin.toFixed(1);

    var maxIdx = temps.indexOf(Math.max.apply(null, temps));
    var minIdx = temps.indexOf(Math.min.apply(null, temps));
    var maxHr = hourLabels[maxIdx];
    var minHr = hourLabels[minIdx];
    function hr12(hh) {
      var suf = hh < 12 ? "AM" : "PM";
      var h12 = hh % 12; if (h12 === 0) h12 = 12;
      return ("0"+h12).slice(-2) + ":00 " + suf + " UTC";
    }
    document.getElementById("tMaxTime").textContent = "peak at " + hr12(maxHr);
    document.getElementById("tMinTime").textContent = "trough at " + hr12(minHr);

    drawGlyph(wmo.kind);
    buildChart(hourLabels, temps, tMax, tMin);

    card.classList.remove("hidden");
  }

  // --- Fetch ---
  function load() {
    var url = endpoint + "?" + qs.toString();
    var ctrl = new AbortController();
    var to = setTimeout(function(){ ctrl.abort(); }, 12000);

    fetch(url, { signal: ctrl.signal })
      .then(function(r) {
        clearTimeout(to);
        if (!r.ok) throw new Error("HTTP " + r.status);
        return r.json();
      })
      .then(function(j) {
        try { render(j); }
        catch (e) { fail("We couldn't interpret the data returned for this location and date."); }
      })
      .catch(function(e) {
        var msg;
        if (e.name === "AbortError") msg = "The request timed out and the service did not respond.";
        else msg = "The weather service is unreachable. Verify the location and date, then try again.";
        fail(msg);
      });
  }

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

L1 — cheap deterministic descriptors

bytes total23,150html / css / js2,527 / 7,037 / 13,586
dom nodes64dom depth8
css rules58js presentyes
brightness29.4contrast16.0
colorfulness19.1whitespace87.7%

This slot's telemetry

prompt tokens319completion tokens8,377
total tokens8,696wall233.7 s
costrequest id
config.json529 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_OPENCODE_KEY",
    "method": "oauth"
  },
  "billing": "plan",
  "config_id": "glm-5.2--opencode-go--dev",
  "effort": null,
  "family": "glm",
  "m": {
    "min": 2,
    "q": 1
  },
  "model_id": "glm-5.2",
  "protocol": "api",
  "served_model": "glm-5.2",
  "telemetry": {
    "completion_tokens": 18237,
    "cost_usd": null,
    "prompt_tokens": 941,
    "total_tokens": 19178,
    "wall_ms": 619022
  },
  "transport": "opencode-go-gateway",
  "vendor_sanction_ref": null
}
send-log3.3 KB
{
  "N": 2,
  "batch_id": "2026-07-17--dev-opencode-go",
  "config_id": "glm-5.2--opencode-go--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-20T02:25:43.006009+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-20T02:22:38.008581+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-20T02:29:40.207553+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-20T02:25:46.507232+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-20T02:32:40.861093+00:00",
          "http_status": 200,
          "outcome": "model-failed",
          "reached_model": true,
          "reason": "no-valid-html",
          "request_id": null,
          "started_at": "2026-07-20T02:29:45.270184+00:00"
        }
      ],
      "block_index": 1,
      "model_reaching_attempt_index": 0,
      "slot_index": 1,
      "terminal_state": "model-failed",
      "variant": "P-q"
    },
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": 500,
          "charged": false,
          "ended_at": "2026-07-20T02:33:17.731508+00:00",
          "http_status": 503,
          "outcome": "rate-limited",
          "reached_model": false,
          "reason": "http-503-overloaded",
          "request_id": null,
          "started_at": "2026-07-20T02:32:41.075847+00:00"
        },
        {
          "attempt_index": 1,
          "backoff_ms": 1000,
          "charged": false,
          "ended_at": "2026-07-20T02:34:06.645411+00:00",
          "http_status": 503,
          "outcome": "rate-limited",
          "reached_model": false,
          "reason": "http-503-overloaded",
          "request_id": null,
          "started_at": "2026-07-20T02:33:18.236596+00:00"
        },
        {
          "attempt_index": 2,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-20T02:37:27.986405+00:00",
          "http_status": 200,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-20T02:34:07.649109+00:00"
        }
      ],
      "block_index": 1,
      "model_reaching_attempt_index": 2,
      "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
    }
  }
}