← Về thư mục
📄 / / profiles / r-and-d / raw_evidence / OpenAI4S / tests / README_zh.md

Tests(测试套件)

English

OpenAI4S 的离线正确性门禁。uv run pytest 用确定性 fake 跑完这里的每一个模块,而且必须一直是绿的:供应商无关的 Agent 引擎、Host 服务、常驻 Python/R 内核协议、仓储、安全边界、Tool、Skill 与 Web 组合。可复用的场景和计分评测属于另一层,放在 ../harness/。

离线契约

支持与 Smoke 文件

文件 职责
test_windows_launcher.ps1 原生 PowerShell 5.1 启动器契约:用户发行版选择、数据归属保留与准备步骤的显式身份。在 Windows CI 中运行,不进入 WSL。
test_wsl_parity.py WSL 适配层、DPAPI 传输、科学命令重定位、默认 UI 资源与失败安装保留的离线回归。
conftest.py 建立 import 路径,给每个测试一份独立的数据目录,配好 fake LLM 的配置与 key,用完清理 Store,并存放共享的 pytest fixture。它还会把这套 suite 本该度量、而不是从运行者那里继承来的 posture 钉死:OPENAI4S_UNATTENDED_APPROVAL=deny、OPENAI4S_SECRET_STORE=plaintext(这样没有任何测试会写进开发者的登录钥匙串)、OPENAI4S_NOTEBOOK_REPL=0、把 git-ignored .env 里可能带进来的 share 与 MCP 超时变量清空,以及把遥测 endpoint 指向 https://127.0.0.1:1/——最后这条不是假想中的卫生问题:曾有一个 benchmark 用例给自己授予了同意,于是每台开发机和每个 CI runner 都真的向线上 endpoint POST 了一个全新的安装 id。最后,当设置了 OPENAI4S_CAPTURE_SCHEMAS 时它会装上响应形状记录器,并在每个 stubbed_backend 测试前后暂停它。
_ports.py 为要绑定真实 gateway ThreadingHTTPServer 的测试提供无竞态的端口分配。probe-then-rebind 式的 _free_port 会在探测的 close() 与服务器 bind() 之间被并行的 xdist worker 抢走端口——Frozen-shapes CI 任务正是这样经由 test_team_auth_routes 挂掉的——因此 bound_gateway_server 只对端口 0 bind 一次、握住 socket 不放,让调用方在 make_handler 已为 Host allowlist 快照真实 cfg.port 之后再挂上真正的 handler 类。只把端口号写进 Config、从不绑定它的测试继续用各自本地的 _free_port:一个从未被绑定的数字没有竞态可输。
_envs.py 环境绑定测试所用的真实解释器前缀。conda 形状的夹具以前只是一条指向 sys.executable 的裸 bin/python 符号链接,它不再能自报夹具自己的前缀:复制来的 python-build-standalone 启动器在 Linux 3.10 上会丢掉运行时目录树,而裸符号链接在较新的构建上会解析到基解释器。real_python_prefix 建一个不带 pip 的 venv——pyvenv.cfg 加一条链接——让 kernel 的 sys.executable 在 CI 矩阵的每个解释器上都指向所选环境,而这段写法只存在一处,而不是每个建环境的模块各抄一份。
browser_auth.mjs 每个浏览器测试共用的凭据获取;使用 loopback token 流程的五个文件都从这里 import authenticate。守护进程现在默认要求 access token,loopback 上也一样;如果测试还是直接打开 / 而不带凭据,每一项检查都会因为 401 失败,并且看起来像是产品坏了。通常它按 CLI 的同一路径、从同一文件读取 token;安全敏感的 harness 也可显式传入已验证、由 fd 捕获的 token,从而不再次打开环境/default-file lookup。两条路径都按真实用户方式登录——打开启动时打印的 ?token= URL 一次,让 303 设置 Cookie——所以 bootstrap 与 Cookie 交接被真正跑到,而不是绕开。 另导出 minimalChildEnvironment(固定的 daemon 环境,开发者 shell 无法干预)和 boundedLogCollector(保留子进程输出尾部,失败时能引用 daemon 日志),供自带一次性 daemon 的测试脚本使用。
browser_p1_controls.mjs P1-A/P1-B 的控件,跑在真实浏览器里。现有三个 browser_*.mjs 对这八个关键词——before_seq、newest_first、chip、profile、attachment、delegation、steer、memory——命中全为 0,整组只靠 43 个提交之前的一次手工走查。分页用客户端自己的 fetch helper 打真实路由来验(缺陷就在于“发到线上的是哪个 query string”,DOM 断言看不见);其余调用真实的 render 函数进真实 DOM。夹具由测试自己创建,绝不假定开发机数据库里有什么。也覆盖诚实的 delegate 步骤卡(D9:completed/blocked/partial/max_turns/cancelled/error 各形态,默认卡无原始 JSON)、delegation_child_event 实时合并(D8),以及已执行代码界面(D10:子 frame 导航、失败 Cell 正常渲染、与 Artifacts 区分的执行历史标注、下载菜单里的 sources.zip 条目)。
browser_sandbox_preview.mjs 使用一次性 daemon 验证真实 Preact Viewer 的两种 loopback 方向:脚本与同会话图片、父窗口隔离、跨会话和应用源重放拒绝、精确版本、静态回退、两源已登录时的 API CSP 拒绝,以及真实 Ketcher 编辑和保存。 其 daemon 在固定的最小环境下运行,失败时把日志尾部附到 SUMMARY;Ketcher 阶段会等包装页的延迟重载落地,并拒绝 (unchanged) 的保存。
browser_smoke.mjs 用真实浏览器驱动运行中的 Gateway UI 与流式交互路径。本地要和 pytest 分开调用;普通 PR CI workflow 会自动跑它。
browser_stage0_acceptance.mjs 面向显式一次性 daemon 的机器可读 Stage 0 基线。读取 token 前,它会拒绝 8760、非 loopback/携带凭据的 URL、默认数据目录、OPENAI4S_TOKEN override,以及 host、port 或 pidfile 不匹配的数据目录 daemon 状态。跨 origin HTTP、API 与 WebSocket 请求会被拦截并实数计数;每个 execute 拒绝探针前都必须先看到 frame kernel 的 repl_enabled=false;Artifact 链接则来自生产 completion projector 与生产 UI renderer。摘要只携带 project/frame/Artifact 身份的单向 hash。finally 删除精确 project 后,须由生产 project 列表证明它已消失,Artifact 单项回读则必须为 404。它如实报告零 Agent 请求,同时明确 provider 调用数在浏览器边界不可观测。
browser_stage1_trusted_delivery.mjs Stage 1 可信交付的一键式本地浏览器验收。它自行管理随机 loopback 端口的一次性 daemon 与只读本地 metadata 的 standard-readiness fixture,使用生产 completion 与已存消息渲染器,三轮逐一检查 100 个精确版本链接的 HTTP 200 与 SHA-256。它还证明同一 head 去重仍保留 capture observation、delegated code/native producer 重开后展示真实 child frame 且不伪造 Notebook 链接、head 变化后旧链接保持不可变、全程零 Agent/LLM/外网工作,且最终只清理自己的 fixture。
browser_team_mode.mjs 团队模式在真人眼里的样子,也正是任何 socket 层测试看不见的那一半:匿名访问被送到 /login、身份 chip、admin 治理面板把用户/用量/配额/邀请/审计五张实时表渲染出来、member 被拒于该面板之外且连按钮都看不到、guest 邀请兑换出的账号整个世界只有 /replay,以及跨用户拒绝(非参与者的项目、经 /preview/ 取 artifact 字节)。唯一需要自带 daemon 的门禁:要 OPENAI4S_TEAM_MODE=1 加两个预置账号,口令经 OPENAI4S_TEAM_ADMIN_PW / OPENAI4S_TEAM_MEMBER_PW 传入——口令不能上 argv。
scientific_renderers_smoke.cjs 一个轻依赖的 Node 运行器,按契约检查 Web UI 里那些 UMD 科学 Artifact 解析器。用 node tests/scientific_renderers_smoke.cjs 手动运行。现有 browser-smoke CI 作业在 Playwright / daemon 之前以一个 step 调用它(不加新作业)。
webui-contract.md 前端重写必须保绿的三层 E2E 兼容面的机器清单:page.evaluate 引用的裸 window 全局、S 字段读写(含嵌套写路径)、DOM 选择器。由 scripts/extract_webui_contract.mjs 生成,不要手改。

所有 browser_*.mjs 都不挂在 uv run pytest 下跑;驱动用 npm ci --ignore-scripts 和 ./node_modules/.bin/playwright install <engine> 按完整性锁安装,且需要 Node 20 及以上——package.json 里 engines 写的 >=18 是给已发布的 Skill 安装器用的下限,钉住的 Playwright 开发依赖不接受更旧的运行时,而 npm ci 只会给个警告。多数脚本需要另行启动 daemon;Stage 1 是刻意的例外,直接运行 node tests/browser_stage1_trusted_delivery.mjs,它会自行管理随机端口的一次性 daemon 与本地 fixture。Stage 0 pack 比其它外部管理的浏览器探针更严格:先用独立临时 OPENAI4S_DATA_DIR、OPENAI4S_NOTEBOOK_REPL=0 与非 8760 的 loopback 端口启动一次性 daemon,再运行 env -u OPENAI4S_TOKEN OPENAI4S_BROWSER_DISPOSABLE=1 OPENAI4S_BROWSER_URL=http://127.0.0.1:<disposable-port>/ OPENAI4S_DATA_DIR=<same-temp-dir> node tests/browser_stage0_acceptance.mjs;调用方只消费唯一的 SUMMARY 行。该目录仍须由 daemon 持有相互匹配的 daemon.json、openai4s.pid 与 owner-only access-token。不加载 Playwright、不接触 daemon 的脱敏/schema/绑定/生产投影自检命令是 OPENAI4S_STAGE0_SELF_TEST=1 node tests/browser_stage0_acceptance.mjs。CI 里,工作台走查、admission fault 用例与 P1 控件只在 Chromium 上跑——要的是深度而不是广度——而 browser_matrix.mjs 三个引擎都跑。同一个 browser-smoke 作业还会在起 daemon 之前以 Node-only step 跑 scientific_renderers_smoke.cjs。

测试模块

下面列出全部 test_*.py,写的是这个模块存在的理由,而不是它用例的清单。多数模块还额外带着围绕失败、重启、脱敏与并发的回归用例,这一行不会一一点名。

