首版行为验收
本页把设计契约映射为行为测试与交付证据,覆盖工程、离线核心、在线同步、持久化和外部接口。本页定义全部首版验收,具体执行证据与未完成范围在关联 Issues 和实际报告中记录。案例 ID 用于关联实现测试和报告,不用“存在测试文件”代替通过证据。
本页是长期验收规格,不维护 feature/bug 的负责人、排期或进展。开发任务和规范澄清问题在本仓库 GitHub Issues 建立或关联,issue 引用相应案例 ID;执行状态保存在实际测试报告中。
阶段和交付条件
| 阶段 | 交付 | 必需证据 |
|---|---|---|
| M0 工程初始化 | 最小包、类型、文档生成、真实解释器矩阵 | 实际构建/安装/文档命令,缺环境和文档错误的失败检查 |
| M1 离线核心 | 公共模型、JSON、内存快照、ROV/ASPA/BMP、查询、离线 CLI | API/IN/VAL/SNAP 类案例,完整使用示例及核心安装隔离 |
| M2 在线同步 | RTR v1/v2、TCP/TLS、多源、热配置、在线 reader、事件及 CLI | RTR/SRC/CFG/EVT/LIFE/RES 类案例,双异步后端和独立互操作证据 |
| M3 持久化 | SQLite、DuckDB、恢复、SQLite 共享与 CLI | DB 类共同契约、多进程故障和期限案例 |
| M4 完整首版 | 详细解释、状态指标、录制回放、HTTP/SDK 和其余 CLI | OBS/FMT/HTTP/CLI/PKG 全量,发布提交制品与文档 |
内部阶段可交付评审,不宣称完整 0.1.x 首版完成。首版发布前四类功能阶段全部覆盖,两种数据库、服务和轻量 CLI 都不能因主产出是库而遗漏。
首版收尾按用户确认简化规模验证:复用既有未受实现变更影响的通过证据,SQLite 与 DuckDB 各执行一次三来源各百万条、单轮最大 10,000 条更新的综合测量;增长梯度仅为可选诊断。容量测试的超时或超限须保留原始失败、实际完成范围和清理结果,并在交付限制中明确不承诺该负载;不要求反复调参直到通过。正确性、故障隔离、时效与资源清理的必需断言不变。最终 sdist/wheel 按同一批制品在 Linux x86_64、CPython 3.11/3.14 和适用 extras 下自动验收;3.12/3.13 提供手动命令,未执行不计为通过,也不阻塞本次交付。
公共入口和输入
| ID | 输入或操作 | 预期结果与依据 |
|---|---|---|
| API-01 | 仅核心包安装,导入全部核心公共模块 | 无可选依赖导入、文件、网络、事件循环或根日志副作用;API/兼容契约 |
| API-02 | 从外部目录运行使用文档示例 | 只使用公开入口,返回文档所述类型;不能依赖源码根目录偶然可导入 |
| API-03 | 新增公开字段/异常却没有文档 | 公共 API 文档覆盖检查失败;不能因生成器过滤而漏掉 |
| API-04 | 客户端在已有任务组运行与取消 | 无嵌套事件循环,无遗留任务或连接;asyncio/Trio 各执行 |
| LIFE-NET-01 | DNS/连接等待、多个地址同时成功、连接胜出交接及 TLS 握手时取消;关闭时有读写等待者 | 截止与取消有效,所有未交付/未胜出 socket 在返回前关闭;真实对端 EOF 不能靠 fixture 退出替代;两异步后端及原生平台检查,接收不产生无界后台队列 |
| HTTP-OWN-01 | 默认 HTTP 的头部/正文取消、TLS 超时、连接复用与关闭;SDK 准备 TLS 信任时并发关闭 | 保持 HTTPX 错误类别与原始请求截止,释放未交付连接和池预留;受管理准备线程退出后关闭迟到传输 |
| IN-01 | 支持矩阵各格式的小型完整样本 | 标准字段、时间、能力和规范化结果准确;输入契约 |
| IN-02 | 缺少 aspas、aspas=[]、aspas=null | 分别 unsupported、完整接纳后 ready_empty、InputError |
| IN-03 | 重复 JSON key、bool ASN、非法 UTF-8、主机位 CIDR | 明确位置错误,整次来源更新不提交 |
| IN-04 | 重复合法 VRP、同 customer 多份 ASPA | 支持信息保留并正确去重/合并;不混淆 RTR 替换 |
| IN-05 | 已固定历史 profile 的 ASPA afi、未知 afi、自身 provider、混合 AS0、重复 provider | 固定语义保留 AFI,未知或无效记录明确拒绝;不能丢弃 AFI 或跨族合并 |
| IN-06 | 缺生成时间且仅 max_age | 接纳失败;显式绝对 valid_until 可提供独立截止依据 |
| IN-07 | 分别仅用 max_age 或绝对 valid_until;相同旧文件重读、mtime 改变、同字节原子替换、HTTP 304 | 原期限不延长,到期后重读不能恢复有效性,generation 变化不能授予寿命 |
| IN-08 | rpki-client production-subset | 字段解析可检查,完整快照接纳失败;不得用离线模式绕过 |
| IN-09 | 文件并发写入、HTTP 200 半包/超限/畸形 | 候选失败,旧有效状态保持 |
| IN-10 | 200 候选未通过后收到新 ETag,随后 304 | 失败候选的 ETag 不成为已接纳状态;无匹配内容重新请求 |
| IN-11 | JSONExt 同一完整 VRP/Router Key 值的多份对象支持,其中一个到期 | 该支持退出生效视图,另一份继续生效;原始记录保留,最后一份到期后成为已同步为空 |
| IN-12 | JSONExt 合并 ASPA providers={P1,P2},source 对象期限 T1<T2,但没有对象→provider 映射 | 不伪造映射;整条集合支持在 T1 失效,其他独立来源支持保留;不能把 T2 授予 P1 |
| IN-13 | 重读同一完整文件,或条件请求仍收到相同内容的 HTTP 200 | 保持原始期限及有效旧快照;未采用的等价候选可回收,来源 worker 不额外持有完整副本;asyncio/Trio 均验证 |
RTR over SSH
内置 SSH 属于用户另行授权的交付范围,协议固定在已有 RTR profile 上;不增加 RTR 服务端或 BGPsec。它使用 asyncio,核心双后端验收不变。
| ID | 输入或操作 | 预期结果与依据 |
|---|---|---|
| SSH-01 | 显式 key/password/passphrase、known_hosts,构造及上下文进入 | 构造无 I/O;受管理线程准备;缺 extra、Trio、无认证或错误凭据配置在联网前明确失败;未启用 SSH 不导入 AsyncSSH |
| SSH-02 | 真实 SSH v2 的公钥、密码、加密私钥;未知/更换/吊销 host key、错误用户/密钥、无认证服务器 | 正常身份才可打开固定 rpki-rtr subsystem;拒绝不泄漏秘密,不读隐式 config/agent/default keys,不接受 none |
| SSH-03 | subsystem 拒绝、二进制分片、EOF、stderr 洪泛、发送背压、同向并发 | 分类错误;只有 stdout 进入 RTR;有界接收窗口,EOF/关闭/双向读写遵循 ByteStream;无 shell/exec/PTY |
| SSH-04 | 握手/认证/subsystem 超时或取消,读写中取消与并发关闭 | 总连接截止覆盖所有阶段;未移交资源关闭;交付资源由会话关闭;屏蔽清理取消,实际连接和工作结束,无遗留任务 |
| SSH-05 | RTR 全量、增量、断线重连、恢复、信任或认证热替换与录制 | 复用 EOD 原子事务;身份改变撤销旧支持及增量资格;迟到结果隔离;快照/日志/录制不包含 SSH 秘密 |
| SSH-06 | 独立 SSH 服务器互操作、CLI TOML/直接选项、仓库外安装示例 | 真实认证和 RTR 同步有证据,不能只靠同库编解码;Linux x86_64 的 3.11/3.14 与 SSH extra 验收,其余提供命令并保留未验证状态 |
最小确定性验证向量
这些是基于固定规范规则定义的独立向量,已落地为可执行测试;规范来源和执行证据仍须分别保留。ASN 使用文档示例范围;时间固定为 T0,来源整体 T0+3600 秒到期,在 T0+1800 评价。
ROV 基础数据为 192.0.2.0/24、max_length=24、ASN=64496,来源完整且有效。
| ID | 输入或额外数据 | 预期 |
|---|---|---|
| VAL-R01 | 192.0.2.0/24,64496 | valid |
| VAL-R02 | 192.0.2.0/25,64496 | invalid,长度不符 |
| VAL-R03 | 192.0.2.0/24,64497 | invalid,ASN 不符 |
| VAL-R04 | 198.51.100.0/24,64496 | notfound |
| VAL-R05 | 增加 192.0.0.0/16、max=24、64497;查询 192.0.2.0/24,64497 | valid,不能仅检查最长匹配 |
| VAL-R06 | 起源为 None 或 0 | 有覆盖但不匹配,invalid;无覆盖仍按规范得到 notfound |
| VAL-R07 | 基础 VRP 改为 AS0,路由起源 64496 | invalid,AS0 VRP 不匹配正常路由 |
| VAL-R08 | 完整有效空集合;另一次使用未加载状态 | 前者 notfound,后者 DataUnavailableError |
| VAL-R09 | IPv6 的相同长度/覆盖边界,以及 IPv4 不匹配 IPv6 | 同规则,地址族隔离 |
依据 RFC 6811 §2 与 RFC 8481。详细与简要结果状态一致;解释可以同时包含多个不匹配原因。
ASPA 基础外部路径按邻居→起源为 [64498, 64497, 64496],local=64499,neighbor=64498。完整有效 ASPA 视图先包含 64496→{64497}、64497→{64498}。
| ID | 场景 | 预期 |
|---|---|---|
| VAL-A01 | 基础数据,relationship=customer | valid,上坡覆盖全部路径 |
| VAL-A02 | 删除 64497 的授权,customer | unknown |
| VAL-A03 | 64496 的 providers 改为 {64500},customer | invalid |
| VAL-A04 | 64496 的 providers 为 {0},customer | invalid;不等同缺记录 |
| VAL-A05 | 所有授权缺失但视图 ready_empty,provider | N=3,min_up+min_down=2,unknown |
| VAL-A06 | 只有 64496→{64497},provider | min_up=2、min_down=1,N=3,valid |
| VAL-A07 | 两 AS 外部路径 [64498,64496],provider,ready_empty | min_up+min_down=2,valid;不能要求每条边都必须有授权 |
| VAL-A08 | [64498,64498,64497,64496],基础数据,customer | 与压缩后的基础路径一致 |
| VAL-A09 | 基础授权,路径 [64498,64497,64496,64497],customer | invalid,起源端 64497→64496 不获授权;全局去重会错误变成基础 valid 路径 |
| VAL-A10 | 空路径、可解析 AS_SET、普通关系首 ASN 不符 | 按草案对应前置步骤 invalid |
| VAL-A11 | 路径 [64497,64496],neighbor=64500,relationship=route_server,基础授权 | valid,适用首 ASN 例外,不插入 RS ASN |
| VAL-A12 | confed 段、缺邻居上下文、把原始 BGP UPDATE 字节传给路径接口 | unsupported_path_context 或 InputError,不冒充 unknown;仅给出 ASN 列表时库无法证明调用方完成了 AS4 重建 |
| VAL-A13 | ASPA 未加载或过期 | DataUnavailableError,不论候选路径能否在空数据下得到 valid |
| VAL-A14 | 同 customer 来源 A={0},B={64497} | 生效并集为 {64497};移除 B 后恢复 AS0 支持 |
| VAL-B01 | BMP 缺方向/无法界定候选场景 | indeterminate,明确缺失条件 |
| VAL-B02 | BMP 相容场景有 valid/invalid 分歧 | indeterminate,不能任选一方 |
| VAL-B03 | BMP 全部可检查场景 invalid | 独立 BmpAnalysis.invalid,附场景依据 |
依据 aspa-verification-28 §5.1–5.6 和 aspa-profile-29 §5.2。上游 C/Rust 向量逐条标注路径方向、角色、所用数据和固定规范后再移植;不默认把旧草案预期当成本项目预期。
运行中配置与扩展入口
| ID | 输入或操作 | 预期结果与依据 |
|---|---|---|
| CFG-01 | running 中增加 JSON/RTR 来源,或先以空 groups 启动再增加 | 配置和未加载状态原子发布;完整 JSON/EOD 后才就绪;无需重建 Client |
| CFG-02 | 删除来源、删除组、删除最后一个来源 | 保留其他来源支持;无来源时明确不可用并继续运行,不返回正常 notfound/unknown |
| CFG-03 | 修改地址、协议、format、freshness、信任 ID、TLS/认证或注入实例 | 新视图撤销旧支持并从未加载开始;不复用旧 session/serial,不延长旧输入期限 |
| CFG-04 | 删除后同 ID 重建,旧任务随后返回 EOD/JSON/错误 | incarnation 隔离全部迟到提交及状态;不污染新来源 |
| CFG-05 | 调整组成员、优先级、failback_delay 或调度超时 | 身份未变数据保留、活动组原子切换;已在途操作不重置截止时间 |
| CFG-06 | 两个调用使用同一 expected_revision;重复提交同一配置 | 只有首个实际变更提交,过时版本明确冲突;并发候选额度已占用时明确 ResourceLimitError;no-op 不增加版本/事件 |
| CFG-07 | 无效候选、缺 extra、低于已占用预算、关闭期间提交 | 整份拒绝、旧状态保持;无半份配置或新连接泄漏 |
| CFG-08 | 提交前/后取消、准备时并发数据刷新和到期、订阅同时进入 | 以唯一提交点判断;回执缺失可查配置版本;无过时覆盖或订阅空窗 |
| CFG-09 | 两后端真实事务在新配置头写入后失败或阻塞;连续配置版本合并;删除来源在 COMMIT 前后进程崩溃及恢复 | 当前/持久化版本分离;失败后旧磁盘完整不变、内存删除继续生效,重试可成功;pending 跳过中间版本仍以完整配置和载荷提交;崩溃后仅完整旧/新状态,启动不启用宿主配置已删除的来源 |
| CFG-10 | 配置变化时持有旧快照、批次、HTTP token 或共享读取者 | 旧对象固定原配置和原期限;新默认查询取新视图,共享传播后原子接纳;不声称分布式即时撤回 |
| CFG-11 | 改数据库路径/后端、clock_tolerance;修改队列形状 | 前者明确 restart_required 且整体不变;后者可靠要求现有订阅重新同步 |
| CFG-12 | 旧来源阻塞线程未退出,反复新增/删除来源 | 退休工作仍受管理和预算约束;不能以逻辑删除制造无界线程/暂存 |
| API-05 | 文件与 HTTP 来源注入自定义 JsonReader | 显式按 ID 生效;统一校验仍执行,格式/ID 不符启动或变更失败;不修改全局 reader |
| API-06 | ASPA 遍历、source_id 筛选、空集、未加载、中途到期 | 按 customer 排序且每个一次,返回完整生效并集;能力与期限按单项查询检查;CLI/SDK 分页一致 |
| LIFE-01 | 必要清理超过 cleanup_timeout 或数据库事务超过 flush 等待 | 报 cleanup_overdue,保持 closing,等待安全完成后才释放连接/锁;保留主体异常和取消原因 |
| LIFE-02 | 阻塞工作器在正常返回、异常或调用方取消后进入空闲;asyncio/Trio | 实际工作完成前保留参数,完成通知后等待新命令时不再持有调用方已丢弃的参数/结果/异常;不擅自关闭返回对象,线程关闭仍加入;弱引用回收不作为 RSS 下降证据 |
| RES-01 | 多来源全量/到期/恢复/热配置共同触及构建及全局暂存上限 | 在分配重型输入前准入,有界公平排队、沿用截止时间;拒绝不发布部分状态,清理/撤销不被无限阻塞 |
| PKG-04 | Linux x86_64 × CPython 3.11/3.14 自动检查核心双异步后端与适用 extras;3.12/3.13 及其余四种平台提供本机验收命令 | Linux x86_64 必须有实际原生运行、安装及行为证据;按用户确认,Windows 11 x64、macOS x64/ARM64、Linux ARM64 当前候选未执行时标为未验证,不阻塞本次交付;Windows Server/架构仿真不代替对应原生目标,不声明全平台通过 |
上述接口和编号是长期验收要求;实际实施与通过状态以关联 Issues、提交及执行报告为准,不能把文档或测试文件存在视为通过。配置契约详见运行中配置变更,规模/平台分别见性能基线和兼容契约。
快照和来源
| ID | 操作序列 | 预期 |
|---|---|---|
| SNAP-01 | 更新 VRP 与 ASPA,在提交各阶段查询 | 只看到旧或新完整快照,无混合版本 |
| SNAP-02 | 批量第一条完成后推进时钟跨 usable_until | 同一 snapshot_id,后续条目 snapshot_expired,不能冻结时间 |
| SNAP-03 | 持有旧快照同时提交新数据 | 旧数据不变;旧快照仍独立遵守期限 |
| SNAP-04 | 单条支持到期、其他来源仍支持 | 新视图保留记录;旧快照需要重新获取 |
| SNAP-05 | 生成相同 generation 的不同 epoch | 不认为是同一版本,旧游标不得续接 |
| SNAP-06 | 全量构建和事件计算期间连续跨越多条支持的起止边界 | 保留未发布候选按原始期限校准;不因时间推进无限重做全量扫描,不发布过期候选或中间事件;来源、AFI、组选择及旧快照时效仍准确 |
| SNAP-07 | JSON 候选构建时墙钟前跳/后跳,其他组连续提交使 CAS 重试 | 旧 epoch 候选保留失效、锚点和期限,同一组只完整构建一次;后继事件符合完整端点差分或有界的整类重验,新原始输入才能恢复 |
| SNAP-08 | 同组来源并发完整更新,不同组/相同输入,组等待中的取消、迁组与关闭 | 正常同组每次更新只完整构建一次,完整端点事件正确;不同组与复用可推进;维护不取得组名额;既有截止和抢占顺序不变,线程真实结束后释放预算,组登记与缓存无泄漏 |
| SNAP-09 | 相邻 VRP/ASPA 行的来源、生成时间、支持起止或标签相同/不同,随后替换来源且保留旧快照 | 完整支持集合及双 AFI 归属保持准确,相等值可共享但不可修改;复用不丢失期限或标签差异,不跨来源混淆,不回写旧快照 |
| SRC-01 | A/B 支持相同 VRP,A 撤销或失效 | B 的支持和有效结果保留 |
| SRC-02 | 主组不能刷新,备用先未完成后 EOD | 未完成不切换,完成后原子切换 |
| SRC-03 | 主组恢复并达到 failback_delay;健康观察与来源更新或配置提交交错 | 原子回切,产生正确保守影响范围;已完成的较早恢复观察不被并发提交覆盖,原期限不变,重选复用未变化的原始输入 |
| SRC-04 | VRP 主组 ready,ASPA 主组 unsupported,备用 ASPA ready | 每类活动组明确,VRP 就绪不替代 ASPA |
| SRC-06 | 默认只要求 VRP、主组 VRP 已就绪;ASPA 未加载/不支持,组窗口到期及修改 startup_timeout | ASPA 独立启动备用;每组单调窗口不被热配置或 wait_ready 重置,未 EOD 不授予能力 |
| SRC-05 | 取消正在构建的候选,再接纳更新版本 | 旧构建结果不能覆盖新状态 |
RTR 与传输
| ID | 场景 | 预期 |
|---|---|---|
| RTR-01 | 独立字节向量和所有 PDU 的边界长度 | 字段准确;v1/v2 矩阵完整,不仅自编自解 |
| RTR-02 | 在每个字节边界切分、连包、EOF 残帧 | 分片无关;残帧不提交 |
| RTR-03 | 伪造巨长 Length、短头、内部长度错误 | 有界失败,不先分配巨量内存 |
| RTR-04 | 保留字段非零 | 按规范忽略,不能错误拒绝 |
| RTR-05 | Reset/Serial 事务在 EOD 前断线/取消 | 无部分发布;旧数据按原期限和故障类别处理 |
| RTR-06 | 重复 prefix/key、未知 withdrawal、ASPA 替换 | 前两者相应协议错误;合法 ASPA 替换成功 |
| RTR-07 | 错 session、错版本、错误状态 PDU | 会话失败、相应来源撤销、其他来源不受影响 |
| RTR-08 | 0xffffffff→0 回绕、相等、半空间差 | RFC 1982 行为,无法比较时重新同步 |
| RTR-09 | refresh/retry/expire 合法上下界、不合法 EOD;v1 与固定 v2 profiles | 计时起点正确,合法上界不被钳位,不提交坏期限 |
| RTR-10 | v2→v1 协商、min_version=2、重复降级 | 合法范围内协商,ASPA 降级可观察,无无限循环 |
| RTR-11 | IPv4/IPv6 公告降序与撤销升序的四字段、Router Key 各字段、公告先于撤销、check_order 开关 | 按 §11.2/11.4;独立字面量同时验证合法顺序和逆序 Error 11;v1 不误用该限制 |
| RTR-12 | v2 Error 9/10/11/12/13 | 区分致命撤销与 Restart 保留,不能套用 v1 错误表 |
| RTR-21 | 显式 -10/-13 与默认 -27;相同 wire version、不同 ASPA 布局 | 不自动猜测;按 profile 检查长度、AFI、count、错误表与排序,独立 -10 StayRTR 与 -13 NIST-BRIO 录制可解码;Error4按草案区分致命性 |
| RTR-22 | -10 同 customer 的 IPv4/IPv6 不同 provider;单族撤销 | 另一族保持原授权;撤销按 -10 忽略 count/providers,默认 -27 同帧仍拒绝;完整 EOD 的无记录族为 ready_empty |
| RTR-23 | profile 切换、旧身份恢复、在途事务配置变更、-10 大于65535字节合法帧 | profile 属于来源身份;旧恢复失配执行 Reset;事务固定配置与资源限制,不混用 -27 长度/错误9–13/stall规则 |
| VAL-AFI-01 | 相同 customer 的两族 providers 不同,标准路径与 BMP 分析 | 显式 AFI 只用对应授权;省略 AFI 时拒绝歧义,结果及依据包含 AFI |
| VAL-AFI-02 | 新版共同授权、单族 ready_empty/unsupported/expired、跨组备用和支持到期 | 按族区分能力、有效期和活动组,不以另一族可用性产生正常验证结果 |
| FMT-AFI-01 | 原始 AFI、覆盖声明与 profile 经完整导出、两数据库、HTTP/SDK/CLI | 无损保留并校验摘要/版本;旧恢复不能扩大授权,分页固定族和快照 |
| RTR-13 | 收到错误 Error Report | 不回送 Error Report,终止且不形成循环 |
| RTR-14 | TLS 主机名/证书错误、自定义上下文、源地址;默认 CA 文件/目录环境路径与显式信任 | 真实双向握手验证信任与 DNS 身份;默认路径可受环境影响,显式 CA/上下文不隐式合并默认路径,宿主上下文不被修改,恢复身份匹配正确;HTTP/SDK 保持独立信任规则 |
| RTR-15 | 已有流非拥有模式与工厂重连 | 关闭归属正确,不复用不可重建旧流 |
| RTR-16 | 协商前 Notify、同步中 Notify 洪泛 | 前者忽略,后者有界合并,不并发查询 |
| RTR-17 | 首次 Reset Query → No Data Available → retry → Cache Response/EOD | 不误判非法序列;retry 前不忙重试,成功前不授予载荷,协商前 Notify 仍忽略 |
| RTR-18 | 恢复 Serial Query → Cache Reset → Reset Query → Cache Response/EOD | 清除增量资格,合法全量恢复;候选完成前不刷新期限,不并发查询 |
| RTR-19 | 通过公共 restored 注入已接纳的 SourceUpdate,再注入身份/载荷/计时器/能力不符和过期状态 | 完整有效状态用 Serial;其他状态以 recovery_rejected 或原期限失效回退 Reset,不续期、不由恢复入口发布可信载荷 |
| RTR-20 | Sink 已完整提交、但 publish 返回前取消;fatal report 同时有查询和热配置;坏 EOD 在取消/关闭后才确定;撤销排队时关闭与来源替换 | 会话不推进未确认 serial,不复用已结束 run;report 不持有候选票,撤销使用同一有限预算并完成必要清理;普通关闭后工作被拒绝,旧 incarnation 不得污染新来源;fatal 返回前原子撤销,正常最终落盘后两库恢复和 SQLite 共享读均无旧授权复活;致命 retry 不被本地取消或重复时钟重同步缩短;事件链保持真实提交顺序 |
| RTR-24 | S 已撤销后重连、重复致命错误或 No Data;T 正在查询或刚获准入;随后 S 新 EOD 再遇致命错误 | 纯连接观察不再次抢占 T 或产生重复撤销快照,S 在新 EOD 前保持失效;新的有效 EOD 恢复后仍能再次完整撤销,事件链连续、所有资源归还 |
按 RTR 状态机逐项关联 RFC/草案章节。真实互操作报告必须记录服务软件、确切版本、协议/草案、TLS 配置和全量/增量/重连结果。字节向量只能证明所覆盖的编解码行为,不能据此宣称完整事务或 v2 全面互通。
事件与持久化
| ID | 场景 | 预期 |
|---|---|---|
| EVT-01 | 发布恰好发生在注册订阅附近 | initial 加后续流无空窗、无重复初始事件 |
| EVT-02 | 多订阅者、一人慢消费、队列满 | 每人独立消费,慢者明确 ResyncRequired,不阻塞 RTR |
| EVT-03 | 原数据未变但来源/期限变化 | 正确区分载荷、支持、状态变化 |
| EVT-04 | 变化超过事件条目/字节限制 | 明确整类重验,不能静默截断 |
| EVT-05 | 共享读取跳 generation、writer 重启 | coalesced 或 ResyncRequired,epoch 不误接续 |
| EVT-06 | writer 退出后来源自然到期 | reader 独立发布失效和重验事件 |
| DB-01 | SQLite/DuckDB 同一完整状态往返 | 所有来源、空能力、会话、期限一致 |
| DB-02 | 来源、配置和 VRP/ASPA/Router Key 均不同的新旧状态;各表写入后异常或进程崩溃,以及 commit 后退出 | 回滚严格恢复旧完整状态;崩溃只能恢复旧或新完整提交,载荷、来源、配置、视图和回执不得混合 |
| DB-03 | commit 失败、成功但回执丢失、幂等重试;真实两后端提交或回滚后立即读回失败,期间合并后续配置 | 内存不破坏;持久化状态仅报告已确认版本;再次核对完整磁盘头后,以实际旧/新版本作为 expected 提交最新完整配置,不能跳过未确认提交或混入中间载荷 |
| DB-04 | expected 冲突、同 ID 不同摘要 | 拒绝,不能覆盖未知更新 |
| DB-05 | 损坏、未知 schema、身份改变、时间回拨 | 不授予在线有效性,不自动清库 |
| DB-06 | 过期恢复、缺失部分启用载荷 | 不延长期限,不用不完整状态发 Serial Query |
| DB-07 | SQLite 第二 owner、多 reader;读头后另一连接提交不同完整载荷;替换 writer 后 generation 降低/相同/升高 | writer 锁拒绝冲突;同一次读取保持完整旧状态,下一次见完整新状态,并发正常更新无隐藏读失败;新 writer 身份可靠要求 resync,不误判为同 epoch 回退或合并;及时结束读事务 |
| DB-08 | 活跃 DuckDB 服务期间,另一进程尝试后端/Client 拥有者和独立只读文件连接;并用 asyncio/Trio SDK 访问真实 HTTP socket | 直接文件访问明确失败,前后查询与热配置后的服务访问仍有效;服务关闭后数据库线程退出、锁释放,数据库可重新打开且完整状态保持 |
| DB-09 | 真实 SQLite/DuckDB 写事务内取消 flush 等待者,或正常关闭、主体异常、取消宿主;覆盖提交与回滚 | 等待者取消不取消事务;超清理阈值仍 closing 并报告 persistence 资源,第二进程 owner 被拒绝;事务完成后原线程关闭连接并加入,随后锁可重新取得;不覆盖主体异常或取消,最终完整提交或回滚 |
| DB-10 | 快速连续内存发布后 flush | 有界合并完整状态,回执覆盖调用目标 |
| DB-11 | 含映射 IPv6 的状态在真实 CPython 3.11/3.14 间交叉写入/读取两数据库,3.12/3.13 手动复验 | 固定规范文本及摘要,回执、IPv6 地址族、原始期限和身份一致;旧不匹配摘要仍拒绝 |
| DB-12 | 两后端完整读取/头探测的驱动故障、损坏和内部断言;实际 SQLite 非法 UTF-8、DuckDB 块校验和损坏;Client 启动失败及共享轮询失败后恢复 | 已识别暂时性运行故障准确标记 persistence_failed/retryable;损坏继续拒绝,原因不明的 DuckDB IOException 不宣称可重试;断言与控制流异常清理后原样传播,不残留事务/连接/owner;共享旧数据仅按原期限可用,成功读取后清除错误 |
| DB-13 | 内置两后端复用工作器摘要,宿主较严预算、提交包装改变状态/预算、自定义子类、异常退出与直接重试 | 同一不可变状态和预算只做一次完整提交前摘要;公开 commit 仍可观察,不匹配则重新验证,预算拒绝不写入;自定义路径不被替换;退出后无复用引用,直接提交、实际恢复及不确定提交校验保持完整 |
| DB-14 | 两后端实际提交完成并清空未确认记录,与热配置预算检查交错;公共 apply_config 在摘要计算及 SQL 写入中降低五项预算;asyncio/Trio | 检查稳定使用已经观察到的不可变记录,不抛 AttributeError;保留实际提交预算而非启动预算,较低预算拒绝且配置/快照不变;提交确认后重新降低成功;线程加入、owner 锁释放、完整磁盘状态保持 |
| DB-15 | 流式摘要交错处理有界原始记录、大标签/SPKI/provider 集合、字符串子类与非法 Unicode | 独立规范字节与固定摘要一致;重复支持、AFI 与空数组不变;精确预算与原字段错误优先级保持,双数据库及自动矩阵中的真实解释器交叉读取一致;3.12/3.13 手动复验 |
外部接口和诊断
| ID | 场景 | 预期 |
|---|---|---|
| FMT-01 | 导出、摘要检查、重新加载 | 来源和期限完整保持,不刷新数据 |
| FMT-02 | 修改载荷/计数、截断文件、未知版本、查询子集 | load_snapshot 拒绝 |
| FMT-03 | 录制正常/超限/队列丢失/缺 trailer | 完整性真实反映,无伪成功 |
| FMT-04 | 回放分包、定时、取消及不完整流 | 离线可复现,不联网或写在线数据库 |
| OBS-01 | 多来源故障、刷新和落盘错误 | status/metrics 与真实状态一致,无机密或高基数默认标签 |
| OBS-02 | RTR 全量/增量/失败/重连、JSON 304、取消及被替换来源的迟到观察 | 仅计已完成动作;未开始事务的连接失败与同步失败区分;取消和旧 incarnation 不增加计数 |
| OBS-03 | 显式验证收集器的单项、混合批量、异常、线程并发与可选计时 | 调用数与已知条目数独立;normal invalid/unknown 不算执行错误;纯函数无全局计数副作用 |
| OBS-04 | SQLite 共享观察跳代、事件丢失、来源删除和持久化失败 | 共享读取不冒充同步/写入;已提交跳代才计合并;累计耗时、当前 gauge 和标签准确 |
| HTTP-01 | 相同快照和输入经本地与远程验证 | 领域结果一致,错误不混入 normal unknown |
| HTTP-02 | 分页中更新、到期、淘汰或修改筛选条件 | 不混版本,分别给出固定错误 |
| HTTP-03 | 长轮询断开、重试、游标过期、epoch 改变 | 有界恢复或 ResyncRequired |
| HTTP-04 | HTTP 批量混合输入、无数据、框架校验失败及未知路径/方法的 404/405 | 与模型/错误映射一致,无框架专属错误泄漏 |
| HTTP-05 | lifespan 取消、worker>1、认证/TLS 配置错误 | 正确关闭或启动失败,来源不被复制 |
| HTTP-06 | 普通工作槽与等待队列满、排队/读体/计算中取消、总截止到期 | 429/503 明确,受管理计算完成前不释放名额,来源同步与独立状态/健康请求继续 |
| HTTP-07 | 同 watch 双 poll、真实 TCP 断连重试、慢消费者与窗口溢出 | watch_conflict 不破坏已有观察;丢失才 resync_required;无隐藏初始快照引用突破保留预算 |
| HTTP-08 | AFI 批次默认与逐项覆盖、单族先到期、生成 OpenAPI 与真实 TLS SDK | 不合并两族授权,处理中到期逐项报错;独立 JSON Schema 校验各端点真实响应、嵌套事件、分页与错误,AFI 字段为整数而映射键为字符串;TLS 不信任任意代理头 |
| CLI-01 | help/version/completion、缺少各 extras | 无非必要副作用,缺依赖提示与退出码正确 |
| CLI-02 | 所有结果/错误类别和混合批次 | 0/1/2/3/10/11/130 按契约映射 |
| CLI-03 | stdout 重定向、NO_COLOR、JSONL、stderr | 机器结果无 ANSI,日志不污染结果 |
| CLI-04 | Ctrl+C、管道关闭、导出中断/已有目标 | 清理资源,非完整输出不报告成功,覆盖需 --force |
| PKG-01 | 自动检查 CPython 3.11/3.14 和两异步后端,3.12/3.13 提供手动命令 | 实际选择的真实环境有必需用例;缺解释器或零用例不能通过,未执行版本不计为通过 |
| PKG-02 | sdist→wheel→隔离安装、各 extras | 元数据、py.typed、许可、公共示例及可选隔离正确 |
| PKG-03 | 文档损坏链接、缺 API、过期签名 | 必需文档检查失败;实际公开示例随实现验证 |
| PKG-05 | 同批 wheel 在各解释器及 extras 下导出映射 IPv6、适用数据库提交/重新打开 | 独立字面量确认固定前缀文本,标准库校验摘要,公共 API 保留期限与地址族 |
发布证据和阻断条件
每次执行记录提交、解释器、系统/架构、依赖版本、测试数量、结果与未执行范围。仅文档变更检查链接、格式、术语及示例语法,不声称已经运行尚未存在的 API。
首版发布必须具有上述适用案例、两后端契约、真实解释器矩阵、协议互操作、可运行公共示例和构建制品的证据。缺少互操作环境时如实列为未验证;重要 v2 规范歧义见状态机的冲突记录,须在相关能力发布前处理。
基准至少保存全量加载、增量、简要/详细验证、事件积压、峰值 RSS、两后端提交/恢复及 SQLite 共享传播的结果。阈值根据测量决定,不能把资源初值或上游性能当成本项目性能。
性能证据同时覆盖响应性和规模放大:在双异步后端持续同步时并发执行大 JSON 解析、索引构建、批量验证及落盘,记录事件循环调度延迟、取消请求到任务退出及资源释放的时间;分别记录,不把取消等待者当作线程已停止。固定大表只修改少量记录、仅刷新期限、支持记录分散到期、多源大量重合及内部保留旧版本时,记录每次重建工作量、分配/RSS 峰值和数据库/WAL 写入量。比较不同数据规模下简要 ROV、ASPA 查询的增长,防止全表扫描或重复构建被小样本掩盖。方法见 CI/CD 性能要求。运行器实现、每个场景的实际执行与最终验收分别由 Issues 和报告关联;已有实现或部分测量成功不能代替剩余场景,也不能成为未测条件下的性能保证。
禁止通过修改样本时间、删除失败断言、只运行本项目编解码往返、跳过必需后端或让空文档站点构建成功来满足验收。