网关故障处理机制与责任划分
离线集成流程:_handle_message → 会话准备与租约管理 → 生产环境发送
_run_agent / TurnRunner → 实际的 AIAgent → 循环式 HTTP/SSE 传输 → 磁盘 SQLite 存储 →
网关持久化与消息投递 → 异常情况 fallback 处理。
.venv/bin/python evals/gateway_failure_ownership/probe.py "$PWD" /tmp/ownership.json
scripts/run_tests.sh -j 1 tests/gateway/test_failure_writer_ownership.py
第一个参数用于选择生产环境中的结账流程,这样一来,无需修改该测试固定装置,即可对其它结账流程进行 A/B 测试。系统会记录其临时的 HERMES_HOME 路径。同时,继承的凭证会被清除,相关工具也会被禁用,且套接字连接仅限于回环地址使用。此外,系统不会与任何实时消息服务账户或付费服务提供商建立连接。
故障边界与控制机制
- 来自回环节点的响应为真正的HTTP 400状态码;成功响应则采用HTTP/SSE协议。
- 可控制地触发AIAgent构造函数故障,或在数据持久化后出现语音策略故障。此时,处理程序与异常记录模块仍需保持为生产环境可用代码。
- 聊天会话A使用ID“100”成功启动;聊天会话B尝试恢复同一会话,但使用不同输入且仍沿用相同ID时,构造过程会失败。两种输入都必须保留不变,平台ID也不得修改,以便后续查询或回复操作。
- 在无密钥构造函数故障发生时,另一个独立的Python进程可能会提交无关的、未被监控的输入数据。两种输入数据都必须得以保留;网关租约并不被视为具有绝对的写入权限。
- 独立接收到的相同键值输入/无键输入、相同的时间戳、预代理重试机制、提供商故障/恢复情况以及正常的后续处理流程均需被正确处理。
- 在代理构建完成之前,正常的聊天历史读取操作已提前终止。此时既没有可读取的原始基准数据,也不需要额外的无键访问查询。
- SQLite数据库中仍存有5,000条4-KiB大小的归档记录。完整的无键故障处理模块的峰值内存占用必须控制在8 MiB以内,且不得进行任何原始对话记录的扫描操作。
- 每个已接收的输入对应的持久化所有者标记都是唯一的,且不会出现在提供商发送的通信消息中。外部写入方需自行提供独立的标记信息。
第二种不变量会使用真实的 SQLite 存档以及一个压缩树结构,该结构中包含一个较早的
ws_orphan_reap兄弟节点和一个仍在使用的后续节点。它会同时检查已发布的重定向路径以及无需映射即可重启的路由路径;根节点/中间祖先节点及后续节点的写入操作能够确立数据的所有权,而那些已被处理、已撤销、处于观察状态、带有外部标记或未被标记的行则无法做到这一点。这些属于存储边界层面的检查,并非由提供程序驱动的压缩操作。
验收结果
经过扩展后的完整处理器矩阵共设置了 20 个检查点(19 次数据传递加上标记传播过程)。基础版本 869228cab4a8276d3b4c78da9d9939670c47bd0f 的通过率为 7/20;经过审查的中间版本 653cd72ef63b013798748774a2509f453b566a77 的通过率为 1/20;最终修复后的版本通过率为 20/20。所有故障边界都已被验证。基础版本和修复后的版本共发出了 10 次回环请求,且未检测到任何外部连接尝试。这些计数是基于累积的完整行序列检查得出的,并非独立的缺陷数量统计。
经过审查的中间版本丢失了聊天 B 的输入数据(原本应有 2 行,实际仅剩 1 行),同时还丢失了独立写入器旁边的无键输入数据,并在存档历史处理器中占用了 28,034,300 字节的内存。而修复后的版本则保留了所有 18 行预期的活跃用户数据(包括那个独立写入器),在该处理器中仅使用了 107,679 字节内存。上述内存测量结果未包含测试用例初始化数据及验收结果序列化所占用的内存。
最终仅保留了两项不可变测试。11个目标文件通过了63项测试;更广泛的目录套件及持续集成流程并未被纳入检测范围。历史记录行也不会被重新写入。由于那些没有标记的现有记录无法确定交付归属,因此该机制不会对历史上的重复交付内容进行去重处理。这属于针对异常路径的输入仲裁机制,而非全局性的精确一次交付或内容去重功能。