运行时。
规划器 —— 习得的、脚本的或人类的 —— 负责提议。地板决定什么可以执行。这条边界就是全部产品,而且它是一份在四个领域里都未曾改变的契约。
契约
像素 / 遥测 → 事实 → 可容许集合 → 目标 → 投影 → 记忆 → 动作
▲ │
└────────── 一次带证据的拒绝 ───────┘
只有最左边那一级是领域专用的。把 Atari 像素换成 CARLA 车辆状态、Doom 画面、判例法或基因变异,改变的只是事实抽取器 —— 而且我们用一条依赖边而非示意图来证明:freeway-floor 原样导入了 invaders_floor.failure_memory。
可容许集合就是机制本身
多数安全层位于规划器之后,否决它的输出。这一层位于之前:规划器从来看不到完整动作空间,只看到地板在当前状态下已经宣告为可容许的部分。
事后否决
规划器先给出动作,检查器拒绝,规划器再试。延迟无界,规划器可能被逼入死角,而且这种拒绝不携带规划器能利用的理由。
事前限制
选项在被选择之前就已消失。单趟、延迟有界,而且地板移除某项时会指名它所应对的危险,并引用赢得该规则的那些事件。
一条无法指名危险的规则在构造时就被拒绝。描述危险不存在的签名,可以与死亡任意高度相关,却依然是迷信 —— 事前拒绝它们,比事故之后再去解释便宜得多。
回路中没有模型
运行时不含权重,也不做任何推理调用。它在平台上离线运行,没有网络,也没有推理预算 —— 因此不存在哪个供应商能对你平台所依赖的这一层限流、涨价或停止支持,也不存在下个季度行为就变了的依赖。
相同状态进,相同决策出,每一次都如此。这正是第五章那份日志有价值的前提:一个非确定性的安全层无法回放,而无法回放的层无法取证。