gpt-5.2 @ xhigh · cursor
cursorxhigh
- config
- gpt-5.2-eff-xhigh--cli--cursor--dev
- batch
- 2026-07-19--unified
- transport
- cursor-agent-cli-isolated-home
- protocol
- cli · plan
- served model
- gpt-5.2-xhigh
- captured
- Jul 18, 2026, 11:54 AM · N=2
variant
live
slot 0 · P-q · sandboxed iframe

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 tempmatchshown: 25
- min tempmatchshown: 16
- hourlymismatchcoverage 0/24 · 0 match · 6 mismatch · 18 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=device-width, initial-scale=1" />
<title>Weather</title>
<style>
:root{
--bg0: #070a14;
--bg1: #0b1020;
--bg2: #0d1730;
--text: rgba(255,255,255,.92);
--muted: rgba(255,255,255,.68);
--faint: rgba(255,255,255,.50);
--card: rgba(255,255,255,.065);
--panel: rgba(255,255,255,.060);
--stroke: rgba(255,255,255,.14);
--stroke2: rgba(255,255,255,.10);
--accent: hsl(198 92% 60%);
--accentSoft: hsl(198 92% 60% / 0.26);
--accent2: hsl(265 86% 70%);
--accent2Soft: hsl(265 86% 70% / 0.22);
--shadow: 0 34px 60px rgba(0,0,0,.58);
--shadow2: 0 10px 22px rgba(0,0,0,.38);
--rCard: 26px;
--rPanel: 20px;
--mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, "Apple Color Emoji","Segoe UI Emoji";
}
*{ box-sizing:border-box; }
html,body{ height:100%; }
body{
margin:0;
font-family: var(--sans);
color: var(--text);
background:
radial-gradient(1100px 720px at 18% 14%, var(--accentSoft) 0%, rgba(0,0,0,0) 58%),
radial-gradient(980px 740px at 84% 18%, var(--accent2Soft) 0%, rgba(0,0,0,0) 60%),
radial-gradient(900px 720px at 50% 105%, rgba(255,255,255,.08) 0%, rgba(0,0,0,0) 60%),
linear-gradient(180deg, var(--bg0) 0%, var(--bg1) 38%, var(--bg2) 100%);
display:grid;
place-items:center;
overflow:hidden;
}
body::before{
content:"";
position:fixed;
inset:-40px;
pointer-events:none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160' viewBox='0 0 160 160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='.55'/%3E%3C/svg%3E");
opacity:.10;
mix-blend-mode: overlay;
filter: contrast(120%) brightness(115%);
}
body::after{
content:"";
position:fixed;
inset:-2px;
pointer-events:none;
background:
radial-gradient(1200px 800px at 50% 50%, rgba(0,0,0,0) 55%, rgba(0,0,0,.45) 100%);
opacity:.85;
}
.frame{
width:1280px;
height:800px;
padding:44px;
display:grid;
place-items:center;
position:relative;
z-index:1;
}
.card{
width:1120px;
height:680px;
border-radius: var(--rCard);
background: linear-gradient(180deg, rgba(255,255,255,.085) 0%, rgba(255,255,255,.055) 58%, rgba(255,255,255,.045) 100%);
border: 1px solid var(--stroke);
box-shadow: var(--shadow);
position:relative;
overflow:hidden;
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
}
.card::before{
content:"";
position:absolute;
inset:-2px;
pointer-events:none;
background:
radial-gradient(740px 380px at 16% 6%, var(--accentSoft) 0%, rgba(0,0,0,0) 62%),
radial-gradient(760px 420px at 86% 12%, var(--accent2Soft) 0%, rgba(0,0,0,0) 66%),
linear-gradient(180deg, rgba(255,255,255,.10), rgba(255,255,255,0));
opacity:1;
}
.inner{
height:100%;
display:grid;
grid-template-rows: auto 1fr auto;
position:relative;
z-index:1;
}
.header{
padding:28px 32px 16px;
display:flex;
align-items:flex-start;
justify-content:space-between;
gap:20px;
}
.place-name{
font-weight: 720;
letter-spacing: -0.02em;
font-size: 34px;
line-height: 1.05;
text-shadow: 0 2px 20px rgba(0,0,0,.28);
margin-bottom: 8px;
max-width: 720px;
white-space: nowrap;
overflow:hidden;
text-overflow: ellipsis;
}
.place-meta{
display:flex;
align-items:center;
gap:10px;
color: var(--muted);
font-size: 14px;
letter-spacing: 0.01em;
}
.dot{ opacity:.5; }
.badge{
display:flex;
align-items:center;
gap:10px;
padding:10px 12px;
border-radius: 999px;
border: 1px solid var(--stroke2);
background: rgba(255,255,255,.05);
box-shadow: 0 10px 18px rgba(0,0,0,.22);
color: var(--muted);
font-size: 13px;
letter-spacing: 0.02em;
user-select:none;
}
.badge strong{
color: var(--text);
font-weight: 700;
}
.badge .chip{
width:10px;
height:10px;
border-radius:999px;
background: linear-gradient(135deg, var(--accent), var(--accent2));
box-shadow: 0 0 0 4px rgba(255,255,255,.05);
}
.content{
padding: 6px 32px 18px;
display:grid;
grid-template-columns: 410px 1fr;
gap: 22px;
align-items:stretch;
}
.panel{
background: rgba(255,255,255,.055);
border: 1px solid var(--stroke2);
border-radius: var(--rPanel);
box-shadow: var(--shadow2);
position:relative;
overflow:hidden;
}
.panel::before{
content:"";
position:absolute;
inset:0;
pointer-events:none;
background:
radial-gradient(520px 220px at 10% 0%, rgba(255,255,255,.08), rgba(0,0,0,0) 60%),
linear-gradient(180deg, rgba(255,255,255,.04), rgba(0,0,0,0));
opacity:.85;
}
.panel > *{ position:relative; z-index:1; }
.summary{
padding: 22px 22px 18px;
display:flex;
flex-direction:column;
gap: 16px;
}
.icon-wrap{
display:flex;
align-items:center;
justify-content:center;
height: 180px;
position:relative;
margin-top: 4px;
}
.halo{
position:absolute;
width: 220px;
height: 220px;
border-radius: 999px;
background:
radial-gradient(closest-side, var(--accentSoft), rgba(0,0,0,0) 70%),
radial-gradient(closest-side, var(--accent2Soft), rgba(0,0,0,0) 72%);
filter: blur(2px);
opacity: .95;
transform: translateZ(0);
}
.wx-icon{
width: 160px;
height: 160px;
position:relative;
z-index:2;
--icon-stroke: rgba(255,255,255,.92);
--icon-fill: rgba(255,255,255,.06);
--icon-soft: rgba(255,255,255,.16);
filter: drop-shadow(0 18px 30px rgba(0,0,0,.34));
}
.wx-icon svg{ width:100%; height:100%; display:block; }
.temps{
display:grid;
grid-template-columns: 1fr;
gap: 8px;
padding: 2px 4px 0;
}
.temp-max{
display:flex;
align-items:baseline;
gap:10px;
letter-spacing:-0.03em;
}
.temp-max .value{
font-size: 68px;
font-weight: 780;
line-height: 0.95;
}
.unit{
font-size: 20px;
color: var(--muted);
font-weight: 650;
}
.temp-min{
display:flex;
align-items:baseline;
gap:10px;
color: var(--muted);
font-size: 16px;
letter-spacing: 0.01em;
}
.temp-min .label{
color: var(--faint);
text-transform: uppercase;
letter-spacing: 0.12em;
font-size: 12px;
font-weight: 700;
margin-right: 2px;
}
.temp-min .value{
font-size: 22px;
color: var(--text);
font-weight: 720;
letter-spacing: -0.01em;
}
.condition{
margin-top: 6px;
font-size: 16px;
color: var(--muted);
line-height: 1.35;
}
.fineprint{
margin-top:auto;
padding-top: 10px;
border-top: 1px solid rgba(255,255,255,.08);
display:flex;
justify-content:space-between;
gap:14px;
color: var(--faint);
font-size: 12px;
letter-spacing: 0.02em;
font-family: var(--mono);
}
.hourly{
padding: 18px 18px 16px;
display:flex;
flex-direction:column;
gap: 12px;
}
.hourly-head{
display:flex;
align-items:baseline;
justify-content:space-between;
gap:12px;
padding: 2px 4px 0;
}
.hourly-title{
font-size: 14px;
font-weight: 760;
letter-spacing: 0.08em;
text-transform: uppercase;
color: rgba(255,255,255,.78);
}
.hourly-sub{
font-family: var(--mono);
font-size: 12px;
color: var(--faint);
letter-spacing: 0.02em;
white-space: nowrap;
}
.chart-wrap{
border-radius: 16px;
overflow:hidden;
}
.chart{
width:100%;
height: 230px;
display:block;
}
.hourly-grid{
margin-top: 2px;
display:grid;
grid-template-columns: repeat(8, minmax(0, 1fr));
gap: 10px;
flex:1;
align-content:start;
}
.hour{
position:relative;
border-radius: 14px;
border: 1px solid rgba(255,255,255,.10);
background: rgba(255,255,255,.045);
padding: 10px 10px 9px;
min-height: 62px;
overflow:hidden;
transform: translateZ(0);
}
.hour::before{
content:"";
position:absolute;
inset:0;
pointer-events:none;
background:
linear-gradient(180deg, rgba(255,255,255,.12), rgba(0,0,0,0) 70%),
radial-gradient(140px 80px at 20% 10%, rgba(255,255,255,.08), rgba(0,0,0,0) 70%);
opacity: calc(0.08 + (var(--p, 0.5) * 0.24));
}
.hour::after{
content:"";
position:absolute;
inset:-1px;
pointer-events:none;
background: radial-gradient(120px 80px at 40% 0%, var(--accentSoft), rgba(0,0,0,0) 70%);
opacity: calc(0.05 + (var(--p, 0.5) * 0.10));
mix-blend-mode: screen;
}
.hour:hover{
border-color: rgba(255,255,255,.18);
background: rgba(255,255,255,.055);
}
.hour .h{
font-family: var(--mono);
font-size: 12px;
color: var(--faint);
letter-spacing: 0.02em;
margin-bottom: 7px;
position:relative;
z-index:1;
}
.hour .v{
display:flex;
align-items:baseline;
gap:6px;
font-size: 18px;
font-weight: 760;
letter-spacing: -0.02em;
position:relative;
z-index:1;
}
.hour .v .u{
font-size: 11px;
font-weight: 700;
color: var(--muted);
letter-spacing: 0.06em;
}
.hour.is-max{
border-color: color-mix(in srgb, var(--accent) 60%, rgba(255,255,255,.12));
box-shadow: 0 0 0 1px rgba(255,255,255,.05) inset, 0 16px 26px rgba(0,0,0,.32);
}
.hour.is-min{
border-color: color-mix(in srgb, var(--accent2) 55%, rgba(255,255,255,.12));
box-shadow: 0 0 0 1px rgba(255,255,255,.05) inset, 0 16px 26px rgba(0,0,0,.32);
}
.footer{
padding: 12px 32px 20px;
display:flex;
justify-content:space-between;
align-items:center;
gap: 18px;
border-top: 1px solid rgba(255,255,255,.08);
background: linear-gradient(180deg, rgba(0,0,0,0), rgba(0,0,0,.10));
}
.status{
color: var(--muted);
font-size: 13px;
letter-spacing: 0.01em;
white-space: nowrap;
overflow:hidden;
text-overflow: ellipsis;
max-width: 70%;
}
.foot-right{
color: var(--faint);
font-family: var(--mono);
font-size: 12px;
letter-spacing: 0.02em;
text-align:right;
white-space: nowrap;
}
.error{
grid-column: 1 / -1;
padding: 22px;
display:flex;
flex-direction:column;
gap: 10px;
justify-content:center;
min-height: 420px;
}
.error-title{
font-size: 20px;
font-weight: 760;
letter-spacing: -0.01em;
}
.error-detail{
font-family: var(--mono);
color: var(--muted);
font-size: 12.5px;
line-height: 1.55;
white-space: pre-wrap;
word-break: break-word;
opacity: .98;
}
.error-hint{
color: var(--faint);
font-size: 13px;
line-height: 1.4;
}
.skel{
border-radius: 999px;
}
.is-loading .skel{
color: transparent !important;
background:
linear-gradient(90deg, rgba(255,255,255,.09), rgba(255,255,255,.18), rgba(255,255,255,.09));
background-size: 200% 100%;
animation: shimmer 1.18s linear infinite;
text-shadow:none !important;
}
.is-loading .condition{ color: transparent; }
.is-loading #tMax, .is-loading #tMin{ color: transparent; }
.is-loading .hourly-grid{ opacity:.85; filter:saturate(.9); }
@keyframes shimmer{
0%{ background-position: 200% 0; }
100%{ background-position: -200% 0; }
}
@media (prefers-reduced-motion: reduce){
.is-loading .skel{ animation:none; }
*{ scroll-behavior:auto !important; }
}
noscript{
position:fixed;
inset: 16px;
z-index: 2;
pointer-events:none;
display:flex;
justify-content:center;
align-items:flex-start;
}
.noscript{
pointer-events:auto;
max-width: 880px;
padding: 14px 16px;
border-radius: 14px;
background: rgba(0,0,0,.55);
border: 1px solid rgba(255,255,255,.16);
color: rgba(255,255,255,.90);
font-family: var(--sans);
box-shadow: 0 18px 40px rgba(0,0,0,.55);
}
.noscript strong{ font-weight: 780; }
/* Fallback if color-mix unsupported */
@supports not (color-mix(in srgb, white, black)){
.hour.is-max{ border-color: rgba(125,211,252,.55); }
.hour.is-min{ border-color: rgba(167,139,250,.55); }
}
</style>
</head>
<body>
<div class="frame">
<main class="card is-loading" id="card" role="region" aria-label="Weather card">
<div class="inner">
<header class="header">
<div>
<div class="place-name skel" id="placeName">Berlin</div>
<div class="place-meta">
<span id="dateLabel" class="skel">—</span>
<span class="dot">·</span>
<span id="coordsLabel" class="skel">—</span>
</div>
</div>
<div class="badge" id="badge" aria-label="Data source">
<span class="chip" aria-hidden="true"></span>
<span><strong id="sourceBadge">—</strong> · <span id="tzBadge">UTC</span></span>
</div>
</header>
<section class="content">
<div class="panel summary" id="summaryPanel">
<div class="icon-wrap">
<div class="halo" aria-hidden="true"></div>
<div class="wx-icon" id="iconSlot" aria-hidden="true"></div>
</div>
<div class="temps">
<div class="temp-max">
<span class="value skel" id="tMax">—</span>
<span class="unit">°C</span>
</div>
<div class="temp-min">
<span class="label">Low</span>
<span class="value skel" id="tMin">—</span>
<span class="unit">°C</span>
</div>
<div class="condition" id="condition">Loading…</div>
</div>
<div class="fineprint">
<span id="fineLeft" class="skel">—</span>
<span id="fineRight" class="skel">—</span>
</div>
</div>
<div class="panel hourly" id="hourlyPanel">
<div class="hourly-head">
<div class="hourly-title">Hourly temperature</div>
<div class="hourly-sub" id="hourlySub" class="skel">—</div>
</div>
<div class="chart-wrap">
<svg id="chart" class="chart" viewBox="0 0 720 230" preserveAspectRatio="none" role="img" aria-label="Hourly temperature chart">
<defs>
<linearGradient id="gArea" x1="0" x2="0" y1="0" y2="1">
<stop offset="0%" stop-color="var(--accent)" stop-opacity="0.38"></stop>
<stop offset="100%" stop-color="var(--accent)" stop-opacity="0"></stop>
</linearGradient>
<linearGradient id="gLine" x1="0" x2="1" y1="0" y2="0">
<stop offset="0%" stop-color="var(--accent)"></stop>
<stop offset="100%" stop-color="var(--accent2)"></stop>
</linearGradient>
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
<feGaussianBlur stdDeviation="4" result="b"></feGaussianBlur>
<feColorMatrix type="matrix" values="
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 0.55 0" result="c"></feColorMatrix>
<feMerge>
<feMergeNode in="c"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
</defs>
<rect x="0.5" y="0.5" width="719" height="229" rx="16" ry="16" fill="rgba(255,255,255,0.05)" stroke="rgba(255,255,255,0.10)"></rect>
<g id="chartGrid"></g>
<path id="chartArea" fill="url(#gArea)" d=""></path>
<path id="chartLine" fill="none" stroke="url(#gLine)" stroke-width="3.1" stroke-linecap="round" stroke-linejoin="round" filter="url(#glow)" d=""></path>
<g id="chartDots"></g>
<g id="chartXLabels"></g>
<g id="chartYLabels"></g>
</svg>
</div>
<div class="hourly-grid" id="hourlyGrid" aria-label="Hourly temperatures"></div>
</div>
<div class="panel error" id="errorBox" hidden>
<div class="error-title">Weather data couldn’t be loaded.</div>
<div class="error-detail" id="errorDetail">—</div>
<div class="error-hint">Make sure `lat`, `lon`, and `date` (YYYY-MM-DD) are valid, then refresh.</div>
</div>
</section>
<footer class="footer">
<div class="status" id="status">Loading weather data…</div>
<div class="foot-right">Units: °C · Timezone: UTC</div>
</footer>
</div>
</main>
</div>
<noscript>
<div class="noscript"><strong>Weather data couldn’t be loaded.</strong> JavaScript is required to fetch and render the weather card.</div>
</noscript>
<script>
(() => {
const $ = (id) => document.getElementById(id);
const card = $("card");
const placeNameEl = $("placeName");
const dateLabelEl = $("dateLabel");
const coordsLabelEl = $("coordsLabel");
const sourceBadgeEl = $("sourceBadge");
const tzBadgeEl = $("tzBadge");
const tMaxEl = $("tMax");
const tMinEl = $("tMin");
const conditionEl = $("condition");
const iconSlotEl = $("iconSlot");
const fineLeftEl = $("fineLeft");
const fineRightEl = $("fineRight");
const hourlySubEl = $("hourlySub");
const hourlyGridEl = $("hourlyGrid");
const chartEl = $("chart");
const summaryPanel = $("summaryPanel");
const hourlyPanel = $("hourlyPanel");
const errorBox = $("errorBox");
const errorDetailEl = $("errorDetail");
const statusEl = $("status");
const chartGridG = chartEl.querySelector("#chartGrid");
const chartArea = chartEl.querySelector("#chartArea");
const chartLine = chartEl.querySelector("#chartLine");
const chartDotsG = chartEl.querySelector("#chartDots");
const chartXLabelsG = chartEl.querySelector("#chartXLabels");
const chartYLabelsG = chartEl.querySelector("#chartYLabels");
function clamp(n, lo, hi) { return Math.min(hi, Math.max(lo, n)); }
function parseNumber(raw, def) {
const n = Number(raw);
return Number.isFinite(n) ? n : def;
}
function pad2(n){ return String(n).padStart(2, "0"); }
function utcDateFromIso(iso){
const parts = iso.split("-").map(Number);
if (parts.length !== 3) return new Date(Date.now());
const [y,m,d] = parts;
return new Date(Date.UTC(y, (m||1) - 1, d||1));
}
function formatDateLabel(iso){
const d = utcDateFromIso(iso);
const pretty = new Intl.DateTimeFormat(undefined, {
weekday: "long", year: "numeric", month: "short", day: "2-digit", timeZone: "UTC"
}).format(d);
return `${pretty} · ${iso}`;
}
function wmoInfo(code){
const c = Number(code);
if (c === 0) return { label: "Clear sky", icon: "sun" };
if (c === 1) return { label: "Mostly clear", icon: "sun-cloud" };
if (c === 2) return { label: "Partly cloudy", icon: "sun-cloud" };
if (c === 3) return { label: "Overcast", icon: "cloud" };
if (c === 45 || c === 48) return { label: "Fog", icon: "fog" };
if (c >= 51 && c <= 57) return { label: (c >= 56 ? "Freezing drizzle" : "Drizzle"), icon: "drizzle" };
if (c >= 61 && c <= 67) return { label: (c >= 66 ? "Freezing rain" : "Rain"), icon: "rain" };
if (c >= 71 && c <= 77) return { label: "Snow", icon: "snow" };
if (c >= 80 && c <= 82) return { label: "Rain showers", icon: "showers" };
if (c === 85 || c === 86) return { label: "Snow showers", icon: "snow" };
if (c === 95) return { label: "Thunderstorm", icon: "storm" };
if (c === 96 || c === 99) return { label: "Thunderstorm with hail", icon: "storm" };
if (Number.isFinite(c)) return { label: `Weather code ${c}`, icon: "unknown" };
return { label: "Unknown conditions", icon: "unknown" };
}
function iconSvg(kind){
const svgOpen = `<svg viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg" fill="none">`;
const svgClose = `</svg>`;
const cloudPath = `M20.8 44.8H46.2c5.4 0 9.8-4.1 9.8-9.2 0-4.7-3.7-8.6-8.5-9.1-1.3-7-7.4-12.3-14.9-12.3-6 0-11.2 3.3-13.7 8.1-5.2.6-9.2 4.8-9.2 10 0 6 4.9 10.9 11.1 10.9Z`;
if (kind === "sun"){
return `${svgOpen}
<defs>
<radialGradient id="sunG" cx="50%" cy="45%" r="65%">
<stop offset="0%" stop-color="var(--accent)" stop-opacity="1"/>
<stop offset="100%" stop-color="var(--accent2)" stop-opacity="1"/>
</radialGradient>
</defs>
<circle cx="32" cy="32" r="11.8" fill="url(#sunG)" opacity="0.96"/>
<g stroke="var(--icon-stroke)" stroke-width="3" stroke-linecap="round">
<line x1="32" y1="6.5" x2="32" y2="14"/>
<line x1="32" y1="50" x2="32" y2="57.5"/>
<line x1="6.5" y1="32" x2="14" y2="32"/>
<line x1="50" y1="32" x2="57.5" y2="32"/>
<line x1="13.2" y1="13.2" x2="18.6" y2="18.6"/>
<line x1="45.4" y1="45.4" x2="50.8" y2="50.8"/>
<line x1="45.4" y1="18.6" x2="50.8" y2="13.2"/>
<line x1="13.2" y1="50.8" x2="18.6" y2="45.4"/>
</g>
${svgClose}`;
}
if (kind === "sun-cloud"){
return `${svgOpen}
<defs>
<radialGradient id="scG" cx="40%" cy="38%" r="70%">
<stop offset="0%" stop-color="var(--accent)" stop-opacity="1"/>
<stop offset="100%" stop-color="var(--accent2)" stop-opacity="1"/>
</radialGradient>
</defs>
<circle cx="24" cy="24" r="9.2" fill="url(#scG)" opacity="0.95"/>
<g stroke="var(--icon-stroke)" stroke-width="2.6" stroke-linecap="round" opacity="0.95">
<line x1="24" y1="7" x2="24" y2="11.7"/>
<line x1="24" y1="36.3" x2="24" y2="41"/>
<line x1="7" y1="24" x2="11.7" y2="24"/>
<line x1="36.3" y1="24" x2="41" y2="24"/>
<line x1="12.2" y1="12.2" x2="15.5" y2="15.5"/>
<line x1="32.5" y1="32.5" x2="35.8" y2="35.8"/>
</g>
<path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.8" stroke-linejoin="round" opacity="0.98"/>
${svgClose}`;
}
if (kind === "cloud"){
return `${svgOpen}
<path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="3.0" stroke-linejoin="round" opacity="0.98"/>
<path d="M16 47.5c6.2 3.1 12.4 3.1 18.6 0" stroke="var(--icon-soft)" stroke-width="2.4" stroke-linecap="round" opacity="0.9"/>
${svgClose}`;
}
if (kind === "fog"){
return `${svgOpen}
<path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.9" stroke-linejoin="round" opacity="0.98"/>
<g stroke="var(--icon-soft)" stroke-width="3" stroke-linecap="round" opacity="0.92">
<line x1="14" y1="50" x2="50" y2="50"/>
<line x1="10" y1="56" x2="44" y2="56"/>
</g>
${svgClose}`;
}
if (kind === "drizzle"){
return `${svgOpen}
<path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.9" stroke-linejoin="round" opacity="0.98"/>
<g stroke="var(--accent)" stroke-width="2.8" stroke-linecap="round" opacity="0.95">
<line x1="24" y1="49" x2="21" y2="54"/>
<line x1="34" y1="49" x2="31" y2="54"/>
<line x1="44" y1="49" x2="41" y2="54"/>
</g>
${svgClose}`;
}
if (kind === "rain"){
return `${svgOpen}
<path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.9" stroke-linejoin="round" opacity="0.98"/>
<g stroke="var(--accent)" stroke-width="3" stroke-linecap="round" opacity="0.95">
<line x1="22" y1="48" x2="18" y2="56"/>
<line x1="32" y1="48" x2="28" y2="58"/>
<line x1="42" y1="48" x2="38" y2="56"/>
</g>
${svgClose}`;
}
if (kind === "showers"){
return `${svgOpen}
<path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.9" stroke-linejoin="round" opacity="0.98"/>
<g fill="none" stroke="var(--accent)" stroke-width="3.2" stroke-linecap="round" opacity="0.95">
<path d="M22 48c-2.3 4.2-2.3 4.2-4.8 8.6"/>
<path d="M32 48c-2.6 4.9-2.6 4.9-5.4 10.2"/>
<path d="M42 48c-2.3 4.2-2.3 4.2-4.8 8.6"/>
</g>
${svgClose}`;
}
if (kind === "snow"){
return `${svgOpen}
<path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.9" stroke-linejoin="round" opacity="0.98"/>
<g stroke="var(--accent2)" stroke-width="2.4" stroke-linecap="round" opacity="0.98">
<path d="M24 49l0 10M20 52l8 4M28 52l-8 4"/>
<path d="M40 49l0 10M36 52l8 4M44 52l-8 4"/>
</g>
${svgClose}`;
}
if (kind === "storm"){
return `${svgOpen}
<path d="${cloudPath}" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.9" stroke-linejoin="round" opacity="0.98"/>
<path d="M31 48l-5 8h6l-3 8 10-14h-6l3-6Z" fill="url(#boltG)" opacity="0.96"/>
<defs>
<linearGradient id="boltG" x1="26" y1="48" x2="42" y2="64" gradientUnits="userSpaceOnUse">
<stop offset="0%" stop-color="var(--accent)"/>
<stop offset="100%" stop-color="var(--accent2)"/>
</linearGradient>
</defs>
${svgClose}`;
}
return `${svgOpen}
<circle cx="32" cy="32" r="18" fill="var(--icon-fill)" stroke="var(--icon-stroke)" stroke-width="2.8" opacity="0.95"/>
<path d="M26 26c2-3 10-3 12 1 2 4-3 6-6 8-2 2-2 3-2 5" stroke="var(--accent)" stroke-width="3.2" stroke-linecap="round" opacity="0.95"/>
<circle cx="32" cy="46" r="2.2" fill="var(--accent2)" opacity="0.95"/>
${svgClose}`;
}
function applyThemeFromTemp(avgC){
const t = clamp((avgC + 10) / 45, 0, 1); // -10..35 -> 0..1
const hue = 210 - (t * 180); // blue -> orange
const sat = 92;
const light = 60;
const hue2 = (hue + 42) % 360;
const accent = `hsl(${hue} ${sat}% ${light}%)`;
const accentSoft = `hsl(${hue} ${sat}% ${light}% / 0.26)`;
const accent2 = `hsl(${hue2} ${Math.max(72, sat - 10)}% ${Math.max(58, light + 8)}%)`;
const accent2Soft = `hsl(${hue2} ${Math.max(72, sat - 10)}% ${Math.max(58, light + 8)}% / 0.22)`;
const root = document.documentElement.style;
root.setProperty("--accent", accent);
root.setProperty("--accentSoft", accentSoft);
root.setProperty("--accent2", accent2);
root.setProperty("--accent2Soft", accent2Soft);
}
function safeText(v){
return (v === null || v === undefined) ? "" : String(v);
}
function showError(msg, detail){
summaryPanel.hidden = true;
hourlyPanel.hidden = true;
errorBox.hidden = false;
card.classList.remove("is-loading");
statusEl.textContent = "Weather data couldn’t be loaded.";
conditionEl.textContent = "—";
tMaxEl.textContent = "—";
tMinEl.textContent = "—";
iconSlotEl.innerHTML = iconSvg("unknown");
const d = detail ? `${msg}\n\n${detail}` : msg;
errorDetailEl.textContent = safeText(d);
}
function createSvgEl(tag){
return document.createElementNS("http://www.w3.org/2000/svg", tag);
}
function catmullRomPath(pts){
if (pts.length < 2) return "";
let d = `M ${pts[0].x.toFixed(2)} ${pts[0].y.toFixed(2)}`;
for (let i = 0; i < pts.length - 1; i++){
const p0 = pts[i - 1] || pts[i];
const p1 = pts[i];
const p2 = pts[i + 1];
const p3 = pts[i + 2] || p2;
const cp1x = p1.x + (p2.x - p0.x) / 6;
const cp1y = p1.y + (p2.y - p0.y) / 6;
const cp2x = p2.x - (p3.x - p1.x) / 6;
const cp2y = p2.y - (p3.y - p1.y) / 6;
d += ` C ${cp1x.toFixed(2)} ${cp1y.toFixed(2)}, ${cp2x.toFixed(2)} ${cp2y.toFixed(2)}, ${p2.x.toFixed(2)} ${p2.y.toFixed(2)}`;
}
return d;
}
function renderChart(points){
const W = 720, H = 230;
const padL = 44, padR = 18, padT = 18, padB = 32;
const temps = points.map(p => p.t);
let minT = Math.min(...temps);
let maxT = Math.max(...temps);
if (!Number.isFinite(minT) || !Number.isFinite(maxT)){
chartArea.setAttribute("d", "");
chartLine.setAttribute("d", "");
return;
}
if ((maxT - minT) < 4){
const mid = (maxT + minT) / 2;
minT = mid - 2;
maxT = mid + 2;
}
const minTick = Math.floor(minT);
const maxTick = Math.ceil(maxT);
const span = Math.max(1, maxTick - minTick);
function xForIndex(i, n){
if (n <= 1) return padL;
return padL + (i / (n - 1)) * (W - padL - padR);
}
function yForTemp(t){
const f = (t - minTick) / span;
return padT + (1 - f) * (H - padT - padB);
}
const pts = points.map((p, i) => ({ x: xForIndex(i, points.length), y: yForTemp(p.t), h: p.h, t: p.t }));
const curve = catmullRomPath(pts);
const bottomY = H - padB;
chartArea.setAttribute("d", `${curve} L ${pts[pts.length - 1].x.toFixed(2)} ${bottomY.toFixed(2)} L ${pts[0].x.toFixed(2)} ${bottomY.toFixed(2)} Z`);
chartLine.setAttribute("d", curve);
// grid + labels
chartGridG.innerHTML = "";
chartXLabelsG.innerHTML = "";
chartYLabelsG.innerHTML = "";
chartDotsG.innerHTML = "";
const ticks = 5;
for (let i = 0; i < ticks; i++){
const f = i / (ticks - 1);
const y = padT + f * (H - padT - padB);
const val = Math.round(maxTick - f * (maxTick - minTick));
const line = createSvgEl("line");
line.setAttribute("x1", padL);
line.setAttribute("x2", W - padR);
line.setAttribute("y1", y);
line.setAttribute("y2", y);
line.setAttribute("stroke", "rgba(255,255,255,0.08)");
line.setAttribute("stroke-width", "1");
chartGridG.appendChild(line);
const txt = createSvgEl("text");
txt.setAttribute("x", padL - 10);
txt.setAttribute("y", y + 4);
txt.setAttribute("text-anchor", "end");
txt.setAttribute("fill", "rgba(255,255,255,0.48)");
txt.setAttribute("font-size", "11.5");
txt.setAttribute("font-family", "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace");
txt.textContent = `${val}°`;
chartYLabelsG.appendChild(txt);
}
// x labels at 00, 06, 12, 18, 23 (if present)
const markHours = [0, 6, 12, 18, 23];
for (const mh of markHours){
const idx = pts.findIndex(p => p.h === mh);
if (idx < 0) continue;
const p = pts[idx];
const vline = createSvgEl("line");
vline.setAttribute("x1", p.x);
vline.setAttribute("x2", p.x);
vline.setAttribute("y1", padT);
vline.setAttribute("y2", H - padB);
vline.setAttribute("stroke", "rgba(255,255,255,0.06)");
vline.setAttribute("stroke-width", "1");
chartGridG.appendChild(vline);
const txt = createSvgEl("text");
txt.setAttribute("x", p.x);
txt.setAttribute("y", H - 10);
txt.setAttribute("text-anchor", "middle");
txt.setAttribute("fill", "rgba(255,255,255,0.50)");
txt.setAttribute("font-size", "11.5");
txt.setAttribute("font-family", "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace");
txt.textContent = `${pad2(mh)}`;
chartXLabelsG.appendChild(txt);
}
// highlight min/max
let minIdx = 0, maxIdx = 0;
for (let i = 1; i < pts.length; i++){
if (pts[i].t < pts[minIdx].t) minIdx = i;
if (pts[i].t > pts[maxIdx].t) maxIdx = i;
}
function addDot(i, label, color){
const p = pts[i];
const ring = createSvgEl("circle");
ring.setAttribute("cx", p.x);
ring.setAttribute("cy", p.y);
ring.setAttribute("r", "7.2");
ring.setAttribute("fill", "rgba(0,0,0,0)");
ring.setAttribute("stroke", color);
ring.setAttribute("stroke-opacity", "0.55");
ring.setAttribute("stroke-width", "2");
chartDotsG.appendChild(ring);
const dot = createSvgEl("circle");
dot.setAttribute("cx", p.x);
dot.setAttribute("cy", p.y);
dot.setAttribute("r", "3.2");
dot.setAttribute("fill", color);
dot.setAttribute("fill-opacity", "0.95");
chartDotsG.appendChild(dot);
const txt = createSvgEl("text");
txt.setAttribute("x", p.x + 10);
txt.setAttribute("y", p.y - 10);
txt.setAttribute("text-anchor", "start");
txt.setAttribute("fill", "rgba(255,255,255,0.86)");
txt.setAttribute("font-size", "12.2");
txt.setAttribute("font-weight", "700");
txt.setAttribute("font-family", "ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial");
txt.textContent = `${label} ${Math.round(p.t)}°`;
chartDotsG.appendChild(txt);
}
addDot(maxIdx, "High", "var(--accent)");
addDot(minIdx, "Low", "var(--accent2)");
// animate line draw (unless reduced motion)
const reduce = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
if (!reduce){
try{
const len = chartLine.getTotalLength();
chartLine.style.transition = "none";
chartLine.style.strokeDasharray = String(len);
chartLine.style.strokeDashoffset = String(len);
chartArea.style.transition = "none";
chartArea.style.opacity = "0";
requestAnimationFrame(() => {
chartLine.style.transition = "stroke-dashoffset 900ms cubic-bezier(.2,.9,.2,1)";
chartLine.style.strokeDashoffset = "0";
chartArea.style.transition = "opacity 900ms ease";
chartArea.style.opacity = "1";
});
} catch (_) {}
} else {
chartLine.style.strokeDasharray = "none";
chartLine.style.strokeDashoffset = "0";
chartArea.style.opacity = "1";
}
}
function renderHourlyGrid(points){
hourlyGridEl.innerHTML = "";
const temps = points.map(p => p.t);
const min = Math.min(...temps);
const max = Math.max(...temps);
const span = Math.max(0.001, max - min);
for (const p of points){
const cell = document.createElement("div");
cell.className = "hour";
if (Math.abs(p.t - max) < 0.0001) cell.classList.add("is-max");
if (Math.abs(p.t - min) < 0.0001) cell.classList.add("is-min");
const norm = (p.t - min) / span;
cell.style.setProperty("--p", norm.toFixed(3));
cell.innerHTML = `
<div class="h">${pad2(p.h)}:00</div>
<div class="v">${Math.round(p.t)}<span class="u">°C</span></div>
`;
hourlyGridEl.appendChild(cell);
}
}
// Read URL params + defaults
const params = new URLSearchParams(window.location.search);
const rawLat = params.get("lat");
const rawLon = params.get("lon");
const rawName = params.get("name");
const rawDate = params.get("date");
const lat = clamp(parseNumber(rawLat, 52.52), -90, 90);
const lon = clamp(parseNumber(rawLon, 13.405), -180, 180);
const name = (safeText(rawName || "Berlin")).trim() || "Berlin";
const todayIso = new Date().toISOString().slice(0, 10); // UTC
let dateIso = (safeText(rawDate || todayIso)).trim();
if (!/^\d{4}-\d{2}-\d{2}$/.test(dateIso)) dateIso = todayIso;
placeNameEl.textContent = name;
coordsLabelEl.textContent = `${lat.toFixed(3)}, ${lon.toFixed(3)}`;
dateLabelEl.textContent = formatDateLabel(dateIso);
tzBadgeEl.textContent = "UTC";
document.title = `${name} · ${dateIso} · Weather`;
const endpoint = (dateIso < todayIso) ? "/api/om/archive" : "/api/om/forecast";
sourceBadgeEl.textContent = endpoint.includes("archive") ? "Archive" : "Forecast";
const url = new URL(endpoint, window.location.origin);
url.search = 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: dateIso,
end_date: dateIso
}).toString();
// placeholders
iconSlotEl.innerHTML = iconSvg("unknown");
fineLeftEl.textContent = "—";
fineRightEl.textContent = "—";
hourlySubEl.textContent = "—";
async function load(){
statusEl.textContent = "Loading weather data…";
errorBox.hidden = true;
summaryPanel.hidden = false;
hourlyPanel.hidden = false;
card.classList.add("is-loading");
try{
const res = await fetch(url.toString(), {
method: "GET",
headers: { "Accept": "application/json" },
cache: "no-store"
});
if (!res.ok){
const text = await res.text().catch(() => "");
throw new Error(`HTTP ${res.status}${text ? ` — ${text.slice(0, 240)}` : ""}`);
}
const data = await res.json();
if (data && data.error){
throw new Error(safeText(data.reason || "API returned an error."));
}
const daily = data && data.daily;
const hourly = data && data.hourly;
if (!daily || !hourly) throw new Error("Response is missing `daily` or `hourly` fields.");
const timesDaily = Array.isArray(daily.time) ? daily.time : [];
const idx = timesDaily.indexOf(dateIso);
const i = (idx >= 0) ? idx : 0;
const tMax = daily.temperature_2m_max && daily.temperature_2m_max[i];
const tMin = daily.temperature_2m_min && daily.temperature_2m_min[i];
const wCode = daily.weather_code && daily.weather_code[i];
if (!Number.isFinite(Number(tMax)) || !Number.isFinite(Number(tMin)) || !Number.isFinite(Number(wCode))){
throw new Error("Daily values for max/min temperature or weather code are missing for the requested date.");
}
const maxC = Number(tMax);
const minC = Number(tMin);
const info = wmoInfo(wCode);
tMaxEl.textContent = String(Math.round(maxC));
tMinEl.textContent = String(Math.round(minC));
conditionEl.textContent = info.label;
iconSlotEl.innerHTML = iconSvg(info.icon);
applyThemeFromTemp((maxC + minC) / 2);
fineLeftEl.textContent = `Lat ${lat.toFixed(3)} · Lon ${lon.toFixed(3)}`;
fineRightEl.textContent = `Code ${Number(wCode)}`;
const ht = Array.isArray(hourly.time) ? hourly.time : [];
const hv = Array.isArray(hourly.temperature_2m) ? hourly.temperature_2m : [];
if (ht.length !== hv.length) throw new Error("Hourly time/value arrays have different lengths.");
const points = [];
for (let j = 0; j < ht.length; j++){
const ts = ht[j];
const temp = hv[j];
if (typeof ts !== "string") continue;
if (!ts.startsWith(dateIso)) continue;
const hourStr = ts.slice(11, 13);
const h = Number(hourStr);
const t = Number(temp);
if (!Number.isFinite(h) || !Number.isFinite(t)) continue;
points.push({ h, t });
}
if (!points.length) throw new Error("No hourly temperatures were found for the requested date.");
points.sort((a,b) => a.h - b.h);
const minH = Math.min(...points.map(p => p.t));
const maxH = Math.max(...points.map(p => p.t));
hourlySubEl.textContent = `${Math.round(minH)}–${Math.round(maxH)}°C · ${points.length} points`;
renderChart(points);
renderHourlyGrid(points);
const now = new Date();
const hm = now.toISOString().slice(11, 16);
statusEl.textContent = `Loaded ${sourceBadgeEl.textContent} data for ${name} on ${dateIso} (UTC). Updated at ${hm} UTC.`;
card.classList.remove("is-loading");
} catch (err){
const msg = "Unable to fetch weather data from the API.";
const detail = (err && err.message) ? err.message : String(err);
showError(msg, `Request: ${url.pathname}\nParams: ${url.search}\n\n${detail}`);
}
}
load();
})();
</script>
</body>
</html>L1 — cheap deterministic descriptors
| bytes total | 43,523 | html / css / js | 5,030 / 13,489 / 25,004 |
|---|---|---|---|
| dom nodes | 77 | dom depth | 13 |
| css rules | 75 | js present | yes |
| brightness | 67.6 | contrast | 33.3 |
| colorfulness | 26.0 | whitespace | 35.1% |
This slot's telemetry
| prompt tokens | 17,671 | completion tokens | 30,031 |
|---|---|---|---|
| total tokens | 47,702 | wall | 393.2 s |
| cost | — | request id | — |
config.json562 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "gpt-5.2-eff-xhigh--cli--cursor--dev",
"effort": "xhigh",
"family": "gpt",
"m": {
"min": 2,
"q": 2
},
"model_id": "gpt-5.2",
"protocol": "cli",
"served_model": "gpt-5.2-xhigh",
"telemetry": {
"completion_tokens": 130059,
"cost_usd": null,
"prompt_tokens": 82889,
"total_tokens": 212948,
"wall_ms": 1688025
},
"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": "gpt-5.2-eff-xhigh--cli--cursor--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-12T21:49:16.474684+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T21:42:43.276149+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:54:49.684199+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T21:49:20.702872+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-12T22:01:50.360894+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T21:54:53.460076+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-12T22:11:03.333633+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T22:01:54.390788+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
}
}
}