Skip to content

Releases: Misaka16384/magi

v2.5.0 — 复核默认强档、四值判决,证据必须在项目内

Choose a tag to compare

@github-actions github-actions released this 03 Sep 13:08

一天真实研究使用送回的两批反馈,全部落地。数据先于口味:同一批命题上,便宜档十二次判决放过了
全部四处实质错误并报出它没读过的行号,强档找到了唯一一处真正的证明缺口。

复核

  • 周预算取消。 账本 output/llm-ledger.jsonl 照记(host、model、effort、tier、耗时、成败),
    唯一的拒绝是 research.llm_calls: falseconfig.yaml 里的 weekly_calls 不再被读。
  • 默认强档。 claude → opus + effort high,agy → gemini-3.8-flash-high,codex → 自己的默认 + high。
    便宜档保留为 --model haiku 这类点名选项;帖子签名写明 host · model · effort · tier,只被便宜档
    看过的命题在 magi nextsync --close 里单列。
  • 四值判决。 stands / restate / refuted / unclearrestate(结论成立、文字须改)把命题退回
    testing,作者改完再标 supported 就自动再审,不打扰人;refuted 须给反例或具体步骤,且只以
    drafts/raw/ 为据——帖子是评论不是证据。
  • 提示词重写。 六条按命中率排的检查(量词范围、定义、计数指标、覆盖全域、数值独立性、承重假设),
    强制 CHECKED(独立核实了什么)与 ASSUMPTION(承重假设)两段,都写进帖子。--allow-run 允许宿主
    执行脚本(Claude Code、Codex 有;agy 会说明)。
  • 宿主失败自动换。 配额、超时、崩掉都换下一个装了的 CLI,帖子写明谁先被问、为什么没答。
    作者从翻到 supported 的帖子签名读出,不再要 --author
  • 默认超时 300 → 600 s,推导与证据长再加长;--timeout 指定则不放大。

命题与 magi next

  • 猜想 / 发现。 magi thread new … --found [DATE] 标记先算出来再开题的发现,不问押注。
  • magi thread bet <slug> <supported|refuted|unknown>,默认签 human。
  • --claim 是被复核的精确陈述,标题回到短名;magi thread claim <slug> --text 重述并记成跟帖。
  • --derivation / --evidence(可多次,thread post --evidence 追加):路径必须在项目内且存在,
    否则当场拒绝。新目录 tools/ 是验证脚本的家。帖子里引用了项目外路径或 scratchpad 时,
    nextsync --closereview 三处提示。
  • · via <cli>:签 human 的帖子头写明誊写者,人亲手敲与 agent 代跑分得清;闸门仍当人的决定。
  • next 把所有问人的事渲染成一个块(含 bet: unknown 与便宜档复核过两条聚合项)、开了不到
    stall_days/2 天的命题不再催、末尾一行押注记分板;thread status 在击键处说明人的决定怎么签、
    不要重做。

摄入、索引、WebUI

  • batch-run 整批经 Semantic Scholar 把 DOI 解成 arXiv id;解不到的按「需要 PDF」失败且不往下排。
  • --decision discard(CLI、API、WebUI):丢弃,不重排。review --commit 搁置整批时说 HELD。
  • ingest url --expect "<题名片段>" 先取题名核对,对不上不排;--fetch-title 只打印。
  • magi index 首次超时翻倍上限重试一次,回填前重新探测 Ollama。
  • WebUI 图谱端点发现 threads/wiki/graph.db 新时自行重建。

升级注意

  • research.weekly_calls 可以从 config.yaml 删掉;留着也无害,不再被读。
  • 已有项目 mkdir toolsmagi init 现在会建)。
  • 复核默认变强档、变贵:想省,写 research.review_model: haiku(或对应宿主的便宜模型)。
  • 三宿主冒烟:claude / codex / antigravity dry-run 均正确;agy gemini-3.8-flash-high 真调用 65 s
    restate,逐行点名量词写宽,并自行跑了 tools/ 下两个脚本核数。
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.

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

Choose a tag to compare

@github-actions github-actions released this 02 Sep 17:13

一个科研会话拿 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.

v2.3.0 — 交接、闸门,和一次审计复核

Choose a tag to compare

