验证¶
验证基线:18aa9af2b2c26fd114113dd39528a91224801840(获取自 main)。
在实现工作树上执行:先运行 npm ci、npm run build 和 npm run test:prepare;以下每项检查均按本次运行中写下的命令执行。构建的分组项目和构建的 CLI 检查均针对最后一次源代码变更后重新构建的 dist/ 运行。
npm run check:fast:类型检查和 lint 通过(2 项任务成功)。npm run format然后npm run format:check:所有 4028 个匹配文件均使用正确格式。npx knip:通过(退出码 0,未报告未使用的文件、导出或依赖项)。npm run check:ci:tasks:类型检查、lint:built(3730 个文件,0 个错误)、format:check、knip、metadata:check、jscpd(3140 个文件中有 3.35% 的重复行,2581 个克隆,低于 3.5% 阈值)和技术债务标记扫描均通过(8 项任务,其中 3 项从该工作树的缓存重放)。npm run docs:check:六项内置文档检查以及 README 一致性符合性测试(5 个测试)通过;没有受跟踪的生成文件发生变化。npx vitest run --project domain --project services(完整源码组):312 个文件,5412 个测试通过,3 个预先存在的跳过。npx vitest run --project cli-boundary(完整项目):111 个文件;659 个测试通过,2 个预先存在的跳过,8 个失败,涉及三个不驱动任何 analysis-view 命令的文件(closedStdout、commandFinalizationCancellation、javascriptApplicationJsonOutput)。在该工作树上单独重新运行时,三个 WASM 中断用例和四个 JavaScript JSON 输出用例均通过,只有closedStdout的“流式 JSON 期间读取器关闭时静默停止”(inspect-sqlite-database)以退出码 1 而非 141 退出。对 18aa9af2 的干净导出(git archive、全新npm ci、npm run build、npm run test:prepare,不包含该切片的任何内容)运行这同一三个文件,恰好复现了那一个失败,并通过了其余 16 个测试,因此这八个失败没有一个可归因于该切片,且此处均未修改。npx vitest run --project mcp-boundary(完整项目):153 个文件通过,2 个预先存在的文件跳过;901 个测试通过,7 个预先存在的跳过,无失败。npx vitest run --project acceptance(完整项目):123 个文件通过,1 个预先存在的文件跳过;608 个测试通过,13 个预先存在的跳过,无失败。- 构建的 CLI 在 28 条记录的 Grafana 形状捕获上进行了端到端测试:先运行
inspect-web-network-capture ... har --format json,然后运行inspect-analysis-view,分别使用environment-manifest,在启用和不启用三个选择加入规则的情况下各运行两次,并使用api-surface各运行两次。不启用规则时,22 个工具模板加上 3 个主来源排除项等于该来源上的 25 个 api-surface 组,并且每个path_template都等于其api_surface_template;启用规则后,/api/dashboards/uid/{uid}、/api/folders/{uid}(观测值fg1jo91e57e2ob和general,记录 12 和 13)、/api/plugins/{plugin_id}/settings和/api/datasources/uid/{uid}/health出现在 19 个工具中,共 13 个模板化组;normalized_result和evidence_id在每种视图的两次运行中完全相同;记录仅携带指针键;未出现任何记录的 body 或 query 值;存在三个未知项和view_digest;置信度为inferred,权威来源为historical-reference。 - 构建的 CLI 在扩展了
GET /api/teams/search和GET /api/teams/mine的同一捕获上运行(30 条记录),三个规则全部选中:/api/teams/{numeric}仅保留观测值1,get_teams_search和get_teams_mine仍然是各自的工具;共 21 个工具,13 个模板化组。
独立审查¶
在各自所属边界修复的发现:
- 记录到的 JSON body 中的
__proto__键变成了原型属性而非自身属性,随后 schema 克隆在静默中将其丢弃。manifest 累加器使用Object.fromEntries构建 body 形状,会省略该键,并将这一省略作为限制说明;一个 domain 回归测试覆盖了此问题。 - 契约示例包含一个 readonly 元组,而可变的 JSON 示例类型拒绝该元组;示例现在保留一个字面量类型的可变元组。
- 将字面量同级折叠进已模板化的位置时,采用了最早组的组成部分,因此在 token 之前记录的字面量会保留其字面量、丢弃参数,并在一个不匹配的模板下声称拥有该 token 的记录。
mergeGroups现在以模板化组作为组成部分的形状,而最早组仍负责命名api_surface_template、body_shape和记录顺序;一个字面量先记录的 domain 回归测试覆盖了此问题。 - 请求体解析此前接受
text/plain和text/markdownbody;现在只接受application/json和application/*+json,并且捕获指南说明了最早记录规则;一个 domain 测试覆盖了这两种媒体类型。 template_rules中的重复条目此前会被接受、回显并哈希到view_digest,而累加器会对其去重;请求 schema 现在以template_rules must not repeat a rule拒绝重复条目。- sibling-variance 折叠此前会将不符合规范的字面量吸收进由四个格式规则之一产生的参数中,导致
/api/teams/mine成为/api/teams/{numeric}的观测值,发布后的规则不再描述每个观测值。折叠现在仅限于选择加入规则产生的参数;格式规则参数的字面量同级仍保持为各自的工具,或者仅在类似标识符的情况下才在sibling-variance下彼此合并。一个包含/api/teams/1、/api/teams/2、/api/teams/search和/api/teams/mine的 domain 测试、捕获指南和规范共同说明了该规则;上面的构建 CLI 检查对此进行了演练。
托管通道¶
real-web-network-captures(托管的 ubuntu-24.04,工作流运行 https://github.com/earakely-scale/rea/actions/runs/39097105064,位于 2d95597f 的 fork 上)通过,其中scripts/verify-web-network-captures.mjs的 manifest 块针对该通道的 producer 和 mitmproxy 捕获执行。61d35369 的首次运行仅在该块中失败:拒绝检查将整个 MCP 结果字符串化,因此声明的[字面量与结果封装匹配;后续版本像 api-surface 分支那样比较解析后的拒绝结果。
范围与测量限制¶
macOS /usr/bin/time -l,仅命令记帐:npm run check:fast 报告 5.23 秒已用时间、24.20 用户态秒和 2.92 系统态秒,最大 RSS 为 4,449,140,736 字节;npm run format 为 0.74 秒已用时间、4.14 用户态秒和 0.73 系统态秒,最大 RSS 为 223,363,072 字节;npm run format:check 为 0.66 秒已用时间、4.03 用户态秒和 0.61 系统态秒,最大 RSS 为 218,759,168 字节;完整源代码组报告 25.10 秒已用时间、67.26 用户态秒和 2.72 系统态秒,最大 RSS 为 2,659,172,352 字节;npx knip 为 3.68 秒已用时间、5.24 用户态秒和 0.70 系统态秒,最大 RSS 为 865,599,488 字节;npm run check:ci:tasks 为 4.65 秒已用时间、15.03 用户态秒和 4.36 系统态秒,最大 RSS 为 843,333,632 字节;npm run docs:check 为 3.61 秒已用时间、3.81 用户态秒和 0.99 系统态秒,最大 RSS 为 289,472,512 字节;完整 cli-boundary 项目为 425.66 秒已用时间、703.52 用户态秒和 206.77 系统态秒,最大 RSS 为 630,456,320 字节;完整 mcp-boundary 项目为 164.19 秒已用时间、302.85 用户态秒和 47.08 系统态秒,最大 RSS 为 4,457,529,344 字节;完整 acceptance 项目为 960.25 秒已用时间、1520.91 用户态秒和 520.68 系统态秒,最大 RSS 为 800,063,488 字节。npx knip 在 cli-boundary 项目执行期间运行,而干净 18aa9af2 导出的 npm ci、构建和测试准备与 mcp-boundary 及 acceptance 运行重叠,因此这些已用时间数值包含了宿主机争用。Token 使用量和完整进程族峰值尚未测量。本地真实工具验证在 macOS arm64 上运行;托管 Linux 通道的结果记录于上文。
针对 PR 的自动审查结果(2026-10-18)¶
Codex 和 Greptile 在 morluto/rea#4954 的 b6d18d23 上留下了七条内联审查意见;每条都已对照代码进行核对,并在一个后续提交中处理,且在行为可观察处添加了回归测试:
- 请求体形状遍历了嵌套值(两位审查者均指出,P1):
#bodyShape将文本传给inferJsonShape,后者按节点复制的路径随深度平方增长,因此一个很小的深度嵌套请求体就可能超出其预留预算。现在读取器仅解析一次,并从解析后的对象中读取顶层键类型;一个测试喂入 2,500 层嵌套请求体,并取回四个顶层类型。 - 字面量路由段未被纳入(Codex,P2):一条包含许多短字面量段的路径,每段都会物化一个 part 对象而不计费。现在在创建分组之前,每个路由段都会被计费;一个测试显示在 1 MiB 预算下,5,000 段路径被拒绝,而 100 段路径被保留。
sibling-variance在每个位置基于整条路由重建键(Greptile,P1):不再比较超过 32 段的路由,manifest 在限制说明中注明了这一点;测试显示两条 39 段的 sibling 未被合并,旁边的一组短 sibling 则被合并。after-uid-literal将停止词模板化(Greptile,P1):该规则现在会跳过这些词;一个测试将/api/items/uid/search保持为字面量,并放在/api/items/uid/{uid}旁边。- 工具名后缀在每次冲突时都从 2 重新开始(Greptile,P2):注册表现在为每个基础名保留下一个后缀;一个测试将 300 个带点字面量投影为
get_item、get_item_2以至get_item_300。 - 当两个组打印同一行时,排除行可能丢失其模板化标志(Codex,P2):该标志现在取两者的逻辑或。该场景需要一个拼写为
{numeric}的字面量段,而 WHATWG URL 解析器会在记录的路径中对其进行百分号编码,因此没有捕获能到达它;这一行防御性代码得以保留,但未添加测试。
变更后的检查:oxfmt --check . 通过;tsc --noEmit 通过;npm run lint 和 verify:module-boundaries 通过(#append 上的复杂度警告早于本次变更);npx knip 无发现;npm run jscpd 3.35% 重复行;scan:todos 无;verify:test-discovery 1,580 个文件各一次;针对 view、accumulator、JSON-shape 和 contract 示例测试的 vitest run,4 个文件中 32 项通过;针对分析视图的 service、CLI 和 MCP 边界测试的 vitest run,3 个文件中 73 项通过。
第六条自动审查意见(Codex)是在协作者合并 main 之后处理的:sibling-variance 在任意一个字面量携带数字时会合并整个桶,因此 /api/items/mine 可能被折叠进 {item_id}。该规则现在对桶进行分区,只合并标识符类似的 sibling(每个都含数字或冒号,或在复数字面量下有三个及以上带连字符的名称),其余字面量保留为各自的工具;仅使用该规则时,测试夹具因此会将 /api/folders/general 和 /api/folders/fg1jo91e57e2ob 分开,而三条规则共同作用时仍会通过不透明令牌参数将 general 折叠进 /api/folders/{uid}。测试:新增的分区用例和更新后的单规则表。
后续的混合队列回归测试在 dd87f54e 上复现了两个遗漏(对应 main 8307ea37):两个编码 sibling 阻止了三个符合资格的带连字符 sibling 加入参数,而在三个带连字符 sibling 合并时,一个编码 sibling 被遗漏。现在,资格判定归属于一个组合了两种合格队列的 Set,然后再检查最小分组大小。消费者复用了该 Set,并一次性物化其合并顺序。三个用例覆盖了这两个遗漏,并保留了至少三个连字符 sibling 的最低要求——当只有两个带连字符 sibling 伴随编码标识符时;mine 和 search 仍保持字面量,且每条源记录仍得到表示。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea