{
  "taskId": "GT-003",
  "slug": "cost-per-token-trend",
  "archetype": "data-viz",
  "archetypeLabel": "数据可视化",
  "taskSetVersion": "v1",

  "provenance": {
    "kind": "real-requirement",
    "pinnedSha": "4a68e02d3d695cee3c39d255ea5d20f7f2bf9b8c",
    "citations": [
      {
        "path": "docs/internal/_metrics/phase0-ledger.md",
        "mustContain": "Cost per Token Trend",
        "why": "phase0-ledger 是 append-only 的真实任务台账（56 条日期行口径）。本条是 2026-05-11 TVU SaaS Dashboard (Usage Service) 真做过的任务。"
      },
      {
        "path": "docs/internal/_metrics/phase0-ledger.md",
        "mustContain": "chart primitives 不在 library scope",
        "why": "该行的「⚠️ 真 gap」列自陈：图表图元**不在 DS library 范围内**。⇒ 本条测的是「真源缺件时 AI 怎么办」，正是 escape-rate 的靶心（第一轮 Top 逃逸值 `999px` 就是「真源该有而没有」那一类）。"
      }
    ]
  },

  "prompt": {
    "templateVersion": "pt-v1",
    "text": "请用 TVU 设计系统，为 TVU SaaS Dashboard 新增一个「Cost per Token Trend」页面，产出**单文件 HTML** 高保真 mockup。\n\n业务方要看的是：一段时间内单位 token 成本的走势，以及它是在变好还是变差。\n\n至少要覆盖：\n\n1. 页面顶部一个概览区：当期单位成本的关键数字 + 相对上一期的变化（涨/跌要能一眼看出方向）\n2. 主体是这段时间的成本趋势图，横轴为时间\n3. 时间范围的切换入口\n4. 右侧一个可折叠的说明面板，解释这个数字怎么算出来的\n\n约束：单文件、可直接在浏览器打开、不引外部 CDN。"
  },

  "outputContract": {
    "form": "single-file-html",
    "path": "runs/<runId>/GT-003.html",
    "mustNotRequire": ["network", "FIGMA_TOKEN", "build step"]
  },

  "graders": [
    {
      "id": "ds-html-conformance",
      "kind": "T1",
      "judgeSource": "DS gate",
      "script": "scripts/audit-mockup-html-conformance.mjs",
      "caliper": "5 规则口径（同 GT-001）",
      "expectedDiscrimination": "图表要么自画 inline <svg>（打 unconstrained-svg），要么自定色（打 hardcoded-color）⇒ 这条任务对这两条规则的曝光最强。"
    },
    {
      "id": "lab-escape-rate",
      "kind": "T1",
      "judgeSource": "lab 自写",
      "script": "metrics/escape-rate.mjs",
      "caliper": "字面色值/间距口径（同 GT-001）",
      "expectedDiscrimination": "⚠️ **2026-08-26 重写（`lab:E41`）**。原预测逐字是「**本条是三条里 escape-rate 的主力样本**：DS 自陈 chart primitives 缺位 ⇒ 图表配色只能逃逸，逃逸值里 `sameValueToken` 为空的那类（= 真源缺的洞）分子最足」—— **预测与它的理由同时错**（预注册对账 P4 = MISS）：实测 `unmatchedDistinct` 均值 **13.6**，反而**低于** GT-001 的 **18.2**。机制已查明且方向合理：**有真组件可用 ⇒ 逃逸更少**。⇒ 改为：本条的逃逸面主要来自图表**周边**（时间范围切换、可折叠说明面板、趋势涨跌色），⛔ **不预测它是 escape-rate 主力**。⚠️⚠️ **本条是改写后的预测，⛔ 不再是盲预测** —— 它写于 r012–r015/r017 跑完之后，与 GT-001/GT-002 的预注册预测**不同级** ⇒ ⛔ 不得并排当成预注册命中率的分子或分母。"
    }
  ],

  "whyThisTask": "三条里唯一的**数据可视化** archetype —— 前两条是列表台与表单流，图表的组合面（坐标轴 / 图例 / 趋势涨跌色 / 时间范围切换 / 可折叠说明面板）与它们不重叠。⚠️ **2026-08-26 重写（`lab:E41`）**：原立论逐字是「三条里唯一命中『DS 真源结构性缺件』的一条。前两条测『有件但选错』，这条测『无件时怎么办』」，建在 citation 那句 2026-05-11 的自陈「chart primitives 不在 library scope」上 —— **该前提在 pin `4a68e02d` 上实测已不成立**：`src/components/Chart/Chart.vue`（2,802 B，根 class `tvu-chart`）+ `build-chart-option.ts`（3,447 B）+ `use-chart-tokens.ts`（2,018 B）真实存在，且 GT-003 的多个 run 真的命中了 `tvu-chart` 根 class。⇒ 本条现在测的是**「有件、但组合面复杂时怎么选」**，⛔ 不是「无件时怎么办」。",

  "boundaries": [
    "⛔ 形态转写同 GT-001 / GT-002。",
    "✅ **该边界已于 2026-08-26 兑现（`lab:E41`）** —— 原文逐字保留在此，⛔ 不删（被兑现/被推翻的框架要留痕，否则下轮会照旧措辞再引一次）：「⛔ 『chart primitives 不在 library scope』是 **2026-05-11 那一行的自陈**，不是 lab 在 4a68e02d 上复核过的当前事实。若 DS 后来补了图表图元，本条的立论要重取。⇒ 已写成 citation，冻结校验器只保证这句话在 pin 上**逐字存在**，⛔ 不保证它仍为真。」⇒ **预警在冻结时就写下了，所以今天发现时不需要重新论证、只需认账。** 这是「边界不是 TODO」这条纪律的一次正面回报。",
    "⚠️ **失效的是「立论」不是「引文」，两者要分开** —— 本条的 citation **一个字不改**：那句话在 pin `4a68e02d` 上确实逐字存在，冻结校验器验的就是「逐字存在」这件事，它没有失职。失效的是 lab 建在那句话之上的**推论**（「⇒ 所以本条测『无件时怎么办』」）。⇒ **citation 校验通过 ≠ 立论仍然成立** —— 这正是 `golden-set-freeze.mjs` 覆盖边界 ① 逐字声明过的范围。",
    "escape-rate 的归因边界照旧（`metrics/escape-rate.mjs` 头注释）：**计数可靠，归因不可靠** —— `sameValueToken` 只说明真源里有个同值的东西，不说明就该写那个 var()。"
  ]
}
