Releases: Misaka16384/magi
Release list
v2.5.0 — 复核默认强档、四值判决,证据必须在项目内
一天真实研究使用送回的两批反馈,全部落地。数据先于口味:同一批命题上,便宜档十二次判决放过了
全部四处实质错误并报出它没读过的行号,强档找到了唯一一处真正的证明缺口。
复核
- 周预算取消。 账本
output/llm-ledger.jsonl照记(host、model、effort、tier、耗时、成败),
唯一的拒绝是research.llm_calls: false。config.yaml里的weekly_calls不再被读。 - 默认强档。 claude →
opus+ effort high,agy →gemini-3.8-flash-high,codex → 自己的默认 + high。
便宜档保留为--model haiku这类点名选项;帖子签名写明 host · model · effort · tier,只被便宜档
看过的命题在magi next与sync --close里单列。 - 四值判决。
stands/restate/refuted/unclear。restate(结论成立、文字须改)把命题退回
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 时,
next、sync --close、review三处提示。· 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 tools(magi init现在会建)。 - 复核默认变强档、变贵:想省,写
research.review_model: haiku(或对应宿主的便宜模型)。 - 三宿主冒烟:claude / codex / antigravity dry-run 均正确;agy
gemini-3.8-flash-high真调用 65 s
回restate,逐行点名量词写宽,并自行跑了tools/下两个脚本核数。
pipx upgrade --install magi-researchBrowser button — magi-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 — 第一次真实接管跑出来的账
一个科研会话拿 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>里装的是第一个小标题 ——Abstract、1Introduction - 按词边界截断,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 都是零命中。
以及长命令不要管道给 tail:magi 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-researchBrowser button — magi-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 — 交接、闸门,和一次审计复核
这一版起于两个问题:一个空目录之外的文件夹怎么进 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.md被uninstall删掉。.cmd宿主不是崩溃,是静默截断——回显首参数的.cmd收到三行字符串,
打出ARG1=[line one],退出码 0。npm 装的宿主会拿到评审提示词的第一行然后
信心十足地作答。
其余属实并已修:竞态分支自己的 TypeError;executescript 先提交导致失败的
重建把图谱清空;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-researchBrowser button — magi-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 — 接管已有的研究文件夹
一个已经堆了半年材料的文件夹怎么进 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.md 和 README.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-researchBrowser button — magi-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 — 让两侧看到同一份东西
这一版起于一次真实的文献雷达跑:五篇自有论文做我方论文,一个全新项目,一路
走完收割、分诊、引文缺口。判定标准只有一条——程序造成的「不同的人看到不同
的东西」要修;同一份信息下的判断差异不算 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 真的在跑它声称跑的东西
textlayerextra 现在装上了。 它声明了、两个 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-researchBrowser button — magi-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 — 逐条判定,不要把上一条的推理当依据
只改一个文件: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-researchBrowser button — magi-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 — 核心色跟随调色板
只有一处改动,只碰 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-researchBrowser button — magi-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 — 从知识库编译器,到由人驾驶的研究状态机
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-researchBrowser button — magi-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 卡片没有光追
补丁版。三处独立的根因,都长在「材质开关」这条路径上。
标题栏不可读是绘制顺序,不是颜色
.core-band 的计算背景是完全不透明的,画面上却透出美术图。
.app-bg 是 position: 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-researchBrowser button — magi-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
补丁版。修的是 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。
成因
三件事叠在一起:
GLASS_DEFAULTS.blur = 10被当成「没有覆盖」的哨兵值——等于 10 就
removeProperty,让 CSS 的主题默认值生效。- 但每个主题的 CSS
--glass-blur都不一样:light 20、dark 22、MAGI 蓝 10。 - 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-researchBrowser button — magi-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.