工程Agent2026-10-21

让产品自己转
—— 一条诊断包走到下一次发版

这个产品只有一个维护者,而客户散在不同时区、不同网络、不同电台。人不在的时候,链就断。下面写我把哪四段链交给了机器、哪一段死活不肯交,以及过去一周一次真实的闭环:一份诊断包进来,四个缺陷出去,第二天新版本上线。

一、一个人的链

先把场景摆出来。一台一百多块的电视盒子,插着一台 FT-710;盒子上跑一个 Web 服务,手机打开就能远程调频、看频谱、按发射。客户可能是刚入门的新手,也可能是玩了三十年的老手,但这些人遇到的麻烦是同一种:某个东西不工作,而他说不出为什么。

在很长一段时间里,这条链只有一个人。读日志、判断病根、排个先后、写代码、打包、发上线、回一句话。任何一环卡住,后面全停。真正的瓶颈倒不是写代码——写代码我最快;瓶颈是判断的带宽:一天能认真读几份日志?能同时挂几件事在脑子里?半夜来的那份包里,两万行日志,人只会看尾巴。

问题不是「要不要用 AI」,是「哪一段可以不必经过我」。四段可以,一段不行。

二、回声

第一段是客户那一头。原来的做法是「有问题微信发我」,结果是:描述缺一半、日志没带、等我回。现在改成一个按钮:打开「🐞 遇到问题」,写两句现象,点生成,点上传。

包里装什么,不装什么

进包不进包
服务端日志、脱敏后的配置、环境与音频设备清单、自动体检摘要、用户自己写的那两句现象 口令、证书私钥、任何令牌、录音、记忆频道、天调学习值

这清单不是谨慎,是前提。一份会被公开讨论的诊断包,只能装可以公开的东西。反过来也成立:凡是能进包的,就说明它本来就该是可以公开的——这条反过来还替我查出过两处该收紧的地方。

包到了接收端,之后每十分钟跑一轮自动分诊:下载、解包、把两万行压成摘要、让代理按固定契约输出结论与证据、渲染成答复卡,发布到公开答复页。多数人只需要那一页,不必等我回话。到十月底,接收端躺了二十四份上报,其中十九份跑的是旧版本;答复页上有十八条已发布,每一条都带编号,用户可以拿编号直接翻到自己的那份。

有一件事我试过又放弃:让模型直接回私信。放弃的理由不在技术,在公开性反倒是约束。答复页人人可读,所以脱敏必须在渲染那一刻做;私信没有这个约束,写错一句就只错给一个人看,反而更容易越界。约束少的地方,错得更安静。

三、分诊

第二段是「这份包到底说了什么」。人读日志靠经验:先看尾巴,再往前搜 `Traceback`,再对时间。机器读得快,却容易自信地读错。分诊的第一条规矩便不是「给出结论」,是「允许结论被推翻」。

每一条结论后面必须附原始行。没有原始行,那条结论就当没写。这条规矩救过一次场:一份包里,自动体检报了两条吓人的结论——「真频谱未工作」「按崩溃排查」。翻包一看,两条都不成立:真 FT4222 频谱从当晚十九点二十三分起连跑八万四千帧;那五条回溯来自两天前的天线分析仪刷固件,与电台无关。少了那几行原始日志,我大概会去查一个不存在的故障。

沈括记活字印刷,说「每韵为一帖,木格贮之」——字模按韵分格,为的是取字不必翻遍全场。分诊做的事与此同理:不是替人下判断,是把两万行整理成能查的形状。整理不是结论。

四、排期

第三段是「这件事该不该做、什么时候做」。看板只有七列:待决策、已排期、实施中、已答复、已提交、实施失败、不处理。分诊给出的三类结论各自落到固定位置——噪声类直接进「已答复」(答复页已经回了,没有代码工作),缺陷类自动进「已排期」,新需求类留在「待决策」。

分诊给出的性质去向还需要人做什么
噪声(环境 / 误报 / 已修)已答复无。答复页已经答了
缺陷已排期,进无人值守实施只有实施失败时才介入
新需求待决策做不做、什么时候做,人定

