← Files Model CompassARCHIVED FILE

skills/compare-model-tradeoffs/assets/neon-constellation.fragment.html

34.1 KB · Oct 4, 2026 · 12:30 UTC

↓ Download file

<div id="neon-constellation-root-7f3a" class="ncc-shell">
  <style>
    #neon-constellation-root-7f3a {
      width: 100%;
      min-width: 0;
      color: var(--foreground);
      font-size: var(--font-size-base);
      font-weight: 400;
    }

    #neon-constellation-root-7f3a .ncc-layout {
      display: grid;
      gap: 1rem;
      min-width: 0;
    }

    #neon-constellation-root-7f3a .ncc-selection {
      display: flex;
      flex-wrap: wrap;
      align-items: baseline;
      gap: 0.5rem 0.75rem;
      min-width: 0;
    }

    #neon-constellation-root-7f3a .ncc-selection-copy {
      min-width: min(100%, 24rem);
      flex: 1 1 24rem;
    }

    #neon-constellation-root-7f3a .ncc-chart-wrap {
      position: relative;
      min-width: 0;
      overflow: hidden;
    }

    #neon-constellation-root-7f3a .ncc-chart {
      display: block;
      width: 100%;
      height: 430px;
      overflow: visible;
    }

    #neon-constellation-root-7f3a .ncc-nebula-1 {
      fill: var(--viz-series-1);
      opacity: 0.06;
      filter: blur(34px);
      pointer-events: none;
    }

    #neon-constellation-root-7f3a .ncc-nebula-2 {
      fill: var(--viz-series-2);
      opacity: 0.045;
      filter: blur(42px);
      pointer-events: none;
    }

    #neon-constellation-root-7f3a .ncc-star {
      fill: var(--muted-foreground);
      opacity: 0.18;
      pointer-events: none;
    }

    #neon-constellation-root-7f3a .ncc-grid-line,
    #neon-constellation-root-7f3a .ncc-axis-line {
      fill: none;
      stroke: color-mix(in srgb, var(--border) 72%, transparent);
      stroke-width: 1;
      vector-effect: non-scaling-stroke;
    }

    #neon-constellation-root-7f3a .ncc-unknown-rail {
      fill: none;
      stroke: color-mix(in srgb, var(--muted-foreground) 56%, transparent);
      stroke-width: 1;
      stroke-dasharray: 5 5;
      vector-effect: non-scaling-stroke;
    }

    #neon-constellation-root-7f3a .ncc-axis-label {
      fill: var(--foreground);
      font-weight: 500;
    }

    #neon-constellation-root-7f3a .ncc-tick-label,
    #neon-constellation-root-7f3a .ncc-rail-label {
      fill: var(--muted-foreground);
    }

    #neon-constellation-root-7f3a .ncc-frontier {
      fill: none;
      stroke: var(--viz-series-1);
      stroke-width: 2;
      stroke-linecap: round;
      stroke-linejoin: round;
      filter: drop-shadow(0 0 5px var(--viz-series-1));
      vector-effect: non-scaling-stroke;
    }

    #neon-constellation-root-7f3a .ncc-fast-tether {
      fill: none;
      stroke: color-mix(in srgb, var(--muted-foreground) 68%, transparent);
      stroke-width: 1;
      stroke-dasharray: 3 4;
      vector-effect: non-scaling-stroke;
    }

    #neon-constellation-root-7f3a .ncc-fast-origin {
      fill: var(--background);
      stroke: var(--muted-foreground);
      stroke-width: 1;
      vector-effect: non-scaling-stroke;
    }

    #neon-constellation-root-7f3a .ncc-series-1 {
      --ncc-node-color: var(--viz-series-1);
    }

    #neon-constellation-root-7f3a .ncc-series-2 {
      --ncc-node-color: var(--viz-series-2);
    }

    #neon-constellation-root-7f3a .ncc-series-3 {
      --ncc-node-color: var(--viz-series-3);
    }

    #neon-constellation-root-7f3a .ncc-model-node {
      color: var(--ncc-node-color);
    }

    #neon-constellation-root-7f3a.ncc-ready .ncc-model-node {
      transition: transform 460ms cubic-bezier(0.2, 0.75, 0.25, 1);
    }

    #neon-constellation-root-7f3a .ncc-speed-ring {
      fill: none;
      stroke: var(--ncc-node-color);
      stroke-width: 1;
      stroke-opacity: 0.2;
      filter: drop-shadow(0 0 4px var(--ncc-node-color));
      vector-effect: non-scaling-stroke;
    }

    #neon-constellation-root-7f3a .ncc-node-glyph {
      fill: color-mix(in srgb, var(--background) 86%, var(--ncc-node-color) 14%);
      stroke: var(--ncc-node-color);
      stroke-width: 2;
      filter: drop-shadow(0 0 6px var(--ncc-node-color));
      vector-effect: non-scaling-stroke;
    }

    #neon-constellation-root-7f3a .ncc-selected-orbit {
      fill: none;
      stroke: var(--viz-series-4);
      stroke-width: 2;
      stroke-opacity: 0;
      vector-effect: non-scaling-stroke;
    }

    #neon-constellation-root-7f3a .ncc-model-node.ncc-is-selected .ncc-selected-orbit {
      stroke-opacity: 0.92;
      filter: drop-shadow(0 0 7px var(--viz-series-4));
    }

    #neon-constellation-root-7f3a .ncc-model-node.ncc-is-selected .ncc-node-glyph {
      fill: color-mix(in srgb, var(--background) 64%, var(--ncc-node-color) 36%);
    }

    #neon-constellation-root-7f3a .ncc-node-label {
      fill: var(--foreground);
      paint-order: stroke;
      stroke: var(--background);
      stroke-width: 3;
      stroke-linejoin: round;
      font-weight: 400;
    }

    #neon-constellation-root-7f3a .ncc-model-node.ncc-is-selected .ncc-node-label {
      font-weight: 500;
    }

    #neon-constellation-root-7f3a .ncc-model-node.ncc-pulse-once .ncc-selected-orbit {
      animation: ncc7f3a-pulse 560ms ease-out 1;
    }

    #neon-constellation-root-7f3a .ncc-legend {
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      gap: 0.5rem 1rem;
      color: var(--muted-foreground);
    }

    #neon-constellation-root-7f3a .ncc-legend-item {
      display: inline-flex;
      align-items: center;
      gap: 0.4rem;
    }

    #neon-constellation-root-7f3a .ncc-legend-halo,
    #neon-constellation-root-7f3a .ncc-legend-line,
    #neon-constellation-root-7f3a .ncc-legend-rail {
      display: inline-block;
      flex: 0 0 auto;
    }

    #neon-constellation-root-7f3a .ncc-legend-halo {
      width: 1.1rem;
      height: 1.1rem;
      border: 1px solid var(--viz-series-1);
      border-radius: 50%;
      box-shadow:
        0 0 0 3px color-mix(in srgb, var(--viz-series-1) 26%, transparent),
        0 0 7px var(--viz-series-1);
    }

    #neon-constellation-root-7f3a .ncc-legend-line {
      width: 1.5rem;
      height: 2px;
      background: var(--viz-series-1);
      box-shadow: 0 0 5px var(--viz-series-1);
    }

    #neon-constellation-root-7f3a .ncc-legend-rail {
      width: 1.5rem;
      border-top: 1px dashed var(--muted-foreground);
    }

    #neon-constellation-root-7f3a .ncc-gene-panel {
      display: grid;
      gap: 0.75rem;
      padding-top: 0.9rem;
      border-top: 1px solid color-mix(in srgb, var(--border) 72%, transparent);
      min-width: 0;
    }

    #neon-constellation-root-7f3a .ncc-gene-heading {
      display: flex;
      flex-wrap: wrap;
      align-items: baseline;
      gap: 0.45rem 0.75rem;
      min-width: 0;
    }

    #neon-constellation-root-7f3a .ncc-gene-heading h3 {
      margin: 0;
      font-weight: 500;
    }

    #neon-constellation-root-7f3a .ncc-gene-grid {
      display: grid;
      grid-template-columns: repeat(6, minmax(0, 1fr));
      gap: 0.65rem;
      min-width: 0;
    }

    #neon-constellation-root-7f3a .ncc-gene-step {
      display: grid;
      grid-template-rows: 58px auto auto;
      gap: 0.25rem;
      min-width: 0;
    }

    #neon-constellation-root-7f3a .ncc-gene-meter {
      display: flex;
      align-items: end;
      justify-content: center;
      border-bottom: 1px solid color-mix(in srgb, var(--border) 72%, transparent);
    }

    #neon-constellation-root-7f3a .ncc-gene-bar {
      display: block;
      width: 0.42rem;
      min-height: 2px;
      background: var(--viz-series-2);
      border-radius: 0.3rem 0.3rem 0 0;
      transition: height 360ms cubic-bezier(0.2, 0.75, 0.25, 1);
    }

    #neon-constellation-root-7f3a .ncc-gene-step.ncc-is-current .ncc-gene-bar {
      background: var(--viz-series-1);
      box-shadow: 0 0 8px var(--viz-series-1);
    }

    #neon-constellation-root-7f3a .ncc-gene-effort {
      font-weight: 500;
    }

    #neon-constellation-root-7f3a .ncc-source-note {
      color: var(--muted-foreground);
    }

    @keyframes ncc7f3a-pulse {
      0% {
        transform: scale(0.86);
        stroke-opacity: 0.9;
      }
      100% {
        transform: scale(1.35);
        stroke-opacity: 0;
      }
    }

    @media (max-width: 520px) {
      #neon-constellation-root-7f3a .ncc-chart {
        height: 500px;
      }

      #neon-constellation-root-7f3a .ncc-gene-grid {
        grid-template-columns: repeat(3, minmax(0, 1fr));
      }
    }

    @media (max-width: 350px) {
      #neon-constellation-root-7f3a .ncc-gene-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
      }
    }

    @media (prefers-reduced-motion: reduce) {
      #neon-constellation-root-7f3a .ncc-model-node,
      #neon-constellation-root-7f3a .ncc-gene-bar,
      #neon-constellation-root-7f3a .ncc-selected-orbit {
        transition: none !important;
        animation: none !important;
      }
    }
  </style>

  <div class="ncc-layout">
    <div class="viz-controls" aria-label="Model configuration">
      <label class="form-label" for="ncc7f3a-model">
        Model
        <select id="ncc7f3a-model" class="form-select">
          <option value="sol">GPT-5.6 Sol</option>
          <option value="terra">GPT-5.6 Terra</option>
          <option value="luna">GPT-5.6 Luna</option>
          <option value="gpt55">GPT-5.5</option>
          <option value="gpt54">GPT-5.4</option>
          <option value="mini">GPT-5.4 mini</option>
          <option value="spark">GPT-5.3 Codex Spark</option>
        </select>
      </label>

      <label class="form-label" for="ncc7f3a-effort">
        Effort
        <select id="ncc7f3a-effort" class="form-select"></select>
      </label>

      <label class="form-label" for="ncc7f3a-tier">
        Speed
        <select id="ncc7f3a-tier" class="form-select">
          <option value="standard">Standard</option>
          <option id="ncc7f3a-fast-option" value="fast">Fast</option>
        </select>
      </label>
    </div>

    <div class="ncc-selection" aria-live="polite">
      <span id="ncc7f3a-selected-badge" class="viz-badge"></span>
      <div class="ncc-selection-copy">
        <div id="ncc7f3a-selected-main"></div>
        <div id="ncc7f3a-selected-note" class="text-small text-muted"></div>
      </div>
    </div>

    <div id="ncc7f3a-chart-wrap" class="ncc-chart-wrap">
      <svg
        id="ncc7f3a-chart"
        class="ncc-chart"
        role="img"
        aria-labelledby="ncc7f3a-chart-title ncc7f3a-chart-desc"
      >
        <title id="ncc7f3a-chart-title">Model credit and coding-proxy Pareto constellation</title>
        <desc id="ncc7f3a-chart-desc"></desc>
        <g id="ncc7f3a-nebulae" aria-hidden="true">
          <circle id="ncc7f3a-nebula-1" class="ncc-nebula-1"></circle>
          <circle id="ncc7f3a-nebula-2" class="ncc-nebula-2"></circle>
        </g>
        <g id="ncc7f3a-stars" aria-hidden="true"></g>
        <g id="ncc7f3a-axes" aria-hidden="true"></g>
        <path id="ncc7f3a-frontier" class="ncc-frontier" aria-hidden="true"></path>
        <g id="ncc7f3a-fast-guide" aria-hidden="true"></g>
        <g id="ncc7f3a-nodes" aria-hidden="true"></g>
      </svg>
    </div>

    <div class="ncc-legend text-small" aria-label="Chart legend">
      <span class="ncc-legend-item">
        <span class="ncc-legend-halo" aria-hidden="true"></span>
        Halo count = documented speed ordinal
      </span>
      <span class="ncc-legend-item">
        <span class="ncc-legend-line" aria-hidden="true"></span>
        Current Pareto frontier
      </span>
      <span class="ncc-legend-item">
        <span class="ncc-legend-rail" aria-hidden="true"></span>
        AA coding proxy unavailable
      </span>
    </div>

    <section class="ncc-gene-panel" aria-labelledby="ncc7f3a-gene-title">
      <div class="ncc-gene-heading">
        <h3 id="ncc7f3a-gene-title">GeneBench Pro effort detail</h3>
        <span class="viz-badge">biology domain only</span>
        <span class="text-small text-muted">Pass % bar on a fixed 0-30 scale / average tokens in thousands</span>
      </div>
      <div id="ncc7f3a-gene-status" class="text-small"></div>
      <div id="ncc7f3a-gene-grid" class="ncc-gene-grid" role="list"></div>
    </section>

    <div class="ncc-source-note text-small">
      Official snapshot: 2026-07-24.
      <a href="https://openai.com/index/gpt-5-6/" target="_blank" rel="noreferrer">AA Coding Agent Index v1.1</a>
      is a published model-family proxy and never moves with effort.
      <a href="https://learn.chatgpt.com/docs/pricing" target="_blank" rel="noreferrer">Credit rates</a>,
      <a href="https://learn.chatgpt.com/docs/agent-configuration/speed" target="_blank" rel="noreferrer">Fast mode</a>, and
      <a href="https://cdn.openai.com/pdf/21938268-21af-442f-af93-3b2249afb241/genebench-pro.pdf" target="_blank" rel="noreferrer">GeneBench-Pro</a>
      are OpenAI sources.
    </div>
  </div>

  <script>
    (() => {
      const root = document.getElementById("neon-constellation-root-7f3a");
      if (!root) return;

      const ns = "http://www.w3.org/2000/svg";
      const chart = document.getElementById("ncc7f3a-chart");
      const axesLayer = document.getElementById("ncc7f3a-axes");
      const starsLayer = document.getElementById("ncc7f3a-stars");
      const nodesLayer = document.getElementById("ncc7f3a-nodes");
      const frontierPath = document.getElementById("ncc7f3a-frontier");
      const fastGuide = document.getElementById("ncc7f3a-fast-guide");
      const chartDesc = document.getElementById("ncc7f3a-chart-desc");
      const modelSelect = document.getElementById("ncc7f3a-model");
      const effortSelect = document.getElementById("ncc7f3a-effort");
      const tierSelect = document.getElementById("ncc7f3a-tier");
      const fastOption = document.getElementById("ncc7f3a-fast-option");
      const selectedBadge = document.getElementById("ncc7f3a-selected-badge");
      const selectedMain = document.getElementById("ncc7f3a-selected-main");
      const selectedNote = document.getElementById("ncc7f3a-selected-note");
      const geneGrid = document.getElementById("ncc7f3a-gene-grid");
      const geneStatus = document.getElementById("ncc7f3a-gene-status");
      const nebulaOne = document.getElementById("ncc7f3a-nebula-1");
      const nebulaTwo = document.getElementById("ncc7f3a-nebula-2");

      const gene56 = {
        sol: [
          { effort: "none", pass: 3.7, tokens: 1.4 },
          { effort: "low", pass: 14.4, tokens: 5.6 },
          { effort: "medium", pass: 22.5, tokens: 14.4 },
          { effort: "high", pass: 24.4, tokens: 19.5 },
          { effort: "xhigh", pass: 26.8, tokens: 25.7 },
          { effort: "max", pass: 28.7, tokens: 33.2 }
        ],
        terra: [
          { effort: "none", pass: 1, tokens: 0.93 },
          { effort: "low", pass: 6.5, tokens: 5.5 },
          { effort: "medium", pass: 13.6, tokens: 15.9 },
          { effort: "high", pass: 16.2, tokens: 22.2 },
          { effort: "xhigh", pass: 18.8, tokens: 31.1 },
          { effort: "max", pass: 23.3, tokens: 54.3 }
        ],
        luna: [
          { effort: "none", pass: 0.8, tokens: 0.975 },
          { effort: "low", pass: 2.3, tokens: 3.6 },
          { effort: "medium", pass: 4.7, tokens: 15.6 },
          { effort: "high", pass: 8, tokens: 32.3 },
          { effort: "xhigh", pass: 10.8, tokens: 53.1 },
          { effort: "max", pass: 16.5, tokens: 118.2 }
        ]
      };

      const models = {
        sol: {
          name: "GPT-5.6 Sol",
          short: "Sol",
          outputCredits: 750,
          fastFactor: 2.5,
          aa: 80,
          aaEffort: "Published effort not identified; not remapped by this control.",
          speed: 2,
          series: 1,
          shape: "circle",
          efforts: ["low", "medium", "high", "xhigh", "max"],
          presetEffort: "medium",
          presetTier: "standard"
        },
        terra: {
          name: "GPT-5.6 Terra",
          short: "Terra",
          outputCredits: 375,
          fastFactor: 2.5,
          aa: 77.4,
          aaEffort: "Published effort not identified; not remapped by this control.",
          speed: 3,
          series: 1,
          shape: "circle",
          efforts: ["low", "medium", "high", "xhigh", "max"],
          presetEffort: "medium",
          presetTier: "fast"
        },
        luna: {
          name: "GPT-5.6 Luna",
          short: "Luna",
          outputCredits: 150,
          fastFactor: 2.5,
          aa: 74.6,
          aaEffort: "Published effort not identified; not remapped by this control.",
          speed: 4,
          series: 1,
          shape: "circle",
          efforts: ["low", "medium", "high", "xhigh", "max"],
          presetEffort: "high",
          presetTier: "standard"
        },
        gpt55: {
          name: "GPT-5.5",
          short: "5.5",
          outputCredits: 750,
          fastFactor: 2.5,
          aa: 76.4,
          aaEffort: "Published effort not identified; not remapped by this control.",
          speed: 3,
          series: 2,
          shape: "diamond",
          efforts: ["low", "medium", "high", "xhigh"],
          presetEffort: "medium",
          presetTier: "standard"
        },
        gpt54: {
          name: "GPT-5.4",
          short: "5.4",
          outputCredits: 375,
          fastFactor: 2,
          aa: null,
          aaEffort: "No published AA Coding Agent Index v1.1 value.",
          speed: 3,
          series: 2,
          shape: "diamond",
          efforts: ["low", "medium", "high", "xhigh"],
          presetEffort: "medium",
          presetTier: "standard"
        },
        mini: {
          name: "GPT-5.4 mini",
          short: "5.4 mini",
          outputCredits: 113,
          fastFactor: null,
          aa: null,
          aaEffort: "No published AA Coding Agent Index v1.1 value.",
          speed: 4,
          series: 3,
          shape: "triangle",
          efforts: ["low", "medium", "high", "xhigh"],
          presetEffort: "medium",
          presetTier: "standard"
        },
        spark: {
          name: "GPT-5.3 Codex Spark",
          short: "Spark",
          outputCredits: null,
          fastFactor: null,
          aa: null,
          aaEffort: "Research preview; credit rate and comparable AA proxy are unknown.",
          speed: 5,
          series: 3,
          shape: "star",
          efforts: ["preview default"],
          presetEffort: "preview default",
          presetTier: "standard"
        }
      };

      const stateByModel = Object.fromEntries(
        Object.entries(models).map(([id, model]) => [
          id,
          { effort: model.presetEffort, tier: model.presetTier }
        ])
      );

      let selectedId = "sol";
      let nodeEls = {};
      let lastLayout = null;
      let initialized = false;
      const numberFormat = new Intl.NumberFormat("en-US", { maximumFractionDigits: 3 });

      function createSvg(tag, attrs = {}, text = "") {
        const el = document.createElementNS(ns, tag);
        Object.entries(attrs).forEach(([key, value]) => el.setAttribute(key, String(value)));
        if (text) el.textContent = text;
        return el;
      }

      function makeGlyph(shape) {
        if (shape === "circle") {
          return createSvg("circle", { class: "ncc-node-glyph", r: 6 });
        }
        if (shape === "diamond") {
          return createSvg("rect", {
            class: "ncc-node-glyph",
            x: -5,
            y: -5,
            width: 10,
            height: 10,
            transform: "rotate(45)"
          });
        }
        if (shape === "triangle") {
          return createSvg("path", {
            class: "ncc-node-glyph",
            d: "M 0 -7 L 7 6 L -7 6 Z"
          });
        }
        return createSvg("path", {
          class: "ncc-node-glyph",
          d: "M 0 -8 L 2.4 -2.8 L 8 -2.4 L 3.7 1.2 L 5.2 7 L 0 4 L -5.2 7 L -3.7 1.2 L -8 -2.4 L -2.4 -2.8 Z"
        });
      }

      function buildNodes() {
        nodesLayer.replaceChildren();
        nodeEls = {};

        Object.entries(models).forEach(([id, model]) => {
          const group = createSvg("g", {
            class: `ncc-model-node ncc-series-${model.series}`,
            "data-model": id
          });
          const rings = [];
          for (let index = 0; index < model.speed; index += 1) {
            const ring = createSvg("circle", {
              class: "ncc-speed-ring",
              r: 12 + index * 4
            });
            rings.push(ring);
            group.appendChild(ring);
          }
          const selectedOrbit = createSvg("circle", {
            class: "ncc-selected-orbit",
            r: 15 + model.speed * 4
          });
          const glyph = makeGlyph(model.shape);
          const label = createSvg("text", {
            class: "ncc-node-label text-small",
            x: 12,
            y: -10
          });
          group.append(selectedOrbit, glyph, label);
          nodesLayer.appendChild(group);
          nodeEls[id] = { group, label, selectedOrbit, rings };
        });
      }

      function buildStars() {
        const positions = [
          [0.08, 0.16], [0.16, 0.31], [0.24, 0.12], [0.31, 0.44],
          [0.39, 0.22], [0.47, 0.35], [0.55, 0.11], [0.63, 0.27],
          [0.71, 0.18], [0.78, 0.41], [0.86, 0.13], [0.93, 0.32],
          [0.11, 0.58], [0.27, 0.67], [0.43, 0.57], [0.59, 0.71],
          [0.74, 0.62], [0.89, 0.73]
        ];
        starsLayer.replaceChildren(
          ...positions.map(([x, y], index) =>
            createSvg("circle", {
              class: "ncc-star",
              "data-x": x,
              "data-y": y,
              r: index % 4 === 0 ? 1.7 : 1.1
            })
          )
        );
      }

      function currentState() {
        return stateByModel[selectedId];
      }

      function creditFor(id) {
        const model = models[id];
        if (model.outputCredits === null) return null;
        const state = stateByModel[id];
        if (id === selectedId && state.tier === "fast" && model.fastFactor) {
          return model.outputCredits * model.fastFactor;
        }
        return model.outputCredits;
      }

      function isParetoPoint(point, points) {
        return !points.some(
          other =>
            other.id !== point.id &&
            other.credit <= point.credit &&
            other.aa >= point.aa &&
            (other.credit < point.credit || other.aa > point.aa)
        );
      }

      function effortLabel(value) {
        if (value === "xhigh") return "extra high";
        return value;
      }

      function refreshControls() {
        const model = models[selectedId];
        const state = currentState();
        effortSelect.replaceChildren(
          ...model.efforts.map(effort => {
            const option = document.createElement("option");
            option.value = effort;
            option.textContent = effortLabel(effort);
            return option;
          })
        );
        effortSelect.value = state.effort;
        effortSelect.disabled = model.efforts.length === 1;
        fastOption.disabled = !model.fastFactor;
        if (!model.fastFactor && state.tier === "fast") {
          state.tier = "standard";
        }
        tierSelect.value = state.tier;
      }

      function formatCredit(value) {
        return value === null ? "unknown" : numberFormat.format(value);
      }

      function updateSelectionCopy() {
        const model = models[selectedId];
        const state = currentState();
        const credit = creditFor(selectedId);
        const aaText = model.aa === null
          ? "AA coding proxy unknown"
          : `AA coding proxy ${numberFormat.format(model.aa)}`;
        selectedBadge.textContent = `${model.name} / ${effortLabel(state.effort)} / ${state.tier === "fast" ? "Fast" : "Standard"}`;
        selectedMain.textContent = `${formatCredit(credit)} output credits/M / ${aaText} / speed ordinal ${model.speed}/5`;

        if (model.outputCredits === null) {
          selectedNote.textContent = model.aaEffort;
        } else if (state.tier === "fast") {
          selectedNote.textContent = `${model.aaEffort} Fast is documented as 1.5x model speed and ${model.fastFactor}x credits; total task time remains unknown.`;
        } else {
          selectedNote.textContent = `${model.aaEffort} Higher effort can use more time and tokens; the amount is not published here.`;
        }
      }

      function drawAxes(layout) {
        const { width, height, left, right, top, knownBottom, railY, xAxisY, xScale, yScale } = layout;
        const elements = [];
        const xTicks = [0, 500, 1000, 1500, 2000];
        const yTicks = [72, 76, 80];

        xTicks.forEach((tick, index) => {
          const x = xScale(tick);
          elements.push(createSvg("line", {
            class: "ncc-grid-line",
            x1: x,
            y1: top,
            x2: x,
            y2: xAxisY
          }));
          const anchor = index === 0 ? "start" : index === xTicks.length - 1 ? "end" : "middle";
          elements.push(createSvg("text", {
            class: "ncc-tick-label text-small",
            x,
            y: xAxisY + 20,
            "text-anchor": anchor
          }, numberFormat.format(tick)));
        });

        yTicks.forEach(tick => {
          const y = yScale(tick);
          elements.push(createSvg("line", {
            class: "ncc-grid-line",
            x1: left,
            y1: y,
            x2: width - right,
            y2: y
          }));
          elements.push(createSvg("text", {
            class: "ncc-tick-label text-small",
            x: left - 8,
            y: y + 4,
            "text-anchor": "end"
          }, numberFormat.format(tick)));
        });

        elements.push(createSvg("line", {
          class: "ncc-axis-line",
          x1: left,
          y1: xAxisY,
          x2: width - right,
          y2: xAxisY
        }));
        elements.push(createSvg("line", {
          class: "ncc-unknown-rail",
          x1: left,
          y1: railY,
          x2: width - right,
          y2: railY
        }));
        elements.push(createSvg("text", {
          class: "ncc-axis-label",
          x: left,
          y: top - 14
        }, "AA Coding Agent Index v1.1"));
        elements.push(createSvg("text", {
          class: "ncc-rail-label text-small",
          x: left,
          y: railY - 12
        }, "AA proxy unknown"));
        elements.push(createSvg("text", {
          class: "ncc-axis-label",
          x: (left + width - right) / 2,
          y: height - 8,
          "text-anchor": "middle"
        }, "ChatGPT output credits / 1M tokens ->"));

        axesLayer.replaceChildren(...elements);
      }

      function updateDecor(layout) {
        const { width, height } = layout;
        chart.setAttribute("viewBox", `0 0 ${width} ${height}`);
        nebulaOne.setAttribute("cx", width * 0.28);
        nebulaOne.setAttribute("cy", height * 0.25);
        nebulaOne.setAttribute("r", Math.max(54, width * 0.13));
        nebulaTwo.setAttribute("cx", width * 0.76);
        nebulaTwo.setAttribute("cy", height * 0.54);
        nebulaTwo.setAttribute("r", Math.max(62, width * 0.15));
        Array.from(starsLayer.children).forEach(star => {
          star.setAttribute("cx", Number(star.dataset.x) * width);
          star.setAttribute("cy", Number(star.dataset.y) * height);
        });
      }

      function labelPlacement(id, x, width, isUnknown) {
        let dx = 12;
        let dy = -10;
        let anchor = "start";

        if (id === "gpt55") dy = 18;
        if (id === "luna") dy = 18;
        if (id === "gpt54") dy = 20;
        if (id === "mini") dy = -16;
        if (id === "spark") dy = -16;
        if (isUnknown && id === "gpt54") dy = 20;

        if (x > width - 105 || id === "spark") {
          dx = -12;
          anchor = "end";
        }
        return { dx, dy, anchor };
      }

      function renderChart(animateSelection = false) {
        const bounds = chart.getBoundingClientRect();
        const width = Math.max(300, Math.round(bounds.width || 700));
        const height = Math.max(400, Math.round(bounds.height || 430));
        const left = width < 440 ? 42 : 56;
        const right = width < 440 ? 12 : 28;
        const top = 42;
        const knownBottom = height - 166;
        const railY = height - 105;
        const xAxisY = height - 50;
        const plotWidth = width - left - right;
        const xScale = value => left + (value / 2000) * plotWidth;
        const yScale = value => knownBottom - ((value - 70) / 12) * (knownBottom - top);
        const layout = { width, height, left, right, top, knownBottom, railY, xAxisY, xScale, yScale };
        lastLayout = layout;

        drawAxes(layout);
        updateDecor(layout);

        const points = Object.entries(models).map(([id, model]) => {
          const credit = creditFor(id);
          const x = credit === null ? width - right - 18 : xScale(credit);
          const y = model.aa === null ? railY : yScale(model.aa);
          return { id, model, credit, aa: model.aa, x, y };
        });
        const knownPoints = points.filter(point => point.credit !== null && point.aa !== null);
        const frontierPoints = knownPoints
          .filter(point => isParetoPoint(point, knownPoints))
          .sort((a, b) => a.credit - b.credit);

        frontierPath.setAttribute(
          "d",
          frontierPoints.length
            ? frontierPoints.map((point, index) => `${index ? "L" : "M"} ${point.x} ${point.y}`).join(" ")
            : ""
        );

        fastGuide.replaceChildren();
        const selectedModel = models[selectedId];
        const selectedState = currentState();
        if (
          selectedState.tier === "fast" &&
          selectedModel.fastFactor &&
          selectedModel.outputCredits !== null
        ) {
          const selectedPoint = points.find(point => point.id === selectedId);
          const originX = xScale(selectedModel.outputCredits);
          fastGuide.append(
            createSvg("line", {
              class: "ncc-fast-tether",
              x1: originX,
              y1: selectedPoint.y,
              x2: selectedPoint.x,
              y2: selectedPoint.y
            }),
            createSvg("circle", {
              class: "ncc-fast-origin",
              cx: originX,
              cy: selectedPoint.y,
              r: 4
            })
          );
        }

        points.forEach(point => {
          const refs = nodeEls[point.id];
          refs.group.style.transform = `translate(${point.x}px, ${point.y}px)`;
          refs.group.classList.toggle("ncc-is-selected", point.id === selectedId);
          const label = point.model.aa === null
            ? `${point.model.short} / AA ?`
            : `${point.model.short} / ${numberFormat.format(point.model.aa)}`;
          const placement = labelPlacement(point.id, point.x, width, point.model.aa === null);
          refs.label.textContent = label;
          refs.label.setAttribute("x", placement.dx);
          refs.label.setAttribute("y", placement.dy);
          refs.label.setAttribute("text-anchor", placement.anchor);
        });

        if (animateSelection) {
          const selectedGroup = nodeEls[selectedId].group;
          selectedGroup.classList.remove("ncc-pulse-once");
          void selectedGroup.getBoundingClientRect();
          selectedGroup.classList.add("ncc-pulse-once");
        }

        const descriptions = points.map(point => {
          const creditText = point.credit === null ? "credit rate unknown" : `${formatCredit(point.credit)} output credits per million`;
          const aaText = point.aa === null ? "AA coding proxy unknown" : `AA coding proxy ${numberFormat.format(point.aa)}`;
          return `${point.model.name}: ${creditText}, ${aaText}, speed ordinal ${point.model.speed} of 5`;
        });
        chartDesc.textContent = `${models[selectedId].name} is selected. ${descriptions.join(". ")}.`;
      }

      function renderGene() {
        const rows = gene56[selectedId];
        const state = currentState();
        geneGrid.replaceChildren();

        if (!rows) {
          geneGrid.hidden = true;
          geneStatus.hidden = false;
          geneStatus.textContent = "No official effort-specific GeneBench series is included for this model.";
          return;
        }

        geneGrid.hidden = false;
        geneStatus.hidden = false;
        geneStatus.textContent = "Domain-specific biology evidence only; do not generalize these effort curves to coding. Ultra is excluded because it changes agent topology.";

        rows.forEach(row => {
          const item = document.createElement("div");
          item.className = "ncc-gene-step";
          item.setAttribute("role", "listitem");
          item.setAttribute(
            "aria-label",
            `${row.effort}: ${numberFormat.format(row.pass)} percent pass, ${numberFormat.format(row.tokens)} thousand average tokens`
          );
          if (row.effort === state.effort) item.classList.add("ncc-is-current");

          const meter = document.createElement("div");
          meter.className = "ncc-gene-meter";
          meter.setAttribute("aria-hidden", "true");
          const bar = document.createElement("span");
          bar.className = "ncc-gene-bar";
          bar.style.height = `${Math.max(2, (row.pass / 30) * 56)}px`;
          meter.appendChild(bar);

          const effort = document.createElement("div");
          effort.className = "ncc-gene-effort";
          effort.textContent = effortLabel(row.effort);

          const value = document.createElement("div");
          value.className = "text-small text-muted";
          value.textContent = `${numberFormat.format(row.pass)}% / ${numberFormat.format(row.tokens)}k`;
          item.append(meter, effort, value);
          geneGrid.appendChild(item);
        });
      }

      function renderState(animateSelection = false) {
        refreshControls();
        updateSelectionCopy();
        renderChart(animateSelection);
        renderGene();
      }

      modelSelect.addEventListener("change", () => {
        selectedId = modelSelect.value;
        renderState(true);
      });

      effortSelect.addEventListener("change", () => {
        stateByModel[selectedId].effort = effortSelect.value;
        renderState(true);
      });

      tierSelect.addEventListener("change", () => {
        stateByModel[selectedId].tier = tierSelect.value;
        renderState(true);
      });

      buildStars();
      buildNodes();
      modelSelect.value = selectedId;
      renderState(false);
      requestAnimationFrame(() => {
        root.classList.add("ncc-ready");
        initialized = true;
      });

      const observer = new ResizeObserver(() => {
        if (!initialized || !lastLayout) return;
        renderChart(false);
      });
      observer.observe(chart);
    })();
  </script>
</div>

SHA-256: 7e9ab85afcea4c0129f0ccfd4f6f74a67a7eb2735f6a1bc0c6e775f61ae0c0a6