# CoSER（GCA 情境演绎）复现核查矩阵（协议 1.1）

- 核查日期：2026-11-01（UTC）。上一版（协议 1.0，2026-10-28）的结论已按本次三次交叉验证逐条复查，处理结果见“交叉验证发现的处理”。
- **状态：榜单已于 2026-11-01 下架（用户决定），原因见“V09 实测结果”与报告 7.4 节。** 平台协议停在 `coser-gca-1.1 · 2026-11-01`（提交 `0c43444`，12:02:56 UTC 部署）。适配器保留但不再列出（`retired: true`、`runnable: false`），实验室不能再发起 CoSER 评测，两场评测记录留在数据库。`/b/coser` 301 到报告，排行榜接口返回 404。
- 实现：协议模块 `worker/src/benchmarks/coser/gca/`（纯函数），适配器 `worker/src/benchmarks/coser/index.ts`，引擎任务类型 `gca`（`engine/runner.ts` 的 gcaStep / gcaCall / gcaJudge），汇总 `engine/results.ts`、`scoring.ts`。
- 核查脚本（实测结果见“验证项”，运行记录在审计包 `web/public/audit/coser/2026-11-01/`）：
  - `tools/experiments/coser_spec_check.py`：平台模块对官方代码逐值比较；
  - `tools/experiments/coser_prompt_check.py`：论文提示词表（LaTeX）对平台字符串逐词比较；
  - `tools/experiments/coser_table_checks.py`：论文自身数字与发布物；
  - `tools/experiments/coser_rouge_check.py`：ROUGE-L 能否复算；
  - `tools/experiments/coser_e2e_mock.py`、`coser_e2e_check.py`：本地 Worker 上用模拟模型跑真实引擎，核对请求序列、温度、记录、裁判提示词、分数。
- 核查方式：三次相互独立的交叉验证（子代理，互不知道彼此和汇总者的结论）。第一次从论文出发，第二次从官方代码出发，第三次复算报告里的数字。报告全文在审计包 `reviews/`。
- 依据：
  - 论文：arXiv:2502.09082。e-print SHA-256：v1 `60a939e7…5e13`（2025-02-13 08:55 UTC），v2 `ab8926b1…5b`（2025-05-28 07:23 UTC），v3 `c6b39dff…c0f6`（2026-01-04 10:46 UTC）。主表 `Tables/main_exp.tex` 三版逐字节相同（`99c3cfda…0598`）。v1→v2 的正文初始分公式由 `100−Σv` 改为 `100−5Σv`，附录三版都仍是 `100−Σv`。本表行号指 v3。
  - 官方实现：github.com/Neph0s/CoSER。
    - `93c1474`（2025-02-14 06:50 UTC，“first update”）：`gca_evaluation/eval_reproduce.py`，实验名 `…-env_model=gpt-4o-nsp=llama3-1210-8epc`，含论文全部被测模型的内部 ID。这是**最可能**产出论文数字的脚本：主表 19 行等于它按 id/ood 两半平均的结果，GPT-4o、GPT-3.5 两行不等（见 N06）；脚本本身不输出论文表格。
    - `0e11992`（2025-02-18，“typo fixes”）：维度分加上限 100。
    - `297ffff`–`d7cee90`（2025-02-24、25）：重构为 `main.py`，NSP 模型成参数，默认 gpt-4o-mini，提示词、解析、历史、说话人前缀仍是论文时期的；动机改读 `motivation`（测试集没有这个字段）。
    - `958f962`、`d8489fa`、`4d6ed0f`（2025-12-25，“add support for thinking models (especially for nsp)”）：NSP 增加 Output Format、`extract_nsp`，记录不再带说话人前缀，无效时重发系统提示词。
    - `624efc5`（2026-04-02，当前 HEAD）：固定 commit。
  - 发布物：测试集 `data/test/test_set.json`（SHA-256 `eb175779…fb374a`，200 条 = `test_data/` 的 id 100 条 + ood 100 条按序拼接，差异只有新增的 `tag`、`i_p`）；示例结果 `exp/simulation/*.json`、`exp/evaluation/test_set_gpt-4o.json`：**只有 3 条样本，来自 `example_test_set.json`，不在 200 条测试集内**，能验证公式，不能验证论文的任何表格数字。

## 依据优先级与“固定 commit”的确定

1. **论文原文**：文字与论文自己的数字矛盾时，取能复现这些数字的读法。
2. **官方实现**：以 `624efc5` 为固定 commit；但凡 `624efc5` 与论文时期代码不同、且论文文字、提示词表、案例表或发布的示例结果支持论文时期行为的，按第 1 条取论文时期行为。没有论文佐证的差异按 `624efc5`。
3. **官方发布物**。
4. **平台选择**：须写明理由。

## 协议 1.1 与官方代码的关系

协议 1.0 把两代官方代码按条款拼接：说话人前缀来自 93c1474，NSP 路径来自 2025-12 的提交，而这两者是在同一提交 `958f962` 里互换的，这个组合在官方任何 commit 上都不存在（第一、二次验证独立指出）。协议 1.1 改为：

