跳转至

验证

在本分支上于 macOS 使用 Node v22.23.1 执行;该分支的基线是 write-plan 分支的头部提交 ad8f674d。

门禁

  • 以下命令均通过:npm run build:cached、npm run check:fast(类型检查和 lint,变更文件中无新增警告)、npm run format:check、npx knip、npm run scan:todos、npm run docs:check、npm run verify:test-discovery、npm run mcp-catalog:check。
  • npm run jscpd:3776 个文件中 3.45% 的重复行。
  • npx vitest run --project domain --project services:7808 个通过,5 个预先存在的跳过。两个不相关的高负载测试(keyed-archive 遍历、一个有 125,000 个依赖项的 Evidence 图)仅在负载较高的机器上使用更长的超时才通过。
  • 先运行 npm run test:prepare,再运行 npm run test:focused --,覆盖环境 serve 与 export CLI 边界、serve 与 served-writes MCP 边界、analysis-view CLI 与 MCP 边界、compact 输入 schema 边界以及工具 schema 有效性:8 个文件,79 个通过;analysis-view MCP 文件在负载较高的机器上需要更长的超时。

测试

  • 清单:一个没有 body 的 204 写入,无论其 content type 是什么,都会作为工具保留;而一个仅被重定向的写入则不会。
  • 门禁:
  • 回读未包含的字段不再被视为必需;当且仅当创建后的回读也未包含该字段时,缺少该字段的创建操作才会被对外提供;
  • 一个条目视图在经历了一次仅请求部分字段的读取后仍能证明其身份;这次读取本身留给重放处理;
  • 按数字分组编号的创建操作会被对外提供。
  • 服务:新创建的实体会在省略该字段的情况下被对外提供,而已有种子数据仍保留该字段;调用中指定 fields 时会以 projection 原因重放,其他调用则从状态返回;创建操作会取持有值的数字分组中的下一个编号。
  • 单元:以 - 分隔且宽度相同的数字分组会被读取为序列;日期、版本、地址或十进制不会;下一个值会保留这些分组,溢出时向前进位。
  • 门禁、服务和清单测试在 ad8f674d 上失败。

评审修复,每个都带有一个在 a4c4a23b 上失败的测试:

  • 门禁:
  • 指定了 fields 的读取,或对状态中已不再持有的图书的读取,不会记录省略;仅通过 ?fields=id,name 回读的创建操作不会被对外提供;
  • 一个条目读取展示出的省略,会使该类型中所有要求该字段的视图都无法再被对外提供;
  • 一次指定 fields 但漏掉必需字段的读取,既不会重新同步实体,也不能作为写入的观察结果;因此,一个先通过 ?fields=id,name 回读的 204 更新,只能从完整读取中获知其效果;
  • 后续的创建操作,如果其序列值的服务结果会拼写出其他含义(00-04,或 000-003 之后的 4),则会拒绝提供该计划。
  • 服务:空的投影参数会重放;对已删除图书的投影会以缺失(missing)应答;一个缺少被省略字段的已创建图书仍会出现在列表中。

已发布的抓取记录

在全部 50 个已发布的抓取记录中,对比 ad8f674d:

  • 被归类为 non-json 而排除的写入组从五个抓取记录中的 13 个减少到 0 个。Directus、Jellyfin、Keycloak、Miniflux 和 Shlink 因此获得这些工具,它们的清单也随之改变。
  • 对外提供的写入工具从 35 个增加到 39 个,没有丢失任何一个:
  • Directus 的 provisions 条目视图在经历 GET /items/provisions/2?fields=title 后仍能证明其身份,因此其创建和更新都会被对外提供;
  • Jellyfin 的 DELETE /Items/{id} 和 Shlink 的 DELETE /rest/v3/short-urls/{slug} 会被对外提供。
  • Airbyte 的 job 条目视图不再要求其读取结果中未包含的两个字段;其判定结果不变。
  • 六个状态发生变化:上述五个抓取记录以及 Airbyte。
  • 一个可服务的冒烟测试,使用各分支树重建的清单,在此应用全部 39 个对外提供的写入工具,在基线应用全部 35 个。

重新录制的抓取记录

抓取记录被重新录制,每次第一次写入后跟一次回读,并且每个写入工具配有两个临时对象:

  • 一个 Homebox 试点录制以数字分组为资产编号(000-001、000-002,……)。其创建操作从 contradicted 变为可服务,并带有针对 assetId 的 sequence 规则;冒烟测试应用了该创建操作和删除操作。
  • 从这类录制重建的五个已发布环境(Navidrome、Lychee、Homebox、Directus、Linkding)中,对外提供的写入工具从 9 个增加到 11 个,冒烟测试应用了全部 11 个:
  • Navidrome 的播放列表视图不再要求 imageAbsent,新播放列表正是不包含该字段,因此其播放列表更新会被对外提供;
  • Homebox 的创建操作会被对外提供,与试点录制中的情况一致。
  • Jellyfin 和 Memos 在应用此更改后重新录制并端到端重建(每个环境各包含 manifest、bundle、冒烟测试,以及两个评估模型分别针对 12 个检索任务),没有新增任何对外提供的写入工具:
  • Jellyfin 的四个无请求体的写入组变成工具,但全部不对外提供。其播放列表通过 POST /Playlists 创建,但只能通过 /Items/{id} 回读,这会使该条目视图无法从状态渲染。
  • Memos 不具备这四种形态;它把条目命名为 memos/<id>,身份证明无法匹配。

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