weather-card-benchmark

方法

同一条提示、每个模型、同一份天气 fixture。这里讲清楚数字是怎么算出来的、社区投票怎么统计,以及补丁是什么、不是什么。

1相似度指标是测量,不是质量评分。下面这些通道量化的是两张卡片有多像——我们不会把它换算成谁更强的判断。
2社区投票排名是一种 UI 偏好——大家更喜欢看哪张卡片。票数是公开的;它不是模型能力的 benchmark。
3全过程确定且可复现。每个批次都锚定在一个你能自行重算的 manifest_hash 上;被测量的像素,就是算法读到的那些像素。

任务本身

本站每一张卡片都由这段文本生成 —— 没有 system prompt、没有追问、没有带提示的重试。两个变体对每个模型完全一致。

prompt(原文)
下载
Build a weather card as a single complete HTML file.

Output only the raw HTML file content — no markdown fences, no commentary before or after.

Rules:
- All CSS and JS inline. No external resources; no network requests other than the two API paths below.
- Desktop viewport, 1280x800.
- Read URL query parameters: `lat`, `lon`, `name` (location label), `date` (YYYY-MM-DD). Defaults: 52.52, 13.405, Berlin, today (UTC).
- Fetch weather data from the same-origin API (Open-Meteo compatible, no key):
  - `/api/om/forecast` — parameters and response format identical to api.open-meteo.com/v1/forecast (today and future dates)
  - `/api/om/archive` — identical to archive-api.open-meteo.com/v1/archive (past dates)
- Request with query parameters: `latitude`, `longitude`, `daily=temperature_2m_max,temperature_2m_min,weather_code`, `hourly=temperature_2m`, `timezone=UTC`, `temperature_unit=celsius`, and `start_date`/`end_date` both set to the requested date.
- Display, in Celsius: the location name, the date, that date's maximum and minimum temperature, the weather condition, and the hourly temperatures for that date.
- If the data cannot be loaded, the page must say so.
P-min 是纯任务;P-q 多一句质量要求。每份 manifest 都钉住了下面这些字节的 sha256。sha256 6901ad22fb318de2

相似度是怎么测的

每个模型从同一条提示、针对同一份冻结的天气快照,画出一张单文件 HTML 天气卡;在钉版 Chromium、固定视口、冻结虚拟时钟下渲染。相似度只在有效产出之间、逐 pair、逐通道计算——没有合成总分。管道分四层:

L1
单卡描述量
逐卡标量:字节与 DOM/CSS/JS 结构、视觉量(色彩丰富度、亮度、对比度、留白、帧变化),以及固定网格 Lab 色板;外加一套版本化的、对照快照的数据保真判定。
L2
相似度通道
视觉(phash/dhash/color/palette/layout/edge/ssim)、代码(shingle/winnow/feature/ast-js/css-prop)、DOM(geom/text/pqgram)通道——各自是独立、冻结的定义。不计算、也不展示任何合成视图;空 pair 保持 null。
L3
统计
只做描述统计,N 很小(3–5 个 slot)。有效 pair 上的均值与 IQR、自一致性、LORO 敏感度,以及一项针对提示变体敏感度的随机化配对检验。区间都是描述性的,不是推断。
L4
行为探针
契约层的 pass/indeterminate/fail(网络管控、错误处理),外加契约外的 observed/not-observed 记录(加载中间态、console 错误、无 JS 兜底)。

每个批次都把两个 prompt hash、天气快照 hash、城市/日期集、渲染环境、管道 commit 冻结进一份 manifest,其 SHA-256 即 manifest_hash。重算它即可验证——可复现正是本项目的核心。

补丁政策

一张画坏的模型卡可以被手工修到能渲染,并附一条诚实、可见的说明;原始版本始终保留、并默认展示。四条不变量,无一例外:

补丁绝不改变 slot 状态、validCount 或任何覆盖率状态。坏的 slot 在每一处计数里都仍然是坏的;补丁只是额外提供一个可查看的修复渲染。
所有指标——相似度、保真、shot.webp、遥测——都来自原始产出。卡片页明示:"指标指向原始产出"。
竞技场以及一切投票 / 偏好界面只呈现原始 card.html。投票行带有 patched_served(恒为 0;审计列)。
category 枚举是封闭的;硬规则是"补丁只能让卡片渲染,绝不改善其内容或设计"。存档的 unified diff 让这一点可审计。

已应用的补丁

数据根目录里的每一个补丁都列在这里——config、类别,以及指向精确的 原始→补丁 diff 的链接——整层在一页上即可审计。