@github-actions github-actions released this 02 Sep 12:05

这一版起于两个问题:一个空目录之外的文件夹怎么进 MAGI,以及下一个开工的人
怎么知道上一个人做到哪了。中途插进来一份 68KB 的系统审计,复核完又修掉九处。

magi adopt

magi init 本来就能在非空目录里跑。缺的是判断目录里那堆东西是什么,以及
搬动之后文件之间互指的路径还指得准。前者是判断,留给 skill;后者是路径
算术,写成命令。

关键决定是不在链接会断的地方报错,而是改。证明一条链接要断的那套算术,
同时也算得出它该指向哪——包括写在反引号里的路径,没有任何东西渲染它们,也就
没有任何别的东西会发现它们失效了。

对着两个真实课题仓库做的:Algebra_Energy_Barrier(材料全压在 research/
一层之下,109 个 arXiv id)三棵子树整体搬,0 处改写、27 条链接全活;
KW Duality(扁平,37 个 arXiv id)六次搬动,26 处引用被改对,26 处全是
散文路径、markdown 链接 0 条
——这个仓库被任何不管散文的搬动处理都会静默
散架。两者撤销后与原件逐字节相同。

交接:在人进来的时候说,不是在人走的时候

sync --close 多了一节「留给下一个人的半成品」——未提交的改动、排队没跑的
批次、开着没判完的雷达简报、inbox/ 里等着的文件。全部是对已有文件的查询
一个字都不写:v2 退休 log.md 的理由就是「把同一批事件写到第二个地方,两份
记录就会开始互相矛盾」。

但只在会话结束时说是错的一头。session-start 钩子现在三段一起给:magi next
的清单、上一个会话留下的在途东西、以及 skill 比 CLI 旧的警告。什么都没有时
仍然一个字不说。

skill 过期,终于有东西在看

精确的判据本来就有(逐字节比对当前包会写出来的内容,不信版本号),缺的是没有
任何自动运行的东西问过它。你的 Claude 插件钉在四个月前的快照上,期间没有任何
东西说过一句。现在 sync 每次问,而且报文件名不报数目——skills where
的「1 outdated」被人看一眼就放过了,而它背后是一个躲过两轮清理的 v1 skill。

闸门从一个宿主变成三个

代码里那句「Claude Code 是唯一文档化了这些的宿主」是一句关于别人产品的断言,
而且已经过期。

Codex 形状和 Claude 一样,阻断词也一样,一个写入器服务两家。形状不是照
文档抄的:机器上两个真实安装的 Codex 插件里就有 hooks.json,逐字对上。

Antigravity 三处都不同,而且是从它随安装附带的第一方文档里读出来的:顶层
键是钩子名字Stop 是不带 matcher 的扁平数组,没有 SessionStart
阻断词是 decision: continue,而它自己的文档写着「任何其他值都允许 agent
停止」——照 Claude 的形状写过去会得到一个能解析、永远不触发的文件。

这条装上了但没验证过,报告里就是这么说的:agy --print 下一个钩子都不
触发,它的文档给路径用的是「e.g.」。一个人以为存在的闸门,比一个他知道要去
检查的闸门更糟。

审计复核:26 条验完,10 条属实

两个 Critical 都属实,而且都比报告写的更糟:

  • _ours() 早就写好、docstring 一字不差描述了那个 bug、从未被调用。真机
    复现:一个自己写的 research/ skill 连同 REFERENCE.mduninstall 删掉。
  • .cmd 宿主不是崩溃,是静默截断——回显首参数的 .cmd 收到三行字符串,
    打出 ARG1=[line one],退出码 0。npm 装的宿主会拿到评审提示词的第一行然后
    信心十足地作答。

其余属实并已修:竞态分支自己的 TypeErrorexecutescript 先提交导致失败的
重建把图谱清空;render_command 丢掉 origin 标记(这就是那个 v1
radar_review.md 熬过两次升级的根因
);Ctrl+C 在 setup 里等于「是」;
托管块告诉 agent output/ 可随便删,而它装着删不掉的账本——项目自己生成的
_index.md 早就写对了,两个说法发给了不同的读者。

八条判错的全是同一个毛病:照 API 语义推,没实测。resolve() 自己就规范化
大小写、SQLite 不会把 C: 当主机名、urllib 默认就发 UA。

