gpt-5.4 @ high · cursor
cursorhigh
- config
- gpt-5.4-eff-high--cli--cursor--dev
- batch
- 2026-07-19--unified
- transport
- cursor-agent-cli-isolated-home
- protocol
- cli · plan
- served model
- gpt-5.4-high
- 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.3
- min tempmatchshown: 16
- hourlymatchcoverage 24/24 · 24 match · 0 mismatch · 0 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">
<meta name="color-scheme" content="dark">
<link rel="icon" href="data:,">
<title>Weather Card</title>
<style>
:root {
--bg-a: #07111f;
--bg-b: #12365d;
--bg-c: #070d18;
--glow-a: rgba(86, 187, 255, 0.34);
--glow-b: rgba(255, 183, 85, 0.2);
--card-bg-top: rgba(8, 14, 28, 0.82);
--card-bg-bottom: rgba(10, 18, 34, 0.64);
--panel-bg: rgba(255, 255, 255, 0.055);
--panel-bg-strong: rgba(255, 255, 255, 0.075);
--stroke: rgba(255, 255, 255, 0.14);
--stroke-strong: rgba(255, 255, 255, 0.2);
--text: #f6f8ff;
--muted: #a7bad9;
--accent: #8be8ff;
--accent-2: #ffbc66;
--shadow: 0 30px 90px rgba(0, 0, 0, 0.32);
--shadow-soft: 0 18px 45px rgba(0, 0, 0, 0.22);
--warm-rgb: 255, 188, 102;
--cool-rgb: 139, 232, 255;
--error-rgb: 255, 123, 145;
}
* {
box-sizing: border-box;
}
html,
body {
width: 100%;
min-height: 100%;
}
body {
margin: 0;
min-width: 1280px;
min-height: 800px;
display: grid;
place-items: center;
overflow: hidden;
color: var(--text);
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
background:
radial-gradient(circle at 18% 18%, var(--glow-a), transparent 34%),
radial-gradient(circle at 82% 14%, var(--glow-b), transparent 30%),
linear-gradient(155deg, var(--bg-a), var(--bg-b) 58%, var(--bg-c));
transition: background 320ms ease;
}
body::before,
body::after {
content: "";
position: fixed;
inset: auto;
border-radius: 50%;
pointer-events: none;
filter: blur(30px);
opacity: 0.55;
animation: drift 16s ease-in-out infinite;
}
body::before {
width: 420px;
height: 420px;
left: -110px;
bottom: -120px;
background: radial-gradient(circle, rgba(var(--cool-rgb), 0.22), transparent 68%);
}
body::after {
width: 320px;
height: 320px;
right: -60px;
top: -80px;
background: radial-gradient(circle, rgba(var(--warm-rgb), 0.18), transparent 70%);
animation-delay: -6s;
}
@keyframes drift {
0%, 100% {
transform: translate3d(0, 0, 0) scale(1);
}
50% {
transform: translate3d(0, -14px, 0) scale(1.03);
}
}
body[data-theme="clear"] {
--bg-a: #07111f;
--bg-b: #12365d;
--bg-c: #070d18;
--glow-a: rgba(86, 187, 255, 0.34);
--glow-b: rgba(255, 183, 85, 0.2);
--accent: #8be8ff;
--accent-2: #ffbc66;
--warm-rgb: 255, 188, 102;
--cool-rgb: 139, 232, 255;
}
body[data-theme="cloudy"] {
--bg-a: #0d1524;
--bg-b: #2a3f5f;
--bg-c: #0a0f18;
--glow-a: rgba(154, 185, 244, 0.24);
--glow-b: rgba(199, 220, 255, 0.14);
--accent: #b8d1ff;
--accent-2: #91a9d8;
--warm-rgb: 145, 169, 216;
--cool-rgb: 184, 209, 255;
}
body[data-theme="rain"] {
--bg-a: #07111a;
--bg-b: #153a56;
--bg-c: #08111f;
--glow-a: rgba(96, 194, 255, 0.28);
--glow-b: rgba(92, 121, 255, 0.16);
--accent: #70dcff;
--accent-2: #7ea3ff;
--warm-rgb: 126, 163, 255;
--cool-rgb: 112, 220, 255;
}
body[data-theme="snow"] {
--bg-a: #0b1520;
--bg-b: #21415a;
--bg-c: #08111a;
--glow-a: rgba(211, 243, 255, 0.28);
--glow-b: rgba(116, 186, 255, 0.14);
--accent: #e4f8ff;
--accent-2: #93cfff;
--warm-rgb: 147, 207, 255;
--cool-rgb: 228, 248, 255;
}
body[data-theme="storm"] {
--bg-a: #0d1020;
--bg-b: #2d2458;
--bg-c: #090d15;
--glow-a: rgba(143, 120, 255, 0.28);
--glow-b: rgba(96, 184, 255, 0.12);
--accent: #b6c0ff;
--accent-2: #8c73ff;
--warm-rgb: 140, 115, 255;
--cool-rgb: 182, 192, 255;
}
.frame {
width: 100%;
height: 100%;
padding: 48px;
display: grid;
place-items: center;
}
.card {
position: relative;
width: min(1120px, calc(100vw - 96px));
min-height: 690px;
padding: 32px;
border-radius: 34px;
overflow: hidden;
background: linear-gradient(180deg, var(--card-bg-top), var(--card-bg-bottom));
border: 1px solid var(--stroke);
box-shadow: var(--shadow);
backdrop-filter: blur(18px);
-webkit-backdrop-filter: blur(18px);
display: grid;
grid-template-rows: auto auto 1fr;
gap: 24px;
}
.card::before {
content: "";
position: absolute;
inset: 1px;
border-radius: 33px;
pointer-events: none;
border: 1px solid rgba(255, 255, 255, 0.05);
}
.shine {
position: absolute;
right: -10%;
top: -18%;
width: 460px;
height: 300px;
background: radial-gradient(circle, rgba(var(--cool-rgb), 0.18), transparent 68%);
filter: blur(8px);
pointer-events: none;
}
.topbar,
.hero,
.hourly-panel {
position: relative;
z-index: 1;
}
.topbar {
display: flex;
justify-content: space-between;
align-items: center;
gap: 16px;
}
.badge-row {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.badge,
.status-pill {
border: 1px solid rgba(255, 255, 255, 0.12);
background: rgba(255, 255, 255, 0.06);
color: var(--muted);
padding: 10px 14px;
border-radius: 999px;
font-size: 13px;
line-height: 1;
letter-spacing: 0.02em;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
.status-pill {
color: var(--text);
border-color: rgba(var(--cool-rgb), 0.28);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.status-pill[data-state="loading"] {
color: rgba(255, 255, 255, 0.9);
}
.status-pill[data-state="ready"] {
background: linear-gradient(180deg, rgba(var(--cool-rgb), 0.16), rgba(var(--cool-rgb), 0.09));
}
.status-pill[data-state="error"] {
background: linear-gradient(180deg, rgba(var(--error-rgb), 0.2), rgba(var(--error-rgb), 0.1));
border-color: rgba(var(--error-rgb), 0.28);
}
.hero {
display: grid;
grid-template-columns: 1.4fr 0.9fr;
gap: 24px;
align-items: stretch;
}
.hero-copy,
.hero-panel,
.hourly-panel {
background: linear-gradient(180deg, var(--panel-bg-strong), var(--panel-bg));
border: 1px solid var(--stroke);
border-radius: 28px;
box-shadow: var(--shadow-soft);
}
.hero-copy {
padding: 28px 30px 30px;
display: flex;
flex-direction: column;
justify-content: center;
}
.kicker {
margin: 0 0 12px;
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.22em;
color: var(--accent);
}
h1 {
margin: 0;
font-size: clamp(52px, 6vw, 78px);
line-height: 0.96;
letter-spacing: -0.04em;
font-weight: 750;
text-wrap: balance;
}
.date-line {
margin: 16px 0 0;
color: rgba(255, 255, 255, 0.84);
font-size: 20px;
line-height: 1.4;
}
.summary-row {
display: flex;
align-items: center;
gap: 18px;
margin-top: 24px;
}
.condition-badge {
flex: 0 0 92px;
width: 92px;
height: 92px;
display: grid;
place-items: center;
border-radius: 24px;
color: var(--accent-2);
background:
radial-gradient(circle at 30% 25%, rgba(255, 255, 255, 0.12), transparent 42%),
linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.04));
border: 1px solid rgba(255, 255, 255, 0.14);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
}
.condition-badge svg {
width: 48px;
height: 48px;
filter: drop-shadow(0 8px 18px rgba(0, 0, 0, 0.18));
}
.condition-label {
font-size: 32px;
line-height: 1.08;
font-weight: 680;
letter-spacing: -0.03em;
}
.range-line {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-top: 14px;
}
.temp-pill {
min-width: 130px;
padding: 12px 16px;
border-radius: 18px;
border: 1px solid rgba(255, 255, 255, 0.12);
background: rgba(255, 255, 255, 0.06);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
}
.temp-pill span {
display: block;
font-size: 13px;
color: var(--muted);
}
.temp-pill strong {
display: block;
margin-top: 4px;
font-size: 27px;
line-height: 1;
color: var(--text);
letter-spacing: -0.03em;
}
.temp-pill.hot {
background: linear-gradient(180deg, rgba(var(--warm-rgb), 0.14), rgba(255, 255, 255, 0.04));
}
.temp-pill.cold {
background: linear-gradient(180deg, rgba(var(--cool-rgb), 0.13), rgba(255, 255, 255, 0.04));
}
.message {
margin: 22px 0 0;
max-width: 650px;
color: var(--muted);
font-size: 16px;
line-height: 1.55;
}
.hero-panel {
padding: 24px;
display: flex;
flex-direction: column;
justify-content: space-between;
gap: 18px;
}
.panel-title {
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.18em;
color: var(--muted);
}
.split-temps {
display: grid;
gap: 14px;
}
.metric {
padding: 18px 18px 16px;
border-radius: 22px;
border: 1px solid rgba(255, 255, 255, 0.12);
background: rgba(255, 255, 255, 0.05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
}
.metric span {
display: block;
color: var(--muted);
font-size: 13px;
margin-bottom: 10px;
}
.metric strong {
display: block;
font-size: 44px;
line-height: 0.95;
letter-spacing: -0.05em;
font-weight: 760;
}
.metric.hot {
background: linear-gradient(180deg, rgba(var(--warm-rgb), 0.15), rgba(255, 255, 255, 0.05));
}
.metric.cold {
background: linear-gradient(180deg, rgba(var(--cool-rgb), 0.14), rgba(255, 255, 255, 0.05));
}
.meta-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
}
.meta-card {
padding: 15px 16px;
border-radius: 18px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.meta-card span {
display: block;
color: var(--muted);
font-size: 12px;
margin-bottom: 8px;
text-transform: uppercase;
letter-spacing: 0.12em;
}
.meta-card strong {
display: block;
font-size: 15px;
font-weight: 650;
line-height: 1.35;
word-break: break-word;
}
.hourly-panel {
padding: 22px 24px 26px;
display: flex;
flex-direction: column;
}
.section-head {
display: flex;
justify-content: space-between;
align-items: flex-end;
gap: 16px;
margin-bottom: 18px;
}
.section-head h2 {
margin: 0;
font-size: 24px;
line-height: 1.1;
letter-spacing: -0.03em;
}
.section-head p {
margin: 6px 0 0;
color: var(--muted);
font-size: 14px;
}
.legend {
display: flex;
gap: 16px;
color: var(--muted);
font-size: 13px;
white-space: nowrap;
}
.legend span {
display: inline-flex;
align-items: center;
gap: 8px;
}
.legend-dot {
width: 10px;
height: 10px;
display: inline-block;
border-radius: 999px;
box-shadow: 0 0 0 4px rgba(255, 255, 255, 0.03);
}
.legend-dot.warm {
background: rgb(var(--warm-rgb));
}
.legend-dot.cool {
background: rgb(var(--cool-rgb));
}
.hourly-grid {
display: grid;
gap: 10px;
align-items: end;
min-height: 300px;
flex: 1 1 auto;
}
.hour-item {
height: 100%;
padding: 14px 8px 12px;
border-radius: 20px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.07), rgba(255, 255, 255, 0.035));
border: 1px solid rgba(255, 255, 255, 0.1);
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-end;
gap: 10px;
transition: transform 180ms ease, border-color 180ms ease, background 180ms ease;
}
.hour-item:hover {
transform: translateY(-4px);
border-color: rgba(255, 255, 255, 0.18);
}
.hour-item.peak {
border-color: rgba(var(--warm-rgb), 0.32);
background: linear-gradient(180deg, rgba(var(--warm-rgb), 0.12), rgba(255, 255, 255, 0.035));
}
.hour-item.trough {
border-color: rgba(var(--cool-rgb), 0.3);
background: linear-gradient(180deg, rgba(var(--cool-rgb), 0.12), rgba(255, 255, 255, 0.035));
}
.hour-label {
font-size: 12px;
color: var(--muted);
letter-spacing: 0.03em;
}
.bar-shell {
width: 18px;
height: 176px;
padding: 2px;
border-radius: 999px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.04));
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04);
display: flex;
align-items: flex-end;
}
.bar {
width: 100%;
height: var(--fill, 0px);
border-radius: 999px;
background:
linear-gradient(
180deg,
hsl(var(--hue, 200), 100%, 77%),
hsl(calc(var(--hue, 200) - 18), 90%, 57%)
);
box-shadow:
0 10px 24px rgba(0, 0, 0, 0.22),
0 0 18px rgba(var(--cool-rgb), 0.12);
}
.hour-temp {
font-size: 14px;
font-weight: 650;
letter-spacing: -0.01em;
color: var(--text);
}
.placeholder {
min-height: 250px;
border-radius: 24px;
border: 1px dashed rgba(255, 255, 255, 0.14);
display: grid;
place-items: center;
color: var(--muted);
font-size: 18px;
background: rgba(255, 255, 255, 0.035);
text-align: center;
padding: 24px;
}
@media (max-width: 1120px) {
body {
min-width: 0;
}
.frame {
padding: 24px;
}
.card {
width: calc(100vw - 48px);
}
.hero {
grid-template-columns: 1fr;
}
.section-head {
flex-direction: column;
align-items: flex-start;
}
}
</style>
</head>
<body data-theme="clear">
<div class="frame">
<main class="card" aria-live="polite">
<div class="shine"></div>
<header class="topbar">
<div class="badge-row">
<span class="badge">UTC data</span>
<span class="badge" id="coordsBadge">52.52, 13.405</span>
</div>
<span class="status-pill" id="statusPill" data-state="loading">Loading weather</span>
</header>
<section class="hero">
<div class="hero-copy">
<p class="kicker">Weather Snapshot</p>
<h1 id="locationName">Berlin</h1>
<p class="date-line" id="dateLine">Loading date</p>
<div class="summary-row">
<div class="condition-badge" id="conditionIcon" aria-hidden="true"></div>
<div>
<div class="condition-label" id="conditionLabel">Fetching conditions</div>
<div class="range-line">
<div class="temp-pill hot">
<span>High</span>
<strong id="maxTemp">--</strong>
</div>
<div class="temp-pill cold">
<span>Low</span>
<strong id="minTemp">--</strong>
</div>
</div>
</div>
</div>
<p class="message" id="message">Fetching the selected day's daily summary and hourly temperatures.</p>
</div>
<aside class="hero-panel">
<div class="panel-title">Daily Range</div>
<div class="split-temps">
<div class="metric hot">
<span>Maximum</span>
<strong id="maxTempBig">--</strong>
</div>
<div class="metric cold">
<span>Minimum</span>
<strong id="minTempBig">--</strong>
</div>
</div>
<div class="meta-grid">
<div class="meta-card">
<span>Source</span>
<strong id="sourceLabel">Awaiting data</strong>
</div>
<div class="meta-card">
<span>Units</span>
<strong>Celsius</strong>
</div>
</div>
</aside>
</section>
<section class="hourly-panel">
<div class="section-head">
<div>
<h2>Hourly Temperatures</h2>
<p>Selected date in UTC</p>
</div>
<div class="legend">
<span><i class="legend-dot warm"></i> Warmer</span>
<span><i class="legend-dot cool"></i> Cooler</span>
</div>
</div>
<div class="hourly-grid" id="hourlyGrid">
<div class="placeholder">Waiting for weather data.</div>
</div>
</section>
</main>
</div>
<script>
(function () {
const defaults = {
lat: 52.52,
lon: 13.405,
name: "Berlin"
};
const icons = {
clear: '<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="24" cy="24" r="8"></circle><path d="M24 6v5"></path><path d="M24 37v5"></path><path d="M6 24h5"></path><path d="M37 24h5"></path><path d="M11.3 11.3l3.6 3.6"></path><path d="M33.1 33.1l3.6 3.6"></path><path d="M36.7 11.3l-3.6 3.6"></path><path d="M14.9 33.1l-3.6 3.6"></path></svg>',
cloudy: '<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M17 33.5h17.5a7 7 0 0 0 .3-14 10.5 10.5 0 0 0-20.2-2.1A7.4 7.4 0 0 0 17 33.5Z"></path><path d="M16 17a8 8 0 0 1 8-8"></path></svg>',
rain: '<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M16 29h18a7 7 0 0 0 .3-14 10.5 10.5 0 0 0-20.4-1.5A7.2 7.2 0 0 0 16 29Z"></path><path d="M19 33l-2.5 5"></path><path d="M27 33l-2.5 5"></path><path d="M35 33l-2.5 5"></path></svg>',
snow: '<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M16 27h18a7 7 0 0 0 .3-14 10.5 10.5 0 0 0-20.4-1.5A7.2 7.2 0 0 0 16 27Z"></path><path d="M18 35h.01"></path><path d="M24 32v6"></path><path d="M21 34.5l6 1"></path><path d="M27 34.5l-6 1"></path><path d="M32 35h.01"></path></svg>',
storm: '<svg viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15.5 28h18.2a7 7 0 0 0 .2-14 10.5 10.5 0 0 0-20.4-1.5A7.2 7.2 0 0 0 15.5 28Z"></path><path d="M24 29l-3.5 6h4l-2.5 7 8-10h-4l2.2-3Z"></path></svg>'
};
const locationName = document.getElementById("locationName");
const dateLine = document.getElementById("dateLine");
const coordsBadge = document.getElementById("coordsBadge");
const statusPill = document.getElementById("statusPill");
const conditionIcon = document.getElementById("conditionIcon");
const conditionLabel = document.getElementById("conditionLabel");
const maxTemp = document.getElementById("maxTemp");
const minTemp = document.getElementById("minTemp");
const maxTempBig = document.getElementById("maxTempBig");
const minTempBig = document.getElementById("minTempBig");
const message = document.getElementById("message");
const sourceLabel = document.getElementById("sourceLabel");
const hourlyGrid = document.getElementById("hourlyGrid");
const utcToday = () => new Date().toISOString().slice(0, 10);
const isValidDate = (value) => {
if (!/^\d{4}-\d{2}-\d{2}$/.test(value || "")) return false;
return !Number.isNaN(Date.parse(value + "T00:00:00Z"));
};
const toNumber = (value, fallback) => {
const parsed = Number(value);
return Number.isFinite(parsed) ? parsed : fallback;
};
const formatCoordinate = (value) => {
return (Math.round(value * 1000) / 1000).toFixed(3).replace(/\.?0+$/, "");
};
const formatTemp = (value, withUnit) => {
if (!Number.isFinite(value)) return "--";
const rounded = Math.round(value * 10) / 10;
const text = Number.isInteger(rounded) ? String(rounded.toFixed(0)) : rounded.toFixed(1);
return withUnit ? text + "°C" : text + "°";
};
const formatDisplayDate = (value) => {
const date = new Date(value + "T00:00:00Z");
return new Intl.DateTimeFormat(undefined, {
weekday: "long",
day: "numeric",
month: "long",
year: "numeric",
timeZone: "UTC"
}).format(date);
};
const describeWeather = (code) => {
if (code === 0) return { label: "Clear sky", theme: "clear", icon: "clear" };
if (code === 1) return { label: "Mainly clear", theme: "clear", icon: "clear" };
if (code === 2) return { label: "Partly cloudy", theme: "cloudy", icon: "cloudy" };
if (code === 3) return { label: "Overcast", theme: "cloudy", icon: "cloudy" };
if ([45, 48].includes(code)) return { label: "Foggy", theme: "cloudy", icon: "cloudy" };
if ([51, 53, 55, 56, 57].includes(code)) return { label: "Drizzle", theme: "rain", icon: "rain" };
if ([61, 63, 65, 66, 67].includes(code)) return { label: "Rain", theme: "rain", icon: "rain" };
if ([71, 73, 75, 77, 85, 86].includes(code)) return { label: "Snow", theme: "snow", icon: "snow" };
if ([80, 81, 82].includes(code)) return { label: "Rain showers", theme: "rain", icon: "rain" };
if ([95, 96, 99].includes(code)) return { label: "Thunderstorm", theme: "storm", icon: "storm" };
return { label: "Mixed conditions", theme: "cloudy", icon: "cloudy" };
};
const setStatus = (text, state) => {
statusPill.textContent = text;
statusPill.dataset.state = state;
};
const setPlaceholder = (text) => {
hourlyGrid.style.gridTemplateColumns = "1fr";
hourlyGrid.innerHTML = '<div class="placeholder">' + text + "</div>";
};
const renderHourly = (entries) => {
if (!entries.length) {
setPlaceholder("Hourly temperatures are unavailable for the selected date.");
return;
}
const temps = entries.map((entry) => entry.temp).filter(Number.isFinite);
const min = Math.min.apply(null, temps);
const max = Math.max.apply(null, temps);
const spread = Math.max(max - min, 1);
hourlyGrid.style.gridTemplateColumns = "repeat(" + entries.length + ", minmax(0, 1fr))";
hourlyGrid.innerHTML = entries.map((entry) => {
const label = entry.time.includes("T") ? entry.time.slice(11, 16) : entry.time;
const ratio = (entry.temp - min) / spread;
const fill = Math.round(42 + ratio * 96);
const hue = Math.round(208 - ratio * 155);
const isPeak = entry.temp === max;
const isTrough = entry.temp === min;
const className = "hour-item" + (isPeak ? " peak" : "") + (isTrough ? " trough" : "");
return (
'<article class="' + className + '" style="--fill:' + fill + 'px; --hue:' + hue + ';">' +
'<span class="hour-label">' + label + "</span>" +
'<div class="bar-shell"><div class="bar"></div></div>' +
'<span class="hour-temp">' + formatTemp(entry.temp, false) + "</span>" +
"</article>"
);
}).join("");
};
const showError = (selectedName, selectedDate, reason) => {
document.body.dataset.theme = "storm";
locationName.textContent = selectedName;
dateLine.textContent = formatDisplayDate(selectedDate) + " \u00b7 UTC";
conditionIcon.innerHTML = icons.storm;
conditionLabel.textContent = "Unable to load weather";
maxTemp.textContent = "--";
minTemp.textContent = "--";
maxTempBig.textContent = "--";
minTempBig.textContent = "--";
sourceLabel.textContent = "Unavailable";
message.textContent = reason || "The weather data could not be loaded for the selected date.";
setStatus("Load failed", "error");
setPlaceholder("Weather data could not be loaded.");
document.title = selectedName + " weather unavailable";
};
const params = new URLSearchParams(window.location.search);
const selectedDate = isValidDate(params.get("date")) ? params.get("date") : utcToday();
const lat = toNumber(params.get("lat"), defaults.lat);
const lon = toNumber(params.get("lon"), defaults.lon);
const selectedName = (params.get("name") || defaults.name).trim() || defaults.name;
const todayUtc = utcToday();
const useArchive = selectedDate < todayUtc;
const endpoint = useArchive ? "/api/om/archive" : "/api/om/forecast";
locationName.textContent = selectedName;
dateLine.textContent = formatDisplayDate(selectedDate) + " \u00b7 UTC";
coordsBadge.textContent = formatCoordinate(lat) + ", " + formatCoordinate(lon);
conditionIcon.innerHTML = icons.clear;
sourceLabel.textContent = endpoint;
setStatus(useArchive ? "Loading archive" : "Loading forecast", "loading");
const query = new URLSearchParams({
latitude: String(lat),
longitude: String(lon),
daily: "temperature_2m_max,temperature_2m_min,weather_code",
hourly: "temperature_2m",
timezone: "UTC",
temperature_unit: "celsius",
start_date: selectedDate,
end_date: selectedDate
});
fetch(endpoint + "?" + query.toString(), {
method: "GET",
headers: {
"Accept": "application/json"
}
})
.then((response) => {
if (!response.ok) {
throw new Error("Request failed with status " + response.status);
}
return response.json();
})
.then((data) => {
const daily = data && data.daily;
const hourly = data && data.hourly;
const maxValue = daily && Array.isArray(daily.temperature_2m_max) ? Number(daily.temperature_2m_max[0]) : NaN;
const minValue = daily && Array.isArray(daily.temperature_2m_min) ? Number(daily.temperature_2m_min[0]) : NaN;
const weatherCode = daily && Array.isArray(daily.weather_code) ? Number(daily.weather_code[0]) : NaN;
const hourlyTimes = hourly && Array.isArray(hourly.time) ? hourly.time : [];
const hourlyTemps = hourly && Array.isArray(hourly.temperature_2m) ? hourly.temperature_2m : [];
if (!Number.isFinite(maxValue) || !Number.isFinite(minValue) || !hourlyTimes.length || !hourlyTemps.length) {
throw new Error("Incomplete weather payload");
}
const descriptor = describeWeather(weatherCode);
document.body.dataset.theme = descriptor.theme;
conditionIcon.innerHTML = icons[descriptor.icon] || icons.cloudy;
conditionLabel.textContent = descriptor.label;
maxTemp.textContent = formatTemp(maxValue, true);
minTemp.textContent = formatTemp(minValue, true);
maxTempBig.textContent = formatTemp(maxValue, true);
minTempBig.textContent = formatTemp(minValue, true);
sourceLabel.textContent = endpoint;
message.textContent = "Daily summary and hourly temperatures for " + formatDisplayDate(selectedDate) + " in UTC.";
setStatus(useArchive ? "Archive loaded" : "Forecast loaded", "ready");
const entries = hourlyTimes
.map((time, index) => ({
time: String(time),
temp: Number(hourlyTemps[index])
}))
.filter((entry) => entry.time.startsWith(selectedDate) && Number.isFinite(entry.temp));
if (!entries.length) {
throw new Error("No hourly data for selected date");
}
renderHourly(entries);
document.title = selectedName + " weather on " + selectedDate;
})
.catch((error) => {
showError(selectedName, selectedDate, "The weather data could not be loaded for the selected date.");
console.error(error);
});
})();
</script>
</body>
</html>L1 — cheap deterministic descriptors
| bytes total | 29,192 | html / css / js | 3,050 / 14,571 / 11,571 |
|---|---|---|---|
| dom nodes | 63 | dom depth | 11 |
| css rules | 81 | js present | yes |
| brightness | 45.8 | contrast | 25.4 |
| colorfulness | 19.9 | whitespace | 54.9% |
This slot's telemetry
| prompt tokens | 16,094 | completion tokens | 16,996 |
|---|---|---|---|
| total tokens | 33,090 | wall | 135.5 s |
| cost | — | request id | — |
config.json557 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "gpt-5.4-eff-high--cli--cursor--dev",
"effort": "high",
"family": "gpt",
"m": {
"min": 2,
"q": 2
},
"model_id": "gpt-5.4",
"protocol": "cli",
"served_model": "gpt-5.4-high",
"telemetry": {
"completion_tokens": 52507,
"cost_usd": null,
"prompt_tokens": 50544,
"total_tokens": 103051,
"wall_ms": 404856
},
"transport": "cursor-agent-cli-isolated-home",
"vendor_sanction_ref": null
}send-log2.5 KB
{
"N": 2,
"batch_id": "2026-08-13--cursor-s0",
"config_id": "gpt-5.4-eff-high--cli--cursor--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-13T01:03:19.657302+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T01:01:04.164840+00:00"
}
],
"block_index": 0,
"model_reaching_attempt_index": 0,
"slot_index": 0,
"terminal_state": "valid",
"variant": "P-q"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-13T01:04:31.468134+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T01:03:23.485984+00:00"
}
],
"block_index": 0,
"model_reaching_attempt_index": 0,
"slot_index": 0,
"terminal_state": "valid",
"variant": "P-min"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-13T01:05:36.985952+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T01:04:34.993181+00:00"
}
],
"block_index": 1,
"model_reaching_attempt_index": 0,
"slot_index": 1,
"terminal_state": "valid",
"variant": "P-min"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-13T01:07:59.683904+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-13T01:05:40.295069+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
}
}
}