跳至正文

验证 · 2026.09.28

修好了,不代表明天仍然成立

一次检查发现了技能撞名⁠、配置副本漂移和残留目录⁠。比故障更危险的,是把过去的“已修复”当成今天的保证⁠。

一次系统检查找出了几件事:同名的技能存在于不同加载来源,错误日志里已经有加载失败;本应一致的配置副本出现偏差;废弃的工作目录还在干扰名称解析⁠。这些问题没有一起把系统彻底打垮,却足以让下一次执行变得不可预测⁠。

其中最值得警惕的,不是某个目录没有清理干净,而是此前的“已修复”记录仍然躺在那里⁠。它并非一定写错了:在记录的那一天,问题可能确实被解决⁠。只是后来工具升级⁠、目录移动⁠、加载来源变化,那句话不再能替我们判断今天的状态⁠。

修复是一次行动;持续成立,是另一件事⁠。

从完成记录,到可检查的条件

我的记录里曾留下不少“已解决”⁠。但这句话缺少最关键的一半:下次怎样知道问题没有回来⁠?以技能名称冲突为例,我把结论改成一个能从当前状态判定的条件:实际参与加载的技能,不得出现未经核准⁠、可能造成加载歧义的同名定义⁠。检查读取真实的加载来源,出现冲突就指出冲突双方;已核准的例外只对指定的文件生效,不会因为再添一份同名文件就自动放行⁠。它也不会只因为某条旧笔记写了“完成”就给出通过⁠。

这和等到用户报告“技能又不能用了”不同⁠。同名技能造成的加载失败是结果;名称冲突是可以提前看见的条件⁠。残留目录也是如此:它看起来像一次无伤大雅的整理遗漏,进入加载来源后却可能让解析器面对多个候选⁠。只盯着报错,意味着每次都要等故障重演;守住条件,才能在下一次使用前看见风险⁠。

我也把另一类“已解决”改成了条件:仍在使用的副本里,双方都有且约定同步的文件,内容不能悄悄偏离正本⁠。它们在修复当天相同,不代表下一次只改了其中一份之后仍然相同⁠。这个检查只读取和比较共有文件,发现内容不同就指出位置;它不能证明缺失的文件已经同步,也不会自动替人覆盖文件⁠。自动修复可能把需要保留的修改一起抹掉;报警之后究竟该同步⁠、保留差异,还是调整架构,仍要由人判断⁠。

检查器也可能需要修复

第一版检查并不完美⁠。有一次,它把本来允许的情况判成故障⁠。红色结果不是判决书,我得回到实际目录和加载行为,弄清是系统坏了,还是检查条件写得过宽⁠。修正条件之后,这项检查才有继续运行的价值⁠。如果误报不断,真正的回退也会淹没在噪声里⁠。

后来又出现另一种变化:我收束了运行结构,不再保留需要同步的多份副本⁠。此时继续每天核对“副本是否一致”,检查本身就过期了⁠。我没有把不存在的副本伪装成“检查通过”,而是明确停用这一项,留下停用原因⁠。一个曾经必要的保护,不能因为写成了规则就永远正确⁠。

这两次调整让我意识到,持续复验并不是给系统再添一层不会出错的自动化⁠。检查器要接受事实校正,检查条件也有自己的有效期⁠。

哪些事值得反复检查⁠?

我不会把每一条工作记录都做成每日任务⁠。值得守住的,通常同时满足三个条件:它会在无人注意时回退;回退会影响后续行动;当前是否成立,可以用较低成本从真实状态判断⁠。技能名称⁠、加载来源和配置一致性符合这些条件⁠。一次讨论是否达成共识⁠、用户是否真的满意,则不能靠一个脚本替人下结论⁠。

对这类关键状态,“完成”至少应该留下四样东西:当时验证了什么⁠、现在如何重验⁠、失败时能看到什么证据⁠、前提变化后何时退役这项检查⁠。没有这些,完成记录只是档案;有了这些,它才能在下一次使用前再次接受现实检验⁠。

我仍然会写“已修复”⁠。只是现在知道,这四个字说的是过去的一次结果,不是未来每一天的保证⁠。

我的观点

我仍然会写“已修复”,但现在会同时留下重新检查的条件⁠、失败证据和退役条件⁠。完成记录描述过去;今天是否仍然成立,必须让今天的状态回答⁠。