也修了

WebUI 视觉重做(卡片从「材料」变回「纸」)+ 图谱快速搜索,复核时找到 markMatch
在转义后的串里找下标却用未转义的长度去切,搜 & 会把 <mark> 落在实体中间。
补了一条真正执行 JS 的守卫:把函数从 app.js 里按名字抠出来在 node 里跑,
而不是在 Python 里重写一遍。

质量

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

本版三次栽在同一个坑上:守卫的测试直接调守卫,而调用点那行接线一次都没跑到。
三次都是变异用例报 MISSED 才发现的。

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.

v2.2.0 — 接管已有的研究文件夹

Choose a tag to compare

@github-actions github-actions released this 02 Sep 07:04

一个已经堆了半年材料的文件夹怎么进 MAGI。magi migrate 管的是 Wikify 建过的
项目;这一版管的是从来没进过 MAGI、有文献有草稿有代码有数据、摆法不一定合我们
想象的那种目录。

magi init 本来就能在非空目录里跑(纯增量,已存在的文件一律跳过)。缺的是两件
事:判断目录里那堆东西是什么,以及搬动之后文件之间互指的路径还指得准
前者是判断,留给 skill;后者是路径算术,写成命令。

magi adopt

magi adopt survey .                    # 只读盘点
magi adopt apply plan.json --dry-run   # 看会搬什么、改哪些引用
magi adopt apply plan.json
magi adopt undo                        # 字和文件一起放回去

survey 除了列目录,把所有 markdown 里写着的 arXiv id 和 DOI 一并抓出来——一张
参考文献表往往就是这个项目已有的半数文献,抓出来是正则的事,判断每一篇值不值得
读才是要人读的事。整个目录只有一个子目录时自动往下钻一层并说明;否则一个
research/ 包着全部材料的仓库,盘点出来只有「112 个文件」一行,等于没说。

计划是一个 JSON,由 agent 写、人过目。apply 从不删除、从不覆盖、从不把东西搬
出项目目录、从不动 MAGI 自己的脚手架;计划里只要有一条不合法,一条都不执行——
搬了一半的文件夹比没搬的更难收拾。被搬空的目录它说出来,但不删。

不在链接会断的地方报错,而是改

研究文件夹是靠相对路径连起来的。按整目录搬恰好能保住它们,但一个乱到值得 adopt
的文件夹本来就不可能只靠整目录搬成 MAGI 的形状:迟早有一个文件要去它邻居不去的
地方。在那里报错等于把问题原样退回给人。

证明一条链接要断的那套算术,同时也算得出它该指向哪。 所以同一趟里改完,
包括写在反引号里的路径——没有任何东西渲染它们,也就没有任何别的东西会发现它们
失效了。每条改写记在导致它的那次搬动旁边,undo 因此能把字和文件一起放回去。

对着两个真实课题仓库做的

Algebra_Energy_Barrier:材料全压在 research/ 一层之下,112 个文件,109 个
arXiv id + 8 个 DOI。三棵子树整体搬进 drafts/,0 处需要改写,27 条链接全部解析。

KW Duality:扁平,18 个 md,37 个 arXiv id 一条命令全部入队。六次搬动(含三个
重命名),26 处引用被改对,26 处全是散文路径,markdown 链接 0 条——这个仓库
被任何不管散文路径的搬动处理,都会静默散架,而且没有任何东西会报错。改对的里面
包括自己没搬、但指的东西搬了的 log.mdREADME.md

两个仓库撤销后都与原件逐字节相同。

实测改出来的缺陷

全是跑真仓库才出来的,fixture 上一条都不会出现:

  • 一份叫 log.md 的工作日志被报成 magi 自己的家具(名字撞了而已,init 之前那
    个目录里没有一样东西是 magi 的)
  • 材料全在一层包装之下的仓库,盘点成一行「112 个文件」
  • 改一条链接却把整个文件的行尾从 LF 换成 CRLF——人回头 diff 自己的仓库,会看
    到整份文件都变了,也就看不出到底哪里变了
  • #anchor 被从匹配键上剪掉,于是带锚点的链接一条都改不动

也修了