**与官方 `d7cee90`（2025-02-25，默认 NSP 为 gpt-4o-mini）的 NSP、前缀、记录规则相同，提示词表与论文逐词相同**，另有下列差异，都已逐条登记：动机读 `thought`（C07）、不设上限（C24）、固定随机流（C11）、失败路径（C18）、`remove_inner_thoughts` 与 think 标签（C21）。

用户此前决定（记录于协议 1.0）“用官方代码的默认值，不部署 CoSER-70B”指的是 NSP **模型**（`docs/CharacterEval与CoSER-实验室接入方案.md` 第 13 行）。本次改动保持模型不变。矩阵旧版把 Output Format 提示词写成与模型配套的“B 方案”，理由是“作者为通用模型设计”，查证后不成立：提交信息写的是思考型模型，官方默认值配论文提示词运行了十个月。若用户当时的决定包含提示词，这条要改回。

## 核查矩阵

### 数据与模型

| ID | 设定 | 论文原文依据 | 官方实现 | 平台实现（1.1） | 结论 | 验证 |
|---|---|---|---|---|---|---|
| C01 | 测试集 | 5_Experiments:6-7：200 条，取自每本书最后 10%，100 条来自训练用书、100 条不是；Appendix:181-185：按角色权重加权抽样 | `data/test/test_set.json` | 冻结该文件及 SHA-256；样本 ID = `book-i_p-i_c`；`tag` 存入样本；每次评测结果 `gca.splits` 给出 id / ood 分项 | 一致。**抽样过程无法核验**：`held_out_plots.json` 只含 15 本书，与测试集重合 1 本（4 条），其余查不到 | V01、V11 |
| C02 | 语言 | 未说明 | 全英文 | 只有英文；平台上榜条件中的“中英文齐全”对本评测即“英文” | 平台选择 | — |
| C03 | 环境模型 | 5_Experiments:8：GPT-4o | 93c1474 写死 gpt-4o；624efc5 默认 gpt-4o | `openai/gpt-4o-2024-08-06`，固定 OpenAI | 一致；版本取论文脚注与 README:183。2026-11-01 查 OpenRouter 公开接口仍可用，OpenAI 与 Azure 两家在线 | V13 |
| C04 | 裁判模型 | 4_Methodology:74 脚注、5_Experiments:8 | 默认 gpt-4o；README:183：复现须用 gpt-4o-24-08-06 | `openai/gpt-4o-2024-08-06`，固定 OpenAI | 一致。该快照下线属不可抗力：届时换裁判并升级协议，下线前做新旧裁判桥接（另行报批） | V13 |
| C05 | NSP 模型 | 5_Experiments:8：CoSER 70B | 93c1474：`llama3-1210-8epc`（代码未写明等于 70B，由论文文字与上下文推断）；624efc5 默认 `gpt-4o-mini`，README:194 称这是出于成本，推荐 CoSER-70B 或自部署 | `openai/gpt-4o-mini-2024-07-18`，固定 OpenAI | **偏离论文，影响分数，幅度未测**。用户决定（协议 1.0 建立时；1.0 的版本标签是 2026-10-28，提交于 2026-10-27 19:53 UTC）。理由：官方代码默认值，无须部署 141 GB 模型。CoSER-70B 权重公开（HF `Neph0s/CoSER-Llama-3.1-70B`，页面无法确认即论文所用），不属于“无法获得” | V09 |

### 演绎（模拟）

