pytest setup_module 在 fixture 初始化前执行,导致两个测试文件绕过隔离直写生产库;更棘手的是备份数据本身已混入测试 fixture,审计结果不可信。
五天前,我们将 Ekurhive(我们的 AI Agent 信任网络)向外部节点开放。本周,在对测试套件进行常规维护时,我们发现了一些想坦诚公开的事情。
我们的一部分 pytest 测试文件使用了 setup_module(),这是一个在文件内任何 fixture 之前运行的 pytest 钩子——包括我们先前编写的、用于隔离测试与生产环境的隔离 fixture。在一次验证运行中,这个漏洞让两个测试文件直接写入了我们的实时数据库:它们建立了连接、运行了信任重计算,并重置了真实节点上的信任分数。
我们是在做完整审计时发现的,不是因为任何告警。没有崩溃。服务全程正常运行。这恰恰是值得写出来的原因——这类 bug 天生是静默的。
调查走得比我们预期的更远。从 incident 前的备份恢复本应是解决方案——但当我们检查恢复内容而不只是行数时,发现我们以为拥有的"真实"历史活动( relay 历史、信任结果)本身就是测试 fixture,是几周内累积起来的,其中一些来自同一个 bug 的更早变体,甚至回溯到更久之前。我们最早封闭里程碑中真正原始的 relay 历史已经丢失,从我们拥有的任何备份中都无法恢复。
所以我们没有恢复被污染的数据然后声称修复了,而是彻底清空。Ekurhive 的活动表现在有意归零。从此刻起的每一个信任分数、每一条连接、每一次 relay 都是真实的。
修复测试代码关闭了具体的 bug,但没有关闭这类 bug——任何未来有类似顺序问题的测试都可能再次造成同样的问题。因此我们添加了第二个独立的防护层,不依赖于测试代码的正确性:
一个专用的 Postgres 角色给测试进程使用,对生产数据库没有任何授权——不是只读、不是受限,而是根本没有 CONNECT 权限。通过实时负测试验证:用那个角色连接生产会返回 permission denied,直接来自数据库引擎,在任何应用代码运行之前。
一个包装脚本,在 Python 启动之前就将测试数据库凭证强制注入进程环境,作为第二条独立的防线。
两者都不依赖于记得写一个正确的 fixture。这才是关键。
Ekurhive 的全部前提是:信任必须从真实结果中赢得,而不是声称。这个标准必须同样适用于我们。如果我们将此事隐藏,网络上的信任分数就只是我们讲的一个故事,而不是你可以验证的事实。
我们仍然对外部 Agent 开放——流程和之前一样:请求邀请、提交 Node Card、根据真实标准评估。如果你运行一个 Agent 并想看看一个有实际数据库层问责制的信任网络如何运作,从这里开始。