magi next 对当天新建的命题说 open since 0001-01-01 回退值取的是纪元
下限,而一条还没有任何帖子的命题每次都落到那里——一个刚接管的项目对人说的第一句
话带着公元 1 年的日期。_oldest_open 的排序用的是同一个下限:两条都没帖子的命题
在那里并列,next 点名哪一条成了文件系统的列举顺序。

修这条时引入又修掉一个:YAML 把不带引号的 created: 2026-09-02 解析成 date
对象(我们的写入器加引号,人手改过的文件不加),交给给帖子时间戳用的 parse_at
.strip() 一个 date,整个面板挂掉。强度不放进 parse_at——为一个调用点放宽
它等于让所有调用点开始接受不知道什么东西。

两份指南都写着 magi migrate 没有 --dry-run,而 migrate.py 里就定义着
它,--help 那句话还建议先跑一遍。

一条不会咬的守卫

「一条没有帖子的命题被记成公元 1 年」那条变异用例,锚点指的是修 date 崩溃时被
重构掉的那一行。运行器报 ANCHOR? 而不是 caught——变异根本没被应用过
一条装不上的用例和一条咬得住的用例,在绿色的报告里长得一模一样。补丁脚本现在
写入前断言锚点在源码里恰好出现一次。

质量

2726 个测试通过 / 1 跳过。变异用例 adopt 9 条、state 3 条,全部会咬。三宿主冒烟
于 2026-09-02 通过:复核者驳回了一个故意过宽的命题,并逐行点名了命题本身、它
过度外推的那次单点测量、以及做出这一跳的推导,20.2 秒。

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.

v2.1.0 — 让两侧看到同一份东西

Choose a tag to compare

@github-actions github-actions released this 01 Sep 09:54

这一版起于一次真实的文献雷达跑:五篇自有论文做我方论文,一个全新项目,一路
走完收割、分诊、引文缺口。判定标准只有一条——程序造成的「不同的人看到不同
的东西」要修;同一份信息下的判断差异不算 bug。

按这条筛出十四处。

静默地少做你配置的事

arXiv 分类饥饿。 _apply_budget 按来源家族分名额:arxiv-new 一共拿
max_candidates // 2,而每个分类抓 30 篇——第一个分类一个人就超额。后面的
分类被真的抓下来(各一次 HTTP 往返、三秒礼貌等待),然后整段丢掉,而日志
写的是「harvesting arXiv listings (3 categories)」。实测配三个分类,20 篇
arXiv 候选全来自第一个;修后是 7 / 7 / 6。

没有种子时,推荐那条腿静默关闭。 harvest_s2([]) 直接返回空,日志照样
打「harvesting S2 recommendations」。config 的注释明写着种子可留空,所以一个
只填了 own_arxiv_ids 的新项目拿到的是「只有 arXiv 最近列表」——而实测里,
值得读的四篇全部出自推荐那条腿。

两个说法发给同一个读者

每份雷达简报的正文里写死了「file bd issues」和「set status: reviewed in
this file's frontmatter」,而 radar_review 的规则是用 magi radar triage
禁止手改 frontmatter。agent 读到哪个就照哪个做。横幅改成引 skill 的
命令,并加了守卫:横幅里出现的每条 magi 调用,skill 里也必须出现。

两侧数不到一起

  • magi radar triage --done —— mark_report_reviewed() 原来只有 WebUI
    调得到,所以不开面板的人记完四十条决定,status / next / sync 仍然
    永远说待审。它还会自己报「N of M decided」并点名没判的那些:那本来是 skill
    里要人凭记忆说出口的一条散文规则。
  • 引文缺口按论文分组。 每个(我方,对方)配对各占一个标题,于是同一篇
    解析成多个同 id 的候选,而 triage --id 只认第一个——决定记了一次,列表里
    仍显示未决。头部 candidates: 18 其实是 11 篇;现在同时给出 papers 和
    pairs。
  • 面板和 CLI 对「有几条能判」给同一个数。 引文缺口报告开头的
    ## Our paper: 段被候选解析器读成候选,面板给它建了按钮全返回 409 的行,
    进度条永远停在 11/12。
  • --id 可重复,同一决定一次打完;批量里有一个坏 id 就一条都不写。
  • 决定词表写下来一次。 面板的「建阅读任务」记的是 task,CLI 三档里
    没有,注释还写着「the same three words」。

