Skip to content

v2.4.0 — 第一次真实接管跑出来的账

Choose a tag to compare

@github-actions github-actions released this 02 Sep 17:13
· 3 commits to main since this release

一个科研会话拿 v2.3.0 把接入流程整个跑了一遍(37 篇入队、36 篇入库、
1509 chunks),回来一份带 file:line 和实测曲线的报告。这一版是复核它的结果:
26 条外加追加的一轮,13 条修了,7 条查明不需要改代码。

崩溃

magi radar citation-gap 引用了一个从未赋值的 seen_before,全文件只出现
这一次。它躲过 2780 个测试和 84 条变异用例的原因很干净:那行在 if findings:
分支里,没找到候选就走 else 返回 0。失败只存在于成功路径上,而测试里从来
没有真实的 S2 命中。补的测试因此必须让侦察真的找到候选。

静默数据损坏

标题抽取有三种错法,都不报错,产物看起来完全正常:

  • 标签被删掉,两边的词焊在一起 —— invariants ofPauli
  • 文档没有标题元素时,<title> 里装的是第一个小标题 —— Abstract1Introduction
  • 按词边界截断,74–81 codepoint,每一条都读起来是完整合语法的标题

第三种最危险。1812.11193 到手是「Classification of translation invariant
topological Pauli stabilizer codes」——你会毫不犹豫地引用它,而它悄悄丢掉了
全部限定范围(素维 qudit、二维)。报告的人说,他们论文最直接的竞争者被截断
之后,他做文献划界时差点直接放过去。

现在优先读 ltx_title_document、标签变成空格而不是删掉,而看起来是小标题的
一律返回 None 落回 arXiv id ——一个显然不是标题的东西会被注意到,一个像
标题的不会。

config.yaml 里不加引号的 arXiv id 会被 YAML 读成 float。
[2606.03580]2606.0358,末位 0 没了,而 str() 出来是一个格式完全正确、
属于另一篇论文的 id。信息在解析时就没了,救不回来,所以现在直接拒绝。

magi ingest audit-titles

坏抽取器留下的不是坏文件,是像样的文件,而项目里没有任何东西能看出来。

恢复是免费的:output/ingest/batch-*.jsonl 记着抽取当时的标题,而那个目录在
「永不重建」那一组里。台账是抽取器说过的话,卡片是现在的样子。

它第一版按 committed_path 关联,而 item 记录根本没有这个字段(实测 37 条
记录、0 条有路径),于是一条都没找到并打印「每张卡片都还带着当初的标题」——
一个用来发现静默损坏的命令,自己静默地什么都没发现。 改成按 arXiv id
关联后,在那个真实库上跑出 12 条,和他们自己 log 里记的改正数一致。

它不判断谁对:没有网络也没有权威,只把成对的说法摆出来。

误报

重复检测在 37 篇里报了 36 篇。 我加了词content 过滤、又剥离了 base64,
还是 35/37。第三轮才去看到底什么在重复:LaTeXML 自己的 PGF 内部标记,一篇里
181 次。到这里问题的形状就变了——那个检查的 docstring 自己写着它是给
glm-ocr 建的,跑在 LaTeX 转换上是类别错误,不是参数没调好。现在只在
识别类路线上跑,HTML 路线 0/37。前两轮的过滤留着(对 OCR 也有用),顺带把
3 MB 那篇的检测从 107 秒降下来。

math check 对中文 100% 误报。 pdflatex 排不了 CJK,而 wiki 用 KaTeX 渲染。
一个中文项目报了 957 条问题公式,逐条看全是 Unicode character 指 (U+6307)
检查器把自己缺字体报成文档的错。

说法和代码不一致

AGENTS.md 写着 raw/ 「Immutable: never edit」,而 magi math format 会改它
——而且是故意的,raw/ 装着 OCR 输出,它的数学需要修。过宽的是那句话,不是
代码:报告的人因此不敢跑一条正当命令。

research.search_projects 配了从来不生效。 --scope 默认 local,只有
all/global 读那个键。默认改成 auto,并把 auto 定义成配置本来的意思。

也修了

--no-figures 只存在于单篇 CLI,而它正是批量最需要的开关;tex 路线的
\title[Short]{Long} 一个都不匹配、source: 指向 commit 后就消失的 staging;
--commit 说了有几条挡着没说是哪几条;弱收割的简报看起来和正常的一样;
magi stats 裸调用抛 argparse 错误而不是列出子命令。

两处只写在注释里的慢,进手册了

每张图 15 秒是 arXiv 的 robots.txt。实测 37 篇:耗时和图数近乎完美线性、
和正文体积零相关。两份指南 grep Crawl-delay 都是零命中。

以及长命令不要管道给 tailmagi index 每 3 秒打 flush 过的进度,但
tail 要等流结束才知道最后二十行是哪些,所以一个正常跑着的 50 分钟索引在人
眼里完全沉默——真的有人因此判定它死了。变异套件更严重:它改源码再还原,
SIGPIPE 中途杀掉会留下改过的文件。

不需要改代码的七条

都是实测排除的,不是读代码推的:Path.resolve() 在 Windows 上自己就规范化
盘符和分段大小写(所以 worklock 和 jobs 的死锁不成立);SQLite 不会把
file:C:/…C: 当主机名;urllib 默认就发 User-Agent;os._exit(0)
SIGINT 失败后的兜底、docstring 写明了;schtasks 的引号本来就加了;索引进度
本来就在打。

质量

2814 个测试通过 / 1 跳过。95 条变异用例全部会咬(新增 11 条)。三宿主冒烟于
2026-09-02 通过:复核者驳回了一个故意过宽的命题并逐行点名,19.8 秒。

本版有三条老测试变红。每一条都先读了它记的理由再改,而不是改到绿为止:两条
是例子过期(codex 现在真有钩子了,继续拿它当「没有钩子的宿主」就是断言一件
关于别人产品的假话),一条是断言钉的是标签而变的正好是标签——那条测试自己
写着「the default changed — this test is now guarding the wrong claim」,
预先想好了决定会变,并规定了变的时候该怎么办。

pipx upgrade --install magi-research

Browser buttonmagi-browser-extension-v1.2.2.zip below.
Unzip it, open chrome://extensions, turn on Developer Mode, and use Load unpacked on the unzipped folder. It sends the page you are reading to a local MAGI queue and nothing else; nothing enters a library until you approve the batch.