gpt-5.4 @ medium · cursor
cursormedium
- config
- gpt-5.4-eff-medium--cli--cursor--dev
- batch
- 2026-07-19--unified
- transport
- cursor-agent-cli-isolated-home
- protocol
- cli · plan
- served model
- gpt-5.4-medium
- 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 tempambiguousinsufficient-distinct-temperature-nodes
- min tempambiguousinsufficient-distinct-temperature-nodes
- hourlyambiguouscoverage · 0 match · 0 mismatch · 24 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=1280, initial-scale=1.0" />
<title>Weather Card</title>
<style>
:root {
--bg-1: #0b1020;
--bg-2: #111a33;
--bg-3: #1a2752;
--card: rgba(15, 23, 42, 0.72);
--card-border: rgba(255, 255, 255, 0.14);
--text: #eef4ff;
--muted: #aab6d3;
--accent: #7dd3fc;
--accent-2: #c4b5fd;
--good: #86efac;
--bad: #fca5a5;
--shadow: 0 24px 80px rgba(0, 0, 0, 0.45);
}
* {
box-sizing: border-box;
}
html, body {
width: 100%;
height: 100%;
margin: 0;
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
color: var(--text);
background:
radial-gradient(circle at 15% 20%, rgba(125, 211, 252, 0.18), transparent 28%),
radial-gradient(circle at 85% 18%, rgba(196, 181, 253, 0.16), transparent 24%),
radial-gradient(circle at 50% 100%, rgba(59, 130, 246, 0.22), transparent 36%),
linear-gradient(135deg, var(--bg-1), var(--bg-2) 45%, var(--bg-3));
overflow: hidden;
}
body {
display: grid;
place-items: center;
padding: 28px;
}
.frame {
position: relative;
width: 1180px;
height: 740px;
border-radius: 32px;
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.03)),
rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: var(--shadow);
backdrop-filter: blur(20px);
overflow: hidden;
}
.frame::before,
.frame::after {
content: "";
position: absolute;
border-radius: 999px;
filter: blur(6px);
opacity: 0.85;
pointer-events: none;
}
.frame::before {
width: 320px;
height: 320px;
top: -110px;
right: -80px;
background: radial-gradient(circle at 30% 30%, rgba(125, 211, 252, 0.5), rgba(125, 211, 252, 0.03) 65%, transparent 75%);
}
.frame::after {
width: 420px;
height: 420px;
bottom: -180px;
left: -100px;
background: radial-gradient(circle at 50% 50%, rgba(196, 181, 253, 0.28), rgba(196, 181, 253, 0.03) 70%, transparent 78%);
}
.shell {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: 1.05fr 1fr;
gap: 22px;
height: 100%;
padding: 24px;
}
.panel {
border-radius: 28px;
background: var(--card);
border: 1px solid var(--card-border);
backdrop-filter: blur(18px);
overflow: hidden;
min-width: 0;
}
.hero {
padding: 28px;
display: flex;
flex-direction: column;
justify-content: space-between;
background:
linear-gradient(180deg, rgba(125, 211, 252, 0.08), rgba(196, 181, 253, 0.05)),
rgba(15, 23, 42, 0.75);
}
.meta-row {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
}
.eyebrow {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
border-radius: 999px;
font-size: 12px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #dbeafe;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
}
.eyebrow-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: linear-gradient(180deg, #7dd3fc, #c4b5fd);
box-shadow: 0 0 14px rgba(125, 211, 252, 0.75);
}
.location {
margin-top: 18px;
font-size: 54px;
line-height: 1.02;
letter-spacing: -0.04em;
font-weight: 700;
max-width: 560px;
}
.date {
margin-top: 12px;
font-size: 18px;
color: var(--muted);
letter-spacing: 0.01em;
}
.condition-chip {
display: inline-flex;
align-items: center;
gap: 10px;
padding: 12px 16px;
border-radius: 18px;
font-size: 14px;
color: #f8fbff;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
white-space: nowrap;
}
.condition-icon {
width: 12px;
height: 12px;
border-radius: 50%;
background: linear-gradient(180deg, var(--accent), var(--accent-2));
box-shadow: 0 0 18px rgba(125, 211, 252, 0.9);
flex: 0 0 auto;
}
.stats {
display: grid;
grid-template-columns: 1.2fr 1fr;
gap: 18px;
align-items: end;
}
.temperature-block {
display: flex;
flex-direction: column;
gap: 12px;
}
.temperature-main {
display: flex;
align-items: flex-end;
gap: 18px;
flex-wrap: wrap;
}
.big-max {
font-size: 132px;
line-height: 0.88;
letter-spacing: -0.07em;
font-weight: 800;
text-shadow: 0 14px 42px rgba(125, 211, 252, 0.15);
}
.min-wrap {
padding-bottom: 18px;
color: var(--muted);
font-size: 20px;
}
.range-card {
padding: 18px;
border-radius: 24px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.range-title {
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--muted);
margin-bottom: 14px;
}
.range-values {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.range-item {
padding: 14px;
border-radius: 18px;
background: rgba(255, 255, 255, 0.05);
}
.range-label {
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--muted);
margin-bottom: 8px;
}
.range-number {
font-size: 34px;
font-weight: 700;
letter-spacing: -0.04em;
}
.hours-panel {
display: grid;
grid-template-rows: auto 1fr;
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.02)),
rgba(15, 23, 42, 0.7);
}
.hours-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 26px 26px 18px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.hours-title {
font-size: 22px;
font-weight: 650;
letter-spacing: -0.02em;
}
.hours-subtitle {
font-size: 14px;
color: var(--muted);
margin-top: 4px;
}
.utc-badge {
padding: 10px 14px;
border-radius: 999px;
font-size: 12px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #dbeafe;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.hours-wrap {
padding: 18px 20px 20px;
overflow: auto;
}
.hours-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 14px;
}
.hour-card {
position: relative;
min-height: 118px;
padding: 16px;
border-radius: 22px;
background:
linear-gradient(180deg, rgba(125, 211, 252, 0.06), rgba(255, 255, 255, 0.03)),
rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
overflow: hidden;
}
.hour-card::after {
content: "";
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: calc(var(--fill, 0.4) * 100%);
background: linear-gradient(180deg, rgba(125, 211, 252, 0.08), rgba(125, 211, 252, 0.22));
pointer-events: none;
}
.hour-card > * {
position: relative;
z-index: 1;
}
.hour-time {
font-size: 13px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--muted);
}
.hour-temp {
margin-top: 12px;
font-size: 34px;
font-weight: 750;
letter-spacing: -0.05em;
}
.hour-label {
margin-top: 8px;
font-size: 13px;
color: #d7e4ff;
opacity: 0.88;
}
.loading,
.error {
display: grid;
place-items: center;
width: 100%;
height: 100%;
padding: 32px;
text-align: center;
}
.loading-card,
.error-card {
max-width: 760px;
padding: 32px 36px;
border-radius: 28px;
background: rgba(15, 23, 42, 0.76);
border: 1px solid rgba(255, 255, 255, 0.12);
box-shadow: var(--shadow);
backdrop-filter: blur(18px);
}
.loading-title,
.error-title {
font-size: 34px;
font-weight: 700;
letter-spacing: -0.04em;
margin: 0 0 12px;
}
.loading-copy,
.error-copy {
margin: 0;
font-size: 16px;
line-height: 1.6;
color: var(--muted);
}
.error-title {
color: #fff1f2;
}
.error-copy strong {
color: #ffffff;
font-weight: 650;
}
.footer-note {
margin-top: 14px;
font-size: 12px;
color: rgba(255, 255, 255, 0.55);
letter-spacing: 0.03em;
}
@media (max-width: 1279px), (max-height: 799px) {
body {
min-width: 1280px;
min-height: 800px;
}
}
</style>
</head>
<body>
<div id="app" class="loading" aria-live="polite">
<div class="loading-card">
<h1 class="loading-title">Loading weather</h1>
<p class="loading-copy">Preparing the daily forecast card and hourly temperatures for the requested location.</p>
</div>
</div>
<script>
(function () {
function getUtcToday() {
return new Date().toISOString().slice(0, 10);
}
function parseParams() {
var params = new URLSearchParams(window.location.search);
var lat = Number(params.get("lat"));
var lon = Number(params.get("lon"));
var name = params.get("name");
var date = params.get("date");
return {
lat: Number.isFinite(lat) ? lat : 52.52,
lon: Number.isFinite(lon) ? lon : 13.405,
name: (name && name.trim()) || "Berlin",
date: /^\d{4}-\d{2}-\d{2}$/.test(date || "") ? date : getUtcToday()
};
}
function weatherLabel(code) {
var map = {
0: "Clear sky",
1: "Mainly clear",
2: "Partly cloudy",
3: "Overcast",
45: "Fog",
48: "Depositing rime fog",
51: "Light drizzle",
53: "Moderate drizzle",
55: "Dense drizzle",
56: "Light freezing drizzle",
57: "Dense freezing drizzle",
61: "Slight rain",
63: "Moderate rain",
65: "Heavy rain",
66: "Light freezing rain",
67: "Heavy freezing rain",
71: "Slight snow fall",
73: "Moderate snow fall",
75: "Heavy snow fall",
77: "Snow grains",
80: "Slight rain showers",
81: "Moderate rain showers",
82: "Violent rain showers",
85: "Slight snow showers",
86: "Heavy snow showers",
95: "Thunderstorm",
96: "Thunderstorm with slight hail",
99: "Thunderstorm with heavy hail"
};
return map.hasOwnProperty(code) ? map[code] : "Unknown conditions";
}
function formatDate(dateStr) {
var dt = new Date(dateStr + "T00:00:00Z");
return new Intl.DateTimeFormat("en-US", {
weekday: "long",
month: "long",
day: "numeric",
year: "numeric",
timeZone: "UTC"
}).format(dt);
}
function padHour(dateTimeStr) {
var match = /T(\d{2}):(\d{2})/.exec(dateTimeStr);
if (!match) return "--:--";
return match[1] + ":" + match[2];
}
function celsius(value) {
return Math.round(value) + "°C";
}
function getEndpoint(dateStr) {
var today = getUtcToday();
return dateStr < today ? "/api/om/archive" : "/api/om/forecast";
}
function buildUrl(config) {
var endpoint = getEndpoint(config.date);
var query = new URLSearchParams({
latitude: String(config.lat),
longitude: String(config.lon),
daily: "temperature_2m_max,temperature_2m_min,weather_code",
hourly: "temperature_2m",
timezone: "UTC",
temperature_unit: "celsius",
start_date: config.date,
end_date: config.date
});
return endpoint + "?" + query.toString();
}
function safeNumber(value) {
return typeof value === "number" && Number.isFinite(value);
}
function renderError(message) {
var app = document.getElementById("app");
app.className = "error";
app.innerHTML =
'<div class="error-card">' +
'<h1 class="error-title">Weather data could not be loaded</h1>' +
'<p class="error-copy"><strong>Please try again.</strong> ' + escapeHtml(message) + '</p>' +
'<div class="footer-note">The page fetches daily and hourly weather from the local Open-Meteo compatible API.</div>' +
'</div>';
}
function escapeHtml(text) {
return String(text).replace(/[&<>"']/g, function (char) {
return ({
"&": "&",
"<": "<",
">": ">",
'"': """,
"'": "'"
})[char];
});
}
function renderWeather(config, data) {
var daily = data && data.daily;
var hourly = data && data.hourly;
if (
!daily ||
!hourly ||
!Array.isArray(daily.temperature_2m_max) ||
!Array.isArray(daily.temperature_2m_min) ||
!Array.isArray(daily.weather_code) ||
!Array.isArray(hourly.time) ||
!Array.isArray(hourly.temperature_2m) ||
!safeNumber(daily.temperature_2m_max[0]) ||
!safeNumber(daily.temperature_2m_min[0]) ||
!safeNumber(daily.weather_code[0])
) {
renderError("The weather API returned an incomplete response for the requested date.");
return;
}
var maxTemp = daily.temperature_2m_max[0];
var minTemp = daily.temperature_2m_min[0];
var code = daily.weather_code[0];
var condition = weatherLabel(code);
var hourlyItems = [];
for (var i = 0; i < hourly.time.length; i++) {
var temp = hourly.temperature_2m[i];
if (!safeNumber(temp)) continue;
hourlyItems.push({
time: hourly.time[i],
temp: temp
});
}
if (!hourlyItems.length) {
renderError("No hourly temperatures were available for the requested date.");
return;
}
var minHourly = Math.min.apply(null, hourlyItems.map(function (item) { return item.temp; }));
var maxHourly = Math.max.apply(null, hourlyItems.map(function (item) { return item.temp; }));
var span = Math.max(1, maxHourly - minHourly);
var hoursMarkup = hourlyItems.map(function (item) {
var fill = 0.22 + ((item.temp - minHourly) / span) * 0.62;
return (
'<div class="hour-card" style="--fill:' + fill.toFixed(4) + '">' +
'<div class="hour-time">' + padHour(item.time) + '</div>' +
'<div class="hour-temp">' + celsius(item.temp) + '</div>' +
'<div class="hour-label">Hourly temperature</div>' +
'</div>'
);
}).join("");
var app = document.getElementById("app");
app.className = "";
app.innerHTML =
'<div class="frame">' +
'<div class="shell">' +
'<section class="panel hero">' +
'<div>' +
'<div class="meta-row">' +
'<div>' +
'<div class="eyebrow"><span class="eyebrow-dot"></span>Weather overview</div>' +
'<div class="location">' + escapeHtml(config.name) + '</div>' +
'<div class="date">' + escapeHtml(formatDate(config.date)) + '</div>' +
'</div>' +
'<div class="condition-chip"><span class="condition-icon"></span>' + escapeHtml(condition) + '</div>' +
'</div>' +
'</div>' +
'<div class="stats">' +
'<div class="temperature-block">' +
'<div class="temperature-main">' +
'<div class="big-max">' + celsius(maxTemp) + '</div>' +
'<div class="min-wrap">Low ' + celsius(minTemp) + '</div>' +
'</div>' +
'</div>' +
'<div class="range-card">' +
'<div class="range-title">Daily range</div>' +
'<div class="range-values">' +
'<div class="range-item">' +
'<div class="range-label">Maximum</div>' +
'<div class="range-number">' + celsius(maxTemp) + '</div>' +
'</div>' +
'<div class="range-item">' +
'<div class="range-label">Minimum</div>' +
'<div class="range-number">' + celsius(minTemp) + '</div>' +
'</div>' +
'</div>' +
'</div>' +
'</div>' +
'</section>' +
'<section class="panel hours-panel">' +
'<div class="hours-header">' +
'<div>' +
'<div class="hours-title">Hourly Temperatures</div>' +
'<div class="hours-subtitle">Full day timeline for ' + escapeHtml(config.date) + '</div>' +
'</div>' +
'<div class="utc-badge">UTC</div>' +
'</div>' +
'<div class="hours-wrap">' +
'<div class="hours-grid">' + hoursMarkup + '</div>' +
'</div>' +
'</section>' +
'</div>' +
'</div>';
}
async function load() {
var config = parseParams();
var url = buildUrl(config);
try {
var response = await fetch(url, {
method: "GET",
headers: {
"Accept": "application/json"
}
});
if (!response.ok) {
throw new Error("API responded with status " + response.status + ".");
}
var data = await response.json();
renderWeather(config, data);
} catch (error) {
renderError(error && error.message ? error.message : "Unexpected network error.");
}
}
load();
})();
</script>
</body>
</html>L1 — cheap deterministic descriptors
| bytes total | 18,933 | html / css / js | 509 / 9,157 / 9,267 |
|---|---|---|---|
| dom nodes | 12 | dom depth | 5 |
| css rules | 51 | js present | yes |
| brightness | 58.1 | contrast | 33.7 |
| colorfulness | 16.7 | whitespace | 56.5% |
This slot's telemetry
| prompt tokens | 16,101 | completion tokens | 5,802 |
|---|---|---|---|
| total tokens | 21,903 | wall | 44.5 s |
| cost | — | request id | — |
config.json562 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "gpt-5.4-eff-medium--cli--cursor--dev",
"effort": "medium",
"family": "gpt",
"m": {
"min": 2,
"q": 2
},
"model_id": "gpt-5.4",
"protocol": "cli",
"served_model": "gpt-5.4-medium",
"telemetry": {
"completion_tokens": 22334,
"cost_usd": null,
"prompt_tokens": 50555,
"total_tokens": 72889,
"wall_ms": 315742
},
"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-medium--cli--cursor--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-12T21:37:02.601361+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T21:36:25.053766+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-12T21:37:50.236567+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T21:37:05.752880+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:38:58.676490+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T21:37:53.883150+00:00"
}
],
"block_index": 1,
"model_reaching_attempt_index": 0,
"slot_index": 1,
"terminal_state": "valid",
"variant": "P-q"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-08-12T21:41:51.224313+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-08-12T21:39:02.298034+00:00"
}
],
"block_index": 1,
"model_reaching_attempt_index": 0,
"slot_index": 1,
"terminal_state": "valid",
"variant": "P-min"
}
],
"retry_policy": {
"max_unreachable_retries": 5,
"rate_limit_backoff": {
"max_attempts": 4,
"max_total_ms": 60000
}
}
}