倒计时屏上的数字跳到二十九分钟时,第二家供应商的演示提前结束了。
三号准备室里的空气像被人突然抽紧。按原本的排位,星川前面还有一家,可恒辉工作人员推门进来,语气公式化:“请星川科技做好准备,前一组若继续弃权,十分钟后轮到你们。”
陈海猛地抬头:“十分钟?不是还有二十多分钟?”
“演示顺序不变,空档不等待。”工作人员说完就走。
屏幕上的红色报错还没消失。字段映射失败,推荐理由页无法生成,临时接口只跑通了读取样本,输出仍是一片空。叶辰握着鼠标的手指发紧,额角冒出汗。
林川看了一眼时间,没有让情绪扩散:“先停一下。现在谁能给出可验证结果?”
陈海盯着工作站:“我能保证读取和排序框架不崩,但缺三个入口,解释链断了。硬上,客户会觉得我们只会报环境问题。”
刘敏把现场记录推过来:“技术部刚补了一句口头说明,item_bucket是业务分组,campaign_mark含人工活动和系统活动两类来源,但细分值没有文档。sync_batch只代表库存同步批次,不等同时间戳。”
“那就别假装等同。”林川说。
远程会议请求在这时接通。周野那边背景很低,像是在医院走廊尽头。他没有寒暄,第一句话就是:“别重写推荐,重写适配层。”
陈海立刻靠近屏幕:“你看到了?”
“看到了。”周野声音有点哑,“你们现在的问题不是模型能力,是输入口径突然换了。把旧字段当目标,永远补不齐。把新字段当客户给定事实,只做三件事:读入,标注不确定性,输出候选理由。”
叶辰急促地说:“可是没有manual_pin_flag,人工置顶剔除怎么做?”
“不剔除。”周野说,“标出来。campaign_mark无法判断细分来源,就在理由里写明:活动来源未细分,需客户技术部确认后进入正式灰度。你们今天是竞标演示,不是上线生产。”
这句话让叶辰怔了一下。
林川接过话:“客户需要看到的不是我们临场猜对所有字段,而是我们不在证据不足时乱承诺。”
陈海快速敲下几行改动,又停住:“白名单工具里没有我们昨晚用的前端环境,只能输出一张简化结果表。”
“够。”林川把纸质方案翻到可解释输出页,“何旭,把说明改成客户语言:每一条推荐旁边必须有来源、限制和失败条件。刘敏,所有修改时间、字段假设、口头说明来源逐项记录。叶辰,你做接口。”
叶辰抬头:“我?”
陈海也愣了一下。以往关键提交都由他最后接手,叶辰更多负责样本和异常。可现在陈海要盯运行环境和基础排序框架,真正卡住的那段临时映射,反而是叶辰最熟。
林川看着叶辰:“南城那次,你最先发现低可信场景簇。现在也一样,只做你能证明的部分。写不出来,就明说写不出来。”
叶辰喉结动了动,点头:“我做。”
准备室外传来脚步声,第三家供应商开始进场。倒计时只剩十八分钟。
叶辰坐到主工作站前,先把旧映射配置全部注释掉,只保留输入校验。他没有再试图把item_bucket强行塞回sku_group,而是新建了一个临时映射表:商品业务分组进入候选池过滤,活动来源标记进入风险备注,库存同步批次只作为数据新鲜度等级,不参与权重计算。
第一遍运行,接口仍然报错。原因是一组item_bucket为空。
陈海伸手想接键盘,林川抬手拦了一下。
叶辰自己也看见了。他咬住牙,把空值单独列入“需人工确认分组”,不再丢弃整行。第二遍运行,候选结果出现了,但推荐理由里有两条写成“未知来源优先”。
“删掉优先。”刘敏立刻提醒,“未知不能优先。”
“对。”叶辰手速越来越快,“未知只进入观察,不进入前排。”
周野在语音里低声说:“对。宁愿少推荐,不要乱推荐。”
这句话像把叶辰从慌乱里拎了出来。他把活动来源未细分的样本降级为观察候选,只保留业务分组明确、库存批次较新的商品进入前十。理由页变成了简化表格:推荐编号、商品分组、库存批次、活动来源状态、推荐原因、不可用条件。
它不漂亮,甚至有些粗糙,但每一列都能说清。
门外第三家供应商的声音透过墙传来,对方正在展示一套完整动画。陈海看了眼屏幕,又看了眼自己这边朴素得过分的表格,低声道:“视觉上吃亏。”
“客户买的不是动画。”林川说,“恒辉现在真正怕的是二期继续变成黑盒。”
何旭把环境变更说明压缩成一页,递到林川手边:“我写成了三段。第一,星川接受统一环境;第二,因字段说明不足,本次演示只展示公开字段下的最小可解释流程;第三,所有未确认字段不进入强承诺。”
林川扫完,划掉一句“我们受到影响较大”,改成“该限制同样适用于各入围方”。他不需要卖惨,卖惨解决不了客户问题。
倒计时剩余七分钟。
工作站忽然卡住。叶辰刚生成的结果表停在百分之八十七,鼠标转圈,屏幕半天没有响应。
陈海脸色变了:“内存限制。它们这个镜像配置太低。”
叶辰手一抖:“我把样本全读进去了。”
林川没有责备,只问:“能分批吗?”
“能。”叶辰吸了口气,“但要改输出合并。”
周野在语音里说:“不用合并全部。竞标演示只取技术部抽定样本的前三个批次,展示同一规则可重复执行。把剩余批次列为未演示范围。”
“会不会显得我们跑不完?”叶辰问。
林川看向他:“跑不完就写跑不完。客户给的准备时间和环境,就对应这个演示边界。我们要准时登台,不是装成什么都完成。”
叶辰闭了闭眼,再睁开时,手已经稳了。他把全量读取改成按sync_batch分批读取,先取前三个库存同步批次,输出每批前五条候选,并在表头加上“现场临时演示范围”。陈海帮他压掉多余日志,把接口返回时间控制在三秒以内。
第三家供应商演示结束的掌声响起。
恒辉工作人员敲门:“星川科技,还有五分钟。”
叶辰的最后一段接口还没保存。准备室里所有人的视线都落在他手上。
他没有抬头,只低声说:“给我五分钟。”
林川站到他身后,没有催。陈海把手从键盘旁移开,刘敏继续记录每一次保存时间,何旭把纸质说明按顺序排好。周野那边也安静下来,只剩医院走廊模糊的广播声。
第一分钟,接口保存成功。
第二分钟,候选结果跑出。
第三分钟,推荐理由页生成。
第四分钟,叶辰删掉最后一条证据不足的推荐,把它移进观察列表。
第五分钟,他按下运行。屏幕上没有再弹红色报错,简化结果表一行行铺开,旁边的限制说明清清楚楚。
叶辰靠回椅背,像刚从水里捞出来:“可以登台。”
林川看着那张并不华丽的表,心里反而定了。星川没有在临时环境里变出奇迹,只是守住了最该守住的东西:能解释的才输出,不能证明的就标明边界。
他合上文件夹,对周野说:“辛苦。后面由我们现场负责。”
周野沉默两秒:“别替我背书,也别替自己找借口。让数据自己说。”
林川应了一声,断开语音。
准备室门打开,恒辉工作人员站在走廊里:“星川科技,请入场。”
赵凯正从二号准备室门口看过来,目光扫过林川手里薄薄一叠纸,又落到叶辰苍白却发亮的脸上。他似乎想说什么,最终只是轻轻哼了一声。
林川没有看他太久。他带着陈海、刘敏、何旭和叶辰走向演示厅。
陆承站在门边,低声提醒:“今天所有入围方用同一批真实脱敏样本,技术部会同步记录输出。”
“正好。”林川停了半步,抬眼看向演示台上的屏幕。
星川科技的名字亮了起来。
他把临时接口接入恒辉工作站,拿起话筒,第一句话没有讲公司,也没有讲委屈。
“我们先看数据。”