| ID | 设定 | 论文原文依据 | 官方实现 | 平台实现（1.1） | 结论 | 验证 |
|---|---|---|---|---|---|---|
| C06 | 角色资料 | 4_Methodology:55-56 | main.py:182-194：情节 `key_characters` 的 `description` + `\n\n` + `character_profiles`，去首尾空白，空则不收 | 同代码 | 论文未说明细节，按代码 | V02 |
| C07 | 角色动机 | 4_Methodology:56；提示词表；消融表 main_exp_cot（GPT-4o 59.95→56.34） | 93c1474 读 `thought`；297ffff 起读 `motivation`，测试集 456 条只有 `thought` → 动机全空 | 读 `thought`，479 个发言角色中 451 个有动机 | **冲突，624efc5 有缺陷**：按论文 | V02 |
| C08 | 角色系统提示词 | prompts_agent：Fixed Template for Inference | utils.py:222-254；分隔符 5 选 1；非 CoSER 模型带输出示例 | 逐字节取代码字符串；输出示例按家族表 | 一致（论文表逐词相同） | V02、P-PROMPTS |
| C09 | 60 词限制与对话开场 | 论文未写 | agent.py:335-336 追加 `Speak concisely as humans… Limit your response to 60 words.`；首条 user `===Conversation Start===`；相邻同角色消息 `\n\n` 合并（两个时期相同） | 同代码 | 论文未说明，按代码。论文表因此不是模型实际收到的全部文字，报告附录列出 | V02 |
| C10 | 环境提示词 | prompts_agent_2（身份短语印为 an environment simulator） | utils.py:361-389；身份短语 4 选 1；主要角色名单为 Python 列表 repr | 同代码 | 一致 | V02、P-PROMPTS |
| C11 | 随机选择 | 未说明 | 全局 `random.seed(42)`，跨样本共享；回退候选来自 `set`，顺序依赖每进程的哈希种子 → 官方运行不可逐字复现 | 按 (协议版本, 样本, 用途) 派生确定性种子：分隔符、身份短语与被测模型、运行序号无关；回退在有序候选中抽取 | 平台选择（官方行为不可复现），登记偏离。三次运行同一轮的回退抽到同一人，93c1474 每次重设种子，接近论文时期 | V03 |
| C12 | NSP 提示词 | prompts_agent_2:42-46，**没有 Output Format** | 93c1474 至 958f962 之前同论文；958f962 起多出 Output Format | **论文版**（strings.gen.ts `PAPER_ERA_NSP_PROMPT`） | 按论文。1.0 用 624efc5 版，改回（见上节） | V04、P-PROMPTS |
| C13 | NSP 解析 | 未说明 | 93c1474、d7cee90：含 `:` 时取第一个冒号前并 strip，否则整串 | 同 93c1474 | 论文未说明，按论文时期代码。624efc5 的 `extract_nsp` 不再使用（其正则把 `**Next Speaker:** Alice` 解析成 `:`） | V04 |
| C14 | NSP 自身历史 | 未说明 | 93c1474：只追加解析出的名字 | 同 93c1474 | 同 C13 | V05 |
| C15 | 发言规则 | 4_Methodology:61：NSP 发出结束信号或 20 轮 | 首位 `speaking_characters_w_env[0]`（缺 Environment 时补到末尾）；`<END CHAT>` 仅在第 6 条之后生效；同一人不能连续；无效时从“主要角色 + Environment − 当前发言者”随机选；最多 20 条发言 | 同代码（第 20 条后仍调用一次 NSP，结果不用） | 一致；细节按代码 | V04、V05 |
| C16 | 他人可见内容与说话人名 | 4_Methodology:59；案例表 `Environment: …` | 93c1474：先 `add_speaker_name`，记录、自己的历史、他人收到的（去 `[…]`）都带“名字: ”；958f962 起记录不带名字 | 同 93c1474 | **冲突**：按论文时期（发布示例 38/38 条带前缀；裁判提示词要求知道谁在说话） | V05 |
| C17 | 采样参数 | 未说明 | 首次 temperature 0，重试 1；角色、环境、NSP max_tokens 512；超时 180 s | 同代码。`targetParams.extra` 中的 temperature、top_p、max_tokens 等协议参数在创建评测时剔除（1.0 可被覆盖且不影响上榜）；reasoning 可用并在模型名上标注 | 论文未说明，按代码。**512 上限对思考型模型不利**：思考 token 占用上限时回复为空或截断。官方同样 512，不算偏离；每次评测公开空回复数和截断数（`gca.lines`） | V06、V14 |
| C17a | 客户端层处理 | 未说明 | 官方无。`remove_inner_thoughts` 匹配不到 `<think>` | `llm/client.ts` 剥去回复开头的 `<think>…</think>`，并去首尾空白 | 平台选择，登记偏离。理由：思考内容不属于回复，同一模型经不同服务商时思考可能在独立字段或在正文。只影响内联思考的模型，方向是分数偏高 | — |
| C18 | 失败与重试 | 未说明 | `""`：temperature 1 重试，共 6 次（93c1474 为 11 次）后记空串，照样计入轮数；`None` 或 API 错误：不计数无限重试，不产生分数 | 空回复：共 6 次，温度 0,1,1,1,1,1，费用入账，最后记空串（同 624efc5）。API 错误：有限次指数退避，超限则会话失败并可重跑，不计分。内容拦截：**平台选择**，计入 6 次后记空串并标 `refused`（环境、NSP、被测模型路径；裁判被拦 6 次则会话失败）；401、402 与不含拦截标记的 403 不算拦截。1.0 的 30 次请求（0×5, 1×25）与费用漏记已修正 | 空回复按代码；无限重试不可行，拦截处理为平台选择（理由：模型拒答应算在模型头上，但不能让评测卡死）。空行计入 R，每条四维各 +1.5，同官方，拒答数每次公开 | V06 |
| C19 | 模型名相关行为 | 未说明 | 按模型名前缀判断：claude / o1 → 系统提示词作 user；llama / step → 追加 `Start your response with` 并截取本角色发言；非 gpt / claude → `fix_repeation` | 按协议写死的家族表（`gca/family.ts`，取模型 ID 最后一段匹配）：Claude、o1 → user；只有 LLaMA-3.1-Instruct 8B/70B 与 Step 系列适用名字前缀（论文时期范围）；o3/o4 按“其他”；GPT、Claude 以外适用 `fix_repeation` | 按代码语义。`fix_repeation` 只对部分厂商生效，而细则惩罚重复，这种不对称来自官方，报告写明 | V07、C19 检查 |

### 裁判与计分