文件 打开这个文件的理由
test_action_ledger_repository.py 四条断言,讲的都是 Ledger 存储层拒绝做什么:覆盖已有的 group 或 event、把原子的 Tool group 拆开、改写已经终止的执行 attempt。列的迁移是只增不改的。
test_action_ledger_runtime.py Ledger 的另一半:运行中的循环究竟往里写了什么。参数在落库之前就已脱敏,分支只继承 checkpoint 过的父前缀,被中断的原生 group 会被原子地收尾,重开 store 之后历史还能重建回来。
test_action_routing_eval.py 与其说是断言套件,不如说是一个打分器。它把离线的路由 fixture 送进 Tool/Code/Finalize 路由,再输出一份供人工审阅的失败与混淆报告。
test_action_timeline_service.py 当 Timeline 把不该给用户看的东西显示出来时,来看这个文件。这个投影是公开的,所以测试大多在讲它扣下了什么——原始 payload、秘密、provider ID——以及它不许扣下什么,比如更早的那次 Tool 失败。
test_attempt_terminal_state.py 当执行 attempt 的终态和 Cell 实际发生的事对不上时,来看这个文件。CLI 与 Web 两处写入方共用同一个判定:worker 返回的结果只会是 failed、interrupted 或 completed,traceback 里出现多少次 timeout 都一样;只有 watchdog 抛出的 TimeoutError 才记为 timed_out。
test_attention_view.py 跨 Session「需要处理」聚合。只读 GET 把 running/queued 执行、待批准、可恢复失败、view-only/blocked 会话,以及 live/unknown 远程计算合成固定 shape 的卡片;team 可见性在聚合、排序、limit 之前生效;服务端不返回任意 URL。六类 fixture 各一张卡,跨用户零泄漏,cursor 绑调用方 scope,冻结的 50-Session 页 p95 < 200ms,GET 不 spawn kernel、不打 provider、不 retry/approve/harvest。
test_actions.py 两个外层循环共用的这一份回复解析。优先级规则钉在这里:原生调用压过代码 fence,没有闭合的 fence 永远不可执行,文档顺序里只有第一个 Cell 会跑。
test_admet_genetic.py 内置的 ADMET genetic Skill:能被发现、helper 的聚合是确定性的,以及它生成的 dashboard 会转义脚本和 HTML 定界符。
test_agent.py 全套里覆盖面最宽的一个模块——离线外层循环的完整链路。Code-as-Action 循环、没有 R 时 R Cell 软失败成一条 observation、token 估算、把一个 Cell 和它的 observation 压在同一个原子段里的 compaction,以及委派的上限。改坏了循环,通常先在这里露馅。
test_agent_control.py 压力之下的原生 Tool 批次。哪怕其中一次调用失败,或者整轮在批次中途被取消,批次里的每个调用最终都要落到一个结果。互不相干的只读调用可以并行,但一个会写的调用是它之后所有调用的 barrier。
test_agent_engine.py 单独用 fake port 驱动 AgentEngine。最后那个测试才是这个模块的要点:引擎不许 import 任何运行时基础设施。其余的钉住路由优先级、可重放的历史分组,以及取消究竟在哪几个时刻取胜。
test_agent_hybrid.py 关于 hybrid Agent 门面的两个测试:原生调用压过代码、且它的规范历史能活到下一轮;被复用的 agent 在接新任务前会清掉上一次的提交。
test_agent_profile_repository.py 落在 SQLite 里的具名 agent profile,主要是那些别扭的地方——假值的老式序列化、列表读取时的 JSON 解码边界,以及 upsert 必须扛住的“先读后写”那段空隙。
test_agent_progress_circuit.py 通用 Agent 无进展熔断:相同动作 / malformed / 同类 error / 长文本阈值,不同参数与 reasoning 插入不得误报,以及从 Action Ledger 而非活着的 RunState 重建重启/压缩状态。触发后是 no_progress,绝不是 completed。
test_agent_runtime.py 纯引擎与真实基础设施之间的本地适配器。两条规则占主导:原生调用解析出错或超出上限时绝不许下发,同时也绝不许把 Tool 结果弄丢。compaction 会把尾部撑开,好让 assistant 的 Tool group 保持原子;一个熔断器会掐掉反复低收益的 compaction。
test_compaction_summary_robustness.py 长程修复的 Lane A。摘要调用拿到真实的输出预算(max(8192, cfg.llm.max_tokens),可用环境变量覆盖)且不再设 temperature;空的或被截断的摘要抛 CompactionSummaryError,而不是把中段归档到一条模型随后会信以为真的占位符后面;摘要输入去掉 wire_state 并截断工具参数。
test_compaction_cli_budget.py Lane B。CLI 现在把 Web 循环早已有的、由 provider 推导的上下文预算和工具 schema 计量交给 CompactionPolicy,所以一次性的 openai4s run 按模型真实窗口压缩,而不是按配置默认值。
test_compaction_failure_breaker.py Lane C。连续两次压缩失败打开熔断,上下文增长 1.5× 后重新闭合;一次成功清零连击;上一条回复的真实 input_tokens 校准估算(钳在 [0.5, 8]),低估也能触发。
test_compaction_chunked_summary.py Lane D。过长的中段按有界滚动分块摘要——每次 chat() 输入低于预算的 0.35×,上一份 handoff 向前传递并从 transcript JSON 中排除——保留尾部按 token 选取、绝不拆开原子对,CJK 字符按每字一 token 估算。
test_compaction_externalize_retrieval.py Lane E。超大输出被复制到 kernel 能 json.load 的工作区相对路径 .openai4s/context/<sha256>.json,标记只写这个路径、不含任何绝对路径,仅由摘要构成的文件名无法被内容操纵。
test_compaction_ledger.py Lane F。压缩是一条 assistant_message=None 的 kind="compaction" Action Ledger group:旧 reducer 跳过它并重放完整历史,新 reducer 保留首条 user、丢弃被覆盖的 group、插入 handoff;覆盖边界是消息全部落在被压缩中段里的最后一个 group;daemon 经 _seed_messages 重建时恢复的是压缩后的视图。
test_compaction_wave2_integration.py Lane D 与 E 之间、两条车道各自的树都覆盖不到的缝:compact() 必须把 workspace 传进 externalize_large_outputs,policy 必须把它传进 compact()。
test_compaction_wave3_integration.py Lane D 与 F 之间的缝:ledger 恢复出的 note 必须与 compact() 在内存里构造的逐字节相同(共享 COMPACTION_NOTE_PREFIX),恢复一条已带框架句的 note 不得再加一次前缀。
test_compaction_wave4_review.py Wave 4 审阅在各车道集成后发现的问题。持久 ledger 记录只为 policy 采纳的压缩写入;覆盖按分支拼接序列中的 group id 判定(fork 后 ordinal 从 0 重新计数),任何错位都判为一无所覆而不是覆盖到尾部;缺少 event 的压缩 group 被跳过而不是当作空 note 应用;摘要 max_tokens 钳到模型声明的上限,被截断的分块(length/max_tokens/MAX_TOKENS/incomplete,重试一次)绝不用占位符补齐;上下文预算为 0 意味着未知;工作区 .openai4s/context 被占用只损失 kernel 副本、不损失压缩;Artifact 路径同样写这份副本;重新闭合的熔断拿回完整的失败预算。
test_analysis_skills.py 内置的分析类 Skill 在这里是真的被执行,不只是被列出来。它的数据审计能抓出分组泄漏,AUC 会处理并列,bootstrap 是确定性的。
test_annotation_repository.py 图像 annotation。一共三个测试,真正要紧的是并发钉图时的序号分配——它必须是原子的。
test_artifact_control_tools.py Artifact 恢复是这里最危险的操作,所以这个模块大半在讲它怎么拒绝:损坏的快照、不可信的 ID、版本切出之后又被改动过的工作区。恢复始终要过审批,store 写失败时会回滚。
test_token_mint_atomicity.py 同时启动的两个守护进程能不能对访问令牌达成一致。铸造流程先读文件、发现没有,然后以一次无条件的 os.replace 收尾——而 os.replace 面对一个已被占用的名字从不失败,于是每个竞争者都「赢」了:各自覆盖掉文件,而本该采纳赢家取值的那次重读根本不在任何互斥之内。八个进程在同一个 barrier 上放行,产出七个不同的令牌,磁盘上只留下最后一次写入——活下来的守护进程于是拿着一个 CLI 和启动时打印的 ?token= URL 都读不到的值去校验 cookie。现在由 os.link 落到最终文件名来决定赢家——这是唯一一个只可能成功一次的发布操作——并且内容在那个名字出现之前就已完整,因此输家的重读不可能落在半写状态的文件上,而直接对最终路径做 O_EXCL 创建则会留下这个窗口。文件与其所在目录都会 fsync,因为一个没有 fsync 目录项的已发布名字可能在崩溃中消失、而字节还在;0o600 也是在密文的第一个字节写入之前就落在 inode 上,而不是写完再 chmod。做出判定的那个测试起的是真实进程而不是线程:缺口位于两次系统调用之间,而 GIL 本来就会在系统调用期间交出解释器,所以线程版对着坏代码也会通过。
test_first_run_access.py 第一次运行的用户能不能进得去自己的守护进程。访问令牌变成了默认必需——这没错,这个守护进程会执行代码——但所有把 URL 交到人手里的地方都没跟着改:_url() 返回的是裸 origin,而浏览器自动打开、status、url、macOS .app 全都用它。所有可能的自救路径也都是关的:/static/app.js 在同一道闸门后面,所以 SPA 根本加载不了、也就无从提供入口;401 的响应体是 JSON;唯一可用的那个 URL 打印在 stderr 上,而 .app 把 stderr 重定向进了日志文件。于是 .dmg 用户在产品内没有任何通往可用会话的路径。现在打印出的 URL 会带上令牌(而那些会拼接路径的机器调用方显式退出,否则会拼出 ...?token=Xhealth),并且未授权的浏览器导航会拿到一个写明该运行什么命令的 HTML 页面,脚本仍然拿到可解析的 JSON。该页面不嵌入任何凭据、也不发起任何请求——它可能引用的每个静态资源都在同一道闸门后面。
test_token_query_bootstrap.py 访问令牌被允许以什么方式传递——全部通过真实的 Handler 驱动。?token= 引导过去是用「减法」写的:只要不是 /api/v1/* 也不是 /static/* 就放行,而它自己的注释把这称作「提供 SPA 外壳的路径」。/preview/<id> 两者都不是:它返回的是 artifact 字节,因此一个带令牌的链接会为整个守护进程种下持久的 HttpOnly cookie,然后把文件交给任何持有该链接的人——正是这条限制本该阻止的泄露。现在改为白名单,只允许根页面,也就是产品唯一会打印的那个 URL。另外,写请求 query string 里的 token 此前只是「不被用于认证」:只要该请求同时带着有效 cookie 就会成功,而凭据仍留在 URL 里,调用方无从发现自己正在泄露密钥——现在一律直接拒绝。其余用例钉住不能被破坏的部分:303 的 Location 不含凭据,cookie 为 HttpOnly; SameSite=Strict; Path=/,/health 保持开放,Authorization: Bearer 仍然可以认证。
test_frame_cap_units.py 两个量纲不一致的上限,外加一个工具漏掉的拒绝。MAX_OUTPUT 把 stdout/stderr 各限制在 1,000,000 个字符;_MAX_FRAME_BYTES 把整帧限制在 8,000,000 字节,注释还声称它「高于任何合法帧」——那只对 ASCII 成立。按文档上限实测:ascii 2,000,059 字节(通过)、中文与控制字符 12,000,059(被丢弃)、emoji 24,000,059。于是一个完全遵守所有文档限制的 cell 会丢掉 stderr、异常正文、error_lineno、guards 与 usage;只有 stdout 幸存,而且只是因为 manager 会用流式分块回填。现在这个上限由 MAX_OUTPUT 推导得出,两者不会再各走各的——而推导用的第一个常数还写错了(6,按 \uXXXX 算),因为 Python 把一个星平面字符算作一个字符,JSON 却要输出十二字节的代理对;本文件的一个测试当场抓住了它。另一处:secret_path_key 是阻止任何工具覆盖凭据文件的硬拒绝,write_file 与 edit_file 都声明了,而 web_download——唯一另一个 writes_files 的工具——没有,于是 write_file(".env") 被拒、web_download(url, ".env") 放行。断言写成覆盖所有会写文件的工具,第四个工具再想漏掉就会红。
test_message_paging_client.py 打开一段长对话时,工作台落在哪一头。newest_first、before_seq、next_before_seq 与 has_earlier 在 store、repository 与路由三层都实现了;而 app.js 里既没有 newest_first 也没有 before_seq,四处消息拉取全都发的是 ?from=0&limit=300\|500——也就是最旧的一页。于是一个 640 条消息的会话打开后停在第 0–299 条,你回来要看的那部分掉在了页外;与此同时 gateway.py 里还写着一句注释描述「客户端会请求最新一页」——描述的是一个从来没人写过的客户端。现在四处调用点统一走一个 helper,它还会把倒序返回的行重新排回阅读顺序(直接渲染会让整段对话倒着显示,那是个更糟、且看起来像服务端故障的 bug)。同时如实记录:has_earlier/next_before_seq 仍无人读取,因此超过一页的会话仍有够不到的更早消息——只是现在藏起来的是旧的而不是新的。
test_model_binding_recovery.py 被固定到某个模型配置的会话,还能不能再发出消息。D2 的 409 model_revision_unavailable——「请选择一个以继续」——判断正确,却无从回答:两处写 model_profile_id 的语句都在 raise 之后,PATCH /frames/{id} 只允许 name 与 task_summary,fork 会继承这个固定,id 是随机的所以重建同名 profile 也对不上,而 app.js 里这个错误码出现次数为 0。于是删掉一个模型配置就把所有绑定到它的会话永久变砖——历史和产物还能看,消息永远发不出去。有两个触发路径,只有一个需要点删除;另一个是 profile 还在、但绑定的修订号没了。现在删除会释放指向它的绑定,其余情况由 POST /frames/{id}/model-binding 回答。刻意做成独立路由而不是 send 上的一个标志:客户端每条消息都会带 model,把它当作同意就会每一轮都静默重新固定——正是 D2 要消除的漂移。409 本身没有被放松,有测试会在它被软化时变红。
test_retrieval_provenance.py 检索到的记录会说明取回时间并对上游返回的字节做哈希,于是「悄悄变了的重跑」和「没变的重跑」可以区分——并且这份信封会一路落到由它派生的产物上。
test_artifact_env_provenance.py 产物记录的是真正产出它的环境:R cell 的产物不再挂着 Python 包清单,选定的 conda 环境会被指名而不是记成 daemon 的,读不到的解释器如实报告缺失而不是借用本进程的包。
test_response_schemas.py HTTP 表面有了可核对的形状。响应形状是从真实响应里抓出来固化的,不是手写的,因此固化文件不可能描述出代码根本不会产生的响应;测试钉住形状代数(可选字段不得一直被当成必填,观测到 null 只让字段可空而非可缺)以及这道门真正要区分的事——丢掉一项保证是 BREAKING,多出一个字段只是增量。
test_response_capture_assembly.py 捕获被拆到多个 xdist worker 上之后依然成立。每个 worker 都在 pytest_sessionfinish 中原子发布(早于 xdist 报告成功),并在 share 中写明本次 run 与预期 worker 数。合并会在写出文档前拒绝缺失、损坏、陈旧或混入其他 run 的证据;完整拆分在可空数字与可选字段等观测下必须和单进程 schema 完全一致。
test_server_errors_module.py HTTP 失败类型可以在不 import gateway 的情况下被 import。这是拆解 Handler._api 的前置条件而非清理:GatewayError 原本在 gateway 自身 import 下方约 5800 行处,路由模块从那里 import 会让 daemon 启动即失败。测试在全新解释器里钉住「无循环」这一性质,以及十个测试模块已在用的再导出名字。
test_followup_admission.py 一个会话在已有回合运行时还愿意接受什么。消息原本完全没有文本上限——唯一的边界是 _MAX_JSON_BODY_BYTES,也就是拿 128 MiB 的会话归档上限来当聊天消息上限使——而消息是会被持久化并在之后每一轮重放的,所以一次 8 MiB 的粘贴本身就是整个上下文窗口的八倍,compaction 也救不了:要摘要它就得先把它发出去。会话如果钉在一个已被删除的 model revision 上,bind_model_revision 确实会拒绝并给出 409,但它跑在工作线程里,于是走到 HTTP 上就变成了 200 加 {"status": "failed"}——正是另外六条路由已经修掉的那种「软字典」形状。队列满了则以 500 internal_error 抵达客户端,等于让一个会重试 5xx 的客户端去死磕一个在用户动手之前根本不可能接受请求的队列。这里所有用例都驱动真实的 handler:这几个缺陷全都长在「函数行为正确」和「路由如何上报」之间的缝隙里。
test_gateway_kernel_routes.py 十二条 kernel 路由,在从 Handler._api 搬走之前先钉住。其中四条既无冻结形状也无任何路由级测试;另有四条只钉住了 403「REPL 已禁用」信封,以至于把 restart 与 stop 的实现对调能同时骗过 pytest、响应形状门和浏览器冒烟。同时原样记录两处不对称而非顺手抹平:十二条里有十条对不存在的 frame 仍返回 200,而 kernel/install 刻意不受 notebook_repl 管辖。凡替换了服务的用例都打上 stubbed_backend,使编造出来的响应不会进入冻结契约。
test_telemetry_schema.py 遥测只能说计数与枚举,这个文件负责挡住其余一切。它攻击的是值而非键——{"error_type": "ValueError"} 与 {"error_type": "FileNotFoundError: /home/y/unpublished/cohort.csv"} 过的是同一个键检查。泄漏样本取自本仓库真实会产生的东西(agent 所写 cell 里定义的异常类、SKILL.md frontmatter 里的 skill 名、环境目录名、provider 返回的整句报错),与每个已声明字段做叉乘。同时断言本包永不 import 那个刻意豁免绝对路径的凭据打码器。
test_egress_surface.py 每个能发起出站连接的模块都被声明,并附理由。它是遥测的前置条件,但不只服务于遥测:在此之前仓库里没有任何地方记录哪些模块能触网,而「一个数据包都不会离开这台机器」是关于整棵树的断言,无法逐个文件核对。今天是七个模块。新增一个会连同文件与行号一起失败——于是往这张表里加一行是一个决定,而给某个模块加上 urlopen 只是一个星期二。监听 socket 刻意不在范围内:那是另一种风险,有另一套答案。
test_telemetry_consent.py 同意是遥测不得缺少的前提。它钉住两条「替代方案看着也挺合理、但会静默失效」的性质:撤销时连同 install id 一起销毁(且不留墓碑——「曾经授权过」这个记录本身就是一个活得比撤销更久的用户事实),以及环境变量可以否决但永远不能授权。写这个文件时抓到一个真实缺陷:被否决的 grant() 仍然写入了记录,于是脚本化的授权会静默落盘,等变量一消失就生效。
test_telemetry_off_by_default.py 「没有同意就没有任何东西离开这台机器」的证明。断言是绝对的,测试也必须是:每一个出站原语——包括 getaddrinfo,因为一次 DNS 查询本身就是同意所要授权的那个信号——都会抛异常,而不是被一个返回像模像样 200 的 mock 悄悄吸收。覆盖 import 阶段、daemon 构建、撤销、环境否决,以及 sender 的每一条拒绝。写它的过程中抓到了我自己的一条空测试:断言 _NoRedirects.redirect_request 返回 None,完全没有证明 send 是否真的装上了这个 handler——删掉装配的变异当时是通过的。
test_telemetry_emit.py emit 位于热路径上(daemon 启动、每次 turn 结束),所以它的第一职责是不造成伤害:报错的 store、抛异常的同意读取、崩溃的发送——都不得到达调用方,而且发送绝不在调用方线程上跑。同时把 stop-reason 映射钉在 engine 真实的六个取值上(completed/done/stopped/cancelled/max_turns/failed);第一版调用点映射了 engine 根本不产生的 finalized,还漏掉了三个它确实会产生的。
test_telemetry_transmission.py 撤销是一条边界,而不是「请尽快停下」:用 barrier 把发送方卡在「已读到同意、尚未 open」的那一点,再从另一线程撤销,不变量只是一次比较——revoke 返回之后没有任何东西到达 opener。另外挂住 collector,数一数 200 个事件到底让 daemon 付出多少线程、队列深度与被计数的丢弃。
test_telemetry_consent_route.py HTTP 边界上的 Customize 开关。GET 报告 {enabled, env_locked},PUT 授权或撤销;该路由只记录、绝不发送。验证接线把 consent 模块的保证一路带过 gateway:全新安装读到关闭,授权铸出 id,撤销销毁它,重新授权是新身份,而环境否决会被暴露,使 UI 不至于摆出一个按了没用的开关。
test_telemetry_collector.py 接收端,在一个临时回环端口上(绝不公网绑定)用客户端同款 wire.seal 驱动。relay 不会有的那条性质:服务端不信任发送方,于是一个手工构造、把路径塞进 error_type 的信封,该字段一到达就被丢弃——「仅计数与枚举」即便面对无视它的客户端也成立。外加那些无聊但必要的拒绝:Host 白名单(不是 Origin==Host,鉴于 relay 的 DNS-rebinding 历史)、在读取前就按 Content-Length 卡的 body 上限、限流,以及一个只保留计数、不保留逐安装日志的聚合。
test_artifact_step_environment.py 「Saving ...」步骤卡要写明是哪个运行时写出了这些文件。原来的写入方不管 Cell 是什么语言都填 Python 内核的标签,于是 R Cell 的卡片被存成、也显示成「environment python」,而同一个文件的 Artifact 环境快照写的却是 r。测试走真实的 kernel/execute 和 steps 路由,只替换掉 R worker。0.2.x 存下的行没有 language,会通过产出其 Artifact 版本的那个 Cell 来读;记录了自身语言的行按原样读取。
test_artifact_manager.py 工作区 Artifact 的捕获、版本化与 cell 提升。其中很大一部分是在防重复:临时版本必须合并进去,而不是变成第二个版本;Stage 1 下相同 head 字节必须复用版本,同时保留新的生产 Cell observation;R 的捕获也不许跑 Python 的图像探测。提升会拒绝符号链接的输出路径,图像只以安全的 data URL 形式内嵌。
test_artifact_mutation_service.py 界面上的交互式编辑、重命名、上传与删除。事件形状被一字不差地钉住,因为前端要读它们;任何想逃出工作区的路径都会失败即拒绝。
test_artifact_repository.py manager 底下的 artifact、版本、环境、血缘与 capture-observation 仓储。要盯的是事务这条承诺:血缘或 observation 持久化失败时,整个 record_cell 事务连同那个版本一起回滚。它还证明不同 Cell 产生相同字节时只会形成一个版本、两条带作用域的 observation,且不会重写原始 producer。
test_code_evidence.py 源码类交付物的完成证据。既有核对只问“声明的文件在不在”,而“测试全过了”这句话此前唯一的依据就是模型自己说的。这些用例钉住 reusable_pipeline/codebase_change 下的四个字段,以及每一种失败方式:文件被删、路径落在证据根之外、sha256 对不上、文件从未被登记为 artifact、入口无法编译、伪造的 cell id、来自别的会话的真实 cell 行、状态为 error 的 cell、有 ok 状态但没有 stdout 的 cell,以及 stdout 里写着 FAILED 的 ok cell。其中一条比其余都重要:一个在导入时就写文件的入口必须只被编译、绝不被执行,因此它本会留下的标记文件必须不存在。analysis_run 在两个方向上都被断言为原样不变——既不要求字段,也不校验乱填的字段——并且证据存储损坏时必须拒绝而不是降级放行。
test_completion_delivery.py Stage 1 的精确版本交付边界:规范化百分号编码 URL,不可变快照的作用域/大小/校验和验证,消息与 manifest 原子持久化,幂等冲突、committed 台账读取与幂等发布标记,以及损坏或故障时失败即关闭。
test_artifact_ref_chip.py 把 @文件 引用变成一条可持久化的记录,而不是每次发送都重新解析一遍的字符串。此前有两处可复现的拒绝:同一个兄弟会话里的文件只能被引用一次(物化会在活文件名已被占用时拒绝,而占用它的正是第一次成功的引用,于是第二轮回来的是 materialise_failed,模型什么也没收到);同名的两个 Artifact 互斥,原因相同——而钉版本这套写法的全部前提,恰恰是「名字不是身份」。覆盖复用已有副本、带版本号的落地文件名、六个字段(artifact_id/version_id/sha256/display_name/source_session/materialized_target)、被预算砍掉的引用不得被记为已发送、经由真实发送路径的持久化、走真实 HTTP 的会话消息路由,以及分支投影。另外还锁死了那件本来就是对的事:插入后又删掉的 chip 不会留下任何 Artifact 和血缘边——因为正文是唯一事实来源,而物化只发生在发送那一刻。
test_memory_scope_and_budgets.py UI 把记忆写入 "default",而注入读取的是当前会话的 project,因此用户创建的记忆对它本该服务的会话完全不可见——一个悄无声息失效的功能。现在实现了 global 与 project 两级作用域及继承、在插入之前强制执行单条大小与每作用域条数限制,并且删除也带作用域,使得仅凭 id 的删除无法跨越 project 边界。
test_queued_followups.py FIFO 队列、每张票据的身份、413/409/429 准入拒绝以及同级安全的取消在服务端全部真实存在且可通过 HTTP 访问——而运行期间 composer 只是被禁用,完全没有队列 UI。
test_model_protocol_menu.py profiles_payload 早已提供 protocols: list(PROFILE_PROTOCOLS),而客户端忽略它并硬编码了下拉框——因此同样可派发、同样被 POST/PATCH 接受的 gemini 与 openai_responses 在 UI 中无法选择。
test_session_and_message_paging.py 会话列表的 keyset 游标在服务端是真实的,但在整个仓库里没有任何生产调用方:loadSessions 被硬编码为 limit=100,因此超过 100 个会话的 project 根本无法访问其余部分。测试遍历 260 个会话与 640 条活动分支消息,断言无遗漏、无重复,且导出包含首尾两条消息。load-more 控件的触发与滚动锚点的稳定只能在浏览器中验证,因此被如实标注,而不是用一个针对 app.js 的 grep 来伪装。
test_project_paging.py 首页项目目录分页。1000 行 fixture 仍按每页 100 返回(单次不超过 100);(last_active_at, project_id) keyset 能走完同一时间戳的 tie,空 last_active_at 排在最后;每页最多两条 SELECT(JOIN 聚合 + 过滤后精确 total);转义 LIKE 把 \\/%/_ 当字面量且只搜 name/description,ASCII 大小写不敏感、非 ASCII 精确匹配;q 超过 128 个 code point 返回 400;filter 或 principal 变化、以及畸形 cursor,返回 400 invalid_cursor 而不是静默回到第一页;团队可见性在 LIMIT 之前生效,隐藏行不能占页面槽位;无参数 GET 仍是全量,offset 在兼容窗口内被真正执行。
test_artifact_refs.py 消息里的 @文件 到底发出去了什么。旧的解析读的是 Artifact 的活文件,所以同一条引用在后续 cell 覆写文件之后就指向了不同的字节;解析不出来的名字被静默丢掉,用户于是在问一个模型根本没收到的文件;而且所有 Artifact 都按 UTF-8 errors="replace" 解码,于是一个 .npz 变成一整片 U+FFFD——模型读到的是「损坏的文本」,而不是「这不是文本」。覆盖钉版本的写法、保留一个小版本的旧写法、发送时才做的跨会话物化,以及各项预算。 另外还覆盖了那条「前两个上限乘起来没人管」的预算:MAX_REFS 限个数、MAX_REF_BYTES 限单个,但 8 个都顶到上限就是 1,600,000 字符——约等于 262,144 token 窗口的 1.5 倍,也是用户手打消息上限的 8 倍。现在所有引用共享一份预算,被砍掉的会被点名,而不是悄悄消失。
test_artifact_index.py project Artifact 索引路由。500 条 fixture 首屏仍是 50(单次不超过 100);(created_at, artifact_id) keyset 能走完同一毫秒的 tie;转义 LIKE 把 %/_ 当字面量且只搜 filename;filter 变化后旧 cursor 返回 400 invalid_cursor;team 可见性在 LIMIT 之前生效;跨 Session/version 的同名 Artifact 不合并;旧数组 route 仍是裸数组。browse 索引只增,失败的 migration 步会回滚。
test_artifact_scope.py 子 frame 产出的 Artifact 到底归谁。scope 从根 project 继承下来;显式指定的根若与已知的生产者冲突,会被拒绝;一次迁移会修好规则出现之前写下的那些会话。
test_artifact_scope_closure.py 三个位于完整生产调用链上的作用域漏洞,每一个都能被一行 agent 代码触达。artifacts、artifact_versions、lineage_edges 和 frames 不在任何拒绝清单里,因此一条 SELECT 就能返回所有 project 的文件名、校验和与绝对路径——而已有的过滤器匹配的是 SQL 文本,绑定参数对它完全不可见。_scoped_artifact 对外部对象抛 PermissionError、对不存在抛 KeyError,而十二行之下的 _scoped_version 把两者合并并解释了原因。view_image 把作用域检查推给了一个并不执行它的地方,save_artifact(input_version_ids=…) 则完全不校验就写入跨 project 的 lineage 边。
test_artifact_workbench.py Stage 9 Artifact workbench 的 Go/No-Go:CSV 对完整数据集排序/筛选、未改文本不建版、苯环 molfile 保存再打开有 6 个碳、PDF/HTML locator 进入下一轮文本,以及 /ketcher 仅在 flag 打开时提供真实 Ketcher 3.7.0 资源。同时钉住 /table 的可选 version_id(绝不降级 latest),以及 flag 关闭时 /table/profile 与 /table/export.csv 的 403。
test_table_profile.py 表格工作台 GA 后端:共享 query parser 快照、histogram 边界、approximate unique、export 分块与 32 MiB 总量 413、恶意 Parquet metadata、缺 optional 引擎时保持 unavailable、profile 统计不入库,以及资源验收 manifest 阻止默认开启。
test_upload_scope_resolution.py POST /uploads对任何不在 default 项目下的会话都是不可用的。upload 里写的是 payload.get("project_id") or "default",于是一个只给了 frame_id、根本没提项目的请求,被代为断言成了 "default"——而 artifact_write_scope 正确地拒绝与生产帧不一致的项目声明。这个拒绝是一个没人接住的 ValueError,一路到达 dispatcher 的兜底并以 500 internal_error 返回:写错项目的客户端被告知的是服务器坏了。现在这组测试还钉住 exact writer 事务:固定的 live 与不可变目录、贯穿 pending/final 的 held inode、journal 身份、每个崩溃点的回滚/恢复,以及同字节或恶意字节的最终组件替换。
test_artifact_ref_chip.py 引用此前只是一个每次发送都会被重新解析的文本 token,因此没有任何读取方能还原模型真正读到的是哪个 version——而对跨 session 的拷贝来说,那并不是用户所指名的那个 version。现在持久化了六个字段。它还捕获了本批次引入的一个回归:materialise_artifact 中的同名拒绝策略导致第二次引用同一个兄弟 session 文件时失败,因为文件名已被第一次引用占用。
test_annotation_version_binding.py 图片附件的字节此前未绑定到不可变 version:annotation 不记录 version_id/checksum,而 resolve_artifact_path 返回的是 artifact 的最新 version,因此在钉住与发送之间覆盖该图,模型收到的内容会被静默替换。MIME 现在由 magic byte 判定而非文件名。
test_backend_import_contract.py 这是一次源码扫描,不是行为测试。在实现逐步搬进新包的过程中,调用方只能 import 已声明的门面表面,并且不许新增对未声明的旧模块内部符号的依赖。
test_background_cleanup.py 后台内核生命周期与 trusted-capture admission:关闭时先中断再杀 worker,启动或清理失败也会释放 lease;协调器状态畸形或损坏时 fail closed;外部 mutation 对 owner 可重入、但与 writer 互斥;输出缓冲保持有界。畸形状态矩阵还使用稳定的 xdist ID,保证每个 CI worker 收集同一套测试。
test_bash_authorization.py host.bash 在内核本地执行,Host 从不代跑,只负责授权。这个模块就是“这张 token 足够了”的完整论证:它绑定命令、cwd、generation 与 challenge,一次性、会过期,而且被篡改后 worker 会在拉起任何子进程之前就拒掉。
test_biosecurity_web_parity.py 生物安全筛查器在用户真正使用的那个界面上到底跑没跑。OPENAI4S_BIOSECURITY 默认开启,config.py 明确写着它做两件事:拼接「校准问责」提示词并且运行 diO 轨迹筛查器。CLI 的预执行闸门两件都做了;Web 守护进程的 _safety_refusal 调完 classify_code 就返回——于是 uv run openai4s run 会拒绝的 cell,./start.sh 照跑不误。丢掉的恰恰是更要紧的那一半:提示词是请模型守规矩,筛查器才是检查它有没有守。筛查器判定的是轨迹,所以端口必须放宽以传入 session;_gather_trajectory 是从 CLI loop import 过来的,不是重写一份——「什么算轨迹」有两份定义,就是两套安全策略顶着同一个名字。
test_bioprobench_skill.py BioProBench Skill 里两个会「安静出错」的评分器。真值写成 0/1 或 "true"/"false" 时,必须和写成 JSON 布尔值时打出完全一样的分;无法识别的标签要落进 failed_rate,而不是被当成一次笃定的错答来计分;PQA 里像 0.3 这样本身就正确的裸答案,不能被当成它自己的置信度吞掉。
test_capability_state.py 持久的 Skill 与 Specialist 启用状态。它防的是这样一种失败:某个 Skill 在提示词里是禁用的,在 search 里却不是;或者 loader 还攥着一个已经关闭的 Store 的仓储。
test_catalyst_sar_screening.py catalyst SAR Skill:它文档里的流水线和硬性锁定、随包带的 CONTCAR 目录,以及 POSCAR 解析器的边界情况——负的缩放系数、被截断的文件、要先做净化才能当文件名的结构化名字。
test_cell_cancelled_during_bootstrap.py 一个 Notebook Cell 的新内核还在 bootstrap 时,daemon 关闭把它取消了。还没有绑定 lease 的 bootstrap 谁都中断不了,而 bootstrap 返回之后也没有人再看一眼取消状态,于是在真实 daemon 上,用户代码是在关闭过程中开始运行的,一直跑到 watchdog 下一次轮询才被发现。这里用真实的 SessionRunner、真实的 Python 内核和 runner.close() 来驱动,并在 host 侧把 bootstrap 卡住:Cell 的代码从未运行,它的 attempt 和执行日志行都以 interrupted 结束,Notebook 事件也如实这样报告。这个检查读取的每一个信号都能单独拒绝 Cell:没有已准入 ticket 时会话自己的停止标记;以及 Stop 或关闭先取消、尚未同步到该标记上的 ticket——而且只对那个 ticket 所属的会话生效。
test_cell_dependencies.py Python 与 R Cell 的静态依赖分析,而且刻意允许它说“我不知道”。动态写命名空间或解析失败时,这个 Cell 会被标成不确定,而不是猜一个结果;失效状态再从那里沿依赖传递下去。
test_cell_execution_service.py Web 的 Cell 服务,事务顺序都在这里。attempt 在 Cell 准备之前就分配好,哪怕 worker 抛异常也要收尾。R 的协议异常只关掉当时正在执行的那个 lease,绝不误伤它的替身。只走协议的 host.submit_output 照样进审计,只是不作为 Notebook cell 流式播出去。
test_cell_watchdog.py 一个停不下来的 Cell 的超时恢复。要读的是那个不显眼的情形:当 Cell 停在等待权限审批时,超时预算会被冻结——否则一个人思考一分钟就足以杀掉内核。
test_checkpoint_state_snapshots.py 绑定到不可变 checkpoint 的 plan、review 与记忆状态。两个行为是承重的:遗留 checkpoint 被当成“部分状态”,而不是会抹掉现有数据的空状态;损坏的状态失败即拒绝,而不是恢复出半个自己。
test_checkpoint_binding_survival.py 捕获用 SELECT * 读 annotation,恢复却用不含 version_id/checksum 的显式列清单写回,于是每一次 restore 都会解除所有 pin 的绑定,把 migration 12 专门要消除的“解析到 latest”行为放回来——而这条路径的全部承诺就是把会话恢复原样。记忆的 updated_at 以同样方式丢失。断言落在真实 restore 之后数据库里的列上,而不是快照字典上:快照本来就是对的,这正是丢失难以被发现的原因。
test_cli_daemon_api_root.py CLI 打给守护进程的请求到底有没有命中路由。openai4s share 用 /api/... 拼 URL;而守护进程只在 /api/v1 下提供 API,其它一律用「the API is versioned」明确拒绝——于是九条 share 子命令全部 404:这个功能在任何已发布版本里都从未命中过任何一条路由,连分享页面让接收方执行的那行 openai4s share import <url> 也一样。现在前缀取自 contract.API_ROOT——网关路由用的同一个常量;而自带 /api/ 的路径会被大声拒绝,而不是再生成一个没人会当成缺陷的 404。断言是针对所有调用点的性质,因为那九处错得一模一样。
test_cli_catalog_posture.py 无头 CLI 面向模型的工具投影会参照授权姿态。define_dynamic_tool 以及其余需要审批的动态工具生命周期工具,以前每次 CLI 运行都会声明给模型,可在没有通道、出厂即拒绝无人值守审批(或在 Guardian 下)时,每一次调用都会被拒——模型偏偏先去调它们,每次白白浪费一个回合。规则是通用的,并非一份动态工具清单:凡是需要审批、且没有任何审批路径能放行的工具都会被略去。默认姿态下,从第一个回合起就隐藏四个动态工具生命周期工具、web_download 和 rollback_skill_version;restore_artifact_version、exec_background、read_mcp_resource、get_mcp_prompt、request_network_access、stage_model_asset、register_remote_capability 和 compute_submit 则在各自分组激活后隐藏。这些工具在该姿态下原本就全部被拒。search_capabilities 用的是同一个判定:它以前把这些工具列在 visible_tools 里,一个真实模型因此调用了 exec_background,被拒后白白丢掉一个回合;现在 visible_tools 和每个命中分组的 tools 只列出 provider tools= 列表里真正提供的工具,其余的列在 unavailable_tools 下、原因为 approval_unreachable(不设判定的 Web 根会话永远不会出现这个键)。这里钉住哪些情况会隐藏它们(默认姿态;Guardian 下即使无人值守环境变量是 allow;针对所有目标的 deny 规则),哪些情况会保留(常设 allow 规则、OPENAI4S_UNATTENDED_APPROVAL=allow、像 Web 路径那样挂着审批通道),以及被隐藏的工具若仍被调用,闸门照旧拒绝并留审计。
test_cli_code_mode_test_runner.py 无头 CLI 里的显式代码模式。reusable_pipeline/codebase_change 的完成需要每条被引用的测试命令都有一张 Host 授权的 host.bash 回执;没有审批通道、又是出厂即拒绝的姿态时,这张回执根本拿不到——每次运行都一路跑到 max_turns,模型在猜它从未见过的 cell id。这里钉住精确命令的 --allow-test-command 选项(glob 转义、会话作用域、在任何规则落地前先校验)、没有任何途径能授权 runner 时(Guardian 下也一样)在第一次调用模型前就拒绝、只在契约生效时才出现的 [cell id: …] Observation 行(Web 与 CLI 都是),以及点名 host.bash 和关键字参数形状的模式片段。
test_cli_contract.py 别人写脚本会依赖的那层 CLI 表面:入口、子命令、选项与 help 文本。status 只报告本地数据目录,并不宣称 daemon 是健康的。
test_cli_auto_mode.py openai4s run --auto:它启用的 autonomous 预设(以及它不会覆盖的操作者显式选择),还有让一次性运行也能给出真实终态的 post-run reviewer adapter。--auto 不是全权放行——它完全不设置 OPENAI4S_UNATTENDED_APPROVAL。复核数据包里装的是这次运行真正记录下来的东西——各 cell 的代码与输出、原生工具账本——因为一次正确的运行拿 cells: [] 去复核,结果把任务自己的指令标成了没有依据的声明;而没有执行记录、或者执行过的 cell 在记录里缺失的复核,一律记为遗漏,绝不会报告 verified。
test_cli_stop_slow_daemon.py 针对一个退出耗时超过宽限期的 daemon 执行 openai4s stop。旧代码把轮询结果直接丢弃:无条件清掉 pidfile 并打印 "daemon stopped",把一个仍占着端口的活 daemon 变成孤儿,status 却说 "not running"。测试驱动真实的忽略 SIGTERM 的子进程:超时后 pidfile 保留、退出码非零,--force 升级为 SIGKILL;bind 失败的 serve 打印一条清晰错误,而不是在成功横幅之后崩出 traceback。反方向也覆盖:在 5 秒 SIGTERM 宽限期之后不久才退出的 daemon 算正常停止,因为 stop 会打印一行 shutting down… 并继续轮询到 --timeout(默认 30 秒),而不是返回 2。
test_compute_nvidia.py NVIDIA BYOC provider,每一次 docker 调用都被假的子进程层截住,所以不需要 Docker、GPU 或网络。安全的那一半是两阶段 secret 清洗:provider 的顶层代码在被 import 时,不能读到形似凭据、或带已知前缀的环境变量。
test_config.py 分层配置,而且基本围着同一类 bug 转:从模板里抄来的占位 API key 绝不能被当成真 key,无论它是从环境变量来的还是显式传进来的,也不能挡住真正的按 provider 配置的 key。
test_container_deployment.py Dockerfile、compose.yaml 与 Kubernetes 清单,被钉在赋予这些值意义的代码上:探针路径钉在网关自己的免鉴权集合上,端口钉在 Config 的默认值上,注入的 API key 变量则通过 LLMConfig 真正解析一遍而不是照名字信任它。配置自己不会失败——变量改名或路由挪位只会在以后、在别人身上停止工作。有两项是因为「一次看似合理的修改就会把它反过来」而被断言的:单副本(存储是 SQLite)与只发布到 loopback 的端口。它还覆盖了跨容器重启的单例问题:只看 pid 存活分不出陈旧 pidfile 与被复用的 pid,于是一个被杀掉的容器从此起不来。
test_connector_repository.py MCP connector 的那些行:JSON 规范化、排序、启用与停用,以及把它们喂给 Host MCP 服务的 Store 门面。它还固定了不泄密的编辑语义:未提及的 env 保留,显式替换只更新 broker 后的值,显式删除会清理对应 secret。
test_context_policy_web.py 两个测试。超大的上下文输出会变成一个去过重的 Artifact 版本,而不是又一份拷贝;compaction 的 payload 会被链回会话历史,而不是被丢掉。
test_data_background_tools.py data 与 background 这两类 Tool。有两条策略是被断言出来的,而不是假定的:query 严格只读,没有任何能把它放宽的审批路径;提交后台任务要过闸门,中断它则始终可用。
test_datapro_index.py 成功 DataPro 响应进入本地索引时的完整性边界:不靠字段白名单递归索引所有返回字段,大批量不截断,相同内容在不同 JSON pointer 上不合并,重复写入幂等,SQLite 在批次中途失败时会连同此前条目一起回滚。另钉住严格整数 code 准入、命令面板检索,以及 Artifact/会话/项目全生命周期清理。
test_doubao_search.py 豆包搜索作为主搜索源时的离线安全与路由边界:每次请求都从 SecretBroker 即时解析 Agent Plan 凭证,轮换后立即生效且不落明文;固定 endpoint/header/body 契约必须精确;只有已证明存在结果列表的响应才能成为 source: doubao;鉴权与额度失败不能被备用搜索源伪装;重定向、超大或畸形响应一律失败即拒绝;上游反射的凭证在结果或异常离开服务前必须清除。这里所有上游都是 fake,因此整模块标记 stubbed_backend;真实上游成功只由显式启用的浏览器门禁负责。
test_dangerous_tool_declaration.py 工具的 dangerous 声明究竟起了什么作用。十个控制工具声明了它,两个测试断言了它,然后仓库里再没有任何地方读它——dispatcher 不读,broker 不读,审计记录不读,审批卡片也不读。后果落在授权提示上:每张卡片长得一模一样,而「记住范围」默认是 conversation 并预填了模式串,于是在 restore_artifact_version 上点一次 Allow,就把「恢复产物」授权到了整个会话,和读一个文件的待遇完全相同。现在这个声明会一路送到 broker、随持久化的请求 payload 落库,卡片也会读它——一个风险徽标,以及一个只覆盖本次调用的默认授权。接线是通过真实的 dispatcher 调用来驱动的,而不是自己把这个标志喂给 broker:自己喂的测试在调用点根本没传的情况下照样通过,而那正是缺陷本身。
test_delegated_cell_record.py 委托子代理的 Cell 成为持久的 execution_log 行,键在子代理自己的 delegate frame 下(origin="delegate"),失败与宿主侧崩溃的 Cell 也记录,并盖上子内核真实的 generation id——通过真实 DelegationRunner 与真实内核端到端驱动,只有 LLM 是脚本化的。行在 Store 重开后仍在,嵌套子代理键在嵌套 frame 下,父 Notebook 从构造上保持干净,lineage 的 cell_recorded 经由未改动的视图变为 true。也覆盖 ComposedCellHooks 契约:stage-1 捕获钩子抛异常时记录器仍然落库,原生调用只到达捕获那一半。
test_delegation_env_inheritance.py 委托子代理在全部三个内核构造点(前台、后台工厂、R 通道)以及嵌套层级上继承父会话选定的环境;子内核注册持久 generation,artifact 环境溯源解析它而不是退回“assumed”的 daemon 兜底;没有切换回调的 host.env.use 是错误,子代理的切换真的会让下一个 Cell 换解释器。
test_delegation_idempotency.py 持久请求身份与 attempt 身份分离。10 个并发相同 request 只创建 1 request 1 child;同一 action group 两个 native_call_id 创建 2 request;digest 冲突 409;终态复用零 provider 调用;restore 从不自动 continue——只有显式 continue 才递增 attempt_no。上限保持 48/1000/4。
test_delegation_persistence.py 跨 daemon 重启的委派。进程死掉时还活着的子任务必须被停掉、它的 lease 必须被 fencing 掉,而不是被新的 generation 悄悄认领。steering、预算、级联取消与删除后的清理也在这里。
test_delegation_policy.py 四个测试,一个主张:子任务的 capability 与权限策略是真的会强制执行,不是摆设。无效策略在消耗预算之前就失败;嵌套的子任务既放宽不了父任务给的权限,也松不动一条拒绝。
test_delegation_control.py 从 agent 外部停止和引导子代理。_stop_subtree 和 send_message 本来就是对的、也已有测试——但够不着:用户眼看着一个子代理跑飞了,除了停掉整个会话别无办法。这两条路由真正新增的是状态码映射,而三种回答必须互相区分:404 持久记录里根本没有这个 child;409 记录里有,但没有任何活着的东西能对它动手;200 做完了。409 是很平常的一种情况——守护进程重启会把所有 pending/running 的 child 标成 stopped 并写上 stop_reason='daemon_restart',于是重启前打开的页面手里全是已经不存在的 child id;这时回 404 等于告诉用户「你亲眼看着跑过的那些活儿从来没存在过」,回 200 则是宣称停掉了其实什么都没停。send_message 的 {"ok": False} 现在变成 409,而不是裹在成功里发出去。还包含成功路径的用例——没有它们,这个文件里每一条断言的都是拒绝,一个接错方法的 handler 照样全绿。
test_delegation_runtime.py 跑起来的子 agent。预算由整棵树共享,并在并发的 runner 之间原子预留;深度四是无条件的叶子;停止之后才到达的模型回复,既不能执行也不能提交。
test_delegation_null_semantics.py 两扇委派门里,显式 null == 省略 == 默认值,且两扇门表现一致。SDK 编解码本就丢弃顶层 None;原生 delegate_task 现在在 schema 校验前剥掉它们,而不是拒绝 provider 发来的字面 null;fan-out 项里嵌套的 None 改为继承,不再覆盖继承值(也不再让轮次预算解析崩掉)。
test_delegation_step_projection.py 委派步骤卡不再说谎。旧投影把任意子结果压平成 2000 字符的 JSON 字符串、盖一个写死的绿色「done」;现在结构化有界投影携带 task_status/轮次/环境/局限/产物,摘要词就是 task_status 本身,状态词表新增 warning:completed→done,partial/blocked/stopped/max_turns→warning,failed/畸形结果/传输错误→error,fan-out 取最差子任务——既在纯投影上验证,也穿过真实 dispatcher 的 on_step 端到端验证。
test_delegation_task_status.py 委派完成契约。stop_reason 只说子 agent 的引擎如何终止;task_status(completed/partial/blocked/failed)才说任务本身完没完成——在 envelope 构建处单点推导,子任务的自报只是输入,机器校验(对照 store 的 require_artifacts)只能降级不能升级。max_turns 归入 failed 生命周期,每个终态都持久化 stop_reason;有界的 retries 选项把上次的 limitations 附回请求重跑一个没完成的子任务——全系统唯一的自动重试。
test_delegation_workspace.py 默认关闭的私有 scratch 原型。两个 child 写入同名文件互不覆盖;每个输出 version 的 producer 是写出它的那个 child;显式 materialize 之前父 workspace 不变;materialize/回滚不删除已发布的 Artifact version。
test_dynamic_tool_scopes.py Dynamic Tool 在会话、project、global 三种 scope 下的解析,优先级也是这个顺序。重新提升同样内容会复用版本,但仍然记一笔审计;跨 project 的激活和被篡改的 scoped manifest 都失败即拒绝。
test_dynamic_tools.py Agent 自己写的工具,是把新代码送上这台机器最直接的一条路,所以这是个“围堵”模块。每个工具都跑在自己的一次性 worker 里,前面有源码闸门,环境里没有任何 Host 的 secret,而且拿不到强制开启的 OS 沙箱就根本不跑。schema、TTL、权限与超时检查再叠在上面。
test_e2e.py 只有两个测试,却是全套里最宽的一层栈:真实的 Skill loader、真实的内核子进程、真实的 HostDispatcher,只有 LLM 是脚本化的。第二个测试看的是内核抛错时 Agent 实际观察到了什么。
test_image_attachment_budget.py 一轮对话最多能附带多少图像。原先每一张被钉住的图都按原尺寸附上,既没有张数上限、也没有单张和总字节上限——8 个图钉打在一张大图上就往 provider 发了约 10 MiB,80 个就是十倍。三条预算都用写死的数值来断言,而不是拿被测的那几个常量来断言:这几条测试的第一版正是用「被测上限」本身来定义期望值的,于是把预算整个删掉也一条都不红——是变异测试把这一点揪出来的。
test_host_network_capability.py Host 的对外访问能力,以及让它成其为「能力」的那几道闸。有三个内置 Skill 之前直接用 urllib,原因是 host.web_fetch 表达不了它们要的东西:不跟随重定向的 HEAD 存在性探测、可联系到人的 User-Agent、二进制下载。而在 cell 里用 urllib 发出的请求,既不过出网允许名单也不过 SSRF 检查——所以这不是「用起来不方便」,而是产品自己的一部分流量绕开了自己建的围栏。补上这个缺口等于新增三项权限,所以这里的每一条测试断言的都是一次拒绝或一个上限:字节上限在读取过程中生效、下载流式写入 daemon 私有暂存区并通过已校验父目录描述符发布而不在 daemon 内存中收集 checkpoint 量级的响应、父目录替换不能重定向发布、探测和其他请求一样要过闸、越界的下载在联网之前就失败。它驱动的是真的 WorkspaceFileService 而不是替身——替身有可能比真身更严,那样测试全绿而能力仍然是敞开的。
test_egress.py 出站域名的允许名单。前面几个测试要仔细读:这个模式默认是关的,而关掉时它失败即放行。这是一个需要运维显式打开的控制项,而不是系统天然具备的性质。一旦打开,仿冒域名会被拒,运行时的授权可以经 broker 放宽,而一次拒绝会让围栏保持关闭。
test_environment_readiness.py Stage 1 针对精确 Python/R 直接依赖清单的本地只读 standard 预检:完整缺口、无路径 DTO、零网络/零变更/不启动解释器、持久 UI 投影,以及两条显式托管修复命令。只走 control/finalize 的 turn 仍可在不启动内核时路由;Code Cell 会在 pending Cell 状态或执行之前失败即关闭,已批准/恢复的科学 plan 则在 CAS 状态迁移前检查。未知 inventory 失败即关闭,绝不伪装成 ready。
test_environments.py conda 环境发现,跑在假的 conda 目录上,所以结果永远不取决于开发者本机装了什么。仅有 R 的环境会被发现,但绝不会作为可运行的 Python 提供出去——而模型看到的 env_list 会在它的 ``r cell 真正使用的 R 通道上把它报为runnable,并在请求的 R 包它恰好有时推荐它,所以这个工具再也不会对模型说:env_use` 刚接受的那个环境里用不了 R。
test_env_setup_failure_projection.py 失败的 host.env.create 不得渲染成 "ready"。preinstall.install 用结构化的 ok: false 报告失败而不是单键软失败,而活动步骤投影只认后者——于是卡片在一次从未发生的安装上写着 "ready"。投影现在读取声明的标志,把真实原因(如 "No module named pip")带上卡片,并把步骤终态标为 error;模型看到的结构化结果保持不变。
test_preinstall_uv_fallback.py 在没有 pip 的 uv 虚拟环境里按需安装——包括 setup.sh 用 uv 构建的 daemon 自己的 .venv。_pip_install 先探测 pip 模块,缺失时回退 uv pip install --python <sys.executable>;两者都没有时报错并指出两种补救。只有工具选择会回退:pip 存在但安装失败时按原样报告,而不是换 uv 重试。
test_execution_coordinator.py 单独看 FIFO 协调器。同一时刻一个会话只有一个写入方,不同会话互不阻塞;取消或中断必须报出确切的 ticket 与持有者——来自另一个协调器的 ticket 什么也释放不了。
test_execution_principal.py 团队模式的执行身份必须明确且失败即拒绝:principal 缺失会被拒绝,成员不能浏览、搜索或打开其他成员的私有 Cell,owner/admin 保留应有可见性,执行结束后身份上下文会正确恢复。
test_execution_sources.py 用真实 Store 与真实网关路由验证已执行代码视图及其 sources.zip 导出:JSON 投影递归遍历根 frame 与嵌套的 delegate frame,带计数、源码哈希、generation/环境标识与 Artifact 版本关联,但从不内联代码;zip 里是真正执行过的源文件(失败 Cell 一并包含并标注)、每 frame 的 # %% session 文件、一份新 manifest 和中英双语"持久内核"README——重复导出与 Store 重开后字节一致,且不含提示词/stdout/凭据。另验证:无子 frame 的旧会话干净地导出仅根目录,根 Notebook 投影不受影响。
test_execution_view_service.py Execution 日志与 Notebook 所依赖的那些 DTO。麻烦的是重试投影:连续的失败会折叠成一行且一条不丢,而这次折叠不许跨越运行时边界或非 Agent 的边界。
test_frame_repository.py project、frame、message、step 与 cell log。执行日志是只追加的,时间戳相同的行按状态修订号排序;删除 project 在单次 commit 里级联完成。
test_auth_exit_matrix.py P0-1 的退出矩阵,跑在真实 socket 上。此前有三条腿被声称却无测试:未认证的 WebSocket 升级(所有 /api/v1/ws 测试都携带凭据,且都跑在合成 handler 上,分辨不出“被拒”与“对方已拿到一条能收 cancel_execution 的 socket”);未认证 REST “矩阵”其实只有一条路由(现从 contract.http_routes() 全量扫,新增路由会自己进来);以及把 cookie 重放给取代了签发者的那个 handler——旧证据断言的只是 token 文件稳定。它还会用已退役的 OPENAI4S_REQUIRE_TOKEN=0 在 loopback 与非 loopback 上各启动一个 daemon,并在线路上断言这道门:loopback 豁免只保留了恰好一个 minor release(D1),从 0.3.0 起被忽略。
test_gateway.py 这里最大的一个模块,波及面也最广。它从手写的 WebSocket 一路管上去——帧的编码与解掩码、续传缓冲及其字节预算——再到 keepalive 请求之间的 HTTP 请求体分帧、对跨源 API 写入与 WS 升级的双重拒绝、Artifact 与环境路由、通用 connector 编辑路由及其掩码 env 投影,以及必须扛过持久化的占位 key 过滤。
test_gateway_engine.py 基于 AgentEngine 的 Web runner,只测组合边界,内核保持离线。流式增量会藏住 fence,并且排在 Tool 事件与终止事件之前;对话式的 JSON fence 不许把它后面的公开散文截断掉。
test_gateway_host_allowlist.py DNS 重绑定的 Host 白名单(GHSA-fm3g-2c7x-8qj8),在真实连接上断言,而不是在人造 handler 上:真的 ThreadingHTTPServer、真的端口,直接对它讲裸 HTTP/1.1。它钉住了被打桩的 _json 表达不了的东西——拒绝是一行 403 状态行;Host 检查排在 token 门之前(伪造 Host 且不带凭证时按 Host 拒绝,而不是 401);覆盖面包含 SPA 外壳、/static/ 与免 token 的 /health,不只是 /api/ 写入;以及 WS 升级是被拒绝而非切换协议。正向对照占一半分量:浏览器真正会发的每一种回环 Host,加上不带 Host 的 CLI 客户端,都必须照常被服务。
test_gateway_kernel_lifecycle.py supervisor 之下的 Python 与 R slot,内容就是那些竞态。stop 的意图不许被一个新的 start 抢先,bootstrap 必须在 supervisor 锁之外跑,R 出问题也不许碰到 Python 的 worker。团队组合在首次使用前覆盖前台、后台、委派、R 与恢复 worker:整个 daemon 数据、data-root 个人命名空间、当前 Skill/Artifact 输入的精确例外,以及 symlink/重叠拒绝。
test_gateway_lazy_runtime.py 惰性在这里是承重性质,不是优化。plan 的一轮、只用原生 Tool 的一轮、只用 Tool 的结构化完成,全都能在内核进程压根不存在的情况下走完;真正拉起 worker 的是第一个 Cell 或第一次 REPL。
test_gateway_session_domain_routes.py 建立在同一份组合之上的 session-domain HTTP 路由。读 UI 代码之前值得先知道:fork_from_cell 是刻意失败即拒绝的,因为它还没被支持;变量检查的路由则从不启动 worker。
test_gateway_session_lifecycle.py 跨 daemon 自身生命周期的持久 generation 与 attempt 身份:TTL 清扫、启动时对上一个已死 daemon 留下的 generation 做对账,以及挡住新工作进入正在删除的 project 的准入检查。
test_fsprobe.py security/fsprobe.py 的契约,写成会在促成它的那个解释器上失败的形式:lstat_is_symlink / lstat_kind 对缺失与链接给出明确答案,而对 mode-000 目录之下的路径抛 PermissionError——CPython 3.14 的 Path.is_symlink() 在那里会回答 False,把所有 except OSError: 拒绝 的守卫变成死代码。
test_gateway_static_cache.py /static/ 与 SPA 外壳的弱 ETag、304、gzip 协商与 immutable Cache-Control。在真实连接上断言:命中 If-None-Match 是无体 304 且仍带安全头;gzip 只给 >1KB 的文本类并带 Vary、否则 identity 回退;immutable 仅限指纹名;>8MB 走流式发送;出树的 symlink 在 realpath 之后 403。
test_gateway_webui_next.py F-23 翻转后的 SPA 外壳切换。未设置时 /、/index.html 与 /projects/{pid}/frames/{fid} 发 dist/index.html;OPENAI4S_WEBUI=legacy 是改发 webui/index.html 的逃生舱。/static/ 解析不变。同时钉死 package-data 的 dist glob、_WHEEL_REQUIRED 哨兵,以及 favicon 的 10 fps 下限。
test_global_research_views.py 两个跨会话的读模型。project Timeline 把它们合并起来,且不携带任何原始 payload;血缘视图把 Artifact 版本连回产出它的那些 cell。
test_governance.py 用测试写出来的仓库治理。每个 workflow action 都固定到具体 commit,版本注释由 PR CI 校验;源码 secret 扫描覆盖工作树;Dependabot 盯着全部五个生态,条目只用 schema 允许的键,且每个生态每个目录只出现一次。
test_harness_characterization.py 一份特征化 golden,因此它刻意记录的是当前行为,已知 bug 也照记不误,并且标注出来。重新生成 golden 必须是一个显式动作——正是这一点拦得住无声的漂移。
test_harness_contract.py harness 自身:场景 schema、脚本化 provider、故障时刻表,以及一个保留事件顺序、而不是排序的规范化器。声明了却从未触发的故障,会让这个场景判失败。
test_auto_budget.py 对着真实 SQLite repository 的 Auto Mode 原子预算准入:最后名额竞态、相同 admission_id 合并、不乐观返还、重启后 remaining 不增加、same-action/no-progress 熔断、不可验证 token fail closed,以及每个公开字段恰好一个权威计量器。
test_auto_mode_faults.py Stage 2 的崩溃、回滚、过期、多连接与副作用 ledger 恢复契约。它证明已提交事实能幂等重放、部分提交的 phase 不会逸出、repair action group 在使用前已绑定,且丢失 WebSocket 永远不会变成事实源。
test_auto_mode_portability_regressions.py 对抗式 package/share 可移植性覆盖:按 run 隔离的身份重映射、按 start cursor 稳定排序、direct/shared 图验证一致性、常数事件查询次数,以及始终惰性的多跳来源声明。
test_auto_mode_recovery_regressions.py 提交后证明篡改、重放、finding owner、事件顺序、终态完整性、历史前缀、fork 与 revert 的恢复回归。
test_auto_mode_routes.py 精确 frame 级 Auto Mode GET/PATCH/audit 路由的聚焦 adapter 契约:method/path 归属、查询边界、错误映射、规范 live event 名,以及刻意不存在的 HTTP 状态变更路由。伪造 service 已标记,合成 shape 不会进入 response-schema 捕获。
test_auto_mode_service.py quarantine、frame、project、deployment、旧布尔值与内置默认值之间的选择优先级和兼容映射。deployment 的显式未设置与 off 保持不同,且 Stage 2 的运行时仍惰性。
test_auto_mode_storage.py 持久 Auto Mode 状态机、事件次序、幂等、Verified 证明完整性、finding 生命周期、repair 所有权、权限作用域、分支投影、迁移、quarantine 与导入身份重映射。损坏的 hash 或 owner/event 不一致都会失败即拒绝。
test_auto_mode_surface_regressions.py 通过真实 Gateway、团队作用域 REST、公开字段脱敏、默认关闭行为、WebSocket 提示丢失、daemon 重开、package、share 与 quarantine,证明 SQLite 始终是事实源,损坏的 Verified 证明绝不会发布。
test_auto_mode_terminal_contract.py 五类 Stage 0 非 Guardian 终态契约:精确的独立 golden payload 与规范 digest、封闭的原因专属条件、失败即关闭的交叉路由、不冒充 Reviewer/Guardian 审计,以及有界恢复真值。
test_scientific_reviewer.py Stage 3 V2 schema:证据不完整不能 pass,实质性 finding 强制 issues,Reviewer 只看到注入的 snapshot。
test_evidence_adapters.py PDF/图像/结构/表格适配器要么给出完整覆盖,要么诚实声明省略;仅有文件名不够。
test_evidence_snapshot.py 不可变 snapshot 的完整性、plan/cell/adapter 引用,以及 digest 稳定性。
test_review_scratch.py 隔离 scratch 拒绝写正式工作区、联网、submit_output 以及继承来的秘密。
test_scientific_review_service.py Shadow 编排:独立性失败即关闭、同模型 review_only、确定性数值核对、伪造引用、包含 Plan 的 shadow step,以及 flag 关闭时惰性。
test_scientific_review_golden.py Stage 3 Go/No-Go:≥100 个 golden/注入案例走真实 evaluator,高/中召回、干净任务误报,以及伪造 evidence ref 为零。
test_completion_gate.py Stage 4 晋升顺序:candidate 早于 terminal,issues 保持未验证,flag 关闭时惰性,reopen 读持久的 message/setting 戳记。
test_review_finding_identity.py finding 的身份是「单次 review 内的内容」而不是内容本身:两个会话得出相同结论时都能落库并各自到达真实终态,调用方引用的 id 就是入库的 id,存储失败不会以裸异常逃逸,冲突也不再把分支卡在 reviewing。
test_stage4_atomic_promotion.py Stage 4 的最终事务:精确 Candidate 消息、可选的 committed Stage 1 delivery 与 Auto Run terminal/event 要么一起晋升,要么全部回滚。覆盖作用域/内容 CAS 故障、更新后的 event 故障、精确重放,以及遗漏或改变 promotion 身份时的拒绝。
test_stage4_candidate_promotion.py Stage 4 candidate → review → promotion:有裁决前不投递答案,candidate 在调用 Reviewer 之前已持久化,修复后的候选可被真正交付,Verified 只能盖在被审阅的同一份字节上,审核之后交付失败会撤回晋升。
test_auto_repair.py Stage 5 的残差行数与缺失值误述种植案例、相同字节复用版本、禁止自我认证,以及 review_only 不修复。
test_guardian_shadow.py Stage 6 精确动作 hash 失败即关闭、不能 standing allow、shadow 不执行,以及 flag 关闭时惰性。
test_guardian_enforce.py Stage 7 无人值守 allow_once 与危险拒绝,以及 flag 关闭时走旧路径。
test_host_completion_service.py host.submit_output,Python Cell 唯一拥有的完成信号。schema 失败是软失败,且不得覆盖掉此前已有的完成;完成要点的过去式检查,除英文外也接受中日韩的表达。
test_host_contract.py worker 到 Host 的 wire:注入的门面、单键形式的软错误、camelCase 编解码。最后那个测试最有用——SDK 能调的每一个 host.* 方法都必须有对应的分发路由,这样新能力就不会接了一半就发出去。
test_host_accelerators.py 本地 GPU 探测与 SSH 注册、容器运行时及模型后端就绪状态彼此独立。
test_model_assets.py 用户提供的本地 checkpoint 经精确路径审批导入,限制在会话工作区内并流式校验 SHA-256;导入后仍是 staged,不能自行宣称 admitted。
test_model_admission.py connector 无关的 checkpoint 准入把已解析 canary 绑定到精确模型字节、backend revision 和执行路线,拒绝 digest 漂移,并在进程重启时重置。
test_host_credentials_service.py 会话本地的 credential 引用。秘密本身从不返回;lease 绑定到单个动作并会过期;轮换一个 credential 会吊销挂在它上面的所有 lease;replay 排除了全部 credential 方法与取值。
test_host_data_service.py host.query 以及它周边的数据查询。只读 SQL 在碰到 Store 之前就被强制住,血缘图有界,携带不可信 ID 的 Artifact 标记会被拒绝。
test_host_delegation_service.py host.delegate 的 Host 这一侧。注入 profile 时不许改动调用方自己传进来的参数;delegate 与 steering 的来源是调用时解析的,而不是构造时就捕获死的。
test_host_endpoint_service.py 托管 endpoint 的 create、status、request 与 close。把一个已有的本地注册重新指到新端口需要审批;空闲端口扫描会关掉它开的每一个 socket;投影里不带秘密。
test_host_llm_service.py 内核里的 host.llm。批量调用保序,并把并发压在请求的上限内;其中一项失败仍然是硬失败,不会被软化成一个空回复。
test_host_mcp_service.py Host 上的 MCP:先按 ID 再按精确名字查 connector、Tool 发现与调用路由、资源与 prompt 读取,以及它们各自使用的软错误契约。被停用的 connector 在每一个入口都会被拒,而不只是在列表里不出现。
test_host_progress_service.py 会话 todo,以及针对已批准 plan 的进度推进。plan 的改动先提交,事件 sink 才跑;sink 失败是尽力而为,它撤不回一个已经推进过的步骤。
test_host_remote_capability_service.py 远程 capability 探针。校验在 SSH 启动之前就软失败;传输失败绝不写注册表;只有探测真的成功了,注册表才会更新。
test_host_remote_science_service.py 远程折叠与突变打分,禁止编造结果的策略就是这里的全部要点。远端结果不完整或解析不了时,给出的是精确的诊断信息,绝不是一个看起来像模像样的数字。溯源信息按尽力而为解析,并按身份逐条排空。
test_host_skill_service.py Host 的 Skill 服务:路径约束、只读的内置根目录、sidecar 闸门,以及 publish 或 delete 之后会刷新的目录。用户 Skill 抢不走内置 Skill 声明的名字。
test_host_workspace_service.py 限定在工作区内的 Host 文件访问。父目录、绝对路径、密钥目录和符号链接逃逸都会被拒绝;外部硬链接和最终分量替换不能穿过边界;read、glob、grep、list、write、edit 都使用固定描述符,父目录并发替换不能重定向后续 I/O。
test_jupyter_adapter.py 可选的 Jupyter 路径——正因为它是可选的,这个模块有一半在讲它不存在时会怎样。没装 ipykernel 也要能描述并导出 KernelSpec;依赖缺失或装坏了,bridge 要报出来而不是崩掉。bridge 本身是拿真实的加固 Python worker 跑的。
test_kernel.py 真实的 Python worker,按它实际的协议驱动。命名空间跨 Cell 存活、stdout 与 stderr 的归属、error_lineno、用量记账、必须能返回的 mid-cell Host RPC、wire 上限与有界的失步恢复、SIGINT 与用户自己抛的 KeyboardInterrupt 之别,还有那几把可能死锁的锁。中断这一半现在按窗口逐个钉死了,因为触发它的那次 CI 失败,问题一半在 worker、一半在测试自己的前提:早于用户代码到达的信号是被欠着而不是被丢掉、空闲 worker 扛得住一次中断、协议帧先写完再抛中断、被放弃的 host RPC 不会毒到下一次,以及带着别的 cell id 的 chunk 不算这个 cell 的输出。后来又钉上了三道缝:中断经由 tgkill 辅助程序直指 worker 的主线程,因为辅助线程池(OpenBLAS 的也在内)可能把发给进程的 SIGINT 吃掉、主线程却还在睡;即使父进程忽略 SIGINT/SIGQUIT,子进程也以默认处置出生——被 & 放到后台的 daemon 会把 SIG_IGN 沿着每一次 exec 传下去;worker 跑在自己的会话里,所以杀掉它也会终结 cell 启动的东西——而 arming 失败会被明说,而不是化作沉默返回。变量检查器只列出用户自己的绑定:Web 会话的 skill 导入闸门会往 Cell 命名空间里绑定 32 个 _o4s_*/_OpenAI4S* 辅助名,这里走的是 gateway 自己的 bootstrap 调用。改动内核协议之后请重跑这一个。
test_kernel_font_cache.py 沙箱内核启动时拿到的 matplotlib 字体列表,以及它是谁构建的。强制沙箱给每个内核一个空的私有 MPLCONFIGDIR,于是每个新内核第一次画图都是一次完整的字体扫描;而修复本身不能变成内核之间的通道。这里钉住:新的强制沙箱内核会拿到 host 构建的列表,而某个内核在自己临时目录里改写过的列表,既到不了下一个内核,也到不了 host 缓存;构建程序输出的若不是字体列表(名字里带路径、版本与名字对不上或者既不是 matplotlib 的字符串版本也不是它 3.11 之前的整数版本、类不对、不是 JSON、超大、报错),一律不存;而 matplotlib 3.10 的列表(fontlist-v390.json,"_version": 390)会逐字节原样存下并预置;构建程序的报告若无法钉住它来自的 matplotlib 安装(没有来源、路径是相对的或已经不存在、文件在构建期间变了),一律不存,而升级那份安装会重建列表,而不是继续预置旧的;新装了字体、缓存位于内核自己的工作区里、缓存文件是 symlink、内核没有被限制——这几种情况都不做预置;只有启用了的进程才会构建,同一时间只跑一个,失败过的不会在每次拉起内核时都重试;那段固定的构建程序返回的是字体管理器刚写出来的内容,而不是某个已有的共享缓存,而且绝不会从它被启动时所在的目录导入 json.py 或 matplotlib/;从这样的目录经真实的受限探针发起构建,什么也不会存下。经 run_server 真实的关停流程停掉 daemon,会停掉正在跑的构建——run_server 返回时,构建程序、它在自己单独的进程组里拉起的扫描子进程(system_profiler 就是这样)、它的临时目录和探针工作区都已经没了,而且没有等扫描跑完;关停开始时还没拉起构建程序的构建,之后也不会再拉起。在真正启用了强制沙箱的主机上端到端地验证:内核报告的是预置的(刻意为空的)列表,而没有自己去扫描;它要预置的版本号两种写法(__version__ = 390 和 '3.11.0')都能读出,只有 matplotlib 真的没装时才以“matplotlib is not installed”跳过。
test_kernel_generation_storage.py 内核 generation 与 attempt 落在哪里。启动时的对账只能放弃上一个更老的 daemon 留下的 generation,绝不能碰活着的那个;generation 的审计记录也不能从 host.query 里读到。
test_kernel_generation_supervisor.py 在 supervisor 的整数计数之上再叠一层持久 UUID 身份。整数继续充当 ABA 防护,UUID 才是 lease 与状态投影绑定的对象,好让被替换掉的 worker 能被 fencing 挡住。
test_kernel_oversized_frame.py 一个 cell 的响应大到发不出去时会怎样。_write_frame 拒绝超过 _MAX_FRAME_BYTES 的帧是对的——宿主得把它整个读进内存,而被截断的 JSON 行根本不是一个帧、会让读取端失步——但它把整帧替换成了一条 log,于是被丢掉的是 response 时,宿主就在等一个永远不会到达的 cell id。修复前实测:raise ValueError('x' * 12_000_000) 过了 90 秒仍未返回。对用户来说这是卡死,不是拒绝。修复有两个互相独立的部分:error 现在和它旁边的 stdout、stderr 一样有上限;被丢弃的 response 也仍然会回答它的 id。两者各自都足以避免卡死,也各自被单独证伪过。
test_kernel_recovery.py 重建一个已经死掉的内核。恢复在隔离的候选内核里进行,只有重建、replay 与校验全部通过才发布。带外部副作用的步骤根本不 replay;部分恢复会保留旧的 generation,而不是把新的据为己有。
test_kernel_sandbox.py Seatbelt 与 bubblewrap 的命令是怎么拼出来的,以及各个模式的行为。单用户 auto 会明确告警后降级,团队读取策略则绝不降级。覆盖整数据目录与多根遮蔽、runtime/Skill/个人区精确例外、系统临时目录遗留、有界流式清单、既存硬链接与 symlink 别名、Linux 私有 PID/挂载顺序、从 namespace init 到命令进程的 pidfd 采纳(歧义进程树一律拒绝),以及必须完整通过的自测。
test_user_llm_keys.py 用户自己的 LLM 凭据(M4-1)。最要紧的那条主张是否定式的:Alice 的密钥用于 Alice 的会话,而绝不用于 Bob 的——跨会话泄漏的按人凭据比没有这个功能更糟,因为账单看着没错,信任边界却已经没了。还有:没有配置就原样回落到组 key(INV-1);覆盖按 provider 生效;没有任何路由会把值或引用读回来;禁用账号会连带带走它的密钥;配置了却读不出来的密钥会拒绝该轮,而不是悄悄记到组里。
test_compute_session_routes.py 运行位置那三条路由,走真 HTTP 打真 daemon——因为状态码占了它们承诺的一半,而直接调方法看不见它。断言的都是听起来乏味的那些:没有 worker 监听的 daemon 应当回答"这个会话在本机跑"而不是报错,因为那就是每个安装的常态;未配置的 profile 应当被拒绝而不是猜;别人的会话回 404 而不是 403(INV-13)。
test_cluster_session_e2e.py 离线跑通整条链:一个真的会把交给它的作业跑起来的假 sbatch,其上全是生产路径——真 broker 真去 shell、真 backend、真 reconciler、真 Store、真 gateway、真凭据、真 worker.py 自己一个进程、真帧协议走真 socket。打桩的启动只能断言"代码做了它被写来做的事";这里问的是只有子进程答得了的问题——daemon 写下的凭据是否真的放行了它为之而写的那个 worker、变量是否活到了下一轮、中断能否够到一个没有本地 pid 的进程、以及在内核明明活着的时候,失效的租约是否真的把资源收了回去。
test_query_scoping_team_mode.py host.query 不得读到同事的 prompt。denylist 盖住了身份与治理表、产物一族也藏在受限视图后面,但 messages、execution_log、frames 是可读的——在单用户安装里那是用户自己的工作且被明确记为允许,在团队模式下那是每位同事的 prompt、模型的回复、以及他们跑过的代码。两半都被断言,因为这道关是有条件的:团队模式拒绝直读并经受限视图作答,团队模式关闭时读到的与从前一模一样(INV-1)。
test_execution_principal.py host.frames 不得读到同事的 cell。团队模式的作用域限制只活在 SQLite authorizer 里,而只有 host.query 会经过它;host.frames 通过普通 Store 方法读同一批行——frame 名、cell 代码、stdout——所以成员的 agent 可以浏览任意会话、对每一条 cell 做正则搜索、按 id 打开任何同事的 frame。这里断言的是 principal 而不是某个参数:缺失即拒绝(团队模式下没有 principal 就抛错而不是放宽)、None 永远不是管理员(单用户 daemon 与 loopback CLI 各自带显式 principal)、过滤发生在 SQL 里、在代码与 stdout 被读出来之前。同时断言持有者仍看得见自己的东西,因为一个把所有人都拒掉的判据同样能通过每一条「陌生人看不到」的断言。
test_cluster_session_production_wiring.py daemon 自己的集群会话接线,而不是它的排练。此前每一个集群测试都自己 new Kernel 或自己造 manager——正因如此,attach_worker 没有任何生产调用者这件事,在一路全绿的 CI 下始终隐形。这些用例只走 SessionRunner,不自建任何 daemon 本该自建的东西;每根接线拆掉后,恰好对应的那条会红。
test_orchestration_distributed.py 分布式 task 跑在 workload 已经持有的资源内部(INV-4),而多节点会话只有在每个 rank 都注册之后才算就绪(M4-3)。这两件事错了都不像坏了、只像没错:不带 --jobid 的 srun 会去申请资源,于是一个交互会话变成两个都在计费、其中一个没人看着的作业;而在别的节点还没就位时就开跑,故障会出现在用户的计算内部,读起来像是他自己的 bug。gang 那几条用真 socket,因为它们要抓的那个缺陷——第一个之后的每个 rank 都悄悄顶掉上一个——对只存一份注册的替身是隐形的。
test_orchestration_session.py 资源平面上的持久会话,跑在真 Store 与真 Reconciler 上——这些主张说的是"一步之后什么是持久的",而这正是内存替身答不了的问题。真正有分量的是那些否定式用例:INV-5 的四个条件成立三个不算就绪;一个内核活得好好的、心跳按时的会话照样过期,因为 worker 活着不等于用户在场;节点丢失产生的是新 epoch 加一次明示,而不是悄悄重连(INV-6/11);正在被取消、同时又丢了节点的会话不会被"恢复"成重新提交用户刚要求停掉的工作。
test_worker_tcp_transport.py 真的 worker 子进程、真的 socket、真的 Kernel 驱动——只有这个组合撑得起那个主张,因为假 socket 测的都是本来就没人怀疑的部分。它断言的是计划钉死的东西而不是顺手的东西:凭据只能用一次、旧 epoch 被拒(INV-7)、伪造与过期与重放回来的是同一个词、密钥走 0600 文件而绝不走环境(INV-9),以及 cell 执行中途的 host_call 能往返——因为 host-call 事务纪律,正是换传输层时最容易被悄悄弄坏的那一处。
test_kernel_supervisor.py 不对底下协议作任何假设的 worker 生命周期。反复出现的主题是“精确”:过期的 lease 中断不了、杀不掉、重启不了、也放弃不了一个新的 worker;一个已死的替身会被拒绝,而不会连累健康的当前 worker。
test_lazy_kernel.py 关于 CLI 一次性内核所有权的四个测试。从不跑代码的上下文就从不创建 worker;bootstrap 失败也不会把一个坏掉的 worker 发布出去。
test_llm_anthropic_streaming.py Anthropic 的 SSE 路径,以及让"加这条路径"这件事本身安全的那条性质:流式与阻塞必须规范化出同一个 reply。wire_state 会被原样当作下一轮的 assistant 内容回放,所以重建逻辑不认识的 block——redacted_thinking、server-tool block——必须完整存活,而不是塌缩成一个空 text 块:那会让下一次请求失败,而不是产生它的这一次。回退边界也在两个方向上被钉住:流在第一个事件之前就死掉,会以不带 stream 的请求体退回阻塞式;已经吐过增量之后再死,则直接抛出而不重放。
test_llm_anthropic_tool_calls.py Anthropic Messages 的 Tool 调用走一轮编解码往返。并行的结果必须回到同一条相邻的 user 消息里——朴素地重建历史,恰恰就错在这一点上。
test_llm_capabilities.py Provider 的 capability 目录与 token 记账。用量规范化能容忍缺失或离谱的计数器;成本只由显式配置的价格算出,绝不靠猜。
test_llm_gemini_tool_calls.py Gemini generateContent,以及它别扭的那个角落。wire 没给调用 ID 时会生成一个稳定的本地 ID,但这个 ID 绝不能回放给 Gemini;不透明的 part metadata(包括签名)必须原样回放在原来的 part 上。
test_llm_openai_tool_calls.py OpenAI Chat,包括流式那条路。交错的 Tool 调用能跨 SSE 增量无损聚合;缺终止事件的半截调用会被拒绝,而不是执行一半;错误事件也不会被误当成一次空的成功。
test_llm_providers.py 把网络整个换掉之后的标准库传输层,于是 wire 选择、配置解析、URL、鉴权头与图像转换都能被精确断言。loopback 端点可以不带 API key 就跑,但它不会仅仅因为说同一种 wire,就继承厂商的 Tool 支持。
test_llm_responses_tool_calls.py OpenAI Responses 这条 wire:output item 被保留、并在 function 结果之前回放;不完整或没有终止的 Tool 流会被拒绝;规范的调用历史能在不残留任何 wire 状态的情况下重建出来。
test_local_model_discovery.py 发现本地模型端点,这是一个 SSRF 面。候选 URL 必须是字面上的 loopback,opener 拒绝重定向;不可达、非法或超大的探测结果一律不做任何事。
test_marker_policy.py 两个测试守着离线契约。external、network、live-LLM、GPU、SSH、Docker、browser、lab 这些需要显式开启的标记,默认全部排除在外;改动默认的排除表达式,也没法悄悄把真实测试放回来。
test_mcp_client.py 离线的 MCP:JSON-RPC 分帧、stdio 生命周期、请求配对、超时。真正要紧的边界是子进程环境——它按严格的允许名单重建,所以连一个 connector 也没法把 daemon 环境里的秘密顺手交给子进程。
test_mcp_control_tools.py MCP 的原生 Tool。列目录和读内容是两套策略;prompt 参数会被重新校验成字符串;从 connector 回来的内容在给 Agent 看之前先过注入筛查。
test_mcp_lifecycle.py MCP 的生命周期与各种上限,全部用真实子进程 connector 来驱动,所以断言的是 pid 和进程本身,而不是「某个函数被调用了」。握手失败之后不留进程也不留读取线程;每一类故障只淘汰缓存里的那一个实例,下一次调用会以新的 pid 重连,而 JSON-RPC 错误不会;在途请求和已放弃 id 两个队列都有上限;8 MB 的 stderr 单行在读的过程中就被截断;终止能打到被包装的真实 server,而且不会把调用方挂死。 另外覆盖连接路径的加锁:_connect 会 spawn 子进程并跑 initialize 握手,而它此前是在管理器的全局锁内做这件事——那把锁是每个连接器的 get、_evict、disconnect、shutdown 都要的,于是一个挂到超时的服务器会拖住进程内所有其他连接器,包括那些已连上、只是被查一下的。断言落在墙钟时序而不是锁对象上,因为调用方感受到的是等待;另一例钉住同一 id 的两个调用方仍然只产生一个子进程。
test_mcp_tools_positional_server.py 让 mcp_tools 走 dispatcher.__call__,用 kernel SDK 的位置字符串 server——正是该方法长出 control tool 之后以 'str' object has no attribute 'get' 崩掉的那种形态,而 host.mcp.list() 和 host.mcp.call() 一直正常。钉住 execute/resource_keys 的双形态契约、dict spec、本地应答的 volcengine-datapro 描述符,以及未知 server 的软错误。
test_memory_repository.py 长期记忆:过滤条件跨 Store 边界保持不变、遗留的默认分类,以及删除 project 时级联删掉它的记忆。
test_metadata_repositories.py 那几个小仓储——笔记、文件夹、动态 endpoint、compaction 归档。真正有牙的是 host call 日志:它在提交之前会做清洗、跳过和截断。
test_methodology_skills.py 关于纯方法学内置 Skill 的三个测试:以只读方式被发现、能被取回,其中一个还在 Agent 循环里被真正用了一次。
test_mineral_spectra_analysis.py 矿物谱图 Skill,以及它守着的那个设计。流水线是盲的:报告是在不知道真值的情况下产出的,对真值的评估是循环之后一个显式的步骤,绝不掺进循环里。那些纯 helper 在没装科学栈时也能 import。
test_model_profile_probe_reachable.py 用户怎么才能发现自己的模型配置有问题。readiness(纯本地推导,随每个 profile 一起下发)与 POST /model-profiles/{id}/probe 都已实现、已测试、已提供服务——但没有任何调用点。Models 标签页自己用 has_api_key 推了一个更弱的状态:那是个不带原因的布尔值,也表达不了 unsupported——一个 provider 协议本构建根本无法分发的 profile 是有 key 的,于是它显示为「已配置」,直到某一轮真正用到它才失败。而 probe 完全没人能碰到,所以「我的端点到底通不通」只能靠发一条消息去试。probe 保持在点击之后、保持 POST:渲染期调用或改成 GET 都会花掉用户自己的额度,而这正是本地/远程分离要防的事——把它挪到渲染期的变异会在这里变红。同时如实记录:对当前提供的五种协议,needs_model 是走不到的,因为它们都有默认模型。
test_model_profile_readiness.py 一个模型 Profile 是否可用,以及由谁来决定去查。就绪状态完全由本地状态推导,所以列出 Profile 不产生任何网络请求;可达性必须发请求,而发请求这件事要由用户来点——一张在渲染时就偷偷探测的卡片,就是 P0-1 清掉的那种隐式外连,只不过这次花的是用户自己的付费额度。同时钉住一条:每一个 LLM 层能调度的 provider,要么可被选择,要么被显式声明为「有意不提供」——gemini 和 openai_responses 两个都不属于其中任何一种。
test_model_revision_binding.py D2:一个会话要能说出自己当初跑在哪一份模型配置上,而不是它所属 Profile 今天碰巧写着什么。覆盖 revision 到底以什么为准——(provider, base_url, model),故意不含名字,而且不可能含 key,因为凭据引用是由 profile id 推导出来的——以及只在发送时绑定、两条 409 重绑路径,还有把一个已有数据的 v9 库升到 v10:历史行必须是「未绑定」,而不是被当成「用了默认值」。
test_memory_budget.py 进入系统提示的「记住的上下文」到底有多少。原先只限制条数、别的都不管,于是 50 条粘贴进来的实验方案会给每一轮都加上约 60 万字符(在 262k 的窗口里约合 15 万 token)——光靠数条数是兜不住的,因为真正会变的是长度。每条预算的测试都会断言另外两条不会先触发:总长度那条的早期版本给每一项加了序号后缀,把每一项都顶过了单条上限,于是它其实一直在重复测另一条限制。此外还覆盖了超长记忆是整条跳过而不是截断、顺序保持不变(所以被丢掉的是最旧的),以及有内容被略去时会明确告诉模型。同一个缺口的另一半在 Context 面板上:它把系统提示和对话合在一起报成 Text: N tokens,于是 15 万 token 的常驻上下文看起来就像「你的对话太长了」,把用户引向 compaction——而 compaction 根本不会动系统提示。现在投影把 system_prompt 单列出来、total 保持不变,并且以聚合计数的形式报告被预算略去的内容,而不是把那些刻意没有发给模型的记忆原文又渲染回屏幕上。
test_memory_edit_and_expiry_quota.py 保留期在读与写两侧含义不一致:过期只是不再注入且刻意不删除,但配额统计的是全部行,于是一个有两百条过期记忆的 scope 会拒绝每一次新写入,而被点名的正是面板已标为省略的那些条目。现在配额只数存活行,并另设一个存储上限与独立错误码,因为两者的补救方式不同。另一半是从来不存在的操作——记忆能写能删,却不能改——以及它的 updated_at;没有它,修正会按被它取代的那条指令的时钟过期。
test_message_pagination.py 打开一个长会话时看到的是哪一头。640 条消息的会话返回的是第 0–299 条——最旧的一页,最新的 340 条根本不在里面——因为排序只有 seq ASC 加一个 limit,没有方向。覆盖最新在前的翻页、before_seq 键集游标(用 offset 的话每来一条新消息都会错位)、翻页过程中来了新消息该页仍然稳定,以及不带这个参数时旧的「最旧在前」行为完全不变。
test_model_catalog.py 可以扩展的 provider 与模型目录。自定义 provider 要先通过校验才能路由;带连字符的 provider 名字仍然能得到一个对 shell 安全的环境变量前缀;内置预设保持不可变,用户预设围着它们加。
test_native_tools.py 关于原生 Tool 声明的四个测试。名字必须落在四家 provider 限制的交集里;每次调用拿到的都是一份独立的 schema 拷贝;shell 与完成信号从不作为原生 Tool 声明出去。
test_notebook_export.py 关于导出的三个测试。Python 与 R 各自成为一份独立的只读 Notebook;导出包是确定性的,manifest 校验和对得上;未知的 Notebook 语言会被拒绝。
test_notebook_lineage.py Stage 8 正式 live Notebook 与 host 侧跨语言 lineage。该开关不依赖旧的开发者 REPL 开关即可打开 REPL;R CSV → Python JSON 会写出 version 边和两份 env snapshot;Agent 与用户 REPL 共享同一个 kernel generation。
test_model_capability_receipts.py 显式 probe 留下的 exact 模型能力 receipt。true 只来自 schema-valid 的 native tool call 或完整终止的 streaming;timeout/认证失败/5xx 保持 unknown;profile 新 revision 之后旧 receipt 采用数为 0;重启后 exact 行仍可读;key 从不进入 receipt。
test_onboarding.py 首次运行的 provider 配置,这里的写入必须要么全成、要么全不成。无效的 API key 不能让模型设置只写了一半;切换 provider 会丢掉上一个 provider 的 key,而不是沿用它的默认值;任何响应都不会把秘密带回来。
test_web_onboarding.py Web 首次运行路由。GET /onboarding 脱敏且零出站(Test 前 outbound=0);POST /onboarding/complete 是实例级变更、团队模式下仅 admin;key 在 GET/diagnostics 命中数为 0。
test_orchestration_backend_opacity.py INV-2,写在第一个 backend 之前——事后补的泄漏守卫只会把已经漏出来的东西编纂成规则。它主张:编排核心的源码与 import 图都不出现调度器名字,且 import 契约不会连带加载任何实现。写它这件事在任何 backend 代码落地之前就回本了两次:源码扫描抓到核心自己 docstring 里的调度器名字(这条检查刻意是字面的——一旦允许"解释性提及",每个泄漏都会以解释性提及的形式到来),而证伪用例抓到了守卫自身的缺口——\bslurm\b 匹配不到 slurm_backend(_ 是词字符),所以 import 路径改按子串匹配而非按词匹配。
test_orchestration_routes.py BatchJob 端到端,走真实 HTTP 且 reconciler 真的在跑——因为 DoD 那条链(提交 → PENDING → RUNNING → 终态 → 日志)横跨四个组件,分开驱动会把接缝留在测试之外。本地作业跑真进程;集群那条走同样的路由打假调度器,这正是抽象的意义所在。同时钉住哪些东西不许出现:响应里带 allocation_id,绝不带后端作业 id、队列名或 pid(INV-2);command 给成字符串会被拒绝而不是被切分;别人的作业处处 404;admin 取消他人作业记为 ADMIN_CANCELLED。OPENAI4S_RECONCILE_INTERVAL 在这里把 daemon 的 5 秒周期调短——在此之前这个文件有 75 秒都花在等 tick 上,而慢到会被跳过的套件是最贵的那种慢。
test_orchestration_reconciler.py 状态机,不带数据库也不带 daemon——一个内存 store,用真实部分索引的同样方式断言 INV-3,所以测试不可能在有两个活动 allocation 的情况下通过。钉住那些不变量(Unknown 的提交永不盲目重试;连续的 unknown 不会累积出多次提交;恢复是新 epoch 而非改写历史),以及 reconciler 在实践中会做错的两件事:观察到 BACKEND_UNAVAILABLE 必须什么都不动;取消屏障必须能走第二遍。后者抓到一个真缺陷——RELEASING 没被算作活动 allocation,于是屏障在下一遍里找不到自己的 allocation,把 workload 标成已取消,而它的作业还在跑。本地 backend 那一半跑的是真进程:完成、非零退出、取消杀整棵树、并发上限拒绝、token 对账,以及一项检查——daemon 的环境(里面有 API key)不会被继承。
test_orchestration_slurm.py Slurm backend 打假集群:把真的 sbatch/squeue/sacct/scancel 程序生成到 tmp_path 并注入 PATH,状态序列可编程(刻意不放 fixtures/——那里是字节精确的捕获数据,而这些是程序)。覆盖的都是"错了很贵"的情形:丢失的提交变成 Unknown,其后的重试按 token 对账成 Existing 而不是往集群上再放一个作业(INV-8);队列与账务里都没有的作业是 LOST 而非 COMPLETED;联系不上的调度器不动 phase;argv 是构造出来的,所以带敌意的 profile 名是参数而不是命令,带凭据形状的环境变量被拒绝(INV-9)。写它的过程带出两个发现:把"PATH 上没有调度器"吞成"没有这个作业",会把所有在跑的作业判成丢失;而忽略 --format 的假程序会让解析器读错列却照样通过。最后一个测试断言假程序确实在 PATH 上——否则整份文件能在一台没有调度器的机器上全绿,而什么也没证明。
test_orchestration_skills.py 运行时编排类 Skill,跑在真实 worker 与真实 dispatcher 上而不是 fake 上:内核里的 host 门面、Skill 自定义、自省查询、托管 endpoint、算力与环境搭建,以及它们留下的审计痕迹。
test_permission_repository.py 落库的权限规则与权限请求。有两点要知道:一个请求会原子地绑到它的 Action Ledger group 上,group 不存在时整笔回滚;重启作用域的一次性授权是原子消费的,因此没法被重放。
test_permissions.py 权限闸门本身。scope 优先级和模式具体度都在这儿,但同样在这儿的还有那块没有例外的:读 secret 文件或 secret 环境变量会被拒绝,哪怕会话级规则写着允许;无人值守的 broker 在运维没有显式放行时失败即拒绝。
test_plan.py plan 的提取与生命周期。模型回了散文而不是 JSON 时,仍然能靠散文回退路径得到一个 plan;批准一个 plan 会把它当成普通的一轮跑起来。
test_plan_repository.py 三个测试,证明 PlanRepository 透过 Store 门面的表现完全一致,畸形 JSON 也一样:它会回退,而不是抛出来。
test_plan_resume_claim.py 恢复一个暂停的 plan:两个真实并发 POST 打向真跑起来的 ThreadingHTTPServer 抢同一次状态迁移。原来路由里只是读一下状态,真正的写在它派生的后台任务里且无条件覆盖,于是两个请求都被接受、同一批步骤跑了两遍——这里数的是真正跑了几次,而不是从状态码倒推。
test_plan_service.py plan 服务这一层边界。定稿会复用草稿那一行和它的 Artifact,而不是再造一个;Artifact 写失败时它也扛得住,不会把 plan 丢掉。
test_ports_helper.py _ports.py 的契约,写成能失败的形式:分配必须是对端口 0 的单次 bind——用记录 bind 序列的方式断言,因为「调用返回后端口被持有」区分不了干净的 bind-0 和先探测、close 后重绑的实现(后者到那时同样持有端口),变异检验恰好证明了这一点。另一半契约:在端口已知之后挂上的 handler 才是真正应答请求的那一个。
test_protein_mutation_enhancement_skill.py 蛋白突变 Skill 的纯 helper。枚举、排序与选择轮次都是确定性的;错误路径被明确检查:野生型残基对不上的突变、越界的位点、没有位点的变体,一律抛错,而不是被悄悄打了分。
test_protein_design_mcp.py 原子 protein-design MCP connector,使用真实 stdio 和临时 fake backend 子进程驱动。它固定内置 connector-directory 入口、九工具 catalog、RFdiffusion 的 deterministic + design_startnum seed 契约及 PDB/TRB 配对、ProteinMPNN 官方 chain/fixed-position 参数和独立 motif/target/map 校验、blind ColabFold 的断网 namespace 与冻结参数、失败终态记录、路径约束,以及修正后的 Rosetta unsatisfied-H-bond 字段。整个模块标为 stubbed_backend,伪造的科学响应不会进入 API schema capture。
test_prov_record_confinement.py 一个 cell 可以把哪些文件登记成本会话的 artifact。provenance_record 用 Path(path).expanduser() 解析路径、只检查文件是否存在,于是宿主上任意绝对路径都能登记——修复前实测:写在工作区之外的一把私钥拿到了 version id,并出现在所有展示 artifact 的界面上、可下载。约束机制并非缺失,而是没被用上:self._resolve_path 本来就注入进了这个 service,它的兄弟方法都在调。同一个函数还会把整个文件读进守护进程内存来算校验和,而其它 artifact 路径都是流式处理的。
test_provenance_identity.py 被打了标签的对象,还是不是当初被打标签的那个对象。侧表原先是 id(obj) -> tags,而 id 不是身份:CPython 会立刻复用已释放对象的地址,于是一个毫不相干的对象继承了它的血缘——第一次分配就能复现。这是在「结果可复现」这一核心主张所依赖的子系统里伪造了一条血缘边;而且侧表是主路径而非边角情况:list 和 dict 都走这里,而它们正是 json.loads 的返回类型。其中两条用例的存在要归功于变异测试打掉了第一版——干等真实地址复用无法证伪修复(钉住对象本身就杜绝了复用,于是测试落到了一条更弱的断言上),而用 MAX_SIDE_TAGS 来决定循环次数会让「上限被调大」表现为卡死而不是失败。
test_provenance_paths.py worker 内部的文件系统身份——溯源正是在这里悄悄断掉的。一个 Cell 若在打开文件和写入文件之间换了工作目录,仍然必须给出同一个规范路径;最后那个测试拿真实内核验证了这一点。
test_public_api_contract.py 公开的 import 表面,钉住它是为了让后端还能继续搬家:包版本、构造函数的参数名、run_task 的调用约定,以及 Host 与 server 两个门面。它钉住的只是调用方看得见的东西,仅此而已。
test_public_exception_projector.py 一个同时带着凭据、绝对路径和 shell 命令的异常,在每个对外表面上抛出——HTTP 分发器、WebSocket 文本块、异步作业结果、计划作业、REPL 作业、连接器调用与远程算力——断言三者都不出现在响应里,而稳定的 code 和本守护进程自己的 request_id 必须出现。public_failure 只是信封,从不改写 error,所以写了 str(e) 的 except Exception 会把原始文本连同一个漂亮的错误码一起发出去。连接器调用错了两次:它用 200 返回 {"error": …},而 Web 客户端只在非 2xx 时抛出,于是一次根本没跑起来的连接器被当成跑成功了。
test_r_kernel.py 包含被重写的变量检查器契约。 substitute() 不会替换来自 .GlobalEnv 的绑定——而这正是检查器唯一读取的环境——于是每个普通变量都返回不透明的 symbol,没有类型、没有长度、没有预览;而原先的测试把这个结果写成了「契约」。这里把「安全」和「没用」混为一谈了:读一个普通绑定什么都不会运行,只有 promise 才有东西可求值。现在检查器先用 substitute 探一次,探不出名堂时才真正去读。明说而非隐瞒的代价:在当前版本的 R 上,检查一个 delayedAssign 绑定会强制求值;而 promise 的函数体如果抛错,会退化成那个不透明的回答,而不是让整份列表失败——这正是问题浮现的方式:一个 stop() 让所有变量都变成「failed closed」。调用 active binding 依然是绝对禁止的。 另外还覆盖了 R 侧一直没有的实时输出:宿主端一直接受 stdout_chunk 帧,而 R worker 一帧都没发过,于是一个跑得久的 R cell 在结束之前什么都看不到。流式输出曾经只发生在顶层表达式之间,这一行也曾据此写明那个限制:一个话痨 for 循环是一次性到达的,因为在单线程解释器里做表达式内部的流式输出需要 C 层的工作。自从宿主开始抽干 cell 的 fifo,这句话就不再成立了——R 的连接缓冲一冒出字节,抽取端就看得到,而这在表达式内部同样会发生。worker 侧的 flush 仍然保留,用于那种结束时还没把缓冲填满的表达式。中断路径现在也有了自己的回归用例:shell 把 daemon 放到后台时会把 SIGINT 设为 SIG_IGN,这个处置沿每一次 exec 一路传到 Rscript;R——不像 Python worker 那样无条件安装处理器——在继承到 ignore 时拒绝安装自己的中断处理器,于是 R worker 生来就无法被中断。测试在 SIG_IGN 的父进程下同时对协议假件和真实 R 断言 interrupted=True。另外,rm(list = ls(all.names = TRUE)) 是用户的惯用写法,不该杀掉 kernel:worker 曾把读循环、辅助函数、连接和 lineage 控制器都放在 .GlobalEnv,这个 cell 于是把 worker 连同整个会话一起删掉了;真实 R 的测试断言之后 pid 不变、读文件的 tracer 照常工作、检查器只列出用户自己的绑定,另有一个源码层面的绊线,在没有 Rscript 的 CI job 里钉住私有环境的结构。
test_recovery_recipe.py 关于恢复配方的三个测试。它会编译出一个依赖闭合的 Python 或 R 命名空间;把外部状态和解不出来的部分留成手工步骤交给人,而不是替人 replay;并且只有记录的源码哈希仍然匹配,它才肯执行。
test_skill_catalog_readiness_route.py Web 端技能目录告诉用户「这台机器上这个技能能不能跑」。加载器早就算出了 requirements 与 ready/needs_setup/unknown,而 Web 投影重新拼行时把这两个字段丢掉了:接口不带它们,Customize 也就画不出来——只能在有 GPU 的机器上跑的技能,看起来和哪儿都能跑的一模一样,只有面向智能体的 host 面看得见区别。这些测试打真实路由,把就绪状态放在 enabled 旁边而不是并进去,并钉住让「浏览目录」安全的那条性质:整个请求不起子进程、不开套接字。
test_skill_network_contract.py B-02 Skill 网络 manifest 与执行准入。catalog 全遍历 0 socket 0 subprocess;100% bundled Skill 有显式 mode;内置 raw_required 在兼容开关开启下也 fail closed;host_only 未声明/未批准 domain 及不合规重定向一律拒绝;Cell 与 shell 两个 sink 零旁路;加载 manifest 不改变 egress grant;第三方集合 Skill 标 legacy/unknown,不因新字段获权。
test_skill_requirements.py 一个 Skill 真正跑起来之前需要什么。有十四个内置 Skill 从写出来那天就在 frontmatter 里写了 requirements: [gpu],而没有任何地方去读它——于是「只能在有 GPU 的机器上跑」和「哪儿都能跑」这两种 Skill 在执行之前完全看不出区别。覆盖三种状态(ready/needs_setup/unknown——无法判断的依赖绝不向任何一个方向猜)、浏览目录不产生任何网络请求,以及就绪判断不会给每个 Skill 起一个子进程。
test_resource_allowlist.py Skill 的三态允许名单,以及为什么 None 和 [] 明明都是假值却绝不能等同——if not allowed: 会把「全部禁止」变成「全部放行」,而且恰好是在用户专门为了上锁而选的那种配置上向开放方向失败。同时覆盖退出标准点名的四个面:未列出的 Skill 在目录、搜索、load/get 以及 read(真正吐出文件内容的那个)里都不可见,而且给出的答复和「这个 Skill 不存在」完全一样。
test_retrieval_source.py 客户端可以看到「数据是从哪儿取来的」中的哪一部分。artifact_versions.source 这个信封从检索溯源加进来那天起就记录着请求 URL、查询和响应哈希,而没有任何地方去读它——于是一张基于实时 API 抓取的图,看上去和凭空算出来的一模一样。但原样发出去也不行:它是由未经审计的检索代码写入的自由格式 JSON,而科研 API 把 key 放在查询串里是家常便饭。覆盖白名单、长度上限,以及查询串、路径和 userinfo 三处的脱敏。
test_release_gates.py 发布之前跑的那些门禁。secret 扫描会报出命中却不回显具体值;发布包校验器会拒掉第三方核心依赖、缺失的集合 marker、manifest 哈希/大小不符及未登记的集合 payload。已安装 wheel 与桌面 bundle 的检查还证明固定集合不能靠「自身不存在」关闭自己的数量闸,而目录文档检查仍覆盖集合边界文档对。
test_remote_capability_probe.py SSH 上的命令注入,一项输入一项输入地封死。shell 字符串在 SSH 启动前就被拒;含糊或类型不对的 spec 根本到不了 SSH;而且哪怕被拒绝,这次探测仍然会投影出一条活动记录,让这次尝试可见。
test_remote_compute_control_tools.py 远程算力这几个 Tool。提交任务要审批,取消与关闭不用——因为哪怕正在拒绝新工作,清理这条路也必须留着能走。
test_renderer_capability_honesty.py renderer 目录被允许宣称什么。没有实现的能力——sort、filter、compare_versions——必须直接删掉,而不是写进文档;没有解析器的列式二进制文件要明确声明为只能下载,而不是先承诺一张画不出来的表。flag 打开时可以声明 sort/filter/profile/export,parquet 仅在 optional 引擎确实可导入时才出现。
test_renderer_registry.py 三个测试:renderer 的选择是确定性的,重复的 renderer ID 会被拒绝,公开 descriptor 里的版本与溯源始终绑在产出它的那个 renderer 上。
test_retrosynthesis_evidence_regressions.py 逆合成路线的证据检索。这里每个测试都是为了不让“候选”冒充“已核实”:只有候选来源时,coverage 不能被抬过 30;显式的空记录包装不能摇身变成伪证据;没有真正核实过,verified 就一直是 false。检索里的搜索或抓取失败会被隔离,不能把已经拿回来的来源一起拖没。
test_retrosynthesis_evaluator.py 已安装公开及私有数据集的哈希校验、严格映射 fixture 类型,以及可直接运行的 GT 入口。
test_retrosynthesis_generated_programs.py 生成 Scenario CLI 合约:生产化学规范化、唯一映射标识及公开 fixture 兼容性。
test_retrosynthesis_generation.py 生成器进程隔离、不含秘密的诊断,以及各 Scenario 生成 provenance 的保留。
test_retrosynthesis_planning.py 逆合成 Skills,包括六个可独立评测任务的发现/模型身份、六份独立 Scenario 文档合约,以及可执行的 class-unknown 单步协议:隐藏反应字段必须 fail closed、无序前体集合需正确比较、invalid/duplicate beam 必须保留,私有指标必须按 target 汇总。其余重点是两项渲染风险:LLM 标注在返回不可解析内容时必须带告警降级,图谱 payload 必须转义外部输入的分子名。
test_retrosynthesis_scenario_protocols.py Scenario 2–6 及外部模型环境边界的可执行协议回归:AND/OR 库存闭合、AiZynthFinder 路线转换、原子映射保密与对称性、正向预测立体诊断、完整 Parrot beam 元组、不裁剪预测的 worst-group 收率评测,以及锁定环境计划、产物快照和绑定 manifest 的 worker 握手。
test_retrosynthesis_scoring_regressions.py 路线打分与渲染,麻烦的 bug 都藏在这儿。重排之后,标注不能还指着它原来描述的那条路线。库存标志里的字符串 "false" 永远不算“有货”。归一化后的决策权重要精确加到 100。已解出但没有反应步骤的路线,不该因为根本用不上的证据被扣分。
test_revert_projection.py 关于 Revert 与 Undo 历史的三个测试:它只追加、且扛得过重启;兄弟分支之间的消息从不混在一起;遗留数据会被回填到规范的根分支。
test_review.py 经由网关走完整链路的 Reviewer。它的结论是受约束的:schema 不合法时报为“不可用”,而不是被硬掰成通过;provider 出错也不致命——一次失败的评审不该让被评审的那一轮跟着失败。
test_review_service.py 同一个 Reviewer,但作为网关之外的服务,这里的实质是并发。被取消的 provider 调用仍然会在自己的线程上跑完,同时挡住重复提交;线程启动失败时,它会把先前已经占下的预留清理掉。
test_science_connectors.py 每一个科学数据库 connector,全部跑在离线 HTTP fake 上。它们共用同一份记录 schema;从不用用户输入拼出任意 URL;上游返回 204、或返回一个从未承诺过的 schema 时,得到的是有界的 connector 错误,而不是崩溃。
test_stage10_connectors.py Stage 10 的 ClinVar/PubMed/ClinicalTrials:flag 关闭时目录仍是原来的七个;fixture 返回 accession/URL/时间和版本化 Artifact;空结果、429、schema drift 都是诚实错误。Artifact 发布全程固定 parent directory,并核验私有 staging file 的 inode;workspace 路径交换无法重定向写入,hardlink 替换会 fail closed,既不发布也不留下别名。
test_stage10_live_canaries.py 打公开 ClinVar、PubMed、ClinicalTrials.gov 的 live canary。标了 network/external,不进默认离线套件。
test_stage11_remote_compute.py Stage 11 持久远程计算:重启只 reconcile、cancel 打到精确 receipt、unknown/timeout 不算成功,harvest Artifact 记下 receipt、输入 version 和 checksum。
test_stage12_ga.py Stage 12 GA 总开关默认关闭,证据表覆盖每一个 Stage。
test_connector_manifests.py connector manifest 必须描述 connector,而不是给它加装饰。对着 connector 自己的离线 fixture 证明每条 required 路径既存在又承重——删掉它 adapter 就返回不了记录。没有后半条,manifest 会漂向罗列一切「有了更好」的字段,而基于它的 canary 会对无关紧要的东西报警。
test_connector_canary.py canary 的唯一职责是把宕机和契约变化区分开。用注入的 fetch(无网络)驱动分类器走过:健康的 200、required 字段被改名的 200(漂移)、超时、HTML 的 200、以及重试后成功的瞬时失败。把这个区分弄反——无论哪个方向——都是失败模式:对宕机报警会被静音,对漂移沉默则毫无意义。
test_platform_support.py Windows 不受支持,而「不受支持」必须意味着被拒绝。真正承重的测试不是「它会不会抛异常」,而是「它是否在 spawn 之前抛」——在 Popen 之后才拒绝能骗过一个天真的检查,却完全背离意图。变异检验:拿掉守卫、把 Windows 加进支持集、以及把拒绝降级为警告(也就是最初的缺陷本身),三者都会导致测试失败。
test_science_control_tools.py 关于科学检索两个表面(原生的与内核内的)的三个测试:两个扁平且做过 schema 检查的注册表条目、一个不用网络也能跑的目录,以及只编码顶层字段的 Host wire。
test_sdk_compute.py worker 侧的 host.compute 命名空间:provider、实例、传输、attach、清理。带安全锋刃的是路径处理——本地路径按允许名单做相对化,绝对路径直接拒绝。
test_security.py 纵深防御的几层,LLM 全程被 mock。快路径和失败即放行的那几处,要和拦截一样仔细读:常规代码根本不进分类器,而注入筛查在没有配置 key 时是失败即放行的。不失败即放行的是 query 的拒绝名单——即使用拆分标识符绕,它也把 host.query 挡在设置、connector 与秘密表之外。
test_server_agent_run.py 纯引擎外围的 Web 适配器,其中大半在讲用户不该看到什么。fence 要跨增量边界一直藏住;代码草稿是临时的、可丢弃的;只用于完成的 Cell 在执行之前先把草稿清掉。旧版的 fenced Tool 调用仍然会执行,并以一条用户 observation 的形式回来。
test_server_completions.py 一轮结束时给用户看的东西。完成消息由真实的 Artifact/capture 增量和实际输出渲染出来,绝不依赖隐藏的推理内容;可信链接来自服务端 helper 与精确 version id;只跑了代码的一轮,会拿到一个如实的状态,而不是被暗示成成功。
test_stage1_browser_fixture.py 为浏览器验收构造本地 metadata readiness fixture,并用生产 Store、Artifact manager 与 completion-delivery verifier 原子种入 100 条交付,以及 same-head/head-change 和 delegated-producer 证据。定向测试保证种入路径确定、带作用域,且不触发 LLM 或网络。
test_server_execution_coordinator.py Web 侧的准入与取消。没有确切的执行与持有者身份,取消就失败即拒绝;它绝不能退化成“把当下在跑的随便取消掉”。取消排队中的 REPL 也碰不到正在跑的 Agent。
test_session_sidebar_scope.py 打开一个 project 时,它的会话到底看不看得见。loadSessions 拉的是全局的 /frames?limit=100,然后在浏览器里按 project 过滤;于是会话落在那一页之外的 project 看起来就是空的——而 openProject 把「空」当成调用 newSession() 的理由,于是给一个работ还好端端躺在 SQLite 里的用户呈现了一个崭新的空会话。实测:一个 project 里 120 个会话就足以把另一个只有 3 个会话的 project 整个挤出全局页;修复前可见 0/3,修复后 3/3,并在真实浏览器里再次确认。服务端从一开始就支持 project_id、游标和 next_cursor——缺的只是一个没被用上的查询参数。
test_session_and_message_paging.py 够不够得着一个 project、一个会话里没显示出来的那部分。用会话列表的键集游标走完 260 个会话,再用消息游标往回走完 640 条,断言不漏、不重,且走到一半新增的会话或消息不会让后面的页错位。钉住这次走查暴露的两个分页大小缺陷:?limit=banana 以 500 internal_error 抵达浏览器,而同一条路由对 before_seq=banana 早就回 400;?limit=-5 则回 200 加一个空页和 has_earlier: false——正是「你已经到最前面了」的形状。并端到端跑通 session 包导出:第一条、最后一条,以及分支自己的那条消息,且每个 message_id 仍挂在自己那一行上。
test_session_branching.py 关于 checkpoint、fork、revert 与 undo 的四个测试。revert 预览会报告所有状态维度,且一个字都不写盘;工作区被外部改动过时,revert 会被挡下并记录在案,而不是把改动覆盖掉。
test_session_control_tools.py 当前会话与 capability 这两类 Tool。capability 搜索始终可见,并会激活会话这一组;审批输入在经过 dispatcher 时会被脱敏;当它需要的 domain 不感知文件系统时,写操作失败即拒绝。
test_session_deletion.py 删掉一个会话或 project,同时不能顺手删掉别人的数据。内容寻址存储是共享的,所以它的 GC 要等 checkpoint 的引用发布之后再动;快照清理绝不跟着符号链接走出这棵树;feedback 删除会转义 LIKE 的元字符。
test_session_domain_service.py 快照、checkpoint、游标 fork、分支、Timeline、导出、renderer 与恢复背后是同一份组合,全都经由 Store 门面到达。游标 checkpoint 失败会被审计下来,且不会声称 fork 成功了。
test_session_package.py 会话的导出与导入,也就意味着一整个不可信压缩包的攻击面。路径穿越、符号链接、压缩比异常、重复或悬空的身份、夹带的秘密,全部拒绝;任何形似 replay hook 的东西都会被隔离,直到一次确认过的全新重启才解锁;导入中途出错时,数据库、工作区、环境与 CAS 会被一起回滚。
test_session_recovery.py 空闲清扫器。释放一个会话之前,每一个阻断条件都必须解除,而正在进行的恢复就是其中之一——清扫器不能把内核从恢复脚下抽走。TTL 解析、持久化的活动记录与启动时的对账也在这里。
test_session_snapshots.py 内容寻址存储里的工作区快照。做快照时会排除秘密、符号链接与超大文件;恢复时拒绝盖在被外部改动过的工作区上,也不动未跟踪的文件;分支头部的移动由 compare-and-swap 守着。
test_share_expiry.py 分享有效期 / 自动撤销:记录 expires_at、sweeper 撤销过期而保留未过期、无有效期的从不被扫、update 保留或清除有效期、restore 撤销 daemon 关机期间过期的,以及时长解析。
test_sandbox_credential_denies.py 强制沙箱到底把哪些凭据挡在 cell 之外——用真实的 sandbox-exec 实测,而不是读 profile 文本推断。拒绝清单里对 openai4s.db 用的是前缀规则,而守护进程的 access token 是它的同级文件,于是数据库被挡住、token 却被读了出来;而那个 token 是整个 HTTP API 的门禁。另外 cell 仍然可以运行 /usr/bin/security 去够 macOS 钥匙串——OPENAI4S_SECRET_STORE 在 macOS 上默认就把 LLM API key 放在那里。只拒绝钥匙串文件是那个看起来很对的错误修法(securityd 是代替调用方去打开它们的),测试会在这种改法上变红。同时断言在同样规则下 TLS 仍然可用——因为那正是这个修复可能弄错的取舍。
test_share_gateway.py gateway 装配:默认关闭且无隧道、未配置时启用会报出缺失项、无隧道也能创建/撤销、删除会话会撤销分享、以及存储层级联删除 shares 行。
test_share_import.py URL 导入的 SSRF 策略(非 loopback 仅 HTTPS、禁 credentials、拒私网地址与非 HTTP、bundle 路径归一化)以及导入侧对不可信消息的静态注入标注。
test_share_projection.py 扁平化分享快照:能被 import_bytes 原样导入、无 dangling 引用、memories/权限/能力恒空、把 revert-to-sibling 历史扁平化、脱敏 secret 形态文本、残余已知密钥字节时失败即拒、并与查看器文档一致。
test_share_protocol.py 隧道线协议:数据帧头往返与 flags、大小限制、未知类别、控制帧 JSON 往返、未知/超大/畸形控制帧,以及请求头允许名单。
test_share_relay_tunnel.py 经 loopback relay + 隧道的端到端:访客抓取、Range、HEAD、未知/坏 Host 的 404、方法 405、被污染的响应头变 502、异 principal 冲突,以及无可信代理时忽略 XFF。
test_share_router.py 只读 router:查看器外壳的 CSP 与安全头、静态白名单、view/meta/artifact/bundle、内联 vs 附件、Range、HEAD、方法 405、未知与已撤销统一 404,以及一个 AST 守卫确保它不 import 任何执行面。
test_share_service.py 两阶段发布与生命周期:ready 快照、每 frame 一个活跃分享、bundle/view 共享同一 projection 身份、update 替换快照、读者 lease 阻止旧快照被 GC、撤销、按会话撤销,以及崩溃恢复。
test_share_viewer.py 静态查看器资产可加载、router 能提供真实的外壳/JS/CSS;CLI share 子命令可解析;relay gen-token 打印 token。
test_session_title_service.py 后台生成的会话标题。它跑在另一个线程上,所以测试大多是竞态:它不能覆盖掉用户刚刚打上去的标题;如果后台工作启动期间 Store 被换掉了,它得解析到新的那个。
test_setup_environments.py 内置的 Python/R 环境 manifest,全程不碰 conda 就能验。两条承诺撑着这个模块:不显式要求更新,就绝不改动已有环境;更新只作用于探测到的 prefix,而且不做 prune,你自己装的包能活下来。它还钉住了 Python manifest 绝不用 pip 装 NumPy-1 ABI 的 RDKit,以及 --only 和 --profile 不能同时给。
test_single_cell_rna_analysis_skill.py 精选单细胞工作流的发现、sidecar 编译与检索;Harmony 元数据缺失/完全混杂及 reference 混用的结构化 preflight 失败;raw-count 与 donor 重复数门控;运行时生成的确定性配对 donor AnnData 完整运行,验证 counts layer、Artifact 和字节稳定 resume;另有 Pertpy Kang 2018 的可选 network 冒烟。
test_session_tool_catalog.py 关于会话 Tool 组合的两个测试。Host 先给 Dynamic Tool 的生命周期把住闸门,代理才在同一份目录里执行;渐进披露保留核心组,只激活相关的那几组。
test_settings_repository.py 设置、模型 profile 与 feedback。模型 profile 的写操作由共享锁串行化;权限播种也走这同一个仓储——这正是两者被放在一起测的原因。
test_skill_customization_service.py 在 Web Customize 面板里写出来的用户 Skill。有意思的是路径处理:删 foo 不能把 foo-bar 一起带走;目录和文档都不能是指向用户根目录之外的符号链接。内置 Skill 保持只读,并在重名时胜出。
test_skill_recipes_are_callable.py 内置配方让 agent 调用的每个裸名字都必须解析得到——内置函数、配方内的绑定、kernel.py 导出,或内核注入的那两个名字之一。这道门出现之前已经漏过两个幻影 API。
test_skill_frontmatter_edit.py Web Customize 保存时对 skill 其余 frontmatter 做了什么。它会用 name/description/origin 把整块重建一遍,于是 license 和 category(34 个内置 skill 中的 23 个)、嵌套 metadata 块(17 个)、requirements(13 个)和 fold_cue(1 个)都会被「顺手改个错别字」的人删掉。让它成为正确性问题的是 requirements:readiness 由它算出,丢了 [gpu] 的 skill 就不再报 needs_setup,转而声称哪儿都能跑。两种看起来很对的错误修法都被证伪了——先解析再重新输出(解析器按设计会压平列表、忽略嵌套块),以及朴素的按行过滤(会把嵌套 metadata 里的 name: 当成顶层那个)。此外覆盖块标量的续行、反复保存的幂等性、一个「尚未发明」的字段,以及真实 service 的端到端路径。
test_skill_product_surface.py 版本化的个人与 project Skill 作为产品表面:控制类 Tool、SDK 调用,以及 HTTP 的历史与回滚路由。回滚被限定在当前 project 内并留下审计,跨 project 的版本 scope 会被拒。安全用例通过真实 dispatcher 验证:skills_edit 默认需要审批;即使显式放行,普通团队成员的调用也不能替换 project 同事将读取的 SKILL.md 或 kernel.py。真实已认证的 HTTP 路由保留成员对 Web 创作配方的回滚,而保留的旧 Host 配方或可执行 sidecar 必须经管理员授权才能重新启用。
test_skill_reference_reading.py 读取 Skill 目录内的某一个文件。admet_genetic 的配方要求先读 references/data_contracts.md 再跑管线,而在此之前唯一的写法是在 Python cell 里调 host.skills.read(...)——于是停留在工具平面的 agent、尤其是从不执行 cell 的被委派子代理,在结构上就无法遵守这条指令;而它最自然的退路 read_text_file 被限制在工作区内,报出的路径错误与“这个文件不存在”无法区分。这些用例用一个真实的 fixture Skill 跑通两道门:全新的 read_skill_file 原生工具(全程不启动任何内核),以及一个带脚本化模型和真实持久内核的被委派子代理,在一个 cell 里读完两份参考文档并把两个标记原样带回。同时补上此前完全没有测试的 loader 穿越防护(全套件里唯一一处 escapes skill dir 断言打的是 edit 路径,那是另一个函数):..、绝对路径、以及指向目录之外的符号链接。被限定到另一个 Skill 的子代理拿到的是 "no such skill",与“不存在”刻意无法区分;没有 skills 能力的子代理则连这个工具都看不到。
test_skill_sidecar_recovery.py 两个测试,跑在真实 worker 上。只有真的加载成功的 sidecar 才会被冻进 generation manifest;被篡改的 sidecar 记录会把这个 generation 标成不可恢复,而不是照样 replay。
test_skill_versions.py 内容寻址的 Skill 安装、升级、发布、回滚与删除。有两道防线值得知道:内置 Skill 永远不能成为安装、发布或回滚的目标;对自己 sidecar 字节撒谎的 manifest,会在激活之前被拒。
test_skill_write_authorization.py 在追踪三条最终判定为误报的 CodeQL 告警时,顺带挖出来的两个真缺陷。_permits 只把住了 load/get/read,edit/publish/delete 一个都没把——于是一个被限制为 skill_names=["a"] 的子代理读不到技能 b,却可以覆盖它、发布它、删除它。这是更糟的一半:父代理随后会执行那份被受限子代理改写过的配方。内置技能把这个问题藏住了——它们出于另一个原因本来就只读,所以第一次探测全部被拒、看上去没事;只有在用户自己创作的技能上才暴露。edit 同时也是创建路径,因此在白名单之外新建一个名字同样被拒。另一处:JobManager.submit 在做 realpath/commonpath 包含性检查之前就调用了 mkdir(parents=True),于是一个随后被正确拒绝的 cwd 早已在它指向的任意位置建好了目录——拒绝是真的,副作用先发生了;而当目标不可创建时,异常会直接从 submit 抛出,而不是像那里其他所有拒绝一样返回 error 字典。
test_import_bioskills.py 用一个两条 Skill 的 fixture 而不是 561 个文件的整体刷新来测导入脚本:checkout 必须干净且固定、读取的是 Git 已提交 blob 而不是脏工作树字节、Skill 数量、frontmatter 转换与命令文本规范化、examples/ → scripts/ 与 usage-guide.md → references/、manifest 各处都用 POSIX 路径,以及 SHA-256 校验器——靠把它弄坏来断言。重点在失败路径:声明名重复时不能留下半棵树,否则「目标必须为空」那道闸之后就拒绝覆盖了。
test_skills.py Skill loader。其中出人意料的一大块是 YAML frontmatter 解析——折叠标量、字面块、chomping 指示符、行内注释——因为一个漏进摘要里的 >,正是渐进披露开始输出乱码的起点。每个内置 Skill 里的 import 提示也被当成真正的 Python 检查了一遍。
test_specialists_builtin.py 内置 specialist 的唯一事实来源。gateway 目录把 SCIENTIST/EXPLORE/GENERAL/PLAN/REVIEWER 当完整 specialist 展示,而运行时解析器只认得 REMOTE_GPU_PROVISIONER 的 prompt——委派到目录里的名字得到的是无 persona 的普通子代理,目录里的 unrestricted: False 也从未被强制。现在:每个目录条目都必须解析到带真 persona 的运行时档案(反向亦然);gateway 清单必须逐字节派生自 openai4s/specialists.py;受限内置档案必须推导出 fail-closed 的只读策略;同名存储行覆盖内置;不受限内置只注入 persona——若注入 unrestricted: True,受限父代理委派 GENERAL 就会变成扩权错误。
test_specialist_delegation_roundtrip.py 对一个真正保存过的 specialist 做 delegate。agents.unrestricted 是 INTEGER NOT NULL,SQLite 读回来是 0/1;仓储层解码了 skill_names 和 connectors,唯独漏了这一列;而 child_execution_policy 只接受严格的 bool。结果是每一个存过的 specialist 都无法委派——受限的和不受限的一样。严格检查本身是对的、也没改:"false" 是真值,绝不能当成 True 放行。原有测试是绿的,因为它们在内存里用真正的 Python False 构造 profile,那个 int 根本不会出现——这些用例是写进去再读回来。
test_specialist_allowlist_armed.py 专家 Skill 白名单到底有没有被真正打开。set_allowed_skills 会收紧全部四条读取路径,test_resource_allowlist.py 也覆盖得很扎实——而它只有一个定义、六个调用点,且六个全在那个测试文件里。生产代码从不调用它,于是 _allowed_skills 在每个真实 dispatcher 的整个生命周期里都是 None(放行一切):一个被限制为一个 Skill 的专家拿到了全部 34 个内置 Skill,并且能 skills_read 出其中任意一个的正文(实测泄漏 33 个、读回 4972 字符)。测试之所以通过,是因为它们自己把白名单装上了——这正是逐提交评审在结构上看不见的失效模式。现在改为在 set_child_execution_policy 这个所有子代理必经的收口处装载。另一半同样要紧:_normalize_item 用 dict.update 把子 spec 覆盖到父 spec 上,于是嵌套子代理可以替换继承来的名单——一把带旁路的锁——现在继承改为取交集。同时如实记录:connector 那一半根本没有可装载的机制。本文件里有一个测试起初自身是空转的(search("") 返回 0 行,all(...) 恒真),已改为使用真正能命中的查询。
test_specialist_connector_allowlist.py B.4 的另一半,而它根本没被造出来。connectors 存在 specialist 行上、随委派继承、在 _normalize_item 里取交集、还被 API 原样回显——但 ChildExecutionPolicy 上没有字段把它带进运行时,也没有 setter 去执行它,于是根本没有可装载的东西。用真实 dispatcher 实测(connectors=["allowed"]):mcp_list 返回了本机全部两个 connector,mcp_tools("denied") 返回了被拒 server 的工具清单,并且把它的进程拉了起来。现在这道闸口放在 MCPService.connector()——六个 MCP RPC 方法共用的那一次查找,也是启动配置的来源:拿不到行就拿不到命令,被拒的 connector 连进程都起不来。拒绝一律报成 "not found",避免用拒绝信息去枚举。嵌套那个洞在两半上一起补:_normalize_item 是拿 delegate() 调用自身的 kwargs 收紧的,只有 _apply_parent_execution_ceiling 看得到父子代理的 spec,而它只收紧了 capabilities 和 permissions,两个资源白名单一个没管——孙代理因此可以放大。19 个用例里有 14 个在改动前失败,另外 5 个是防止它悄悄变成"一律拒绝"的守卫。
test_stop_kernel_drains_queue.py 当会话里还有排队的活时,Stop 还停不停得下来。stop_kernel 取消了正在运行的执行,然后把自己的生命周期 ticket 提交到同一个 FIFO——于是已经在排队的先跑;而在 stop_requested 置位之后被放行的回合,一提交任何东西就会阻塞在 stop_finished 上,而那正是 Stop 完成时才会设置的。Stop 等队列,队列等 Stop。实测:一个能正确响应取消的回合后面排 3 个,40 秒不返回;队列为空时 0.1 秒返回——这也正是它一直没被发现的原因:既有测试停的都是空闲会话。cancel_queued 本来就有,而且刻意只精确取消一个(避免误伤兄弟);缺的是生命周期这一侧的调用者,不是机制。
test_store.py schema、迁移,以及调用方今天就依赖的那些行结构。真正会咬人的是 Artifact 的合并规则:临时版本必须合并而不是复制出一个新的;血缘写失败时,版本要跟着一起回滚。
test_structured_finalize.py finalize_response 归引擎所有,不属于 Tool 注册表,而且只有它单独出现时才算完成一次运行。含有它的混合批次不构成完成;无效的调用会变成一条规范的错误结果,模型看得见,也能重来。
test_submit_output_reconciliation.py finalize 台账对账在 Cell 内完成通路上的姊妹契约:host.submit_output 不得在产出语义的 output 键下命名任何 Artifact 库、已执行 Cell 的写入记录和磁盘都无法背书的文件;summary 复述某个指标时,数字不得与同一次提交自己的 metrics 相矛盾。四舍五入、百分数、输入语义的键和自由散文一律放行;拒绝保持 {"error": msg} 软失败——模型可以真把文件写出来或把 summary 对齐后重新提交;证据收集器坏掉时退回旧式接受,绝不堵死循环唯一的完成信号。
test_task_modes.py 任务模式,以及选中它的两道门。系统此前只有一种形状的指导——分析——于是“给我做一条可复用的管线”换来的是图表和报告,实现本体留在内核命名空间里。这些用例钉住分类器的保守契约(必须同时命中目标信号与动作信号,按词边界、中英双语,否则一律留在 analysis_run:误判成代码类模式会向普通分析回合索要它根本产不出的 source/entry-point/test 证据)、永远优先且遇到拼写错误就大声报错而不是悄悄回落的显式覆盖、片段注册表,以及两条接线:Web 的 per-turn user message 追加(持久消息行原样不动,与 _EXPLORE_PROTOCOL 完全同一套路)并对非法请求体值返回 400,以及此前完全没有 per-turn 增补的 CLI Agent.run 接缝。
test_team_isolation_hardening.py 对抗审查在本分支上发现的隔离漏洞的回归测试,按错误形状分组。守卫只接了若干调用点中的一个:artifact 字节按路径在 _api 里检查,于是 /preview/(更早分发)与按 version/filename 寻址的取字节全都绕了过去——检查现已下沉到字节 chokepoint,且当 artifact 的会话无法判定时 fail closed。项目可见性只授予读取:同项目成员可以读另一位属主的 Artifact/share,但不能编辑、恢复、改名、删除、写 annotation、向其会话上传或撤销分享。一整类资源完全没有守卫:/projects/* 允许任何成员读取、改名并不可逆地 DELETE 任意项目,列表还泄漏所有课题组的项目名;参与资格现定义为「有成员行或在该项目里拥有会话」,所以自己新建的项目不会把自己关在门外。此外:WS 身份一次捕获后活过了自身的吊销;子串式 denylist 预检在 users 被拒后让 SELECT … FROM active_users 一并失败(INV-1);LIKE 前缀让 DELETE /team/invites/% 一次吊销全部在用邀请;用户名竞态输掉时会烧掉单次邀请;reviewer 经自己的 port 触达 provider、绕开了 LLM 配额门;登录令牌桶的裁剪判据取的是它永远达不到的值,字典因而无界增长。
test_team_governance_routes.py M2 验收矩阵,真实 socket。/team/* 只有 admin 能用且门是集中声明的一个;用户管理路由写审计;同项目成员互见 project 会话而 private 只属 owner 与 admin,但所有 frame-scoped 写入(turn、权限、plan、annotation、Auto Mode、kernel、分支、恢复与删除)仍仅限 owner/admin,Revert preview 则保持可读。admin 每次查看 private(HTTP 与 WS 订阅同样)都写一行 admin_read_private;可见性切换在 HTTP 上也只有 owner 能做;邀请兑换出仅回放的 guest,其 API 面只有 auth + replay,用户名冲突不烧掉单次 token;会话配额让第二次创建得到 429 QUOTA_EXCEEDED 且账本能报出来;运行时台账把 LLM token 记到会话 owner 名下、无归属行时保持惰性;ChatModel 配额门在触达 provider 之前就执行。
test_team_governance.py 治理存储(M2)与其支撑的 D4 可见性。成员 upsert 与角色校验;邀请单次使用(并发兑换的 UPDATE)、可过期、落盘与列表都只有摘要;账本聚合并丢弃无主行而不是把它们记到"没有人"头上;配额在到限即约束、project 范围约束全体成员、其他范围不受影响。可见性:成员能看到同项目成员的 project 会话,看不到 private 与无项目会话,guest 成员身份永不放宽访问,切换只有 owner 能做,browse 过滤按同一规则枚举。
test_team_files.py 团队文件区(M1-8)。直接测 FileArea 策略:包含检查扛得住 ..、前缀字符串陷阱(/x/datasets-sibling 对 /x/datasets)、指向根外的 symlink;上传名必须是纯文件名。路由走真实 socket:列目录/下载/上传往返且临时文件不残留、409 后 overwrite=1 覆盖;HTTP 上的穿越是 404;超大 Content-Length 在读任何字节前就 413;guest 在这里处处 403;未配置根时,裸列表返回 200 {roots: [], configured: false}(团队与单用户模式皆然,且单用户模式下已配置的根照常列出),而带路径的列目录、下载、上传仍返回稳定的 no_data_roots 404。
test_team_ws_isolation.py WebSocket 事件隔离(M1-7),真实掩码帧 WS 客户端打真实 WSHub——桩 hub 对重放和按连接过滤什么也证明不了。B 订阅 A 的会话得到 view_denied,句子与 HTTP 的"session not found"相同,且拒绝发生在 hub.subscribe 之前,所以重放缓冲、待决审批卡和队列快照都在同一道检查之后;广播进 A 会话的事件永远到不了 B 的连接,而 B 自己的照常到达;未知 id 不能预订阅(猜中的 id 停在未来会话上会从第一个事件开始偷流);WS cancel——唯一的写入站——按未知会话应答;admin 可订阅一切。
test_team_session_ownership.py 跨用户授权矩阵(INV-13),真实 socket、两个成员加一个 admin。创建会话与写 owner 行在同一把锁里;枚举、搜索、项目 Timeline 都在源查询里过滤;对别人会话的一切按址读写都答 404——不是 403,因为"哪些会话存在"本身就是被保护的信息——而 owner 的同一请求能过守卫;没有归属行的会话(团队模式前的历史、demo 播种、CLI 运行)只有 admin 可见;删除会话连归属行一起删。
test_team_auth_routes.py 团队守卫与登录路由,走真实 socket(auth-exit-matrix 的理由:直调 _route 从来写不出状态行)。团队模式开启时必须成立:没有登录 cookie 前,一切 API 都是 401、一切浏览器 GET 都 303 到 /login;?token= 不再能换浏览器 cookie;登录 cookie 是 HttpOnly/Lax,显式 HTTPS proxy origin 下还必须是 Secure;登出与禁用都会杀掉它;一分钟内第六次错误登录是 429——连正确口令也一并拒绝;WS 升级同样要登录;只有未配置 trusted proxy、TCP peer 来源仍可信时,loopback 头部令牌才保留 CLI 的 service 身份。代理形状下,两种受支持的机器令牌头都不得认证成功,而 admin cookie 仍可用。团队模式关闭时,路由返回稳定的“已禁用”形状(契约捕获冻结的就是它)。
test_team_cli.py openai4s user(add/list/disable/reset-password),离线直连真实 store。要紧的性质:口令永不上 argv——要么从 stdin 读,要么生成后恰好打印一次,且打印出的值真的就是账号口令;重复用户和未知用户以退出码 2 收场、原因在 stderr;每个管理动作都落进团队审计日志。
test_team_repository.py 团队模式身份存储(storage/team.py)。不容漂移的契约:生产 PBKDF2 成本钉死在 60 万次,迭代数记录在行上,未来提成本时是懒惰重哈希而不是账号集体失效;明文口令和原始登录 token 永远进不了任何表(只有加盐哈希与 sha256 摘要);禁用用户或重置口令会吊销全部在线会话,重新启用也不会复活旧 cookie;host.query 拒绝全部四张身份表,agent 的 SQL 读不到凭据材料。
test_tool_schema.py 用纯标准库实现的校验器,负责 Host 接受的那个 JSON Schema 子集。嵌套路径和约束违规是一起报出来的,而不是一次报一个;provider 的 strict 模式要求 required 对象递归封闭。
test_tools.py 控制类 Tool 的那些类,以及旧版的 fenced Tool 解析器。解析这部分测试的存在就是为了不让什么东西被误执行:嵌在 Python cell 里、嵌在更长的 fence 里、嵌在波浪号 fence 里的 Tool fence,都不算 Tool 调用。而 execute 无论参数多么恶意,都不许抛出来。
test_unbounded_session_memory.py 守护进程里两个从来没人清空的累加器。host.app.render() 往一个无上限的列表里追加,且不限制 payload 大小:2000 次渲染、每次 50 KB HTML——也就是分析循环里每轮一块 tile,而这正是这个 API 的用途——在整个会话生命周期里占住 100 MB;而 cell 之外没有任何地方能读到 tile,所以这些内容一次也没被显示过。现在限制为最近 200 块,超大 payload 直接拒绝而不是截断,淘汰也会如实上报。另一处:SessionState 只有在显式关闭时才会离开 _sessions,于是空闲清扫器停掉了冷会话的内核,却把约 1.1 MB 的对话历史继续留在内存里——留给一个已经不存在的内核。现在释放时丢弃历史,由 _seed_messages 从 store 重建——这与守护进程重启后的状态完全一致——同时保留只存在于内存里的模型覆盖、plan/explore 标志与固定环境。测量刻意使用互不相同的 payload:相同字符串会被内部化成一份,会让泄漏看起来小 100 倍。
test_variable_inspector_service.py 三个测试,把变量检查限制得很窄。它从不进入 Cell 状态;读任何东西之前先检查语言和 lease;协议出错时只给出笼统信息,而不是内核内部细节。
test_webtools.py HTML 转 Markdown 与几个搜索后端,跑在离线 fixture 上。前三个测试是围着同一个 bug 织的回归网:arXiv 的摘要页,摘要、作者和标题被转换器整个丢掉了。
test_webtools_redirect_guard.py 重定向之后,SSRF 与 egress 检查还在不在。_http_get 的文档说它手动跟随重定向、好让每一跳都受检——但那只在可选的 requests 分支上成立。兜底分支调的是 urllib.request.urlopen,它在标准库内部自己跟随重定向;而零依赖安装走的永远是这条分支。修复前用本地 302 实测:取了两个 URL,只有一个过了检查。这些用例故意不打 network 标记——那台服务器是进程内的 loopback socket,而 addopts 默认剔除 network,打上标记等于把三条安全测试从每次运行里悄悄拿掉、表面上却还在。
test_webui_static_contract.py 把静态前端当源码读,不开浏览器也不起网关。它抓的是别处抓不到的东西——引用了却不存在的资源、重复的 DOM ID、有名字却没有 SVG 的图标——同时钉住 UI 自己作出的安全声明,包括 connector 编辑器只读取掩码后的 env 名称而非 secret 值、提升后的 Markdown 只允许安全的位图 data 图片、Timeline 是一个按允许名单做的投影。它证明不了 UI 能用;那是 browser_smoke.mjs 的活。
test_ws_frames.py 加固过的 RFC 6455 编解码:长度阶梯、客户端掩码往返、掩码方向强制、截断/RSV/分片/未知 opcode/超大控制帧/非 canonical 长度的拒绝、载荷上限、严格模式 UTF-8,以及 RFC 的 accept 示例。
test_workbench_state_service.py Context 与 Security 两个面板。安全投影是刻意往小了说的:worker 还没启动时,它绝不宣称沙箱是生效的;Python 与 R 的说法不一致时,它报两者中更弱的那个。
test_worker_runtime_alias.py 六个测试,证明 openai4s_worker_runtime 只是一次 re-export:__all__ 相同、两个名字下是同一批对象、没有影子子模块,也没有自己的入口点。
test_workspace_streaming_budgets.py 工作区文件工具与 save_artifact 背后的内存预算。每个用例都造一个整读必死的稀疏文件,并在调用前后盯住 tracemalloc——因为只检查返回窗口的测试,对着「先把整个文件读进来」的实现一样会通过。修复前在测试进程里实测:返回 256 MiB 文件的两行要 768 MiB,grep 一个 64 MiB 文件要 192 MiB,改 32 MiB 文件里的七个字符要 64 MiB,登记一个 64 MiB 产物要 64 MiB。
test_volcengine_connector.py 官方 Ark CLI 边界及其 Gateway 适配:子进程环境中的密钥剥离、掩码 Key 的精确匹配、缺少 Key 与多 Key 不透明选择决策、公开身份与额度投影、单航班登录取消,以及“配置只保存 broker 引用且任何路由响应都不含 Ark 明文 Key 或云端 Key ID”的证明。测试不需要真实访问火山。

子目录

目录 职责
fixtures/ 字节敏感的捕获 HTML、假解释器 helper 与 renderer 样本。这棵子树刻意不参与目录 README 生成,也不参与自动格式化。

如何选择位置

聚焦的回归断言放在这里。可复用的脚本化场景、fake provider、规范化后的 trajectory、计分 eval 与经过审阅的 golden,放进 ../harness/ 这一层。两层的默认检查都保持离线,除非某个入口被显式标记,并作为需要显式选择开启的 smoke 单独调用。

Trust Foundation 新增

模块 钉住了什么
test_compute_trust_boundary.py manager 绝不报告它没有观测到的成功。故障矩阵——断网、探测失败、远端进程被杀、部分传输、恶意归档、卡死的 helper、没落地的取消——必须落到 failed/incomplete/unknown,绝不是 done。含用真实 shell 抓到 & 结合弱于 && 的那组。
test_compute_alias_registration.py 智能体可以指定任意 ssh 目的地,守护进程就会去连。_safe_alias 只校验别名不会被 ssh 读成选项——那是关于 argv 解析的问题——而这是当时唯一的检查,于是 provider="ssh:<任何形状合法的串>" 会直达 ssh <该串>,由 Host * 段或 DNS search domain 解析。在 host.compute(...) 上,这个串来自模型。拒绝点放在该边界而不是 _split:后者同时位于 CLI 与 Compute 面板路径上,那里的别名是人输入的,要求先注册会拒掉产品自己提供的名字。故障注入式断言:只要 subprocess.run/Popen 被调用测试即失败,因为「拒绝」和「连过之后再拒绝」是两种不同的安全结果,而只有前者是这里的主张。
test_harvest_remote_provenance.py harvest 出来的制品声称自己产自本机。ArtifactManager.capture 接受 drain_remote_provenance,所有 cell 路径的调用方都会传,唯独 compute-refresh 的 harvest 没传——而那是唯一一条文件确实来自另一台主机的路径。代价有两个:制品被打上本地环境快照、不含产出它的主机/引擎/远端目录记录;而且由于该路径从不排空缓冲,残留条目会落到下一个写文件的 cell 上,正是 capture 自身注释里描述为「已修复」的那个「cell 3 的 fold 成了 cell 7 图的 provenance」。测试刻意拆成两组:三例直接驱动 capture(它拿到 drain 会做什么),两例驱动 refresh_compute_task 与 _remote_provenance_drain(路由到底有没有传)——前一组无论修没修都通过,这正是后一组存在的理由。
test_write_file_atomicity.py write_file 曾可能毁掉旧字节却又写不出新字节。write 与 edit 现在都通过已校验父目录描述符暂存,再用描述符相对 rename 原子发布,因此磁盘写满、中断或父目录替换都不能留下半写文件或把写入重定向。故障注入落在真实写入与 rename 边界,而不是替换工具;测试也钉住失败后无暂存残留、覆盖保留目标权限位。
test_workspace_scan_deadline.py 遍历此前只按条目数设限,而这与「有界」不是一回事。MAX_SCAN_ENTRIES 的注释自己说明了它存在的理由——「遍历是无界的工作量,不只是无界内存」——然后用系统调用次数去限制它。这些调用要花多久是文件系统的属性:在网络挂载上,一次远低于十万条目的扫描也能拖过调用方设定的任何超时,而调用方无法介入,因为整个遍历都在一次工具调用内部。grep、glob、list_dir 现在都带墙钟预算,并通过与条目上限同一个 scan_truncated 标志上报,因此无论哪个预算耗尽,部分结果都不会被当成完整结果。故障注入的方式是让时钟按条目推进,而不是把预算调成零——预算调零的测试,在一个只查一次时钟就再也不查的 walker 上同样会通过。
test_compute_states.py 一套任务状态词表,写入时强制:终态不可被重新打开,unknown 保持存活以免有东西在远端默默计费,迁移把 done/incomplete/closed 折叠过来且不丢失各自的含义。
test_compute_manifest.py 任务要对着自己的承诺被检查:每个回收到的文件都带上大小与 sha256,声明了却没出现的产物会被点名,featured_files 是声明的子集而不是全部文件。
test_compute_durability.py 远程任务的寿命超过 daemon。行在提交前写入,receipt 挺过重启,reconcile 只报告不重提。
test_secret_broker.py 凭据只以不透明引用出现;auto fail closed 而非降级;环境注入只读。
test_secret_canary.py canary 断言密钥的字节而非字段名——denylist 在有人加字段的那一刻就会 fail open。
test_schema_migrations.py 数据库要么完全在版本 N,要么完全在 N-1。任一步失败整组回滚,且 DDL 确实是事务性的。
test_data_dir_permissions.py 凭据库不可被同机其他账户读取,含 WAL 伴生文件。
test_sandbox_grants.py 预览签名凭证绑定非空会话、主文档版本、精确使用源、唯一签发祖先与期限;拒绝篡改、过期、异机密钥、畸形 Host、同源授权和空范围。
test_security_headers.py 应用外壳和普通 Artifact 路由保持严格策略;可执行 grant 响应仅允许签发源为祖先,JavaScript 字符串编译只在固定的 Ketcher 编辑器文档中放行。Artifact 字节以 inline 标注其路径最后一段作为文件名,并去除控制字符、格式字符与引号。
test_local_jobs.py 取消本地后台任务是真的停下来:死掉的是整个进程组而不只是外层 shell;停不掉的时候如实报错,而不是报告成功。
test_compute_job_races.py 终态由账本说了算,并且如实告诉调用方:cancel/close 输掉 compare-and-swap 时返回真正落盘的状态,持久化失败绝不被吞,双线程竞态后内存、SQLite 与返回值三者一致。同时用真实 sh 执行 harvest 脚本,证明 residency: remote 的产物根本不会被打包。
test_byoc_confinement_scope.py 边界放行了什么。允许名单曾经写的是 helper 包的父目录——源码安装下就是仓库根——所以这里真的构造一份 Seatbelt profile,再让一个真实进程隔着它去读 pyproject.toml、列目录、列 .git。此外:available() 必须真的建立一次边界而不是问 which,结论可以缓存但不能跨越后端变化,doctor 必须和 runtime 描述同一份 posture。
test_evidence_walkthrough_provenance.py 一个由四次独立检索拼出来的 artifact 需要四份溯源信封。只挂第一份,等于让另外三个 accession 待在一个「专门用来保存它们证据」的文件里,却没有 request URL、检索时间和响应哈希——看起来有溯源,比干脆没有更糟。这里把聚合信封真的过一遍仓储层,再把每个 accession 追出来。
test_env_kernel_binding.py 内核看不见的环境事务不算事务:apply 之后真起一个 worker 跑一个真 cell,sys.executable 必须等于当前 generation 的解释器;rollback 之后必须换掉。同时钉住:没有真正执行过的解释器不得被指向,plan 与 apply 之间被改过的 spec 必须被拒。
test_llm_transport_typed.py 429 携带状态码与 Retry-After 并在有界预算内重试;已提交输出的流绝不重试。
test_llm_transport_wiring.py 真实 chat() 能触达 typed transport:错误带上 provider 名,Stop 能打断退避,同时注入的四参数 transport 仍然可用。
test_llm_system_placement.py 只有开头的 system 消息成为初始 system 字段,压缩摘要不会侵入缓存前缀。
test_startup_no_implicit_install.py serve 只诊断环境,绝不修改它。
test_startup_no_implicit_side_effects.py 全新数据目录上启动:不建立任何出站连接、不拉起任何子进程、不执行任何 cell、不落任何会话——在 socket.connect 与 subprocess.Popen 两个边界上设卡,并以 OPENAI4S_SEED_DEMO=1 作为正向对照。
test_unstarted_worker_admission.py 线程根本没起来的 worker,不能把整个会话一直占着;而且这套回滚本身出错时也得撑住:ticket 要释放,job 要真正终结而不是只从登记表里抹掉,plan 行要回到它自己那条路线还能重新认领的状态,并且整个过程不依赖去渲染一个可能拒绝被渲染的异常。
test_update_contributors.py Community Contributors 生成器会把已公开署名的非 commit 贡献者保留在按提交数排序的 API 用户之后,按登录名大小写无关地去重,并拒绝同时出现在排除名单里的署名登录名;API 返回空时仍会失败即拒绝,不会把贡献者墙改写成只剩维护名单。头像临时刷新失败时会保留该现有贡献者已提交的 PNG,同时继续清理已离开的身份,并如实报告本次刷新了 0 张而不是给出一个看起来正常的数字。断言直接写出署名登录名字面量——从被测常量反推出来的期望,在该常量为空时同样会通过。另外钉住两处链接完整性回归:登录名大小写与已提交文件名不一致时,文件会被保留、并回退到远端头像,而不是为一个刚被清理掉的文件写出本地 <img src>;以及未鉴权的 github.com/<login>.png 回退路径不会把仓库 token 带过那次跨主机跳转。
test_diagnostic_archive_boundary.py 可分享的诊断 ZIP 里不会带出任何未知内容:归档边界默认拒绝,结构化日志行只保留通过校验的元数据,非结构化行只保留条数、分类和指纹。
test_diagnostics.py 诊断包可以安全贴进公开 issue,包括夹在日志句子中间的 token。
test_diagnostics_routes.py Web 诊断路由:未认证 401、成员 403(同一状态码/大小/文件名,绝不是 404 或 429)、管理员 200;页面加载 GET 不新增网络连接、子进程或 Store/config/bundle 写入;ZIP 对 canary 零命中;下载完成、断连、异常三条路径临时文件都回到基线。
test_evidence_verification.py 导出的包无需 daemon 即可校验,四种篡改都被抓到——含 payload 与其记录 hash 被一起改写。
test_observability.py correlation ID 与按形状脱敏的结构化日志字段。
test_doctor.py openai4s doctor 不依赖 daemon 就能跑,能区分「降级」与「无法进行」,退出码即结论,且绝不打印任何凭据值。它从不升级自己所诊断的数据库:schema 较旧记为待升级(warn),旁边留着升级前备份记为未完成的升级(fail),Store 打不开时也没有任何检查报告 ok。
test_endpoint_probe_guard.py 托管端点的就绪探测允许打到哪里。register 直接采用 spec["url"],只有在没给的时候才回落到 loopback——也就是说探测目标是 agent 提供的;而 probe_ready 对它直接 urlopen,没有任何防护。一个 cell 可以把端点注册到 169.254.169.254、或守护进程能到达的任意主机任意端口,然后调用 probe,从返回的布尔值里读出「在不在」。这是探测器而非数据外泄,但端口扫描本身就是一种真实能力。这个修复很容易往反方向做错:托管的本地端点本来就是 loopback,一刀切地拦截会连正常情况一起拒绝。豁免的只有这个守护进程自己分配的那一个地址——而不是「放行 127.0.0.1」,后者恰恰就是本地端口扫描,测试会在这种放宽上变红。
test_env_provenance_confidence.py 环境面板给出的说法,与那一行数据能支撑的说法是否一致。env_snapshots 里有两列专门用来限定这个说法:generation_confidence(值为 verified 时表示快照的地址里含有它的 generation,因此后来的内核不可能共用这一行)与 provenance(回落路径自己写下的理由)。加上 confidence 列的那次迁移在自己的 docstring 里写着「需要确定性的读者按这个标签过滤」——结果没有任何读者这么做:app.js 里出现次数为 0。面板只区分了 captured 与 live 两种,于是每一个 captured 快照都渲染成「已记录于该产物生产时的内核环境」,包括那些 store 已明确标记为无法支撑这一说法的行。这是 capture_environment 当初所修问题在展示层的翻版:错误的溯源比缺失的溯源更糟,因为它会被相信。两侧都验:payload 确实带上了这两个字段,以及真正发布的那段分支被抽出来放进 node 里跑——只验一侧都会在面板依然出错的情况下通过。
test_error_envelope.py 统一的成功/错误信封,稳定错误码与 request id。
test_compute_task_centre.py 在不额外花钱的前提下查看远程任务。远程任务的寿命长过发起它的那一轮、内核和守护进程,但那份持久记录原先只能从 cell 里够到——一个 GPU 任务跑了两小时的人根本没地方看。这个页面不能轮询,因为探测即回收:result() 会去联系远端,而联系远端就会把文件拉回来并结束任务,于是自动刷新的页面等于在没人看着的会话里做回收。验证这一点的用例读的是模块的 ast 导入,而不是它的文本——第一版直接 grep "ComputeManager",结果被那段专门解释「为什么不用它」的 docstring 判了失败。此外还覆盖跨会话不可枚举(不列出、不计数、也不说「已隐藏」)、重启后仍可读、unknown 绝不渲染成失败(任务可能还在跑、还在计费),以及 pid、sandbox 句柄和集群路径不会出现在投影里。
test_compute_owner_and_harvest.py 两个 compute 缺陷。幂等键命名空间是全安装级的,而 compute_jobs 的其他所有视图都按 owner 隔离,因此一个 session 的 key 会阻塞所有其他 session,并且重复提交的拒绝信息把对方 session 的 job_id 与状态直接交回——正是 for_owner 自己的 docstring 点名的泄漏形状。索引现在按 owner 隔离并使用 COALESCE(owner_key,''),因为 SQLite 把 NULL 视为互不相同,而 NULL 恰好就是 CLI 行。另外 compute_result 没有声明 writes_files——而这正是 Web wrapper 唯一判断的属性——因此原生路径收割 N 个文件产生零个 Artifact version,而内核内路径却是正确的。
test_materialisation_atomicity.py 两条写入路径都在已经销毁字节之后才执行仍可能拒绝的检查。物化把借用方 session 的可写 live 文件硬链接到源 session 的不可变快照,因此一次普通写入就改写了另一位项目成员被冻结的 provenance,并让其校验和描述一份已不存在的字节——这是实测的,不是推理的。它还信任 is_file() 后再 copyfile(),因此同长度快照换名可让恶意字节继承可信记录的校验和。现在任何修改前都先经过共享 held-FD 验证器,目标两份文件都是私有持久副本,所有拒绝都留下零行、零文件。
test_public_exception_projector.py public_failure 是一个信封:它装饰 payload already 携带的消息而从不改写它,这对作者手写的拒绝信息是正确的,却留下了它自身无法封堵的一个缺口——把 str(e) 放进 payload 的 except Exception 同样会得到这份体面的处理,于是凭据、绝对路径和 shell 命令就带着一个 code 一起发给了客户端。修复方式是在异常边界上做投影;在信封里做过滤则不得不猜测哪些消息是安全的,而它会朝着毁掉那些好消息的方向猜错。
test_token_mint_atomicity.py 首次运行的令牌铸造是先检查后动作,随后是一次无条件的 os.replace,因此并发的守护进程各自覆盖令牌文件,而失败者的重新读取处于任何互斥之外——存活者可能授权一个已不在磁盘上的令牌。用真实进程而非线程来制造竞争:线程共享 GIL,恰好会掩盖这一点。
test_plan_resume_claim.py paused → executing 是先读后写而不是 compare-and-swap。在未打补丁的代码上实测:两个并发的 POST /plan/resume 得到 CODES [202, 202] 与 TURNS 2——同一批步骤执行了两次。现在由 UPDATE 自身的 rowcount 决定认领,而不是重新读取。
test_mcp_lifecycle.py 每一类 MCP 故障都会把子进程留在原地。initialize 失败会从构造函数中逃逸,因此该对象在缓存中不可达,每点击一次「Test」就泄漏一个进程和两个 reader 线程。没有任何故障会触发驱逐,因此关闭 stdout 的服务器会永久污染其 connector id——五次调用、只有一个 pid。_abandoned 每收到一个未被应答的请求就增长一条,而只有服务器愿意应答时才会被清理。stderr 使用无界 readline,因此一行 20 MB 且不含换行的内容会被完整保留,并在有人截断它之前再复制一份。而当孙进程持有 stdout 写端时,close() 会永远挂起。
test_check_css_tokens.py F-21:style.css 里 var(--x) 引用集减去 --x: 定义集为空;检查器对空洞失败、对已修文件通过;:root 与 dark 都声明 --text-100/--text-300/--surface-0/--warn;深色逗号泄漏已修;markdown 表格包在 .md-table-wrap 里;≤900px 触摸目标 ≥40px;八条死规则已删。
test_ci_gate_independence.py 每道已声明门禁(包括 Linux private-PID 中断冒烟)都必须独立失败。曾有四道其实是别的 job 里的 step——check_directory_readmes 排在 pre-commit 之后,harness 和两个 response capture 排在 pytest 之后。step 只在前面所有 step 都通过时才运行,所以只要有一处无关的红,这四道门根本不可达;而一次显示“测试失败”的运行,与“goldens 也漂了、response contract 也动了”的运行在结果页上一模一样。断言打在解析后的 workflow 图上,因为没执行过的 step 在工作副本里观察不到。
test_skills_installer_contract.py npm 安装器契约中位于语言边界这一侧的那一半。tools/skills-installer/ 由它自己的 Node 自测把关,而那份自测看不见这些:skills/ 里新增了一个没有 SKILL.md 的目录、package.json 下的 bin 路径被改名、files 的 glob 不再匹配——最后一种会发布出一个能运行、却找不到任何内置 Skill、于是每次安装都退回去下载 100 MB 源码 tarball 的命令。刻意用纯 Python 断言:一个 shell 调用 node 的测试,在没有 Node 的机器上会以跳过的方式汇报成功。已跟踪文档中每一个 openai4s-skills@X.Y.Z 安装版本都必须是 PUBLISHED_NPM_VERSIONS 中列出的已发布版本;package.json 最多只能比该列表领先一个发布步长(最新已发布版本之后的下一个 patch、minor 或 major 版本),因为 npm publish 从那里读取版本号。
test_channel_counter_contract.py 七个缓冲区会为守住预算丢弃输入,其中两个什么都不报。host.bash 把 stdout 截到 30,000 字符后返回尾部,并在审计里记下 chars: 30000 和这段尾部的 sha256,充当该命令的 stdout 摘要——与一条恰好打印 30,000 字符的命令无法区分,而 len(stdout) 同样分辨不出。单一定义放在 execution/budget.py,并以“不存在”的形式断言:任何生产者都不得自己拼写计数键。
test_producer_output_budgets.py stdout 在生产端有界;stderr 与 traceback 却是先完整累积、再在构造响应时截断,因此界限约束的是返回内容而不是分配量。在打了补丁的 worker 上实测:stderr 峰值 452 MB → 3.3 MB,traceback 122 MB → 4.3 MB。R 的错误字符串则完全没有上限。
test_workspace_streaming_budgets.py save_artifact 仅仅为了计算哈希就把整个 artifact 读进守护进程,因此注册一个大型科研输出会让守护进程 OOM;read_file 与 edit_file 以 O(file) 分配且没有字节预算;list/glob 会先对整棵树排序再截断。现在改为带真实预算的流式处理,并返回结构化计数。
test_local_job_envelope.py 本地 job 直接继承了守护进程的完整环境——Popen 上没有 env=——因此守护进程持有的每一个 provider API key 都会进入每一个 job,而 build_kernel_environment(内核管理器、动态工具与 preinstall 都在调用它)却闲置未用,并且架构文档还声称子进程环境是重建而非复制的。它还使用 bash -lc 这一会 source 守护进程从未见过的 dotfile 的登录 shell;在创建线程与进程之前不统计活动 job 数量;并且用 normpath 限制 cwd,而这是词法层面的,因此 jobs 根目录内的符号链接可以逃逸出去。断言的是子进程实际能读到什么,而不是调用了哪个函数。
test_local_job_lifecycle.py 本地 job 生命周期里没人负责的那一半:结束。此前完全没有 deadline——并发上限约束不了时长,八个 job 可以永久占住机器——也没有 close(),守护进程退出后进程组仍在运行、被 reparent、stdout 管道关闭,且没有任何记录说它们存在过。输出上限被施加在它本应阻止的那次分配之后,因为读循环是 readline():一整行一 GB 会先被完整地materialize 出来。测试记录并断言读循环真正向内核索要的 chunk 大小,因为只看幸存缓冲区无法区分修复与缺陷。此外还覆盖 timeout 与 abandoned 两个不得借用 failed/cancelled 名义的终态、让重启后的守护进程能说出它当时持有哪个 job 的收据,以及 str(e) 与 OSError 的路径都不会进入 job 日志或提交拒绝。
test_model_profile_identity.py 被 pin 的 session 仍有三条途径会派发到 pin 未指定的地方。_pinned_llm_config 优先使用 st.model——即请求里的裸 model 字符串,而浏览器在每一条消息里都会发送它——因此 provider、endpoint 与凭据来自 pin,而模型名来自顶部选择器:这是一个在任何 profile 中都不存在的配置。它还会在密钥被吊销时、以及任何异常时返回 None,随后调用方就使用当前处于激活状态的那个 profile:记录为 A,实际执行为 B。而删除会硬删除该行以及历史所依赖的 revisions,然后把每个 frame 上的 pin 置空,于是下一次发送就静默地重新 pin 到别处。
test_contract_inventory.py 每个对外 route 与 event 都被契约清单覆盖。
test_frame_pagination.py 会话列表的 keyset 分页。
test_ws_resume_cursor.py 单调事件序号,以及重连客户端可用的 resume cursor。
browser_admission_fault.mjs 只有浏览器能证明的那条:页面丢掉了自己的应答之后还能自恰。POST 真的打到 daemon 并成功,只有返回的响应被销毁,所以这一轮是真的被接受了。刷新之后,页面必须凭它在发出请求之前就存好的 id 去和服务端对账——既不能重发这一轮,也不能把正在运行的那一轮已经带走的批注重新标成待发送。
browser_matrix.mjs 工作台在三个引擎里被真实驱动,而不只是那个友好的。一个在 Chromium 正常、在 WebKit 悄悄失败的渲染器,对用它的那一半用户来说就是坏的产品,而只有真实引擎能说清是哪一半。
test_benchmark_workflows.py 带版本的工作流基准真的会跑:../workflows/ 里每份清单都能加载、每个 step 名都能解析,声明结果与观察结果双向比对——期望 failure 的用例在跑出干净成功时判失败。它还用版本加规范化 digest 冻结 Stage 0 验收 manifest,在执行前拒绝调用方删减 probe 或弱化嵌套期望的 pack,检查精确的 claim/execution/断言结构,证明失败的 Cell/Reviewer/duplicate 尝试仍留在分母中,让观测到的 Reviewer workspace 写入打红冻结 contract,将离线 contract 指标与零样本为 null 的 live observation 从结构上分开,遵守 production 全局 network deny,并验证真实 loopback Ketcher 探针不会从 CLI 流泄漏临时凭据。
test_benchmark_bringup.py 工具 bring-up 契约校验器的单元测试:自证封印、权重摘要与大小、canary 解析与下游消费证明、准入、预算与路径限定——篡改形态按隐蔽程度排列,直到只有评估方持有的参考摘要才能识破的全量伪造。
test_byoc_confinement.py 从内部检验边界。家目录不可读、stage 目录是唯一可写处、解释器仍能启动——以及 keychain 不可达,这一条并不能由文件系统不变量推出,因为 security find-generic-password 是去问 securityd 而不是读文件。用的是带金丝雀的临时 keychain,绝不碰开发者本人的。
test_compute_harvest_safety.py 远端的字节被允许落到哪里,以及它们不老实时会怎样。被符号链接替换的 harvest 根目录或按任务目录会被拒绝,恶意归档不留下 staging 树,终态任务复轮询返回已记录的证据而不是重新收割,带上限的传输按实际传输字节中止而不是按远端自称的大小。
test_compute_lifecycle.py close() 不是「写个 cancelled」的同义词:它必须真的向远端发信号、不得声称一次它没能送达的取消、并且必须终止一个它只从任务行里知道名字的 sandbox。同时钉住恢复按所属会话隔离,使重启不会把一个会话的任务——及其回收产物——交给另一个会话。
test_compute_output_caps.py daemon 被允许为一台它不控制的远端分配多少内存。用真实子进程驱动,因为对着 BytesIO 断言只能证明算术,证明不了管道、线程和死锁:stdout 洪水、stderr 洪水、双流同时洪水,以及一个必须抛 TimeoutExpired 而不是挂死的卡住命令。
test_env_generations.py 把环境变更当事务——plan 不动任何东西、失败的 apply 保持当前环境原样、rollback 只是移动指针——并且指代 generation 的 id 被限定在它自己的环境内,因此 rollback python ../../r/generations/env-R 无法把 Python 指向一个 R 前缀并把溯源标成 Python。Stage 1 还证明 --repair 即使 spec 未变也会构建新 generation,而且必须等真实 Python/R 解释器与完整 standard 包清单验证通过后才能移动 pointer。
test_preinstall_probe_confinement.py 被探测的解释器是外来的:恶意 .pth 或 sitecustomize 会在探针自己的代码之前运行。所以探针在受限环境中运行、环境变量被清洗,且在 enforce 下是拒绝而不是降级。它还在自己的空目录里运行,而不是 daemon 的启动目录——python -c 会把后者放在 sys.path 最前面。超时的探针会连同它拉起的一切一起结束,包括离开了其进程组的子进程;通过 stop 事件停下的探针会立即结束,而不是等那个子进程占着的管道,并杀掉该子进程、删除工作区;在启动之前就被停下的探针什么都不会运行。
test_release_pipeline.py 不真的发一次版就把发布流程测了。GitHub 翻牌是最后一步且在 PyPI 拿到该版本前拒绝执行;staging 运行不重新构建;磁盘镜像凭证据判定已签名而不是凭一个配置变量;草稿必须与 PyPI 携带完全相同的分发件,双向成立。
test_release_rehearsal.py 非发布演练契约:publish=true 不能冒充演练,macos_asset=omit 不能携带 DMG,被跳过的 3.14 check 不是 attestation,缺摘要被拒绝,Linux 的 ci_attestation/release_reexecution 不能压成同一个扁平的 passed+unproven 状态。
test_progress_document.py docs/next-version-progress.md 是按小节编号来引用的——文内就有 §6、§12、§13、§15——而它曾经有两个 ## 15,中间还夹着 ## 16,于是一个引用有两个可能的落点,顺着读的人会落到错的那个。它的最后一节还落后代码树 67 个非合并提交;落后到这个程度,读起来不像“还没写完”,而像“之后什么都没发生”。现在编号必须是 1..N、唯一、递增,每个 §N 都能解析,并且文件必须写出 plan-crosswalk.json 的审计提交——这样两份文档就不可能在描述不同的树。它还要求本文件最后写明的 crosswalk 分布与 crosswalk 的真实计数一致,因为 §8 的「没有 open 行」在一行 P0 被重新打开之后仍然留在原处。
test_query_authorizer_lifecycle.py Connection.set_authorizer(None) 从 Python 3.11 起才会移除授权器,在 3.10——本项目声明的下限——上不会:它留下一个背后没有可调用对象的 C 跳板,SQLite 把它读作 SQLITE_DENY。Store 只有一条连接,于是 Store.query 的 finally 让它在整个进程余下时间里拒绝一切:一条 agent SQL 之后,普通的 new_frame 就抛 not authorized。CI 上 19 个测试如实报告了这件事,却被当成 py3.10 的怪癖。注意其证伪只能在 3.10 上看到——在 3.11+ 上旧写法本来就是对的。
test_plan_crosswalk.py 计划里 56 条原始提案每一条都必须恰好有一个被记录的去向,因此 crosswalk 是数据、本文件是校验:56 个唯一的 (source, original_id) key 各出现一次、七份来源报告各贡献八条,并且状态词汇被诚实使用——closed 必须指向一个真实存在的测试文件,implemented_unverified 必须写明缺哪一次运行。散文可能多一行重复、少一行,或者对根本没有调用链到达的东西写 Completed,而没有任何东西会发现。状态为 open 的 P0 行必须在 docs/v03-decisions.md 中被点名,因为它意味着 D12 未满足,这必须是有记录的豁免,而不是没人注意到的状态。
test_release_gate_manifest.py 质量收据必须与权威 gate 清单完全一致,并且是通过生产消费方驱动的,而不是单独测清单辅助函数。每个用例都是对一份好收据的一次变异——缺失某个 gate、用重复行把数量补回来、未知 gate、被替换或仅仅多了参数的命令、更旧的 schema 版本、不同的 manifest 摘要、来自另一个提交或被跳过的 check run。旧消费方对这些全部接受,而 test_release_pipeline.py 自己的 fixture 就正是那份伪造件。它还钉住独立的 hosted Linux bubblewrap 中断任务:真实 Python/R 包、强制沙箱、明确 raw-network 例外、Ubuntu 会剥离 worker capability 的 bwrap AppArmor profile 且不得全局放松 userns、精确且不可选的命令,以及将其 check run 纳入发布所需证据。
test_release_docs.py 发布与安装文档必须描述真实存在的发布机制。每项检查都从 workflow 文件或版本声明中读取一个事实,再从文档中读取一个说法,二者不一致即失败。最初几项把可信发布钉在 draft-first 的手动 dispatch 上:docs/release-validation.md 与 .github/CONTRIBUTING.md 曾让维护者手动发布 GitHub Release,这会在 release.yml 运行前就把 release 公开,只剩下什么都不挂载的 pypi_only。版本示例必须写本代码树的版本或 X.Y.Z 占位符。升级相关的检查要求 docs/upgrading.md 及其中文版写明 schema 从 27 升到 32、首次启动前备份、不支持降级,并要求备份容器的 /data 卷(目录从 Dockerfile 读取);「迁移成功后删除升级前副本」这一说法从 migrations.py 读取,一旦改为保留副本,就会在两份文档都更新之前失败。future-schema 那段必须说明 0.2.0 早于这道拒绝。平台相关的检查读取 release.yml、publish-image.yml 与 ci.yml:只要 DMG 默认被省略,任何安装文档都不得在 releases/latest 链接附近写 macos-arm64.dmg,platforms.md 也不得声称发布了已公证的镜像;只要每次发布都会挂上 Windows zip,两份 README 安装章节里就不得有任何一句话把 Windows 与推迟发布的措辞放在一起,换一种说法也会被发现;Windows 已知限制必须披露一致性审计最后一节「修复验收记录 — 2026-09-07」仍未验证的范围(Windows 整机重启、Conda 环境准备、真实供应商登录、未通过的完整浏览器 smoke、WSL 服务超时),以审计原文为键,且不得再使用已被取代的「WSL 或 Windows 重启」清单;已发布的 ghcr 镜像必须被写明;workflow README 两个语言版本不得把完整的 Linux 边界 smoke 说成手动执行。
test_response_contract_coverage.py 每个对外 route 都有响应契约,而且这份契约就是该 route 真正产出的那份——与服务端脱节的覆盖文件描述的是一个没人在发布的产品。
test_response_contract_downloads.py 成功时返回字节的那几条 route,以及唯一一处没套信封的拒绝。notebook 导出、Session 包和 artifact 下载此前都被固化成 kinds: ["json"], statuses: [404]:无参扫描没有东西可要,而四个未实现的动词照样产出那个 404,于是覆盖门把一个下载端点算作已覆盖,客户端真正依赖的东西却哪里都没写下来。PATCH\|POST\|PUT /annotations/<id> 用 {"annotation": null} 回 404,是这张表面上唯一落在 PublicFailure 信封之外的拒绝,前端 api()(它用 j.error 构造错误)因此报出一个什么都没说的失败。