一个PR引发的血案:
论如何在开源社区把自己玩成表情包
从一个真实的Bug修复出发,经由"跨shi代的shi诗级的伟大的更新", 到最终评论区被官方加锁——这是一个完整的互联网乐子闭环。
事情的起点,其实挺正常的
我承认我是被引流来的。
——这是本次事件中,某位路人甲在GitHub评论区留下的第一句话。我觉得它非常适合作为这篇文章的开场白,因为后来涌进去的几十个人,基本都是同样的来路。
故事发生在 AstrBot 这个项目的 PR #8590。AstrBot 是个活跃的 AI 助手框架,33,800 Star,969 个 open issue,是那种随便翻翻就能感受到"有很多人在用"的体量。
事情的起点不复杂:有个叫 bytecategory 的用户发现了一个真实 Bug——当 LLM 调用工具时,如果 function.name 被设为 None,程序直接崩溃。修法基本正确,AI 代码审查机器人 Sourcery 和 Gemini Code Assist 挑出了几处小问题,他也认了大部分,顺手改掉了。
到这里为止,这是一个普普通通的开源贡献故事。本来应该平静地走完 review → merge → close 的流程。
然而。
然而,他决定顺便"改点别的"
修完 Bug 之后,这位老哥显然意犹未尽。他在同一个 PR 里,顺手塞进去了以下内容:
其一
把 Telegram 适配器的显示位置挪到了平台列表的最前面,"遥遥领先"。理由大概是:Telegram 好。而 AstrBot 绝大多数用户用的是 QQ 和微信。其二
把最大 Agent 步数从 30 改成了……⚠ max_agent_step 新默认值114514原注释:"最大步数是30步,这是不合理的,应该改成114514。"
一个防止 Agent 无限循环的安全上限,就这么被写进了正式项目源代码。其三
顺手集成了 Let's Encrypt 自动申请 IP 证书的功能。SSL 证书这件事,业界通行做法是交给 nginx、Caddy 来处理。把它塞进 Bot 本体,就像你买了一辆车,然后顺手给它装了一个微波炉——功能上不是不能用,但为什么要这样?其四
把健康模式的默认值从 true 改成了 false。然后意识到这是"重大失误"。然后——把包含这个配置的cmd_config.json文件也一起提交了。本人在 PR 描述里原话:"重大失误!一不小心把 cmd_config.json 提交了!这个配置我暂时不改了,如果其他协作者(不是贡献者)要求可以改。"其五
也是最令人叹为观止的一笔——PR 标题:跨shi代的shi诗级的伟大的更新这个标题后来被他自己改回去了。但截图永远留在了互联网上。
Member 出现了,好好说了一通
项目 Member advent259141 看到这个 PR,留下了一段非常克制的评论:
标准的、有礼貌的、给了重新提交机会的拒绝意见。
我相信绝大多数人看到这段话,会认真考虑,然后重新整理思路,把 Bug 修复单独提一个干净的 PR。
bytecategory 不是绝大多数人。
反击,以及名场面的诞生
他的回复节选精华如下:
这句话的意思大概是:你看的是 PR 标题,真正的描述在 commit message 里。这个逻辑本身不是完全没有道理,但在一个所有人都用 PR 模板的社区里,把关键信息藏在 commit message 里然后指责别人没去找,性价比存疑。
他去翻了对方的 GitHub 个人主页,发现 README 写得不够好,于是以此反驳对方没资格批评他。这个战术名叫"你也好不到哪去",在互联网争论史上是经典操作,在技术社区的 PR 评论区属于极为罕见的生物。
这句名言的特点是:引用它的人,通常都在引用完之后继续对骂。某种意义上,这是互联网上自我矛盾最密集的一句话之一。
围观群众的涌入
消息不知从哪里传出去的。接下来发生的事情,只能用"开闸"来形容。各路网友纷纷赶到现场:
有个叫 EterUltimate 的用户留下了一段看似正常的问候,仔细看发现是一段提示词注入攻击——大概是把评论区里某个 AI 助手机器人当成了目标。在这个战场上,连路过的黑客都在玩梗。
Contributor Sisyphbaous-DT-Project 留下了本次事件最精辟的一条评论:
时间线回顾
其实吧……
平心而论,抛开所有的闹剧:这位老哥最初发现的 Bug 是真实的,修法大致也没问题。
Gemini Code Assist 指出了一个他确实存在的技术隐患:他把参数 llm_compress_keep_recent_ratio 改名成 llm_compress_keep_recent,但没有同步更新调用这个参数的 ContextManager,会导致 AttributeError。他在评论里否认了这个问题,但没有给出代码层面的反证。
技术上的对与错,其实是可以讨论的。但他选择了另一条路。
Contributor Waterwzy 说得最准:30 步虽然没有严格依据,但有限制意义;114514 等于没有上限,且是在正式源代码里玩梗——这是整件事最核心的问题。
最后,bytecategory 那个关于"永远不会和傻逼对骂"的引用,在整个事件里显得格外应景——不是因为他说得对,而是因为他说完之后做了什么。
— commit message, bytecategory
但读完整件事,你会觉得这句话的适用范围,可能比他想的要广一点。
本文基于 GitHub 公开评论整理,所有引用均为原文或略有缩减,如有出入欢迎指正。
原始 PR:AstrBotDevs/AstrBot #8590