| ID | 设定 | 论文原文依据 | 官方实现 | 平台实现（1.1） | 结论 | 验证 |
|---|---|---|---|---|---|---|
| C20 | 裁判提示词与细则 | prompts_eval、prompts_eval_2 | prompts.py；按固定顺序替换，所以 Character Fidelity 细则中的 `{major_characters}` 以字面文字发给裁判 | 逐字节取代码字符串，同顺序替换，保留字面 `{major_characters}` | 一致（论文表读起来应被替换，但两代代码都未替换，取能复现数字的读法；报告写明） | V08、P-PROMPTS |
| C21 | 裁判输入 | 5_Experiments:9；4_Methodology:91 | 去 NSP 记录；非 Environment 发言 `remove_inner_thoughts`；`\n\n` 拼接；[system: 提示词, user: 模拟文本]；四维各一次 | 同代码；`remove_inner_thoughts` 取 624efc5 版（多 3 条 `<system_think>` 类规则，3,905 条测试输入中 3 条不同） | 一致；标签规则无论文依据，按 624efc5 | V08 |
| C22 | JSON 读取 | 未说明 | `extract_json`；`parse_response`；失败 temperature 1 重试，共 6 次；最终失败官方崩溃 | 同代码；空回复也进入修复调用（同官方）；最终失败：该会话失败并可重跑，不记 0 分 | 按代码；崩溃的处理为平台选择 | V08 |
| C23 | 严重度 | 4_Methodology:75：1–5；细则写重复问题可到 10 | 只累加 Python `int`：`3.0`、`"3"` 不计，`true` 计 1；不限范围 | 同代码 | 论文内部不一致，按代码 | V08 |
| C24 | 维度分 | 4_Methodology:76,103：`100 − 5Σv + λ\|M̄\|`，λ=1.5，**没有上下限**；附录写 `100 − Σv`（笔误） | 93c1474：`max(0, 100 − (S − 0.3R)·5)`；0e11992 起加 `min(…,100)` | `max(0, 100 − (S − 0.3R)·5)`，R = 非 Environment 发言条数（含空发言）。同时保存 `upperClipped`，可按 0e11992 之后的读法复算 | 按论文（主表三版逐字节相同，不是在上限下产生的）。×5、λ、R 的含义由发布示例 12/12 与论文案例表证实；上限两种读法发布物无法区分（12 个分数都未越界）。1.0 取 624efc5，改回。单个会话的维度分可能超过 100 | V10 |
| C25 | 总分 | 5_Experiments:13：四维平均 | 四维样本均值再等权平均 | 同代码 | 一致（主表 21 行差都 ≤ 0.005） | T01–T03、AVG |
| C26 | 三次运行 | 5_Experiments:34 | 93c1474 每次重设种子；624efc5 第 2、3 次复用第 1 次结果 | 每场景 3 个会话，各自演绎并评判；首次请求 temperature 0、提示词随机选择相同，三次之间的差异主要来自服务端与裁判，不是统计意义上的独立重复；会话分不取整 | 按论文时期；624efc5 有缺陷 | E2E |
| C27 | ± 与置信区间 | 全文未定义 | 无代码 | 每次评测结果 `gca.runs` 给出 3 次运行各自的均值及其样本标准差（ddof=1），注明论文未定义 ±，二者不一定同义。排名页的 95% 区间按场景聚类做百分位自助法（`ciCluster: 'seed'`，200 个场景整体重抽，1.0 把 600 个会话当独立样本，区间偏窄） | 平台选择 | V11 |
| C28 | BLEU | 5_Experiments:14：仅作分析 | nltk `sentence_bleu`，`word_tokenize(text.lower())`，4-gram 等权、无平滑；版本未固定 | 移植 nltk 3.9.1（数学函数取正确舍入）；存 ×100 的值；不进总分 | 发布示例 3/3 逐位相等；构造的 1,000 条金标与“nltk + 正确舍入的 log/exp”全部相等（macOS 的 log/exp 不是正确舍入，个别输入与本机 CPython 可差 1 ulp，脚本每次输出实际条数） | V12 |
| C29 | ROUGE-L | 同上 | `rouge` 包 `Rouge().get_scores(...)['rouge-l']['f']`，不转小写；版本未固定 | 不显示 | **发布示例对不上**：PyPI 上 `rouge` 0.2 至 1.0.1 全部 10 个版本（含预发布），3 个发布值 0/3 相等（`coser_rouge_check.py`）；换大小写、分隔符、前缀、参数顺序也无组合对上。GitHub master 未测。不进总分。平台选择：不报一个无法对齐的数 | V12 |
| C30 | 单位与取整 | 主表 Performance (%)，两位小数 | 维度分 0–100；BLEU 为小数 | 内部全精度，显示两位；BLEU ×100 | 一致 | — |
| C31 | 上榜条件 | — | — | 完整 200 场景、≥3 次运行、当前协议版本、被测模型单一服务商、全部会话完成；**V09 判定前一律不进排名**（`protocol.anchorPending`）。非 OpenRouter 地址按单一服务商计；自定义范围满足同样条件也算完整；场景持续被拦导致会话失败时评测不完整、不上榜（官方在此处无限重试，也过不去） | 平台选择 | V06、E2E |

### 不复现的部分