分类即决策。这一句是整套东西的枢轴:一旦分诊把性质判对,去向就定了,不需要有人再点一次「同意」。省掉的不是一次点击,是一次打断。

队列的取舍倒仍然留给人,也非得留着不可。十月中旬有三条上报,讲的是同一件事:某型电台每次启动都被改回另一个机型。机器照规矩把这三次当成三件独立任务,无人值守地跑了三轮实施,三轮全败。人一眼就知道那是三条重复,该合并成一件。分类可以交给机器,去重不行——去重要认出「同一件事的不同说法」,那是判断,不是归类。

五、代笔

第四段是写代码。做法很简单,约束却很多:在隔离分支上跑,代理提出的改动必须是一份 JSON 契约(文件、片段、意图),最多八个文件,工具链与证书目录不许碰;应用之后跑全量测试,绿了才提交,main永远不被动。

第一次跑,失败。第二次,同上。第三次,还是同一个错:

git apply --check 失败:error: corrupt patch at line 118
git apply --check 失败:error: patch fragment without header at line 38

最容易得出的结论是「模型不行」。我倒觉得这个结论最省事,也最没用。把三次失败摊开看,问题出在契约的形状上:模型被要求输出文本差异,而差异的上下文行只要在两周内被动过,补丁就贴不上。改动本身没错,错的是交付物的形态。

真正的修法便不是换更强的模型,是换语言:让代理交「改哪个文件的哪一段、为什么」,由工具去落地,而不是让它猜上下文。这与常识相反:人总想给模型更长的上下文,其实该给它更硬的接口。

判断可以外包,格式不能。

六、自证

第五段是发版,也是唯一不能靠「我觉得好了」的地方。这里的规矩只有一条:成功必须可判定。

环节 判据
客户侧升级 state.json里 lastResult.status == "ok",由新版本自己写下
安装包 修改时间带年份、字节数、SHA-256 三样都跟上一版不同
包内内容 结构核对、符号走查、干净机器上真跑一遍

「干净机器上真跑」那一步最值钱。这次在虚拟机上,用一份只写了机型、没插电台的配置启动装好的程序,跑完只看一行:文件里原先写的机型,跑完是否还是它。这一行绿了,才敢说那个「每次启动都被改回另一个机型」的毛病真没了。任何一句「应该没问题」,都换不来这一行。

七、一包三病

把四段接起来跑一遍,账是这样的。十月二十一日中午,一份上报进来,症状一句话:「FT-891 设备不工作」。日志只有三行有用:

12:27:18  Saving connection settings: model=ft891 port=COM6 baud=38400
12:30:00  Radio model: ft710, serial port: COM6 @ 38400 baud
12:30:02  No ID response from radio on COM6. Check connection.

用户把机型选对了,一分钟后就剩半分钟,程序把它改回了别的型号。顺着这三行往外拆,一份包拆出四个问题:启动器的机型白名单是手写的三个机型,凡是后来加入的型号每次启动都被判「未配置」,而探测程序只验应答的开头两个字母,任何同族电台都会被认成同一台;FT-891 的串口速率出厂是 4800,配置里写的是 38400;FT8 解码器的深度路径每次运行都要约 4 MB 栈,而 Windows 给线程的是 2 MB,于是每个时隙静默死一个进程;还有,那个解码器要用的呼号库,从来没进过安装包。

四个问题里三个是缺陷,一个属于「算不上缺陷的缺陷」——打包清单漏了一行,本地永远看不出来,因为源码目录恰好就是它要找的位置。

从收到包到新版本上线,用了一天半:诊断在同一晚,两处修复各带守卫测试,全量两千七百多项在两种系统上都跑绿,安装包在虚拟机里过四层验收,第二天下午上线。价值不是「修了四个 bug」,价值是那台机器上的串口终于能说话。前面所有环节——分诊、排期、代笔、自证——都只是把这件事实送到客户面前的手段。

