gpt-5.6-luna @ none · codex-oauth

codex-oauthnone
config
gpt-5.6-luna-eff-none--cli--codex-oauth--dev
batch
2026-07-19--unified
transport
codex-cli-oauth-chatgpt
protocol
cli · plan
served model
gpt-5.6-luna
captured
Jul 18, 2026, 11:54 AM · N=2
variant
live
slot 0 · P-q · sandboxed iframe
gpt-5.6-luna @none · codex-oauth P-q slot 0 screenshot

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

within 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 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=device-width, initial-scale=1.0">
<title>Weather Card</title>
<style>
  :root {
    --ink: #18324a;
    --muted: #6d8496;
    --line: #dce8ee;
    --paper: #f7fbfc;
    --white: #ffffff;
    --accent: #ef9f51;
    --accent-soft: #fff0dd;
    --blue: #6aaeca;
    --shadow: 0 24px 70px rgba(30, 79, 104, .15);
  }

  * { box-sizing: border-box; }

  body {
    margin: 0;
    min-width: 1000px;
    min-height: 800px;
    color: var(--ink);
    font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
    background:
      radial-gradient(circle at 15% 20%, rgba(255,255,255,.9), transparent 30%),
      linear-gradient(135deg, #eaf6f8 0%, #f8f7f1 55%, #f4e6d9 100%);
    display: grid;
    place-items: center;
  }

  .card {
    width: 1080px;
    min-height: 610px;
    border: 1px solid rgba(255,255,255,.75);
    border-radius: 32px;
    overflow: hidden;
    background: rgba(255,255,255,.78);
    box-shadow: var(--shadow);
    backdrop-filter: blur(12px);
    display: grid;
    grid-template-columns: 410px 1fr;
  }

  .hero {
    position: relative;
    padding: 42px 40px;
    color: #fff;
    overflow: hidden;
    background: linear-gradient(160deg, #78b9d0 0%, #5799b5 58%, #3e7898 100%);
  }

  .hero:before,
  .hero:after {
    content: "";
    position: absolute;
    border-radius: 50%;
    background: rgba(255,255,255,.1);
  }

  .hero:before { width: 330px; height: 330px; top: -150px; right: -130px; }
  .hero:after { width: 260px; height: 260px; bottom: -150px; left: -125px; }

  .hero-content { position: relative; z-index: 1; height: 100%; display: flex; flex-direction: column; }

  .eyebrow {
    margin: 0 0 14px;
    font-size: 12px;
    font-weight: 800;
    letter-spacing: .18em;
    text-transform: uppercase;
    opacity: .78;
  }

  .location {
    margin: 0;
    max-width: 320px;
    font-size: 38px;
    line-height: 1.05;
    letter-spacing: -.04em;
  }

  .date {
    margin-top: 12px;
    font-size: 15px;
    opacity: .78;
  }

  .weather-icon {
    width: 142px;
    height: 142px;
    margin: 54px auto 28px;
    display: grid;
    place-items: center;
    font-size: 100px;
    filter: drop-shadow(0 12px 14px rgba(23,72,98,.2));
  }

  .condition {
    margin: 0;
    text-align: center;
    font-size: 22px;
    font-weight: 700;
  }

  .hero-bottom {
    margin-top: auto;
    padding-top: 32px;
    display: flex;
    align-items: end;
    justify-content: space-between;
  }

  .temperature {
    font-size: 82px;
    line-height: .9;
    letter-spacing: -.08em;
    font-weight: 700;
  }

  .temperature sup {
    position: relative;
    top: -28px;
    margin-left: 5px;
    font-size: 26px;
    letter-spacing: 0;
  }

  .range {
    padding-bottom: 5px;
    text-align: right;
    font-size: 14px;
    line-height: 1.8;
    opacity: .85;
  }

  .range strong { color: #fff; font-size: 18px; }

  .details {
    padding: 42px 42px 32px;
    background: rgba(255,255,255,.7);
    display: flex;
    flex-direction: column;
    min-width: 0;
  }

  .details-head {
    display: flex;
    align-items: start;
    justify-content: space-between;
    gap: 24px;
    margin-bottom: 30px;
  }

  .section-label {
    margin: 0 0 8px;
    color: var(--muted);
    font-size: 11px;
    font-weight: 800;
    letter-spacing: .16em;
    text-transform: uppercase;
  }

  .summary {
    margin: 0;
    font-size: 27px;
    letter-spacing: -.035em;
  }

  .coords {
    color: var(--muted);
    font-size: 12px;
    line-height: 1.6;
    text-align: right;
    white-space: nowrap;
  }

  .stats {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 14px;
    margin-bottom: 34px;
  }

  .stat {
    padding: 18px 20px;
    border: 1px solid var(--line);
    border-radius: 18px;
    background: rgba(255,255,255,.75);
  }

  .stat-name {
    color: var(--muted);
    font-size: 12px;
    font-weight: 700;
  }

  .stat-value {
    margin-top: 7px;
    font-size: 25px;
    font-weight: 750;
    letter-spacing: -.04em;
  }

  .hourly-title {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 14px;
  }

  .hourly-title h2 {
    margin: 0;
    font-size: 16px;
    letter-spacing: -.02em;
  }

  .hourly-title span {
    color: var(--muted);
    font-size: 12px;
  }

  .hourly {
    min-width: 0;
    display: grid;
    grid-template-columns: repeat(12, minmax(42px, 1fr));
    gap: 7px;
    overflow: hidden;
  }

  .hour {
    min-width: 0;
    padding: 12px 5px;
    border: 1px solid var(--line);
    border-radius: 14px;
    background: rgba(255,255,255,.62);
    text-align: center;
  }

  .hour:nth-child(2n) { background: var(--accent-soft); border-color: #f6dcc1; }

  .hour-time {
    color: var(--muted);
    font-size: 10px;
    font-weight: 700;
  }

  .hour-temp {
    margin-top: 13px;
    font-size: 14px;
    font-weight: 800;
  }

  .bar {
    height: 74px;
    margin: 28px 0 22px;
    padding: 0 6px;
    display: flex;
    align-items: end;
    justify-content: space-between;
    border-bottom: 1px solid var(--line);
  }

  .bar i {
    width: 5px;
    min-height: 8px;
    border-radius: 8px 8px 0 0;
    background: linear-gradient(to top, var(--blue), #b9dfdf);
  }

  .bar i:nth-child(2n) { background: linear-gradient(to top, var(--accent), #f6cf9d); }

  .footer {
    margin-top: auto;
    padding-top: 22px;
    border-top: 1px solid var(--line);
    color: var(--muted);
    font-size: 11px;
  }

  .status {
    position: fixed;
    inset: 0;
    display: grid;
    place-items: center;
    color: var(--ink);
    background: #f7fbfc;
    font-size: 18px;
  }

  .status[hidden] { display: none; }

  @media (max-width: 1100px) {
    .card { width: 94vw; }
  }
</style>
</head>
<body>
<main class="card" id="card" hidden>
  <section class="hero">
    <div class="hero-content">
      <p class="eyebrow">Daily forecast</p>
      <h1 class="location" id="location">Berlin</h1>
      <div class="date" id="date"></div>
      <div class="weather-icon" id="icon">☀️</div>
      <p class="condition" id="condition">Clear sky</p>
      <div class="hero-bottom">
        <div class="temperature" id="temperature">—<sup>°C</sup></div>
        <div class="range">
          <div>High <strong id="high">—</strong></div>
          <div>Low <strong id="low">—</strong></div>
        </div>
      </div>
    </div>
  </section>

  <section class="details">
    <div class="details-head">
      <div>
        <p class="section-label">Weather overview</p>
        <h2 class="summary" id="summary">Hourly temperature</h2>
      </div>
      <div class="coords" id="coords"></div>
    </div>

    <div class="stats">
      <div class="stat">
        <div class="stat-name">Maximum temperature</div>
        <div class="stat-value" id="maxStat">—</div>
      </div>
      <div class="stat">
        <div class="stat-name">Minimum temperature</div>
        <div class="stat-value" id="minStat">—</div>
      </div>
    </div>

    <div class="hourly-title">
      <h2>Temperature by hour</h2>
      <span>UTC · Celsius</span>
    </div>
    <div class="hourly" id="hourly"></div>
    <div class="bar" id="bar"></div>
    <div class="footer">Open-Meteo compatible forecast · Data shown for the selected date</div>
  </section>
</main>

<div class="status" id="status">Loading weather data…</div>

<script>
(() => {
  const params = new URLSearchParams(location.search);
  const lat = Number(params.get("lat") ?? 52.52);
  const lon = Number(params.get("lon") ?? 13.405);
  const name = params.get("name") || "Berlin";
  const today = new Date().toISOString().slice(0, 10);
  const dateValue = params.get("date") || today;
  const validDate = /^\d{4}-\d{2}-\d{2}$/.test(dateValue) ? dateValue : today;

  const $ = id => document.getElementById(id);
  const status = $("status");

  const weather = {
    0: ["Clear sky", "☀️"], 1: ["Mainly clear", "🌤️"], 2: ["Partly cloudy", "⛅"],
    3: ["Overcast", "☁️"], 45: ["Fog", "🌫️"], 48: ["Rime fog", "🌫️"],
    51: ["Light drizzle", "🌦️"], 53: ["Drizzle", "🌦️"], 55: ["Heavy drizzle", "🌧️"],
    56: ["Freezing drizzle", "🌧️"], 57: ["Freezing drizzle", "🌧️"],
    61: ["Light rain", "🌦️"], 63: ["Rain", "🌧️"], 65: ["Heavy rain", "🌧️"],
    66: ["Freezing rain", "🌧️"], 67: ["Freezing rain", "🌧️"],
    71: ["Light snow", "🌨️"], 73: ["Snow", "❄️"], 75: ["Heavy snow", "❄️"],
    77: ["Snow grains", "❄️"], 80: ["Rain showers", "🌦️"], 81: ["Rain showers", "🌧️"],
    82: ["Heavy showers", "🌧️"], 85: ["Snow showers", "🌨️"], 86: ["Snow showers", "❄️"],
    95: ["Thunderstorm", "⛈️"], 96: ["Thunderstorm with hail", "⛈️"], 99: ["Thunderstorm with hail", "⛈️"]
  };

  const fmtTemp = value => value == null || Number.isNaN(Number(value)) ? "—" : `${Math.round(value)}°`;
  const fmtDate = value => new Intl.DateTimeFormat("en", {
    weekday: "long", month: "long", day: "numeric", year: "numeric", timeZone: "UTC"
  }).format(new Date(`${value}T12:00:00Z`));

  async function load() {
    if (!Number.isFinite(lat) || !Number.isFinite(lon)) throw new Error("Invalid coordinates");

    const endpoint = validDate < today ? "/api/om/archive" : "/api/om/forecast";
    const query = new URLSearchParams({
      latitude: lat, longitude: lon,
      daily: "temperature_2m_max,temperature_2m_min,weather_code",
      hourly: "temperature_2m",
      timezone: "UTC", temperature_unit: "celsius",
      start_date: validDate, end_date: validDate
    });

    const response = await fetch(`${endpoint}?${query}`);
    if (!response.ok) throw new Error("Weather request failed");
    const data = await response.json();

    const daily = data.daily;
    const hourly = data.hourly;
    if (!daily || !hourly || !Array.isArray(hourly.temperature_2m)) throw new Error("Incomplete weather data");

    const max = daily.temperature_2m_max?.[0];
    const min = daily.temperature_2m_min?.[0];
    const code = daily.weather_code?.[0];
    const [label, emoji] = weather[code] || ["Weather unavailable", "🌡️"];

    $("location").textContent = name;
    $("date").textContent = fmtDate(validDate);
    $("icon").textContent = emoji;
    $("condition").textContent = label;
    $("temperature").innerHTML = `${fmtTemp((Number(max) + Number(min)) / 2)}<sup>°C</sup>`;
    $("high").textContent = fmtTemp(max);
    $("low").textContent = fmtTemp(min);
    $("maxStat").textContent = fmtTemp(max);
    $("minStat").textContent = fmtTemp(min);
    $("coords").innerHTML = `${lat.toFixed(2)}° N<br>${lon.toFixed(2)}° E`;

    const temps = hourly.temperature_2m;
    const selected = temps.map((temp, i) => ({ temp, i })).filter(x => x.i % 2 === 0);
    $("hourly").innerHTML = selected.map(({ temp, i }) => {
      const hour = String(i).padStart(2, "0");
      return `<div class="hour"><div class="hour-time">${hour}:00</div><div class="hour-temp">${fmtTemp(temp)}</div></div>`;
    }).join("");

    const clean = temps.filter(Number.isFinite);
    const lo = Math.min(...clean), hi = Math.max(...clean);
    $("bar").innerHTML = temps.map(temp => {
      const height = hi === lo ? 45 : 10 + ((temp - lo) / (hi - lo)) * 58;
      return `<i style="height:${height.toFixed(1)}px"></i>`;
    }).join("");

    status.hidden = true;
    $("card").hidden = false;
  }

  load().catch(() => {
    status.textContent = "Weather data could not be loaded.";
  });
})();
</script>
</body>
</html>

L1 — cheap deterministic descriptors

bytes total11,646html / css / js1,836 / 5,683 / 4,127
dom nodes44dom depth9
css rules44js presentyes
brightness220.6contrast45.1
colorfulness43.4whitespace75.2%

This slot's telemetry

prompt tokens0completion tokens18,714
total tokens0wall68.7 s
costrequest id
config.json562 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "gpt-5.6-luna-eff-none--cli--codex-oauth--dev",
  "effort": "none",
  "family": "gpt",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "gpt-5.6-luna",
  "protocol": "cli",
  "served_model": "gpt-5.6-luna",
  "telemetry": {
    "completion_tokens": 63087,
    "cost_usd": null,
    "prompt_tokens": null,
    "total_tokens": null,
    "wall_ms": 228342
  },
  "transport": "codex-cli-oauth-chatgpt",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-07-19--codex-oauth-extra",
  "config_id": "gpt-5.6-luna-eff-none--cli--codex-oauth--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-18T21:38:32.915604+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T21:37:48.356445+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-18T21:39:45.312284+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T21:38:36.615893+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-18T21:40:56.667070+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T21:39:48.943914+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-18T21:41:47.377917+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T21:41:00.007711+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
    }
  }
}