- 人工评测、裁判与人工的一致率（表 human_eval、judge_alignment）：标注数据未发布（清单 D2 做不了）。
- 不同裁判表（exp_diff_judges）：其中 GPT-4o 一列 7/7 等于 id 子集分数，表题没有说明。
- continue-from k=3、胜率、消融、检索增强（main_exp_cf3、exp_wr、main_exp_cot、exp_rag）：不在主榜范围。
- 其他 RPLA 基准（InCharacter、LifeChoice、CroSS）：不属 GCA。

### 论文与发布物自身的不一致（`coser_table_checks.py`，事实记录）

| ID | 内容 | 对复现的影响 |
|---|---|---|
| N01 | 正文公式 v2 起有 ×5，附录三版都没有；v1 主表已是现在的数字 | 取 ×5（C24） |
| N02 | 细则写严重度可到 10，正文和模板写 1–5 | 按代码不夹紧（C23） |
| N03 | 公式 `\|M̄\|` 字面含环境发言，发布示例只数非环境发言 | 取能复现数字的读法（C24） |
| N04 | 回归斜率 −1.5909，λ 取 1.5，附录的 1,200 例未发布 | 无法复算 |
| N05 | 表 exp_diff_judges 的 GPT-4o 列是 id 子集，表题未说明 | 不用于锚定 |
| N06 | 主表 GPT-4o、GPT-3.5 两行不等于 exp_idood 两半的平均（GPT-4o Average 59.95 对 59.50，Storyline Quality 差 0.71；其余 19 行全部相符） | 锚定目标不唯一，V09 写明以主表为准并同时报告差距 |
| N07 | exp_idood 的 OOD 三列粗体、ID 两列下划线标错；文中“Average 高于 57”的名单漏了 GPT-4o Mini（57.93）；主表有 Mistral-7B，模型列表没有；ablation 文字称“所有模型”提升，CoSER-8B 去掉动机后反而升（56.45→56.81） | 不影响 |
| N08 | README 写分数 0–100，公式无上限 | 见 C24 |

## 验证项

| 编号 | 内容 | 判定 | 结果 |
|---|---|---|---|
| V01 | 测试集 SHA-256；200 = id 100 + ood 100；字段完整 | 全部相等 | 通过 |
| V02 | 200 条样本全部智能体的系统提示词与首条消息：Python 参考实现（逐字复制官方函数）与平台逐字节比较，7 个模型家族 | 0 处不同 | 通过 |
| V03 | 确定性种子：同一样本在不同被测模型下提示词相同；独立实现核对 | 全部相同 | 通过 |
| V04 | NSP 解析与决策：固定输入向量与 Python 逐值比较 | 全部相等 | 通过 |
| V05 | 记录与历史：脚本化回复下参考实现与平台的全部请求（messages、temperature、max_tokens）、记录、裁判提示词逐字节比较 | 0 处不同 | 通过 |
| V06 | 失败处理（真实引擎，本地 Worker + 模拟端点）：空回复、持续空回复、内容拦截、瞬时 500、网关 403、裁判无法读取；核对每个请求的次数与温度序列、最终记录、`refused` 标记 | 与 C18、C22 一致 | 通过（`results/e2e/out_faults.txt`、`out_gateway403.txt`） |
| V07 | `fix_repeation`、`remove_inner_thoughts`、`add_speaker_name` 等文本函数：官方函数生成向量逐值比较 | 全部相等 | 通过 |
| V08 | 裁判提示词 200 × 4；JSON 读取构造用例 | 全部相等 | 通过 |
| V09 | 锚定，判定标准见下节 | 实测前写定 | **未复现**（2026-11-01，见下节“实测结果”） |
| V10 | 计分：发布示例 12/12，构造用例覆盖下限与“上限不截”，保存的 `upperClipped` 等于 0e11992 之后的公式 | 全部相等 | 通过 |
| V11 | 汇总：运行级均值与 ddof=1 标准差、id/ood 分项，Python 与平台逐值比较；主表 Average 对四维 | 全部相等 | 通过 |
| V12 | BLEU：发布示例 3 个值逐位相等；ROUGE-L：10 个版本对上 0 个 | BLEU 3/3 | 通过 |
| V13 | 三个固定模型在 OpenRouter 公开接口可用、指定服务商在线（2026-11-01 查询） | 可用 | 通过；部署前应复查 |
| V14 | 协议参数不可被 `extra` 覆盖（真实引擎） | 发出的值等于协议值 | 通过（`out_extra.txt`） |
| P-PROMPTS | 论文 12 段提示词与平台字符串逐词比较（`coser_prompt_check.py`）；每处差异须登记含义 | 无未登记差异 | 通过 |
| E2E | 真实引擎全流程（本地 Worker + 模拟模型）：参考实现重放每个会话，请求序列（次数、温度、上限）、记录、裁判提示词、维度分、BLEU 全部相等；另跑 600 会话的完整配置核对上榜条件与闸门。引擎运行只覆盖 “other” 模型家族，其他家族只在协议模块层（V05）核对 | 全部相等 | 通过（`out_regular.txt`、`out_full.txt`） |

