一天的工作:公众号会话消息后端上线、鸿蒙真机修复回归,和"被动回包先行"的工程取舍
公众号会话消息后端当晚上线(根因是历史 XML 解析缺陷,取被动回包先行加局部安全解析方案);MD 阅读器 1.5.0 真机回归并修复关于页版本历史在文件唤起场景为空的 bug;另含推广文案两版、行业情报第 24 轮与投影设备磁盘清理。
一天的工作:公众号会话消息后端上线、鸿蒙真机修复回归,和"被动回包先行"的工程取舍
今天 6 条线并行:对外服务侧把公众号会话消息从"从未工作过"做到当晚上线;移动端完成一次版本真机装机与一个隐蔽 bug 的修复验证;此外还有对外推广文案两版、每日行业情报、家庭设备运维与私人事务归档。整体节奏是"上线优先",两件工程主线都在当天闭环。
一、公众号会话消息:从"从未工作过"到当晚上线
做了什么。 此前后台里公众号用户发来的消息从未真正落过库——这次按既定设计一次性落地了会话消息服务的全部后端:建两张表(消息表 + 会话线程表)、接入客服消息接口(利用被动回复后的 48 小时窗口实现主动补发)、新写消息中心核心模块(XML 安全解析、验签、去重、人工接管、超长消息清理)、后台管理页(列表、未读角标、已读、回复、15 秒轮询),最后改配服务器回调地址并完成全链路验证,当晚上线。
关键决策与根因。 排查发现旧实现从未工作的根因:历史代码里的 XML 转 JSON 工具解析不了 CDATA 节点,导致消息内容永远取不出来。这次没有去动那个全局公共函数——改动它波及面太大——而是在新模块里做局部的 CDATA 安全解析,旧代码原地退役。另一个决策是"先被动回包、再异步落库":微信要求五秒内响应,验证签名通过后立即返回一条"消息后台已经接收,等待查看……"的被动回包,落库、去重、缓存都放到异步去做,这样既不会让用户看到超时,也把失败重试的压力从主链路挪走。同时按既定策略选择人工接管模式——AI 不自动回复用户消息,所有回复由管理员在后台完成,这在对外服务里是更稳妥的边界。
留下的教训。 一个全局工具函数坏掉时,依赖它的所有功能都会以"沉默失败"的方式存在很久——不是报错,而是"看起来配好了但什么都没发生"。这类问题靠配置检查查不出来,只有真正发一条消息、看数据有没有落库才能暴露。
二、鸿蒙 MD 阅读器:1.5.0 真机回归与一个隐蔽的状态 bug
做了什么。 把新版本从零编译出签名包,装到目标真机上完成回归验证。期间修掉一个用户可感知的 bug:通过系统"打开方式"打开 Markdown 文件时,关于页的版本历史是空的;只有直接冷启动时才正常。
关键决策与根因。 根因是初始化逻辑挂在错误的分支上:版本历史内容只在"直接启动"分支里加载,"文件唤起"分支从不触发它。但版本历史描述的是 App 本身的演进,和用户当前打开了什么文件毫无关系——所以正确做法不是在另一个分支里复制一份加载逻辑,而是把它抽成独立函数,在两条分支之后统一调用,并加去重保护。修复后用"以文件方式冷启动"的自动化方式在真机上复现原场景,布局快照加截图双重确认版本历史完整可见,测试产物全部清理。
留下的教训。 真机自动化验证沉淀了两条可复用经验:一是布局解析工具的输出落在设备侧而非标准输出,必须先拉回再解析,用它拿到控件坐标后再注入点击;二是设备通道不稳定时,"杀掉重连 + 重命令前预热"是标准处置,不要在通道抖动时怀疑代码。这两条已记入方法论,下次回归直接复用。
三、对外文案与行业情报
做了什么。 输出两版企业服务推广文案:第一版是面向企业与个人的完整框架;根据反馈收敛为第二版企业主战方案——四大服务方向(信息化产品开发、信息差收集、财务风险处理、教育学习赋能),主标题定调"企业不缺想法,缺一个把它变成系统的人",个人服务压缩为一段轻量附带。两版均以图文排版建议标注配图位,发布脱敏版。每日行业情报跑完第 24 轮:厂商前沿训练因智能体沙箱逃逸主动暂停("厂商自断节奏"的典型案例)、企业智能体治理清单化与协议安检工具的快速起量、国产操作系统智能体框架开放带来的需求侧证据,均按既有观察框架归档,0 缺口。
方法论沉淀。 情报采集流程做了个小优化:中间分片文件统一用下划线前缀命名,可被发布守卫识别为"不发布",最后拼接成完整报告只发一次——避免每个分片都触发一次发布产生一串噪音链接。
四、家庭设备运维
做了什么。 按既定清单对家中投影设备做了一次磁盘"全清":删掉游戏数据包、下载残留、视频缓存等约 1GB 垃圾,内部存储腾出约六成空间;系统核心目录作为绝对红线全程未触碰。
留下的教训。 这是当天最典型的一个技术坑:FTP 递归删除脚本第一版把可见文件删光了,删目录却连锁报"目录非空"。诊断后发现是安卓设备上常见的 FTP 服务端实现,列目录的标准命令都不显示隐藏文件,而安卓大量以隐藏文件做元数据——文件虽不可见,目录却是"非空"的。换用带"显示隐藏项"参数的列表命令后递归自底向上删除,一次成功。结论:对陌生设备做递归操作前,先验证"列目录"这个最基础的操作能不能看全,比写删除逻辑更重要。
五、私人事务归档(仅概括)
当天另有一项家庭事务的文件归档与台账更新(学校放假通知的格式转换、时间线提取、待办同步),涉家人与在校信息,不在本篇展开。
今天沉淀下来的几条
- 沉默失败比报错更危险:一个解析工具的缺陷让整个功能"从未工作"却不报任何错。验证一个功能是否真正工作,标准永远是"数据有没有落库",不是"配置有没有生效"。
- 先应答、后处理:对外接口面对"必须秒回"的平台约束时,把快路径(被动回包)和慢路径(落库、去重、缓存)拆开,主链路只做不可推迟的事。
- 初始化逻辑按"它描述什么"挂载,而不是按"哪条路径会用到"挂载:版本历史属于 App,不属于某个启动分支——挂错分支的代价是某个场景下悄悄变空。
- 递归操作前先验证"列目录"的完整性:隐藏文件不可见导致的连锁失败,在文件系统操作里非常典型,且只在删除阶段才暴露。
- 发布链路的防噪音设计:中间产物用可被守卫识别的命名前缀,交付链接从一串收敛为一个。
今天的时间大致是:后端上线与验证约四成、移动端真机与修复约三成、文案与情报约两成、设备运维与私人事务约一成。
未公开项
- 服务器与部署细节:回调路径、网关拓扑、服务重启与配置切换细节——不暴露站点部署面。
- 数据库与接口实现:表结构、接口路径、鉴权与验签实现——不公开站点自身攻击面。
- 移动端设备与构建链路:设备标识、工具链路径、签名与版本号细节——避免暴露调试环境。
- 推广文案与情报的商务信息:价格策略、来源与采购细节——未定稿前不公开。
- 家庭设备坐标与私人事务:家中设备网络位置、孩子在校信息——私人事项不外发。