工程上最危险的不是完全不可用,而是在理想环境里正常、进入真实网络和真实数据量后悄悄失去边界。 颜色是冗余信号而不是唯一信号。状态徽标提供可见文字或 accessible name,图标形状不同,文字与背景达到 WCAG 对比要求。
无障碍不是发布前补一组 aria 属性,而是让键盘、屏幕阅读器、缩放、减弱动态和高对比度用户完成同一任务闭环,并在错误后找得到下一步。
工程边界与取舍
落地时要把关键选择变成稳定契约:输入如何校验、状态由谁推进、资源何时释放、旧版本如何降级。只有这样,后续优化才不会改变原有语义。
- 令牌分别定义 foreground、background、border 和 focus,在深浅主题与 forced-colors 中映射;实时变更不靠闪烁吸引注意。
- 把协议事实、用户意图和自动恢复分层;自动化只能恢复事实,不能推翻用户明确选择。
- 资源释放是协议的一部分:定时器、句柄、队列和临时数据都要在终态中可重复清理。
“连接状态不能只靠颜色:对比度、形状和文案一起表达”的交付标准是正常路径可用、异常路径收敛、资源有界,并且用户能理解系统为何采用当前状态。 这样得到的不是演示代码,而是能解释、能降级、能回滚的生产能力。
生产环境会怎样出错
边界条件会把隐藏假设变成真实事故。弱网、刷新、并发和容量上限必须组合测试,因为单独出现时它们往往都能被重试掩盖。
- 绿色小圆点和红色小圆点对色觉差异用户无区别;只测文本颜色却忽略半透明背景叠加会高估对比度。
- 刷新或网络切换同时触发两条恢复路径,重复副作用被误当成两次真实用户操作。
- 没有背压或配额时,慢消费者会把内存、队列长度与尾延迟一起推高,最后拖累无关用户。
把测试跑成闭环
验证时同时观察两端状态、持久化记录和可观测指标。单看某个按钮或一次接口响应,无法证明整个闭环成立。
- 自动计算最终合成对比度,并在灰度、常见色觉模拟、深色和 Windows 高对比模式逐个识别全部状态。
- 用乱序、重复和延迟消息驱动状态机,确认旧版本被丢弃且显式停止不会被自动恢复覆盖。
- 发布前记录成功率、p50/p95/p99 延迟、错误分类和资源高水位,并为回退条件设定明确阈值。
最终结果应同时满足正确性、可恢复性和可解释性。任何一项只能依赖刷新页面或工程师猜测,都说明协议闭环仍不完整。