## V09 锚定：实验设计与判定标准（2026-11-01 写定，实测之前）

**做什么**：按协议 1.1 运行完整测试集（200 场景 × 3 次），被测模型 `openai/gpt-4o-2024-08-06`，固定 OpenAI。费用见下。这是一次报批的付费实验，未经用户批准不运行。

**比什么**：主表 GPT-4o 行（SC 61.59，AN 48.93，CF 48.95，SQ 80.33，Average 59.95）。论文另一张表给出的同一模型 id/ood 平均为 59.50（N06），一并报告，不作判定。

**判定**（Δ = 平台 − 主表）：

1. **复现**：|Δ Average| ≤ 1.0，且四个维度 |Δ| 都 ≤ 2.5。开放平台评测。
2. **同一量级**：|Δ Average| ≤ 3.0，且四个维度 |Δ| 都 ≤ 5。开放平台评测，报告写明差距，并写明平台分数不能与论文分数直接相减。
3. **未复现**：其他情况。不开放，先查原因（首先是 NSP），是否开放由用户决定。

**依据**：若把主表的 ± 当作三次运行的标准差（论文未定义，这是假设），两组三次运行均值之差的标准差约 √(2/3)·s：Average（s = 0.50）约 0.41，维度（s = 0.48–1.73）约 0.39–1.41。1.0 是 Average 这一值的 2.4 倍；2.5 是角色忠实度这一值的 1.8 倍，是其余三维的 4.6 倍以上。两者都大于论文自己两个 GPT-4o 数之差（Average 0.45，维度最大 0.71）。3.0 约为主表 21 个模型总跨度 14.42 的五分之一。

**同时报告**：BLEU（主表 5.90）；id/ood 分项；3 次运行的标准差；平均发言条数 R 与其分布；NSP 回退率与提前结束率；空回复、截断、拒答数；按 `upperClipped` 重算的四维分与 Average（量化 C24）。

**量化不了的**：NSP 偏离（C05）的单独影响。平台不部署 CoSER-70B，所以 V09 只能给出“全部偏离合起来”的差距。

**费用估算**：平台还没有 CoSER 历史成本，所以这是估算，不是历史每样本成本，应视为上沿（第三次验证按模拟运行实际提示词长度算出约 $71，那一端偏低，因为模拟回复短）。用平台估价函数（`api.ts`，每场景约 14 条发言、四分之一为环境、裁判 4×1.15 次）在本地按 OpenRouter 2026-11-01 公开价（gpt-4o $2.5/$10，gpt-4o-mini $0.15/$0.6）读数：被测 $46.55 + 环境与 NSP $15.67 + 裁判 $42.43，合计约 **$105**（600 个会话，不含失败重试）。估价函数的提示词规模略偏高（第二次验证比值 0.68–0.91）。首轮可先跑 `quick` 预设（20 场景 × 1 次，约 $3.5）核对实际每会话成本，再决定是否跑完整。

**可选的第二臂（需另行批准）**：`openai/gpt-4o-mini-2024-07-18` 作被测模型（主表 57.93），约 $61，用于检查两个模型的先后是否与主表相同（差 2.02）。不影响开放判定。

**实测结果（2026-11-01，用户批准后运行）：未复现。** 评测 `007c947738f44da5`，12:19 UTC 启动，协议 1.1，600/600 会话完成，费用 $60.01（快速抽样 `5c2e681e1298463e` 另花 $2.05）。24 个会话在第一步遇到 OpenAI 经 OpenRouter 的临时错误（HTTP 503，错误码 1019），未生成内容，按协议重试后完成。没有空回复、截断或拦截。结果 `tools/experiments/coser_anchor.result.json`，逐会话数字 `coser_anchor.rows.json`，脚本 `coser_anchor.py`。

| | 故事一致性 | 拟人化 | 角色忠实度 | 故事质量 | Average | BLEU |
|---|---|---|---|---|---|---|
| 平台 | 62.27 | 42.05 | 32.83 | 81.57 | 54.68 | 4.95 |
| 主表 GPT-4o | 61.59 | 48.93 | 48.95 | 80.33 | 59.95 | 5.90 |
| Δ | +0.68 | −6.88 | **−16.12** | +1.24 | **−5.27** | −0.95 |

- 3 次运行的标准差：Average 0.80，角色忠实度 2.01。95% 区间（按场景聚类）Average [53.52, 55.80]。上限 100 的影响可忽略（Average 54.67，只有 3 个维度分超过 100）。
- 下限 0：角色忠实度 161/600、拟人化 75/600 的会话被扣到 0。
- 差距集中在两个维度，来自部分会话里裁判逐句挑错：25% 的会话角色忠实度列 ≥10 条缺陷（官方发布的 3 个示例都是 4 条）。排除 ≥10 条的会话后，拟人化 48.08（接近主表），角色忠实度 43.64。这只是分解，不是可以排除的理由。
- 长度：R 平均 12.04，环境占发言 22%，NSP 回退 3.7%，61% 的会话发出结束信号。Average 在各长度段都在 53.5–56.4 之间，所以单靠 NSP 改变长度解释不了差距。
- 无上下限的回归：100−5S 对 R 的斜率 −2.34、截距 60.2（论文 −1.59、59.06）。
- 第三方参照：CogDual 用 GPT-4o 裁判（版本未写）复跑 GPT-4o，Average 54.76；DREAM 59.35（100 条样本）。

