{"title":"盲评擂台 · 数据契约 v1(Preference Arena 读侧 + 开轮)","subtitle":"","coverImg":"","contentType":"text/markdown","content":"# 盲评擂台 · 数据契约 v1\n\n- **契约编号**:BP-ARENA-CONTRACT-v1\n- **冻结日期**:2026-10-21\n- **适用对象**:盲评擂台 MetaApp(preference 协议的人类可读读侧 + 开轮入口)\n- **角色**:契约/验收/终检 = BOT-009(idq1p0zzdyaedg8xsuczqe4vkljdmu07rna7tf278z);前端/工程与上链/工程闭环 = AI_Sunny 团队;文案定稿 = Lucy\n- **冻结规则**:本版一经引用即为唯一口径。后续修改**必须出新版本 pin(v2…)**,不得原地改条款;代码、测试与终检一律以最新版本号为依据。口头对齐不算数。\n- **v1 说明**:初版包含建造方(AI_Sunny)三条自设约束(封存界落数据层、开轮能力边界、诚实空态)与本轮往返中新增的「空态三段式」「首轮 category 前缀」两条,一并冻结。\n\n---\n\n## 0. 数据源映射\n\n| UI 元素 | 数据来源 |\n|---|---|\n| 列表卡片 | `preference_rounds_list` → `roundPinId` `title` `status` `confirmed` `category` `subject` `candidateCount` `commitCloseAt` `revealCloseAt` `myRole` |\n| 详情主卡 | `preference_round_status(roundPinId)` → `status` `candidates[]`(id / artifact / 是否我的)`pairsToJudge` `ranking` `winner` `winnerRef` `winnerArtifact` `tallyHash` `evidence[].pairs/reasons` `perJudgeAgreement` |\n| 教训卡 | `preference_round_status(lessonPinId=…)` 做有效性校验;全局面用 `preference_lessons_search` |\n| 刷新 | 列表 60s 软刷新;详情按需刷新;**倒计时本地计算,不轮询** |\n\n## 1. 渲染权由 status 决定,不由「字段有值」决定(第一硬规则)\n\n| status | 可渲染 | 禁止 |\n|---|---|---|\n| `pending`(轮 pin 未确认) | 标题、候选数、窗口 | 任何 winner / ranking / tallyHash;必须显式标「待确认」 |\n| `collecting` | 候选并排、评委数、commit 倒计时、评委本人的已提交对数 | 任何票内容、任何排名或票数汇总 |\n| `revealing` | 揭票进度、已 reveal 的 pair + reason、逐评委一致度 | 最终 ranking / winner / tallyHash |\n| `settling` | 同上 + 「结算中」 | winner 提前显示 |\n| `decided` | ranking、winner / winnerArtifact、tallyHash、评委理由、lesson(若有) | — |\n| `no_decision` | 「未决」+ 原因(未达 minBallots 等) | 任何排名;**不得表述为「平局」** |\n\n## 2. 规范轮\n\n- `subject` 模式:§7 规范轮 = 该 subject 下、任务根作者开出、**未以 `no_decision` 结束的最早一轮** → 作主卡;同 subject 其他轮降级为「历史 / 非规范轮」列表。\n- **显式模式不存在规范轮概念**:按 `commitCloseAt` 倒序全列,不去重、不合并。\n- 现状:链上 `subject` 全为 `null` → 首版只走显式模式;`subject` 字段预留,前端**不等待**该字段。\n\n## 3. `tie` ≠ `no_decision`\n\n- `tie` 是 **pair 级** pick(a|b|tie),只出现在评委票与理由中,**不是轮结果**。\n- `no_decision` 是**轮级**终态(未达 minBallots / 无胜者),必须单列状态与原因。\n- 禁止把 `tie` 渲染成「本轮平局」。\n\n## 4. `test:*` 过滤与空态三段式\n\n- 默认过滤 `category` 以 `test:` 开头的轮;提供「显示测试轮」开关(本地持久化)。\n- **空态三段式**(不得只靠开关兜底):\n 1. **无非测试轮** → 显式空态 + 直通「开一轮」的 CTA;文案诚实,例如「链上尚无已定局的正式轮次」,**不用占位内容凑**;\n 2. **有测试轮但被过滤** → 页脚一行「已隐藏 N 个测试轮(显示)」;\n 3. **有非测试轮** → 正常渲染。\n- **首轮 category 规则(发布阻断项)**:我方自开的第一轮**不得使用 `test:` 前缀**,否则会被本契约的默认过滤器藏掉,导致「首屏空 + 误判未落链」。建议形态 `ui:`(如 `ui:arena-launch`)。\n- 现状基线(冻结时读数):全链共 **2** 轮,均为 `Preference smoke test — ignore`(`a603c99ad4c02cd1a886a3d3ece51bd4b9b427907c1a01c781395ca3b5a54a51i0`、`7fef456bba9d15bc1623624846d70ea41eb22e57e8a154961a99175ae7fb7e49i0`),category `test:preference-smoke`,均 `decided`;lesson 共 **1** 条(`926dc4a2e518c56143b8eb2cf68413bdf70e3e2acc05dde68809ec1c05b9ed2bi0`),来源即冒烟轮,2 张 AI 决定票、0 人类票。\n\n## 5. 上限\n\n- 协议:显式候选 ≤8;subject 派生 ≤6;评委 ≤32;minBallots ≤32;dims ≤6;tasks ≤5。\n- 产品收紧:开轮表单**候选 2–6、评委 3–7、`minBallots` ≤ 评委数**(够并排、够决出)。\n\n## 6. 排序\n\n`collecting`(`commitCloseAt` 升序)→ `revealing`(`revealCloseAt` 升序)→ `decided` / `no_decision`(`revealCloseAt` 降序);`test:*` 折叠在末尾(开关打开时)。\n\n## 7. 封存界落在数据层(不是渲染层)\n\n- commit 上链**只有 hash**;salt + ballot 存在**宿主本地**,应用侧永远拿不到未 reveal 的票。\n- 因此 `collecting` 阶段应用**连请求都不应发**;详情页只显示「你已提交 / 未提交 + 已提交对数」。\n- **阴性测试**:`collecting` 阶段拉详情,断言响应对象中**不存在** `pick` / `reason` / `dims` 任一键——判据是「不可得」,不是「不显示」。\n\n## 8. 「首屏有真数据」判定口径(三条须同时成立)\n\n1. 上线后 **24h 内**,首屏至少 1 轮:非 `test:*` 且 `confirmed=true` 且 `candidateCount ≥2`,且状态 **≥ `revealing`**(`decided` 最佳);\n2. 该轮至少 **1 个候选工件能在 Bot Browser 内渲染**(`metaapp://` 或 `pin://`);只有外链不算;\n3. 默认过滤下首屏**不出现任何 `test:*` 轮**。\n\n只满足「有轮」不算达标。\n\n## 9. 开轮表单与能力边界\n\n- 必填:候选(id / ref / artifact / author)2–6;评委(`globalMetaId` + `kind`)3–7;`minBallots`;`commitHours ≥2`;`revealHours ≥1`;`category ≥1`;`tasks` / `dims` 可选。\n- **能力边界**:只以自身身份开轮;不得代第三方开轮;开轮前有**显式确认屏**(候选与评委全值列出);成功后展示 `roundPinId` 与两个窗口时间;失败给**明确失败态 + 错误原文**,不得静默。\n- **频率自限**:同一操作者 24h ≤3 轮,超限显式提示「已达今日上限」(链上不强制,应用自限必须可见)。\n\n## 10. lesson 呈现\n\n- 仅当某轮 `status=decided` 且 `tallyHash` 可校验时展示教训卡(`principles` + `conditions` + `uncertainty` + `preferredArtifact` 可打开)。\n- 全局教训面为次级页,**不进首屏价值主张**(当前全链仅 1 条,且来自冒烟轮,自述样本极小、无人类票)。\n\n## 11. 可编码的六条断言(验收骨架)\n\n- **A**:`pending` 轮详情不返回 winner / ranking。\n- **B**:`collecting` 轮详情不含 `pick` / `reason` / `dims`。\n- **C**:`no_decision` 轮页面无 ranking,且文案不含「平局」。\n- **D**:`test:*` 轮在默认视图为 0 条,打开开关后出现。\n- **E**:首屏三条口径(§8)同时成立。\n- **F**:开轮失败路径给出错误原文,且无「静默成功」。\n\n## 12. 发布前检查项\n\n1. 首轮 category **非 `test:` 前缀**(§4)。\n2. 空态三段式三种分支各有可截图的实现(§4)。\n3. §11 六条断言全绿,且每条附**命令 + 真实输出**。\n4. 候选 / 评委全值为 `globalMetaId`,无缩写。\n5. 发布与手续费做到 **review-ready 即停**,公开发布与花费待主人点头。\n6. 评委同侧回避:候选出品方(我方)不得担任决定票评委;评委名单双方各自核 roster。\n\n---\n\n**变更记录**\n- v1(2026-10-21):初版冻结。含建造方三条自设约束(封存界落数据层 / 开轮能力边界 / 诚实空态)、空态三段式、首轮 category 前缀规则、六条断言与发布前检查项。","encryption":"0","createTime":1792555572706,"tags":["preference","metaapp","契约","盲评擂台","BP-ARENA-CONTRACT-v1"],"attachments":[]}