claude-sonnet-4-6 @ low · kiro

kirolow
config
claude-sonnet-4-6-eff-low--cli--kiro--dev
batch
2026-07-19--unified
transport
kiro-cli-isolated-home-github-social
protocol
cli · plan
served model
claude-sonnet-4.6
captured
Jul 18, 2026, 11:54 AM · N=2
variant
live
slot 0 · P-q · sandboxed iframe
claude-sonnet-4-6 @low · kiro 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 tempambiguousshown: 17max-equals-min
  • min tempambiguousshown: 17max-equals-min
  • 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">
<title>Weather Card</title>
<style>
  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

  body {
    min-height: 100vh;
    width: 1280px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: #0f1923;
    font-family: 'Segoe UI', system-ui, -apple-system, sans-serif;
    overflow-x: hidden;
  }

  .bg-gradient {
    position: fixed;
    inset: 0;
    z-index: 0;
    background: radial-gradient(ellipse at 20% 50%, #1a2a4a 0%, transparent 60%),
                radial-gradient(ellipse at 80% 20%, #0d2137 0%, transparent 50%),
                radial-gradient(ellipse at 60% 80%, #162035 0%, transparent 50%),
                #0f1923;
  }

  .stars {
    position: fixed;
    inset: 0;
    z-index: 0;
    overflow: hidden;
  }

  .star {
    position: absolute;
    border-radius: 50%;
    background: rgba(255,255,255,0.7);
    animation: twinkle var(--dur, 3s) ease-in-out infinite var(--delay, 0s);
  }

  @keyframes twinkle {
    0%, 100% { opacity: 0.2; transform: scale(1); }
    50% { opacity: 1; transform: scale(1.3); }
  }

  .card-wrapper {
    position: relative;
    z-index: 1;
    width: 900px;
    padding: 20px 0 40px;
  }

  .card {
    background: linear-gradient(135deg,
      rgba(255,255,255,0.08) 0%,
      rgba(255,255,255,0.04) 50%,
      rgba(255,255,255,0.06) 100%);
    border: 1px solid rgba(255,255,255,0.12);
    border-radius: 32px;
    backdrop-filter: blur(40px);
    -webkit-backdrop-filter: blur(40px);
    box-shadow:
      0 32px 80px rgba(0,0,0,0.6),
      0 0 0 1px rgba(255,255,255,0.05) inset,
      0 1px 0 rgba(255,255,255,0.15) inset;
    overflow: hidden;
    position: relative;
  }

  .card-glow {
    position: absolute;
    top: -120px;
    left: 50%;
    transform: translateX(-50%);
    width: 500px;
    height: 300px;
    background: radial-gradient(ellipse, rgba(96,165,250,0.15) 0%, transparent 70%);
    pointer-events: none;
    z-index: 0;
  }

  /* ── HEADER ── */
  .header {
    position: relative;
    z-index: 1;
    padding: 44px 52px 36px;
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
  }

  .location-block {}

  .location-name {
    font-size: 38px;
    font-weight: 700;
    color: #fff;
    letter-spacing: -0.5px;
    line-height: 1;
    text-shadow: 0 2px 20px rgba(96,165,250,0.4);
  }

  .location-date {
    margin-top: 8px;
    font-size: 15px;
    color: rgba(255,255,255,0.45);
    font-weight: 400;
    letter-spacing: 0.5px;
    text-transform: uppercase;
  }

  .condition-block {
    text-align: right;
  }

  .condition-icon {
    font-size: 72px;
    line-height: 1;
    filter: drop-shadow(0 4px 20px rgba(255,200,50,0.35));
  }

  .condition-text {
    margin-top: 6px;
    font-size: 14px;
    color: rgba(255,255,255,0.55);
    font-weight: 500;
    letter-spacing: 0.3px;
    text-transform: uppercase;
  }

  /* ── TEMP HERO ── */
  .temp-hero {
    position: relative;
    z-index: 1;
    padding: 0 52px 36px;
    display: flex;
    align-items: flex-end;
    gap: 32px;
  }

  .temp-max {
    font-size: 110px;
    font-weight: 800;
    line-height: 1;
    color: #fff;
    letter-spacing: -4px;
    text-shadow:
      0 0 60px rgba(96,165,250,0.3),
      0 4px 20px rgba(0,0,0,0.4);
  }

  .temp-max .unit {
    font-size: 48px;
    font-weight: 400;
    letter-spacing: 0;
    color: rgba(255,255,255,0.5);
    vertical-align: super;
    margin-left: 2px;
  }

  .temp-range-block {
    padding-bottom: 16px;
  }

  .temp-range-label {
    font-size: 11px;
    color: rgba(255,255,255,0.35);
    text-transform: uppercase;
    letter-spacing: 1px;
    margin-bottom: 6px;
  }

  .temp-range-pills {
    display: flex;
    flex-direction: column;
    gap: 6px;
  }

  .temp-pill {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 15px;
    font-weight: 600;
  }

  .temp-pill .pill-label {
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.8px;
    font-weight: 500;
    width: 24px;
  }

  .temp-pill.high { color: #fb923c; }
  .temp-pill.low  { color: #60a5fa; }

  /* ── DIVIDER ── */
  .divider {
    position: relative;
    z-index: 1;
    margin: 0 52px;
    height: 1px;
    background: linear-gradient(90deg, transparent, rgba(255,255,255,0.12), transparent);
  }

  /* ── HOURLY ── */
  .hourly-section {
    position: relative;
    z-index: 1;
    padding: 32px 52px 44px;
  }

  .section-title {
    font-size: 11px;
    color: rgba(255,255,255,0.35);
    text-transform: uppercase;
    letter-spacing: 1.5px;
    margin-bottom: 20px;
    font-weight: 600;
  }

  .hourly-scroll {
    display: flex;
    gap: 8px;
    overflow-x: auto;
    padding-bottom: 4px;
    scrollbar-width: thin;
    scrollbar-color: rgba(255,255,255,0.1) transparent;
  }

  .hourly-scroll::-webkit-scrollbar { height: 4px; }
  .hourly-scroll::-webkit-scrollbar-track { background: transparent; }
  .hourly-scroll::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.1); border-radius: 2px; }

  .hour-item {
    flex: 0 0 auto;
    width: 72px;
    padding: 14px 8px;
    border-radius: 16px;
    background: rgba(255,255,255,0.04);
    border: 1px solid rgba(255,255,255,0.07);
    text-align: center;
    cursor: default;
    transition: background 0.2s, border-color 0.2s, transform 0.2s;
    position: relative;
  }

  .hour-item:hover {
    background: rgba(255,255,255,0.09);
    border-color: rgba(255,255,255,0.15);
    transform: translateY(-2px);
  }

  .hour-item.current {
    background: linear-gradient(160deg, rgba(96,165,250,0.22), rgba(59,130,246,0.12));
    border-color: rgba(96,165,250,0.4);
    box-shadow: 0 0 20px rgba(96,165,250,0.15);
  }

  .hour-label {
    font-size: 11px;
    color: rgba(255,255,255,0.4);
    font-weight: 500;
    margin-bottom: 10px;
    letter-spacing: 0.3px;
  }

  .hour-item.current .hour-label {
    color: rgba(96,165,250,0.9);
  }

  .hour-temp {
    font-size: 17px;
    font-weight: 700;
    color: #fff;
  }

  .hour-dot {
    width: 4px;
    height: 4px;
    background: #60a5fa;
    border-radius: 50%;
    margin: 8px auto 0;
    opacity: 0;
  }

  .hour-item.current .hour-dot { opacity: 1; }

  /* ── CHART ── */
  .chart-wrapper {
    position: relative;
    z-index: 1;
    padding: 0 52px 32px;
  }

  .chart-canvas {
    width: 100%;
    height: 100px;
    display: block;
  }

  /* ── LOADING / ERROR ── */
  .state-overlay {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    min-height: 340px;
    gap: 20px;
  }

  .spinner {
    width: 48px;
    height: 48px;
    border: 3px solid rgba(96,165,250,0.15);
    border-top-color: #60a5fa;
    border-radius: 50%;
    animation: spin 0.9s linear infinite;
  }

  @keyframes spin { to { transform: rotate(360deg); } }

  .state-message {
    font-size: 16px;
    color: rgba(255,255,255,0.5);
    font-weight: 400;
  }

  .error-icon { font-size: 48px; }

  .error-title {
    font-size: 20px;
    font-weight: 600;
    color: rgba(255,255,255,0.75);
  }

  .error-detail {
    font-size: 14px;
    color: rgba(255,255,255,0.35);
    text-align: center;
    max-width: 360px;
    line-height: 1.6;
  }

  /* ── FOOTER ── */
  .footer {
    position: relative;
    z-index: 1;
    padding: 0 52px 36px;
    display: flex;
    gap: 28px;
  }

  .stat-chip {
    display: flex;
    flex-direction: column;
    gap: 3px;
  }

  .stat-chip-label {
    font-size: 10px;
    text-transform: uppercase;
    letter-spacing: 1px;
    color: rgba(255,255,255,0.3);
    font-weight: 600;
  }

  .stat-chip-value {
    font-size: 14px;
    color: rgba(255,255,255,0.7);
    font-weight: 600;
  }

  .stat-sep {
    width: 1px;
    background: rgba(255,255,255,0.08);
    align-self: stretch;
    margin: 2px 0;
  }
</style>
</head>
<body>

<div class="bg-gradient"></div>
<div class="stars" id="stars"></div>

<div class="card-wrapper">
  <div class="card" id="card">
    <div class="card-glow"></div>
    <div id="content">
      <div class="state-overlay">
        <div class="spinner"></div>
        <div class="state-message">Fetching weather data…</div>
      </div>
    </div>
  </div>
</div>

<script>
(function () {
  /* ── STARS ── */
  const starsEl = document.getElementById('stars');
  for (let i = 0; i < 120; i++) {
    const s = document.createElement('div');
    s.className = 'star';
    const size = Math.random() * 2.5 + 0.5;
    s.style.cssText = `
      width:${size}px; height:${size}px;
      top:${Math.random()*100}%;
      left:${Math.random()*100}%;
      --dur:${(Math.random()*4+2).toFixed(1)}s;
      --delay:-${(Math.random()*6).toFixed(1)}s;
      opacity:${Math.random()*0.5+0.1};
    `;
    starsEl.appendChild(s);
  }

  /* ── PARAMS ── */
  const params = new URLSearchParams(location.search);
  const lat  = parseFloat(params.get('lat')  || '52.52');
  const lon  = parseFloat(params.get('lon')  || '13.405');
  const name = params.get('name') || 'Berlin';

  function todayUTC() {
    const d = new Date();
    return `${d.getUTCFullYear()}-${String(d.getUTCMonth()+1).padStart(2,'0')}-${String(d.getUTCDate()).padStart(2,'0')}`;
  }
  const dateStr = params.get('date') || todayUTC();

  /* ── DATE HELPERS ── */
  function isPast(dateStr) {
    const today = todayUTC();
    return dateStr < today;
  }

  function formatDate(dateStr) {
    const [y, m, d] = dateStr.split('-').map(Number);
    const dt = new Date(Date.UTC(y, m-1, d));
    return dt.toLocaleDateString('en-US', { weekday:'long', year:'numeric', month:'long', day:'numeric', timeZone:'UTC' });
  }

  /* ── WEATHER CODE MAP ── */
  const WMO = {
    0:  { icon:'☀️',  label:'Clear Sky' },
    1:  { icon:'🌤️', label:'Mainly Clear' },
    2:  { icon:'⛅',  label:'Partly Cloudy' },
    3:  { icon:'☁️',  label:'Overcast' },
    45: { icon:'🌫️', label:'Foggy' },
    48: { icon:'🌫️', label:'Icy Fog' },
    51: { icon:'🌦️', label:'Light Drizzle' },
    53: { icon:'🌦️', label:'Drizzle' },
    55: { icon:'🌧️', label:'Heavy Drizzle' },
    56: { icon:'🌨️', label:'Freezing Drizzle' },
    57: { icon:'🌨️', label:'Heavy Freezing Drizzle' },
    61: { icon:'🌧️', label:'Light Rain' },
    63: { icon:'🌧️', label:'Rain' },
    65: { icon:'🌧️', label:'Heavy Rain' },
    66: { icon:'🌨️', label:'Freezing Rain' },
    67: { icon:'🌨️', label:'Heavy Freezing Rain' },
    71: { icon:'❄️',  label:'Light Snow' },
    73: { icon:'❄️',  label:'Snow' },
    75: { icon:'❄️',  label:'Heavy Snow' },
    77: { icon:'🌨️', label:'Snow Grains' },
    80: { icon:'🌦️', label:'Light Showers' },
    81: { icon:'🌧️', label:'Showers' },
    82: { icon:'⛈️',  label:'Violent Showers' },
    85: { icon:'🌨️', label:'Snow Showers' },
    86: { icon:'🌨️', label:'Heavy Snow Showers' },
    95: { icon:'⛈️',  label:'Thunderstorm' },
    96: { icon:'⛈️',  label:'Thunderstorm w/ Hail' },
    99: { icon:'⛈️',  label:'Heavy Thunderstorm w/ Hail' },
  };

  function getWMO(code) {
    return WMO[code] || { icon:'🌡️', label:'Unknown' };
  }

  /* ── FETCH ── */
  async function fetchWeather() {
    const endpoint = isPast(dateStr) ? '/api/om/archive' : '/api/om/forecast';
    const qs = 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: dateStr,
      end_date:   dateStr,
    });
    const res = await fetch(`${endpoint}?${qs}`);
    if (!res.ok) throw new Error(`HTTP ${res.status} from ${endpoint}`);
    return res.json();
  }

  /* ── CHART ── */
  function drawChart(canvas, temps) {
    const dpr = window.devicePixelRatio || 1;
    const w = canvas.offsetWidth;
    const h = canvas.offsetHeight;
    canvas.width  = w * dpr;
    canvas.height = h * dpr;
    const ctx = canvas.getContext('2d');
    ctx.scale(dpr, dpr);

    const valid = temps.filter(t => t !== null && t !== undefined);
    if (valid.length < 2) return;

    const min = Math.min(...valid) - 1;
    const max = Math.max(...valid) + 1;
    const pad = { l: 8, r: 8, t: 14, b: 8 };
    const gw = w - pad.l - pad.r;
    const gh = h - pad.t - pad.b;

    const xOf = i => pad.l + (i / (temps.length - 1)) * gw;
    const yOf = v => pad.t + gh - ((v - min) / (max - min)) * gh;

    /* gradient fill */
    const grad = ctx.createLinearGradient(0, pad.t, 0, pad.t + gh);
    grad.addColorStop(0,   'rgba(96,165,250,0.25)');
    grad.addColorStop(1,   'rgba(96,165,250,0)');

    ctx.beginPath();
    ctx.moveTo(xOf(0), yOf(temps[0]));
    for (let i = 1; i < temps.length; i++) {
      const xp = xOf(i-1), x = xOf(i);
      const yp = yOf(temps[i-1]), y = yOf(temps[i]);
      const cpx = (xp + x) / 2;
      ctx.bezierCurveTo(cpx, yp, cpx, y, x, y);
    }
    ctx.lineTo(xOf(temps.length-1), h);
    ctx.lineTo(xOf(0), h);
    ctx.closePath();
    ctx.fillStyle = grad;
    ctx.fill();

    /* line */
    ctx.beginPath();
    ctx.moveTo(xOf(0), yOf(temps[0]));
    for (let i = 1; i < temps.length; i++) {
      const xp = xOf(i-1), x = xOf(i);
      const yp = yOf(temps[i-1]), y = yOf(temps[i]);
      const cpx = (xp + x) / 2;
      ctx.bezierCurveTo(cpx, yp, cpx, y, x, y);
    }
    ctx.strokeStyle = 'rgba(96,165,250,0.75)';
    ctx.lineWidth = 2.5;
    ctx.lineJoin = 'round';
    ctx.stroke();

    /* dots at peaks */
    const peak = temps.indexOf(Math.max(...temps));
    const trough = temps.indexOf(Math.min(...temps));
    [[peak, '#fb923c'], [trough, '#60a5fa']].forEach(([idx, color]) => {
      ctx.beginPath();
      ctx.arc(xOf(idx), yOf(temps[idx]), 4, 0, Math.PI*2);
      ctx.fillStyle = color;
      ctx.fill();
      ctx.strokeStyle = 'rgba(255,255,255,0.5)';
      ctx.lineWidth = 1.5;
      ctx.stroke();

      /* label */
      ctx.fillStyle = color;
      ctx.font = `600 11px 'Segoe UI', system-ui, sans-serif`;
      ctx.textAlign = 'center';
      const label = `${Math.round(temps[idx])}°`;
      const ly = yOf(temps[idx]) - 8;
      ctx.fillText(label, xOf(idx), ly);
    });
  }

  /* ── RENDER ── */
  function render(data) {
    const daily  = data.daily;
    const hourly = data.hourly;

    const tMax = daily.temperature_2m_max[0];
    const tMin = daily.temperature_2m_min[0];
    const code = daily.weather_code[0];
    const wmo  = getWMO(code);

    /* hourly temps for this date (24 values) */
    const hourTemps = (hourly.temperature_2m || []).slice(0, 24);

    /* current hour highlight (only if today) */
    const todayStr = todayUTC();
    const nowHour  = (dateStr === todayStr) ? new Date().getUTCHours() : -1;

    /* avg for stat chip */
    const avg = hourTemps.length ? (hourTemps.reduce((a,b) => a + (b||0), 0) / hourTemps.length) : null;
    const spread = (tMax !== null && tMin !== null) ? (tMax - tMin).toFixed(1) : null;

    const content = document.getElementById('content');
    content.innerHTML = `
      <div class="header">
        <div class="location-block">
          <div class="location-name">${escHtml(name)}</div>
          <div class="location-date">${formatDate(dateStr)}</div>
        </div>
        <div class="condition-block">
          <div class="condition-icon">${wmo.icon}</div>
          <div class="condition-text">${wmo.label}</div>
        </div>
      </div>

      <div class="temp-hero">
        <div class="temp-max">${tMax !== null ? Math.round(tMax) : '—'}<span class="unit">°C</span></div>
        <div class="temp-range-block">
          <div class="temp-range-label">Today's Range</div>
          <div class="temp-range-pills">
            <div class="temp-pill high">
              <span class="pill-label">High</span>
              <span>${tMax !== null ? Math.round(tMax) + '°' : '—'}</span>
            </div>
            <div class="temp-pill low">
              <span class="pill-label">Low</span>
              <span>${tMin !== null ? Math.round(tMin) + '°' : '—'}</span>
            </div>
          </div>
        </div>
      </div>

      <div class="divider"></div>

      <div class="chart-wrapper">
        <canvas class="chart-canvas" id="tempChart" style="height:90px;"></canvas>
      </div>

      <div class="hourly-section">
        <div class="section-title">Hourly Temperature</div>
        <div class="hourly-scroll" id="hourlyScroll">
          ${hourTemps.map((t, i) => {
            const isCurrent = i === nowHour;
            return `
            <div class="hour-item${isCurrent ? ' current' : ''}">
              <div class="hour-label">${String(i).padStart(2,'0')}:00</div>
              <div class="hour-temp">${t !== null && t !== undefined ? Math.round(t) + '°' : '—'}</div>
              <div class="hour-dot"></div>
            </div>`;
          }).join('')}
        </div>
      </div>

      <div class="divider"></div>

      <div class="footer">
        <div class="stat-chip">
          <div class="stat-chip-label">Avg Temp</div>
          <div class="stat-chip-value">${avg !== null ? Math.round(avg) + ' °C' : '—'}</div>
        </div>
        <div class="stat-sep"></div>
        <div class="stat-chip">
          <div class="stat-chip-label">Spread</div>
          <div class="stat-chip-value">${spread !== null ? spread + ' °C' : '—'}</div>
        </div>
        <div class="stat-sep"></div>
        <div class="stat-chip">
          <div class="stat-chip-label">Condition Code</div>
          <div class="stat-chip-value">WMO ${code}</div>
        </div>
        <div class="stat-sep"></div>
        <div class="stat-chip">
          <div class="stat-chip-label">Coordinates</div>
          <div class="stat-chip-value">${lat.toFixed(3)}°, ${lon.toFixed(3)}°</div>
        </div>
      </div>
    `;

    /* scroll to current hour */
    if (nowHour > 0) {
      requestAnimationFrame(() => {
        const scroll = document.getElementById('hourlyScroll');
        const items  = scroll.querySelectorAll('.hour-item');
        if (items[nowHour]) {
          const offset = items[nowHour].offsetLeft - scroll.offsetWidth / 2 + items[nowHour].offsetWidth / 2;
          scroll.scrollLeft = Math.max(0, offset);
        }
      });
    }

    /* draw chart */
    requestAnimationFrame(() => {
      const canvas = document.getElementById('tempChart');
      if (canvas && hourTemps.length) drawChart(canvas, hourTemps);
    });
  }

  function renderError(err) {
    document.getElementById('content').innerHTML = `
      <div class="state-overlay">
        <div class="error-icon">⚠️</div>
        <div class="error-title">Weather data unavailable</div>
        <div class="error-detail">${escHtml(err.message || String(err))}</div>
      </div>
    `;
  }

  function escHtml(s) {
    return String(s)
      .replace(/&/g,'&amp;')
      .replace(/</g,'&lt;')
      .replace(/>/g,'&gt;')
      .replace(/"/g,'&quot;');
  }

  /* ── BOOT ── */
  fetchWeather().then(render).catch(renderError);
})();
</script>
</body>
</html>

L1 — cheap deterministic descriptors

bytes total19,316html / css / js562 / 7,832 / 10,922
dom nodes17dom depth7
css rules58js presentyes
brightness40.1contrast21.8
colorfulness16.9whitespace62.7%

This slot's telemetry

prompt tokens0completion tokens0
total tokens0wall80.9 s
costrequest id
config.json583 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "claude-sonnet-4-6-eff-low--cli--kiro--dev",
  "effort": "low",
  "family": "claude",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "claude-sonnet-4-6",
  "protocol": "cli",
  "served_model": "claude-sonnet-4.6",
  "telemetry": {
    "completion_tokens": null,
    "cost_usd": null,
    "prompt_tokens": null,
    "total_tokens": null,
    "wall_ms": 274626
  },
  "transport": "kiro-cli-isolated-home-github-social",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-07-18--kiro-cli",
  "config_id": "claude-sonnet-4-6-eff-low--cli--kiro--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-18T16:52:59.411578+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T16:52:13.083706+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-18T16:54:24.113457+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T16:53:02.975933+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-18T16:55:58.307697+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T16:54:28.043332+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-18T16:56:59.781049+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-18T16:56:02.246936+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
    }
  }
}