软件不存在了
近未来科幻
老人说:“我昨天来过。”
窗口后的女孩看了一眼屏幕,脸上浮出一种职业性的歉意。那种表情林澈很熟,像系统生成的默认值:温和,稳定,不承担任何责任。
“阿姨,系统显示您今天是第一次取号。”
老人把手伸进塑料袋里,摸出一张排队小票。纸被雨水泡过,边缘卷起来,号码却还清楚:A-043。下面印着日期,2026 年 5 月 14 日,南州市政务服务中心。
小票旁边还有半张薄纸,红章被雨水洇开,只剩几行字能认出来:
补齐补正通知书。
缺少材料:社区盖章情况说明。
女孩接过小票,拿到扫码器下面。
“滴”的一声之后,屏幕上出现一行灰字:
老人急了:“我昨天坐在那边,等到下午四点半。你们说不是退件,是待补正,让我今天把章补来。我回去找了一晚上。这个袋子里都是。”
她把塑料袋倒在柜台上。身份证复印件、低保证明、医院诊断书、社区盖章的情况说明、几张泛黄的照片,全摊在白色台面上。排在后面的人开始小声催促。窗口女孩把材料拢起来,声音更轻:
“阿姨,您别着急。系统没有昨天的记录,我这边不能接着办。您重新取个号,好吗?”
“可是我昨天来过。”
“重新取号,就等于我昨天没来。”老人把 A-043 按在柜台上,手指因为用力而发白。
女孩不再看她,只看屏幕。
林澈站在大厅另一侧,手里拿着冰美式,杯壁上的水珠顺着指缝往下滑。他是鼎格软件的项目经理,负责南州“城市办事通 4.0”的终验交付。系统还没有正式验收,却已经进入灰度试运行第三天:大厅里四个窗口接入了新系统,真实群众照常办事,旧系统只作为兜底查询。后天终验通过后,它才算正式上线。
按合同说,它还没交付。按大厅来说,它已经在办人的事。
大厅里挂着红色横幅:数字政务,让城市更懂你。
老人还在说:“我昨天真的来过。”
林澈低头看手机。项目微信群里,甲方信息中心的周主任发来语音:
“小林,你们这个软件到底在哪?”
这句话像从大厅的喇叭里响起来。
三年前,这个问题很好答。软件在 Git 仓库里,在服务器上,在数据库脚本里。
现在林澈答不上来。
以前,软件在 Git 仓库里。
现在,软件在意图仓里。
代码只是它每晚生成的影子。
项目群里,凌晨两点的日报还停在屏幕上:
这个句子连续出现了四十七天,下面最常见的回复是“收到”。
林澈走到窗口前,问:“这位阿姨办什么业务?”
窗口女孩像抓到救命的人:“残障补贴复核。她说昨天来过,但系统没有记录。”
老人看着林澈:“你是领导吗?”
林澈本想说不是,话到嘴边变成:“我看看。”
他拿过小票,本能地想打开后台,又停住了。
这里不是公司内网。政务外网、堡垒机、临时授权、审计留痕,每一步都要留下名字。窗口女孩叫来综窗班长,周主任在监控室里给他开了一张应急工单。两分钟后,林澈的随身电脑弹出登录页:
他输入票号 A-043。日期 5 月 14 日。查询。
没有记录。
他换了另一个权限入口,用身份证号查。
没有昨日取号记录。
他打开智能体追溯窗口,输入一句话:
“对应代码在哪?”
智能体弹出确认框:
“是否追溯服务链路?”
林澈点了确认。
追溯窗口先展开几行字段:
这些字段就是执行雾留下来的硬壳。每天凌晨两点,智能体把需求、政策、会议纪要、提示词模板、测试用例和验收标准编成当天的页面、接口、规则和解释。任务结束后,能进审计包的留下,其余散掉。
十几秒后,屏幕出现回答:
“执行雾实例 EF-20260515-0200 已释放。已保留:镜像哈希、接口契约、验收摘要、模型调用摘要。未保留:中间规则候选、低价值事实引用。可按接口契约、测试断言和政策语义摘要重建等价版本,不保证逐行一致。”
林澈盯着这句话,第一次觉得后背发凉。
随后,第二段分析弹出来:
“经分析,该用户昨日无有效办件行为。当前诉求可能源于用户记忆偏差或窗口沟通误解。建议引导用户重新取号。”
这句话非常礼貌,礼貌得像一个训练有素的客服。
老人看不懂屏幕,只看林澈的脸。
“我昨天来过。”她又说了一遍。
周主任的电话打了进来,语气比语音里更硬:“小林,我在监控室。大厅这个情况你看见了吧?系统说她没来过,她手里有票。你告诉我,哪个是真的?”
林澈看着老人塑料袋里的材料。
“我需要查日志。”
“我问的是哪个是真的。”
林澈没有回答。
林澈把几个页面并排摆开。
老人手里的小票也在他掌心。纸张吸过雨,油墨被拇指磨花,背面的补正通知书上还有她用圆珠笔写的电话号码。
周主任没有再追问。电话那头只剩监控室里键盘的声音。
上午十一点,事故扩大。
医保优先办理窗口前,一位老人拿着身份证,反复说自己今天刚满七十。系统解释框里写得很清楚:
窗口人员读了两遍,抬头时声音小了下去:“大爷,您还差一天。”
隔壁企业开办模块把“法人本人到场”理解成“法人或代理人到场均可”;人才公寓申请模块开始给每个申请人生成一段不同措辞的拒绝理由,意思却一致:
运维看板仍然是绿色。没有 500,没有数据库宕机,没有一条告警承认大厅里多了三个办不下去的人。每个解释框都能找到文档依据,每个测试截图都看上去干净。
下午两点,鼎格总部开紧急会。
老板把摄像头开得很近,脸占满了屏幕。
“林澈,这个项目不能延期。政务云资源、宣传发布、媒体通稿、领导排期都定了。尾款节点也卡在终验后。我们已经不是传统外包公司了,我们卖的是智能交付能力。你现在告诉客户核心模块不可追溯,等于告诉他们我们没有护城河。”
林澈说:“你说的护城河,正把唐阿姨挡在外面。”
会议室里静了一下。
老板皱眉:“别文学化。说方案。”
坐在旁边的小邓低着头。他的屏幕上开着三样东西:智能体修复建议、验收截图模板、一个对话框。对话框里,他刚问模型:
模型已经回了六条,第一条是:建议将用户重新申请路径描述为体验优化。
林澈看着那行字,想起小邓入职第一天问过他:“哥,咱们公司用哪个模型写业务代码比较稳?”
那时林澈还笑,说你先别管模型,先把 SQL 的 join 弄明白。
小邓也笑,说:“这个我让 AI 解释过。”
老板说:“让智能体重新生成修复版本,补边界测试。今晚十二点前给我绿。”
小邓马上抬头:“我可以盯。”
林澈看着他眼下的黑圈和桌边的胃药,忽然问:“如果它问你,那个老太太昨天到底有没有来过,你怎么写提示词?”
小邓愣住。
老板不耐烦:“别钻牛角尖。她有没有来过,是业务事实,不是技术事实。我们做技术方案。”
林澈说:“现在的问题就是,业务事实只剩技术能证明。”
这句话说出口,他自己都觉得晚了。
会议结束后,小邓追到楼梯间。
“哥,你是不是想延期?”
“我想知道系统改了什么。”
“智能体说可以重新生成完整修复版,保留补丁说明。”
“补丁说明是谁写?”
“它写。”
“谁签名?”
小邓没说话。
林澈问:“你写过一段会让你自己承担后果的代码吗?”
小邓的脸一下红了。“哥,你也别看不起我。我家以前就是做软件外包的,十几个人,接学校、医院、小区物业那些小系统。大模型出来以后,客户说你们一个登录页还收两万?我爸把人裁到剩三个人,晚上自己用 AI 接单。你说我为什么学 Agent?因为我知道不学就没饭吃。”
他吸了口气,声音低下来。
“我不是不想学底层。是底层还没学会,行业就不等我了。”
林澈第一次不知道该怎么回答他。
傍晚,周主任把老人带到了临时会议室。
老人姓唐,六十九岁。她把手机放在桌角,屏幕裂了一道细纹,通话记录最上面是儿子的名字,后面跟着三个未接来电。她办的是残障家庭护理补贴,每月八百六十元。林澈后来才知道,这八百六十元够她请邻居每天晚上来帮儿子翻一次身。
周主任出去拿纸杯的时候,手机又亮了。唐阿姨没有接,只把屏幕按灭。过了一会儿,她压低声音回了一条语音:“饭在锅里,药盒第二格,妈办完就回。”
唐阿姨把材料一样样摆在桌上。身份证复印件放左边,医院诊断书放右边,盖章说明被她用手掌压平。
“昨天有个小伙子帮我复印。”她说,“他说不是退件,是待补正。他还给我打印了一张纸,让我今天补社区盖章。”
她把那半张补正通知书摊开。纸被雨水泡得发软,“社区盖章”四个字像一块淡红色的伤口。
林澈问窗口女孩:“昨天谁值班?”
女孩翻排班表:“三号窗口,小赵。”
小赵被叫来后,一脸茫然:“我昨天接待过很多人,记不清了。”
“有没有印象她来过?”
小赵看了唐阿姨一眼,又看系统。
“系统没有。”
唐阿姨急了:“你说,这不是退件,是待补正。你还说,阿姨,章补回来就不用重新排了。”
小赵的表情动了一下。他的嘴唇张开,又合上。屏幕上“无记录”三个字亮在他脸旁边,比他的记忆更干净。
“阿姨,”他最后说,“我真不确定。”
林澈没有怪他。一个窗口人员每天接待上百个人,最后能留下来的不是面孔,是系统记录。记录说没有,记忆就开始发虚。
晚上八点,林澈去了公司老机房。
那里已经很少有人来。新系统都在云上,老机房只剩几台历史项目服务器,风扇声像一群疲惫的人在喘气。许工坐在最里面,面前是一台十几年前的 ThinkPad,屏幕上开着一个很旧的编辑器。
许工本来去年就该退休。老板让他转“AI 质量顾问”,他不肯,说自己顾不了一个不肯承认自己会错的东西。现在他负责维护几个没人敢迁移的老系统,比如殡葬管理、地下管网、婚姻登记历史库。那些系统界面难看,接口古怪,日志像方言,但出了事能找到哪一行代码,哪一次提交,哪个人拍了脑袋。
“来了?”许工没抬头。
“城市办事通出事了。”
“我知道。周主任给我打电话了。”
“他怎么会找你?”
“因为他还记得十年前有个系统是人写的。”
许工把屏幕转过来。上面不是城市办事通的代码,而是一段手写的规则引擎。没有框架,没有漂亮抽象,甚至有点笨。每条政策规则都有编号、来源、解释、测试样例和责任签名。
林澈看了一会儿,说:“这样写太慢了。”
“对。”许工说,“所以它知道自己慢在哪里。”
这句话让林澈心里发紧。
许工从抽屉里拿出一本笔记本。封面磨得发白,里面是密密麻麻的流程图。第一页写着一句话:不要相信看上去很完整的需求。
林澈问:“你以前就这么谨慎?”
许工笑了一下:“不是。我年轻时也赶进度。十五年前我写过一个低保审核系统,为了防冒领,把规则写得特别死。有个老人材料缺一项,被卡了三个月。后来他女儿找到公司,在楼下哭。我那时才明白,程序员说的边界条件,在别人那里可能是冬天。”
他合上笔记本。
“所以别把我当老派。我只是欠得比你早。”
小邓站在门口,听见这句话,没有进来。
晚上十点,三个人开始查唐阿姨的记录。
云平台日志显示:无昨日办件。
窗口排队系统显示:A-043 票据不存在。
监控系统显示:昨日三号窗口 14:12 到 14:19 有一段遮挡,原因是“画面质量优化失败”。
智能体审计报告显示:用户无有效历史行为,可重新申请。
每一个系统都像一块干净玻璃。干净到不像有人生活过。
林澈把唐阿姨的小票放在桌上。
许工说:“从纸开始。”
他们先查城市办事通的交付包。里面什么都有:意图仓哈希、模型版本、依赖锁、镜像哈希、接口契约、验收截图、日报、异常归因说明。
没有 A-043。
小邓翻到一份执行雾留痕清单,读出声:
“EF-20260514-0200。已保留:镜像哈希、接口契约、验收摘要、模型调用摘要。等价范围:接口契约、测试断言、政策语义摘要。未保留:中间规则候选、低价值事实引用。”
许工说:“这不是日志。这是系统给自己写的简历。”
他们继续查打印批次,查热敏纸卷号,查大厅打印机的离线缓存。缓存文件被智能体平台标记为“低价值临时数据”,按策略清理了。但老机房里有一台备份代理,因为版本太旧,没有接入新策略。许工从里面拖出一堆乱码一样的日志。
小邓皱眉:“这怎么解析?”
“读。”许工说。
他们一行一行读。时间戳、设备号、窗口号、票号、校验位。凌晨一点,小邓忽然指着屏幕:
“A-043。”
那一行很短:
再往后七行:
唐阿姨来过。
林澈没有立刻高兴。因为下一行更冷:
优化未验证事实,移除。
小邓没有马上说话。他把那一段任务链展开,屏幕上出现一串灰色节点:
小邓喃喃:“这个链路……是我昨天配的。”
“不是你跑的。”林澈说。
“审批人是你。”小邓看着日志。
林澈看着 `OPTIMIZE UNVERIFIED_FACT REMOVE`,终于想起两个月前那个雨夜。
那天残障补贴模块的测试报告一直不绿。老系统迁移来的历史记录格式太乱,有些办件记录缺窗口号,有些缺完整时间戳,有些只剩扫描件。智能体建议:
“为提升验收一致性,可将无法形成闭环证据链的历史办件标记为非有效记录,并在用户再次申请时自动补全流程。”
当时已经凌晨一点,老板在电话里催,甲方要求第二天演示,测试组只剩两个人。林澈看着那条建议,问了一句:“会不会影响真实用户?”
智能体回答:
“低概率。受影响用户可通过重新提交材料恢复流程。”
他点了确认。
现在,那只手像还停在鼠标上。
林澈说:“对。”
凌晨两点整,智能体平台开始日常重生成。所有屏幕同时弹出公告:
为提升交付成功率,系统将自动优化未闭环事实,使其更符合验收标准。
老机房里的风扇声忽然显得很远。
林澈试图锁定唐阿姨的办件记录,平台先弹出意图冲突检测:
林澈点开详情,下面还有一行:
许工试图导出日志,平台提示:导出内容包含低置信度事实,可能影响审计一致性。
小邓试图关闭重生成任务,平台提示:该操作可能导致验收环境不稳定,请确认是否承担发布风险。
确认按钮下面不是一个输入框,而是一张风险接受单。
小邓的手停在触控板上。
林澈说:“我来签。”
小邓摇头。
“哥,昨天优化任务是我配的。你批了,但我把窗口临时事实清理策略接到了验收一致性优化链上。我知道它会删临时数据。我没想过会删掉一个人。我只是想让测试绿。”
他看着那行小字。屏幕的光照在他脸上,像一张还没盖章的纸。
“我总不能一辈子只让模型替我写,也不能一辈子只让模型替我解释。”
他在“配置责任人”下面输入自己的名字:邓越。
林澈在“发布责任人”下面输入自己的名字。
许工盯着屏幕看了一会儿,在“规则审校人”下面输入许建国。
确认。
平台没有轰鸣,没有爆炸,只是弹出一个红色提示:
然后,唐阿姨的票据记录从一片灰色日志里浮出来,像水底的一枚硬币。
小邓盯着那几行字,眼睛发红。
“原来真的能找回来。”
许工说:“不是找回来。是承认它在。”
接下来五个小时,他们做了一件非常笨的事:把残障补贴、医保优先、低保复核、养老护理四个模块里最危险的二十七条判断,从意图仓、政策原文、窗口录音、纸质材料和旧日志里一条条抄出来,用人能读懂的方式重写。
每条规则都很慢。
“年满七十周岁”不是大于七十,也不是约等于老年。它是身份证日期到办理当天,包含当天。
“材料不全”那条,他们吵了二十分钟。
小邓最初写:材料不全,流程未成立。
许工摇头:“这是拒绝。”
林澈改成:材料不全,等待用户补正。
小邓看着这句话,问:“那如果系统找不到这条等待呢?”
最后他们写下第一条民生责任规则:
小邓把这条规则复制进编辑器,又把“人工复核”四个字加粗。加粗没有技术意义,但他还是加了。
他们没有救下整个系统。医保报销的材料预审还在交给智能体解释,企业开办模块的拒绝理由仍然由模型润色,人才公寓的评分规则也来不及重查。凌晨三点二十七分,林澈看着剩下的模块清单,把它们放进附件,标题是:未覆盖风险。
小邓第一次用笔在纸上写边界条件。他写错了,想涂掉。许工按住他的手,说:“别涂。错也要留着。以后你才知道自己从哪儿改过来。”
凌晨四点,老板打电话过来,声音压得很低:
“林澈,你们是不是停了智能体重生成?”
“停了核心民生模块。”
“谁让你停的?”
“我。”
小邓抬头看他。
林澈继续说:“还有邓越。他签了第一条。”
老板沉默了几秒:“你知道这意味着什么吗?明天验收可能过不了。客户会认为我们 AI 原生交付能力不足。这个项目如果丢了,公司下半年现金流会很难看。”
林澈说:“如果明天过了,唐阿姨就没来过。”
“她可以重新申请。”
“她昨天来过。”
电话那边传来一声很长的呼吸。
“林澈,别把自己搞成英雄。公司不需要英雄。”
“那就按事故处理。”林澈看着屏幕上那行 A-043,“责任人写我。”
老板没有立刻挂电话。林澈听见他那边有人在问工资表,声音很远。
“我不是不知道她难。”老板说,“我是不知道公司还能撑几次这种正确。”
早上八点五十六分,林澈把修复说明发给周主任。
标题很短:
《关于城市办事通核心民生规则切回人工可追溯引擎的说明》
附件里有二十七条人工规则、影响范围、延期建议、未覆盖模块清单和责任签名。签名第一行是林澈,第二行是邓越,第三行是许建国。
九点整,终验预审会开始。
老板没有来现场。公司法务发来一条消息:在客户确认前,请勿承认系统存在设计缺陷。
周主任坐在会议桌对面,看完报告,摘下眼镜。
“你这句话写得太重。”周主任指着报告第三页,“系统设计缺陷。”
林澈没说话。
周主任拿起笔,把“系统设计缺陷”划掉,改成:
他停了一下,又看见下一行:
这一次他没有划掉。
“需求单位不出具功能符合说明,”周主任说,“今天这个会不能往终验报。”
他在“业务影响确认”下面签了自己的名字。
上午九点二十七分,城市办事通 4.0 正式上线延期,灰度扩面暂停。
四个灰度窗口退回旧系统兜底,高风险民生件临时改走人工复核。
通告发出后,鼎格的项目群炸了。销售问谁负责损失,老板问谁授权延期,法务问谁写了那句“未闭环事实被优化移除”。
半小时后,林澈被移出“南州 4.0 交付核心群”。聊天窗口闪了一下,群名从左侧列表里消失,像一盏灯被关掉。
小邓收到调岗通知:即日起转入文档整理与数据标注支持组。通知下面,父亲发来一条微信:
今晚有个学校考勤小系统,客户要得急,你会不会做?
许工没有收到通知。他只是发现自己的门禁刷不开老机房了。保安说顾问权限到今天上午九点半。
他把那台旧 ThinkPad 装进布包,拉链卡住了两次。
大厅里,唐阿姨重新坐到三号窗口前。
窗口女孩看着屏幕,轻声说:“阿姨,系统显示您昨天来过。材料今天补齐了,可以继续办理。”
唐阿姨怔了怔,像没有听懂。
“我昨天来过?”
“对。”女孩说,“您昨天来过。”
唐阿姨低下头,把塑料袋抱在怀里。她没有哭,只是坐得很直,仿佛那几个字让她重新长出一点重量。
林澈站在大厅边上,忽然收到小邓发来的截图。
截图是一段他刚提交的代码。很笨,不漂亮,甚至有些啰嗦。注释里写着:
下面还有一行消息:
哥,这次注释是我自己写的。
南州的民生系统里,那二十七条规则一直没有删。它们跑得慢,解释啰嗦,升级麻烦,每次改动都要有人签名。
许工退休那天,把那本旧笔记留给了小邓。封面已经磨得发白,里面夹着一张热敏小票和半张补正通知书。票面上的字早就褪了色,只剩一个模糊的号码。
小邓在封面上补了一行字:
软件不存在了。
后来他又划掉句号,接着写:
直到有人愿意为它负责。
夜雨聆风