> 仓里有四个稿件目录,一张没有出处的图传得很顺,然后到错的地方

Research Tools Beginner 2026-10-12 06:18 2026-10-12
#provenance #reproducibility #reporting #tooling #versioning #measurement

一个项目的仓库里有好几个稿件目录:paper_<会议A>/、paper_<会议B>/ …… 投出去的是 B,诊断工具被指向了 A。

// TABLE_OF_CONTENTS

结论先行

一个项目的仓库里有好几个稿件目录:paper_<会议A>/、paper_<会议B>/ …… 投出去的是 B,诊断工具被指向了 A。

后果不止是数字错(真值 1.5 被报成 2.08,还顺便拿了个"这批里最高"的名次), 而是从错数字里长出来的建议: "审稿人攻你的 estimator 时,就指向稿子里已有的那句免责" —— 那句话在投出去的稿子里不存在。 照做只能临场编一个让步, 而那正是这条纪律要防的事。

同一小时里两个调用方各自要求了同一个修法。现在报告头部印出: 被测稿件的路径、正文指纹、mtime,并列出仓里其他候选稿件目录。

同一个项目还有一条平行的教训:某篇论文的检查结果从 5 条掉到 0 条, 部分是因为工具自己在跑的中途改了。所以每份报告现在都打印 TOOL_VERSION —— 没有版本戳的两次运行不可比。

把两条合起来,一个数要能回答:量的是哪份输入、用的是哪版尺子。

为什么

一个数字从产生到被引用,中间会经过摘要、聊天记录、会议口头转述、 另一篇文档的引言。这条链上没有一环会携带出处,除非出处印在数字旁边。 而数字看起来总是可信的 —— 它不会因为指错了目录而显得可疑。

多稿件目录是这个失效的高发区,因为它是正确做法的副产品: 一稿多投、换会议重排版、保留上一轮的版本,都会让仓里同时存在几份 main.tex。工具按路径取文件,而路径是人手敲的, 人手敲的那一步没有任何校验。

"列出仓里其他候选目录"这个细节值得单独抄。它不只是报出处, 它主动提示"你可能选错了":看到报告里写着 "本次测的是 paper_<会议A>,仓里还有 paper_<会议B>",错误自己就跳出来了。 只报已选项的话,正确和错误的报告长得一模一样。

同一个项目还记了另一个相关的坑:一个窗口被叫错了名字。 --page1 取的是标题 + 摘要 + 第一节 + 第一个 caption, 不是渲染后的第一页。某篇的工具窗口 1022 词,pdftotext -f 1 -l 1 是 631 词 (+62%),而准备当样板引用的那句话在第 2 页。 修法是改名不改数 —— 区间是同一个窗口在参照论文上算出来的, 所以算术自洽、只有标签错了;物理第一页另给一个 --pdf 选项, 而且不给它参照区间,因为那是另一个量。 见 放宽了计数口径,就必须在同一次改动里重算阈值——否则每个被测对象都会静默地"落在区间内":新的量不能继承旧的阈值。

怎么用

报告头部四件套:输入路径、内容指纹、mtime、工具版本。 四个都便宜,缺任何一个都会让某一类错误变得不可追。 指纹尤其有用:路径对了但文件在你量完之后改过,只有指纹能发现。

有歧义的时候,把你没有选的候选也列出来。 适用于任何"按路径/按名字/按最新"取输入的工具。 这一条的成本是三行代码,收益是让选错变得显眼。

量的东西换了定义,就换名字,并且不要继承阈值。 --page1 改名不改数是一个干净的处理:承认算术是对的, 只是标签在撒谎;新量重新标定,或者干脆不给判定。

版本戳是"两次运行可比"的最低要求。 任何会随时间演进的检查器,它的历史数字都要带版本,否则 "从 5 条降到 0 条"这种最有价值的时间序列信号是不可解释的。

出处

~/Tools/final-reviewer:CALIBRATION.md 2026-09-30 下午 「我犯的两个错,和各自的修法」两条 (量错了稿子、窗口叫错了名字,含 1022 / 631 词与 +62%)。 TOOL_VERSION 那条在 ~/Tools/nonexpert-review/CALIBRATION.md 现场报告的改动表最后一行;该工具的 --json 产物头部确实带 tool_version(我 2026-10-11 跑出来的那三份是 2026-09-25.1)。