gpt-5.4 @ xhigh · codex-oauth
codex-oauthxhigh
- config
- gpt-5.4-eff-xhigh--cli--codex-oauth--dev
- batch
- 2026-07-19--unified
- transport
- codex-cli-oauth-chatgpt
- protocol
- cli · plan
- served model
- gpt-5.4
- 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 neighbors
nearest
gpt-5.4-mini @high · codex-oauth0.66gpt-5.6-sol @low · kiro0.66gpt-5.6-sol @medium · codex-oauth0.64gpt-5.4 @low · api0.63gpt-5.4-mini @low · codex-oauth0.63farthest
gpt-5.5 @low · codex-oauth0.41north-mini-code-free · api0.44gpt-5.6-luna @low · kiro0.44claude-haiku-4-5 @xhigh · CC0.44claude-haiku-4-5 @medium · CC0.44within 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 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.0" />
<meta name="color-scheme" content="light only" />
<title>Weather Card</title>
<style>
:root {
--bg-1: #061a49;
--bg-2: #0d5cad;
--bg-3: #76d2ff;
--panel: #0f2348;
--card-top: rgba(18, 34, 70, 0.58);
--card-bottom: rgba(8, 17, 37, 0.68);
--text: #eef6ff;
--muted: rgba(238, 246, 255, 0.72);
--soft: rgba(255, 255, 255, 0.08);
--line: rgba(255, 255, 255, 0.14);
--accent: #ffd36b;
--accent-soft: rgba(255, 211, 107, 0.28);
--cool: #9de6ff;
--shadow: 0 28px 70px rgba(5, 11, 25, 0.42);
}
body[data-theme="clear"] {
--bg-1: #061a49;
--bg-2: #0d5cad;
--bg-3: #76d2ff;
--panel: #0f2348;
--accent: #ffd36b;
--accent-soft: rgba(255, 211, 107, 0.28);
--cool: #9de6ff;
}
body[data-theme="cloud"] {
--bg-1: #101c33;
--bg-2: #35506d;
--bg-3: #88a2bc;
--panel: #17263f;
--accent: #eef4ff;
--accent-soft: rgba(238, 244, 255, 0.2);
--cool: #c9d9ee;
}
body[data-theme="fog"] {
--bg-1: #18222f;
--bg-2: #41596d;
--bg-3: #9bb5c3;
--panel: #1b2835;
--accent: #ffffff;
--accent-soft: rgba(255, 255, 255, 0.16);
--cool: #dce7ed;
}
body[data-theme="rain"] {
--bg-1: #08172f;
--bg-2: #11406a;
--bg-3: #1d7fa1;
--panel: #10203a;
--accent: #8fe0ff;
--accent-soft: rgba(143, 224, 255, 0.2);
--cool: #8fe0ff;
}
body[data-theme="snow"] {
--bg-1: #0f1b2b;
--bg-2: #3d6d90;
--bg-3: #b1dff2;
--panel: #15263d;
--accent: #f5fbff;
--accent-soft: rgba(245, 251, 255, 0.22);
--cool: #f5fbff;
}
body[data-theme="storm"] {
--bg-1: #070d1a;
--bg-2: #232f54;
--bg-3: #59699d;
--panel: #141c33;
--accent: #ffc567;
--accent-soft: rgba(255, 197, 103, 0.24);
--cool: #a4bfff;
}
* {
box-sizing: border-box;
}
html,
body {
width: 100%;
height: 100%;
margin: 0;
overflow: hidden;
}
body {
position: relative;
display: grid;
place-items: center;
font-family: "Gill Sans", "Trebuchet MS", "Segoe UI", sans-serif;
color: var(--text);
background:
radial-gradient(circle at 18% 18%, rgba(255, 255, 255, 0.2), transparent 24%),
radial-gradient(circle at 82% 22%, var(--accent-soft), transparent 20%),
linear-gradient(145deg, var(--bg-1) 0%, var(--bg-2) 48%, var(--bg-3) 100%);
transition: background 500ms ease;
}
body::before,
body::after {
content: "";
position: fixed;
inset: 0;
pointer-events: none;
}
body::before {
background:
radial-gradient(circle at 72% 24%, rgba(255, 255, 255, 0.2), transparent 18%),
radial-gradient(circle at 18% 72%, rgba(255, 255, 255, 0.09), transparent 22%),
radial-gradient(circle at 88% 80%, rgba(255, 255, 255, 0.08), transparent 18%);
filter: blur(18px);
opacity: 0.8;
}
body::after {
background:
linear-gradient(125deg, rgba(255, 255, 255, 0.06), transparent 36%),
repeating-linear-gradient(
120deg,
rgba(255, 255, 255, 0.025) 0px,
rgba(255, 255, 255, 0.025) 1px,
transparent 1px,
transparent 18px
);
mix-blend-mode: screen;
opacity: 0.55;
}
.scene {
position: relative;
width: min(1180px, calc(100vw - 48px));
height: min(720px, calc(100vh - 48px));
}
.orb {
position: absolute;
border-radius: 999px;
filter: blur(6px);
opacity: 0.7;
pointer-events: none;
animation: drift 16s ease-in-out infinite;
}
.orb-a {
top: 18px;
right: 110px;
width: 150px;
height: 150px;
background: radial-gradient(circle at 35% 35%, rgba(255, 255, 255, 0.44), rgba(255, 255, 255, 0.02) 68%);
}
.orb-b {
bottom: 34px;
left: 40px;
width: 220px;
height: 220px;
background: radial-gradient(circle at 40% 40%, var(--accent-soft), rgba(255, 255, 255, 0.02) 70%);
animation-duration: 22s;
animation-delay: -5s;
}
.card {
position: relative;
width: 100%;
height: 100%;
padding: 28px;
border-radius: 34px;
overflow: hidden;
background:
linear-gradient(180deg, var(--card-top) 0%, var(--card-bottom) 100%);
border: 1px solid rgba(255, 255, 255, 0.16);
box-shadow: var(--shadow);
backdrop-filter: blur(18px);
-webkit-backdrop-filter: blur(18px);
}
.card::before,
.card::after {
content: "";
position: absolute;
inset: 0;
pointer-events: none;
}
.card::before {
background:
radial-gradient(circle at 16% 18%, rgba(255, 255, 255, 0.12), transparent 30%),
radial-gradient(circle at 84% 18%, rgba(255, 255, 255, 0.08), transparent 20%),
linear-gradient(180deg, rgba(255, 255, 255, 0.04), transparent 34%);
}
.card::after {
inset: 1px;
border-radius: 33px;
border: 1px solid rgba(255, 255, 255, 0.06);
}
.shell {
position: relative;
z-index: 1;
display: grid;
grid-template-rows: auto 1fr;
gap: 24px;
height: 100%;
}
.header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 20px;
}
.eyebrow {
margin: 0 0 8px;
font-size: 12px;
letter-spacing: 0.22em;
text-transform: uppercase;
color: var(--muted);
}
.title {
margin: 0;
font-family: Georgia, "Iowan Old Style", serif;
font-size: clamp(48px, 6vw, 70px);
line-height: 0.94;
letter-spacing: -0.05em;
text-wrap: balance;
}
.date-label {
margin: 12px 0 0;
font-size: 18px;
letter-spacing: 0.01em;
color: var(--muted);
}
.pill {
display: inline-flex;
align-items: center;
gap: 10px;
padding: 12px 16px;
border-radius: 999px;
border: 1px solid rgba(255, 255, 255, 0.14);
background: rgba(255, 255, 255, 0.08);
color: var(--text);
font-size: 14px;
white-space: nowrap;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.pill::before {
content: "";
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--accent);
box-shadow: 0 0 16px var(--accent-soft);
flex: 0 0 auto;
}
.content {
display: grid;
grid-template-columns: minmax(0, 1.02fr) minmax(0, 0.98fr);
gap: 24px;
min-height: 0;
}
.hero,
.hourly-panel {
position: relative;
min-height: 0;
border-radius: 28px;
border: 1px solid var(--line);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.04)),
rgba(6, 14, 28, 0.22);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08);
overflow: hidden;
}
.hero {
padding: 28px;
display: grid;
grid-template-rows: auto auto 1fr auto;
gap: 20px;
}
.hero::before {
content: "";
position: absolute;
inset: 0;
background:
radial-gradient(circle at 18% 16%, rgba(255, 255, 255, 0.1), transparent 24%),
radial-gradient(circle at 86% 8%, var(--accent-soft), transparent 18%);
opacity: 0.85;
pointer-events: none;
}
.hero-top {
position: relative;
z-index: 1;
display: flex;
align-items: center;
gap: 22px;
}
.icon-frame {
position: relative;
width: 172px;
height: 172px;
flex: 0 0 auto;
display: grid;
place-items: center;
border-radius: 50%;
background:
radial-gradient(circle at 35% 30%, rgba(255, 255, 255, 0.22), transparent 42%),
linear-gradient(180deg, rgba(255, 255, 255, 0.11), rgba(255, 255, 255, 0.03));
border: 1px solid rgba(255, 255, 255, 0.14);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.12),
0 22px 48px rgba(0, 0, 0, 0.18);
overflow: hidden;
}
.icon-frame::before {
content: "";
position: absolute;
inset: 10px;
border-radius: 50%;
background: radial-gradient(circle at 50% 36%, rgba(255, 255, 255, 0.12), transparent 58%);
border: 1px solid rgba(255, 255, 255, 0.06);
}
.weather-icon {
position: relative;
z-index: 1;
width: 136px;
height: 136px;
filter: drop-shadow(0 10px 22px rgba(0, 0, 0, 0.16));
}
.weather-icon svg {
width: 100%;
height: 100%;
overflow: visible;
}
.weather-icon .sun-pulse {
transform-origin: center;
animation: pulse 6s ease-in-out infinite;
}
.weather-icon .float-cloud {
animation: driftMini 7s ease-in-out infinite;
}
.weather-icon .rain-drop {
animation: rain 1.5s linear infinite;
}
.weather-icon .rain-drop:nth-child(2) {
animation-delay: 0.2s;
}
.weather-icon .rain-drop:nth-child(3) {
animation-delay: 0.4s;
}
.weather-icon .spark {
animation: flicker 2.4s ease-in-out infinite;
}
.condition-block {
min-width: 0;
}
.condition {
margin: 0;
font-size: clamp(30px, 3vw, 40px);
line-height: 1;
letter-spacing: -0.03em;
}
.coords {
margin: 10px 0 0;
color: var(--muted);
font-size: 15px;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.temp-band {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
}
.temp-card {
padding: 18px 20px;
border-radius: 22px;
background: rgba(255, 255, 255, 0.07);
border: 1px solid rgba(255, 255, 255, 0.12);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.temp-card span {
display: block;
font-size: 13px;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--muted);
margin-bottom: 8px;
}
.temp-card strong {
display: block;
font-size: clamp(34px, 4.2vw, 52px);
line-height: 0.98;
letter-spacing: -0.05em;
font-weight: 600;
}
.summary {
position: relative;
z-index: 1;
margin: 0;
color: var(--text);
font-size: 18px;
line-height: 1.45;
max-width: 56ch;
}
.micro {
position: relative;
z-index: 1;
align-self: end;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding-top: 10px;
border-top: 1px solid rgba(255, 255, 255, 0.1);
color: var(--muted);
font-size: 14px;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.hourly-panel {
padding: 22px 22px 18px;
display: grid;
grid-template-rows: auto 220px 1fr;
gap: 16px;
}
.panel-head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 12px;
}
.panel-head h2 {
margin: 0;
font-size: 24px;
line-height: 1;
letter-spacing: -0.03em;
}
.panel-head .tiny {
color: var(--muted);
font-size: 13px;
letter-spacing: 0.18em;
text-transform: uppercase;
}
.chart {
position: relative;
border-radius: 24px;
border: 1px solid rgba(255, 255, 255, 0.1);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.03)),
rgba(3, 9, 20, 0.16);
overflow: hidden;
}
.chart::before {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.05), transparent 38%);
pointer-events: none;
}
#hourlyChart {
width: 100%;
height: 100%;
display: block;
}
.hourly-grid {
display: grid;
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: 10px;
align-content: start;
}
.hour-item {
padding: 12px 10px;
border-radius: 18px;
border: 1px solid rgba(255, 255, 255, 0.08);
background:
linear-gradient(
180deg,
rgba(255, 255, 255, calc(0.1 + (var(--level) * 0.16))),
rgba(255, 255, 255, 0.04)
);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);
text-align: center;
min-height: 74px;
}
.hour-time {
display: block;
color: var(--muted);
font-size: 12px;
letter-spacing: 0.12em;
text-transform: uppercase;
margin-bottom: 8px;
}
.hour-temp {
display: block;
font-size: 20px;
line-height: 1;
letter-spacing: -0.03em;
font-weight: 600;
}
.overlay {
position: absolute;
inset: 110px 28px 28px;
display: grid;
place-items: center;
pointer-events: none;
}
.overlay[hidden] {
display: none;
}
.error-box {
max-width: 460px;
padding: 20px 24px;
border-radius: 22px;
background: rgba(12, 19, 36, 0.82);
border: 1px solid rgba(255, 255, 255, 0.14);
backdrop-filter: blur(8px);
text-align: center;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.24);
}
.error-title {
margin: 0 0 8px;
font-size: 24px;
line-height: 1.1;
}
.error-copy {
margin: 0;
color: var(--muted);
font-size: 16px;
line-height: 1.45;
}
.card[data-state="loading"] .content {
opacity: 0.84;
}
.card[data-state="error"] .content {
opacity: 0.22;
filter: blur(1px);
}
.chart-label {
font-family: "Gill Sans", "Trebuchet MS", sans-serif;
font-size: 11px;
fill: rgba(238, 246, 255, 0.72);
letter-spacing: 0.08em;
}
.chart-value {
font-family: "Gill Sans", "Trebuchet MS", sans-serif;
font-size: 11px;
fill: rgba(238, 246, 255, 0.64);
}
@keyframes drift {
0%, 100% {
transform: translate3d(0, 0, 0);
}
50% {
transform: translate3d(12px, -14px, 0);
}
}
@keyframes driftMini {
0%, 100% {
transform: translateY(0);
}
50% {
transform: translateY(-4px);
}
}
@keyframes pulse {
0%, 100% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
}
@keyframes rain {
0% {
transform: translateY(0);
opacity: 0.85;
}
70% {
opacity: 1;
}
100% {
transform: translateY(7px);
opacity: 0.2;
}
}
@keyframes flicker {
0%, 100% {
opacity: 1;
}
45% {
opacity: 0.85;
}
50% {
opacity: 0.35;
}
55% {
opacity: 1;
}
}
</style>
</head>
<body data-theme="clear">
<div class="scene">
<div class="orb orb-a"></div>
<div class="orb orb-b"></div>
<section class="card" id="card" data-state="loading">
<div class="shell">
<header class="header">
<div>
<p class="eyebrow">Weather Snapshot</p>
<h1 class="title" id="location">Berlin</h1>
<p class="date-label" id="dateLabel">Loading date...</p>
</div>
<div class="pill" id="endpointTag">Loading</div>
</header>
<div class="content">
<section class="hero">
<div class="hero-top">
<div class="icon-frame">
<div class="weather-icon" id="weatherIcon" aria-hidden="true"></div>
</div>
<div class="condition-block">
<p class="condition" id="condition">Loading weather...</p>
<p class="coords" id="coords">52.52° · 13.41°</p>
</div>
</div>
<div class="temp-band">
<div class="temp-card">
<span>Maximum</span>
<strong id="maxTemp">--</strong>
</div>
<div class="temp-card">
<span>Minimum</span>
<strong id="minTemp">--</strong>
</div>
</div>
<p class="summary" id="summary">Requesting the selected day in UTC.</p>
<div class="micro">
<span>Hourly curve and full-day readout</span>
<span id="rangeLabel">--</span>
</div>
</section>
<aside class="hourly-panel">
<div class="panel-head">
<h2>Hourly Temperatures</h2>
<span class="tiny">UTC</span>
</div>
<div class="chart">
<svg id="hourlyChart" viewBox="0 0 540 220" preserveAspectRatio="none" aria-label="Hourly temperature chart"></svg>
</div>
<div class="hourly-grid" id="hourlyGrid"></div>
</aside>
</div>
</div>
<div class="overlay" id="overlay" hidden>
<div class="error-box">
<h2 class="error-title">Weather data could not be loaded.</h2>
<p class="error-copy" id="errorCopy">Please try again with a valid location and date.</p>
</div>
</div>
</section>
</div>
<script>
(function () {
const elements = {
card: document.getElementById("card"),
overlay: document.getElementById("overlay"),
errorCopy: document.getElementById("errorCopy"),
location: document.getElementById("location"),
dateLabel: document.getElementById("dateLabel"),
endpointTag: document.getElementById("endpointTag"),
condition: document.getElementById("condition"),
coords: document.getElementById("coords"),
maxTemp: document.getElementById("maxTemp"),
minTemp: document.getElementById("minTemp"),
summary: document.getElementById("summary"),
rangeLabel: document.getElementById("rangeLabel"),
hourlyGrid: document.getElementById("hourlyGrid"),
hourlyChart: document.getElementById("hourlyChart"),
weatherIcon: document.getElementById("weatherIcon")
};
const DEFAULTS = {
lat: 52.52,
lon: 13.405,
name: "Berlin",
date: todayUTC()
};
const WEATHER = {
0: { label: "Clear Sky", theme: "clear" },
1: { label: "Mainly Clear", theme: "clear" },
2: { label: "Partly Cloudy", theme: "cloud" },
3: { label: "Overcast", theme: "cloud" },
45: { label: "Fog", theme: "fog" },
48: { label: "Rime Fog", theme: "fog" },
51: { label: "Light Drizzle", theme: "rain" },
53: { label: "Drizzle", theme: "rain" },
55: { label: "Dense Drizzle", theme: "rain" },
56: { label: "Light Freezing Drizzle", theme: "rain" },
57: { label: "Dense Freezing Drizzle", theme: "rain" },
61: { label: "Light Rain", theme: "rain" },
63: { label: "Rain", theme: "rain" },
65: { label: "Heavy Rain", theme: "rain" },
66: { label: "Light Freezing Rain", theme: "rain" },
67: { label: "Heavy Freezing Rain", theme: "rain" },
71: { label: "Light Snow", theme: "snow" },
73: { label: "Snow", theme: "snow" },
75: { label: "Heavy Snow", theme: "snow" },
77: { label: "Snow Grains", theme: "snow" },
80: { label: "Rain Showers", theme: "rain" },
81: { label: "Heavy Showers", theme: "rain" },
82: { label: "Violent Showers", theme: "storm" },
85: { label: "Snow Showers", theme: "snow" },
86: { label: "Heavy Snow Showers", theme: "snow" },
95: { label: "Thunderstorm", theme: "storm" },
96: { label: "Thunderstorm with Hail", theme: "storm" },
99: { label: "Severe Thunderstorm", theme: "storm" }
};
setPlaceholder();
loadWeather().catch(function () {
setError("Please check the selected date or try again in a moment.");
});
async function loadWeather() {
const query = readQuery();
const endpoint = query.date < todayUTC() ? "/api/om/archive" : "/api/om/forecast";
const endpointName = endpoint.indexOf("archive") !== -1 ? "Archive" : "Forecast";
elements.location.textContent = query.name;
elements.dateLabel.textContent = formatDate(query.date);
elements.coords.textContent = formatCoord(query.lat, "lat") + " · " + formatCoord(query.lon, "lon");
elements.endpointTag.textContent = endpointName + " API";
elements.card.dataset.state = "loading";
elements.overlay.hidden = true;
const params = new URLSearchParams({
latitude: String(query.lat),
longitude: String(query.lon),
daily: "temperature_2m_max,temperature_2m_min,weather_code",
hourly: "temperature_2m",
timezone: "UTC",
temperature_unit: "celsius",
start_date: query.date,
end_date: query.date
});
const response = await fetch(endpoint + "?" + params.toString(), {
headers: { Accept: "application/json" },
cache: "no-store"
});
if (!response.ok) {
throw new Error("Bad response");
}
const data = await response.json();
const daily = data && data.daily ? data.daily : null;
const hourly = data && data.hourly ? data.hourly : null;
if (
!daily ||
!hourly ||
!Array.isArray(daily.temperature_2m_max) ||
!Array.isArray(daily.temperature_2m_min) ||
!Array.isArray(daily.weather_code) ||
!Array.isArray(hourly.temperature_2m) ||
!Array.isArray(hourly.time) ||
daily.temperature_2m_max.length === 0 ||
daily.temperature_2m_min.length === 0 ||
daily.weather_code.length === 0 ||
hourly.temperature_2m.length === 0 ||
hourly.time.length === 0
) {
throw new Error("Malformed data");
}
const max = Number(daily.temperature_2m_max[0]);
const min = Number(daily.temperature_2m_min[0]);
const code = Number(daily.weather_code[0]);
const hourlyTemps = hourly.temperature_2m.map(Number);
const hourlyTimes = hourly.time.slice();
const weather = WEATHER[code] || { label: "Unknown Conditions", theme: "cloud" };
if (!Number.isFinite(max) || !Number.isFinite(min) || hourlyTemps.some(function (t) { return !Number.isFinite(t); })) {
throw new Error("Invalid temperature data");
}
document.body.dataset.theme = weather.theme;
elements.weatherIcon.innerHTML = iconMarkup(weather.theme);
elements.condition.textContent = weather.label;
elements.maxTemp.textContent = formatTemp(max);
elements.minTemp.textContent = formatTemp(min);
elements.rangeLabel.textContent = "Range " + formatTemp(Math.max.apply(null, hourlyTemps), true) + " to " + formatTemp(Math.min.apply(null, hourlyTemps), true);
const hottestIndex = indexOfExtrema(hourlyTemps, "max");
const coolestIndex = indexOfExtrema(hourlyTemps, "min");
elements.summary.textContent =
weather.label +
". Warmest around " +
formatHour(hourlyTimes[hottestIndex]) +
" and coolest near " +
formatHour(hourlyTimes[coolestIndex]) +
".";
renderHourlyGrid(hourlyTimes, hourlyTemps);
renderChart(hourlyTimes, hourlyTemps);
elements.endpointTag.textContent = endpointName + " API · UTC";
elements.card.dataset.state = "ready";
}
function renderHourlyGrid(times, temps) {
elements.hourlyGrid.innerHTML = "";
const min = Math.min.apply(null, temps);
const max = Math.max.apply(null, temps);
const span = max - min || 1;
for (let i = 0; i < times.length; i += 1) {
const item = document.createElement("div");
const time = document.createElement("span");
const temp = document.createElement("span");
const level = (temps[i] - min) / span;
item.className = "hour-item";
item.style.setProperty("--level", level.toFixed(3));
time.className = "hour-time";
time.textContent = formatHour(times[i]);
temp.className = "hour-temp";
temp.textContent = formatTemp(temps[i], true);
item.appendChild(time);
item.appendChild(temp);
elements.hourlyGrid.appendChild(item);
}
}
function renderChart(times, temps) {
const width = 540;
const height = 220;
const padX = 24;
const padY = 22;
const innerW = width - padX * 2;
const innerH = height - padY * 2;
const min = Math.min.apply(null, temps);
const max = Math.max.apply(null, temps);
const span = max - min || 1;
const points = temps.map(function (value, index) {
const x = padX + (index / Math.max(temps.length - 1, 1)) * innerW;
const y = padY + (1 - ((value - min) / span)) * innerH;
return [x, y];
});
const linePoints = points.map(function (point) {
return point[0].toFixed(2) + "," + point[1].toFixed(2);
}).join(" ");
const areaPoints =
linePoints +
" " +
(padX + innerW).toFixed(2) +
"," +
(padY + innerH).toFixed(2) +
" " +
padX.toFixed(2) +
"," +
(padY + innerH).toFixed(2);
const gridLines = [];
const labels = [];
for (let i = 0; i < 4; i += 1) {
const ratio = i / 3;
const y = padY + ratio * innerH;
const value = max - ratio * span;
gridLines.push(
'<line x1="' + padX + '" y1="' + y.toFixed(2) + '" x2="' + (padX + innerW) + '" y2="' + y.toFixed(2) + '" stroke="rgba(255,255,255,0.10)" stroke-width="1" />'
);
labels.push(
'<text class="chart-value" x="' + (padX + 4) + '" y="' + (y - 6).toFixed(2) + '">' + formatTemp(value, true) + "</text>"
);
}
const xLabels = [];
const step = temps.length > 18 ? 4 : 3;
for (let i = 0; i < times.length; i += step) {
const x = padX + (i / Math.max(times.length - 1, 1)) * innerW;
xLabels.push(
'<text class="chart-label" x="' + x.toFixed(2) + '" y="' + (height - 12) + '" text-anchor="middle">' + formatHour(times[i], true) + "</text>"
);
}
if ((times.length - 1) % step !== 0) {
xLabels.push(
'<text class="chart-label" x="' + (padX + innerW).toFixed(2) + '" y="' + (height - 12) + '" text-anchor="end">' + formatHour(times[times.length - 1], true) + "</text>"
);
}
const dots = points.filter(function (_, index) {
return index % step === 0 || index === points.length - 1;
}).map(function (point) {
return '<circle cx="' + point[0].toFixed(2) + '" cy="' + point[1].toFixed(2) + '" r="4.5" fill="var(--text)" stroke="rgba(255,255,255,0.35)" stroke-width="2" />';
}).join("");
elements.hourlyChart.innerHTML =
'<defs>' +
'<linearGradient id="lineGlow" x1="0" y1="0" x2="1" y2="1">' +
'<stop offset="0%" stop-color="var(--cool)" />' +
'<stop offset="100%" stop-color="var(--accent)" />' +
"</linearGradient>" +
'<linearGradient id="areaGlow" x1="0" y1="0" x2="0" y2="1">' +
'<stop offset="0%" stop-color="rgba(255,255,255,0.28)" />' +
'<stop offset="100%" stop-color="rgba(255,255,255,0.03)" />' +
"</linearGradient>" +
"</defs>" +
gridLines.join("") +
labels.join("") +
'<polygon points="' + areaPoints + '" fill="url(#areaGlow)" />' +
'<polyline points="' + linePoints + '" fill="none" stroke="url(#lineGlow)" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" />' +
dots +
xLabels.join("");
}
function setPlaceholder() {
elements.weatherIcon.innerHTML = iconMarkup("clear");
elements.location.textContent = DEFAULTS.name;
elements.dateLabel.textContent = formatDate(DEFAULTS.date);
elements.coords.textContent = formatCoord(DEFAULTS.lat, "lat") + " · " + formatCoord(DEFAULTS.lon, "lon");
}
function setError(message) {
document.body.dataset.theme = "cloud";
elements.card.dataset.state = "error";
elements.overlay.hidden = false;
elements.endpointTag.textContent = "Unavailable";
elements.condition.textContent = "Data unavailable";
elements.summary.textContent = "Weather data could not be loaded.";
elements.errorCopy.textContent = message || "Please try again with a valid location and date.";
elements.maxTemp.textContent = "--";
elements.minTemp.textContent = "--";
elements.rangeLabel.textContent = "--";
elements.hourlyGrid.innerHTML = "";
elements.hourlyChart.innerHTML = "";
elements.weatherIcon.innerHTML = iconMarkup("cloud");
}
function readQuery() {
const params = new URLSearchParams(window.location.search);
const lat = parseFloat(params.get("lat"));
const lon = parseFloat(params.get("lon"));
const name = (params.get("name") || DEFAULTS.name).trim() || DEFAULTS.name;
const requestedDate = (params.get("date") || "").trim();
const date = isValidISODate(requestedDate) ? requestedDate : DEFAULTS.date;
return {
lat: Number.isFinite(lat) ? lat : DEFAULTS.lat,
lon: Number.isFinite(lon) ? lon : DEFAULTS.lon,
name: name,
date: date
};
}
function formatDate(isoDate) {
const date = new Date(isoDate + "T00:00:00Z");
return new Intl.DateTimeFormat("en-US", {
weekday: "long",
month: "long",
day: "numeric",
year: "numeric",
timeZone: "UTC"
}).format(date);
}
function formatHour(isoString, compact) {
const hour = isoString.slice(11, 13);
return compact ? hour : hour + ":00";
}
function formatTemp(value, compact) {
const rounded = Math.round(value * 10) / 10;
const text = Number.isInteger(rounded) ? String(rounded) : rounded.toFixed(1);
return compact ? text + "°" : text + "°C";
}
function formatCoord(value, type) {
const abs = Math.abs(value).toFixed(2);
if (type === "lat") {
return abs + "°" + (value >= 0 ? "N" : "S");
}
return abs + "°" + (value >= 0 ? "E" : "W");
}
function isValidISODate(value) {
if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) {
return false;
}
const date = new Date(value + "T00:00:00Z");
return !Number.isNaN(date.getTime()) && date.toISOString().slice(0, 10) === value;
}
function todayUTC() {
return new Date().toISOString().slice(0, 10);
}
function indexOfExtrema(values, kind) {
let bestIndex = 0;
for (let i = 1; i < values.length; i += 1) {
if ((kind === "max" && values[i] > values[bestIndex]) || (kind === "min" && values[i] < values[bestIndex])) {
bestIndex = i;
}
}
return bestIndex;
}
function iconMarkup(theme) {
if (theme === "clear") {
return '' +
'<svg viewBox="0 0 160 160" aria-hidden="true">' +
'<circle class="sun-pulse" cx="80" cy="80" r="28" fill="rgba(255,211,107,0.95)" />' +
'<g stroke="rgba(255,241,203,0.95)" stroke-width="8" stroke-linecap="round">' +
'<line x1="80" y1="18" x2="80" y2="38" />' +
'<line x1="80" y1="122" x2="80" y2="142" />' +
'<line x1="18" y1="80" x2="38" y2="80" />' +
'<line x1="122" y1="80" x2="142" y2="80" />' +
'<line x1="36" y1="36" x2="50" y2="50" />' +
'<line x1="110" y1="110" x2="124" y2="124" />' +
'<line x1="36" y1="124" x2="50" y2="110" />' +
'<line x1="110" y1="50" x2="124" y2="36" />' +
"</g>" +
"</svg>";
}
if (theme === "cloud") {
return '' +
'<svg viewBox="0 0 160 160" aria-hidden="true">' +
'<g class="float-cloud">' +
'<path d="M48 111c-16 0-29-11-29-26 0-14 11-24 25-26 4-20 21-33 42-33 22 0 40 14 43 35 13 1 25 12 25 27 0 15-13 23-28 23H48z" fill="rgba(245,249,255,0.9)" />' +
'<path d="M48 111c-16 0-29-11-29-26 0-14 11-24 25-26 4-20 21-33 42-33 22 0 40 14 43 35 13 1 25 12 25 27 0 15-13 23-28 23H48z" fill="none" stroke="rgba(255,255,255,0.7)" stroke-width="6" stroke-linejoin="round" />' +
"</g>" +
"</svg>";
}
if (theme === "fog") {
return '' +
'<svg viewBox="0 0 160 160" aria-hidden="true">' +
'<g class="float-cloud">' +
'<path d="M48 86c-14 0-26-10-26-23 0-12 10-20 22-22 4-16 18-26 35-26 18 0 32 10 36 26 12 0 23 10 23 23 0 12-10 22-24 22H48z" fill="rgba(245,249,255,0.9)" />' +
"</g>" +
'<g stroke="rgba(255,255,255,0.75)" stroke-width="8" stroke-linecap="round">' +
'<line x1="30" y1="102" x2="130" y2="102" />' +
'<line x1="20" y1="120" x2="114" y2="120" />' +
'<line x1="46" y1="138" x2="140" y2="138" />' +
"</g>" +
"</svg>";
}
if (theme === "snow") {
return '' +
'<svg viewBox="0 0 160 160" aria-hidden="true">' +
'<g class="float-cloud">' +
'<path d="M48 92c-15 0-27-10-27-24 0-13 10-22 24-24 4-18 19-29 38-29 20 0 36 12 40 30 12 1 23 10 23 24 0 14-11 23-27 23H48z" fill="rgba(245,251,255,0.95)" />' +
"</g>" +
'<g stroke="rgba(245,251,255,0.95)" stroke-width="5" stroke-linecap="round">' +
'<line x1="52" y1="112" x2="52" y2="136" /><line x1="40" y1="124" x2="64" y2="124" /><line x1="44" y1="116" x2="60" y2="132" /><line x1="60" y1="116" x2="44" y2="132" />' +
'<line x1="82" y1="112" x2="82" y2="136" /><line x1="70" y1="124" x2="94" y2="124" /><line x1="74" y1="116" x2="90" y2="132" /><line x1="90" y1="116" x2="74" y2="132" />' +
'<line x1="112" y1="112" x2="112" y2="136" /><line x1="100" y1="124" x2="124" y2="124" /><line x1="104" y1="116" x2="120" y2="132" /><line x1="120" y1="116" x2="104" y2="132" />' +
"</g>" +
"</svg>";
}
if (theme === "storm") {
return '' +
'<svg viewBox="0 0 160 160" aria-hidden="true">' +
'<g class="float-cloud">' +
'<path d="M48 90c-15 0-27-10-27-24 0-13 10-22 24-24 4-18 19-29 38-29 20 0 36 12 40 30 12 1 23 10 23 24 0 14-11 23-27 23H48z" fill="rgba(229,235,255,0.95)" />' +
"</g>" +
'<polygon class="spark" points="92,86 68,120 88,120 72,148 112,104 90,104" fill="rgba(255,197,103,0.98)" />' +
'<g stroke="rgba(255,197,103,0.85)" stroke-width="4" stroke-linecap="round">' +
'<line x1="52" y1="106" x2="46" y2="120" />' +
'<line x1="120" y1="106" x2="126" y2="120" />' +
"</g>" +
"</svg>";
}
return '' +
'<svg viewBox="0 0 160 160" aria-hidden="true">' +
'<g class="float-cloud">' +
'<path d="M48 92c-15 0-27-10-27-24 0-13 10-22 24-24 4-18 19-29 38-29 20 0 36 12 40 30 12 1 23 10 23 24 0 14-11 23-27 23H48z" fill="rgba(240,247,255,0.92)" />' +
"</g>" +
'<g stroke="rgba(143,224,255,0.95)" stroke-width="6" stroke-linecap="round">' +
'<line class="rain-drop" x1="58" y1="108" x2="54" y2="128" />' +
'<line class="rain-drop" x1="82" y1="110" x2="78" y2="130" />' +
'<line class="rain-drop" x1="106" y1="108" x2="102" y2="128" />' +
"</g>" +
"</svg>";
}
})();
</script>
</body>
</html>L1 — cheap deterministic descriptors
| bytes total | 36,710 | html / css / js | 2,666 / 14,976 / 19,068 |
|---|---|---|---|
| dom nodes | 50 | dom depth | 10 |
| css rules | 90 | js present | yes |
| brightness | 62.6 | contrast | 27.5 |
| colorfulness | 30.7 | whitespace | 54.6% |
This slot's telemetry
| prompt tokens | 0 | completion tokens | 26,062 |
|---|---|---|---|
| total tokens | 0 | wall | 364.8 s |
| cost | — | request id | — |
config.json551 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "gpt-5.4-eff-xhigh--cli--codex-oauth--dev",
"effort": "xhigh",
"family": "gpt",
"m": {
"min": 2,
"q": 2
},
"model_id": "gpt-5.4",
"protocol": "cli",
"served_model": "gpt-5.4",
"telemetry": {
"completion_tokens": 174811,
"cost_usd": null,
"prompt_tokens": null,
"total_tokens": null,
"wall_ms": 1862244
},
"transport": "codex-cli-oauth-chatgpt",
"vendor_sanction_ref": null
}send-log2.5 KB
{
"N": 2,
"batch_id": "2026-07-20--refill-codex",
"config_id": "gpt-5.4-eff-xhigh--cli--codex-oauth--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-20T07:59:07.519850+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-20T07:53:26.129344+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-20T08:05:17.746985+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-20T07:59:12.968056+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-20T08:18:02.105100+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-20T08:05:22.080725+00:00"
}
],
"block_index": 1,
"model_reaching_attempt_index": 0,
"slot_index": 1,
"terminal_state": "valid",
"variant": "P-q"
},
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-07-20T08:24:42.313683+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-07-20T08:18:06.185128+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
}
}
}