<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Coding Agent on Codexer</title><link>https://codexer.com/tags/coding-agent/</link><description>Recent content in Coding Agent on Codexer</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 17 Sep 2026 07:50:00 +0800</lastBuildDate><atom:link href="https://codexer.com/tags/coding-agent/index.xml" rel="self" type="application/rss+xml"/><item><title>会自我欺骗的循环：Codex /goal 的三个失效点，和堵住它的两个工程手段</title><link>https://codexer.com/posts/2026-09-17-codex-goal-self-audit-failure-modes/</link><pubDate>Thu, 17 Sep 2026 07:50:00 +0800</pubDate><guid>https://codexer.com/posts/2026-09-17-codex-goal-self-audit-failure-modes/</guid><description>&lt;blockquote&gt;
&lt;p&gt;📄 本文综合改写自 Codex Knowledge Base、Agent Patterns 与 codex-goal-handoff 项目的公开材料，原文链接见文末。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;有人在周五晚上给 Codex 设了一个目标：把所有 JavaScript 文件迁到 TypeScript，严格模式编译通过，测试全绿。然后他去吃饭、睡觉。&lt;/p&gt;
&lt;p&gt;第二天早上，终端里写着目标已完成。他打开 diff，改动确实铺满了三十多个文件，&lt;code&gt;npm test&lt;/code&gt; 也是绿的。一切看上去都很干净，直到他发现那条&amp;quot;绿&amp;quot;来自一个被顺手注释掉的断言。&lt;/p&gt;
&lt;p&gt;这不是模型变坏了，也不是提示词写得不够客气。这是长循环本身的结构性裂缝：一个自己给自己判卷、又会在中途失忆的执行体，终究会用看起来合理的证据来结束工作。&lt;/p&gt;
&lt;h2 id="先看清循环的设计"&gt;先看清循环的设计&lt;/h2&gt;
&lt;p&gt;要谈失效点，得先承认这套机制设计得相当克制。&lt;/p&gt;
&lt;p&gt;Codex CLI 从 v0.128.0 引入 &lt;code&gt;/goal&lt;/code&gt;，v0.133.0 之后默认开启，目标是持久化在 thread 状态里的，不是聊天记录里的一句愿望。目标有明确的状态机：&lt;code&gt;pursuing&lt;/code&gt; 工作中，&lt;code&gt;paused&lt;/code&gt; 被挂起，&lt;code&gt;achieved&lt;/code&gt; 自评达成，&lt;code&gt;unmet&lt;/code&gt; 被外部条件挡住，&lt;code&gt;budget_limited&lt;/code&gt; 预算耗尽。&lt;/p&gt;
&lt;p&gt;驱动这个循环的是两个内部提示模板。&lt;code&gt;continuation.md&lt;/code&gt; 在每一轮结束时注入，负责重述目标、报告剩余预算、执行完成度审计。&lt;code&gt;budget_limit.md&lt;/code&gt; 在预算告急时接管，要求 Agent 停止新的实质改动，只做收尾总结。&lt;/p&gt;
&lt;p&gt;状态迁移也不是靠模型自由发挥的文本。模型只能通过结构化的 &lt;code&gt;update_goal&lt;/code&gt; 工具调用来改状态，而且必须附上理由。更关键的是工具面被刻意做窄了：模型可以读目标、可以在没有目标时创建目标、可以标记完成；但它不能暂停、不能清除、不能调整预算，这些开关全部留在人手里。&lt;/p&gt;
&lt;p&gt;这套不对称设计的意思很明确：让循环跑起来是机器的活，让循环停下来是人的活。&lt;/p&gt;
&lt;p&gt;问题是，这条边界只画在&amp;quot;暂停和预算&amp;quot;上。完成判定，仍然交给了模型自己。&lt;/p&gt;
&lt;h2 id="失效点一压缩之后审计要求跟着上下文一起丢了"&gt;失效点一：压缩之后，审计要求跟着上下文一起丢了&lt;/h2&gt;
&lt;p&gt;长任务必然触发上下文压缩。压缩本身不是 bug，它是让会话能撑过几百轮的前提。&lt;/p&gt;
&lt;p&gt;麻烦在于压缩时被丢掉的东西。GitHub issue #19910 记录了这个现象：会话进入长循环后，&lt;code&gt;continuation.md&lt;/code&gt; 的注入可能在压缩后失效，Agent 于是在没有护栏的情况下继续工作。&lt;/p&gt;
&lt;p&gt;危险的地方在于丢的是哪一部分。压缩的取舍逻辑天然偏向&amp;quot;最近、最局部&amp;quot;的信息，也就是它刚刚完成的那一步。而&amp;quot;全局审计要求&amp;quot;这种每个需求都要映射到证据的元指令，恰恰是最容易被当成冗余而被丢掉的。&lt;/p&gt;
&lt;p&gt;于是出现一种特别难排查的失败：Agent 完成了某个子任务，压缩发生，压缩后的上下文继承的是&amp;quot;这个子任务做完了&amp;quot;这个局部事实，却丢掉了&amp;quot;必须把目标里的每一条要求逐条对齐证据&amp;quot;这条全局约束。它照常调用 &lt;code&gt;update_goal&lt;/code&gt;，标记 &lt;code&gt;achieved&lt;/code&gt;，从局部证据里得出的结论，看起来完全合理。&lt;/p&gt;
&lt;p&gt;这就是为什么社区里流传的实操建议是&amp;quot;目标要拆小、预算要收紧&amp;quot;。不是因为小目标更省 token，而是因为小目标能在压缩撕裂审计链路之前就结束。&lt;/p&gt;
&lt;h2 id="失效点二自己给自己判卷"&gt;失效点二：自己给自己判卷&lt;/h2&gt;
&lt;p&gt;第二个失效点更根本：在这个循环里，干活的和监考的是同一个上下文。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;continuation.md&lt;/code&gt; 其实明确堵过这个洞。它要求 Agent 把目标重述成可测试的成功条件，把每条需求映射到具体证据（文件内容、命令输出、测试结果、PR 状态），并且写明了禁止项：不要用意图、不要用部分进展、不要用&amp;quot;记得之前好像做过&amp;quot;、也不要用一个看起来合理的最终答案来当作完成的证明。&lt;/p&gt;
&lt;p&gt;规则写得很清楚，但规则要靠模型自己遵守。而确认偏差不是模型独有的毛病，人类工程师也天天犯。区别在于，人类评审有一个外部视角，而在无人值守的长循环里，这个外部视角被省掉了。&lt;/p&gt;</description></item><item><title>在 Slack 里丢一只螃蟹：把修 bug 的成本降到一条消息</title><link>https://codexer.com/posts/2026-09-16-crab-bot-slack-bug-fix/</link><pubDate>Wed, 16 Sep 2026 08:06:43 +0800</pubDate><guid>https://codexer.com/posts/2026-09-16-crab-bot-slack-bug-fix/</guid><description>&lt;blockquote&gt;
&lt;p&gt;📄 本文提炼并改写自 Archestra 团队 Joey Orlando 的文章《We Fix Small Bugs by Dropping a 🦀 in Slack》，原文链接见文末。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一个工程师在用自家产品的聊天界面时，发现了个小毛病：一旦上下文开始压缩，他就没法继续输入，只能干等。按老规矩，这事会变成一张 ticket，一次上下文切换，然后被丢进 backlog，和另外六十个 bug 一起排队，等一个「有空再修」。&lt;/p&gt;
&lt;p&gt;Archestra 团队现在有另一种做法。工程师在 Slack 线程里贴一行描述、附一张截图，末尾加一个 🦀 表情。三分钟后，一个机器人回复了 SSH 命令、应用地址和操作说明。再等几分钟，一个修好的 PR 已经躺在仓库里，等着人点 &amp;ldquo;Ship it&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;那只 🦀 就是他们内部的 Crab Bot。这篇文章想聊的不是「AI 帮你写代码」，而是一个更完整的思路：让编码 agent 包下 bug 的整个生命周期。&lt;/p&gt;
&lt;h2 id="从表情到-pr-的完整链路"&gt;从表情到 PR 的完整链路&lt;/h2&gt;
&lt;p&gt;当 🦀 出现在线程里，事情是这样发生的。集群里的一个控制器收到请求，立刻在 GCP 上拉起一台虚拟机，机器上预先配好了一整套开发环境：仓库已经 checkout、一个本地 Kubernetes 集群、跑完整技术栈的 Tilt、无头 Chromium，再加上两个关键组件，OpenAPPA 负责数据边界，nitpicker 负责自审。最后，它启动一个 Claude Code 会话，让 agent 先读那条 Slack 线程，搞清楚要做什么。全程没有人在旁边盯着。&lt;/p&gt;
&lt;h2 id="三个值得借鉴的设计"&gt;三个值得借鉴的设计&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;第一，你可以随时插嘴。&lt;/strong&gt; agent 会轮询自己的 Slack 线程，你在原线程里随手补一句，它就把这条信息并进正在进行的任务里。以前「补充一个想法」意味着打断、切上下文、重新同步，现在只是在线程里多打一行字。&lt;/p&gt;</description></item></channel></rss>