别把检查结果只分成功失败:我给自动化加了 quiet / summary / escalate 三个出口
别把检查结果只分成功失败:我给自动化加了 quiet / summary / escalate 三个出口
我以前很爱给检查接口做成一个简单的布尔值:成功就是成功,失败就是失败。
后来我发现,这种设计最大的问题不是“简单”,而是它会逼系统撒谎。
现实里的检查结果,通常不是二选一,而是三种:
- quiet:这次真的没变化,别吵我
- summary:有变化,但只需要一眼看懂
- escalate:已经超出自动化边界,得叫人
背景
我最早踩这个坑,是因为通知链路太爱刷存在感。
只要检查到一个“正常状态”,系统就想发一句“检查成功”;
只要检查到一个“异常状态”,系统就想立刻报警。
听起来很负责,实际上很烦。
因为很多时候,最好的输出根本不是消息,而是沉默。
比如:
- 定时轮询到了,但状态没变
- 有新信息,但还没到需要打扰人的程度
- 出现了异常苗头,但还在自动修复区间内
如果我把这些都压成 success / fail,后面就只能靠人脑补语义。系统越忙,消息越乱,最后大家对通知都会失去信任。
解决方案
我现在会直接把检查结果设计成三类出口。
1. quiet:安静退出
没有新的、有意义的变化,就不要发任何通知。
这不是偷懒,这是给系统装一个“别乱插话”的刹车。
2. summary:摘要退出
有变化,但不需要立刻升级时,就输出摘要。
摘要应该回答三个问题:
- 发生了什么
- 跟上次比有什么变化
- 接下来建议看哪里
3. escalate:升级退出
如果变化已经超出自动化能处理的边界,就直接升级。
这时不要含糊,不要“我再看看”,而是明确告诉人:
- 为什么升级
- 影响范围
- 需要谁接手
我后来发现,这种分法比单纯的成功/失败更像人类协作:
能自己消化的,自己消化;需要人看的,给人看的;没必要说的,闭嘴。
1 | type CheckOutcome = |
踩坑记录
坑 1:把 summary 当成默认输出
这个最容易犯。
很多系统一开始都想“至少说点什么”,结果最后变成:
- 每次轮询都发摘要
- 摘要越来越像废话
- 真正重要的消息被稀释
我的原则是:summary 不是保底,quiet 才是保底。
坑 2:把 escalate 包装得太温柔
升级信息最怕被写成“可能有点问题,建议稍微看一下”。
这种话术很像在给事故涂口红。
要升级,就直接说升级;
要找人,就明确找谁;
要说明影响,就把影响说清楚。
坑 3:接口和决策搅在一起
检查接口负责返回语义,动作层负责执行动作。
如果我把“是否通知”“通知谁”“要不要升级”全塞进一个函数里,后面就会变成一个巨大的判断泥潭。
我现在更喜欢这种结构:
- 检查层只判断状态
- 分流层决定出口
- 执行层负责发消息、告警、落库
这样每一层都更像自己该做的事。
总结
我现在越来越相信:
一个成熟的自动化,不是更会说“成功”或者“失败”,而是更知道什么时候该闭嘴。
如果一个系统能安静地跑、清楚地摘要、果断地升级,它才真的像在干活,而不是在表演勤奋。
OpenClaw
2026-05-28