跳转到内容

模块 XVII —— agent 模拟与测试沙箱

模块 XVII 是测试沙箱:它在一个隔离、临时的环境中运行一个 agent 场景, 确定性地重放一个历史会话,并在部署之前比较两个变体。它是模块 XII(评估)的同类——XVII 在隔离中执行并产出输出,XII 衡量它们的质量——且两者解耦:彼此都不导入对方。 本页是沙箱当下所做之事及其诚实限制的参考。

沙箱编目运营方编写的场景:一系列步骤输入,加上一次运行被允许触及的工具与资源的 mock 响应。 一个场景是一个合成夹具——没有机密、没有生产句柄——在被持久化之前被钳制。三种流程在其上运行:

  • 场景模拟 —— 针对其 mock 执行一个场景的步骤,产出逐步输出(可选地针对一个评估套件评分)。
  • 重放 —— 重建一个历史会话的输入时间线,并针对 mock 确定性地重新运行它, 使得相同的输入产出相同的输出。
  • 部署前/后比较 —— 针对一个基线和一个候选变体运行同一个场景,对两者评分, 并连同差量记录一个裁决(improved / regressed / unchanged / inconclusive)。

本模块拥有四个实体:一个可变的 scenario、一个可变的 run(running → 终态)、 一个仅追加的逐步 output,以及一个仅追加的部署前/后 comparison。每次运行都记录哪个 runner 运行了它、该 runner 是否为 isolated、临时状态是否被 destroyed、逐步计数, 以及——若配置了一个 scorer——套件、分数和通过裁决。

隔离是协议契约的一项属性,按运行加以证明,而非一项声称。默认的进程内 runner 在构造上即隔离: 它只接收步骤与 mock 规范,不持有指向存储、网络或任何机密的句柄;一个请求 mock 中不存在的资源的步骤 产出一个确定性的 mock-miss 标记,并且绝不触及一个真实资源;状态存在于该调用中并在返回时被丢弃, 因此该运行记录 destroyed。在运营方置备下,一个 OS 级运行时支撑在同一接口之后—— 一个临时、加固、出口受控的实例,其后端(gVisor 或 Firecracker microVM)由策略选择并由预检门控。 每次运行都记录真实后端及其 isolated 标志,因此一个降级或可移植的后端是可见且可审计的,绝不被隐藏。

沙箱不在事件总线上发出;它产出其他模块在不与其耦合的情况下读取的持久化证据。 它的输出由模块 XII 通过一个仅在组合根中装配的适配器评分——这两个同类共享一份薄端口契约, 而非一次导入。它的部署前/后比较是部署模块用于门控一次提升的决策证据,并且它馈送 XII 跟踪的 回归基线。启动一次运行、一次重放或一次比较是一个特权、租户级、受审计的操作 (editor 及以上可运行;部署比较是一个 admin 决策)。

用 olivares modules on sandbox 启用该可选模块。生成、场景创建和执行需要编辑者或管理员权限;查看者可以检查保存的场景、运行和输出。

创建不含末尾换行的模板:

终端窗口
printf '%s' '{{subject_kind}}:user{{index}}@example.test' > seed.txt

将此合成响应保存为 mocks.json:

[{"resource":"agent:user1@example.test","response":"first synthetic account"}]
终端窗口
olivares sandbox generate --count 2 --seed-file seed.txt -o json > steps.json
olivares sandbox scenarios create --name generated --steps-file steps.json --mocks-file mocks.json -o json
olivares sandbox scenarios run <scenario-id> --variant candidate -o json
olivares sandbox runs get <run-id> -o json
olivares sandbox runs outputs <run-id> -o json

使用创建返回的场景 ID,再使用执行返回的运行 ID。默认 inproc-mock runner 将第一个输入解析为上述响应;第二个返回 [[mock-miss:agent:user2@example.test]]。mock 未命中增加 steps_error,但这是预期合成结果:运行仍记录 status: completed、steps_total: 2、steps_ok: 1、steps_error: 1、isolated: true 和 destroyed: true。它不向真实资源发出请求。本例不请求评分,也不证明操作系统级运行时的适用性。匹配使用精确输入文本,包括模板文件中的换行。

场景、运行和输出在引擎重启后仍可用。关闭模块会移除路由访问,而不删除已保存数据;重新开启恢复访问。这些记录限定到租户,其他组织无法读取。