我做了个工具防止 AI agent 在不熟悉的代码里乱改 找几个内测 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
ChristopherWu

我做了个工具防止 AI agent 在不熟悉的代码里乱改 找几个内测

  •  1
     
  •   ChristopherWu 12h 11m ago 478 views

    最近 dogfood 一个工具叫 mainline ,分享一下做这个的真实故事,顺便看 V2EX 上有没有人感兴趣内测。

    起因

    我在公司推团队用 AI 编程,作为 staff engineer 写过内部 guideline 。过程中发现一个反复出现的现象:

    AI agent 写出的代码不是"明显错"是"看起来合理,但基于错误的历史前提"。

    具体例子:

    repo 里有个半成品的 Redis 队列:redis.go 、TODO 注释、docker-compose 里也配了 redis 。Claude Code 看到这些,合理地想把这个实现完。

    但实际情况这个团队 3 周前已经放弃 Redis 了,因为 replication 延迟导致 billing 事件重复。这个决定散在某个 PR 评论里、Slack 几条消息、几个工程师脑子里。

    代码搜索能看到 redis 文件但看不到那个决定

    先尝试过现成方案

    • AGENTS.md / CLAUDE.md 写 not-todo能写"don't use redis",但只解决你能预判到的。新决定一直在产生,没人持续维护。
    • ADR / RFC太重,团队不愿意写
    • Wiki / Notion和代码不同步,过半年 wiki 还说"我们用 Redis"
    • PR description埋在 GitHub 里,agent 不会主动去翻
    • Agent harness 自带 memory (比如 jcode )work ,但 lock-in 到那个 harness

    每个都在某些场景下 work但都没解决"agent 改不熟悉的代码前能拿到团队的真实决策"这个问题。

    做了什么

    mainline 的 thesis:决策记忆应该是 git 一等公民。

    具体设计:

    1. 每个 dev 有自己的 actor log ( refs/heads/_mainline/actor/<id>),append-only 。Bob 、Alice 各自 push 自己的,不冲突。
    2. Sealed intent 通过 git notes 关联 commit 。
    3. SealResult 是结构化字段:what / why / decisions / rejected_alternatives / risks / architectural_claims 。
    4. Agent 改代码前先 mainline context <keywords>拿到结构化决策,不是一坨 free text 。
    5. 跨人 in-flight 可见Bob sealed 立刻 push ,Alice fetch 时看到,不等 PR review 才发现冲突。

    设计上反直觉的几个选择

    • 进程式 CLI ,不是 daemon 。Git AI 走 daemon 路线,撞了一堆 macOS sleep / zombie / socket 问题。Git protocol 已经 battle-tested ,不要发明轮子。
    • Intent 级别,不是 line 级别。Line-level attribution 在 formatter / amend / git mv 下天然脆弱。Intent 是任务级别,文本变换不影响 semantic 。
    • Push 模式( agent 主动 seal ),不是 pull / 自动 capture 。自动 capture 听起来好,但产生大量 noise + 假记忆。显式 seal 有 friction ,但保证质量。
    • Append-only ,sealed 后不能改只能 supersede 。决策档案改了就失真,"当时怎么想"不可篡改才有价值。

    现状

    局限我也直接说

    • 需要 agent 配合主动调用 mainline 。如果你团队没这个习惯,价值发挥不出来。
    • AGENTS.md 重多了 seal 这一步。
    • 比 jcode 这种 agent harness 内置 memory 的"自动"差,但换来的是数据在 git 、跨 agent 、可移植。
    • 单人 + 好 git 习惯 + 写好 plan ,你不需要 mainline 。

    适合谁试

    • 5+ 人团队,多个 agent ( Claude Code / Cursor / Codex 都行)在同一 repo 工作
    • 跨时间工作多3 个月前的决定还在影响今天的 PR
    • 已经被"agent 在不该改的地方乱改"坑过

    找内测

    如果上面场景命中你欢迎私信或评论,我直接给你安装包 + 文档 + 每周一次 30 分钟同步。bug 我会优先 fix 。

    也想听 V2EX 上的反馈有没有更好的现有解决方案我没想到的?有没有觉得这个方向不对的?

    不卖东西,纯粹想找几个深度用户 + 听不同视角。

    a186232641
        1
    a186232641  
       11h 55m ago
    网页是啥 skill 做的,视觉感很好
    ChristopherWu
        2
    ChristopherWu  
    OP
       11h 54m ago
    @a186232641 一个 design 的 skill
    ChristopherWu
        3
    ChristopherWu  
    OP
       6h 44m ago
    怎么都没人回复的
    9684xtpa
        4
    9684xtpa  
       6h 15m ago
    读了一遍,我问一个问题,我维护一个 actor log 和让 AI 记录到 md 的成本区别是啥
    ChristopherWu
        5
    ChristopherWu  
    OP
       6h 3m ago
    @9684xtpa actor log 是结构化的,Agent 装了 skill 后自动记录,读取,而且持久化、渐进式记录到 git 上。
    你写到 md 上,就需要结构化、渐进式记录。也不是不能做到,就像 text 也可以用 grep 做数据库一样,为什么还需要 mysql, nosql
    foolishcrab
        6
    foolishcrab  
       3h 7m ago
    提出的问题是确实存在的而且存在很久了,并不是 Agent/AI specific 的问题吧。Linus 之前就开喷过了“没看懂为什么这个代码这么写就别他妈改”。

    你提出的这个场景并没有很有说服力,似乎让 agent 做出重大重构的时候自动更新 agents.md 就够用了。
    ChristopherWu
        7
    ChristopherWu  
    OP
       11 mins ago
    @foolishcrab 同意,这个问题本身不是 AI/Agent 才有的。人类工程师也一直会犯:没理解历史背景就改代码。Linus 那个骂法本质上也是在说这个。

    我觉得 Agent 让它变得更突出,不是因为问题新,而是因为频率和规模变了:以前一个人没看懂乱改,是一个 PR ;现在多个 agent 可以很快在不同分支里重复同样的误解,而且它们不会像团队成员一样通过日常讨论、事故记忆、Slack 背景慢慢“渗透式”获得上下文。

    `AGENTS.md` / rules 文件我觉得适合放稳定规则,比如代码风格、测试命令、架构偏好、不要用某个库之类。

    但很多历史意图不是稳定规则,而是有生命周期的决策记录:

    * 这个方案试过,但因为 X 被 abandoned ;
    * 这个 decision 已经被 superseded ;
    * 这个 legacy path 暂时不能删,但未来某个条件满足后可以删;
    * 这个 migration 有未关闭风险;
    * 这个约束只和某些文件/commit/PR 有关。

    如果都塞进 `AGENTS.md`,它很快会变成一份越来越长、越来越难维护的“历史垃圾桶”。Agent 也很难知道哪条和当前 diff 真的相关。

    所以我不是想替代 `AGENTS.md`,而是想把它分层:

    `AGENTS.md`:长期行为规则。
    Mainline:和具体工程改动相关的 intent record ,可以按当前文件、分支、commit 、in-flight work 检索。

    也就是:不是“让 agent 自动更新一个大说明文档”,而是让它在做重要改动时留下结构化的 why ,未来相关改动前能被取出来。
    About     Help     Advertise     Blog     API     FAQ     Solana     3181 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 14:40 PVG 22:40 LAX 07:40 JFK 10:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86