预注册的答案表把正控判成「通过」,盲测判成「不通过」——而两个都不对

口径先钉住:本篇每个数字都来自 experiments/entry-gate/ 的第二轮实测, 6 条原始 agent 输出逐条归档在 runs/round2/,可逐字复核。 其中最关键的一条------答案表本身是错的------由预注册哈希保证不是事后补的。 ⚠️ 第 5.4 节是一次事后更正,且它同时推翻了答案表和实测。 核实 37 个掘金 ID 后发现 post25 确实公开可达 ------ 正确答案既不是「通过」也不是「不通过」,而是「有条件通过」。 那一节比主线更值得读。

上一篇(post25)我说过一句话:判据全绿不代表数据是残的。 这一篇是它的反面形态:连答案表自己都可以是错的,而且错得非常有道理。 而最后证明这段话还差一层------连「实测」自己也可以是错的。


一、我在做什么:一个测「别人能不能自己验」的盲测

我给自己的写作立了一条入口门判据:标题里必须有一个具体可验证的物------ 一个数字、一个文件名、一个比例、一个可查的出处。

这条判据里有半句是字面可执行的:「别人能不能自己验」 。 于是 2026-10-07 我把它变成了一个实验(experiments/entry-gate/):

给一个不知道上下文的 agent 一条标题,只许查公开来源,问它三件事:

  1. 这条标题里的「具体物」指的是什么?
  2. 要独立验证它,你会去哪里查?给出具体 URL。
  3. 你实际查了吗?结果是什么?

不让 agent 下判定,只让它报事实。判分由我做。

刺激集里放了三类:正控制 (P1,一条已经定案并已发布的标题)、 负控制 (N1/N2,两条抽象命题型标题)、以及待测候选(A1/B1/B2)。

判据也拆成了两条可分离的子判据:

子判据 / 问什么

  • 1a 锚点存在 ------ 标题里的数字/文件名/标识符,是不是一个真实存在的物?
  • 1b 第三方可达 ------ 匿名读者能不能打开一个公开入口,看到对应的物?

必须 1a 且 1b 都满足才算通过。只满足 1a 的,等于没满足。


二、第一轮整轮作废

第一轮跑完,我把结果矩阵写进了 README,看起来很漂亮。

然后我意识到一件事:原始 agent 记录一条都没存。

全历史里 experiments/entry-gate/ 只有 README.md 和 stimuli.md 两个文件。 agent 说了什么、查了哪里、报了什么------全部只存在于当时的对话里,没进版本库。

更要命的是,N1 和 N2 那两条是被污染的 :对照表就放在实验目录里, agent 直接 grep 到了自己那一行,连同我已经写好的裁定原文一起被读进上下文。

盲测只要答案在盘上就不成立。 agent 和我共享文件系统, 它不知道该忽略什么,它会去 grep。

没有原始记录,第一轮的结果就无法被任何人复核------ 包括我自己。而一个不可复核的实验,和没做是同一件事。