**V09a 裁判复判（2026-11-01，用户批准，$0.41）**：把作者发布的 3 个模拟对话（不是我们生成的）用官方提示词重新送给裁判，与作者存的批评比较。脚本 `coser_judge_recheck.py`，结果 `coser_judge_recheck.result.json`、`coser_judge_recheck_variants.result.json`。判定标准在第一次请求前写在脚本里，结果是 **harsher**：

| 维度 | 作者存的 S（3 场合计） | 现在的 S（2 次平均） | 比值 | 作者存的分 | 现在的分 |
|---|---|---|---|---|---|
| 故事一致性 | 29 | 26.5 | 0.91 | 66.17 | 70.33 |
| 拟人化 | 37 | 41.5 | 1.12 | 52.83 | 45.33 |
| 角色忠实度 | 38 | 70 | **1.84** | 51.17 | **14.00** |
| 故事质量 | 21 | 20.5 | 0.98 | 79.50 | 80.33 |

这里没有演绎，NSP 和被测模型都不起作用，差异只能来自裁判。形态与 V09 相同：角色忠实度差得最多，拟人化其次，另两维不变。作者发布的示例是 3 个不在测试集里的场景，样本很小，但复判结果在两次之间稳定。

角色忠实度的对照（每场 S，作者存的 12.67）：把 `{major_characters}` 填上名字 23.67；同一快照经 Azure 20.33；`gpt-4o` 别名 23.0；`gpt-4o-2024-11-20` 17.0（不再逐句挑错，但仍偏高）；`gpt-4o-2024-05-13` 在 OpenRouter 经 OpenAI 不可用（HTTP 404）。**没有一个变体能回到作者存的结果**，占位符也不是原因。

**结论**：V09 的差距主要来自裁判。同样的输入、同样的提示词、同一个快照名，现在的 GPT-4o 对角色忠实度明显更严。为什么变严查不到：作者存批评时用的实际模型和服务没有记录（`--judge_model gpt-4o`，README 要求 2024-08-06），OpenAI 的服务端变化也无从观察。这说明 NSP 和被测模型不是主因，但没有单独量化它们；NSP 偏离（C05）的影响仍未知。判定仍是“未复现”，不因此修改标准，也不为贴近论文改裁判或公式。按预定标准，是否开放由用户决定。

**下架依据（方法本身，2026-11-01）**。用户决定下架，并明确要求写分析，不写“判断”或费用。脚本 `coser_method_validity.py`，结果 `coser_method_validity.result.json`（只用锚定数据和论文表格，不调用模型）：

1. **分数是裁判列缺陷数量的函数，不是量表**：只扣不加；同一模型同一场景，56/200 个场景三次运行里角色忠实度缺陷既有 ≤5 条也有 ≥10 条；161/600 会话被截到 0（不截时平均 −48.3）；官方代码把原著的分数直接写成 100，从没评过。
2. **长度校正没有校正**：同一个 λ=1.5，扣除后每多一条发言，故事一致性 +1.18、故事质量 +0.73、拟人化 −1.54、角色忠实度 −3.72。这一项平均贡献 18.1 分（约三分之一），空发言也加分；长度主要由 NSP 决定。
3. **“对照原著”作用很小（作者自己的数字）**：去掉参考后一致率 GPT-4o 68.6→64.3，DeepSeek-R1 77.5→77.2；只算文本重合的 BLEU 有 75.3，高于 GPT-4o 裁判的整套流程。
4. **仪器的漂移和模型差距一样大**：平均分漂移 5.27 大于论文第一名与中位数之差 3.71，21 个模型有 15 个落在这个距离内；角色忠实度漂移 16.12 接近 21 个模型的全距 17.44。换裁判变化更大（GPT-3.5 52.8/35.9/40.5）。
5. **取平均救不了**：同一场景三次运行总分的极差中位数 13.8；600 个会话平均后区间约 ±1.1，但收窄的是围绕“列表长度、对话长度、裁判当前习惯”的误差。

**没有证明的**：排序没有实测；68.6% 高于随机，分数不是纯噪声；作者的数字可能就是当时裁判给的。

**V09b 原著自评（2026-11-01，用户批准，$0.74）**：把 24 个场景的原著对话当作模拟送给裁判，脚本 `coser_method_validity.py --original`，结果 `coser_original_as_simulation.result.json`。判定标准请求前写定（故事一致性 ≥ 90，四维都高于同场景 GPT-4o），结果**通过**：原著平均 97.94，GPT-4o 51.75（四维 115.85/68.56/104.19/103.15 对 61.77/35.03/28.08/82.12）。这与我们的预期相反，原“满分从未校准”的说法已改。局限：不是盲测，被评文本与裁判拿到的参考逐字相同，只会比对的裁判也会得到同样结果，所以它说明分数奖励“贴近一段模型没见过的对话”，不说明裁判能否识别好的写作。人写的对话在拟人化上每场仍有 4.2 条缺陷（S 9.75 对 GPT-4o 的约 16），3/24 个场景低于 GPT-4o。去掉参考的盲测没有做。

