系列第30篇 | 统筹报告表格被腰斩之谜#x0A;这个看不见的字符牵出派发层、存储层、报告层三层连环bug凌晨报告长这样我正在飞书上看统筹报告突然发现表格不对劲| 1 | DEV-20260801-004 | 买方测试任务 【任务MD文件】请读取: /vol1/100 | ✅ | - | - | ⏳ | ... |表格被拦腰截断了。“完善内容那一列第一行写了个任务标题下一秒莫名其妙换行把”【任务MD文件】请读取直接怼到了下一行后面的状态列全被挤乱了。这不是个例——我翻记录发现至少七八个任务都是这个鬼样子FIX-0719-PC-SIDEBAR-COLLAPSE-FIX: PC端侧边栏折叠后两个问题\n1. 只显示5个主菜单图标... DEV-20260726-011: 修复im-chat.html折叠按钮位置和样式不一致\n\n【任务MD文件】请读取: ...所有多行的summary全在表格里炸了。而这个bug躺了好几个月都没人发现——或者说大家一直以为是个别数据脏从没想过是系统性问题。第一个炸弹一个看不见的换行符先说结论问题出在summary 字段里有换行符\n。我们的派发流程是这样的创建任务MD问题描述写好几行 ↓ send_task.py 派发 ↓ 从MD提取问题描述 → 存入DB的 summary 字段 ↓ format_report.py 生成表格 → 读取 summary问题出在第三四步之间。summary从MD的一整个章节里截出来的如果章节里有多行内容summary里就带着换行符。但真正让我意外的是——这些换行符根本不是任务内容。看这行修复im-chat.html折叠按钮位置和样式不一致\n\n【任务MD文件】请读取: /vol1/1000/w后面那块【任务MD文件】请读取是哪来的这是send_task.py在派发时把额外提示文本拼进了content而summary又从content/MD里提取提取逻辑没过滤掉这些提示语。于是summary就成了任务内容 换行 无关提示的缝合怪。表面问题换行符破坏表格。隐藏问题派发时把给agent的操作提示【任务MD文件】请读取混进了任务内容summary两个语义完全不同的东西被塞进了同一个字段。第二个炸弹为什么没人发现这个bug躺了几个月是因为它只在summary恰好多行时才触发。大多数任务的问题描述就一句话summary单行表格正常。偶尔有个多行的表格就歪一次。这种偶发的失真太容易被当成那批数据脏了——谁会想到是代码bug直到今天我们看到一条干干净净的任务也长这样才意识到这不是数据脏是管线里有病。这让我想起运维圈的一句老话“间歇性故障最危险因为它让你习惯性忽略。”第三个炸弹修复远不止去掉换行一开始我以为很简单——“把summary里的换行替换成空格不就行了”改完format_report表格确实好了。但我盯着修复前后的diff越想越不对劲我只在显示层打了补丁但病根在生成层。真正的病灶有三处生成层send_task.pysummary从MD多行章节截取没清理换行存储层DB把换行符存进了本该单行的字段显示层format_report.py表格拼字符串时没做防御我只修了显示层等于流脓的伤口涂了层粉。下次换个场景summary又带着换行流到别处——比如通知消息、日志、导出文件。真正的修复应该是在summary写入DB之前就清洗干净显示层再用统一的去换行兜底。双保险。最深的一层语义污染修的过程中我发现那个【任务MD文件】请读取才是更隐蔽的问题——它说明同一个字段既装任务内容又装给agent的操作提示。这是数据建模的坑。summary本意是任务的一句话摘要但派发逻辑图省事把整个content含提示都塞进来了提取时又没挑干净。正确的做法是summary只取完善内容或问题描述的第一行操作提示【任务MD文件】是发给agent的指令根本不该进summary。经验总结换行符是表格的隐形杀手——多行summary会让markdown表格腰斩且只在数据恰好多行时偶发偶发故障最误导人——这批次数据脏的错觉让管线bug躺几个月修显示层不够要修生成层——显示层打补丁是治标生成层清洗是治本双保险最佳语义污染比格式问题更深——任务内容和操作提示混进同一字段是数据建模的坑排查多行表格问题先看DB里summary是否含\n再查生成逻辑别只改显示一个看不见的换行符让一张整洁的任务表分崩离析。而它沉默地躺了几个月——因为偶发所以没人当真。真正的bug检查从来不是等它连环爆炸而是揪住每一个小杂音不放。