diff --git a/packages/studio/AGENTS.md b/packages/studio/AGENTS.md index baa1c245c0..ed50e042b0 100644 --- a/packages/studio/AGENTS.md +++ b/packages/studio/AGENTS.md @@ -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 diff --git a/packages/studio/package.json b/packages/studio/package.json index 758ffeae17..4b91b39c7f 100644 --- a/packages/studio/package.json +++ b/packages/studio/package.json @@ -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", diff --git a/packages/studio/tests/e2e/edit-accuracy/grid.mjs b/packages/studio/tests/e2e/edit-accuracy/grid.mjs index 78c07b7efe..7955eb260e 100644 --- a/packages/studio/tests/e2e/edit-accuracy/grid.mjs +++ b/packages/studio/tests/e2e/edit-accuracy/grid.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 }); diff --git a/packages/studio/tests/e2e/edit-accuracy/grid.test.mjs b/packages/studio/tests/e2e/edit-accuracy/grid.test.mjs index 8a198eeac4..8af92845a4 100644 --- a/packages/studio/tests/e2e/edit-accuracy/grid.test.mjs +++ b/packages/studio/tests/e2e/edit-accuracy/grid.test.mjs @@ -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); + }); +}); diff --git a/packages/studio/tests/e2e/edit-accuracy/run.mjs b/packages/studio/tests/e2e/edit-accuracy/run.mjs index 1c5f37e531..d33c90e088 100644 --- a/packages/studio/tests/e2e/edit-accuracy/run.mjs +++ b/packages/studio/tests/e2e/edit-accuracy/run.mjs @@ -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(); diff --git a/packages/studio/tests/e2e/edit-accuracy/timings.json b/packages/studio/tests/e2e/edit-accuracy/timings.json new file mode 100644 index 0000000000..9a9d8f1315 --- /dev/null +++ b/packages/studio/tests/e2e/edit-accuracy/timings.json @@ -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 +} diff --git a/packages/studio/tests/e2e/edit-accuracy/timings.mjs b/packages/studio/tests/e2e/edit-accuracy/timings.mjs new file mode 100644 index 0000000000..8646314c7e --- /dev/null +++ b/packages/studio/tests/e2e/edit-accuracy/timings.mjs @@ -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 -- +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`);