gpt-5.6-luna @ high · kiro

kirohigh
config
gpt-5.6-luna-eff-high--cli--kiro--dev
batch
2026-07-19--unified
transport
kiro-cli-isolated-home-github-social
protocol
cli · plan
served model
gpt-5.6-luna
采集于
2026年7月18日 11:54 · N=2
variant
live
slot 0 · P-q · sandboxed iframe
gpt-5.6-luna @high · kiro P-q slot 0 截图

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

similarity 邻居

限于 session 2026-07-19--unified

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

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

  • namematch
  • conditionmatch
  • datematch
  • max tempambiguousinsufficient-distinct-temperature-nodes
  • min tempambiguousinsufficient-distinct-temperature-nodes
  • hourlyambiguouscoverage · 0 命中 · 0 不符 · 24 未展示
  • 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=device-width, initial-scale=1.0">
  <title>Weather Card</title>
  <style>
    :root {
      --ink: #10243d;
      --muted: #718198;
      --line: #e8eef5;
      --blue: #2269d8;
      --blue-deep: #174ca5;
      --sky: #eaf4ff;
      --warm: #ffb45d;
      --shadow: 0 24px 70px rgba(23, 56, 93, .14);
    }

    * { box-sizing: border-box; }

    body {
      margin: 0;
      min-width: 1024px;
      min-height: 100vh;
      color: var(--ink);
      background:
        radial-gradient(circle at 85% 12%, rgba(255, 224, 171, .72), transparent 27%),
        radial-gradient(circle at 8% 92%, rgba(194, 226, 255, .82), transparent 31%),
        #f5f8fc;
      font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
      -webkit-font-smoothing: antialiased;
    }

    .page {
      width: 1180px;
      min-height: 720px;
      margin: 40px auto;
      padding: 34px 38px 30px;
      overflow: hidden;
      position: relative;
      border: 1px solid rgba(255,255,255,.8);
      border-radius: 30px;
      background: rgba(255,255,255,.78);
      box-shadow: var(--shadow);
      backdrop-filter: blur(18px);
    }

    .page::after {
      content: "";
      position: absolute;
      width: 390px;
      height: 390px;
      right: -190px;
      bottom: -220px;
      border-radius: 50%;
      background: rgba(223, 239, 255, .48);
      pointer-events: none;
    }

    header {
      display: flex;
      justify-content: space-between;
      align-items: flex-start;
      position: relative;
      z-index: 1;
    }

    .eyebrow {
      margin: 0 0 10px;
      color: var(--blue);
      font-size: 11px;
      font-weight: 800;
      letter-spacing: .18em;
      text-transform: uppercase;
    }

    h1 {
      max-width: 620px;
      margin: 0;
      font-size: 35px;
      line-height: 1.1;
      letter-spacing: -.045em;
      font-weight: 760;
    }

    .date-label {
      margin: 11px 0 0;
      color: var(--muted);
      font-size: 14px;
      font-weight: 560;
    }

    .unit-pill {
      display: inline-flex;
      align-items: center;
      gap: 8px;
      padding: 9px 13px;
      border: 1px solid #dce8f6;
      border-radius: 999px;
      color: var(--blue-deep);
      background: #f7fbff;
      font-size: 12px;
      font-weight: 750;
      letter-spacing: .03em;
    }

    .unit-pill::before {
      content: "";
      width: 7px;
      height: 7px;
      border-radius: 50%;
      background: #57a7f4;
      box-shadow: 0 0 0 4px #e5f2ff;
    }

    .hero {
      display: grid;
      grid-template-columns: 1.04fr .96fr;
      gap: 28px;
      margin-top: 38px;
      position: relative;
      z-index: 1;
    }

    .summary {
      min-height: 248px;
      padding: 28px 30px;
      display: flex;
      align-items: center;
      justify-content: space-between;
      border-radius: 24px;
      color: white;
      background:
        radial-gradient(circle at 88% 12%, rgba(255,255,255,.32), transparent 23%),
        linear-gradient(135deg, #397fdf 0%, #1f62c7 53%, #174aa2 100%);
      box-shadow: 0 15px 33px rgba(35, 101, 204, .23);
    }

    .summary-copy { align-self: stretch; display: flex; flex-direction: column; justify-content: space-between; }
    .summary-kicker {
      margin: 0;
      color: rgba(255,255,255,.72);
      font-size: 12px;
      font-weight: 700;
      letter-spacing: .13em;
      text-transform: uppercase;
    }

    .temperature {
      margin: 18px 0 4px;
      font-size: 82px;
      line-height: .92;
      letter-spacing: -.08em;
      font-weight: 730;
    }

    .temperature sup {
      margin-left: 4px;
      font-size: 31px;
      font-weight: 520;
      vertical-align: top;
      letter-spacing: -.03em;
    }

    .condition {
      margin: 0;
      color: rgba(255,255,255,.88);
      font-size: 17px;
      font-weight: 620;
    }

    .range {
      display: flex;
      gap: 17px;
      margin-top: 24px;
      color: rgba(255,255,255,.77);
      font-size: 13px;
    }

    .range strong {
      color: white;
      font-weight: 750;
    }

    .weather-art {
      width: 150px;
      height: 150px;
      margin-right: 8px;
      position: relative;
      flex: 0 0 auto;
    }

    .sun {
      width: 72px;
      height: 72px;
      position: absolute;
      top: 8px;
      right: 10px;
      border-radius: 50%;
      background: #ffd27b;
      box-shadow: 0 0 0 12px rgba(255, 213, 133, .14), 0 0 34px rgba(255, 212, 120, .75);
    }

    .cloud {
      width: 120px;
      height: 42px;
      position: absolute;
      left: 5px;
      bottom: 31px;
      border-radius: 28px;
      background: #fff;
      box-shadow: 0 11px 20px rgba(15, 51, 112, .15);
    }

    .cloud::before, .cloud::after {
      content: "";
      position: absolute;
      border-radius: 50%;
      background: #fff;
    }

    .cloud::before { width: 57px; height: 57px; left: 19px; bottom: 12px; }
    .cloud::after { width: 42px; height: 42px; left: 66px; bottom: 16px; }

    .details {
      min-height: 248px;
      padding: 25px 26px;
      border: 1px solid var(--line);
      border-radius: 24px;
      background: rgba(255,255,255,.84);
    }

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

    .detail-grid {
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 13px;
    }

    .detail {
      min-height: 76px;
      padding: 15px 16px;
      border-radius: 16px;
      background: #f7faff;
    }

    .detail-label {
      display: block;
      margin-bottom: 8px;
      color: #8795a9;
      font-size: 11px;
      font-weight: 700;
      letter-spacing: .04em;
      text-transform: uppercase;
    }

    .detail-value {
      color: var(--ink);
      font-size: 21px;
      font-weight: 750;
      letter-spacing: -.04em;
    }

    .detail-value.small {
      font-size: 16px;
      letter-spacing: -.02em;
    }

    .hourly-section {
      margin-top: 32px;
      position: relative;
      z-index: 1;
    }

    .section-heading {
      display: flex;
      align-items: baseline;
      justify-content: space-between;
      margin-bottom: 16px;
    }

    .section-heading h2 {
      margin: 0;
      font-size: 18px;
      letter-spacing: -.025em;
    }

    .section-heading span {
      color: var(--muted);
      font-size: 12px;
      font-weight: 600;
    }

    .hourly {
      height: 183px;
      display: grid;
      grid-template-columns: repeat(24, minmax(32px, 1fr));
      gap: 6px;
      padding: 17px 12px 12px;
      border: 1px solid var(--line);
      border-radius: 20px;
      background: rgba(255,255,255,.8);
    }

    .hour {
      min-width: 0;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: space-between;
      color: var(--muted);
      font-size: 10px;
      font-weight: 650;
    }

    .hour-time { opacity: .78; }
    .hour-temp {
      color: var(--ink);
      font-size: 11px;
      font-weight: 760;
    }

    .bar-track {
      width: 9px;
      height: 88px;
      display: flex;
      align-items: flex-end;
      border-radius: 8px;
      background: #edf3fa;
      overflow: hidden;
    }

    .bar {
      width: 100%;
      min-height: 7px;
      border-radius: 8px;
      background: linear-gradient(180deg, #67b4f5, #2671d8);
    }

    .loading, .error {
      min-height: 410px;
      display: grid;
      place-items: center;
      text-align: center;
      color: var(--muted);
    }

    .loading-dot {
      width: 10px;
      height: 10px;
      display: inline-block;
      margin-right: 8px;
      border-radius: 50%;
      background: var(--blue);
      animation: pulse 1s infinite ease-in-out;
    }

    .error-box {
      max-width: 470px;
      padding: 26px 30px;
      border: 1px solid #f3d9d9;
      border-radius: 18px;
      color: #a65353;
      background: #fff8f8;
      font-size: 14px;
      line-height: 1.5;
    }

    @keyframes pulse {
      0%, 100% { opacity: .32; transform: scale(.8); }
      50% { opacity: 1; transform: scale(1); }
    }

    @media (max-width: 1100px) {
      .page { width: calc(100% - 40px); }
      .temperature { font-size: 70px; }
      .weather-art { transform: scale(.82); margin-right: -8px; }
    }
  </style>
</head>
<body>
  <main class="page">
    <header>
      <div>
        <p class="eyebrow">Daily forecast</p>
        <h1 id="location">Berlin</h1>
        <p class="date-label" id="date">Loading date…</p>
      </div>
      <div class="unit-pill">CELSIUS</div>
    </header>

    <div id="content">
      <div class="loading"><div><span class="loading-dot"></span>Loading weather data</div></div>
    </div>
  </main>

  <script>
    (() => {
      const params = new URLSearchParams(window.location.search);
      const now = new Date();
      const today = [
        now.getUTCFullYear(),
        String(now.getUTCMonth() + 1).padStart(2, "0"),
        String(now.getUTCDate()).padStart(2, "0")
      ].join("-");

      const validDate = value => /^\d{4}-\d{2}-\d{2}$/.test(value || "") && !Number.isNaN(Date.parse(value + "T00:00:00Z"));
      const date = validDate(params.get("date")) ? params.get("date") : today;
      const name = params.get("name") || "Berlin";
      const latitude = Number(params.get("lat"));
      const longitude = Number(params.get("lon"));
      const lat = Number.isFinite(latitude) ? latitude : 52.52;
      const lon = Number.isFinite(longitude) ? longitude : 13.405;

      const locationEl = document.getElementById("location");
      const dateEl = document.getElementById("date");
      const contentEl = document.getElementById("content");

      locationEl.textContent = name;
      dateEl.textContent = formatDate(date);

      function formatDate(value) {
        return new Intl.DateTimeFormat("en-US", {
          weekday: "long",
          month: "long",
          day: "numeric",
          year: "numeric",
          timeZone: "UTC"
        }).format(new Date(value + "T00:00:00Z"));
      }

      function weatherCondition(code) {
        const map = {
          0: ["Clear sky", "clear"],
          1: ["Mainly clear", "clear"],
          2: ["Partly cloudy", "cloudy"],
          3: ["Overcast", "cloudy"],
          45: ["Fog", "cloudy"],
          48: ["Depositing rime fog", "cloudy"],
          51: ["Light drizzle", "rain"],
          53: ["Drizzle", "rain"],
          55: ["Heavy drizzle", "rain"],
          56: ["Freezing drizzle", "rain"],
          57: ["Heavy freezing drizzle", "rain"],
          61: ["Light rain", "rain"],
          63: ["Rain", "rain"],
          65: ["Heavy rain", "rain"],
          66: ["Freezing rain", "rain"],
          67: ["Heavy freezing rain", "rain"],
          71: ["Light snow", "snow"],
          73: ["Snow", "snow"],
          75: ["Heavy snow", "snow"],
          77: ["Snow grains", "snow"],
          80: ["Light rain showers", "rain"],
          81: ["Rain showers", "rain"],
          82: ["Heavy rain showers", "rain"],
          85: ["Light snow showers", "snow"],
          86: ["Snow showers", "snow"],
          95: ["Thunderstorm", "storm"],
          96: ["Thunderstorm with hail", "storm"],
          99: ["Thunderstorm with heavy hail", "storm"]
        };
        return map[Number(code)] || ["Weather conditions unavailable", "cloudy"];
      }

      function number(value) {
        return Number.isFinite(Number(value)) ? Math.round(Number(value)) : null;
      }

      function degree(value) {
        return value === null ? "—" : `${value}°`;
      }

      function render(data) {
        if (!data || !data.daily || !data.hourly ||
            !Array.isArray(data.daily.temperature_2m_max) ||
            !Array.isArray(data.daily.temperature_2m_min) ||
            !Array.isArray(data.daily.weather_code) ||
            !Array.isArray(data.hourly.temperature_2m)) {
          throw new Error("The weather response was incomplete.");
        }

        const max = number(data.daily.temperature_2m_max[0]);
        const min = number(data.daily.temperature_2m_min[0]);
        const code = data.daily.weather_code[0];
        const condition = weatherCondition(code);
        const hourlyTemps = data.hourly.temperature_2m.slice(0, 24).map(Number).filter(Number.isFinite);

        if (hourlyTemps.length === 0 || max === null || min === null) {
          throw new Error("No weather data is available for this date.");
        }

        const low = Math.min(...hourlyTemps);
        const high = Math.max(...hourlyTemps);
        const spread = Math.max(high - low, 1);

        contentEl.innerHTML = `
          <section class="hero">
            <article class="summary">
              <div class="summary-copy">
                <div>
                  <p class="summary-kicker">At a glance</p>
                  <div class="temperature">${degree(max)}<sup>C</sup></div>
                  <p class="condition">${condition[0]}</p>
                </div>
                <div class="range">
                  <span>High <strong>${degree(max)}</strong></span>
                  <span>Low <strong>${degree(min)}</strong></span>
                </div>
              </div>
              <div class="weather-art" aria-hidden="true">
                <div class="sun"></div>
                <div class="cloud"></div>
              </div>
            </article>
            <article class="details">
              <p class="details-title">Today's details</p>
              <div class="detail-grid">
                <div class="detail">
                  <span class="detail-label">Maximum</span>
                  <strong class="detail-value">${degree(max)}C</strong>
                </div>
                <div class="detail">
                  <span class="detail-label">Minimum</span>
                  <strong class="detail-value">${degree(min)}C</strong>
                </div>
                <div class="detail">
                  <span class="detail-label">Condition</span>
                  <strong class="detail-value small">${condition[0]}</strong>
                </div>
                <div class="detail">
                  <span class="detail-label">Hourly readings</span>
                  <strong class="detail-value">${hourlyTemps.length} hours</strong>
                </div>
              </div>
            </article>
          </section>
          <section class="hourly-section">
            <div class="section-heading">
              <h2>Hourly temperature</h2>
              <span>UTC · degrees Celsius</span>
            </div>
            <div class="hourly" id="hourly"></div>
          </section>
        `;

        const hourlyEl = document.getElementById("hourly");
        hourlyEl.innerHTML = hourlyTemps.map((temp, index) => {
          const hour = String(index).padStart(2, "0");
          const height = 12 + ((temp - low) / spread) * 82;
          return `
            <div class="hour" title="${hour}:00 UTC · ${Math.round(temp)}°C">
              <span class="hour-time">${hour}</span>
              <div class="bar-track"><div class="bar" style="height:${height}%"></div></div>
              <span class="hour-temp">${Math.round(temp)}°</span>
            </div>
          `;
        }).join("");
      }

      function showError(message) {
        contentEl.innerHTML = `<div class="error"><div class="error-box"><strong>Weather data unavailable</strong><br>${message}</div></div>`;
      }

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

      fetch(`${endpoint}?${request.toString()}`, { headers: { "Accept": "application/json" } })
        .then(response => {
          if (!response.ok) throw new Error(`Request failed with status ${response.status}.`);
          return response.json();
        })
        .then(render)
        .catch(error => showError(error.message || "Please try again later."));
    })();
  </script>
</body>
</html>

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

bytes 总计16,455html / css / js641 / 8,290 / 7,524
dom 节点19dom 深度7
css 规则53含 js
brightness227.1contrast50.3
colorfulness53.2留白84.2%

该 slot 的 telemetry

prompt tokens0completion tokens0
total tokens0wall25.2 s
costrequest id
config.json566 B
{
  "N": 2,
  "auth": {
    "credential_ref": "WCB_NONE",
    "method": "oauth-login"
  },
  "billing": "plan",
  "config_id": "gpt-5.6-luna-eff-high--cli--kiro--dev",
  "effort": "high",
  "family": "gpt",
  "m": {
    "min": 2,
    "q": 2
  },
  "model_id": "gpt-5.6-luna",
  "protocol": "cli",
  "served_model": "gpt-5.6-luna",
  "telemetry": {
    "completion_tokens": null,
    "cost_usd": null,
    "prompt_tokens": null,
    "total_tokens": null,
    "wall_ms": 90997
  },
  "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": "gpt-5.6-luna-eff-high--cli--kiro--dev",
  "positions": [
    {
      "attempts": [
        {
          "attempt_index": 0,
          "backoff_ms": null,
          "charged": true,
          "ended_at": "2026-07-19T00:04:07.378184+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-19T00:03:42.088102+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-19T00:04:29.172668+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-19T00:04:11.133312+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-19T00:04:55.420951+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-19T00:04:31.904888+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-07-19T00:05:23.412886+00:00",
          "http_status": null,
          "outcome": "valid",
          "reached_model": true,
          "reason": "ok",
          "request_id": null,
          "started_at": "2026-07-19T00:04:59.101286+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
    }
  }
}