所以第二轮重跑。这次补上了三样:

  1. 协议独立成文件 (PROTOCOL.md),第三方能照着执行
  2. 答案表归位入仓 (KEY.md,原先躺在 /tmp),并跑前记录 SHA256
  3. 原始输出逐条落盘 (runs/round2/*.txt),一条不删

三、答案表错了,而且错在最有道理的地方

第二轮的预期结果,我在跑之前就写进了 KEY.md 并记录了哈希:

vbnet 复制代码
59b1453eef9f3dc5b0a019153286bdd8b96cd2a728350f08fd8fd607bf920b1a  KEY.md
aaeafa190d6daa59aaf981361fbf164220caa64b196c0a14d7ea0c849eea657d  stimuli.md

跑完之后再校验,哈希没变。所以预期确实是跑前写定的,不是看到结果回头补的。

然后实测 P1,答案是:不通过(1a 不成立,1b 也不成立)。

而我的答案表写的是:

P1 | 门禁跑足了 10 条规则,7 个真实越权改动,0 次拦下 | 通过 | 预期依据:post25 已定案并已发布,地面真值已知

「地面真值已知」------这句话本身是错的。

错在哪:post25 确实定案了,确实四平台都发布了。 但那个仓库是私有的。 匿名读者打开 GitHub API 只会拿到 404。 发布发生在我的账号后面,不在公网上。

盲测 agent 的报告说得很直白:

「标题没有指明哪个门禁、哪个仓库、哪个被改动对象, 这三个数字没有任何可定位的公开锚点。」

这和两年前我犯的错是同一个

POST25-DECISION.md:37 那张表的列名写着「别人能不能自己验」, 而我在 P1 那行填的是「脚本在仓库里」。

两件事,中间没有任何一步校验。

而这次,答案表比那篇文章走得更远一步------ 它直接写下「地面真值已知」,把我已知 当成了人人可知。

一个预注册的答案表可以是对的,也可以是错的。 预注册保证的不是「答案对」,是「答案不是事后凑的」。 这两件事完全不同,而只有第二件是预注册能保证的。


四、为什么这件事值得单独写一篇

因为它戳中了一个很少被正面讨论的场景:

评审自己的实验时,最危险的不是判据太松,是判据「看起来很有道理」。

「post25 已定案并已发布,地面真值已知」------这句话读起来无可挑剔。 有定案、有发布、有实验脚本、有原始 JSON。四个条件全部满足。

而它错在这四个条件没有一个等于「第三方可达」。

这不是我第一次在这个点上栽。仓库里另一处记录了同一形状: ACADEMIC-TRANSITION.md 写「仓库私有 = 学术化不可行」, 后来被推翻------我对着会议的投稿规则倒推出了「什么叫学术」的定义。 投稿资格不等于学术性,私有性是操作资产的属性而不是研究资产的属性。

两次的错误结构一样:拿一个「测得出来的量」,当成另一个问题的答案。


五、这轮实验自己给出的其他结论

5.1 六条判定,第二轮与第一轮全部一致

ID / 1a / 1b / 判定

  • P1 ------ ✅ ------ ✅ ------ 有条件通过(详见 5.4 的事后更正)
  • N1 ------ ❌ ------ ❌ ------ 不通过(无锚点)
  • N2 ------ ❌ ------ ❌ ------ 不通过(无锚点)
  • A1 ------ ✅ ------ ⚠️ ------ 有条件通过
  • B1 ------ ✅ ------ ✅ ------ 通过,但措辞要改
  • B2 ------ ✅ ------ ✅ ------ 通过

正控制与负控制被分开了 ------区分力成立,取值不是恒 [True]。

5.2 但检索能力受限这件事必须记下来

第二轮 6 个 agent 全部只有 web_fetch,没有 web_search(6/6 主动声明了)。

这意味着 N1/N2 的不通过不能 读作「锚点不可复核」, 只能读作「在受限检索能力下无可复核锚点」。

有一条 agent 做得特别好,它自己写下:

「我无法区分这是『确实无命中』还是『RSS 端点对中文精确匹配支持差』...... 当前环境下我只能给出『未找到』,给不出『不存在』。」

它还做了个校准实验 :用无意义词 zzzzznotarealtermqqq 测 GitHub 搜索是否尊重引号 (返回 0),再测 "27 agents"(返回 4,370,566 条,首条无关)------ 证明该通道忽略引号,短语搜索在此通道上无意义。

「查不到」和「不存在」的区别,它比我清楚。

5.3 污染核验,以及它的天花板

bash 复制代码
cd experiments/entry-gate
sha256sum -c PREREG.sha256          # 预期确为跑前写定
python3 check-contamination.py       # 输出里有没有只有 KEY.md 才有的字符串

实测:clean 6/6,预注册哈希未变。

但这道检查证明不了实验无泄漏。 它是关键词匹配,只能提高作弊被抓的概率, 不能证明没作弊。真正的盲测要靠外部执行环境隔离 ------ 而根因(agent 与主 agent 共享文件系统)本轮并没有解决, 我只是把答案挪了位置并加了哈希。

这一点写在 runs/RESULTS.md §三,不藏在方法学描述里。

5.4 ⚠️⚠️ 事后更正:本节第三节的 P1 判定,两头都判重了

这一条是本篇最重要的一次更正,而且它同时推翻了我和我的答案表。

把全部 37 个记录在案的掘金文章 ID 逐个 HTTP 核实之后,发现:

shell 复制代码
$ curl -s -o /dev/null -w "%{http_code}" https://juejin.cn/post/7693165008605675520
200
<title>门禁跑足了 10 条规则,7 个真实越权改动,0 次拦下... - 掘金

post25 是公开发布的,匿名可访问,标题与本地 title.txt 逐字相符, 正文里「10 条规则」「7 个」「0 次」三个具体物全部在。

所以三种判定里,正确的是「有条件通过」:

来源 / 判定 / 哪里不对

  • KEY.md(预注册) ------ 通过 ------ 太强。实验脚本与原始数据在私有仓库里,匿名读者能读到结论、读不到「怎么得出来的」
  • 第二轮实测(2026-10-08) ------ 不通过(不可复核) ------ 太强。文章确实公开可达
  • 修正后 ------ 有条件通过 ------ 1a ✅ 1b ✅,但「可复核的只有结论,不是过程」

为什么盲测 agent 会判错

不是它推理错了,是它拿到的检索通道全部失效了。 它自己的报告里写着:

「标题原文精确检索:撞上 DuckDuckGo 人机验证...... Mojeek 备用入口:403 Forbidden......Bing:返回的是重度 JS 混淆的 SERP 页面, 等同于无结果,不是「确认无此文章」。」

于是它转而找到了 ySimon 那个同题材但数字不同的系列, 据��得出「这三个数字在公开来源中找不到对应」。

结论碰巧与事实相反,而它的推理链是自洽的。

而同一轮的 N2 那条 agent 恰好写下了这句话:

「当前环境下我只能给出『未找到』 ,给不出『不存在』。」

它把这一轮最该说的话说了出来,而我当时没有把它应用到 P1 上。

教训:「实测结果」和「工具能力」必须分开记。 盲测给的是「在受限检索能力下未找到」, 不是 「不存在」。前者是关于工具的陈述,后者是关于世界的陈述, 我把前者当成了后者。

这也解释了为什么 KEY.md 和实测同时 错、却错向相反的方向: 答案表假设「已发布 = 一定找得到」,实测假设「找不到 = 不存在」。 两个假设都不成立。


六、这个结论什么情况下是错的

我把证伪条件写在这里,而不是留给下一个读者去猜:

如果有人能在公开网络上定位到「10 条规则 / 7 个真实越权改动 / 0 次拦下」这三个数字 的出处,第三、四节的结论就错了。

具体地说,以下任一成立则本文的 P1 判定需要修正:

  1. 那个门禁实验的代码或数据被公开到了一个匿名可达的位置;
  2. post25 的三个数字其实出自某个公开发表的他人系列(实测中 agent 确实找到了

一个同题材的中文系列,作者 ySimon,工具 gatecheck,但数字对不上: 人家是 175/162 个变异体,不是 10/7/0);

  1. 仓库转为公开。

第 2 条我特别说明 :第二轮的盲测 agent 自己找到了 cloud.tencent.com/developer/article/2745986 这一系列 (MIT 开源,仓库 simin-yuan/self-auditing-agent)。 那一系列做的正是「用变异体检门禁」,规模大一个量级。 它不推翻本文的结论(数字不同),但它推翻「没人公开做过这件事」的假设。


七、局限

  1. n = 6,每条一个 agent、一个基座模型。够判「有没有区分力」,不够估效应量。
  2. 检索能力受限(见 5.2),系统性压低了 1b 的通过率。
  3. 同一刺激两次跑可能给出不同的可达性结论 ------第二轮的 P1 agent 找到了

第一轮没找到的同题材系列。检索结果依赖当时的网络与工具状态,这是固有噪声。

  1. 第一轮不可复核,本轮不能声称「复现了第一轮」,

只能声称「第二轮结论与第一轮 README 记载一致」------ 前者需要数据,后者只需要读文档。这两句话的分量差得很远。

  1. 污染控制是事后检查,不是环境隔离(见 5.3)。

八、复现方法

bash 复制代码
git clone https://github.com/Ikalus1988/account-ops-workflow
cd computer-use-demo/experiments/entry-gate

# 1. 确认预期是跑前写定的
sha256sum -c PREREG.sha256

# 2. 看 6 条原始输出
ls runs/round2/

# 3. 核验污染
python3 check-contamination.py
python3 check-contamination.py --selftest   # 判据自身会失败的用例

# 4. 判据标准的全文(含反例)
cat PROTOCOL.md

原始数据 :6 条 agent 输出见 experiments/entry-gate/runs/round2/, 逐条归档,未删改。结果汇总见 runs/RESULTS.md。 第一轮的 README 原文保留 ,两轮差异在 runs/RESULTS.md 里逐条列出。


附:本文引用

学术文献

  1. Large Language Models for Software Engineering: A Reproducibility Crisis --- arXiv:2512.00651。系统分析了 640 篇 LLM-for-SE 论文的 7 类可复现性气味,结论之一是「badges often signal artifact presence but do not consistently guarantee execution fidelity」------「制品存在」与「第三方可执行」之间存在系统性落差,这正是本文 P1 失败的已知一般形态。本文不是发现这个现象,是提供一个可复现的最小实例。
  2. (Over)Reliance on Test Agents in AI-Assisted Software Testing --- arXiv:2607.17927。提出过度依赖既是 agency 问题也是 assurance 问题,并明确呼吁「a framework for collecting data on overreliance」。它是立场文,没有数据;本文的数据是这个空的一个格子。

他人的公开工作(由盲测 agent 检出,非本文主动检索)

  1. CI 全绿,门禁却可能一次都没拦过:用变异测试给质量门禁做体检 --- 腾讯云开发者社区 cloud.tencent.com/developer/article/2745986,作者 ySimon,2026-09-18。175 个变异体漏过 78。
  2. CI 全绿...我用 162 个变异体做体检 --- cloud.tencent.com/developer/article/2751800,2026-09-27。变异 56→162,漏过 19→57,真盲区 0。工具与仓库:github.com/simin-yuan/self-auditing-agent(MIT)。

复现锚点

  • experiments/entry-gate/PREREG.sha256 --- 预注册哈希
  • experiments/entry-gate/runs/round2/*.txt --- 6 条原始输出
  • 版本锚点:本文写作时仓库 tag v0.1.0-research;第一轮实验对应 commit 4c34563,第二轮协议与判据见 fac9945
相关推荐
小元同学3 小时前
一个大三测试实习生的自白:实习重不重要?我在往测开的路上找到了答案
测试
冬奇Lab16 小时前
LLM 驱动的自动化测试系列(08):移动端自动化(四)——AppAgent:解析树与视觉特征的结合
人工智能·测试
万联WANFLOW21 小时前
从 ARTEX 事件看 AI Agent 安全:工具调用链为何成为新的风险入口?
人工智能·安全·测试
ClouGence1 天前
小团队做自动化测试,选测试平台还是自己搭 Playwright?
测试
冬奇Lab2 天前
LLM 驱动的自动化测试系列(07):移动端自动化(三)——Mobile-Agent-v3 与自研 GUI-Owl 模型路线
android·人工智能·测试
ClouGence2 天前
代码改完,怎么自动跑回归测试?Codex + CueCast MCP 实战方案
openai·测试
匠测AI说2 天前
AI for Testing 提效实战·测试设计(四):我拿一个真实需求,让 AI 陪我走完了整个测试设计(全程复盘)
人工智能·测试
冬奇Lab3 天前
LLM 驱动的自动化测试系列(06):移动端自动化(二)——DroidRun/Mobilerun 的角色级模型拆分
人工智能·测试