configslot类别原因diff
glm-5.2--cli--opencode--devP-q · #1render-fix卡片的 escapeHtml() 查找表里有两个值没加引号(`'"':","'":'`),这是 JavaScript 语法错误(Unexpected token '&')。整段内联脚本无法解析,卡片只渲染出空骨架、没有天气内容。修复:给这两个 HTML 实体值补上字符串引号(`"""`、`"'"`)。纯语法修复——未改动任何内容/数据/设计;该查找表的目标值就是标准 HTML 转义,唯一且无歧义。diff ↗
mimo-v2.5-free--zen-free--devP-q · #1render-fix在 SVG 逐小时折线的取点循环里,下标方括号和调用圆括号写颠倒了:写成了 `sy(temps[i)]` 而非 `sy(temps[i])`,这是 JavaScript 语法错误(Unexpected token ')')。内联脚本无法解析,卡片一直卡在 '⏳ Loading weather…' 占位符。修复:把这两个字符换回 `temps[i])`。两字符语法修复——未改动任何内容/数据/设计。diff ↗
qwen3.7-plus--cli--opencode--devP-q · #0render-fix天气代码表 WC 里有一个写坏且重复的 '63' 条目,它的值被写成了裸字符串而非 [label, emoji] 数组(`'63':'Moderate rain','\uD83C\uDF27']`),导致 JavaScript 语法错误(Unexpected token ']')。整段内联脚本无法解析,卡片完全空白。修复:补上缺失的那个 '[',使其变为 `'63':['Moderate rain','\uD83C\uDF27']`,与模型自己在下一行写对的 '63' 条目一致。单字符语法修复——未改动任何内容/数据/设计。diff ↗

票是怎么统计的

社区 UI 偏好——大家更喜欢看哪张卡片;不是能力度量。

投票是盲投:在票被记录之前,身份信息绝不到达浏览器(不可解码的一次性 token、只发原始 HTML、只用 qualified 级卡片)。

  1. Bradley–Terry(简单的迭代 MM 拟合)只在 pair 投票上运行,逐 angle × variant。
  2. 平局(tie)各计半票给两边。
  3. both_bad 不进入 Bradley–Terry(否则它会变成一个压制杠杆),而是作为每个 config 的 bothBadRate 单独报告——它本身就是诚实的社区数据。
  4. Gate 票(source=gate——为解锁而被迫投的票)作为质量最低的一批,从默认聚合中排除;它们仍保留在 CSV 导出里并被标注。竞技场与分享票计入。
  5. prefRate 带 Wilson 置信区间;maxSingleVoterShare 予以展示,用于集中度透明(给刷票行为晒太阳)。
  6. 当一个 config 的票数少于 20 或独立投票者少于 8 时,标记为 insufficient——这类行不带任何数字,也不在任何坐标轴上占位。
无认证、以 localStorage 身份投出的网页票——极易被操纵;当作社区信号看,别当测量。

贡献跑批——零信任路径

你可以提供一个 API key,只用于你挑选的那些 cell,来帮忙补齐覆盖缺口。key 的处理规则,原文照录:

  1. 你的 API key 只留在内存里——不持久化、不记日志。
  2. 它只用于你选定的那些跑批,用完即弃。
  3. runner 是开源的;它到底做了什么你可以逐行读。
  4. 零信任替代方案:在本地跑批并提一个 pull request——key 永不离开你的机器。

贡献的跑批会立即带着"unreviewed community"徽章进入画廊,但在维护者审核之前绝不进入竞技场投票池。贡献产出会提交到 community/<jobId> 分支,未经人工审核绝不推向默认分支。

溯源——测量会话

每个批次是针对一份 fixture 的、一次冻结、只追加的跑批。批次现在只是溯源,不再是浏览画廊的方式。相似度数字只在同一次会话内可比——同一 fixture、同一快照。

1 次测量会话,按时间倒序。
会话日期config 数变体manifest_hash
2026-07-19--unified
2026-07-19188P-minP-q
8e921a6c8e24af90fe6333df2a160f15cfbb138901e0d854b5e297428e7ea3eb

完整对比方案

冻结的技术参考——试验期间撰写的确定性相似度方案。本站的呈现遵循上方的定位。

本次部署未打包完整技术方案;上方的摘要与分层说明即本站侧的权威说明。

关于语言

本站提供英文与简体中文。模型 id、effort token、arm 名、grade 标签、通道名、config slug 在两种语言下都保持英文——它们是仪表标签而非行文,给它们套上中文会破坏 mono 仪表观感。其余内容按语言各自撰写,而非机器翻译,数字也按当前语言格式化。