信息缺失当成解释

  • 引文缺口现在标出当天已判过的候选,而不是隐藏——共享参考文献列表是简报
    没有的证据,实测最强的一条命中正是「看摘要被跳过、看参考文献值得复议」。
  • 我方论文的元数据被限流(HTTP 429)时,那个锚点的上下文段不再直接消失,
    缺的地方自己说明缺了什么。
  • magi search 在空项目上回答而不是报错。「没有索引」一个错误当了两个
    答案用:有内容没索引确实答不了;什么都没有的项目,零结果才是真答案。空与
    不空问 _iter_corpus,也就是 magi index 自己走的那张表。

注册表

magi kb prune —— magi index 每次都自动注册,而没有任何东西会注意到
目录被删了。一台真机上 350 条,其中 225 条指向不存在的目录,4 条是人的项目。
kb list 一直算得出 exists 并打 MISSING,只是没有命令能据此动手。判据是
「目录没了」这个文件系统事实,不是名字像不像测试。

而它的来路也修了:测试套件在往开发者自己的 registry.json 里写。 隔离
夹具是 function 作用域,三个 module 作用域的夹具跑在它之前、继承了真实环境。
实测一次全量把注册表从 5 条推到 8 条。会话级夹具先重定向,并在重定向之前读
一遍真实注册表、结束时比对字节——任何将来的写入让整轮变红。

CI 真的在跑它声称跑的东西

  • textlayer extra 现在装上了。 它声明了、两个 workflow 都不装,需要它
    的 10 个测试只在作者机器上跑过。而没跑过的那条路是坏的:_run_route 只查
    verdict.ok、忽略 verdict.available 就 import,于是普通安装上一个正文
    PDF 的失败原因写成了 ImportError: No module named 'pymupdf4llm'——一句
    关于打包方式的话,说给一个只想转换论文的人听。
  • Windows 上 bd 装了、查了,套件却看不见。 检查跑在 Git Bash 里,而
    $HOME/.magi-bin 写进 GITHUB_PATH 是 POSIX 路径;跑套件那步是 pwsh。
    15 个测试在 Windows 上从未跑过。检查改成向真正要去找它的那个解释器发问。
  • 新守卫:声明的每个 extra 都必须在跑套件的地方装上。

也修了

radar_review 多一条规则(逐条判定,不拿上一条的推理当依据)。
browser-extension 的 README 还在教两条已退役的命令。
一个装满 LaTeX 宏的非 raw docstring——\r 是真回车。
onnxruntime 不加上界的理由记进了 pyproject:1.28 自己把 requires_python 提到

=3.11,解析器在 3.10 地板上本来就不会选它。

质量

2687 个测试,三平台一致(此前 Windows 少跑 15 个、三平台各少跑 10 个)。
56 条变异用例全部会咬。三宿主冒烟于 2026-09-01 通过:复核者驳回了一个故意
过宽的命题并逐行点名,19.5 秒。

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.

v2.0.2 — 逐条判定,不要把上一条的推理当依据

Choose a tag to compare

@github-actions github-actions released this 01 Sep 04:54

只改一个文件:radar_review 这个 skill 多了一条规则。

radar_review 是我们最长的串行单 agent 循环——一份 digest 几十个候选,一条
一条读下来。到第二十条时,上下文里最响的东西是前十九条的推理,而它和眼前这
篇论文最不相干:判定的门槛会漂,任何长得像先前被否掉的那些的候选,看起来就
也该否掉。

新增的规则要求每个候选重新对着项目本身判定(开放命题、magi search),而不
是对着本轮累积下来的印象。

为什么现在加

SKILL.state(arXiv 2608.26263)量到了这条曲线:随无关历史累积,准确率从 0.68
掉到 0.53。它的主张——单次执行内用显式状态取代增长的历史,补丁由运行时而非
模型校验——和我们「确定性 CLI 是拘束具」是同一条原理,我们在台账那一层已经
这么做了。它没能覆盖的是 agent 自己那段串行推理,这条规则补的就是那里。

