跳转至

验证

已验证提交:3c2a8db2,此增量基于 environment-export 增量(481c9883)。

门禁检查

在该代码树上使用 macOS 26.5.1 和 Node 22.23.1 运行:

  • npx tsc --noEmit:无错误。
  • oxfmt --check:所有文件均已格式化。oxlint 检查变更文件:无新增问题。 npm run verify:module-boundaries:检查了 2133 个文件。
  • npm run jscpd:重复行 3.35%,无变化。npm run scan:todos:无待办项。 npm run mcp-catalog:check:通过。npx knip:一个未解决的导入,早于本次 变更(#javascript-analysis-worker)。
  • npm run test:prepare,然后 vitest 运行 src/domain/analysisView、src/application、 src/contracts、src/server/environment、tests/conformance 以及 analysis-view、 environment-serve、environment-export 和 browser-scenario 边界测试:共 1946 个测试, 157 个文件,1941 个通过,5 个跳过,0 个失败。

真实浏览器捕获

在 Ubuntu 24.04 amd64 主机(8 vCPU,32 GB)上安装了此提交的 npm pack 产物 (rea-agents-6.7.0.tgz),环境包括 Chromium 155.0.8059.79(位于 /snap/bin/chromium)、 Node 24、Docker 和 agentenv-framework 0.9.1334。下方所有捕获均为 rea capture-browser-scenario 的输出;未记录、限定或编辑任何 HAR。

测试夹具

一个回环(loopback)测试夹具提供了一个页面,页面从 /api/photos 列出照片、三张 PNG 缩略图,以及一个将 JSON POST 到 /api/albums 的表单。该场景等待列表加载,使用 goto 打开 /api/photos/1..3,填写并提交了表单。

  • 捕获:14 个事务,70 个事件,0 个丢弃,权威 controlled-replay。
  • environment-manifest:parent_operation 为 capture_browser_scenario,来源 http://127.0.0.1:3199,置信度 inferred。工具 get_photos(记录 1、9)、 get_photos_by_id({numeric} id,记录 5、6、7)和 post_albums(记录 13,请求体结构 title: string)。页面和三张 PNG 被排除为 ui-page-or-asset。
  • environment-serve:get_photos_by_id {id: "3"} 返回了记录的 JSON,其中 record_ordinal 为 7,exact_match 为 true。
  • POST 的响应体缺失:场景在发送该请求的动作处结束,事务仍未完成,观察器不会读取未完成 响应的响应体。manifest 指出“14 个场景事务中的 1 个未保留响应体”,并且 post_albums 回放了状态 201 且无响应体。以 1.5 秒的 wait_for_timeout 结束场景后,全部 14 个事务 完成,响应体得以保留。
  • 该捕获的 environment-export 写了一个 README,其中包含浏览器场景捕获的名称和场景定义的 SHA-256;agent-env run <bundle> --task smoke 在 30.4 秒内通过。

五个应用

每个环境都运行了 manifest、export、该 bundle 的 smoke 任务以及 6 到 12 个生成的检索任务, 每个任务为两个模型各运行一次,通过 Hugging Face 路由器。

应用 捕获方式 动作数 事务数 工具(规则 / 无) Smoke 任务 检索任务数 gpt-oss-120b GLM-5.3-Flash
PhotoPrism 261007 自托管,无需登录(公开模式) 55 277 13 / 28 通过 10 10/10 10/10
Lychee 6.10.4 自托管,会话 Cookie 由声明的 secret 生成 152 134 15 / 27 通过 12 11/12 12/12
Pinry 2.1.13 自托管,会话和 CSRF Cookie 由声明的 secrets 生成 148 568 12 / 12 通过 6 6/6 6/6
Art Institute of Chicago API 公开,每个 URL 使用 goto 52 26 11 / 12 通过 12 11/12 12/12
Library of Congress JSON API 公开,每个 URL 使用 goto 55 29 11 / 11 通过 12 11/12 12/12

每个场景步骤均已完成,且没有任何捕获丢弃事件。每个自托管捕获都包含通过应用自身表单执行的 一次创建、一次编辑和一次删除;这三个操作都成为带有已记录状态的工具,其中包括一个没有 content type 的 204 DELETE。声明的 secrets 没有出现在任何捕获中;当应用在响应体中回显已声明 的值(PhotoPrism 的会话响应、Pinry 的 owner token)时,捕获中保存的是脱敏标记。

另外尝试了两个目标,并已替换。Met Collection API 投影出 3 个工具:其数据路径为 /departments、/objects/{id} 和一个搜索,数字对象 id 合并为一个工具。NASA Image and Video Library 投影出 16 个工具,但其 Collection+JSON 响应体中的记录字段嵌套深度超过任务生成器所能 读取的范围,因此无法推导出任何任务。

观察到的限制

这些是在运行期间观察到的,且不在本次增量范围内:

  • 场景的最后一个动作可能丢失其响应体,除非场景以等待结束(见上文)。
  • 较大的资产响应体会计入分析视图(analysis-view)预算。一个 Pinry 捕获在 max_network_body_bytes 为 262144 时包含了 12.5 MB 的 Evidence,大部分是在 33 次页面 加载中重新加载的 CSS 和 JavaScript,manifest 视图返回了 resource_constraint。将响应体 限制设为 20,000 字节后,它保持在预算之内。场景没有按来源或媒体类型选择响应体的能力。
  • API 路径之外的图片响应会被排除为 UI 资产,因此只有 API 路径提供它们时,其字节才可回放 (PhotoPrism 的 /api/v1/t/... 瓦片成为了工具)。
  • 在默认的 max_total_event_allocation_bytes 下,一个 PhotoPrism 捕获丢弃了最后 68 个 事务,包括全部三个写入操作,而命令却以 0 退出;64 MiB 时则没有丢弃。
  • 动作没有默认截止时间:两次运行分别等待一个定位器(locator)277 秒和 7.5 分钟,直到被 取消。上述每个场景都在其动作上设置了 timeout_ms。
  • 重定向本身就是一个事务;Django 的尾部斜杠 301 为同一资源生成了第二个工具 (get_pins_by_id 和 get_pins_by_id_2)。

Linux 后续验证

原始 PR 已与当前 main 分支 7a0c47bfa 合并,此前 #4955、#4975 和 #4999 也已合并。来自 main 的导出文件系统所有权、模式、tarball、清理和调用方路径修复均予以保留。默认 MCP 仍为 stdio。

保留父级投影此前会在逐记录预算检查之前解码每个请求体。现在,它会在 schema 验证或解码之前,通过共享的准入所有者保留拷贝/转换后的文本,包括保留父级在内。重放投影会省略仅用于请求体形状推断的请求文本;响应字节仍会经过生产者 schema 的完整性验证。中间投影数组副本和未使用的捕获包装器已移除。Windows 测试清单会将文件系统分隔符规范化为可移植的 bundle 路径表示。CI 会为新投影及其共享准入依赖选择 agentenv lane。

执行环境:Linux x64,Node 24.18.0 / npm 11.16.0,Chrome for Testing 156.0.8078.4:

  • turbo run typecheck lint:built format:check docs:check:built knip artifacts:skills artifacts:mcp-catalog --concurrency=1 --summarize:十一个任务通过,一个已缓存,耗时 210.023 秒 / CPU 209.860 秒 / 进程族峰值 RSS 4562.07 MiB。这第一个完整门禁先于最终的 lint 清理和 CI 选择补充;后续检查已在 PR 上报告。
  • 初始源码验证通过了 13 个文件中的 111 个测试,包括 HAR/清单回归、场景加载/重放/导出以及新的容量/重放模式测试。CI 选择验证通过了 235 个用例。
  • 对源码自有的交互式浏览器网络站点进行的真实公共 CLI 捕获:十个事务、五十个事件、两个工具,无丢弃事件。其 POST 响应通过官方 HTTP SDK 重放了两次,body/status/Evidence 序号及不可信内容 provenance 完全一致。已声明的机密和传输凭据被排除;普通选中的 password 字段值保留在保留的请求体字节中。
  • 在 Chromium 中对三个实时 GitHub API 响应进行的真实公共 CLI 捕获,未使用 HAR:三个事务、十五个事件、三个工具,无丢弃事件。每个响应都通过 HTTP SDK 重放了两次,body/status/Evidence/provenance 完全一致。显式导航等待让响应体捕获得以稳定。完整的双场景捕获/投影/服务任务:22.527 秒 / CPU 16.678 秒 / 进程族峰值 RSS 1397.93 MiB,包括自有的浏览器进程。两个监听器均以退出码 143 退出,新拥有的浏览器配置文件已消失。
  • 在存在 HTTP 环境变量的情况下,同样的两个实际捕获通过 CLI 和官方 SDK stdio MCP 产生了相同的清单结果:2.795 秒 / CPU 2.778 秒 / 476.67 MiB。这验证了适配器对等性,以及默认传输不依赖显式环境 HTTP。

第一个本地探针错误地在 base64 请求体内容中搜索纯文本;其断言已修正为检查解码后的保留字节。后来的 SDK 探针最初从 SDK 根目录导入 stdio 传输,而不是其文档所述的子路径;修正后的探针通过了。早期的实时导航还报告了一个 body-read-failed 响应,投影将其保留为不可用。没有改变任何浏览器提供方行为;成功的运行使用了显式等待。这些早期尝试不计入通过运行。

一项匹配的保留场景投影对比将来自 3aae3579e 的原始辅助函数与后续辅助函数打包在一起,提供相同的 72,771 字节捕获并执行三次 JSON 写入,并完成一次冷启动加 100 次热启动的完整清单投影。两个输出具有相同的 SHA-256 990ac431670374ff68c77a20d77985f626e4681bb0e2f491e5af18f45ce79991。前后进程总计:0.970/0.876 秒耗时,CPU 0.934/0.865 秒,RSS 184.89/184.39 MiB。首个任务:17.378/13.073 毫秒;100 个热任务:261.419/236.131 毫秒。单次样本不足以证明速度或内存改进。bundle 准备被排除;进程总计包含 fixture 启动。CLI、提供方和传输成本不包含在此对比中。

重负载工作在一个 CPU 上由一个测试 worker 串行执行。RSS 每 50 毫秒对采样的进程后代求和,可能会重复计算共享页面。Agent 令牌使用量未被测量。这些后续验证不会重新运行作者的五个应用重建/模型任务,也不会验证 Windows 或 macOS 行为。历史响应重放不会重建应用状态。

一个保留父级反例使用了 128 KiB 投影预算和一个 16 KiB JSON 请求:原始辅助函数将其准入并解码了一次;修复后的辅助函数返回 AnalysisResourceConstraintError,且 UTF-8 解码次数为零。该测试特意使用小预算而不触发 OOM。最终定向验证通过了 242 个测试(包括 235 个 CI 选择用例):41.042 秒 / CPU 40.666 秒 / 进程族峰值 RSS 644.37 MiB。

更广泛的 d2416ca54 回归运行通过了 47 个文件中的 657 个测试,外加十个产品目录用例(295.763 秒 / CPU 293.370 秒 / 进程族 RSS 1921.69 MiB;目录单独检查)。作者随后推送了 655e62334,其中包含脱敏/请求体预算文档以及保留空请求体行为。该提交被保留;后续验证将无请求体/已脱敏观察计入所表示的事务,从而保留完整的请求序号。相关源码运行通过了 14 个文件中的 145 个测试(9.793 秒 / CPU 9.618 秒 / 688.66 MiB)。Docker 执行被固定在该作者更新检查点,因此没有更早的 bundle 归因于新源码。最终提交的检查以及实际场景容器/框架结果已在 PR 上报告。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea