ci(studio): pack edit accuracy shards by measured case time so they finish together

This commit is contained in:
Miguel Ángel
2026-10-29 22:15:52 -04:00
parent 6874cc2890
commit 6e12479f24
7 changed files with 832 additions and 4 deletions
+3
View File
@@ -145,6 +145,9 @@ bun run --cwd packages/studio test:edit-accuracy -- --grid pr --filter '^resize-
- CI runs the full grid in shards and `ratchet.mjs` gates the result against the
base branch's `baseline.json`; its header states the rules. When cases newly
pass, commit the `baseline.json` from the `edit-accuracy-gate` artifact.
- Shards are packed by each case's seconds in `timings.json`. When the grid or case
costs change a lot, regenerate it with `test:edit-accuracy:timings` from the
`run1/results.json` files of a few merge-queue shard artifacts.
## Gates that will fail your PR
+1
View File
@@ -76,6 +76,7 @@
"typecheck": "tsc --noEmit",
"test": "vitest run",
"test:edit-accuracy": "bun tests/e2e/edit-accuracy/run.mjs",
"test:edit-accuracy:timings": "node tests/e2e/edit-accuracy/timings.mjs",
"test:filmstrip-controls": "node tests/e2e/filmstrip-controls.mjs",
"test:webmcp-edit-loop": "node tests/e2e/webmcp-edit-loop.mjs",
"test:thumbnail-save": "node tests/e2e/thumbnail-save.mjs",
@@ -1,6 +1,6 @@
// The edit accuracy grid: one flat-coloured element in a generated project, crossed with one gesture.
// Projects are written to a tmp dir per case; nothing checked in is edited.
import { mkdirSync, statSync, writeFileSync } from "node:fs";
import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
import { createRequire } from "node:module";
import { dirname, join } from "node:path";
import { dragCases } from "./drags.mjs";
@@ -256,6 +256,24 @@ function subHtml(spec) {
`;
}
const TIMINGS = JSON.parse(readFileSync(new URL("timings.json", import.meta.url), "utf8"));
/**
* Shard `shard` of `shards`, packed longest first by each case's measured seconds (timings.json, from timings.mjs) so
* the shards finish together; a case with no timing counts as the slowest. Returned longest first.
*/
export function shardCases(cases, shard, shards, timings = TIMINGS) {
const unknown = Math.max(0, ...Object.values(timings));
const cost = (c) => timings[c.id] ?? unknown;
const bins = Array.from({ length: shards }, () => ({ cases: [], seconds: 0 }));
for (const c of [...cases].sort((a, b) => cost(b) - cost(a) || a.id.localeCompare(b.id))) {
const lightest = bins.reduce((min, bin) => (bin.seconds < min.seconds ? bin : min));
lightest.cases.push(c);
lightest.seconds += cost(c);
}
return bins[shard - 1].cases;
}
/** Writes the case's project into `dir` and returns the files a gesture may rewrite. */
export function writeFixture(spec, dir) {
mkdirSync(dir, { recursive: true });
@@ -2,7 +2,8 @@ import { mkdtempSync, readdirSync, readFileSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { describe, expect, it } from "vitest";
import { FIXTURE_CDN, buildGrid, localAsset, writeFixture } from "./grid.mjs";
import timings from "./timings.json" with { type: "json" };
import { FIXTURE_CDN, buildGrid, localAsset, shardCases, writeFixture } from "./grid.mjs";
function fixtureUrls(spec) {
const dir = mkdtempSync(join(tmpdir(), "edit-bench-urls-"));
@@ -37,3 +38,36 @@ describe("grid size", () => {
expect(buildGrid("pr")).toHaveLength(271);
});
});
describe("shards", () => {
const seconds = (cases) => cases.reduce((sum, c) => sum + (timings[c.id] ?? 0), 0);
it.each([
["full", 20],
["pr", 5],
])(
"put each %s case in one of %i shards, all within one case's time of each other",
(grid, shards) => {
const cases = buildGrid(grid);
const split = Array.from({ length: shards }, (_, i) => shardCases(cases, i + 1, shards));
expect(
split
.flat()
.map((c) => c.id)
.sort(),
).toEqual(cases.map((c) => c.id).sort());
const times = split.map(seconds);
const slowestCase = Math.max(...cases.map((c) => timings[c.id] ?? 0));
expect(Math.max(...times) - Math.min(...times)).toBeLessThanOrEqual(slowestCase);
},
);
it("still run a case with no timing", () => {
const cases = buildGrid("pr");
const untimed = Object.fromEntries(
Object.entries(timings).filter(([id]) => id !== cases[0].id),
);
const split = [1, 2, 3].flatMap((i) => shardCases(cases, i, 3, untimed));
expect(split.filter((c) => c.id === cases[0].id)).toHaveLength(1);
});
});
@@ -11,7 +11,7 @@ import { parseArgs } from "node:util";
import { execSync, spawn } from "node:child_process";
import puppeteer from "puppeteer-core";
import { resolveHeadlessShellPath } from "../../../../engine/src/index.ts";
import { buildGrid, writeFixture } from "./grid.mjs";
import { buildGrid, shardCases, writeFixture } from "./grid.mjs";
import { killServers, runCase, startServer, stopServer } from "./case.mjs";
import { runSequence } from "./sequences.mjs";
import { METRICS, SLOW_RUNNER, score, slowRunner, writeReport } from "./report.mjs";
@@ -37,7 +37,11 @@ const { values: opt } = parseArgs({
});
const [shard, shards] = opt.shard.split("/").map(Number);
const filter = new RegExp(opt.filter);
const cases = buildGrid(opt.grid).filter((c, i) => filter.test(c.id) && i % shards === shard - 1);
const cases = shardCases(
buildGrid(opt.grid).filter((c) => filter.test(c.id)),
shard,
shards,
);
const runId = new Date().toISOString().replace(/[:.]/g, "-");
const out = resolve(opt.out ?? join(HERE, "../evidence/edit-accuracy", runId));
const chrome = resolveHeadlessShellPath();
@@ -0,0 +1,749 @@
{
"crop-fromto-px-r0-root-z100-after": 21.9,
"crop-fromto-px-r0-root-z100-mid": 21.8,
"crop-fromto-px-r0-root-z100-on": 14.8,
"crop-fromto-px-r0-root-z50-after": 22,
"crop-fromto-px-r0-root-z50-mid": 18,
"crop-fromto-px-r0-root-z50-on": 24.2,
"crop-fromto-px-r30-root-z100-after": 14.7,
"crop-fromto-px-r30-root-z100-mid": 22.8,
"crop-fromto-px-r30-root-z100-on": 15.6,
"crop-fromto-px-r30-root-z50-after": 26.1,
"crop-fromto-px-r30-root-z50-mid": 25,
"crop-fromto-px-r30-root-z50-on": 20.3,
"crop-hold-px-r0-nested-z100": 25.4,
"crop-hold-px-r0-nested-z50": 18.5,
"crop-hold-px-r0-root-z100": 19,
"crop-hold-px-r0-root-z50": 19.4,
"crop-hold-px-r30-nested-z100": 25.7,
"crop-hold-px-r30-nested-z50": 19.5,
"crop-hold-px-r30-root-z100": 23,
"crop-hold-px-r30-root-z50": 19.7,
"crop-hold-xpercent-r0-nested-z100": 24.4,
"crop-hold-xpercent-r0-nested-z50": 19.1,
"crop-hold-xpercent-r0-root-z100": 19.5,
"crop-hold-xpercent-r0-root-z50": 19.7,
"crop-hold-xpercent-r30-nested-z100": 23.1,
"crop-hold-xpercent-r30-nested-z50": 19.4,
"crop-hold-xpercent-r30-root-z100": 18.4,
"crop-hold-xpercent-r30-root-z50": 19.1,
"crop-idle-px-r0-nested-z100": 24.9,
"crop-idle-px-r0-nested-z50": 19.9,
"crop-idle-px-r0-root-z100": 27.5,
"crop-idle-px-r0-root-z50": 23.1,
"crop-idle-px-r30-nested-z100": 28,
"crop-idle-px-r30-nested-z50": 21.3,
"crop-idle-px-r30-root-z100": 26.6,
"crop-idle-px-r30-root-z50": 23.5,
"crop-keys-px-r0-root-z100-after": 21.3,
"crop-keys-px-r0-root-z100-mid": 17.1,
"crop-keys-px-r0-root-z100-on": 20,
"crop-keys-px-r0-root-z50-after": 18.8,
"crop-keys-px-r0-root-z50-mid": 19,
"crop-keys-px-r0-root-z50-on": 16.6,
"crop-keys-px-r30-root-z100-after": 20.2,
"crop-keys-px-r30-root-z100-mid": 17.6,
"crop-keys-px-r30-root-z100-on": 23.4,
"crop-keys-px-r30-root-z50-after": 23.6,
"crop-keys-px-r30-root-z50-mid": 20.4,
"crop-keys-px-r30-root-z50-on": 17.1,
"crop-late-px-r0-root-z100-after": 21.6,
"crop-late-px-r0-root-z100-before": 22.2,
"crop-late-px-r0-root-z100-on": 19.7,
"crop-late-px-r0-root-z50-after": 18.6,
"crop-late-px-r0-root-z50-before": 24.2,
"crop-late-px-r0-root-z50-on": 15.7,
"crop-late-px-r30-root-z100-after": 13.1,
"crop-late-px-r30-root-z100-before": 16.5,
"crop-late-px-r30-root-z100-on": 20,
"crop-late-px-r30-root-z50-after": 15.8,
"crop-late-px-r30-root-z50-before": 19.2,
"crop-late-px-r30-root-z50-on": 24.2,
"crop-none-px-r0-nested-z100": 52.6,
"crop-none-px-r0-nested-z50": 35.5,
"crop-none-px-r0-root-z100": 45.7,
"crop-none-px-r0-root-z50": 35.6,
"crop-none-px-r30-nested-z100": 50.5,
"crop-none-px-r30-nested-z50": 38.1,
"crop-none-px-r30-root-z100": 46.9,
"crop-none-px-r30-root-z50": 33.6,
"crop-scale-px-r0-root-z100-after": 20.5,
"crop-scale-px-r0-root-z100-mid": 24.9,
"crop-scale-px-r0-root-z100-on": 20.8,
"crop-scale-px-r0-root-z50-after": 14.6,
"crop-scale-px-r0-root-z50-mid": 25.8,
"crop-scale-px-r0-root-z50-on": 25.6,
"crop-scale-px-r30-root-z100-after": 22.8,
"crop-scale-px-r30-root-z100-mid": 23.7,
"crop-scale-px-r30-root-z100-on": 20.8,
"crop-scale-px-r30-root-z50-after": 20.1,
"crop-scale-px-r30-root-z50-mid": 22.6,
"crop-scale-px-r30-root-z50-on": 19,
"crop-size-px-r0-root-z100-after": 23.7,
"crop-size-px-r0-root-z100-mid": 21.4,
"crop-size-px-r0-root-z100-on": 13.2,
"crop-size-px-r0-root-z50-after": 30.1,
"crop-size-px-r0-root-z50-mid": 30.2,
"crop-size-px-r0-root-z50-on": 25.3,
"crop-size-px-r30-root-z100-after": 20.7,
"crop-size-px-r30-root-z100-mid": 23.6,
"crop-size-px-r30-root-z100-on": 22,
"crop-size-px-r30-root-z50-after": 12.5,
"crop-size-px-r30-root-z50-mid": 19.8,
"crop-size-px-r30-root-z50-on": 21.8,
"crop-spin-px-r0-root-z100-after": 17.6,
"crop-spin-px-r0-root-z100-mid": 18.8,
"crop-spin-px-r0-root-z100-on": 23.1,
"crop-spin-px-r0-root-z50-after": 24.2,
"crop-spin-px-r0-root-z50-mid": 16.9,
"crop-spin-px-r0-root-z50-on": 26.5,
"crop-spin-px-r30-root-z100-after": 16.9,
"crop-spin-px-r30-root-z100-mid": 23.9,
"crop-spin-px-r30-root-z100-on": 20.6,
"crop-spin-px-r30-root-z50-after": 21.8,
"crop-spin-px-r30-root-z50-mid": 18,
"crop-spin-px-r30-root-z50-on": 20.6,
"crop-tween-px-r0-nested-z100": 20.1,
"crop-tween-px-r0-nested-z50": 18,
"crop-tween-px-r0-root-z100": 23.6,
"crop-tween-px-r0-root-z50": 20.2,
"crop-tween-px-r30-nested-z100": 25.2,
"crop-tween-px-r30-nested-z50": 19.5,
"crop-tween-px-r30-root-z100": 25.6,
"crop-tween-px-r30-root-z50": 21.2,
"crop-tween-xpercent-r0-nested-z100": 22.2,
"crop-tween-xpercent-r0-nested-z50": 17.3,
"crop-tween-xpercent-r0-root-z100": 20.4,
"crop-tween-xpercent-r0-root-z50": 18.1,
"crop-tween-xpercent-r30-nested-z100": 23,
"crop-tween-xpercent-r30-nested-z50": 17.8,
"crop-tween-xpercent-r30-root-z100": 24.2,
"crop-tween-xpercent-r30-root-z50": 20,
"move-fromto-px-r0-root-z100-after": 16.3,
"move-fromto-px-r0-root-z100-mid": 22.6,
"move-fromto-px-r0-root-z100-on": 16.5,
"move-fromto-px-r0-root-z50-after": 27.2,
"move-fromto-px-r0-root-z50-mid": 25.7,
"move-fromto-px-r0-root-z50-on": 20.3,
"move-fromto-px-r30-root-z100-after": 15,
"move-fromto-px-r30-root-z100-mid": 22.5,
"move-fromto-px-r30-root-z100-on": 22.9,
"move-fromto-px-r30-root-z50-after": 25.9,
"move-fromto-px-r30-root-z50-mid": 19.8,
"move-fromto-px-r30-root-z50-on": 25.5,
"move-hold-px-r0-nested-z100": 14.9,
"move-hold-px-r0-nested-z50": 25.1,
"move-hold-px-r0-root-z100": 16.1,
"move-hold-px-r0-root-z50": 21.6,
"move-hold-px-r30-nested-z100": 17.3,
"move-hold-px-r30-nested-z50": 27.2,
"move-hold-px-r30-root-z100": 16.4,
"move-hold-px-r30-root-z50": 21.9,
"move-hold-xpercent-r0-nested-z100": 14.5,
"move-hold-xpercent-r0-nested-z50": 26.5,
"move-hold-xpercent-r0-root-z100": 15.2,
"move-hold-xpercent-r0-root-z50": 22.3,
"move-hold-xpercent-r30-nested-z100": 14.1,
"move-hold-xpercent-r30-nested-z50": 28.4,
"move-hold-xpercent-r30-root-z100": 15.8,
"move-hold-xpercent-r30-root-z50": 22.1,
"move-idle-px-r0-nested-z100": 20.7,
"move-idle-px-r0-nested-z50": 27.2,
"move-idle-px-r0-root-z100": 19.4,
"move-idle-px-r0-root-z50": 21.4,
"move-idle-px-r30-nested-z100": 21.8,
"move-idle-px-r30-nested-z50": 28.6,
"move-idle-px-r30-root-z100": 22,
"move-idle-px-r30-root-z50": 22.9,
"move-keys-px-r0-root-z100-after": 21.8,
"move-keys-px-r0-root-z100-mid": 16.1,
"move-keys-px-r0-root-z100-on": 21,
"move-keys-px-r0-root-z50-after": 25.7,
"move-keys-px-r0-root-z50-mid": 20.3,
"move-keys-px-r0-root-z50-on": 17.1,
"move-keys-px-r30-root-z100-after": 23.1,
"move-keys-px-r30-root-z100-mid": 22,
"move-keys-px-r30-root-z100-on": 22.7,
"move-keys-px-r30-root-z50-after": 19.2,
"move-keys-px-r30-root-z50-mid": 25,
"move-keys-px-r30-root-z50-on": 18.7,
"move-late-px-r0-root-z100-after": 14.6,
"move-late-px-r0-root-z100-before": 15.5,
"move-late-px-r0-root-z100-on": 21.2,
"move-late-px-r0-root-z50-after": 26.3,
"move-late-px-r0-root-z50-before": 26.5,
"move-late-px-r0-root-z50-on": 25.8,
"move-late-px-r30-root-z100-after": 15.5,
"move-late-px-r30-root-z100-before": 12.7,
"move-late-px-r30-root-z100-on": 18.3,
"move-late-px-r30-root-z50-after": 27.3,
"move-late-px-r30-root-z50-before": 25.6,
"move-late-px-r30-root-z50-on": 20,
"move-none-px-r0-nested-z100": 27.6,
"move-none-px-r0-nested-z50": 60.7,
"move-none-px-r0-root-z100": 33.3,
"move-none-px-r0-root-z50": 37.4,
"move-none-px-r30-nested-z100": 28.5,
"move-none-px-r30-nested-z50": 60.5,
"move-none-px-r30-root-z100": 34.4,
"move-none-px-r30-root-z50": 37.9,
"move-scale-px-r0-root-z100-after": 22.2,
"move-scale-px-r0-root-z100-mid": 20.6,
"move-scale-px-r0-root-z100-on": 22.2,
"move-scale-px-r0-root-z50-after": 17.5,
"move-scale-px-r0-root-z50-mid": 19.8,
"move-scale-px-r0-root-z50-on": 19.3,
"move-scale-px-r30-root-z100-after": 20.8,
"move-scale-px-r30-root-z100-mid": 15.8,
"move-scale-px-r30-root-z100-on": 16.9,
"move-scale-px-r30-root-z50-after": 17.9,
"move-scale-px-r30-root-z50-mid": 25,
"move-scale-px-r30-root-z50-on": 14.4,
"move-size-px-r0-root-z100-after": 21.1,
"move-size-px-r0-root-z100-mid": 12.5,
"move-size-px-r0-root-z100-on": 22.9,
"move-size-px-r0-root-z50-after": 24.2,
"move-size-px-r0-root-z50-mid": 22.7,
"move-size-px-r0-root-z50-on": 28.7,
"move-size-px-r30-root-z100-after": 14.4,
"move-size-px-r30-root-z100-mid": 18.4,
"move-size-px-r30-root-z100-on": 26,
"move-size-px-r30-root-z50-after": 24.1,
"move-size-px-r30-root-z50-mid": 17.7,
"move-size-px-r30-root-z50-on": 24.2,
"move-spin-px-r0-root-z100-after": 16.5,
"move-spin-px-r0-root-z100-mid": 21.5,
"move-spin-px-r0-root-z100-on": 19.7,
"move-spin-px-r0-root-z50-after": 21.9,
"move-spin-px-r0-root-z50-mid": 20.2,
"move-spin-px-r0-root-z50-on": 23.3,
"move-spin-px-r30-root-z100-after": 19.9,
"move-spin-px-r30-root-z100-mid": 20.9,
"move-spin-px-r30-root-z100-on": 17.6,
"move-spin-px-r30-root-z50-after": 24.6,
"move-spin-px-r30-root-z50-mid": 18.2,
"move-spin-px-r30-root-z50-on": 24.2,
"move-tween-px-r0-nested-z100": 19.2,
"move-tween-px-r0-nested-z50": 26,
"move-tween-px-r0-root-z100": 15.9,
"move-tween-px-r0-root-z50": 21.3,
"move-tween-px-r30-nested-z100": 21.5,
"move-tween-px-r30-nested-z50": 27.8,
"move-tween-px-r30-root-z100": 19.7,
"move-tween-px-r30-root-z50": 18.9,
"move-tween-xpercent-r0-nested-z100": 14.5,
"move-tween-xpercent-r0-nested-z50": 25.7,
"move-tween-xpercent-r0-root-z100": 15.2,
"move-tween-xpercent-r0-root-z50": 22.1,
"move-tween-xpercent-r30-nested-z100": 16.3,
"move-tween-xpercent-r30-nested-z50": 28.7,
"move-tween-xpercent-r30-root-z100": 15,
"move-tween-xpercent-r30-root-z50": 22.4,
"nudge-fromto-px-r0-root-z100-after": 19.6,
"nudge-fromto-px-r0-root-z100-mid": 12.5,
"nudge-fromto-px-r0-root-z100-on": 17.4,
"nudge-fromto-px-r0-root-z50-after": 22,
"nudge-fromto-px-r0-root-z50-mid": 22.5,
"nudge-fromto-px-r0-root-z50-on": 15.4,
"nudge-fromto-px-r30-root-z100-after": 15.3,
"nudge-fromto-px-r30-root-z100-mid": 12.7,
"nudge-fromto-px-r30-root-z100-on": 12.8,
"nudge-fromto-px-r30-root-z50-after": 22,
"nudge-fromto-px-r30-root-z50-mid": 15.7,
"nudge-fromto-px-r30-root-z50-on": 20.5,
"nudge-hold-px-r0-nested-z100": 20.4,
"nudge-hold-px-r0-nested-z50": 22.7,
"nudge-hold-px-r0-root-z100": 19.9,
"nudge-hold-px-r0-root-z50": 16.7,
"nudge-hold-px-r30-nested-z100": 24.6,
"nudge-hold-px-r30-nested-z50": 24,
"nudge-hold-px-r30-root-z100": 19.8,
"nudge-hold-px-r30-root-z50": 17.8,
"nudge-hold-xpercent-r0-nested-z100": 24,
"nudge-hold-xpercent-r0-nested-z50": 24,
"nudge-hold-xpercent-r0-root-z100": 17.5,
"nudge-hold-xpercent-r0-root-z50": 15.4,
"nudge-hold-xpercent-r30-nested-z100": 22.3,
"nudge-hold-xpercent-r30-nested-z50": 22.8,
"nudge-hold-xpercent-r30-root-z100": 19,
"nudge-hold-xpercent-r30-root-z50": 15.7,
"nudge-idle-px-r0-nested-z100": 27.6,
"nudge-idle-px-r0-nested-z50": 22,
"nudge-idle-px-r0-root-z100": 19.7,
"nudge-idle-px-r0-root-z50": 21.3,
"nudge-idle-px-r30-nested-z100": 28.2,
"nudge-idle-px-r30-nested-z50": 24.5,
"nudge-idle-px-r30-root-z100": 20.1,
"nudge-idle-px-r30-root-z50": 21,
"nudge-keys-px-r0-root-z100-after": 13.2,
"nudge-keys-px-r0-root-z100-mid": 18.4,
"nudge-keys-px-r0-root-z100-on": 19.1,
"nudge-keys-px-r0-root-z50-after": 23.1,
"nudge-keys-px-r0-root-z50-mid": 16.5,
"nudge-keys-px-r0-root-z50-on": 21.4,
"nudge-keys-px-r30-root-z100-after": 14.9,
"nudge-keys-px-r30-root-z100-mid": 18.1,
"nudge-keys-px-r30-root-z100-on": 12.8,
"nudge-keys-px-r30-root-z50-after": 15.1,
"nudge-keys-px-r30-root-z50-mid": 19.9,
"nudge-keys-px-r30-root-z50-on": 22,
"nudge-late-px-r0-root-z100-after": 13.6,
"nudge-late-px-r0-root-z100-before": 17.4,
"nudge-late-px-r0-root-z100-on": 12.4,
"nudge-late-px-r0-root-z50-after": 15.1,
"nudge-late-px-r0-root-z50-before": 21.8,
"nudge-late-px-r0-root-z50-on": 21.1,
"nudge-late-px-r30-root-z100-after": 18.5,
"nudge-late-px-r30-root-z100-before": 12.7,
"nudge-late-px-r30-root-z100-on": 13.6,
"nudge-late-px-r30-root-z50-after": 16.6,
"nudge-late-px-r30-root-z50-before": 16,
"nudge-late-px-r30-root-z50-on": 12.6,
"nudge-none-px-r0-nested-z100": 41.7,
"nudge-none-px-r0-nested-z50": 54.4,
"nudge-none-px-r0-root-z100": 23,
"nudge-none-px-r0-root-z50": 31.8,
"nudge-none-px-r30-nested-z100": 41.9,
"nudge-none-px-r30-nested-z50": 49,
"nudge-none-px-r30-root-z100": 23.1,
"nudge-none-px-r30-root-z50": 33.5,
"nudge-scale-px-r0-root-z100-after": 21,
"nudge-scale-px-r0-root-z100-mid": 18,
"nudge-scale-px-r0-root-z100-on": 14.2,
"nudge-scale-px-r0-root-z50-after": 20.3,
"nudge-scale-px-r0-root-z50-mid": 20.9,
"nudge-scale-px-r0-root-z50-on": 20.3,
"nudge-scale-px-r30-root-z100-after": 14.7,
"nudge-scale-px-r30-root-z100-mid": 18.2,
"nudge-scale-px-r30-root-z100-on": 13.5,
"nudge-scale-px-r30-root-z50-after": 22.9,
"nudge-scale-px-r30-root-z50-mid": 22.6,
"nudge-scale-px-r30-root-z50-on": 20.2,
"nudge-size-px-r0-root-z100-after": 16.2,
"nudge-size-px-r0-root-z100-mid": 14.1,
"nudge-size-px-r0-root-z100-on": 15.6,
"nudge-size-px-r0-root-z50-after": 13.6,
"nudge-size-px-r0-root-z50-mid": 23.3,
"nudge-size-px-r0-root-z50-on": 15.2,
"nudge-size-px-r30-root-z100-after": 19.9,
"nudge-size-px-r30-root-z100-mid": 15.2,
"nudge-size-px-r30-root-z100-on": 16.2,
"nudge-size-px-r30-root-z50-after": 22.5,
"nudge-size-px-r30-root-z50-mid": 11.6,
"nudge-size-px-r30-root-z50-on": 18.3,
"nudge-spin-px-r0-root-z100-after": 18.1,
"nudge-spin-px-r0-root-z100-mid": 19,
"nudge-spin-px-r0-root-z100-on": 17.1,
"nudge-spin-px-r0-root-z50-after": 18.4,
"nudge-spin-px-r0-root-z50-mid": 21,
"nudge-spin-px-r0-root-z50-on": 15.7,
"nudge-spin-px-r30-root-z100-after": 17.7,
"nudge-spin-px-r30-root-z100-mid": 13.3,
"nudge-spin-px-r30-root-z100-on": 19.7,
"nudge-spin-px-r30-root-z50-after": 19.1,
"nudge-spin-px-r30-root-z50-mid": 23.7,
"nudge-spin-px-r30-root-z50-on": 21.4,
"nudge-tween-px-r0-nested-z100": 27.5,
"nudge-tween-px-r0-nested-z50": 20.1,
"nudge-tween-px-r0-root-z100": 19.9,
"nudge-tween-px-r0-root-z50": 19.2,
"nudge-tween-px-r30-nested-z100": 27.3,
"nudge-tween-px-r30-nested-z50": 23.1,
"nudge-tween-px-r30-root-z100": 20.6,
"nudge-tween-px-r30-root-z50": 20.5,
"nudge-tween-xpercent-r0-nested-z100": 22.1,
"nudge-tween-xpercent-r0-nested-z50": 21,
"nudge-tween-xpercent-r0-root-z100": 18.6,
"nudge-tween-xpercent-r0-root-z50": 17.3,
"nudge-tween-xpercent-r30-nested-z100": 26.5,
"nudge-tween-xpercent-r30-nested-z50": 20.1,
"nudge-tween-xpercent-r30-root-z100": 19.6,
"nudge-tween-xpercent-r30-root-z50": 19.2,
"pathcircle-none-center-r0-nested-z100": 27.8,
"pathcircle-none-center-r0-root-z100": 18.4,
"pathcircle-none-pct-r0-nested-z100": 29.5,
"pathcircle-none-pct-r0-root-z100": 30.8,
"pathcircle-none-px-r0-nested-z100": 27.3,
"pathcircle-none-px-r0-root-z100": 24.5,
"pathcircle-none-px-r0-root-z200": 31.6,
"pathcircle-none-px-r0-root-z50": 37.2,
"pathcircle-none-px-r30-root-z100": 20.4,
"pathedge-none-center-r0-nested-z100": 24,
"pathedge-none-center-r0-root-z100": 21.3,
"pathedge-none-pct-r0-nested-z100": 28.3,
"pathedge-none-pct-r0-root-z100": 26.9,
"pathedge-none-px-r0-nested-z100": 24.7,
"pathedge-none-px-r0-root-z100": 31.1,
"pathedge-none-px-r0-root-z200": 27.6,
"pathedge-none-px-r0-root-z50": 19.3,
"pathedge-none-px-r30-root-z100": 18.3,
"pathflick-none-center-r0-nested-z100": 20.2,
"pathflick-none-center-r0-root-z100": 20.8,
"pathflick-none-pct-r0-nested-z100": 34.3,
"pathflick-none-pct-r0-root-z100": 20.4,
"pathflick-none-px-r0-nested-z100": 19.6,
"pathflick-none-px-r0-root-z100": 18.4,
"pathflick-none-px-r0-root-z200": 56.3,
"pathflick-none-px-r0-root-z50": 24.6,
"pathflick-none-px-r30-root-z100": 17.9,
"pathpause-none-center-r0-nested-z100": 42.8,
"pathpause-none-center-r0-root-z100": 41.6,
"pathpause-none-pct-r0-nested-z100": 37,
"pathpause-none-pct-r0-root-z100": 29,
"pathpause-none-px-r0-nested-z100": 35.6,
"pathpause-none-px-r0-root-z100": 38.9,
"pathpause-none-px-r0-root-z200": 27.7,
"pathpause-none-px-r0-root-z50": 54.1,
"pathpause-none-px-r30-root-z100": 20.2,
"pathstray-none-center-r0-nested-z100": 28,
"pathstray-none-center-r0-root-z100": 15.5,
"pathstray-none-pct-r0-nested-z100": 20.7,
"pathstray-none-pct-r0-root-z100": 27.6,
"pathstray-none-px-r0-nested-z100": 26.1,
"pathstray-none-px-r0-root-z100": 17.1,
"pathstray-none-px-r0-root-z200": 21.2,
"pathstray-none-px-r0-root-z50": 49.8,
"pathstray-none-px-r30-root-z100": 33.8,
"pathzigzag-none-center-r0-nested-z100": 21.7,
"pathzigzag-none-center-r0-root-z100": 20.8,
"pathzigzag-none-pct-r0-nested-z100": 22.3,
"pathzigzag-none-pct-r0-root-z100": 27.4,
"pathzigzag-none-px-r0-nested-z100": 34.1,
"pathzigzag-none-px-r0-root-z100": 28.7,
"pathzigzag-none-px-r0-root-z200": 56.5,
"pathzigzag-none-px-r0-root-z50": 42.9,
"pathzigzag-none-px-r30-root-z100": 34.3,
"resize-fromto-px-r0-nested-z100-on": 14.3,
"resize-fromto-px-r0-root-z100-after": 18.1,
"resize-fromto-px-r0-root-z100-mid": 15.8,
"resize-fromto-px-r0-root-z100-on": 18.1,
"resize-fromto-px-r0-root-z50-after": 25.2,
"resize-fromto-px-r0-root-z50-mid": 20.2,
"resize-fromto-px-r0-root-z50-on": 26.1,
"resize-fromto-px-r30-root-z100-after": 21.4,
"resize-fromto-px-r30-root-z100-mid": 15.3,
"resize-fromto-px-r30-root-z100-on": 19,
"resize-fromto-px-r30-root-z50-after": 27.8,
"resize-fromto-px-r30-root-z50-mid": 18.8,
"resize-fromto-px-r30-root-z50-on": 28,
"resize-hold-px-r0-nested-z100": 28,
"resize-hold-px-r0-nested-z50": 27.6,
"resize-hold-px-r0-root-z100": 23.9,
"resize-hold-px-r0-root-z50": 26.9,
"resize-hold-px-r30-nested-z100": 25.9,
"resize-hold-px-r30-nested-z50": 30.9,
"resize-hold-px-r30-root-z100": 24.8,
"resize-hold-px-r30-root-z50": 28.2,
"resize-hold-xpercent-r0-nested-z100": 22.8,
"resize-hold-xpercent-r0-nested-z50": 28.2,
"resize-hold-xpercent-r0-root-z100": 24.5,
"resize-hold-xpercent-r0-root-z50": 24.9,
"resize-hold-xpercent-r30-nested-z100": 25.1,
"resize-hold-xpercent-r30-nested-z50": 29.1,
"resize-hold-xpercent-r30-root-z100": 24.1,
"resize-hold-xpercent-r30-root-z50": 26.1,
"resize-idle-px-r0-nested-z100": 23,
"resize-idle-px-r0-nested-z50": 26.8,
"resize-idle-px-r0-root-z100": 24.8,
"resize-idle-px-r0-root-z50": 28,
"resize-idle-px-r30-nested-z100": 26.9,
"resize-idle-px-r30-nested-z50": 28.4,
"resize-idle-px-r30-root-z100": 29,
"resize-idle-px-r30-root-z50": 29.7,
"resize-keys-px-r0-nested-z100-on": 20.8,
"resize-keys-px-r0-root-z100-after": 16.8,
"resize-keys-px-r0-root-z100-mid": 17.2,
"resize-keys-px-r0-root-z100-on": 16.2,
"resize-keys-px-r0-root-z50-after": 18,
"resize-keys-px-r0-root-z50-mid": 27.2,
"resize-keys-px-r0-root-z50-on": 27.6,
"resize-keys-px-r30-root-z100-after": 16.9,
"resize-keys-px-r30-root-z100-mid": 23.2,
"resize-keys-px-r30-root-z100-on": 16.2,
"resize-keys-px-r30-root-z50-after": 17.2,
"resize-keys-px-r30-root-z50-mid": 28.1,
"resize-keys-px-r30-root-z50-on": 26,
"resize-late-px-r0-nested-z100-on": 23.7,
"resize-late-px-r0-root-z100-after": 20.6,
"resize-late-px-r0-root-z100-before": 16.2,
"resize-late-px-r0-root-z100-on": 14.2,
"resize-late-px-r0-root-z50-after": 25.6,
"resize-late-px-r0-root-z50-before": 25.7,
"resize-late-px-r0-root-z50-on": 18.9,
"resize-late-px-r30-root-z100-after": 13.7,
"resize-late-px-r30-root-z100-before": 17.3,
"resize-late-px-r30-root-z100-on": 12.5,
"resize-late-px-r30-root-z50-after": 18.6,
"resize-late-px-r30-root-z50-before": 26.4,
"resize-late-px-r30-root-z50-on": 18.8,
"resize-none-px-r0-nested-z100": 43.3,
"resize-none-px-r0-nested-z50": 62.1,
"resize-none-px-r0-root-z100": 48.8,
"resize-none-px-r0-root-z50": 53.9,
"resize-none-px-r30-nested-z100": 46.9,
"resize-none-px-r30-nested-z50": 66.1,
"resize-none-px-r30-root-z100": 50.2,
"resize-none-px-r30-root-z50": 54.2,
"resize-scale-px-r0-nested-z100-on": 23.7,
"resize-scale-px-r0-root-z100-after": 17.2,
"resize-scale-px-r0-root-z100-mid": 23,
"resize-scale-px-r0-root-z100-on": 19.7,
"resize-scale-px-r0-root-z50-after": 26.1,
"resize-scale-px-r0-root-z50-mid": 24,
"resize-scale-px-r0-root-z50-on": 24.3,
"resize-scale-px-r30-root-z100-after": 17,
"resize-scale-px-r30-root-z100-mid": 22.7,
"resize-scale-px-r30-root-z100-on": 20.9,
"resize-scale-px-r30-root-z50-after": 26.4,
"resize-scale-px-r30-root-z50-mid": 22.5,
"resize-scale-px-r30-root-z50-on": 23.4,
"resize-size-px-r0-nested-z100-on": 23.4,
"resize-size-px-r0-root-z100-after": 14.1,
"resize-size-px-r0-root-z100-mid": 17.4,
"resize-size-px-r0-root-z100-on": 15.3,
"resize-size-px-r0-root-z50-after": 28.5,
"resize-size-px-r0-root-z50-mid": 25.6,
"resize-size-px-r0-root-z50-on": 24.5,
"resize-size-px-r30-root-z100-after": 21.3,
"resize-size-px-r30-root-z100-mid": 21.9,
"resize-size-px-r30-root-z100-on": 22.6,
"resize-size-px-r30-root-z50-after": 17.9,
"resize-size-px-r30-root-z50-mid": 23.8,
"resize-size-px-r30-root-z50-on": 13.7,
"resize-spin-px-r0-nested-z100-on": 14.4,
"resize-spin-px-r0-root-z100-after": 21.8,
"resize-spin-px-r0-root-z100-mid": 18.5,
"resize-spin-px-r0-root-z100-on": 21.9,
"resize-spin-px-r0-root-z50-after": 26.2,
"resize-spin-px-r0-root-z50-mid": 29.9,
"resize-spin-px-r0-root-z50-on": 25.7,
"resize-spin-px-r30-root-z100-after": 20.9,
"resize-spin-px-r30-root-z100-mid": 16.9,
"resize-spin-px-r30-root-z100-on": 21.5,
"resize-spin-px-r30-root-z50-after": 25.4,
"resize-spin-px-r30-root-z50-mid": 27.5,
"resize-spin-px-r30-root-z50-on": 21.4,
"resize-tween-px-r0-nested-z100": 22.7,
"resize-tween-px-r0-nested-z50": 25.9,
"resize-tween-px-r0-root-z100": 21.1,
"resize-tween-px-r0-root-z50": 25.6,
"resize-tween-px-r30-nested-z100": 23.8,
"resize-tween-px-r30-nested-z50": 29.7,
"resize-tween-px-r30-root-z100": 22.6,
"resize-tween-px-r30-root-z50": 28.6,
"resize-tween-xpercent-r0-nested-z100": 21.5,
"resize-tween-xpercent-r0-nested-z50": 26.4,
"resize-tween-xpercent-r0-root-z100": 19.3,
"resize-tween-xpercent-r0-root-z50": 25.7,
"resize-tween-xpercent-r30-nested-z100": 24.4,
"resize-tween-xpercent-r30-nested-z50": 27.1,
"resize-tween-xpercent-r30-root-z100": 24.2,
"resize-tween-xpercent-r30-root-z50": 27.6,
"rotate-fromto-px-r0-root-z100-after": 19.2,
"rotate-fromto-px-r0-root-z100-mid": 20.2,
"rotate-fromto-px-r0-root-z100-on": 17.6,
"rotate-fromto-px-r0-root-z50-after": 17.7,
"rotate-fromto-px-r0-root-z50-mid": 25.7,
"rotate-fromto-px-r0-root-z50-on": 25.2,
"rotate-fromto-px-r30-root-z100-after": 21.3,
"rotate-fromto-px-r30-root-z100-mid": 18.8,
"rotate-fromto-px-r30-root-z100-on": 16.2,
"rotate-fromto-px-r30-root-z50-after": 16.3,
"rotate-fromto-px-r30-root-z50-mid": 20.4,
"rotate-fromto-px-r30-root-z50-on": 16,
"rotate-hold-px-r0-nested-z100": 14.2,
"rotate-hold-px-r0-nested-z50": 26.8,
"rotate-hold-px-r0-root-z100": 21.7,
"rotate-hold-px-r0-root-z50": 21.7,
"rotate-hold-px-r30-nested-z100": 14.7,
"rotate-hold-px-r30-nested-z50": 27.8,
"rotate-hold-px-r30-root-z100": 25,
"rotate-hold-px-r30-root-z50": 22.3,
"rotate-hold-xpercent-r0-nested-z100": 13.2,
"rotate-hold-xpercent-r0-nested-z50": 26.3,
"rotate-hold-xpercent-r0-root-z100": 22.4,
"rotate-hold-xpercent-r0-root-z50": 22.1,
"rotate-hold-xpercent-r30-nested-z100": 12.6,
"rotate-hold-xpercent-r30-nested-z50": 25.7,
"rotate-hold-xpercent-r30-root-z100": 19.6,
"rotate-hold-xpercent-r30-root-z50": 21.4,
"rotate-idle-px-r0-nested-z100": 18.9,
"rotate-idle-px-r0-nested-z50": 26.7,
"rotate-idle-px-r0-root-z100": 24.9,
"rotate-idle-px-r0-root-z50": 22.1,
"rotate-idle-px-r30-nested-z100": 21.2,
"rotate-idle-px-r30-nested-z50": 27.7,
"rotate-idle-px-r30-root-z100": 27.5,
"rotate-idle-px-r30-root-z50": 22.6,
"rotate-keys-px-r0-root-z100-after": 20.8,
"rotate-keys-px-r0-root-z100-mid": 20,
"rotate-keys-px-r0-root-z100-on": 16.7,
"rotate-keys-px-r0-root-z50-after": 26.6,
"rotate-keys-px-r0-root-z50-mid": 26.2,
"rotate-keys-px-r0-root-z50-on": 25.6,
"rotate-keys-px-r30-root-z100-after": 18.1,
"rotate-keys-px-r30-root-z100-mid": 15.2,
"rotate-keys-px-r30-root-z100-on": 19.5,
"rotate-keys-px-r30-root-z50-after": 18.9,
"rotate-keys-px-r30-root-z50-mid": 15.9,
"rotate-keys-px-r30-root-z50-on": 28.3,
"rotate-late-px-r0-root-z100-after": 15.1,
"rotate-late-px-r0-root-z100-before": 18.3,
"rotate-late-px-r0-root-z100-on": 18.1,
"rotate-late-px-r0-root-z50-after": 27.3,
"rotate-late-px-r0-root-z50-before": 15.6,
"rotate-late-px-r0-root-z50-on": 25.9,
"rotate-late-px-r30-root-z100-after": 13.7,
"rotate-late-px-r30-root-z100-before": 18.4,
"rotate-late-px-r30-root-z100-on": 17.1,
"rotate-late-px-r30-root-z50-after": 18,
"rotate-late-px-r30-root-z50-before": 15.6,
"rotate-late-px-r30-root-z50-on": 15,
"rotate-none-px-r0-nested-z100": 27.4,
"rotate-none-px-r0-nested-z50": 56.3,
"rotate-none-px-r0-root-z100": 48.9,
"rotate-none-px-r0-root-z50": 33.4,
"rotate-none-px-r30-nested-z100": 29.6,
"rotate-none-px-r30-nested-z50": 56.9,
"rotate-none-px-r30-root-z100": 46.9,
"rotate-none-px-r30-root-z50": 33.1,
"rotate-none-transform-r0-nested-z100": 25.1,
"rotate-none-transform-r0-root-z100": 20,
"rotate-none-transform-r30-nested-z100": 22.2,
"rotate-none-transform-r30-root-z100": 25.8,
"rotate-scale-px-r0-root-z100-after": 21.2,
"rotate-scale-px-r0-root-z100-mid": 16.9,
"rotate-scale-px-r0-root-z100-on": 17.3,
"rotate-scale-px-r0-root-z50-after": 24,
"rotate-scale-px-r0-root-z50-mid": 17.7,
"rotate-scale-px-r0-root-z50-on": 25,
"rotate-scale-px-r30-root-z100-after": 19.2,
"rotate-scale-px-r30-root-z100-mid": 17.6,
"rotate-scale-px-r30-root-z100-on": 18.1,
"rotate-scale-px-r30-root-z50-after": 27.2,
"rotate-scale-px-r30-root-z50-mid": 19.1,
"rotate-scale-px-r30-root-z50-on": 25.4,
"rotate-size-px-r0-root-z100-after": 16.7,
"rotate-size-px-r0-root-z100-mid": 12.8,
"rotate-size-px-r0-root-z100-on": 13.8,
"rotate-size-px-r0-root-z50-after": 17.6,
"rotate-size-px-r0-root-z50-mid": 24.7,
"rotate-size-px-r0-root-z50-on": 29,
"rotate-size-px-r30-root-z100-after": 18.3,
"rotate-size-px-r30-root-z100-mid": 19.4,
"rotate-size-px-r30-root-z100-on": 14.3,
"rotate-size-px-r30-root-z50-after": 18.3,
"rotate-size-px-r30-root-z50-mid": 16.5,
"rotate-size-px-r30-root-z50-on": 27.4,
"rotate-spin-px-r0-root-z100-after": 18.8,
"rotate-spin-px-r0-root-z100-mid": 18.2,
"rotate-spin-px-r0-root-z100-on": 12.9,
"rotate-spin-px-r0-root-z50-after": 27.4,
"rotate-spin-px-r0-root-z50-mid": 25.6,
"rotate-spin-px-r0-root-z50-on": 16.8,
"rotate-spin-px-r30-root-z100-after": 15.9,
"rotate-spin-px-r30-root-z100-mid": 18,
"rotate-spin-px-r30-root-z100-on": 12.5,
"rotate-spin-px-r30-root-z50-after": 19.4,
"rotate-spin-px-r30-root-z50-mid": 23.4,
"rotate-spin-px-r30-root-z50-on": 15.5,
"rotate-tween-px-r0-nested-z100": 14.3,
"rotate-tween-px-r0-nested-z50": 25.7,
"rotate-tween-px-r0-root-z100": 19.9,
"rotate-tween-px-r0-root-z50": 20.1,
"rotate-tween-px-r30-nested-z100": 16.6,
"rotate-tween-px-r30-nested-z50": 26.9,
"rotate-tween-px-r30-root-z100": 21.2,
"rotate-tween-px-r30-root-z50": 20.7,
"rotate-tween-xpercent-r0-nested-z100": 13.2,
"rotate-tween-xpercent-r0-nested-z50": 24.9,
"rotate-tween-xpercent-r0-root-z100": 19.1,
"rotate-tween-xpercent-r0-root-z50": 20.5,
"rotate-tween-xpercent-r30-nested-z100": 14.4,
"rotate-tween-xpercent-r30-nested-z50": 26.5,
"rotate-tween-xpercent-r30-root-z100": 19.2,
"rotate-tween-xpercent-r30-root-z50": 20,
"seqab-none-center-r0-nested-z100": 36.5,
"seqab-none-center-r0-root-z100": 50.7,
"seqab-none-pct-r0-nested-z100": 25.7,
"seqab-none-pct-r0-root-z100": 42.7,
"seqab-none-px-r0-nested-z100": 25.4,
"seqab-none-px-r0-root-z100": 45.1,
"seqfastkeys-none-px-r0-root-z100": 37.7,
"seqheldtwice-tlhold-px-r0-nested-z100": 31.5,
"seqheldtwice-tlhold-px-r0-root-z100": 34.6,
"seqinflight-none-center-r0-nested-z100": 24.4,
"seqinflight-none-center-r0-root-z100": 45.7,
"seqinflight-none-pct-r0-nested-z100": 23.3,
"seqinflight-none-pct-r0-root-z100": 39.3,
"seqinflight-none-px-r0-nested-z100": 48.6,
"seqinflight-none-px-r0-root-z100": 37.9,
"seqnudge-none-center-r0-nested-z100": 36.6,
"seqnudge-none-center-r0-root-z100": 32.8,
"seqnudge-none-pct-r0-nested-z100": 22.4,
"seqnudge-none-pct-r0-root-z100": 28.2,
"seqnudge-none-px-r0-nested-z100": 50.4,
"seqnudge-none-px-r0-root-z100": 35.4,
"seqnudgeundo-none-center-r0-nested-z100": 25,
"seqnudgeundo-none-center-r0-root-z100": 16.1,
"seqnudgeundo-none-pct-r0-nested-z100": 10.8,
"seqnudgeundo-none-pct-r0-root-z100": 16.4,
"seqnudgeundo-none-px-r0-nested-z100": 16.6,
"seqnudgeundo-none-px-r0-root-z100": 15.1,
"seqplainkeys-none-center-r0-nested-z100": 65.8,
"seqplainkeys-none-center-r0-root-z100": 43.9,
"seqplainkeys-none-center-r30-nested-z100": 54.3,
"seqplainkeys-none-center-r30-root-z100": 33,
"seqplainkeys-none-pct-r0-nested-z100": 57.8,
"seqplainkeys-none-pct-r0-root-z100": 43,
"seqplainkeys-none-pct-r30-nested-z100": 54.5,
"seqplainkeys-none-pct-r30-root-z100": 34.2,
"seqplainkeys-none-px-r0-nested-z100": 53.1,
"seqplainkeys-none-px-r0-root-z100": 47.3,
"seqplainkeys-none-px-r30-nested-z100": 65.1,
"seqplainkeys-none-px-r30-root-z100": 34.4,
"seqrepeat-none-center-r0-nested-z100": 48,
"seqrepeat-none-center-r0-root-z100": 47,
"seqrepeat-none-pct-r0-nested-z100": 38,
"seqrepeat-none-pct-r0-root-z100": 39.1,
"seqrepeat-none-px-r0-nested-z100": 25.6,
"seqrepeat-none-px-r0-root-z100": 44.9,
"seqresize-none-center-r0-nested-z100": 19.8,
"seqresize-none-center-r0-root-z100": 19,
"seqresize-none-pct-r0-nested-z100": 45.2,
"seqresize-none-pct-r0-root-z100": 20.9,
"seqresize-none-px-r0-nested-z100": 50.6,
"seqresize-none-px-r0-root-z100": 49,
"seqresizedrag-tween-px-r0-nested-z100": 28.5,
"seqresizedrag-tween-px-r0-root-z100": 26.6,
"seqresizeundo-none-center-r0-nested-z100": 40.7,
"seqresizeundo-none-center-r0-root-z100": 18.3,
"seqresizeundo-none-pct-r0-nested-z100": 34.4,
"seqresizeundo-none-pct-r0-root-z100": 34.6,
"seqresizeundo-none-px-r0-nested-z100": 24.7,
"seqresizeundo-none-px-r0-root-z100": 23.1,
"seqresizeundodrag-tween-px-r0-nested-z100": 26.4,
"seqresizeundodrag-tween-px-r0-root-z100": 18.9,
"seqrotatenudge-none-center-r0-nested-z100": 15.6,
"seqrotatenudge-none-center-r0-root-z100": 34.1,
"seqrotatenudge-none-pct-r0-nested-z100": 35.2,
"seqrotatenudge-none-pct-r0-root-z100": 32.8,
"seqrotatenudge-none-px-r0-nested-z100": 15.7,
"seqrotatenudge-none-px-r0-root-z100": 22.2,
"seqseek-none-center-r0-nested-z100": 19.6,
"seqseek-none-center-r0-root-z100": 30.2,
"seqseek-none-pct-r0-nested-z100": 44.7,
"seqseek-none-pct-r0-root-z100": 36,
"seqseek-none-px-r0-nested-z100": 18.6,
"seqseek-none-px-r0-root-z100": 16.7,
"sequndo-none-center-r0-nested-z100": 19.7,
"sequndo-none-center-r0-root-z100": 26.9,
"sequndo-none-pct-r0-nested-z100": 20.6,
"sequndo-none-pct-r0-root-z100": 22.7,
"sequndo-none-px-r0-nested-z100": 39,
"sequndo-none-px-r0-root-z100": 29.2,
"textedit-none-px-r0-nested-z100": 22.8,
"textedit-none-px-r0-root-z100": 11.5,
"textselect-none-px-r0-nested-z100": 20.8,
"textselect-none-px-r0-root-z100": 16.1
}
@@ -0,0 +1,19 @@
#!/usr/bin/env node
// Rewrites timings.json, the seconds `shardCases` packs shards by, as each case's median over the given first runs
// of merge-queue shards: bun run --cwd packages/studio test:edit-accuracy:timings -- <run1/results.json...>
import { readFileSync, writeFileSync } from "node:fs";
const seconds = new Map();
for (const file of process.argv.slice(2))
for (const c of JSON.parse(readFileSync(file, "utf8")).cases)
seconds.set(c.id, [...(seconds.get(c.id) ?? []), c.seconds]);
const median = (values) => {
const sorted = [...values].sort((a, b) => a - b);
const mid = sorted.length >> 1;
return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
};
const timings = Object.fromEntries(
[...seconds].sort(([a], [b]) => a.localeCompare(b)).map(([id, s]) => [id, +median(s).toFixed(1)]),
);
writeFileSync(new URL("timings.json", import.meta.url), `${JSON.stringify(timings, null, 2)}\n`);