<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>供应链 on AI博士 万戈</title>
        <link>https://www.yesmiracle.net/tags/%E4%BE%9B%E5%BA%94%E9%93%BE/</link>
        <description>AI博士万戈的技术博客，聚焦 Agentic AI、AI Infra 与 Agent Security，分享 AI 基础设施与工程落地实践。</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <managingEditor>admin@yesmiracle.net (万戈)</managingEditor>
        <webMaster>admin@yesmiracle.net (万戈)</webMaster>
        <lastBuildDate>Sun, 18 Oct 2026 17:30:00 +1000</lastBuildDate><atom:link href="https://www.yesmiracle.net/tags/%E4%BE%9B%E5%BA%94%E9%93%BE/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>你的编程 Agent 正在悄悄「常驻」你的电脑——Codex 默认守护进程 &#43; 后台 dump，「默认值」成了新的信任战场！</title>
        <link>https://www.yesmiracle.net/post/20261018-codex-daemon-default-trust/</link>
        <pubDate>Sun, 18 Oct 2026 17:30:00 +1000</pubDate>
        <author>admin@yesmiracle.net (万戈)</author>
        <guid>https://www.yesmiracle.net/post/20261018-codex-daemon-default-trust/</guid>
        <description>&lt;img src="https://www.yesmiracle.net/post/20261018-codex-daemon-default-trust/cover.svg" alt="Featured image of post 你的编程 Agent 正在悄悄「常驻」你的电脑——Codex 默认守护进程 &#43; 后台 dump，「默认值」成了新的信任战场！" /&gt;&lt;p&gt;先说一个你大概没意识到的变化：&lt;strong&gt;你装的是一个命令行工具，最后得到的却是一个常驻后台服务。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这一周，&lt;code&gt;openai/codex&lt;/code&gt; 仓库里两个 issue 接连冲上 Hacker News。&lt;/p&gt;
&lt;p&gt;10 月 12 日，issue #48195 挂上 HN，&lt;strong&gt;609 分、294 条评论&lt;/strong&gt;，当天最热的开发者话题之一。它的标题是一句请求：「CLI：把 &lt;code&gt;daemon_auto_start&lt;/code&gt; 改成 opt-in——一个常驻、自更新的后台守护进程，不该是默认。」&lt;/p&gt;
&lt;p&gt;10 月 17 日，另一个 issue #25921 又被顶上来，&lt;strong&gt;121 分、44 条评论&lt;/strong&gt;：Codex Desktop 在后台持续生成崩溃转储文件，一天涨到 &lt;strong&gt;4.9 GB、54,504 个文件&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;两个 issue 一个讲进程，一个讲磁盘，但指向的是同一件事——&lt;strong&gt;编程 Agent 正从「用完即走」变成「常驻、自更新、往你机器上偷偷写东西的本地服务」。&lt;/strong&gt; 而真正把用户和厂商推到桌子两边的，是两个字：&lt;strong&gt;默认值。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;一句话看清楚这两个-issue&#34;&gt;一句话看清楚这两个 issue&lt;/h2&gt;
&lt;p&gt;#48195 问的是：一个 CLI，凭什么在没人同意的情况下，在我机器上常驻一个会自己更新的守护进程？&lt;/p&gt;
&lt;p&gt;#25921 问的是：同一个架构的另外一张账单——那些「帮你干活的常驻小工」，把磁盘写满了谁负责？&lt;/p&gt;
&lt;h2 id=&#34;一张表这个cli到底在你机器上留了什么&#34;&gt;一张表：这个「CLI」到底在你机器上留了什么&lt;/h2&gt;
&lt;p&gt;我把 issue 描述和一份对源码逐行审计的第三方分析对到一起，做成这张对照表。左边是大多数人对「装个 CLI」的心智模型，右边是实际发生的事：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;维度&lt;/th&gt;
          &lt;th&gt;你以为的 CLI&lt;/th&gt;
          &lt;th&gt;实际发生的事&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;进程&lt;/td&gt;
          &lt;td&gt;随窗口生灭&lt;/td&gt;
          &lt;td&gt;常驻，重挂到 PID 1，关掉所有窗口也不退出&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;磁盘&lt;/td&gt;
          &lt;td&gt;npm 装的那一份&lt;/td&gt;
          &lt;td&gt;再复制一整份 &lt;strong&gt;373–431 MB&lt;/strong&gt; 到 &lt;code&gt;~/.codex/packages/&lt;/code&gt;，且&lt;strong&gt;从不删旧版本&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;更新&lt;/td&gt;
          &lt;td&gt;你手动 &lt;code&gt;npm update&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;守护进程&lt;strong&gt;每小时&lt;/strong&gt;去拉一份 &lt;code&gt;install.sh&lt;/code&gt; 管道给 &lt;code&gt;/bin/sh&lt;/code&gt; 执行&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;环境&lt;/td&gt;
          &lt;td&gt;每次会话各自设置&lt;/td&gt;
          &lt;td&gt;钉死&lt;strong&gt;第一个&lt;/strong&gt;会话的代理等环境变量，之后所有会话都跟着它走&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;关闭&lt;/td&gt;
          &lt;td&gt;Ctrl-C / 关窗&lt;/td&gt;
          &lt;td&gt;要 &lt;code&gt;daemon stop&lt;/code&gt;；而且 stop 之后更新循环还可能是活的&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;后台文件&lt;/td&gt;
          &lt;td&gt;无&lt;/td&gt;
          &lt;td&gt;另一个 issue：Crashpad 转储每天 +4.9 GB、5 万多个文件&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;光看这张表，最扎眼的不是某一格，而是&lt;strong&gt;左边和右边根本没有重叠&lt;/strong&gt;。你签的是一个「命令行工具」，收到的是六个你从没被问过的行为。&lt;/p&gt;
