
plate 编辑器基准证据源映射指南Evidence Kit 注册表与 Slate v2 对比基准的权威数据流【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate本篇指南围绕 plate 仓库中 benchmarks/editor/research/evidence-source-map.md 展开系统讲解编辑器基准实验室Evidence Kit lab如何通过证据源映射source map来定义什么是有效的基准证据从源配置文件、基准注册表、目标集划分到已接受/已拒绝的迁移规则与健康报告。读完本文你将掌握该仓库中 Slate v2 与 Slate 对比基准的完整数据流、注册表字段语义、行状态码含义以及如何用一条命令查看当前证据健康度与下一步行动。一、什么是证据源映射从跑出数字到证明数字算数在现代富文本编辑器框架的研发中性能对比最困难的部分往往不是跑一个 benchmark而是回答三个问题这个数字是从哪个源码版本、哪条命令、哪个工作负载跑出来的这个数字当前是否仍然有效artifact 是否过期、是否被注册这个数字能不能被当作正式结论写进文档与 PRplate 仓库的编辑器基准实验室benchmarks/editor给出的答案是用一套Evidence Kit 证据包来统一管理。evidence-source-map.md是该证据包的事实来源source of truth文档它以verdict: accepted的决策记录形式声明使用 Evidence Kit 的 source map 与 benchmark 行rows作为新的编辑器基准权威。这意味着仓库不再维护旧的 Next/Vite 独立基准应用作为默认基准所有者而是由**证据工件evidence artifacts**持有话语权。整个体系围绕两个 JSON 文件运转主源配置benchmarks/editor/research/editor-frameworks-sources.json主基准注册表benchmarks/editor/research/benchmark-registry.json从源码结构看benchmarks/editor/src/index.mjs中导出的readResearchSources与readBenchmarkRegistry就是这两个文件的解析入口所有 benchmark runner如rich-text-editors-benchmark.mjs、benchmark-health.mjs都通过它们读取配置而不是把工件路径硬编码在脚本里——这是注册表驱动设计的关键。二、主源配置editor-frameworks-sources.json源配置声明当前正在测量哪些编辑器源码。当前仓库中的 editor-frameworks-sources.json 内容如下含字段注释{ version: 1, topic: editor-frameworks, generatedBy: shapeshift-labs/evidence-kit, sources: [ { name: slate-v2-package, type: file, path: ../../.tmp/slate-v2/package.json, fileName: slate-v2-package.json, why: Slate v2 owns current deep Slate benchmark commands and artifact families. }, { name: slate-package, type: file, path: ../../../slate/package.json, fileName: slate-package.json, why: Slate is the local baseline for Slate v2 compare lanes. } ] }字段语义说明字段含义version配置格式版本号当前为 1topic研究主题标识当前为editor-frameworksgeneratedBy生成方标注 Evidence Kit 工具链sources[].name源条目名称用于在结果行中标识sources[].type源类型当前为filesources[].path相对于benchmarks/editor目录的源码路径sources[].why该源存在的理由为什么它属于当前目标集注意path是相对于证据包所在目录的路径Slate v2 位于.tmp/slate-v2legacy Slate 基线位于仓库外的slate克隆。在src/index.mjs的createEvidenceReadinessRows中会检查该配置里配置的源条目数量是否不少于editorTargets数量不足则输出missing-source状态行——源配置本身就是证据就绪度检查的一部分。三、主基准注册表benchmark-registry.json注册表是什么是当前有效证据的唯一仲裁者。当前 benchmark-registry.json 的顶层结构{ version: 1, policy: { activeArtifactRule: Only artifacts listed here are active benchmark evidence., discardRule: Unregistered benchmark JSON files are ignored historical output. }, discardUnregistered: [ { root: ../../.tmp/slate-v2/tmp, match: benchmark }, { root: ../../.tmp/slate-v2/packages/slate-react/tmp, match: benchmark } ], runtimeAdapters: [], artifacts: [ ... ], workloads: [ ... ] }3.1 policy两条核心规则activeArtifactRule只有注册表列出的工件才是活跃基准证据discardRule未注册的 benchmark JSON 一律视为历史输出被活跃流程忽略。discardUnregistered声明了哪些目录下的*benchmark*.json会被健康报告视为被丢弃的历史工件。从 benchmark-health-latest.json 可以看到实际效果当前有23 个活跃工件、62 个被忽略的未注册工件——这些历史 tmp 文件不会进入任何活跃结论。3.2 artifacts工件条目字段详解当前注册表共 23 个工件2 个可选每个条目的典型结构{ id: react-huge-document-legacy-compare, category: slate-react-huge-document-legacy-compare, kind: slate-legacy-compare, owner: slate-v2, family: react-large-document, cwd: ../../.tmp/slate-v2, command: REACT_HUGE_COMPARE_LEGACY_REPO../../../slate bun run bench:react:huge-document:legacy-compare:local, path: ../../.tmp/slate-v2/tmp/slate-react-huge-document-legacy-compare-benchmark-compare-all-blocks-5000-iters-3-ops-20-combined-selection-no-profile.json, required: true, decision: Does Slate v2 beat legacy Slate for 5,000-block React editing, selection, startup, and full-document replacement? }字段语义字段说明id工件唯一标识健康报告与工作量引用都靠它category结果行分类写入行时作为categorykind工件解析方式决定行归一化策略见第六节owner测量命令的所有者当前全部为slate-v2family功能族分组如react-large-document、core-current、history、clipboardcwd运行命令的工作目录command生成该工件的完整命令含环境变量path工件 JSON 的存储路径required是否必需false的缺失记为optional-missing-artifact不阻塞decision该工件要回答的决策问题用于指导结果解读surfaceLibraries仅browser-trace类使用把 surface 名映射到库标识当前注册表覆盖的工件族包括React 5000 块大文档对比、React 重渲染广度rerender breadth、大文档 overlay、Chromium 浏览器 traceDOM 数量/堆/长帧/交互、富文本浏览器回放覆盖、core 归一化/query-ref/节点变换/文本选择/编辑器 store/refs 投影、core 大文档/归一化/观察对比、历史对比、剪贴板大负载、协作就绪度、issue #6038 事务回放等。3.3 workloads工作量与目标覆盖矩阵workloads把多个工件聚合成工作量并声明它是否同时覆盖 legacy 与 Slate v2{ id: react-huge-document-browser-trace, legacy: true, slateV2: true, artifactIds: [ react-huge-document-browser-trace, react-huge-document-slate-browser-trace ], workload: Chromium DOM count, heap, long-frame, and interaction traces }legacy/slateV2布尔值直接决定覆盖率行rich-text-editor-workload-coverage的状态src/index.mjs的readWorkloadCoverageStatus逻辑是——对 Slate v2 目标若工作量的工件已测量则记为ok对 Slate 基线目标只有当legacy: true才记ok否则记unsupportedSlate v2 专属工作量不声称有 Slate 基线。这保证了Slate v2 专属诊断与Slate v2 vs Slate 对比在结果中被明确区分。四、当前本地目标集Slate v2 Slatechunk-on 为基线证据源映射声明的当前目标集只有两个src/index.mjs 中的editorTargetsid角色源码位置证据所有者slate-v2engine-and-react-runtime引擎与 React 运行时../../.tmp/slate-v2scripts/benchmarks加packages/slate*slatelegacy-baseline遗留基线../../../slate上游包行为与本地克隆关键约束README 与证据源映射文档一致活跃对比范围仅为 Slate v2 vs SlateSlate 基线固定使用 chunk-on活跃对比输出中禁止出现 chunk-off 行——这一点甚至被写进了 rich-text-editors-benchmark.mjs 的 check 逻辑forbiddenScopeTerms数组里包含slate:chunk-off与legacychunkoff一旦结果行中出现这些词缀--check直接抛错旧浏览器 appNext/Vite基准目标不保留未来若要扩大对比范围必须先显式重开 Slate-only 范围再添加目标所属的证据适配器与 benchmark 行。对比行中的 library 标识遵循固定顺序slateLegacyCompareSurfaceOrderv2DefaultRenderAuto→v2DomPresent→legacyChunkOn分别映射为slate-v2:default-render-auto、slate-v2:dom-present与slate。五、已接受的迁移规则Accepted Transfer证据源映射文档明确列出了一组正式证据必须满足的规则结论必须来自benchmarks/results/*latest.json行且行内带可见状态ok、partial、unsupported、timeout、over-budget或错误状态。例如 rich-text-editors-latest.json 中的行就带有status: ok/unsupported与medianUs/p95Us/ops等字段。活跃基准结论必须来自 benchmark-registry.json未注册的 benchmark JSON 是历史输出被活跃 Evidence Kit 流程忽略。健康报告据此统计出 62 个被忽略工件。富文本编辑器结论的入口是 rich-text-editors-latest.json该文件从注册的 Slate v2 / Slate 工件族导入数据是宽矩阵而老的slate-v2-legacy-latest.json仍是第一次直接运行时对比的历史存放处。README 明确指出活跃范围是 Slate v2 vs SlateSlate chunk-on 为基线。外部或兄弟仓库的灵感必须以research/repos/topic/manifest.json形式的 fetch 清单进入或以复制数据进入benchmarks/data/topic/。对应命令见 package.json 的research:editor-frameworks:fetch执行fetch-editor-frameworks-research.mjs与research:source-pass:fetch。旧浏览器 app 目标不保留未来对比工作需在 Slate-only 范围显式重开后再添加目标所属的证据适配器与 benchmark 行。5.1 行状态码语义以 rich-text-editors-latest.json 实际行为例ok已测量且通过如 Slate v2 的react-huge-document-legacy-compare覆盖行ops: 1unsupportedSlate v2 专属工作量对 Slate 基线不声称数据如react-rerender-breadth的 slate 行ops: 0missing-artifact/optional-missing-artifact必需/可选工件缺失由createBenchmarkArtifactRows在工件文件不存在时生成over-budget阈值行未通过如 迭代记录 002 中提到的剪贴板cutTwoBlocksEditMsP50超预算adapter-missing目标存在但尚无等价运行时适配器check 时要求 Slate-only 范围内该状态行数为 0。六、行归一化契约从任意工件 JSON 到统一结果行benchmarks/editor/src/index.mjs定义了目标所属 benchmark 行的归一化契约这是证据可信度的底层保证。核心函数链createRichTextEditorBenchmarkRows ├── readBenchmarkRegistry(registryPath) ├── createRichTextEditorCoverageRows // 目标覆盖行 工作量覆盖行 └── createBenchmarkArtifactRows // 逐个工件 → 按 kind 分发 ├── normalizeSlateLegacyCompareArtifact ├── normalizeRowsArtifactRows ├── normalizeBrowserTraceArtifactRows ├── normalizeCompareArtifactRows └── normalizeCurrentArtifactRowsnormalizeBenchmarkRow对每一行强制校验category、fixture、library、status必须是非空字符串medianUs、p95Us、ops、bytes必须是有限数值。isTimeMetric通过/(?:Ms|Duration)$/识别耗时指标并换算为微秒msToUsisByteMetric通过Bytes$|MB$或stats.unit bytes识别字节指标MB 自动乘 1024×1024。缺失 stats 的工件会生成missing-metrics行而不是静默丢弃——宁可标红不可假装有数据。check 门槛见 rich-text-editors-benchmark.mjs总行数 ≥ 250、ok行 ≥ 180、目标覆盖行数等于目标数、无 adapter-gap、无非 Slate 库、无越界词缀。这些数字本身就是宽覆盖的量化定义。七、健康报告与下一步行动benchmark-health-latest.json 由benchmarks/benchmark-health.mjs生成包含registry.activeArtifacts23与discardedUnregisteredArtifacts62missingRequiredArtifacts当前为空说明必需工件齐全与missingOptionalArtifacts2 个可选工件core-transaction-current、history-retained-memorynextActions按优先级排序的行动项例如刷新 15 天未更新的core-node-transformspriority 4、决定可选工件是否保留priority 5、清理 62 个未注册历史工件priority 6。这套健康报告 排名下一步行动是证据控制面control plane的产物详见迭代记录 003-evidence-control-plane.mdbenchmark runner 仍归各所有者Slate v2 拥有测量命令但输出是否算数由 Evidence Kit 注册表决定——职责分离控制面自治。八、已拒绝的迁移规则Rejected Transfer证据源映射文档同时明确否决了以下四类回退行为恢复已删除的 Next/Vite 应用作为默认基准所有者保留框架模板动物园template zoo作为未来保险把生成的占位行placeholder row当作性能证据把未注册的 tmp benchmark 工件当作活跃证据。这些拒绝在代码层也有呼应src/index.mjs的staleSurfacePaths硬编码了apps、templates、website等旧表面路径createEvidenceReadinessRows会输出legacy-app-surface-removed硬切行——一旦旧 app/模板路径重现该行状态变为stale-surface证据就绪度即告失败参见迭代记录 000-bootstrap-evidence.md 中的 hard-cut 设计。九、实操如何查看与验证当前证据在 benchmarks/editor 目录下可用的关键命令均定义在 package.jsonnpm run evidence:inspect # 以 JSON 输出证据包结构 npm run research:list # 列出研究源 npm run research:editor-frameworks:fetch # 拉取编辑器框架研究资料 npm run bench:rich-text:check # 重新生成并校验富文本宽矩阵 npm run bench:startup:check # 启动导入检查默认 p95 100ms、32 个导出 npm run bench:package:gates # 包边界检查200000 bytes / 32 files / 1250000 packBytes / 96 packFiles npm run bench:scope # 更新 scope hash npm run evidence:health # 生成健康报告 npm run evidence:refresh # research:list rich-text:check health docs npm run docs:perf # 生成 docs/perf 下的 HTML 仪表盘 npm run docs:perf:search -- editor benchmark # 在性能文档中全文搜索 npm run evidence:full # 全量流水线测试 fuzz bench 检查 docs典型的最小验证链路对应迭代记录中的 Verificationnpm run bench:rich-text:check npm run evidence:health npm run check十、总结证据源映射的三大原则综合 evidence-source-map.md、注册表、源码与健康报告可以把这套机制概括为三条原则注册表即权威没有被 benchmark-registry.json 收录的 JSON 不算活跃证据无论它看起来多像 benchmark 结果行状态即结论边界结论必须落到benchmarks/results/*latest.json的规范化行上ok/partial/unsupported/over-budget等状态限定了这句话可以说多满控制面与测量面分离测量命令归目标所有者Slate v2证据判定归 Evidence Kit扩大对比范围必须先显式重开范围再补适配器与注册行禁止回退到旧的 app/模板基准动物园。对于希望深入验证的读者建议依次阅读 editor-frameworks-sources.json、benchmark-registry.json、rich-text-editors-latest.json 与 benchmark-health-latest.json 四个文件再对照 src/index.mjs 的归一化实现即可完整复现从源码到可引用基准结论的整条证据链。【免费下载链接】plateRich-text editor with AI and shadcn/ui项目地址: https://gitcode.com/GitHub_Trending/pl/plate创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考