过去几周,我一直纠结于一个问题:如果假设模型最终会比编写 harness 的人更聪明,那么一个 agent 的 harness 会是什么样子?

我使用的每个 agent(我使用了很多)都有相同的形态。其他人决定了循环、工具、内存如何压缩、何时请求权限。这在模型是系统弱点的情况下没问题,但当模型发现它的压缩总是丢弃它需要的精确类型签名时,它只能想方设法规避。每次会话都如此。

于是我构建了 INIT。agent 可以修改任何关于自己的内容:系统提示、技能、新工具(作为 Wasm 组件)以及其自身的编译核心和循环。

我最兴奋的部分是热加载。Rust 没有稳定的 ABI,所以不能简单地使用 dlopen 加载新版本的自己。相反,内核构建新体,与旧版本并行启动,探测它,在步骤边界暂停旧版本并将相同的对话交给新进程。如果新版本启动时崩溃,旧版本从未停止,因此什么也不会发生。此外,有一个门限要求新版本证明它仍然能够自我修改。自修改系统中最可怕的 bug 是一种改动在今天看起来没问题,却悄然破坏了明天改变的能力。

相反的面向是 Root。它体积小,刻意简陋,agent 不能直接写入它:密钥、沙箱(macOS Seatbelt;agent 甚至不能打开 TCP 套接字,模型调用只能通过 Root),一个 Ed25519 签名的日志记录每一次变更,APFS 快照,以及回滚按钮。

我在如何限制自我改动上反复权衡,最终确定了两种模式。Gated 模式会走完全套验证,包括一套该 agent 永远看不到的保留测试集。Free 模式是我真正相信的,完全没有基准验证:只要改动能编译、启动且可以回滚,就会被接受;随后一个笨拙的统计守卫监控通用伤害(崩溃、错误激增、我手动停止或撤销)并在触发时回滚整个系统。我的理由是:智能模型最想要的改进,正是提前无法用奖励函数衡量的那些。

昨晚我让它生成子 agent,而 v0.2 还没有这个功能。它为自己写了一个委托工具(嵌套循环、全新上下文、 capped 迭代、无递归),重新生成了自己的自我映射,并且 304 项测试全部通过。随后它自己的 Root 停止了它,因为我的磁盘在楼下掉了(我的错,我同时运行了 Docker 和两个构建)。它明确说明了阻塞的原因,并询问我该怎么做。 honestly 那一刻比我原本计划的任何东西都更让我认同这个设计。

(随后 promote 因我自己的发布包在测试环境中的 bug 而失败,我正在修复它。恰如其分,我猜。)

老实说,因为我宁愿让你直接听我本人的解释:

我目前没有证据表明自我进化能让小模型变得更好。我唯一的封闭测试结果在噪声范围内,当我尝试构建因缺少机制导致 INIT 失败的任务时,同一小模型上已知的 agent 也同样失败。小模型的瓶颈就是模型本身。只有在强模型上才会有回报,这正是我希望别人去尝试的地方。

另外:目前仅支持 macOS(Linux 非常接近)。我只在 DeepSeek 上实际测试过提供商,其他提供商都是实验性的。消费是按使用量计费,而非封顶,请在提供商处设置限额。

Apache-2.0 许可证,大约 20 万行 Rust 代码,安装约 30 秒且不依赖 Rust(如果想让它能重写其核心则需要 Rust):
https://github.com/nagisanzenin/INIT-Agent

我希望得到关于以下三点的反馈:Root 与 agent 的分离、奖励-free 入口的概念、以及是否有人在别处见过重叠 handoff 这一技巧。如果你破坏了它,请告诉我具体如何破坏的。