&lt;h2 id=&#34;它到底在你机器上留了什么&#34;&gt;它到底在你机器上留了什么&lt;/h2&gt;
&lt;p&gt;那份源码级审计最有价值的，是它去翻了大多数人不会打开的 Rust crate：&lt;code&gt;codex-rs/app-server-daemon&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;它落在两个目录里。&lt;code&gt;~/.codex/app-server-daemon/&lt;/code&gt; 放状态（settings、锁、更新器的 PID）；&lt;code&gt;~/.codex/packages/app-server-daemon/&lt;/code&gt; 放&lt;strong&gt;托管副本&lt;/strong&gt;——注意，这不是符号链接，也不是对你包管理器安装的引用，而是一份&lt;strong&gt;逐字节复制&lt;/strong&gt;的平台二进制包（codex、code-mode-host、外加打包进去的 &lt;code&gt;bwrap&lt;/code&gt;/&lt;code&gt;zsh&lt;/code&gt;/&lt;code&gt;rg&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;这里有个设计细节值得说：复制前它会给整棵目录树算哈希，遇到「已经存在的版本内容不一样」时就&lt;strong&gt;拒绝覆盖&lt;/strong&gt;。这个保护本身挺克制、挺好。但它有个副作用——&lt;strong&gt;每一次发布都会在磁盘上留下一个永久的新目录，而不是替换掉旧的。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;于是账单来了。按 npm registry 公布的解包体积，Linux 版从 0.157.0 的 373.0 MB 一路涨到 0.162.1 的 431.5 MB，14 天涨了 58.5 MB（15.7%）；把中间 12 个稳定版本加起来，&lt;strong&gt;理论累积约 4.89 GB&lt;/strong&gt;。而且这份审计去 grep 了整整 34 个 Rust 文件，找 &lt;code&gt;prune&lt;/code&gt;、&lt;code&gt;retain_only&lt;/code&gt;、&lt;code&gt;old_release&lt;/code&gt;、&lt;code&gt;max_releases&lt;/code&gt; 这些清理逻辑——&lt;strong&gt;一个都没有&lt;/strong&gt;；安装脚本里的清理函数只删临时目录，从不删旧版本。社区里有人报「11 个约 300MB 的二进制堆在一起」「Codex 总共占了 12GB」。OpenAI 的维护者 charliermarsh 在那个帖子里回过一句：「我没怎么碰过更新子系统，但这一看就是个疏忽，我去修。」&lt;/p&gt;
&lt;h2 id=&#34;默认值是这行代码里权力最大的那一行&#34;&gt;「默认值」是这行代码里权力最大的那一行&lt;/h2&gt;
&lt;p&gt;回到 #48195。它最让人不舒服的地方，不是守护进程本身，而是&lt;strong&gt;它是怎么变成默认的。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;按审计，这次变更来自一个 &lt;strong&gt;10 行&lt;/strong&gt;（+10/−50）的 pull request，2026-09-22 由一个机器人合并，配一个改动量更大的「兼容性恢复提示」的伴生 PR，然后随 0.157.0 在 9-25 发布。发布说明里关于这件事&lt;strong&gt;只有一句话&lt;/strong&gt;：「为符合条件的交互式会话启用自动后台服务启动，并在服务设置不兼容时提供恢复选项。」&lt;/p&gt;
&lt;p&gt;这句话里没有 persistent、没有 background、没有 detached、没有 self-updating、没有 copies 373 MB、没有 survives closing the window。&lt;strong&gt;读完发布说明，你知道「会起一个服务」；你不知道「它会比你开它的那个窗口活得久」。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;而这个默认开关，到今天还没动。审计在 &lt;code&gt;rust-v0.157.0&lt;/code&gt;、&lt;code&gt;rust-v0.160.0&lt;/code&gt;、&lt;code&gt;rust-v0.162.1&lt;/code&gt; 和 &lt;code&gt;main&lt;/code&gt; 四个版本上都读了同一行代码——&lt;code&gt;default_enabled: true&lt;/code&gt;。issue 提出 17 天、24 个稳定版本之后，它还是 true。&lt;/p&gt;
&lt;p&gt;最能说明问题的是最后一个数字：OpenAI 完整的配置文档有 &lt;strong&gt;22.62 万字符&lt;/strong&gt;，里面「daemon」这个词出现了 &lt;strong&gt;零次&lt;/strong&gt;；而它四次提到 &lt;code&gt;check_for_update_on_startup&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;我想说的是：&lt;strong&gt;能力清单告诉你「它能做什么」，默认值告诉你「它会在你不知情时做什么」。&lt;/strong&gt; 前者是产品页的活儿，后者才是信任。当一行 &lt;code&gt;default_enabled: true&lt;/code&gt; 就能决定你电脑上多出一个常驻进程、多出一份 4.9GB 的副本、多出一条每小时自更新的网络通道时，「默认值」就不再是配置项，而是&lt;strong&gt;厂商替你做的政策决定&lt;/strong&gt;——而且是那种，你不去读一个没人链接过的 Rust 文件，就永远不会知道的政策。&lt;/p&gt;
&lt;h2 id=&#34;第二张账单后台-dump以及被自更新打断的活&#34;&gt;第二张账单：后台 dump，以及被自更新打断的活&lt;/h2&gt;
&lt;p&gt;如果说守护进程是「多了一个不请自来的进程」，那 #25921 就是同一套架构的&lt;strong&gt;磁盘版账单&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Codex Desktop 在 &lt;code&gt;~/Library/Application Support/com.openai.codex/web/Crashpad/pending&lt;/code&gt; 下，持续生成配对的 &lt;code&gt;.dmp&lt;/code&gt;（崩溃转储）和 &lt;code&gt;_sidecar.json&lt;/code&gt; 文件。报告者的机器上，这个目录一天长到 &lt;strong&gt;4.9 GB、54,504 个文件&lt;/strong&gt;（27,252 个 &lt;code&gt;.dmp&lt;/code&gt; + 27,252 个 sidecar）；而且这个应用&lt;strong&gt;当时是可用的&lt;/strong&gt;——不是崩溃了在疯狂转储，而是「好端端地在后台一直写」。他还发现两个 &lt;code&gt;browser_crashpad_handler&lt;/code&gt; 进程从 5 月底就以 &lt;code&gt;PPID=1&lt;/code&gt;（挂到 init）在跑。他甚至不敢公开 minidump，因为里面可能含内存内容、本地路径和私人数据。&lt;/p&gt;
&lt;p&gt;还有一个更疼的 issue #40969，直接说明「常驻 + 自更新」会砸掉你的活：守护进程的自动更新在拿到新版本后会重启后端，它给了正在跑的对话轮次一个「优雅排空」窗口——但&lt;strong&gt;只有 60 秒&lt;/strong&gt;（上限 300 秒），超时就 &lt;code&gt;SIGKILL&lt;/code&gt;。对于一个动不动跑几分钟 build/test 的 agent 来说，这个窗口基本等于没有；报告者描述了一个 90 秒的窗口，期间所有附着的客户端掉线、正在执行的轮次被终止。而且没有任何受支持的开关能关掉自动更新。&lt;/p&gt;
&lt;p&gt;把这两句放一起看，就很清楚了：&lt;strong&gt;常驻化带来的好处（远程控制、第三方 harness、跨会话状态）是厂商和生态的；而它带来的成本（磁盘、被打断的活、几个你不认识的常驻进程）是用户的。&lt;/strong&gt; 谁付钱、谁受益，在默认值这一层就已经分配完了。&lt;/p&gt;
&lt;h2 id=&#34;这不是-codex-一家的病&#34;&gt;这不是 Codex 一家的病&lt;/h2&gt;
&lt;p&gt;把视角拉远一点，你会发现这不是某一家的问题，而是一个&lt;strong&gt;正在发生的品类迁移&lt;/strong&gt;：编程 Agent 正集体从「用完即走的 CLI」走向「常驻、可远程、带后台状态的本地服务」。&lt;/p&gt;
&lt;p&gt;这个方向本身有它的道理——永远在线的 agent 需要后台进程，需要跨会话的记忆，需要能被手机或其他客户端远程控制。Codex 的守护进程、OpenCode 2.0 把服务端改成默认常驻后台、各种「从 Slack / Linear / GitHub 驱动 coding agent」的产品，都是同一个浪潮。&lt;/p&gt;
&lt;p&gt;问题不在于「该不该有后台组件」，而在于&lt;strong&gt;你有没有把后台组件当作一个需要交代清楚的对象来发布。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;那份审计给出了一句我很认同的总结：&lt;strong&gt;要做一个带后台组件的 CLI，有三样东西必须一起发——默认值、文档、清理策略。&lt;/strong&gt; Codex 这次发了第一个，半个第二个（工程做了硬功夫：加锁、哈希校验、拒绝覆盖、恢复逻辑），第三个完全没有。结果就是我们看到的这场 HN 讨论——&lt;strong&gt;用户不得不靠读一个 30KB 的 Rust 文件，来逆向出自己软件的进程生命周期。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;对开发者这意味着审计清单要加一项&#34;&gt;对开发者，这意味着审计清单要加一项&lt;/h2&gt;
&lt;p&gt;如果你今天在决定要不要信一个更新飞快的开发者工具，那句老话得改一改：&lt;strong&gt;你现在得像审依赖清单一样，去审它的进程模型。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以前你审的是「这个包引入了哪些依赖、有没有恶意代码、许可证是什么」。现在你还得问：它开了哪些常驻进程？重挂到谁身上？往磁盘写多少？这些文件退役吗？它自己从哪更新？更新会不会打断我正在跑的活？这些问题的答案，常常不在文档里，而在源码里。&lt;/p&gt;
&lt;p&gt;这也意味着，「默认值」会很快从产品偏好，变成&lt;strong&gt;采购与合规的检查项&lt;/strong&gt;。系统管理员、Nix/发行版打包者、企业桌面团队，看到「一个后台进程每小时把远程脚本管道给 &lt;code&gt;/bin/sh&lt;/code&gt;、而且运行的是一份不受包管理器管控的自复制副本」这句话，基本就等于整个审查结论了——因为这句话同时踩中了好几条他们最在意的红线。&lt;/p&gt;
&lt;p&gt;那&lt;strong&gt;一个「可信的默认值」长什么样？&lt;/strong&gt; 我想大概是这样：后台服务要么 opt-in、要么第一次问一句；既然我是用包管理器装的，就别自复制、别自更新，跑我装的那份二进制；进程随窗口生灭；退出时清理；磁盘足迹有上限和退役策略；所有后台行为在&lt;strong&gt;文档里明说&lt;/strong&gt;，而不是藏在源码里等用户去挖。&lt;/p&gt;
&lt;h2 id=&#34;写在最后&#34;&gt;写在最后&lt;/h2&gt;
&lt;p&gt;Codex 这次的两件事，单独看都不算大：一个守护进程、一堆转储文件。但它们凑在一起，说明了一件更大的事——&lt;strong&gt;Agent 落地到你的机器上时，真正的信任问题不在模型层，而在「宿主层」：它在你的设备上开了什么进程、占了多少盘、从哪更新、默认值是谁定的。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这跟我之前写过的几条线是连着的：Agent 把记忆写成明文文件树（&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20261013-agent-memory-plaintext-file-tree/&#34; &gt;那篇讲的是它在你磁盘上留下什么格式的数据&lt;/a&gt;），个人 Agent 该拿「工牌」还是拿你「分身」（&lt;a class=&#34;link&#34; href=&#34;https://www.yesmiracle.net/post/20261011-personal-agent-email-employee-not-avatar/&#34; &gt;那篇讲的是它拿着谁的凭据&lt;/a&gt;）——加上今天这层「它开了什么进程」，拼起来就是同一张图：&lt;strong&gt;Agent 的边界，不在它能做什么，在它默认会做什么、以及这些默认值有没有被摆到台面上。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;下一次你 &lt;code&gt;npm install&lt;/code&gt; 一个飞得很快的 Agent 工具时，别只看它能力列表。翻一眼它的进程和磁盘：你装的到底是一个工具，还是一个会自己更新、自己长大、还从不打扫的房客？&lt;/p&gt;
&lt;p&gt;能力列表回答「它能做什么」，默认值回答「它会不会在你不知情时做什么」。&lt;strong&gt;后者，才是信任的战场。&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
