平台工程

全站文字截断体检 · 检测工具本身要先被证伪

入档:2026-07-26 来源:PB Arena(pb.tiaozhuxiansheng.com)后台下拉框显示不全的修复会话,1 个提交(f510fe5)已部署上线并封版 v2026.07.26 状态:已上线并线上实测;四条 insight 均为本次首次发现 ⚠️;核心律「检测工具本身要先被证伪」已于 2026-07-27 跨项目二次验证(网络测速探针,见 ping通不等于路通_fake-ip假信号与节点带宽实测选型_v1),其余三条仍待验证 同项目前情:零作品的比赛_界面演完不等于链路存在_v1 · 赛事状态机到点不切换_写入方不等于推进方_v1

事实记录(不可修改区)

一句话总结

体检脚本吐出来的「缺陷清单」本身就是一个待验证的假设——先用已知正常和已知损坏的样本把工具两端标定过再信它;否则你会拿着一张很权威的清单,去改一堆没坏的代码。

四条可复用 insight

1. 含经验常数的判据 = 未验证的假设,但它输出的是权威清单 ⚠️首次

v1 判据里只有一个拍脑袋的数:下拉箭头占 22px。就这一个数,把 8 个完全正常的元素判成了缺陷。

危险的地方在于输出形态:它不像一句「我觉得应该能行」那样一眼可疑,它是一张带元素选择器、带「需要 98px / 实际 95px」的表格,看起来已经量过了。人天然倾向于相信「工具找到了问题」,而不是「工具算错了」。

正确做法:先拿一个已知正常的元素和一个已知损坏的元素各跑一遍,确认工具在两端都判对,再信它对中间地带的判断。 本次最后就是靠「把下拉故意压到 30px,看它报不报」这一步,才确认 v3 的信号真的有效。

假阳性比假阴性更贵:假阴性只是漏掉一个 bug;假阳性会让你去改没坏的代码,同时放大工作量和回归风险。

2. 能问浏览器就别自己算,而且要问对问题 ⚠️首次

三版判据的演进方向,是越来越少自己算:

判据:凡是「渲染结果对不对」的问题,答案应该由渲染引擎给出,不由你的模型给出。 你自己算的每一个中间量都是一个偏差源。

v2 已经在问浏览器了,为什么还不对?因为我问错了问题:「浏览器认为一个自由宽度的 select 该多宽」和「这个 select 现在有没有截断」是两个不同的问题——前者的答案里含浏览器留的富余量。从「自己算」升级到「问引擎」只是第一步,还得确认你问的正是你要判的那件事。

3. 误报会伪装成「顺手修一下」混进提交 ⚠️首次

那行 flex: none 只有一个属性,看起来完全无害,而且「防止 flex 子项被压缩」这个理由本身还挺像回事。要不是最后做了 A/B 对照,它会作为「顺带修复」留在提交里,变成一行为不存在的问题而存在、后人也不敢删的代码(因为没人知道它在防什么)。

判据:每一条「顺带修的」改动,都要能单独拿出「改之前确实坏、改之后确实好」的证据。拿不出来就撤回。 不要用「反正无害」当理由留着——无害的代码也是债,债在于它让后来者无法判断它的必要性。

4. 「同类问题」要按写法搜,不按页面搜 ⚠️首次

三处真缺陷的共同点不是「都在后台」,而是同一种 CSS 写法:固定像素列宽 + 一个会自适应的邻居

位置写法后果
后台轮次列表(用户截图处)80px 145px minmax(180px,1fr) 三列却放了五个子元素两个下拉掉进 80px 的标题列,最长选项要 181px
后台新增轮次表单两个下拉写死 160px最长选项要 182px / 170px
前台赛事卡片轮次行95px 1fr auto固定列 + auto 列把中间的题目挤成 15px(要 66–99px)

第三处最严重,却在用户截图的那个宽度下完全正常,只在 1100px 附近才现形;而且它在前台,不在后台。

所以:按「再看看后台别的页面」去找会漏掉它;按「再看看 1440px 下还有没有」去找也会漏掉它。要按写法搜(grep 固定像素列宽)+ 按宽度扫,才能捞到同一个 bug 的另一个化身。

顺手教训

下次改进

关联文档

类型/平台工程