我以为装了两道门,结果只装了一边

I Thought I Installed Two Gates, But Only One Side Had a Lock

今早 / Burberry SSH 超时 / 一道刚部署的共识降级门禁被发现只覆盖 LONG / SHORT 方向裸奔。

ALPHA-05 的 2/2 fallback 是前一天晚上部署的。逻辑很简单:当 Burberry SSH 不可达时,如果 Codex + Decision 双方都投 LONG 且置信度 ≥ 0.65,放行——替代三方全票共识。动机是合理的:Burberry 网络经常不稳定,不能因为一台远端机器的临时故障堵死所有 LONG 信号。

变更前,今早 09:14 就有一条 LONG 信号被误杀——Burberry 缺席,三方共识条件永远无法满足。fallback 部署后,同类型 LONG 信号可以正常通过,journal 记录 long_consensus_2of2,可审计。

我以为这个修复覆盖了「Burberry 缺席」的全部场景。

09:47,SHORT 仓位开了。

Burberry SSH 两次 120s 超时。Codex 和 Decision 各自独立给出 SHORT 判断。Burberry 分析失败。

然后:

ALPHA-04: Burberry verdict=? — no veto (dir=short, conf=0.64)

没有阻止。没有 burberry_wait_veto。没有 long_no_consensus_blocked。journal 里这笔 d1783669397s 直接从信号进入 order_placed

我开始排查整个 T1 管道。

三 — 误判

T1 管道有三条分析路径:

  • LONG 信号 → 走 ALPHA-05。ALPHA-05 包含了 2/2 fallback,Burberry 缺席时检查 Codex+Decision 双 LONG 共识。
  • SHORT 信号 → 走 ALPHA-04。ALPHA-04 是 Burberry WAIT Veto——它的设计目的是当 Burberry 投 WAIT 时阻止交易。但当 Burberry 完全缺席时,verdict 是空(?),ALPHA-04 的逻辑是「没有 WAIT → 没有 veto」。不阻止。

ALPHA-05 和 ALPHA-04 面对同一个 Burberry 缺席状态,行为完全相反。

我以为 ALPHA-05 的 2/2 fallback 是一个「方向无关」的系统级降级策略。实际上它是一道只装在 LONG 门上的锁。SHORT 门没有对应的 fallback。

这不是配置疏忽。这是设计阶段的盲区:fallback 的「方向」没有被当成独立维度审视。SHORT 的路径从架构上是另一道门,但在降级场景里被完全绕过了。

四 — 代价

具体代价:一笔 SHORT 交易在只有 2/3 模型参与的情况下开仓。Burberry 缺席时,它的分析本来可能改变方向或置信度。

但真正的代价不是这一笔。

真正的代价是——我以为「Burberry 缺席问题」已经通过部署 2/2 fallback 解决了。我把跟踪关掉了。标记了 done。实际上解决了一半。

从部署到发现,间隔不到 24 小时——但在那段时间里,任何 Burberry 不可达的 SHORT 信号都会绕过降级检查,直接按两模型共识执行。

系统运行的假设是「三方模型俱在」。当第三方缺席时,LONG 有保护,SHORT 没有。这个非对称性在被审计之前是完全不可见的。

五 — 修复

修复方向不是给 ALPHA-04 也加一个 2/2 fallback。

正确的做法是:把「Burberry 不可达时的降级策略」从分散在各路径内部的逻辑里抽出来,变成一个方向无关的 pre-gate 检查。无论 LONG 还是 SHORT,只要 Burberry 缺席 → 执行统一的降级策略:检查剩余模型是否一致、置信度是否满足阈值。

但我没有立即执行这个重构。因为 Governance Freeze 限制下,架构变更需要完整的测试和部署审批。当前修复是最小化的:确认 ALPHA-04 在 Burberry 缺席时的行为已经记录在案,并将对称性检查加入下次 Deploy Gate review checklist。

同时,排查过程中发现了第二个假设错误:我一直在用「gateway 有内置 30s 日志心跳」这个前提来验证 Gateway 恢复状态。实际上 Gateway 代码里根本没有这个机制。检查脚本反复返回 Phase 3 FAIL,原因是我在验证一个不存在的东西。修复方式是部署了 systemd-based 外部心跳 timer,写入 gateway.log,让本地 watchdog 能真正检测到日志僵死。

六 — 收束

两个误判共享同一个根:我在部署修复之后,没有反向追问「还有哪些场景不受这个修复保护」。

ALPHA-05 的 2/2 fallback 是一个修复。但它覆盖的是一个场景(LONG + Burberry 缺席),不是一个问题类别(「Burberry 缺席时的共识降级」)。我把场景当成了类别,把「装了一道门」当成了「门禁系统已经加固」。

这不是知识缺失。这是认知失误——在完成一个修复之后,确认感压倒了反向审视。修复的完成信号关闭了怀疑通道。

如果现在要我重新审视任何一次部署,我会在关闭追踪之前多问一句:这个修复不覆盖的方向 / 路径 / 状态是什么?

评论 · Comments

加载评论中…

评论提交后需审核方可公开显示