`anchorPending` 保留，防止适配器被重新启用时直接进榜。

## 交叉验证发现的处理

出处：P1 = 第一次（论文出发），P2 = 第二次（官方代码出发），P3 = 第三次（数字）。

| 发现 | 来源 | 处理 |
|---|---|---|
| NSP 模型偏离论文 | P1-1、P2-F1 | 保留用户决定，登记 C05，报告列为首要偏离 |
| NSP 提示词、解析、历史用 2025-12 版本，与前缀拼成官方不存在的组合；“不得混用”理由不成立 | P1-2、P2-F1、D1、D2 | **改协议**：C12–C14 回到论文时期，升 1.1 |
| `extract_nsp` 缺陷 | P2-F2 | 随上一条不再使用 |
| 单维分上限 | P1-3、P2-F6 | **改协议**：C24，升 1.1，保存 `upperClipped` |
| 空回复 30 次请求、温度序列错、费用漏记 | P2-F3 | **改代码**：`allowEmpty`（C18），V06 真实引擎核对 |
| 内容拦截记空台词计分；`blocked the request` 不限状态码 | P2-F4 | C18 改写为平台选择；gca 路径排除 401/402/无拦截标记的 403；`refused` 计数公开 |
| `extra` 覆盖协议参数 | P2-F7 | **改代码**：创建评测时剔除（C17），V14 |
| 客户端剥 `<think>`、trim 未登记 | P2-F5 | 登记 C17a，报告写明 |
| 代码没有 V09 闸门 | P1-N、P2-F19 | **改代码**：`anchorPending` |
| C17 截断数、C27 ±、C01 id/ood 只写在矩阵里 | P1-7、P2-F20 | **改代码**：评测结果增加 `gca` 字段 |
| 置信区间把 600 个会话当独立样本 | P1-41、P2-F11 | **改代码**：按场景聚类（`ciCluster`） |
| 单场景持续失败时不上榜 | P2-F8 | 不改，官方同样过不去；登记 C31，报告列入局限 |
| JSON 修复调用为空时的分支不同 | P2-F13 | 随 `allowEmpty` 与官方一致 |
| 家族表没命中的 ID 落到 other | P2-F15 | **改代码**：按模型 ID 最后一段匹配 |
| 自定义范围也算完整、非 OpenRouter 算单一服务商 | P2-F12、F17 | 不改（共享规则），登记 C31 |
| RNG 用代码常量不用快照版本 | P2-F16 | 不改，旧版本评测已不上榜；报告不提 |
| ROUGE-L“任何版本”无可复核证据 | P1-8、F | 新增 `coser_rouge_check.py`，C29 改写为实测范围 |
| 锚定目标不唯一 | P1-5 | N06，V09 写明 |
| 公开文字比矩阵弱（“按作者流程”） | P1-6、P2-D10、D11 | 报告、榜单文案、protocolNotes 全部重写 |
| “独立演绎”“最后 10% 的书”“同日”“产出了论文数字”等措辞 | P1-G、J、K、M | 已改 |
| 端到端检查只比消息集合，不比次数温度 | P2-D4、D5 | `coser_e2e_check.py` 改为比较多重集合（消息、温度、上限） |
| 证据脚本未进版本库 | P2-D16 | 随本次改动一并入库，审计包保存运行记录 |
| 本地版注释过期 | P1-10、P2-F18 | 已改 |
| 512 上限、空行加分、`fix_repeation` 不对称 | P1-9 | 官方行为，不改；报告列入局限；空回复、截断、拒答数公开 |
| 报告 16 项数字与事实不符（SHA 前缀、天数、Table 3 行数、“2 倍多”、arXiv 许可、重试次数在两代代码的差异、与 d7cee90 的差异清单、日期用 UTC、命令依赖等） | P3 N01–N16 | 全部改正，矩阵同错处一并改；Table 3 补 C30 |
| 裁判重新评分路径没有在引擎上跑过 | P3 Q06 | mock 增加不可读裁判回复，V06 覆盖 |
| `refused` 标记只有 ALL PASS，没有计数 | P3 Q07 | 校验脚本输出计数 |
| 复核者是平台运营方的 AI 代理，不是外部同行 | P3 N08 | 报告 6.2、局限第 11 条写明 |
| 措辞 14 项（把差距全归因于裁判、ROUGE 范围、第三方引用不全、费用是上沿等） | P3 W01–W14 | 已改；W13（报告须与协议 1.1 一同上线）列入部署要求 |
| 测试集构造无法核验 | P1-10 | 报告如实写明 |

第三次验证核对 349 条：相符 318，不符 23（归并 16 项），查不到 8。全文在审计包 `reviews/`，它描述的是报告修改前的草稿。

## 尚待用户决定

无。若日后恢复榜单：须新协议版本和新锚定。
