claude-opus-5-5 @ xhigh · CC
CCxhigh
- config
- claude-opus-5-5-eff-xhigh--cli--claude-code--dev
- batch
- 2026-07-19--unified
- transport
- claude-code-cli-headless
- protocol
- cli · plan
- served model
- claude-opus-5-5
- 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
claude-fable-5-1 @max · CC0.72claude-fable-5-1 @xhigh · CC0.71claude-opus-5-5 @high · CC0.69claude-opus-5-thinking @low · cursor-xl0.67gpt-5.6-terra @xhigh · cursor0.67farthest
qwen3.6-plus · go0.48grok-4.3 @medium · api0.48grok-4.3 @low · api0.48grok-4.3 · api0.49deepseek-v4-flash · opencode0.49within 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
- hourlymismatchcoverage 0/24 · 0 match · 2 mismatch · 22 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="light dark">
<title>Weather</title>
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='5' fill='%23f7a928'/%3E%3C/svg%3E">
<style>
:root{
color-scheme:light;
--page:#eceff4;--bg-a:#dfe7f5;--bg-b:#f4e8dc;
--surface:#ffffff;--card-edge:rgba(15,21,33,.06);
--ink:#0f1521;--ink-2:#4a5264;--ink-3:#7b8395;
--hair:#e6e9ef;--grid:#eef0f4;--axis:#d5dae3;--wash:#f1f3f7;
--accent:#eb6834;--focus:#2a78d6;
--tip-bg:#ffffff;--tip-edge:rgba(15,21,33,.08);
--band-hair:rgba(15,21,33,.1);--pill-bg:rgba(255,255,255,.72);--pill-edge:rgba(15,21,33,.06);
--sk-a:#e9edf2;--sk-b:#f5f7fa;--sk-band-a:rgba(255,255,255,.4);--sk-band-b:rgba(255,255,255,.9);
--sun:#f7a928;--cloud:#ffffff;--cloud-2:#d3dbe6;--cloud-dark:#8f9bb0;--drop:#3b86e0;--flake:#6fa6e8;--bolt:#f4b41a;--fog:#aab4c1;
--icon-shadow:drop-shadow(0 8px 12px rgba(38,58,96,.16));
--shadow:0 1px 2px rgba(15,21,33,.04),0 12px 32px -8px rgba(15,21,33,.12),0 40px 80px -32px rgba(15,21,33,.22);
--dot-hist:#8b93a3;--dot-today:#1baf7a;--dot-fc:#2a78d6;
}
@media (prefers-color-scheme:dark){
:root{
color-scheme:dark;
--page:#0b0e13;--bg-a:#141d2b;--bg-b:#20190f;
--surface:#141922;--card-edge:rgba(255,255,255,.06);
--ink:#f1f4f8;--ink-2:#b3bac8;--ink-3:#858d9e;
--hair:#242a35;--grid:#1d232d;--axis:#2e3542;--wash:#1c222c;
--accent:#d95926;--focus:#3987e5;
--tip-bg:#1c222c;--tip-edge:rgba(255,255,255,.08);
--band-hair:rgba(255,255,255,.12);--pill-bg:rgba(255,255,255,.07);--pill-edge:rgba(255,255,255,.08);
--sk-a:#1b2029;--sk-b:#252b36;--sk-band-a:rgba(255,255,255,.04);--sk-band-b:rgba(255,255,255,.1);
--cloud:#e4e9f0;--cloud-2:#8d99ab;--cloud-dark:#667287;--drop:#5b9cf0;--flake:#a8caf3;--fog:#6c7788;
--icon-shadow:drop-shadow(0 8px 14px rgba(0,0,0,.4));
--shadow:0 1px 2px rgba(0,0,0,.3),0 24px 60px -16px rgba(0,0,0,.6);
--dot-today:#199e70;--dot-fc:#3987e5;
}
}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
[hidden]{display:none!important}
html{-webkit-text-size-adjust:100%}
body{
min-height:100vh;display:grid;place-items:center;padding:40px 32px;
font:15px/1.45 ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Inter,Roboto,"Helvetica Neue",Arial,sans-serif;
color:var(--ink);
background:
radial-gradient(1100px 640px at 6% -14%,var(--bg-a),transparent 62%),
radial-gradient(900px 600px at 106% 114%,var(--bg-b),transparent 60%),
var(--page);
-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
}
.stage{width:100%;display:flex;justify-content:center}
.sr{position:absolute!important;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
/* ---------- card ---------- */
.card{
position:relative;width:min(1120px,100%);background:var(--surface);border-radius:28px;
box-shadow:var(--shadow),0 0 0 1px var(--card-edge);overflow:hidden;
animation:rise .55s cubic-bezier(.2,.7,.2,1) both;
}
@keyframes rise{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
/* condition-tinted header band */
.card{--band:linear-gradient(125deg,#f3f5f9 0%,#e6ebf2 100%);--glow:rgba(255,255,255,.8)}
.card[data-cond="clear"]{--band:linear-gradient(125deg,#fff2dc 0%,#ffe8cf 32%,#e4eeff 100%);--glow:rgba(255,200,110,.55)}
.card[data-cond="partly"]{--band:linear-gradient(125deg,#fff3e1 0%,#edf2fb 50%,#dce8f8 100%);--glow:rgba(255,210,140,.45)}
.card[data-cond="overcast"]{--band:linear-gradient(125deg,#f2f4f7 0%,#e0e5ec 100%);--glow:rgba(255,255,255,.75)}
.card[data-cond="fog"]{--band:linear-gradient(125deg,#f4f5f6 0%,#e4e7ea 100%);--glow:rgba(255,255,255,.85)}
.card[data-cond="drizzle"]{--band:linear-gradient(125deg,#eef3f9 0%,#dbe5f0 100%);--glow:rgba(255,255,255,.6)}
.card[data-cond="rain"]{--band:linear-gradient(125deg,#e8eff8 0%,#d2dfee 100%);--glow:rgba(190,215,245,.6)}
.card[data-cond="sleet"]{--band:linear-gradient(125deg,#edf2f8 0%,#dae3ef 100%);--glow:rgba(220,235,250,.7)}
.card[data-cond="snow"]{--band:linear-gradient(125deg,#f7faff 0%,#e2ebf7 100%);--glow:rgba(255,255,255,.9)}
.card[data-cond="thunder"]{--band:linear-gradient(125deg,#eceaf6 0%,#d7daee 100%);--glow:rgba(255,215,130,.35)}
@media (prefers-color-scheme:dark){
.card{--band:linear-gradient(125deg,#1a1f28 0%,#161b23 100%);--glow:rgba(255,255,255,.04)}
.card[data-cond="clear"]{--band:linear-gradient(125deg,#2d2416 0%,#1c2233 55%,#152038 100%);--glow:rgba(255,170,60,.18)}
.card[data-cond="partly"]{--band:linear-gradient(125deg,#28231c 0%,#1a2233 55%,#17203a 100%);--glow:rgba(255,180,90,.12)}
.card[data-cond="overcast"]{--band:linear-gradient(125deg,#1f242c 0%,#191d24 100%);--glow:rgba(255,255,255,.04)}
.card[data-cond="fog"]{--band:linear-gradient(125deg,#212428 0%,#1a1d21 100%);--glow:rgba(255,255,255,.05)}
.card[data-cond="drizzle"]{--band:linear-gradient(125deg,#1a2230 0%,#161c26 100%);--glow:rgba(120,160,220,.08)}
.card[data-cond="rain"]{--band:linear-gradient(125deg,#172133 0%,#131a27 100%);--glow:rgba(80,140,230,.12)}
.card[data-cond="sleet"]{--band:linear-gradient(125deg,#1a2331 0%,#151c27 100%);--glow:rgba(150,190,240,.08)}
.card[data-cond="snow"]{--band:linear-gradient(125deg,#1d2634 0%,#182030 100%);--glow:rgba(200,225,255,.08)}
.card[data-cond="thunder"]{--band:linear-gradient(125deg,#221f36 0%,#17192a 100%);--glow:rgba(255,200,80,.1)}
}
.band{
position:relative;isolation:isolate;display:grid;grid-template-columns:minmax(0,1fr) auto;
align-items:center;gap:40px;padding:34px 44px;background:var(--band);
}
.band::before{content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
background:radial-gradient(560px 340px at 86% -12%,var(--glow),transparent 70%)}
.band::after{content:"";position:absolute;left:0;right:0;bottom:0;height:1px;background:var(--band-hair);opacity:.6}
.eyebrow{display:flex;align-items:center;gap:10px;margin-bottom:16px;min-height:26px}
.pill{
display:inline-flex;align-items:center;gap:7px;height:26px;padding:0 11px 0 10px;border-radius:999px;
background:var(--pill-bg);box-shadow:inset 0 0 0 1px var(--pill-edge);
font-size:12px;font-weight:600;letter-spacing:.01em;color:var(--ink);
-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
}
.pill-dot{width:7px;height:7px;border-radius:50%;background:var(--dot-fc)}
.pill[data-kind="historical"] .pill-dot{background:var(--dot-hist)}
.pill[data-kind="today"] .pill-dot{background:var(--dot-today);animation:ping 2.4s ease-out infinite}
@keyframes ping{0%{box-shadow:0 0 0 0 rgba(27,175,122,.45)}70%,100%{box-shadow:0 0 0 7px rgba(27,175,122,0)}}
.rel{font-size:13px;font-weight:500;color:var(--ink-2)}
h1{
font-size:44px;line-height:1.06;font-weight:650;letter-spacing:-.028em;overflow-wrap:anywhere;
display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.date{margin-top:10px;font-size:18px;font-weight:500;color:var(--ink-2);letter-spacing:-.005em}
.coords{margin-top:8px;display:flex;align-items:center;gap:6px;font-size:13px;color:var(--ink-3);font-variant-numeric:tabular-nums}
.pin{width:14px;height:14px;fill:currentColor;flex:none}
.wx{display:flex;align-items:center;gap:26px}
.icon{width:116px;height:116px;flex:none;display:grid;place-items:center}
.icon svg{width:100%;height:100%;overflow:visible;filter:var(--icon-shadow)}
.readout{display:flex;flex-direction:column;min-width:0}
.cond{font-size:20px;font-weight:600;letter-spacing:-.012em;line-height:1.2;margin-bottom:12px;max-width:340px}
.temps{display:flex;align-items:stretch}
.t{display:flex;flex-direction:column;gap:6px;padding:0 28px}
.t:first-child{padding-left:0}
.t:last-child{padding-right:0}
.t+.t{border-left:1px solid var(--band-hair)}
.lbl{display:inline-flex;align-items:center;gap:5px;font-size:13px;font-weight:500;color:var(--ink-2)}
.lbl svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.val{display:flex;align-items:flex-start;font-size:60px;line-height:.95;font-weight:600;letter-spacing:-.04em;white-space:nowrap}
.lo .val{font-weight:300;color:var(--ink-2)}
.u{font-size:22px;font-weight:500;letter-spacing:0;margin:5px 0 0 3px;color:var(--ink-2)}
/* weather icon parts */
.i-sun{fill:var(--sun)}
.i-ray line{stroke:var(--sun);stroke-width:4.5;stroke-linecap:round}
.i-ray{transform-box:fill-box;transform-origin:center;animation:spin 80s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.i-cloud{fill:var(--cloud)}
.i-cloud2{fill:var(--cloud-2)}
.i-cloud-dark{fill:var(--cloud-dark)}
.i-drop line{stroke:var(--drop);stroke-width:5;stroke-linecap:round}
.i-dropf{fill:var(--drop)}
.i-flake line{stroke:var(--flake);stroke-width:2.6;stroke-linecap:round}
.i-bolt{fill:var(--bolt)}
.i-fog line{stroke:var(--fog);stroke-width:5;stroke-linecap:round}
.i-slash-bg{stroke:var(--surface);stroke-width:11;stroke-linecap:round}
.i-slash{stroke:var(--ink-3);stroke-width:4.5;stroke-linecap:round}
/* ---------- hourly section ---------- */
.body{padding:26px 44px 10px}
.body-head{display:flex;align-items:flex-end;justify-content:space-between;gap:24px;margin-bottom:10px}
.body-head h2{font-size:16px;font-weight:600;letter-spacing:-.01em}
.sub{margin-top:2px;font-size:13px;color:var(--ink-3)}
.facts{display:flex;gap:32px}
.fact dt{font-size:12px;color:var(--ink-3)}
.fact dd{margin-top:1px;font-size:15px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.005em}
.chart{position:relative;height:232px;border-radius:14px;outline:none;touch-action:pan-y;cursor:crosshair}
.chart:focus-visible{box-shadow:0 0 0 2px var(--surface),0 0 0 4px var(--focus)}
.chart svg{position:absolute;left:0;top:0;display:block;overflow:visible}
.chart.fresh svg{animation:fade .3s ease both}
@keyframes fade{from{opacity:0}to{opacity:1}}
.grid{stroke:var(--grid);stroke-width:1}
.axis{stroke:var(--axis);stroke-width:1}
.ytick{fill:var(--ink-3);font-size:11px;font-variant-numeric:tabular-nums}
.area{fill:url(#wx-area)}
.st-a{stop-color:var(--accent);stop-opacity:.2}
.st-b{stop-color:var(--accent);stop-opacity:0}
.line{fill:none;stroke:var(--accent);stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.pt{fill:var(--accent)}
.mk{fill:var(--accent);stroke:var(--surface);stroke-width:2}
.mk-lbl{fill:var(--ink);font-size:12px;font-weight:600;font-variant-numeric:tabular-nums;paint-order:stroke;stroke:var(--surface);stroke-width:4px;stroke-linejoin:round}
.nowl{stroke:var(--ink-3);stroke-width:1;opacity:.7}
.now-lbl{fill:var(--ink-2);font-size:10.5px;font-weight:600;letter-spacing:.06em}
.xh line{stroke:var(--ink-3);stroke-width:1}
.xh circle{fill:var(--accent);stroke:var(--surface);stroke-width:2.5}
.chart-empty{position:absolute;inset:0;display:grid;place-items:center;font-size:14px;color:var(--ink-3);
border:1px dashed var(--hair);border-radius:14px}
.tip{
position:absolute;left:0;top:0;z-index:2;pointer-events:none;white-space:nowrap;
padding:8px 12px 8px 11px;border-radius:10px;background:var(--tip-bg);
box-shadow:0 0 0 1px var(--tip-edge),0 10px 24px -8px rgba(15,21,33,.25);
}
.tv{display:flex;align-items:center;gap:8px;font-size:15px;font-weight:650;letter-spacing:-.01em;font-variant-numeric:tabular-nums}
.tv i{width:12px;height:2px;border-radius:1px;background:var(--accent)}
.tk{margin-top:1px;padding-left:20px;font-size:12px;color:var(--ink-3);font-variant-numeric:tabular-nums}
.strip-wrap{min-height:52px}
.strip{margin-top:6px;border-collapse:separate;border-spacing:0;table-layout:fixed;font-variant-numeric:tabular-nums}
.strip th,.strip td{text-align:center;transition:background-color .12s}
.strip thead th{padding:7px 0 2px;font-size:11px;font-weight:500;color:var(--ink-3);border-radius:8px 8px 0 0}
.strip tbody td{padding:2px 0 8px;font-size:12.5px;color:var(--ink);letter-spacing:-.01em;border-radius:0 0 8px 8px}
.strip .rh{text-align:right;padding-right:10px;font-size:11px;font-weight:500;color:var(--ink-3);border-radius:0}
.strip td.x{font-weight:700}
.strip td.na{color:var(--ink-3)}
.strip .on{background:var(--wash)}
/* ---------- states ---------- */
.card[data-state="loading"] :is(.icon,.cond,.val){
color:transparent;border-radius:12px;
background:linear-gradient(90deg,var(--sk-band-a) 0%,var(--sk-band-b) 50%,var(--sk-band-a) 100%);
background-size:200% 100%;animation:shimmer 1.4s ease-in-out infinite;
}
.card[data-state="loading"] .icon{width:96px;height:96px;margin:10px;border-radius:50%}
.card[data-state="loading"] .cond{width:170px}
.card[data-state="loading"] .val{width:128px;height:57px}
.card[data-state="loading"] .lo .val{width:104px}
.card[data-state="loading"] .chart{
background:linear-gradient(90deg,var(--sk-a) 0%,var(--sk-b) 50%,var(--sk-a) 100%);
background-size:200% 100%;animation:shimmer 1.4s ease-in-out infinite;
}
.card[data-state="loading"] :is(.facts,.strip,.chart svg){visibility:hidden}
@keyframes shimmer{0%{background-position:100% 0}100%{background-position:-100% 0}}
.card[data-state="error"] :is(.wx,.body-head,.chart,.strip-wrap){display:none}
.card:not([data-state="error"]) .error{display:none}
.error{display:flex;flex-direction:column;align-items:center;text-align:center;padding:30px 24px 40px}
.err-icon{width:84px;height:84px;margin-bottom:14px}
.err-icon svg{width:100%;height:100%;overflow:visible}
.error h2{font-size:21px;font-weight:650;letter-spacing:-.015em}
.error p{margin-top:8px;max-width:540px;color:var(--ink-2)}
.error .reason{
margin-top:14px;max-width:640px;padding:8px 12px;border-radius:10px;background:var(--wash);
font:12.5px/1.5 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color:var(--ink-2);overflow-wrap:anywhere;
}
.btn{
margin-top:22px;display:inline-flex;align-items:center;gap:8px;height:38px;padding:0 18px;border:0;border-radius:999px;
background:var(--ink);color:var(--surface);font-family:inherit;font-size:14px;font-weight:600;cursor:pointer;
transition:transform .15s ease,opacity .15s ease;
}
.btn:hover{opacity:.88}
.btn:active{transform:scale(.97)}
.btn:focus-visible{outline:2px solid var(--focus);outline-offset:3px}
.btn svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.foot{display:flex;justify-content:space-between;gap:16px;padding:14px 44px 20px;border-top:1px solid var(--hair);font-size:12px;color:var(--ink-3)}
.noscript{padding:40px 44px;text-align:center;color:var(--ink-2)}
@media (prefers-reduced-motion:reduce){
*,*::before,*::after{animation:none!important;transition:none!important}
}
</style>
</head>
<body>
<main class="stage">
<article class="card" id="card" data-state="loading" data-cond="none" aria-busy="true" aria-labelledby="loc-name">
<header class="band">
<div class="loc">
<div class="eyebrow">
<span class="pill" id="pill" data-kind="forecast"><span class="pill-dot" aria-hidden="true"></span><span id="pill-text">Forecast</span></span>
<span class="rel" id="rel"></span>
</div>
<h1 id="loc-name">Berlin</h1>
<p class="date"><time id="loc-date"></time></p>
<p class="coords">
<svg class="pin" viewBox="0 0 16 16" aria-hidden="true"><path d="M8 1.5a4.75 4.75 0 0 0-4.75 4.75c0 3.4 4.1 7.7 4.28 7.88a.66.66 0 0 0 .94 0c.18-.18 4.280-4.48 4.28-7.88A4.75 4.75 0 0 0 8 1.5Zm0 6.6a1.85 1.85 0 1 1 0-3.7 1.85 1.85 0 0 1 0 3.7Z"/></svg>
<span id="loc-coords"></span>
</p>
</div>
<div class="wx">
<div class="icon" id="icon" aria-hidden="true"></div>
<div class="readout">
<p class="cond" id="cond">Loading…</p>
<div class="temps">
<div class="t hi">
<span class="lbl"><svg viewBox="0 0 12 12" aria-hidden="true"><path d="M6 10.5V1.5M2.5 5 6 1.5 9.5 5"/></svg>High</span>
<span class="val" id="tmax"> </span>
</div>
<div class="t lo">
<span class="lbl"><svg viewBox="0 0 12 12" aria-hidden="true"><path d="M6 1.5v9M2.5 7 6 10.5 9.5 7"/></svg>Low</span>
<span class="val" id="tmin"> </span>
</div>
</div>
</div>
</div>
</header>
<section class="body" aria-labelledby="hourly-title">
<div class="body-head">
<div>
<h2 id="hourly-title">Hourly temperature</h2>
<p class="sub">Degrees Celsius · times in UTC</p>
</div>
<dl class="facts" id="facts"></dl>
</div>
<div class="chart" id="chart" tabindex="0" role="group" aria-roledescription="chart" aria-label="Hourly temperature chart">
<svg id="svg" aria-hidden="true"></svg>
<div class="tip" id="tip" hidden><div class="tv"><i></i><span id="tip-v"></span></div><div class="tk" id="tip-k"></div></div>
<p class="chart-empty" id="chart-empty" hidden>Hourly temperatures are not available for this date.</p>
</div>
<div class="strip-wrap" id="strip-wrap"><table class="strip" id="strip"></table></div>
<div class="error" id="error" role="alert">
<div class="err-icon" id="err-icon" aria-hidden="true"></div>
<h2>Weather data could not be loaded</h2>
<p id="err-msg"></p>
<p class="reason" id="err-reason"></p>
<button type="button" class="btn" id="retry"><svg viewBox="0 0 16 16" aria-hidden="true"><path d="M13.5 8a5.5 5.5 0 1 1-1.6-3.9M13.5 2.5v3h-3"/></svg>Try again</button>
</div>
<noscript><style>.body>*:not(noscript),.wx{display:none!important}</style><p class="noscript">Weather data could not be loaded because JavaScript is disabled.</p></noscript>
</section>
<footer class="foot"><span id="foot-src">Data: Open-Meteo</span><span id="foot-meta">Temperatures in °C · Times in UTC</span></footer>
</article>
</main>
<p class="sr" id="status" aria-live="polite"></p>
<script>
(() => {
'use strict';
const DEFAULTS = { lat: 52.52, lon: 13.405, name: 'Berlin' };
const PAD = { l: 48, r: 16, t: 34, b: 26 };
const WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
const MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
const WMO = {
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: 'Light rain', 63: 'Moderate rain', 65: 'Heavy rain',
66: 'Light freezing rain', 67: 'Heavy freezing rain',
71: 'Light snowfall', 73: 'Moderate snowfall', 75: 'Heavy snowfall', 77: 'Snow grains',
80: 'Light rain showers', 81: 'Moderate rain showers', 82: 'Violent rain showers',
85: 'Light snow showers', 86: 'Heavy snow showers',
95: 'Thunderstorm', 96: 'Thunderstorm with slight hail', 99: 'Thunderstorm with heavy hail'
};
const $ = id => document.getElementById(id);
const card = $('card'), chartEl = $('chart'), svg = $('svg'), tip = $('tip'), strip = $('strip');
/* ---------- parameters ---------- */
const qs = new URLSearchParams(window.location.search);
const param = k => (qs.get(k) || '').trim();
const todayISO = new Date().toISOString().slice(0, 10);
function readCoord(key, def, limit) {
const raw = param(key);
if (!raw) return { value: def, ok: true };
const n = Number(raw);
return { value: n, raw, ok: Number.isFinite(n) && Math.abs(n) <= limit };
}
function isISODate(s) {
if (!/^\d{4}-\d{2}-\d{2}$/.test(s)) return false;
const d = new Date(s + 'T00:00:00Z');
return !isNaN(d.getTime()) && d.toISOString().slice(0, 10) === s;
}
const lat = readCoord('lat', DEFAULTS.lat, 90);
const lon = readCoord('lon', DEFAULTS.lon, 180);
const name = param('name') || DEFAULTS.name;
const date = param('date') || todayISO;
const dateOk = isISODate(date);
const dayDiff = dateOk ? Math.round((Date.parse(date + 'T00:00:00Z') - Date.parse(todayISO + 'T00:00:00Z')) / 864e5) : 0;
const isPast = dateOk && date < todayISO;
const isToday = dateOk && date === todayISO;
const endpoint = isPast ? '/api/om/archive' : '/api/om/forecast';
/* ---------- formatting ---------- */
const pad2 = n => String(n).padStart(2, '0');
const hh = i => pad2(i) + ':00';
const fmt1 = v => (Math.round(v * 10) / 10).toFixed(1);
const n2 = v => +v.toFixed(2);
function longDate(iso) {
const d = new Date(iso + 'T00:00:00Z');
return `${WEEKDAYS[d.getUTCDay()]}, ${d.getUTCDate()} ${MONTHS[d.getUTCMonth()]} ${d.getUTCFullYear()}`;
}
function coord(v, pos, neg) {
return `${+Math.abs(v).toFixed(3)}° ${v < 0 ? neg : pos}`;
}
function relative(d) {
const abs = Math.abs(d);
let s;
try {
const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });
s = abs < 60 ? rtf.format(d, 'day') : abs < 730 ? rtf.format(Math.round(d / 30.44), 'month') : rtf.format(Math.round(d / 365.25), 'year');
} catch (_) {
s = d < 0 ? `${abs} days ago` : `in ${abs} days`;
}
return s.charAt(0).toUpperCase() + s.slice(1);
}
function status(text) { $('status').textContent = text; }
/* ---------- icons ---------- */
const CLOUD = '<circle cx="24" cy="14" r="12"/><circle cx="12" cy="19" r="8"/><circle cx="35" cy="18" r="9"/><rect x="4" y="17" width="40" height="10" rx="5"/>';
const cloud = (x, y, s, cls = 'i-cloud') => `<g class="${cls}" transform="translate(${x} ${y}) scale(${s})">${CLOUD}</g>`;
const lines = (cls, arr) => `<g class="${cls}">${arr.map(([a, b, c, d]) => `<line x1="${a}" y1="${b}" x2="${c}" y2="${d}"/>`).join('')}</g>`;
const dots = (cls, arr, r) => `<g class="${cls}">${arr.map(([x, y]) => `<circle cx="${x}" cy="${y}" r="${r}"/>`).join('')}</g>`;
function sun(cx, cy, r) {
let rays = '';
for (let k = 0; k < 8; k++) {
const a = k * Math.PI / 4, c = Math.cos(a), s = Math.sin(a);
rays += `<line x1="${n2(cx + c * (r + 6))}" y1="${n2(cy + s * (r + 6))}" x2="${n2(cx + c * (r + 12))}" y2="${n2(cy + s * (r + 12))}"/>`;
}
return `<g class="i-ray">${rays}</g><circle class="i-sun" cx="${cx}" cy="${cy}" r="${r}"/>`;
}
function flakes(arr) {
return `<g class="i-flake">${arr.map(([x, y]) => {
let s = '';
for (let k = 0; k < 3; k++) {
const a = k * Math.PI / 3 + Math.PI / 6, dx = n2(Math.cos(a) * 4.5), dy = n2(Math.sin(a) * 4.5);
s += `<line x1="${n2(x - dx)}" y1="${n2(y - dy)}" x2="${n2(x + dx)}" y2="${n2(y + dy)}"/>`;
}
return s;
}).join('')}</g>`;
}
function icon(kind) {
let b;
switch (kind) {
case 'clear': b = sun(48, 48, 17); break;
case 'partly': b = sun(34, 36, 13) + cloud(25, 42, 1.4); break;
case 'fog': b = cloud(12, 12, 1.5) + lines('i-fog', [[22, 64, 68, 64], [30, 75, 76, 75], [20, 86, 60, 86]]); break;
case 'drizzle': b = cloud(12, 10, 1.5) + dots('i-dropf', [[32, 64], [48, 68], [64, 64], [40, 80], [56, 82]], 3.2); break;
case 'rain': b = cloud(12, 10, 1.5) + lines('i-drop', [[34, 62, 29, 76], [50, 62, 45, 80], [66, 62, 61, 76]]); break;
case 'sleet': b = cloud(12, 10, 1.5) + lines('i-drop', [[34, 62, 30, 74], [62, 62, 58, 74]]) + flakes([[48, 68], [38, 84], [60, 84]]); break;
case 'snow': b = cloud(12, 10, 1.5) + flakes([[32, 66], [50, 70], [68, 66], [41, 84], [60, 85]]); break;
case 'thunder': b = cloud(12, 8, 1.5, 'i-cloud-dark') + lines('i-drop', [[28, 60, 24, 72], [72, 60, 68, 72]]) + '<path class="i-bolt" d="M52 45 38 67h10l-6 21 20-27H51l7-16z"/>'; break;
case 'error': b = cloud(12, 22, 1.5, 'i-cloud2') + '<line class="i-slash-bg" x1="26" y1="18" x2="72" y2="80"/><line class="i-slash" x1="26" y1="18" x2="72" y2="80"/>'; break;
default: b = cloud(34, 20, 1.1, 'i-cloud2') + cloud(8, 34, 1.5);
}
return `<svg viewBox="0 0 96 96" aria-hidden="true" focusable="false">${b}</svg>`;
}
function kindOf(c) {
if (c === null) return 'none';
if (c === 0) return 'clear';
if (c === 1 || c === 2) return 'partly';
if (c === 3) return 'overcast';
if (c === 45 || c === 48) return 'fog';
if (c === 56 || c === 57 || c === 66 || c === 67) return 'sleet';
if (c >= 51 && c <= 55) return 'drizzle';
if ((c >= 61 && c <= 65) || (c >= 80 && c <= 82)) return 'rain';
if ((c >= 71 && c <= 77) || c === 85 || c === 86) return 'snow';
if (c >= 95 && c <= 99) return 'thunder';
return 'overcast';
}
/* ---------- header (known before data arrives) ---------- */
function paintHeader() {
$('loc-name').textContent = name;
document.title = `${name} · Weather`;
const t = $('loc-date');
t.textContent = dateOk ? longDate(date) : date;
if (dateOk) t.dateTime = date;
$('loc-coords').textContent = lat.ok && lon.ok
? `${coord(lat.value, 'N', 'S')} · ${coord(lon.value, 'E', 'W')}`
: `${lat.raw ?? lat.value}, ${lon.raw ?? lon.value}`;
const kind = !dateOk ? 'forecast' : dayDiff < 0 ? 'historical' : dayDiff === 0 ? 'today' : 'forecast';
$('pill').dataset.kind = kind;
$('pill-text').textContent = kind === 'historical' ? 'Historical' : kind === 'today' ? 'Today' : 'Forecast';
$('rel').textContent = !dateOk ? '' : dayDiff === 0 ? 'Forecast' : relative(dayDiff);
$('foot-src').textContent = `Data: Open-Meteo ${isPast ? 'historical weather archive' : 'weather forecast'}`;
$('foot-meta').textContent = `${dateOk ? date + ' · ' : ''}Temperatures in °C · Times in UTC`;
$('err-icon').innerHTML = icon('error');
}
/* ---------- data ---------- */
function buildURL() {
const q = [
['latitude', String(lat.value)],
['longitude', String(lon.value)],
['daily', 'temperature_2m_max,temperature_2m_min,weather_code'],
['hourly', 'temperature_2m'],
['timezone', 'UTC'],
['temperature_unit', 'celsius'],
['start_date', date],
['end_date', date]
].map(([k, v]) => `${k}=${encodeURIComponent(v).replace(/%2C/gi, ',')}`).join('&');
return `${endpoint}?${q}`;
}
const num = v => (typeof v === 'number' && Number.isFinite(v) ? v : null);
function parse(body) {
const d = body.daily || {}, h = body.hourly || {};
const di = Array.isArray(d.time) ? d.time.indexOf(date) : -1;
const pick = arr => (Array.isArray(arr) && di >= 0 ? num(arr[di]) : null);
let tmax = pick(d.temperature_2m_max);
let tmin = pick(d.temperature_2m_min);
const code = pick(d.weather_code !== undefined ? d.weather_code : d.weathercode);
const hours = new Array(24).fill(null);
const times = Array.isArray(h.time) ? h.time : [];
const temps = Array.isArray(h.temperature_2m) ? h.temperature_2m : [];
times.forEach((t, i) => {
if (typeof t !== 'string' || t.slice(0, 10) !== date) return;
const hr = parseInt(t.slice(11, 13), 10);
if (hr >= 0 && hr < 24) hours[hr] = num(temps[i]);
});
let maxI = -1, minI = -1, sum = 0, count = 0;
hours.forEach((v, i) => {
if (v === null) return;
sum += v; count++;
if (maxI < 0 || v > hours[maxI]) maxI = i;
if (minI < 0 || v < hours[minI]) minI = i;
});
if (tmax === null && count) tmax = hours[maxI];
if (tmin === null && count) tmin = hours[minI];
if (tmax === null && tmin === null && code === null && !count) {
throw new Error(`The service returned no weather data for ${dateOk ? longDate(date) : date} at this location.`);
}
return { tmax, tmin, code, hours, maxI, minI, avg: count ? sum / count : null, count };
}
let reqId = 0;
async function load() {
const id = ++reqId;
setState('loading');
const problem = !dateOk ? `“${date}” is not a valid date. Use the format YYYY-MM-DD.`
: !lat.ok ? `“${lat.raw}” is not a valid latitude (expected a number from -90 to 90).`
: !lon.ok ? `“${lon.raw}” is not a valid longitude (expected a number from -180 to 180).`
: null;
if (problem) return fail(problem, false);
const ctrl = new AbortController();
const timer = setTimeout(() => ctrl.abort(), 20000);
try {
const res = await fetch(buildURL(), { signal: ctrl.signal, headers: { Accept: 'application/json' }, cache: 'no-store' });
let body = null;
try { body = await res.json(); } catch (_) { /* not JSON */ }
if (!res.ok || (body && body.error)) {
throw new Error(body && body.reason
? String(body.reason)
: `The weather service responded with HTTP ${res.status}${res.statusText ? ' ' + res.statusText : ''}.`);
}
if (!body || typeof body !== 'object') throw new Error('The weather service returned an unreadable response.');
const data = parse(body);
if (id !== reqId) return;
render(data);
} catch (err) {
if (id !== reqId) return;
let msg = (err && err.message) || 'Unknown error.';
if (err && err.name === 'AbortError') msg = 'The request timed out.';
else if (err instanceof TypeError && /fetch|network|load failed/i.test(msg)) msg = 'The weather service could not be reached. Check your connection and try again.';
fail(msg, true);
} finally {
clearTimeout(timer);
}
}
function setState(s) {
card.dataset.state = s;
card.setAttribute('aria-busy', String(s === 'loading'));
if (s === 'loading') {
$('cond').textContent = 'Loading…';
status(`Loading weather for ${name}…`);
}
}
function fail(reason, canRetry) {
model = null; view = null;
card.dataset.cond = 'none';
$('err-msg').textContent = `We couldn't load the weather for ${name}${dateOk ? ' on ' + longDate(date) : ''}.`;
$('err-reason').textContent = reason;
$('retry').hidden = !canRetry;
setState('error');
status(`Weather data could not be loaded. ${reason}`);
}
/* ---------- render ---------- */
let model = null, view = null, active = null;
function setTemp(el, v) {
el.textContent = '';
if (v === null) { el.textContent = '—'; return; }
el.append(fmt1(v));
const u = document.createElement('span');
u.className = 'u';
u.textContent = '°C';
el.append(u);
}
function render(m) {
model = m;
active = null;
const kind = kindOf(m.code);
card.dataset.cond = kind;
$('icon').innerHTML = icon(kind);
const condText = m.code === null ? 'Conditions unavailable' : (WMO[m.code] || `Weather code ${m.code}`);
$('cond').textContent = condText;
setTemp($('tmax'), m.tmax);
setTemp($('tmin'), m.tmin);
const facts = $('facts');
facts.textContent = '';
if (m.count) {
[['Average', fmt1(m.avg) + ' °C'], ['Warmest', hh(m.maxI)], ['Coolest', hh(m.minI)]].forEach(([k, v]) => {
const wrap = document.createElement('div'), dt = document.createElement('dt'), dd = document.createElement('dd');
wrap.className = 'fact';
dt.textContent = k;
dd.textContent = v;
wrap.append(dt, dd);
facts.append(wrap);
});
chartEl.setAttribute('aria-label',
`Hourly temperature chart. Warmest ${fmt1(m.hours[m.maxI])} °C at ${hh(m.maxI)} UTC, coolest ${fmt1(m.hours[m.minI])} °C at ${hh(m.minI)} UTC. Use the left and right arrow keys to read each hour.`);
}
setState('ready');
buildStrip();
chartEl.classList.add('fresh');
draw();
const hi = m.tmax === null ? 'unavailable' : fmt1(m.tmax) + ' °C';
const lo = m.tmin === null ? 'unavailable' : fmt1(m.tmin) + ' °C';
status(`${name}, ${longDate(date)}: ${condText}. High ${hi}, low ${lo}.`);
}
function buildStrip() {
const h = model.hours;
$('strip-wrap').hidden = !model.count;
let head = '<tr><th scope="row" class="rh">UTC</th>';
let body = '<tr><th scope="row" class="rh">°C</th>';
for (let i = 0; i < 24; i++) {
const v = h[i];
const cls = v === null ? ' class="na"' : (i === model.maxI || i === model.minI) ? ' class="x"' : '';
head += `<th scope="col" data-i="${i}">${pad2(i)}</th>`;
body += `<td data-i="${i}"${cls}>${v === null ? '—' : fmt1(v) + '°'}</td>`;
}
strip.innerHTML =
`<caption class="sr">Hourly temperatures in degrees Celsius for ${longDate(date)}, UTC</caption>` +
`<colgroup><col style="width:${PAD.l}px">${'<col>'.repeat(24)}</colgroup>` +
`<thead>${head}</tr></thead><tbody>${body}</tr></tbody>`;
strip.style.width = `calc(100% - ${PAD.r}px)`;
}
function niceStep(range, count) {
const raw = range / count;
const p = Math.pow(10, Math.floor(Math.log10(raw)));
const f = raw / p;
return (f <= 1 ? 1 : f <= 2 ? 2 : f <= 5 ? 5 : 10) * p;
}
// Monotone cubic interpolation: smooth, never overshoots the measured values.
function smoothPath(p) {
const f = v => v.toFixed(1);
const n = p.length;
if (n === 2) return `M${f(p[0][0])},${f(p[0][1])}L${f(p[1][0])},${f(p[1][1])}`;
const m = [], t = new Array(n);
for (let i = 0; i < n - 1; i++) m[i] = (p[i + 1][1] - p[i][1]) / (p[i + 1][0] - p[i][0]);
t[0] = m[0];
t[n - 1] = m[n - 2];
for (let i = 1; i < n - 1; i++) t[i] = m[i - 1] * m[i] <= 0 ? 0 : (2 * m[i - 1] * m[i]) / (m[i - 1] + m[i]);
let d = `M${f(p[0][0])},${f(p[0][1])}`;
for (let i = 0; i < n - 1; i++) {
const k = (p[i + 1][0] - p[i][0]) / 3;
d += `C${f(p[i][0] + k)},${f(p[i][1] + t[i] * k)} ${f(p[i + 1][0] - k)},${f(p[i + 1][1] - t[i + 1] * k)} ${f(p[i + 1][0])},${f(p[i + 1][1])}`;
}
return d;
}
function draw() {
if (!model) return;
const hours = model.hours;
$('chart-empty').hidden = model.count > 0;
if (!model.count) { svg.innerHTML = ''; view = null; return; }
const W = Math.max(320, Math.round(chartEl.clientWidth));
const H = Math.round(chartEl.clientHeight);
const pw = W - PAD.l - PAD.r, ph = H - PAD.t - PAD.b, col = pw / 24;
let lo = hours[model.minI], hi = hours[model.maxI];
if (hi - lo < 2) { const mid = (hi + lo) / 2; lo = mid - 1; hi = mid + 1; }
const padV = (hi - lo) * 0.08;
const step = niceStep(hi - lo + 2 * padV, 4);
const y0 = Math.floor((lo - padV) / step) * step;
const y1 = Math.ceil((hi + padV) / step) * step;
const ticks = Math.round((y1 - y0) / step);
const X = i => PAD.l + (i + 0.5) * col;
const Y = v => PAD.t + (1 - (v - y0) / (y1 - y0)) * ph;
const base = H - PAD.b;
const tick = v => (step < 1 ? v.toFixed(1) : String(Math.round(v)));
let s = '<defs><linearGradient id="wx-area" x1="0" y1="0" x2="0" y2="1"><stop offset="0" class="st-a"/><stop offset="1" class="st-b"/></linearGradient></defs>';
for (let k = 0; k <= ticks; k++) {
const v = y0 + k * step, y = Math.round(Y(v)) + 0.5;
s += `<line class="${k === 0 ? 'axis' : 'grid'}" x1="${PAD.l}" x2="${W - PAD.r}" y1="${y}" y2="${y}"/>`;
s += `<text class="ytick" x="${PAD.l - 10}" y="${y + 3.5}" text-anchor="end">${tick(v)}°</text>`;
}
if (isToday) {
const now = new Date();
const x = Math.round(Math.min(X(now.getUTCHours() + now.getUTCMinutes() / 60), W - PAD.r)) + 0.5;
const right = x + 40 > W;
s += `<line class="nowl" x1="${x}" x2="${x}" y1="4" y2="${base}"/>`;
s += `<text class="now-lbl" x="${right ? x - 6 : x + 6}" y="12" text-anchor="${right ? 'end' : 'start'}">NOW</text>`;
}
const segs = [];
let cur = null;
hours.forEach((v, i) => {
if (v === null) { cur = null; return; }
if (!cur) segs.push(cur = []);
cur.push([X(i), Y(v)]);
});
let areas = '', paths = '';
segs.forEach(seg => {
if (seg.length === 1) {
paths += `<circle class="pt" cx="${seg[0][0].toFixed(1)}" cy="${seg[0][1].toFixed(1)}" r="3"/>`;
return;
}
const d = smoothPath(seg);
areas += `<path class="area" d="${d}L${seg[seg.length - 1][0].toFixed(1)},${base}L${seg[0][0].toFixed(1)},${base}Z"/>`;
paths += `<path class="line" d="${d}"/>`;
});
s += areas + paths;
const label = (i, dy) => {
const x = Math.min(Math.max(X(i), PAD.l + 16), W - PAD.r - 16);
return `<circle class="mk" cx="${X(i).toFixed(1)}" cy="${Y(hours[i]).toFixed(1)}" r="4.5"/>` +
`<text class="mk-lbl" x="${x.toFixed(1)}" y="${(Y(hours[i]) + dy).toFixed(1)}" text-anchor="middle">${fmt1(hours[i])}°</text>`;
};
s += label(model.maxI, -11);
if (model.minI !== model.maxI) s += label(model.minI, 20);
s += `<g class="xh" id="xh" style="display:none"><line x1="0" x2="0" y1="${PAD.t - 12}" y2="${base}"/><circle r="5.5" cx="0" cy="0"/></g>`;
svg.setAttribute('width', W);
svg.setAttribute('height', H);
svg.setAttribute('viewBox', `0 0 ${W} ${H}`);
svg.innerHTML = s;
view = { W, H, col, X, Y };
if (active !== null) setActive(active);
}
/* ---------- hover / keyboard ---------- */
function setActive(i) {
if (i !== null && (!view || !model)) return;
active = i;
strip.querySelectorAll('.on').forEach(c => c.classList.remove('on'));
const xh = svg.querySelector('#xh');
if (i === null) {
if (xh) xh.style.display = 'none';
tip.hidden = true;
return;
}
strip.querySelectorAll(`[data-i="${i}"]`).forEach(c => c.classList.add('on'));
const v = model.hours[i], x = view.X(i);
const ln = xh.querySelector('line'), dot = xh.querySelector('circle');
xh.style.display = '';
ln.setAttribute('x1', x);
ln.setAttribute('x2', x);
if (v === null) {
dot.style.display = 'none';
} else {
dot.style.display = '';
dot.setAttribute('cx', x);
dot.setAttribute('cy', view.Y(v));
}
$('tip-v').textContent = v === null ? 'No data' : `${fmt1(v)} °C`;
$('tip-k').textContent = `${hh(i)} UTC`;
tip.hidden = false;
const tw = tip.offsetWidth, th = tip.offsetHeight;
let left = x + 14;
if (left + tw > view.W - 2) left = x - 14 - tw;
const ay = v === null ? view.H / 2 : view.Y(v);
let top = ay - th - 14;
if (top < 0) top = ay + 14;
tip.style.transform = `translate(${Math.round(left)}px, ${Math.round(top)}px)`;
}
const defaultIndex = () => (isToday ? new Date().getUTCHours() : model.maxI);
chartEl.addEventListener('pointermove', e => {
if (!view) return;
const r = chartEl.getBoundingClientRect();
const i = Math.max(0, Math.min(23, Math.floor((e.clientX - r.left - PAD.l) / view.col)));
if (i !== active) setActive(i);
});
chartEl.addEventListener('pointerleave', () => { if (document.activeElement !== chartEl) setActive(null); });
chartEl.addEventListener('focus', () => { if (view && active === null) setActive(defaultIndex()); });
chartEl.addEventListener('blur', () => setActive(null));
chartEl.addEventListener('keydown', e => {
if (!view) return;
let i = active === null ? defaultIndex() : active;
if (e.key === 'ArrowRight') i = Math.min(23, i + 1);
else if (e.key === 'ArrowLeft') i = Math.max(0, i - 1);
else if (e.key === 'Home') i = 0;
else if (e.key === 'End') i = 23;
else if (e.key === 'Escape') { setActive(null); return; }
else return;
e.preventDefault();
setActive(i);
});
strip.addEventListener('pointerover', e => {
const c = e.target.closest('[data-i]');
if (c && view) setActive(+c.dataset.i);
});
strip.addEventListener('pointerleave', () => setActive(null));
if ('ResizeObserver' in window) {
new ResizeObserver(() => { if (card.dataset.state === 'ready') draw(); }).observe(chartEl);
} else {
window.addEventListener('resize', () => { if (card.dataset.state === 'ready') draw(); });
}
$('retry').addEventListener('click', load);
paintHeader();
load();
})();
</script>
</body>
</html>L1 — cheap deterministic descriptors
| bytes total | 39,909 | html / css / js | 3,669 / 14,391 / 21,849 |
|---|---|---|---|
| dom nodes | 72 | dom depth | 11 |
| css rules | 150 | js present | yes |
| brightness | 240.6 | contrast | 16.3 |
| colorfulness | 10.2 | whitespace | 98.3% |
This slot's telemetry
| prompt tokens | 14 | completion tokens | 106,532 |
|---|---|---|---|
| total tokens | 106,546 | wall | 869.3 s |
| cost | — | request id | — |
config.json579 B
{
"N": 2,
"auth": {
"credential_ref": "WCB_NONE",
"method": "oauth-login"
},
"billing": "plan",
"config_id": "claude-opus-5-5-eff-xhigh--cli--claude-code--dev",
"effort": "xhigh",
"family": "claude",
"m": {
"min": 2,
"q": 2
},
"model_id": "claude-opus-5-5",
"protocol": "cli",
"served_model": "claude-opus-5-5",
"telemetry": {
"completion_tokens": 336034,
"cost_usd": null,
"prompt_tokens": 60,
"total_tokens": 336094,
"wall_ms": 2684222
},
"transport": "claude-code-cli-headless",
"vendor_sanction_ref": null
}send-log2.5 KB
{
"N": 2,
"batch_id": "2026-09-23--cc-opus55",
"config_id": "claude-opus-5-5-eff-xhigh--cli--claude-code--dev",
"positions": [
{
"attempts": [
{
"attempt_index": 0,
"backoff_ms": null,
"charged": true,
"ended_at": "2026-09-23T04:17:48.850858+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-09-23T04:03:19.515450+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-09-23T04:26:04.805728+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-09-23T04:17:52.208398+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-09-23T04:34:23.440117+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-09-23T04:26:07.856605+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-09-23T04:48:13.250710+00:00",
"http_status": null,
"outcome": "valid",
"reached_model": true,
"reason": "ok",
"request_id": null,
"started_at": "2026-09-23T04:34:26.509225+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
}
}
}