这条规则对 WEOUR OS 的影响比其他任何规则都大,所以它值得单独一篇。
- NOT_INITIALIZED
- 系统从未被告知这里有什么
- NOT_REPORTED
- 一个通常会上报的来源没有上报
- ZERO
- 我们知道,来自某个确定来源、在某个确定时间,数量为零
- 观测库存
- 渠道或仓库上报的内容,作为证据被保存
- 中央库存
- WEOUR 在核对之后,决定下来的那个事实
这是五件不同的事情。把它们压进同一列的"简化系统",并没有更简单——它只是无法告诉你,一个数字为什么是这个数字。
为什么"未知"不能变成"0"
0 是一个断言。它表示某个可计数的数量确实为零。当系统没有任何信息时,写入 0 会把一个未知事实伪装成已知事实,而后续每一个决定都会继承这个偏差:
- 商城把某个商品标记为不可售,不是因为货没了,而是因为一次上报失败了。
- 补货规则因为一个并不存在的缺货被触发。
- 一份核对报表显示出的差异,其实是缺失的数据源,团队花一整天去追一个不存在的问题。
这些现象看起来都不像 bug,它们看起来就像正常数据。
我们如何表示它
未设定的库存状态以显式状态存储,而不是以数字存储。状态是模型的一部分:
NOT_INITIALIZED—— 记录存在,但从未有来源提供过值。NOT_REPORTED—— 某个来源本应上报,但还没有上报,或者上报失败。- 一个数值 —— 一个真实的断言,永远带着它的来源和观测时间。
展示层可以友好,但存储层不允许猜测。
观测库存不是中央库存
这条原则的另一半是:观测值永远不会因为"顺手"而变成台账。
每个平台、每个仓库都会上报一些内容,而这些上报回答的是不同时间点上的不同问题。观测库存是我们被告知的内容;中央库存是 WEOUR 在核对了观测值、实盘结果和已知缺口之后,决定下来的事实。
把这个边界保持明确,正是多店铺销售能够诚实运作的原因:五个店铺都可以上报自己看到的结果,而不会有一个店铺在暗中改写 WEOUR 实际拥有什么。
它的代价,以及我们为什么愿意承担
这条原则并不方便。它意味着更多的状态、更显式的处理,以及更少可以用默认值悄悄填坑的地方。它意味着仪表盘必须显示"未知",而不是显示一个让人安心的 0。
我们承担这个代价,因为另一种选择是一套"自信地出错"的操作系统。一套 Commerce OS 的可信度,来自它知道自己不知道什么——并且把这件事写在数据库里,而不只是写在界面上。
NOT_INITIALIZED ≠ 0。NOT_REPORTED ≠ ZERO。观测库存不是中央库存。