让AI编程Agent记住“被否决的方案”:一个开源工具的实践与反思

开发者构建cogit记录Agent决策上下文,发现被否决选项比已决定选项更值得保留。
文章讲述一位开发者同时运行多个Claude Code Agent跨项目开发时,发现代码可通过版本控制延续,但决策推理尤其是被否决的选项会随会话结束而丢失,导致新会话重复提议已放弃方案。为此他构建了开源工具cogit,通过Claude Code hooks捕获消息、用小模型生成摘要、并在commit message中回链消息记录,在Agent编辑文件前提示该文件历史上的否决选项。他最重要的发现是被否决的选项比已决定的更有记录价值,因为决策已体现在代码中而被否决项不会。cogit也存在摘要准确性不足(抽查20条有6条错误)和按文件提示范围过窄两个局限。
同时运行5到10个Claude Code Agent跨多个项目开发,代码能在会话间存活,但推理过程却不行——为什么选择某个方案、否决了什么、先试了什么,全都留在没人会重开的聊天记录里。一位开发者因此频繁遇到新会话重新提议已被否决方案的情况,甚至无法解释代码为何是现在这个样子。他为此构建了一个名为cogit的开源工具,并分享了过程中的关键发现。

问题根源:代码可延续,决策上下文却丢失
在多Agent并行开发的场景下,代码本身通过版本控制得以延续,但每个决策背后的推理——尤其是那些被明确否决的选项——却没有被任何机制保留下来。新启动的Agent会话没有历史记忆,只能基于当前代码状态重新推理,于是很容易再次提出团队早已讨论并放弃的方向。
这位开发者指出,更麻烦的是,当代码呈现出某种特定结构时,他自己也常常说不清原因。决策上下文丢失不仅导致重复劳动,还削弱了人对代码库的理解与控制。
cogit如何工作:从消息捕获到提交关联
cogit的设计思路是记录开发者发送给Agent的每条消息,提取其中的决策与被否决项,并将其与最终产生的代码提交关联起来。具体机制包含三个环节:
- 通过Claude Code hooks捕获每条消息;
- 用一个小模型为消息生成简短摘要;
- 在每条commit message中写入一行,指回对应的消息记录。
在实际生效方式上,当Agent准备编辑某个文件之前,它会收到一条简短提示,列出该文件此前已被否决的选项。这样新会话在动手之前就能避开已知的“死胡同”。
Claude Code hooks 是 Anthropic 官方 CLI 工具 Claude Code 提供的事件钩子机制。开发者可以在配置文件(如 .claude/settings.json)中注册在特定生命周期节点触发的命令,例如用户提交消息(user-prompt-submit)、工具调用前后(pre-tool-use/post-tool-use)、会话开始或结束等。钩子脚本会接收到包含当前消息、会话 ID、工作目录等信息的 JSON 输入,从而允许外部程序在 Agent 行为发生前后执行自定义逻辑——这正是 cogit 能够无侵入地捕获每条消息、并在文件编辑前注入否决提示的基础。相比修改 Agent 源码或依赖特定 API,hooks 是一种轻量、通用的扩展点。
关键发现:被否决的选项比已决定的更有价值
这位开发者最重要的体会是:最值得带回新会话的信息是“被否决了什么”,而不是“决定了什么”。原因很直接——决策通常已经体现在代码里,看一眼代码就能推断出选择了哪条路;但被否决的选项不会出现在代码中,如果不刻意记录,就彻底消失了。
这一观察对AI编程工具的设计有普遍意义。当前多数上下文管理方案聚焦于保留“做了什么”,而cogit的实践表明,“没做什么”同样是高价值信息,甚至更难被替代。
从信息论角度看,这一发现可以用“负空间”来理解:代码库是决策的正空间,只呈现最终被采纳的路径;而被否决的选项构成了负空间,它们不在代码中留下任何痕迹,却定义了设计空间的边界。正空间可以通过阅读代码低成本重建,负空间的重建成本极高,因为需要回溯对话历史或依赖参与者记忆。在 AI Agent 场景下,负空间尤其重要:Agent 没有人类团队的口头传统和组织记忆,每次会话都是“失忆”状态,若不显式持久化否决记录,它就会反复探索已被排除的区域,造成算力与注意力的浪费。这也解释了为何记录“没做什么”比记录“做了什么”具有更高的边际信息价值。
局限与坦诚:摘要会出错,按文件提示太窄
cogit并非完美方案。开发者自己披露了两个主要问题。
摘要准确性不足。 他抽查了20条消息,其中6条存在错误,而被否决选项部分是最薄弱的环节。因此他的使用态度是:把这些摘要当作线索,而不是事实。这意味着工具输出需要人工判断,不能盲目信任。
按文件提示的范围过窄。 当前机制只为单个文件提供历史否决提示,相关文件不会收到同样的提示。例如修改A文件时,B文件中相关的否决记录不会被带出来。开发者坦言这个问题尚未解决。
留给社区的开放问题
在分享最后,这位开发者向社区提问:你自己的开发环境里如何处理这个问题?是把过去的决策反馈到新会话中,还是每个会话都从零开始?
这个问题触及AI编程Agent的一个核心矛盾:上下文窗口有限,而项目历史无限。cogit提供了一种轻量级的工程化尝试——用hooks捕获、用摘要压缩、用commit关联,但它也暴露出摘要质量与作用域控制两个待解难题。对于同时管理多个Agent的开发者而言,如何在“干净启动”与“携带历史”之间找到平衡,仍是值得持续探索的方向。
相关推荐

Claude Sonnet 6疑泄露,Anthropic内部模型加速惊人
Anthropic疑似泄露Sonnet 6,Meter报告称其AI研发加速1.9倍;OpenAI发布GPT-6 Cyber,GPT-6.2 Astra或将至;Google Gemini Omni 1.2 Flash登顶视频生成榜;Meta stealth模型与实时头像亮相;市场波动下Google仍投170亿美元建数据中心。

科幻小说对AI的预测有多准?
科幻小说对AI的预测有多准?本文结合Hacker News讨论,分析科幻作品在AI发展中的远见与盲区,探讨其真正价值在于启发思考而非精准预测。

SwarmEvolve:潜空间智能体集群加速进化搜索
SwarmEvolve框架让数百个低成本智能体在潜空间中集群推理,通过KV缓存共享信息,在数学发现和科学计算问题上实现快速进化搜索,中位数仅3-8分钟达到其他框架60分钟的最佳分数。