qwen3.6-plus · opencode

opencode
config
qwen3.6-plus--cli--opencode--dev
batch
2026-07-19--unified
transport
opencode-cli-isolated-xdg-go-subscription
protocol
cli · plan
served model
qwen3.6-plus
采集于
2026年7月18日 11:54 · N=2
variant
live
slot 0 · P-q · sandboxed iframe
qwen3.6-plus · opencode P-q slot 0 截图

截图是 similarity 通道测量时的原始像素。运行 live 会在 sandboxed iframe 中重新执行原始输出;渲染结果取决于你的浏览器和字体,不保证与测量像素一致。

similarity 邻居

限于 session 2026-07-19--unified

similarity 衡量本 session 内的趋同程度 —— 不是质量。

Fidelity —— 卡片展示的数据对不对?

  • namematch
  • conditionmatch
  • datematch
  • max tempmismatch展示值:17.4
  • min tempmismatch展示值:17.2
  • hourlymatchcoverage 22/24 · 22 命中 · 0 不符 · 2 未展示
  • request sidematch0 处违规

extractor fidelity-extractor-v1+Berlin-2026-07-15

源码 —— 原始模型输出,一字节未改

下载 card.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1280, initial-scale=1.0">
<title>Weather Card</title>
<style>
  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

  :root {
    --bg: #0f172a;
    --card-bg: linear-gradient(145deg, #1e293b 0%, #0f172a 100%);
    --surface: rgba(255,255,255,0.06);
    --surface-hover: rgba(255,255,255,0.10);
    --text-primary: #f1f5f9;
    --text-secondary: #94a3b8;
    --text-muted: #64748b;
    --accent: #38bdf8;
    --accent-glow: rgba(56,189,248,0.15);
    --warm: #f97316;
    --cool: #6366f1;
    --border: rgba(255,255,255,0.08);
    --radius: 20px;
    --radius-sm: 12px;
  }

  body {
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
    background: var(--bg);
    color: var(--text-primary);
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 40px;
    background-image:
      radial-gradient(ellipse 80% 60% at 50% 0%, rgba(56,189,248,0.08) 0%, transparent 60%),
      radial-gradient(ellipse 60% 50% at 80% 100%, rgba(99,102,241,0.06) 0%, transparent 50%);
  }

  .card {
    width: 640px;
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    box-shadow:
      0 4px 6px -1px rgba(0,0,0,0.3),
      0 20px 50px -12px rgba(0,0,0,0.5),
      0 0 0 1px rgba(255,255,255,0.03) inset;
    overflow: hidden;
    position: relative;
  }

  .card::before {
    content: "";
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 1px;
    background: linear-gradient(90deg, transparent, rgba(255,255,255,0.15), transparent);
  }

  .header {
    padding: 32px 36px 24px;
    border-bottom: 1px solid var(--border);
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
  }

  .location {
    display: flex;
    align-items: center;
    gap: 10px;
  }

  .location-icon {
    width: 20px; height: 20px;
    color: var(--accent);
    flex-shrink: 0;
  }

  .location-name {
    font-size: 22px;
    font-weight: 600;
    letter-spacing: -0.3px;
  }

  .date {
    font-size: 14px;
    color: var(--text-secondary);
    font-weight: 500;
    margin-top: 4px;
  }

  .weather-icon {
    width: 56px; height: 56px;
    flex-shrink: 0;
  }

  .summary {
    padding: 28px 36px;
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    gap: 20px;
  }

  .stat {
    background: var(--surface);
    border-radius: var(--radius-sm);
    padding: 18px 20px;
    border: 1px solid var(--border);
    transition: background 0.2s;
  }

  .stat:hover { background: var(--surface-hover); }

  .stat-label {
    font-size: 12px;
    text-transform: uppercase;
    letter-spacing: 0.8px;
    color: var(--text-muted);
    font-weight: 600;
    margin-bottom: 8px;
  }

  .stat-value {
    font-size: 28px;
    font-weight: 700;
    letter-spacing: -0.5px;
    display: flex;
    align-items: baseline;
    gap: 4px;
  }

  .stat-value .unit {
    font-size: 16px;
    font-weight: 500;
    color: var(--text-secondary);
  }

  .stat-max .stat-value { color: var(--warm); }
  .stat-min .stat-value { color: var(--cool); }
  .stat-condition .stat-value {
    font-size: 15px;
    font-weight: 500;
    color: var(--text-primary);
    letter-spacing: -0.2px;
  }

  .hourly-section {
    padding: 0 36px 32px;
  }

  .hourly-header {
    font-size: 13px;
    text-transform: uppercase;
    letter-spacing: 0.8px;
    color: var(--text-muted);
    font-weight: 600;
    margin-bottom: 16px;
  }

  .hourly-scroll {
    display: flex;
    gap: 8px;
    overflow-x: auto;
    padding-bottom: 8px;
    scrollbar-width: thin;
    scrollbar-color: var(--text-muted) transparent;
  }

  .hourly-scroll::-webkit-scrollbar { height: 4px; }
  .hourly-scroll::-webkit-scrollbar-track { background: transparent; }
  .hourly-scroll::-webkit-scrollbar-thumb { background: var(--text-muted); border-radius: 2px; }

  .hour-item {
    flex: 0 0 auto;
    width: 52px;
    text-align: center;
    padding: 12px 6px;
    border-radius: var(--radius-sm);
    background: var(--surface);
    border: 1px solid var(--border);
    transition: all 0.2s;
  }

  .hour-item:hover {
    background: var(--accent-glow);
    border-color: rgba(56,189,248,0.2);
  }

  .hour-time {
    font-size: 11px;
    color: var(--text-muted);
    font-weight: 600;
    margin-bottom: 8px;
  }

  .hour-temp {
    font-size: 14px;
    font-weight: 600;
    color: var(--text-primary);
  }

  .hourly-chart {
    margin-top: 20px;
    height: 80px;
    position: relative;
    background: var(--surface);
    border-radius: var(--radius-sm);
    border: 1px solid var(--border);
    overflow: hidden;
  }

  .chart-svg { width: 100%; height: 100%; }

  .error-state {
    padding: 60px 36px;
    text-align: center;
  }

  .error-icon {
    width: 48px; height: 48px;
    color: #ef4444;
    margin: 0 auto 16px;
    opacity: 0.8;
  }

  .error-title {
    font-size: 18px;
    font-weight: 600;
    margin-bottom: 8px;
  }

  .error-message {
    font-size: 14px;
    color: var(--text-secondary);
    line-height: 1.6;
  }

  .loading {
    padding: 80px 36px;
    text-align: center;
  }

  .spinner {
    width: 32px; height: 32px;
    border: 3px solid var(--border);
    border-top-color: var(--accent);
    border-radius: 50%;
    animation: spin 0.8s linear infinite;
    margin: 0 auto 16px;
  }

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

  .loading-text {
    font-size: 14px;
    color: var(--text-secondary);
  }

  .temp-bar {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-top: 8px;
  }

  .temp-bar-track {
    flex: 1;
    height: 4px;
    background: rgba(255,255,255,0.08);
    border-radius: 2px;
    overflow: hidden;
    position: relative;
  }

  .temp-bar-fill {
    height: 100%;
    border-radius: 2px;
    background: linear-gradient(90deg, var(--cool), var(--warm));
  }
</style>
</head>
<body>
<div class="card" id="card">
  <div class="loading" id="loading">
    <div class="spinner"></div>
    <div class="loading-text">Fetching weather data...</div>
  </div>
</div>

<script>
(function() {
  const params = new URLSearchParams(window.location.search);
  const lat = parseFloat(params.get('lat') || '52.52');
  const lon = parseFloat(params.get('lon') || '13.405');
  const name = params.get('name') || 'Berlin';
  const dateParam = params.get('date');

  const today = new Date();
  const dateStr = dateParam || today.toISOString().slice(0, 10);

  const isPast = dateStr < today.toISOString().slice(0, 10);
  const apiPath = isPast ? '/api/om/archive' : '/api/om/forecast';

  const url = `${apiPath}?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 weatherCodes = {
    0: { label: 'Clear sky', icon: 'clear' },
    1: { label: 'Mainly clear', icon: 'partly-cloudy' },
    2: { label: 'Partly cloudy', icon: 'partly-cloudy' },
    3: { label: 'Overcast', icon: 'cloudy' },
    45: { label: 'Foggy', icon: 'fog' },
    48: { label: 'Rime fog', icon: 'fog' },
    51: { label: 'Light drizzle', icon: 'drizzle' },
    53: { label: 'Drizzle', icon: 'drizzle' },
    55: { label: 'Heavy drizzle', icon: 'drizzle' },
    56: { label: 'Freezing drizzle', icon: 'drizzle' },
    57: { label: 'Heavy freezing drizzle', icon: 'drizzle' },
    61: { label: 'Light rain', icon: 'rain' },
    63: { label: 'Rain', icon: 'rain' },
    65: { label: 'Heavy rain', icon: 'rain' },
    66: { label: 'Freezing rain', icon: 'rain' },
    67: { label: 'Heavy freezing rain', icon: 'rain' },
    71: { label: 'Light snow', icon: 'snow' },
    73: { label: 'Snow', icon: 'snow' },
    75: { label: 'Heavy snow', icon: 'snow' },
    77: { label: 'Snow grains', icon: 'snow' },
    80: { label: 'Light showers', icon: 'rain' },
    81: { label: 'Showers', icon: 'rain' },
    82: { label: 'Heavy showers', icon: 'rain' },
    85: { label: 'Light snow showers', icon: 'snow' },
    86: { label: 'Heavy snow showers', icon: 'snow' },
    95: { label: 'Thunderstorm', icon: 'thunder' },
    96: { label: 'Thunderstorm with hail', icon: 'thunder' },
    99: { label: 'Thunderstorm with heavy hail', icon: 'thunder' }
  };

  function getWeatherInfo(code) {
    return weatherCodes[code] || { label: 'Unknown', icon: 'unknown' };
  }

  function weatherIconSVG(type, size = 56) {
    const icons = {
      'clear': `<svg viewBox="0 0 56 56" width="${size}" height="${size}" fill="none">
        <circle cx="28" cy="28" r="12" fill="#fbbf24"/>
        <g stroke="#fbbf24" stroke-width="2.5" stroke-linecap="round">
          <line x1="28" y1="8" x2="28" y2="12"/>
          <line x1="28" y1="44" x2="28" y2="48"/>
          <line x1="8" y1="28" x2="12" y2="28"/>
          <line x1="44" y1="28" x2="48" y2="28"/>
          <line x1="13.86" y1="13.86" x2="16.69" y2="16.69"/>
          <line x1="39.31" y1="39.31" x2="42.14" y2="42.14"/>
          <line x1="13.86" y1="42.14" x2="16.69" y2="39.31"/>
          <line x1="39.31" y1="16.69" x2="42.14" y2="13.86"/>
        </g>
      </svg>`,
      'partly-cloudy': `<svg viewBox="0 0 56 56" width="${size}" height="${size}" fill="none">
        <circle cx="22" cy="22" r="10" fill="#fbbf24"/>
        <g stroke="#fbbf24" stroke-width="2" stroke-linecap="round">
          <line x1="22" y1="6" x2="22" y2="9"/>
          <line x1="22" y1="35" x2="22" y2="38"/>
          <line x1="6" y1="22" x2="9" y2="22"/>
          <line x1="10.34" y1="10.34" x2="12.46" y2="12.46"/>
          <line x1="31.54" y1="31.54" x2="33.66" y2="33.66"/>
          <line x1="10.34" y1="33.66" x2="12.46" y2="31.54"/>
        </g>
        <path d="M20 38c-4.42 0-8-3.13-8-7 0-3.31 2.54-6.06 5.83-6.86C18.6 20.56 21.96 18 26 18c4.97 0 9 3.58 9 8 0 .34-.02.67-.07 1H38c5.52 0 10 4.03 10 9s-4.48 9-10 9H20z" fill="#94a3b8" opacity="0.9"/>
      </svg>`,
      'cloudy': `<svg viewBox="0 0 56 56" width="${size}" height="${size}" fill="none">
        <path d="M16 36c-4.42 0-8-3.13-8-7 0-3.31 2.54-6.06 5.83-6.86C14.6 18.56 17.96 16 22 16c4.97 0 9 3.58 9 8 0 .34-.02.67-.07 1H34c5.52 0 10 4.03 10 9s-4.48 9-10 9H16z" fill="#94a3b8"/>
        <path d="M24 28c-3.31 0-6-2.24-6-5 0-2.37 1.9-4.33 4.37-4.9C23.05 15.76 25.56 14 28.5 14c3.73 0 6.75 2.69 6.75 6 0 .25-.02.5-.05.75H37c4.14 0 7.5 3.02 7.5 6.75S41.14 34.25 37 34.25H24z" fill="#cbd5e1" opacity="0.6"/>
      </svg>`,
      'rain': `<svg viewBox="0 0 56 56" width="${size}" height="${size}" fill="none">
        <path d="M16 26c-4.42 0-8-3.13-8-7 0-3.31 2.54-6.06 5.83-6.86C14.6 8.56 17.96 6 22 6c4.97 0 9 3.58 9 8 0 .34-.02.67-.07 1H34c5.52 0 10 4.03 10 9s-4.48 9-10 9H16z" fill="#94a3b8"/>
        <g stroke="#38bdf8" stroke-width="2" stroke-linecap="round">
          <line x1="18" y1="38" x2="16" y2="46"/>
          <line x1="28" y1="38" x2="26" y2="48"/>
          <line x1="38" y1="38" x2="36" y2="46"/>
        </g>
      </svg>`,
      'snow': `<svg viewBox="0 0 56 56" width="${size}" height="${size}" fill="none">
        <path d="M16 26c-4.42 0-8-3.13-8-7 0-3.31 2.54-6.06 5.83-6.86C14.6 8.56 17.96 6 22 6c4.97 0 9 3.58 9 8 0 .34-.02.67-.07 1H34c5.52 0 10 4.03 10 9s-4.48 9-10 9H16z" fill="#94a3b8"/>
        <g fill="#e2e8f0">
          <circle cx="18" cy="40" r="2"/>
          <circle cx="28" cy="44" r="2"/>
          <circle cx="38" cy="40" r="2"/>
          <circle cx="23" cy="50" r="2"/>
          <circle cx="33" cy="50" r="2"/>
        </g>
      </svg>`,
      'thunder': `<svg viewBox="0 0 56 56" width="${size}" height="${size}" fill="none">
        <path d="M16 24c-4.42 0-8-3.13-8-7 0-3.31 2.54-6.06 5.83-6.86C14.6 6.56 17.96 4 22 4c4.97 0 9 3.58 9 8 0 .34-.02.67-.07 1H34c5.52 0 10 4.03 10 9s-4.48 9-10 9H16z" fill="#64748b"/>
        <polygon points="30,28 22,40 28,40 24,52 36,36 30,36 34,28" fill="#fbbf24"/>
      </svg>`,
      'fog': `<svg viewBox="0 0 56 56" width="${size}" height="${size}" fill="none">
        <g stroke="#94a3b8" stroke-width="3" stroke-linecap="round">
          <line x1="10" y1="20" x2="46" y2="20"/>
          <line x1="12" y1="28" x2="44" y2="28"/>
          <line x1="8" y1="36" x2="48" y2="36"/>
        </g>
      </svg>`,
      'drizzle': `<svg viewBox="0 0 56 56" width="${size}" height="${size}" fill="none">
        <path d="M16 26c-4.42 0-8-3.13-8-7 0-3.31 2.54-6.06 5.83-6.86C14.6 8.56 17.96 6 22 6c4.97 0 9 3.58 9 8 0 .34-.02.67-.07 1H34c5.52 0 10 4.03 10 9s-4.48 9-10 9H16z" fill="#94a3b8"/>
        <g fill="#38bdf8" opacity="0.7">
          <circle cx="20" cy="40" r="1.5"/>
          <circle cx="28" cy="44" r="1.5"/>
          <circle cx="36" cy="40" r="1.5"/>
        </g>
      </svg>`,
      'unknown': `<svg viewBox="0 0 56 56" width="${size}" height="${size}" fill="none">
        <circle cx="28" cy="28" r="16" fill="#475569"/>
        <text x="28" y="34" text-anchor="middle" fill="#94a3b8" font-size="20" font-weight="600">?</text>
      </svg>`
    };
    return icons[type] || icons['unknown'];
  }

  function formatDate(dateStr) {
    const d = new Date(dateStr + 'T00:00:00Z');
    return d.toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', timeZone: 'UTC' });
  }

  function renderError(message) {
    document.getElementById('card').innerHTML = `
      <div class="error-state">
        <svg class="error-icon" viewBox="0 0 48 48" fill="none">
          <circle cx="24" cy="24" r="20" stroke="currentColor" stroke-width="2"/>
          <line x1="16" y1="16" x2="32" y2="32" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/>
          <line x1="32" y1="16" x2="16" y2="32" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/>
        </svg>
        <div class="error-title">Unable to Load Weather Data</div>
        <div class="error-message">${message}</div>
      </div>
    `;
  }

  function renderChart(hourlyTemps) {
    if (!hourlyTemps || hourlyTemps.length === 0) return '';

    const temps = hourlyTemps.map(t => t !== null && t !== undefined ? parseFloat(t) : null).filter(t => t !== null);
    if (temps.length === 0) return '';

    const minT = Math.min(...temps);
    const maxT = Math.max(...temps);
    const range = maxT - minT || 1;
    const padding = 8;
    const width = 568;
    const height = 64;
    const chartH = height - padding * 2;

    const points = hourlyTemps.map((t, i) => {
      if (t === null || t === undefined) return null;
      const x = (i / 23) * width;
      const y = padding + chartH - ((parseFloat(t) - minT) / range) * chartH;
      return { x, y, temp: parseFloat(t) };
    }).filter(p => p !== null);

    if (points.length < 2) return '';

    const linePath = points.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' ');

    const areaPath = linePath + ` L${points[points.length-1].x.toFixed(1)},${height} L${points[0].x.toFixed(1)},${height} Z`;

    const gradientId = 'chartGrad';
    const strokeGradId = 'strokeGrad';

    return `
      <svg class="chart-svg" viewBox="0 0 ${width} ${height}" preserveAspectRatio="none">
        <defs>
          <linearGradient id="${gradientId}" x1="0" y1="0" x2="0" y2="1">
            <stop offset="0%" stop-color="#38bdf8" stop-opacity="0.25"/>
            <stop offset="100%" stop-color="#38bdf8" stop-opacity="0"/>
          </linearGradient>
          <linearGradient id="${strokeGradId}" x1="0" y1="0" x2="1" y2="0">
            <stop offset="0%" stop-color="#6366f1"/>
            <stop offset="50%" stop-color="#38bdf8"/>
            <stop offset="100%" stop-color="#f97316"/>
          </linearGradient>
        </defs>
        <path d="${areaPath}" fill="url(#${gradientId})"/>
        <path d="${linePath}" fill="none" stroke="url(#${strokeGradId})" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
        ${points.map(p => `<circle cx="${p.x.toFixed(1)}" cy="${p.y.toFixed(1)}" r="2.5" fill="#0f172a" stroke="#38bdf8" stroke-width="1.5"/>`).join('')}
      </svg>
    `;
  }

  fetch(url)
    .then(res => {
      if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);
      return res.json();
    })
    .then(data => {
      if (!data.daily || !data.daily.time || data.daily.time.length === 0) {
        throw new Error('No weather data returned for the requested date.');
      }

      const idx = 0;
      const maxTemp = data.daily.temperature_2m_max[idx];
      const minTemp = data.daily.temperature_2m_min[idx];
      const weatherCode = data.daily.weather_code[idx];
      const weather = getWeatherInfo(weatherCode);

      const hourlyTemps = data.hourly ? data.hourly.temperature_2m : [];
      const hourlyTimes = data.hourly ? data.hourly.time : [];

      const card = document.getElementById('card');
      card.innerHTML = `
        <div class="header">
          <div>
            <div class="location">
              <svg class="location-icon" viewBox="0 0 20 20" fill="currentColor">
                <path fill-rule="evenodd" d="M5.05 4.05a7 7 0 119.9 9.9L10 18.9l-4.95-4.95a7 7 0 010-9.9zM10 11a2 2 0 100-4 2 2 0 000 4z" clip-rule="evenodd"/>
              </svg>
              <span class="location-name">${name}</span>
            </div>
            <div class="date">${formatDate(dateStr)}</div>
          </div>
          <div class="weather-icon">${weatherIconSVG(weather.icon)}</div>
        </div>

        <div class="summary">
          <div class="stat stat-max">
            <div class="stat-label">High</div>
            <div class="stat-value">${maxTemp.toFixed(1)}<span class="unit">°C</span></div>
          </div>
          <div class="stat stat-min">
            <div class="stat-label">Low</div>
            <div class="stat-value">${minTemp.toFixed(1)}<span class="unit">°C</span></div>
          </div>
          <div class="stat stat-condition">
            <div class="stat-label">Condition</div>
            <div class="stat-value">${weather.label}</div>
          </div>
        </div>

        <div class="hourly-section">
          <div class="hourly-header">Hourly Temperature</div>
          <div class="hourly-scroll">
            ${hourlyTimes.map((t, i) => {
              const temp = hourlyTemps[i];
              const hour = new Date(t + 'Z').getUTCHours();
              const tempVal = temp !== null && temp !== undefined ? `${parseFloat(temp).toFixed(1)}°` : '—';
              return `<div class="hour-item"><div class="hour-time">${String(hour).padStart(2, '0')}:00</div><div class="hour-temp">${tempVal}</div></div>`;
            }).join('')}
          </div>
          <div class="hourly-chart">
            ${renderChart(hourlyTemps)}
          </div>
        </div>
      `;
    })
    .catch(err => {
      console.error('Weather fetch error:', err);
      renderError(`Could not retrieve weather data from the API.<br><span style="color: var(--text-muted); font-size: 12px; margin-top: 8px; display: inline-block;">${err.message}</span>`);
    });
})();
</script>
</body>
</html>

L1 —— 廉价的确定性描述量

bytes 总计19,134html / css / js394 / 5,849 / 12,891
dom 节点12dom 深度5
css 规则44含 js
brightness29.3contrast12.2
colorfulness14.1留白92.5%

该 slot 的 telemetry

prompt tokens0completion tokens0
total tokens0wall157.5 s
costrequest id
config.json574 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_OPENCODE_KEY",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "qwen3.6-plus--cli--opencode--dev",
  "effort": null,
  "family": "qwen",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "qwen3.6-plus",
  "protocol": "cli",
  "served_model": "qwen3.6-plus",
  "telemetry": {
    "completion_tokens": null,
    "cost_usd": null,
    "prompt_tokens": null,
    "total_tokens": null,
    "wall_ms": 398058
  },
  "transport": "opencode-cli-isolated-xdg-go-subscription",
  "vendor_sanction_ref": null
}
send-log2.5 KB
{
  "N": 2,
  "batch_id": "2026-07-18--dev-opencode-cli",
  "config_id": "qwen3.6-plus--cli--opencode--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-17T18:14:27.557480+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T18:13:19.854222+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-17T18:17:08.585192+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T18:14:31.097385+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-17T18:18:39.489516+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T18:17:12.151020+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-17T18:20:07.674802+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-17T18:18:42.138900+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
    }
  }
}