顺带记下两条:它自己承认的 Retroactive Relevance(提交时判定不重要而丢掉的
观察找不回来)和可变状态合并没有确定性冲突语义(「当前实现只支持单 agent」),
都指向我们追加式、带温度、不丢弃的 threads 是更稳的那一种。它的 "Memory"
基线(滚动窗口 + 周期性摘要)在 τ-Bench Retail 上 29.9%,低于什么都不做的
48.2%——以后若有人提议给 magi sync 加「让模型摘要老 thread」的捷径,这是
拒绝的引用。

没有配套的测试,但有两道守卫拦了一次

这条规则本身不能写成命令、闸门或测试——它约束的是判定时看哪份材料,机器
无从检查。凡是能写成检查的规则不留在 skill 里当散文;这条不能,所以它留在
这里。

不过写它的时候被现成的守卫拦了两次:第一版把 magi search 写成了不带参数的
裸调用(一个起不来的调用),第二是 skill 有 40 行硬预算,加进去变成 44。预算
的意思就是新规则得自己挣出行数——规则压到三行,第 5 步那个断在 "one candidate
per / call;" 的换行顺手重排,腾出一行。

验证

2641 个测试(2630 通过,11 跳过——PDF 文本层那批需要 textlayer extra,CI 不装
它,一直如此)。43 条变异用例全部会咬。

三宿主冒烟于 2026-09-01 在 Windows 11 通过:三个 dry-run 分别报 haiku /
its own default / gemini-3.7-flash-low;一次真实调用 21.0 秒,复核者驳回了
一个故意过宽的命题,把命题、推导、源三个文件逐行点名;命题落到 disputed 而
不是 refuted——驳回是留给人的问题。收工闸门先拒绝通过并说出缺的那个签名,
magi decide 之后才放行。

pipx upgrade --install magi-research

Browser buttonmagi-browser-extension-v1.2.1.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.

v2.0.1 — 核心色跟随调色板

Choose a tag to compare

@github-actions github-actions released this 31 Aug 09:52

只有一处改动,只碰 styles.css。v2.0.0 的其余内容不变。

MAGI MODE 有红·战斗与蓝·静默两套配色,三个核心(MELCHIOR / BALTHASAR /
CASPER)在两套里取值不同。有 8 处把核心色写成了字面量,于是它们在蓝色配色下
仍然显示红色配色的颜色——同一个界面上两套调色板并存。

改法按「少数服从多数」,而多数是数出来的:var(--eva-*-glow) 用了 26 处,
把同一个颜色手写成字面量的 6 处。最清楚的一票在同一条规则内部——stroke
filter 都读 token,唯独 fill 是字面量。

  • 发光改用 glow token,在红色配色下会略亮一点(0.3 / 0.18 → 0.38)。
  • 结构性取值(核心图形填充、代码块边框、终端按钮边框、氛围光晕)用
    color-mix 保留各自的透明度、只换来源,红色配色下逐位不变,只有蓝色
    配色跟上。

有意不改的

危险区仍然是红的。 .btn-danger.danger-card#danger-modal 以及
错误状态指示,在任何配色下都保持警报红——危险不该被安静配色调淡。启动动画
同样保持单一配色。

验证

红色配色下三个核心 青 / 绿 / 红,蓝色配色下 深青 / 深绿 / 深红,与两套配色的
定义完全对应,在浏览器里逐个看过。

2640 个测试,43 条变异用例全部会咬。三宿主冒烟于 2026-08-31 通过:复核者驳回
了一个故意过宽的命题,21.1 秒。

pipx upgrade --install magi-research

Browser buttonmagi-browser-extension-v1.2.1.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.

v2.0.0 — 从知识库编译器,到由人驾驶的研究状态机

Choose a tag to compare

@github-actions github-actions released this 31 Aug 09:18

MAGI v1(Wikify)把论文编译成知识库,回答「我们知道什么」。v2 同时管理
「我们还不确定什么」,并且把「agent 该怎么做」从写给 agent 看的散文,改成了
agent 绕不过去的机器。

这是一次破坏性重构。老工作区用 magi migrate 一次性转换,raw/wiki/
的字节不改写。先跑 magi migrate --dry-run:它说清会改什么,一个字节都
不写。

设计上的变化

