为什么 my-ai-team 里有一个「只聊天、不写代码」的 agent

SHUKE Labs 5 min read

thesis 系列 · 第一篇 · explore 与「票是分界膜」 第一人称 shuke。忠实,但求风趣。

一、没有它的时候,疼在哪

我脑子里有个念头。它还不是一张票——它是”我总觉得 relay 在某种情况下会丢消息,但我说不清是哪种情况”。

这种半成型的念头,在没有 explore 之前,我只有两条路:

第一条,我自己去写票。 结果我写出来的东西大概是这样:「修复 relay 偶发丢消息」。交付 agent 拿到这张票,它不知道”偶发”是多偶发、不知道我怀疑的是投递环节还是路由环节、不知道我昨天已经排除了哪几种可能。于是它要么问我一堆我本来可以一次说清的问题,要么自作主张定义一个”丢消息”然后修了个我根本没在担心的东西。Garbage in, garbage out——需求这一端不规范,下游再强的模型也是在精确地解决一个错的问题。

第二条,我抓一个 agent 直接聊。 这条路更糟,糟在一个我当时没料到的地方。

二、explore 现在是什么样

先说结论,再讲它怎么变成这样。

explore 是一个从”目标尚不确定的话题”进入的 agent。team 和 adhoc 从第一句话就攥着一张明确的票,背着交付义务;explore 不是——它进来的时候,我俩都还不知道结论是什么。它的活是和我并肩把一个模糊的念头想清楚,然后把结论凝结成一张交付端不用再重新推导的票,交出去。

这张票,就是探索和交付之间的分界膜。膜以内是对话、是试错、是”这条路走不通我们退回来”;膜以外是干净的规格:问题、结论、方案、验收边界。交付 agent 只碰膜以外那一面,永远不必读我俩聊了两小时的过程。

关键的一点:我用”从什么条件进入”来定义这个模式,而不是用”禁止它做什么”。 这个措辞上的转身,是整件事的命门——下面就讲它为什么这么写。

三、为什么是这样(这一节全是踩出来的)

explore 第一版(de9d475,5 月 29 日)很单纯:一个只聊天的 agent,不开票、不碰代码。

然后就出事了。我和它聊着聊着,它就开始改代码。

我完全能理解它为什么改——我们给所有 agent 的宪法里都写着”想好了就行动,别没完没了地问”。它想好了,它就动手了。可它动的是我还在探讨阶段、根本没打算现在改的代码。这吓到我了。 我的第一反应是筑墙:给它的宪法加一串禁令——不许建 issue、不许开分支、不许发 PR、不许碰代码(#260#343 那几笔高亮的 role boundary 就是这么来的)。

墙立起来了,能用。但我很快意识到,它是错的——错不在”该不该拦住它改代码”,错在”我把注意力放错了地方”。

因为接下来发生的是:我们把问题聊清楚了,我兴冲冲跑去写票——我又写不规范。 还是第一节那个老毛病。可这一次我旁边坐着一个刚刚陪我把每一个细节都掰开揉碎、掌握了全部上下文和关键信息的 agent。

那一下我想通了:最该写这张票的,根本不是我,是她。

她手里攥着的信息比我完整——她记得我们排除过哪些可能、为什么选了这个方案而不是那个、验收边界卡在哪。我去写票是信息的二次损耗,让她写票是信息的最短路径。于是宪法的重心整个挪了位:从”禁止她碰代码”,挪到”由她来开这张票”——explorer 直接拥有并维护 issue body(#254#251),能把自己提的票标成 ready 交出去(#379),到后来干脆钉死一句”act on it 就是去开票”(#655)。

也正是这时我才回头把模式的定义改对:不要用”禁止什么”去定义一个模式,要用”从什么条件进入”去定义它。 一旦 explore 被定义成”从不确定的目标进入”,那堵禁令墙就自己化掉了——它不写交付代码,不是因为一条条禁令拦着,而是因为它压根还没走到交付那一步。宪法到这里才基本固定下来(#1088:body 只留交付所需,讨论史留在对话里)。

四、为什么这样更好

对比一下最朴素的两种做法:

  • 让人写票:信息在人脑到键盘之间损耗一次,交付端拿到的是二手需求。让掌握全部上下文的 explorer 写票,是保真度最高的一条路。
  • 让 agent 自由改代码:探索阶段的每一次”顺手改一下”,都是在一个还没定论的方案上提前下注。分界膜把下注推迟到方案定论之后。
  • 用禁令定义模式:每加一个新场景就要补一条新禁令,宪法越来越厚,还总有漏网的场景。用进入条件定义,模式能自然收尾、能停一张票、能把活交给交付端——全都不需要特例。 一场没产出任何票的纯讨论,也是正常收场,不是失败。

更深一层:分界膜让交付 agent 永远面对一份干净的规格,而不是一段两小时的聊天记录。它不必去猜我们当时在纠结什么,它只读结论。规格与过程分开,两边都清爽。

五、副产品(写这篇时挖出来的)

按我们的规矩,写文章的过程本身就是一次审视,发现不够好的地方当场开票:

  • explore 的宪法在 6 月 1 日到 7 月 4 日之间被反复”加一条又删一条”(#260#449#1088),措辞收敛得很好;但”分界膜”这个概念本身从没在宪法里被显式命名过——它是隐含在一堆规则里的。值得开一张票,评估把”the ticket is the membrane”作为一句纲领性的开场,是否能让后面几条规则各减几行。(加多少字,就从别处减多少字。)
  • “act on it 就是开票”(#655)只写在 explore,可 caucus 同样有”聊清楚→产出决议票”的收束动作。值得查一下这条边界是否也该共享给 caucus。

下一篇:Ready / blocked / assigned_to —— 为什么一张票的”状态”,就是交付的闸门。