八、代价

说得再好听,这套东西也有账要付,而且是逐条可数的。

代价 实情
钱 每份上报一次模型调用;一轮最多处理两条,单次限时九分钟
慢 从上报到有结论是分钟级,到有答复是十分钟一轮的粒度
会错 误判要人纠正;三个重复上报就白跑了三轮实施
维护 这条链本身成了产品的一部分,它坏了也要有人修
看不见 夜里跑的东西最容易悄悄停;所以每个环节都要留下「最后一轮跑了什么」

最后一条最值得说。「看不见」不是抽象的担心:这条链曾经停摆过六天,定时任务的命令行里多了一个开关,它排在主流程前面,于是每一轮都在做另一件事,日志里没有一行「没有新包」。事后补的第一条守卫,就是让那六天不可能重来。

也没法把「要不要做」交出去。模型能告诉你这份包里发生了什么,不能告诉你哪件事值得做、哪个客户在等、哪条路通向产品该去的方向。这不是能力问题,是位置问题——它不在场。

九、再用

这套结构不只服务于客服。把同一副骨架套回产品开发本身,能省下另一种东西。

约束写成可执行的清单,编辑之前先跑一遍,越界的改动当场被拦;每一条都注出处与理由,不是禁令,是病历。每次事故留一条守卫——测试、工具、检查项,随便哪种,但必须有;没有守卫的修复不算修完,下一轮它一定回来。指标不写给老板看,写给下一轮分诊看:升级后的解码率、升级率、会话峰值、事件循环延迟,这些东西的价值不在数字本身,在于这些数能让下一份包少绕一圈。

三件具体的做法

约束写成可执行的清单,编辑之前先跑一遍,越界的改动当场被拦。每条都注出处与理由——不是禁令,是病历。写「不许在这里碰证书目录」没人记得住,写「这里曾经把私钥打进过安装包,所以拦」,下一个人就不会再犯一次。

每次事故留一条守卫:测试、工具、检查项,随便哪种,但必须有。没有守卫的修复不算修完。这条规矩听着苛刻,实际省事——守卫一旦写下来,同一个病就不会第二次占用我的判断带宽。

指标不写给老板看,写给下一轮分诊看。升级率、解码率、会话峰值、事件循环延迟,这些东西的价值不在数字本身,在于这些数能让下一份包少绕一圈:一份包进来,先看指标就知道该往哪一层查。

一条线,五个点

把「从需求到价值」摊成一条线,五个点各自要一个判据:

环节判据
需求客户的原话 + 包里的原始行,两样都在
判断结论附证据;证据被推翻时,结论跟着改
落地改动有守卫测试;全量套件在目标系统上绿
验收装上去、真跑、看到那一行字变了
价值客户那台机器上,原本不工作的东西开始工作

五格里只有最后一格不可代劳。前面四格都可以写成判据,判据就能交给机器;最后一格是「这件事对那个人有没有用」,它只能由知道自己要做什么的人回答。

设计文档因此从「写完存档」变成「运行时被读取」:它不是描述系统长什么样,而是规定什么改动必须停下。文档一旦能被机器读,它就有了牙齿。

十、留给人

回到开头那三问。这套东西纠正的误解是「AI 会把维护者替掉」。恰恰相反:它把维护者从流水线上挪下来,挪到一个更窄、更硬的位置上——判断。

四段交给机器:客户自助、分诊、排期落位、实施与自证。一段留给人:这件事值不值得做,以及做完之后,产品是不是更像它该有的样子。

执行可以委托,判断不能。

这不是修辞。你把它翻成工程问题就明白了:凡是能写出判据的,都能交出去;写不出判据的,交出去只会得到一个更自信的错误。

相关:Agentic Engineering(英文,讲同一套循环在 FDE 现场的形态)、云端的第一公里(实例怎么接入)、MRRC Modern。文中数字取自 2026-10-21 的真实记录:接收端 24 份上报、答复页 18 条已发布、v1.28.2 的 Windows 安装包 79,703,701 字节。