不确定性是一等公民。 threads/ 里住着命题(有真值、有温度)、问题和研究
线,论坛式跟帖、只追加。没落定的东西不是「还没变成知识的草稿」,它本身就是
研究状态的主体。

能算出来的就不存。 magi next 不读待办列表——它从 note 里推导欠了什么。
没有第二份状态,也就没有「状态不同步」这回事。

确定性 CLI 是拘束具。 命令的存在目的是约束 agent,不是伺候它。凡是能写成
命令、闸门或测试的规则,就不留在 skill 里当散文。

记账靠近,评判远离。 状态由离它最近的人写下;质量由不共享你上下文的人
评判——magi review 刻意换一家厂商的模型,让它无法继承你的预设。

仪式性动作属于人。 关掉一条研究线(magi close)、发表(magi publish
永远由人调用。判断一个问题已经结束,正是人存在的理由。

慢环提议,人批准。 magi reflect 读真实工作的痕迹、发现模式、提议规则——
但从不自己应用。一个能改写自己规则的 agent,它的规则等于不存在。

你会直接用到的

  • magi next —— 裸 magi 等价。派生出该做什么,只提议不动手。
  • magi sync --close —— 收工闸门。有事发生却没人写下来时它拒绝通过。
  • magi ui —— 本地看板,整个环路在浏览器里也能走完。三套主题,含
    EVA「MAGI MODE」的红·战斗与蓝·静默两个警戒态。
  • magi search —— 混合检索(BM25 + 向量 + RRF),默认只搜当前项目,
    --scope all 才跨项目。
  • magi review —— 跨厂商复核。事前说要问谁、花多少,事后报本周用量;
    周预算用完拒绝启动而不是安静地少做。
  • --verbose / MAGI_DEBUG=1 —— 任何命令都认,会传给子进程。命令失败
    而说得不够时用它。

八个 skills 随包分发,magi install 装进机器上每一个探测到的 agent CLI
(Claude Code / Codex / Antigravity / opencode)。

词表

一个目录承载一个研究主题,只有一个名字:项目 / project。退役:工作区、
知识库、本库、课题、hub。

质量

2639 个测试;42 条变异用例(「把 bug 放回去」的清单,python -m tests.mutations),
全部会咬。三宿主冒烟于 2026-08-31 在 Windows 11 通过:复核者驳回了一个故意
过宽的命题并逐行点名矛盾,18.3 秒。

macOS:CI 全绿,但从未冒烟——没有 Mac 可跑。CI 矩阵是唯一能给的保证。

pipx upgrade --install magi-research

Browser buttonmagi-browser-extension-v1.2.1.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.

v1.16.3 — 关掉玻璃后半个页面还在采样背景,标题栏被美术图盖住,MAGI 卡片没有光追

Choose a tag to compare

@github-actions github-actions released this 28 Aug 11:47

补丁版。三处独立的根因,都长在「材质开关」这条路径上。

标题栏不可读是绘制顺序,不是颜色

.core-band 的计算背景是完全不透明的,画面上却透出美术图。

.app-bgposition: fixed; z-index: 0,而 .core-band静态的——定位
元素的背景排在静态块背景之上
,所以美术图直接盖在状态栏上。材质开着时它能躲过去
纯属侥幸:backdrop-filter 让它成了 stacking context,因而被提升;一关材质,提升
随之消失,美术图就压上来。

.app-bg 降到 z-index: -1。html 自身没有背景,body 的背景会传播到 canvas,所以
这一层仍在 canvas 之上、所有内容之下。

关闭清单早就过期了

html.no-glass 只点名了七个选择器。后续给 .tabs-nav.lang-toggle
.eva-hud-frame.pane-list、图谱浮层以及所有 .btn 加的材质,一个都没进这个
清单——实测「关闭」状态下仍有 12+ 个元素在采样背景。于是模糊滑块继续推着半个
页面走,另一半纹丝不动。

改成不点名的写法:--glass-scale: 4 让所有写成
rgba(<tint>, calc(k * var(--glass-scale))) 的表面越过 alpha 1 被 rgba() 钳成
不透明(在用的最小 k 是 0.28),外加一条 html.no-glass * 的 backdrop-filter 封杀。
以后新加的表面不可能再漏。

顺带两处:旧规则里的 background-image: none !important 是照 light/dark 写的(那里
高光是 background-image),但 MAGI 卡片的背景本身就是一条 linear-gradient,于是
被一起抹掉,卡片变成全透明的框浮在美术图上;同一条规则里的 filter: none 还误杀了
它的悬浮投影。高光改为在颜色停止点上关掉,不碰 background-image

两个滑块在此模式下调的是一个已经关闭的材质,现在直接禁用,而不是留着看起来能动、
实际无效。CRT 扫描线和背景选择器与材质无关,保持可用。

MAGI 卡片没有光追:background: 简写重置了 background-image

简写会重置 background-image,基础规则画的指针高光就这么被静默丢掉。整个 MAGI 主题
里只有 HUD 幸存,因为它那条规则是后写的,把高光层重新拼了一遍。
.doc-preview-side 是同一个错误。

查下来问题比表面更大:引擎追踪 10 个选择器,只有 3 个真的在画高光——
.glass-tuner-panel.doc-preview-side 压根没有高光层,模态框和 .toast 只有
固定顶光。引擎一直在为一半不存在的东西做计算。

高光提取成 --glass-specular-layer,在 :root 定义一次。之前是同一段
radial-gradient 手抄在四处——副本会漂移,而这里最要命的那份副本压根没存在过。
引擎列表与「真的在画」严格对齐:补上 .pane-list.pane-view
.glass-tuner-panel.doc-preview-side、模态框;.toast 明确移出(小、短暂、会
自动消失,固定顶光足够)。

回归测试

五条新不变量:关闭清单必须是不点名的写法;不许用 background-image: none
.app-bg 必须在静态内容之后绘制;引擎列表与 CSS 双向一致;被追踪的表面不许用
background: 简写。最后一条正是这次的 bug——以后再写简写会直接测试红。

pipx upgrade --install magi-research

Browser buttonmagi-browser-extension-v1.2.1.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.

v1.16.2 — 模糊滑块会从指针底下跳走,落点随机写进 localStorage

Choose a tag to compare

@github-actions github-actions released this 27 Aug 17:40

补丁版。修的是 v1.16.0 自己引入的一条,v1.16.1 没看见。

症状

反复发现 magi-glass-blur 里出现没人选过的值(2、5、7 各一次)。复现出来是这样:

新加载,什么都没存        slider=22   stored=null
拖到 14                  slider=14   stored=14
拖到 12                  slider=12   stored=12
拖到 10                  slider=22 ← 跳了    stored=10
拖到 9                   slider=9    stored=9

拖到 10 的瞬间,滑块自己跳到 22。

成因

三件事叠在一起:

  1. GLASS_DEFAULTS.blur = 10 被当成「没有覆盖」的哨兵值——等于 10 就
    removeProperty,让 CSS 的主题默认值生效。
  2. 但每个主题的 CSS --glass-blur 都不一样:light 20、dark 22、MAGI 蓝 10。
  3. v1.16.0 为了让读数别撒谎(静止时显示 10px 而面板实际在模糊 22px),把计算
    值写回了 slider.value

于是在 dark 下拖到 10,代码立刻把滑块设成 22——旋钮从指针底下跑掉了。真实拖
动时,下一次指针移动是相对跳走后的位置计算的,落点就是随机的。

顺带一处早于此的问题:「重置」写的是 "10" 而不是删除键,所以重置之后键永
远留着,把模糊钉死在滑块默认值上,主题自己的值再也回不来。

修法

哨兵彻底去掉。未设置 = 用主题的 CSS 值;存了就是显式覆盖。没有任何一个滑块位
置是特殊的。

  • glassSetting 未设置时返回 null 而不是硬编码回退值——只有这样才能区分「没设
    过」和「刚好设成了默认值」
  • 「重置」改为删除键
  • 主题切换后刷新读数,否则切完仍显示上一个主题的默认值

修好后:

拖到 10          slider=10   stored=10    卡片模糊=10
重置             slider=22   stored=null  卡片模糊=22
主题切到 light   slider=20   label=20px   卡片模糊=20

回归测试锁住了这个不变量:滑块默认值不得用作哨兵,重置必须删键而不是写值。

pipx upgrade --install magi-research

Browser buttonmagi-browser-extension-v1.2.1.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.