Skip to content

test: use a common fake clock baseline - #15052

Merged
DrJKL merged 1 commit into
mainfrom
test/global-vitest-clock-baseline
Aug 11, 2026
Merged

test: use a common fake clock baseline#15052
DrJKL merged 1 commit into
mainfrom
test/global-vitest-clock-baseline

Conversation

@DrJKL

@DrJKL DrJKL commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Summary

Child of #15050. Give every root Vitest test the same named fake-clock baseline and express scenario time as relative movement from that baseline.

const TEST_SYSTEM_TIME = Date.parse('2024-06-15T12:00:00Z')
  • reduces test-local vi.setSystemTime() calls from 44 to 7
  • replaces arbitrary Unix-adjacent timestamps and unrelated calendar dates with Date.now()-relative fixtures
  • uses vi.advanceTimersByTime() when elapsed time, rather than a wall-clock jump, is the behavior under test
  • retains six non-firing wall-clock jumps where advancing timers would execute scheduled work and change the scenario
  • retains one explicit July 2026 clock for calendar-boundary filtering
  • makes a template-freshness fixture relative to the baseline instead of depending on the actual current date
  • aligns a module-scoped workspace-token expiry with the deterministic test clock

Baseline choice

The most frequent exact timestamp was 1_000_000 ms (five calls), equivalent to 1970-01-01T00:16:40Z. That value was common but arbitrary.

June 15, 2024 was the most common meaningful calendar anchor: four date-oriented setups used that day. Noon UTC is explicit, stable, and compatible with the root project's existing TZ=UTC configuration.

Results

Metric Before After Change
vi.setSystemTime() calls 44 7 −37 (−84%)
Files containing those calls 14 3 −11 (−79%)
Root tests passed 15,892 15,892 No regression
Root tests skipped 8 8 No change

The first full run exposed one hidden real-date dependency in templateRankingStore.test.ts: a hardcoded January 2024 template was only “very old” relative to the present day. It is now represented as three years before Date.now(), matching the behavior the assertion describes.

Validation

  • pnpm test:unit: 1,159 files passed; 15,892 tests passed; 8 skipped
  • pnpm lint
  • pnpm typecheck
  • oxfmt and type-aware Oxlint on all changed files
  • pre-push pnpm knip --cache

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 28d89fb2-64fe-40cf-b3b6-7a23fc05d1ac

📥 Commits

Reviewing files that changed from the base of the PR and between 1114a71 and 95a43cd.

📒 Files selected for processing (1)
  • src/platform/assets/composables/useMediaAssetFiltering.test.ts

📝 Walkthrough

Walkthrough

The PR centralizes Vitest’s fake-clock baseline and updates time-dependent tests to use Date.now(), relative timestamps, or timer advancement. Local fixed system-time setup is removed across queue, platform, workflow, renderer, store, and utility tests.

Changes

Test clock migration

Layer / File(s) Summary
Central Vitest clock
vite.config.mts
Vitest fake timers now start at the shared TEST_SYSTEM_TIME constant while retaining automatic advancement.
Queue and widget timer tests
src/composables/queue/*, src/renderer/extensions/vueNodes/widgets/composables/*
Queue fixtures use current-time-relative timestamps. Remote widget tests advance timers for refresh and retry intervals.
Persistence and version timestamps
src/platform/workflow/persistence/..., src/platform/surveys/useFeatureUsageTracker.test.ts, src/platform/updates/common/versionCompatibilityStore.test.ts
Tests use captured timestamps or relative timer advancement for recency, usage, dismissal, and expiration behavior.
Remaining clock-dependent tests
src/platform/assets/..., src/platform/surveys/*, src/platform/telemetry/*, src/platform/workspace/*, src/renderer/..., src/stores/*, src/utils/*
Tests remove local clock overrides or derive dates from the current clock.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

Suggested reviewers: christian-byrne


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
End-To-End Regression Coverage For Fixes ❓ Inconclusive The changed-file list and description are available, but the PR title and commit subjects are not; the required bug-fix signal cannot be assessed. Provide the PR title and commit subjects, then reassess whether the explicit bug-fix condition applies.
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the shared fake-clock baseline introduced by the pull request.
Description check ✅ Passed The description covers the change, rationale, scope, results, and validation, although it omits some template headings.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Adr Compliance For Entity/Litegraph Changes ✅ Passed The changed-file list contains no files under src/lib/litegraph/, src/ecs/, or graph-entity-related paths, so this check does not apply.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch test/global-vitest-clock-baseline

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown

🎭 Playwright: ✅ 1802 passed, 0 failed · 2 flaky

📊 Browser Reports
  • chromium: View Report (✅ 1781 / ❌ 0 / ⚠️ 2 / ⏭️ 5)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 18 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 08/11/2026, 10:21:33 PM UTC

Links

📦 Bundle: 8.69 MB gzip ⚪ 0 B

Details

Summary

  • Raw size: 36.7 MB baseline 36.7 MB — ⚪ 0 B
  • Gzip: 8.69 MB baseline 8.69 MB — ⚪ 0 B
  • Brotli: 6.06 MB baseline 6.06 MB — ⚪ 0 B
  • Bundles: 436 current • 436 baseline

Category Glance
Vendor & Third-Party ⚪ 0 B (16.3 MB) · Other ⚪ 0 B (14 MB) · Data & Services ⚪ 0 B (3.5 MB) · Graph Workspace ⚪ 0 B (1.36 MB) · Panels & Settings ⚪ 0 B (565 kB) · Utilities & Hooks ⚪ 0 B (550 kB) · + 5 more

App Entry Points — 3.67 kB (baseline 3.67 kB) • ⚪ 0 B

Main entry bundles and manifests

Status: 1 unchanged

Graph Workspace — 1.36 MB (baseline 1.36 MB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

Status: 3 unchanged

Views & Navigation — 124 kB (baseline 124 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

Status: 17 unchanged

Panels & Settings — 565 kB (baseline 565 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

Status: 26 unchanged

User & Accounts — 27 kB (baseline 27 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

Status: 10 unchanged

Editors & Dialogs — 125 kB (baseline 125 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

Status: 8 unchanged

UI Components — 67.1 kB (baseline 67.1 kB) • ⚪ 0 B

Reusable component library chunks

Status: 14 unchanged

Data & Services — 3.5 MB (baseline 3.5 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

Status: 17 unchanged

Utilities & Hooks — 550 kB (baseline 550 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

Status: 38 unchanged

Vendor & Third-Party — 16.3 MB (baseline 16.3 MB) • ⚪ 0 B

External libraries and shared vendor chunks

Status: 17 unchanged

Other — 14 MB (baseline 14 MB) • ⚪ 0 B

Bundles that do not match a named category

Status: 285 unchanged

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.0 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 45.6 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.9 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 50.9 MB heap
large-graph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 64.6 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 62.4 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 75.4 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 64.7 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 51.4 MB heap
subgraph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 66.9 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 50.9 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 138ms TBT · 73.4 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.8 MB heap
vue-large-graph-idle: · 56.2 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 153.5 MB heap
vue-large-graph-pan: · 54.6 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 778ms TBT · 169.7 MB heap
workflow-execution: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 65.4 MB heap

⚠️ 12 regressions detected

Show regressions
Metric Baseline PR (median) Δ Sig
canvas-idle: task duration 609ms 606ms -0% ⚠️ z=6.8
canvas-mouse-sweep: task duration 992ms 1000ms +1% ⚠️ z=2.3
canvas-zoom-sweep: task duration 456ms 458ms +0% ⚠️ z=5.7
dom-widget-clipping: task duration 399ms 414ms +4% ⚠️ z=3.0
large-graph-idle: task duration 850ms 843ms -1% ⚠️ z=5.6
large-graph-idle: script duration 126ms 126ms +0% ⚠️ z=2.3
large-graph-pan: task duration 1406ms 1423ms +1% ⚠️ z=7.9
large-graph-pan: script duration 451ms 458ms +1% ⚠️ z=2.5
minimap-idle: task duration 836ms 839ms +0% ⚠️ z=6.6
minimap-idle: script duration 129ms 129ms +0% ⚠️ z=3.2
subgraph-dom-widget-clipping: task duration 430ms 441ms +3% ⚠️ z=3.4
subgraph-idle: task duration 604ms 570ms -6% ⚠️ z=6.4
All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: avg frame time 17ms 17ms +0% z=-0.1
canvas-idle: p95 frame time 17ms 17ms +0%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 8ms 9ms +8% z=-2.6
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 8 9 +13% z=-3.8
canvas-idle: task duration 609ms 606ms -0% ⚠️ z=6.8
canvas-idle: script duration 25ms 26ms +3% z=0.3
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 44.6 MB 67.0 MB +50%
canvas-idle: DOM nodes 4 18 +350% z=-3.6
canvas-idle: event listeners -153 5 -103% z=-1.4
canvas-mouse-sweep: avg frame time 17ms 17ms -0% z=-0.4
canvas-mouse-sweep: p95 frame time 17ms 17ms -0%
canvas-mouse-sweep: layout duration 4ms 4ms -7% z=0.9
canvas-mouse-sweep: style recalc duration 44ms 42ms -5% z=-0.3
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 76 75 -1% z=-1.6
canvas-mouse-sweep: task duration 992ms 1000ms +1% ⚠️ z=2.3
canvas-mouse-sweep: script duration 131ms 130ms -1% z=-0.9
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 49.9 MB 45.6 MB -9%
canvas-mouse-sweep: DOM nodes -282 -283 +0% z=-133.5
canvas-mouse-sweep: event listeners -153 -153 +0% z=-38.7
canvas-zoom-sweep: avg frame time 17ms 17ms -0% z=-0.3
canvas-zoom-sweep: p95 frame time 17ms 17ms +0%
canvas-zoom-sweep: layout duration 1ms 1ms -4% z=0.0
canvas-zoom-sweep: style recalc duration 19ms 19ms -3% z=-0.1
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 31 31 +0% z=-0.6
canvas-zoom-sweep: task duration 456ms 458ms +0% ⚠️ z=5.7
canvas-zoom-sweep: script duration 28ms 28ms -2% z=0.2
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 69.5 MB 69.9 MB +0%
canvas-zoom-sweep: DOM nodes 77 77 +0% z=-2.8
canvas-zoom-sweep: event listeners 19 19 +0% z=-0.9
dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
dom-widget-clipping: p95 frame time 17ms 17ms +0%
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 7ms 8ms +16% z=-1.8
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 10 12 +15% z=-3.2
dom-widget-clipping: task duration 399ms 414ms +4% ⚠️ z=3.0
dom-widget-clipping: script duration 60ms 63ms +5% z=-1.5
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 50.7 MB 50.9 MB +0%
dom-widget-clipping: DOM nodes 16 19 +19% z=-2.2
dom-widget-clipping: event listeners 2 2 +0% variance too high
large-graph-idle: avg frame time 17ms 17ms -0% z=-0.6
large-graph-idle: p95 frame time 17ms 17ms +0%
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 8ms 8ms +4% z=-4.1
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 8 8 -6% z=-13.1
large-graph-idle: task duration 850ms 843ms -1% ⚠️ z=5.6
large-graph-idle: script duration 126ms 126ms +0% ⚠️ z=2.3
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 63.5 MB 64.6 MB +2%
large-graph-idle: DOM nodes -283 -284 +0% z=-341.0
large-graph-idle: event listeners -149 -148 -1% z=-28.6
large-graph-pan: avg frame time 17ms 17ms -0% z=-0.2
large-graph-pan: p95 frame time 17ms 17ms -0%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 15ms 15ms +2% z=-2.8
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 68 68 -1% z=-3.2
large-graph-pan: task duration 1406ms 1423ms +1% ⚠️ z=7.9
large-graph-pan: script duration 451ms 458ms +1% ⚠️ z=2.5
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 62.7 MB 62.4 MB -1%
large-graph-pan: DOM nodes -286 -287 +0% z=-185.5
large-graph-pan: event listeners -151 -149 -1% z=-185.9
large-graph-zoom: avg frame time 17ms 17ms -0%
large-graph-zoom: p95 frame time 17ms 17ms +0%
large-graph-zoom: layout duration 9ms 9ms -4%
large-graph-zoom: style recalc duration 17ms 16ms -4%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 64 64 +0%
large-graph-zoom: task duration 1724ms 1677ms -3%
large-graph-zoom: script duration 601ms 582ms -3%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 68.4 MB 75.4 MB +10%
large-graph-zoom: DOM nodes -290 -140 -52%
large-graph-zoom: event listeners -153 -72 -53%
minimap-idle: avg frame time 17ms 17ms +0% z=0.7
minimap-idle: p95 frame time 17ms 17ms +0%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 7ms 6ms -13% z=-4.2
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 7 7 -7% z=-4.5
minimap-idle: task duration 836ms 839ms +0% ⚠️ z=6.6
minimap-idle: script duration 129ms 129ms +0% ⚠️ z=3.2
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 64.2 MB 64.7 MB +1%
minimap-idle: DOM nodes -285 -285 -0% z=-222.0
minimap-idle: event listeners -149 -149 +0% z=-232.6
subgraph-dom-widget-clipping: avg frame time 17ms 17ms -0% z=-0.4
subgraph-dom-widget-clipping: p95 frame time 17ms 17ms -0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms +0%
subgraph-dom-widget-clipping: style recalc duration 11ms 11ms +9% z=-1.3
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 46 47 +1% z=-2.5
subgraph-dom-widget-clipping: task duration 430ms 441ms +3% ⚠️ z=3.4
subgraph-dom-widget-clipping: script duration 129ms 128ms -0% z=0.0
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 51.3 MB 51.4 MB +0%
subgraph-dom-widget-clipping: DOM nodes 18 19 +6% z=-2.8
subgraph-dom-widget-clipping: event listeners 8 7 -13% z=-1.6
subgraph-idle: avg frame time 17ms 17ms -0% z=-0.2
subgraph-idle: p95 frame time 17ms 17ms +0%
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 9ms 8ms -3% z=-2.6
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 9 9 +0% z=-2.9
subgraph-idle: task duration 604ms 570ms -6% ⚠️ z=6.4
subgraph-idle: script duration 22ms 22ms +0% z=0.5
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 67.2 MB 66.9 MB -0%
subgraph-idle: DOM nodes 18 18 +0% z=-2.5
subgraph-idle: event listeners 4 4 +0% variance too high
subgraph-mouse-sweep: avg frame time 17ms 17ms -0% z=-0.5
subgraph-mouse-sweep: p95 frame time 17ms 17ms +0%
subgraph-mouse-sweep: layout duration 5ms 5ms -0% z=0.4
subgraph-mouse-sweep: style recalc duration 41ms 41ms +0% z=-0.5
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 78 78 -1% z=-1.4
subgraph-mouse-sweep: task duration 858ms 875ms +2% z=1.6
subgraph-mouse-sweep: script duration 102ms 103ms +1% z=0.3
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 57.9 MB 50.9 MB -12%
subgraph-mouse-sweep: DOM nodes 63 63 +0% z=-1.8
subgraph-mouse-sweep: event listeners 4 4 +0% variance too high
subgraph-transition-enter: avg frame time 17ms 17ms -0%
subgraph-transition-enter: p95 frame time 17ms 17ms +0%
subgraph-transition-enter: layout duration 12ms 12ms +0%
subgraph-transition-enter: style recalc duration 31ms 31ms -2%
subgraph-transition-enter: layout count 13 13 +0%
subgraph-transition-enter: style recalc count 17 17 +0%
subgraph-transition-enter: task duration 1091ms 1037ms -5%
subgraph-transition-enter: script duration 42ms 39ms -6%
subgraph-transition-enter: TBT 130ms 138ms +6%
subgraph-transition-enter: heap used 95.3 MB 73.4 MB -23%
subgraph-transition-enter: DOM nodes 13673 13673 +0%
subgraph-transition-enter: event listeners 2375 2375 +0%
viewport-pan-sweep: avg frame time 17ms 17ms +0%
viewport-pan-sweep: p95 frame time 17ms 17ms +0%
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 46ms 45ms -2%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 250 250 +0%
viewport-pan-sweep: task duration 5087ms 5011ms -1%
viewport-pan-sweep: script duration 1502ms 1453ms -3%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 71.3 MB 67.8 MB -5%
viewport-pan-sweep: DOM nodes -283 -281 -1%
viewport-pan-sweep: event listeners -131 -146 +11%
vue-large-graph-idle: avg frame time 18ms 18ms +0%
vue-large-graph-idle: p95 frame time 17ms 17ms -0%
vue-large-graph-idle: layout duration 0ms 0ms +0%
vue-large-graph-idle: style recalc duration 0ms 0ms +0%
vue-large-graph-idle: layout count 0 0 +0%
vue-large-graph-idle: style recalc count 0 0 +0%
vue-large-graph-idle: task duration 18529ms 18513ms -0%
vue-large-graph-idle: script duration 580ms 581ms +0%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 158.0 MB 153.5 MB -3%
vue-large-graph-idle: DOM nodes -8312 -8312 +0%
vue-large-graph-idle: event listeners -16387 -16386 -0%
vue-large-graph-pan: avg frame time 18ms 18ms -0%
vue-large-graph-pan: p95 frame time 17ms 17ms +0%
vue-large-graph-pan: layout duration 0ms 0ms +0%
vue-large-graph-pan: style recalc duration 28ms 29ms +1%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 177 174 -2%
vue-large-graph-pan: task duration 23556ms 23332ms -1%
vue-large-graph-pan: script duration 983ms 962ms -2%
vue-large-graph-pan: TBT 1019ms 778ms -24%
vue-large-graph-pan: heap used 159.0 MB 169.7 MB +7%
vue-large-graph-pan: DOM nodes -8312 -8312 +0%
vue-large-graph-pan: event listeners -16381 -16379 -0%
workflow-execution: avg frame time 17ms 17ms +0% z=0.6
workflow-execution: p95 frame time 17ms 17ms +0%
workflow-execution: layout duration 1ms 1ms +57% z=-3.0
workflow-execution: style recalc duration 21ms 21ms +1% z=-1.3
workflow-execution: layout count 3 3 +0% z=-3.6
workflow-execution: style recalc count 12 16 +29% z=-1.1
workflow-execution: task duration 130ms 136ms +4% z=1.2
workflow-execution: script duration 11ms 12ms +2% z=-5.9
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 65.3 MB 65.4 MB +0%
workflow-execution: DOM nodes 122 136 +11% z=-3.6
workflow-execution: event listeners 97 99 +2% z=10.8
Historical variance (last 15 runs)
Metric μ σ CV
canvas-idle: avg frame time 17ms 0ms 0.0%
canvas-idle: layout duration 0ms 0ms 0.0%
canvas-idle: style recalc duration 11ms 1ms 8.2%
canvas-idle: layout count 0 0 0.0%
canvas-idle: style recalc count 11 1 5.0%
canvas-idle: task duration 395ms 31ms 7.9%
canvas-idle: script duration 25ms 2ms 8.8%
canvas-idle: TBT 0ms 0ms 0.0%
canvas-idle: DOM nodes 23 1 5.6%
canvas-idle: event listeners 12 5 40.9%
canvas-mouse-sweep: avg frame time 17ms 0ms 0.0%
canvas-mouse-sweep: layout duration 4ms 0ms 5.4%
canvas-mouse-sweep: style recalc duration 43ms 3ms 7.4%
canvas-mouse-sweep: layout count 12 0 0.0%
canvas-mouse-sweep: style recalc count 79 2 3.0%
canvas-mouse-sweep: task duration 865ms 58ms 6.7%
canvas-mouse-sweep: script duration 136ms 6ms 4.8%
canvas-mouse-sweep: TBT 0ms 0ms 0.0%
canvas-mouse-sweep: DOM nodes 62 3 4.2%
canvas-mouse-sweep: event listeners 8 4 49.4%
canvas-zoom-sweep: avg frame time 17ms 0ms 0.0%
canvas-zoom-sweep: layout duration 1ms 0ms 7.0%
canvas-zoom-sweep: style recalc duration 19ms 2ms 8.0%
canvas-zoom-sweep: layout count 6 0 0.0%
canvas-zoom-sweep: style recalc count 31 0 1.5%
canvas-zoom-sweep: task duration 327ms 23ms 7.1%
canvas-zoom-sweep: script duration 27ms 3ms 11.1%
canvas-zoom-sweep: TBT 0ms 0ms 0.0%
canvas-zoom-sweep: DOM nodes 79 1 1.0%
canvas-zoom-sweep: event listeners 24 5 21.8%
dom-widget-clipping: avg frame time 17ms 0ms 0.0%
dom-widget-clipping: layout duration 0ms 0ms 0.0%
dom-widget-clipping: style recalc duration 10ms 1ms 8.0%
dom-widget-clipping: layout count 0 0 0.0%
dom-widget-clipping: style recalc count 13 0 3.8%
dom-widget-clipping: task duration 365ms 16ms 4.5%
dom-widget-clipping: script duration 68ms 3ms 4.8%
dom-widget-clipping: TBT 0ms 0ms 0.0%
dom-widget-clipping: DOM nodes 22 1 6.4%
dom-widget-clipping: event listeners 8 6 81.2%
large-graph-idle: avg frame time 17ms 0ms 0.0%
large-graph-idle: layout duration 0ms 0ms 0.0%
large-graph-idle: style recalc duration 12ms 1ms 8.6%
large-graph-idle: layout count 0 0 0.0%
large-graph-idle: style recalc count 12 0 2.7%
large-graph-idle: task duration 542ms 54ms 10.0%
large-graph-idle: script duration 102ms 11ms 10.3%
large-graph-idle: TBT 0ms 0ms 0.0%
large-graph-idle: DOM nodes 25 1 3.7%
large-graph-idle: event listeners 26 6 23.2%
large-graph-pan: avg frame time 17ms 0ms 0.0%
large-graph-pan: layout duration 0ms 0ms 0.0%
large-graph-pan: style recalc duration 17ms 1ms 4.6%
large-graph-pan: layout count 0 0 0.0%
large-graph-pan: style recalc count 70 1 0.9%
large-graph-pan: task duration 1082ms 43ms 4.0%
large-graph-pan: script duration 408ms 20ms 4.8%
large-graph-pan: TBT 0ms 0ms 0.0%
large-graph-pan: DOM nodes 19 2 8.7%
large-graph-pan: event listeners 5 1 16.8%
minimap-idle: avg frame time 17ms 0ms 0.0%
minimap-idle: layout duration 0ms 0ms 0.0%
minimap-idle: style recalc duration 10ms 1ms 8.6%
minimap-idle: layout count 0 0 0.0%
minimap-idle: style recalc count 10 1 7.1%
minimap-idle: task duration 527ms 47ms 9.0%
minimap-idle: script duration 98ms 10ms 10.1%
minimap-idle: TBT 0ms 0ms 0.0%
minimap-idle: DOM nodes 19 1 7.1%
minimap-idle: event listeners 5 1 14.4%
subgraph-dom-widget-clipping: avg frame time 17ms 0ms 0.0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms 0.0%
subgraph-dom-widget-clipping: style recalc duration 13ms 1ms 7.4%
subgraph-dom-widget-clipping: layout count 0 0 0.0%
subgraph-dom-widget-clipping: style recalc count 48 1 1.2%
subgraph-dom-widget-clipping: task duration 378ms 18ms 4.9%
subgraph-dom-widget-clipping: script duration 128ms 6ms 4.9%
subgraph-dom-widget-clipping: TBT 0ms 0ms 0.0%
subgraph-dom-widget-clipping: DOM nodes 22 1 5.0%
subgraph-dom-widget-clipping: event listeners 16 6 36.0%
subgraph-idle: avg frame time 17ms 0ms 0.0%
subgraph-idle: layout duration 0ms 0ms 0.0%
subgraph-idle: style recalc duration 10ms 1ms 7.5%
subgraph-idle: layout count 0 0 0.0%
subgraph-idle: style recalc count 11 1 6.0%
subgraph-idle: task duration 370ms 31ms 8.5%
subgraph-idle: script duration 20ms 3ms 13.2%
subgraph-idle: TBT 0ms 0ms 0.0%
subgraph-idle: DOM nodes 22 1 6.9%
subgraph-idle: event listeners 10 7 64.5%
subgraph-mouse-sweep: avg frame time 17ms 0ms 0.0%
subgraph-mouse-sweep: layout duration 5ms 0ms 6.8%
subgraph-mouse-sweep: style recalc duration 42ms 3ms 7.8%
subgraph-mouse-sweep: layout count 16 0 0.0%
subgraph-mouse-sweep: style recalc count 80 2 2.4%
subgraph-mouse-sweep: task duration 766ms 69ms 9.0%
subgraph-mouse-sweep: script duration 101ms 7ms 6.5%
subgraph-mouse-sweep: TBT 0ms 0ms 0.0%
subgraph-mouse-sweep: DOM nodes 67 2 3.3%
subgraph-mouse-sweep: event listeners 8 4 52.6%
workflow-execution: avg frame time 17ms 0ms 0.0%
workflow-execution: layout duration 2ms 0ms 9.4%
workflow-execution: style recalc duration 24ms 2ms 9.1%
workflow-execution: layout count 5 1 11.0%
workflow-execution: style recalc count 18 2 11.5%
workflow-execution: task duration 123ms 11ms 8.8%
workflow-execution: script duration 29ms 3ms 10.2%
workflow-execution: TBT 0ms 0ms 0.0%
workflow-execution: DOM nodes 161 7 4.4%
workflow-execution: event listeners 52 4 8.4%
Trend (last 15 commits on main)
Metric Trend Dir Latest
canvas-idle: avg frame time ▆▃▆▁▆▃▆█▆▆▄▃▃▄▃ ➡️ 17ms
canvas-idle: p95 frame time ➡️ NaNms
canvas-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: style recalc duration ▇▇▆▆▃█▄▃▄▃▇▄▁▆▇ ➡️ 11ms
canvas-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
canvas-idle: style recalc count █▃▅▂▅▆▃▁▂▁▂▅▆▅▆ ➡️ 12
canvas-idle: task duration ▃▃▃▆▂▃▃▅▆▂█▃▁▃▃ ➡️ 391ms
canvas-idle: script duration ▄▃▅▇▂▅▃▆▇▅█▄▁▅▆ ➡️ 27ms
canvas-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: heap used ➡️ NaN MB
canvas-idle: DOM nodes █▇▆▅▃▇▃▁▂▂▅▆▆▆▇ ➡️ 24
canvas-idle: event listeners ▅█▅▄▁▅▁▁▁▄▅▅▁▅▄ 📉 11
canvas-mouse-sweep: avg frame time ▆█▆▃▁▃▁▆▆▁▃▆▆▃▃ ➡️ 17ms
canvas-mouse-sweep: p95 frame time ➡️ NaNms
canvas-mouse-sweep: layout duration ▁▃▂▄▁▂▁▃▆▂█▇▆▄▃ ➡️ 4ms
canvas-mouse-sweep: style recalc duration ▄▄▂▄▁▂▃▃▅▄█▆▂▄▄ ➡️ 43ms
canvas-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 12
canvas-mouse-sweep: style recalc count █▅▄▃▂▂▁▄▄▅▆▅▂▇▄ ➡️ 79
canvas-mouse-sweep: task duration █▆▄▂▂▃▂▄▄▅█▆▁▆▄ ➡️ 868ms
canvas-mouse-sweep: script duration ▄▅▄▆▄▆▆▆▅▅█▆▁▅▆ ➡️ 139ms
canvas-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-mouse-sweep: heap used ➡️ NaN MB
canvas-mouse-sweep: DOM nodes █▅▃▃▁▂▂▃▂▄▆▅▃▅▅ ➡️ 64
canvas-mouse-sweep: event listeners █▁▁▁▁▁▇▁▁▁██▇▁█ 📈 13
canvas-zoom-sweep: avg frame time ▅▅█▄▅▁▁▁▅▁▁▅▄▅▁ ➡️ 17ms
canvas-zoom-sweep: p95 frame time ➡️ NaNms
canvas-zoom-sweep: layout duration ▆▅▅▄▁▁█▅▃▅▇▆▁▂▆ ➡️ 1ms
canvas-zoom-sweep: style recalc duration ▆▅▄▆▅▃█▆▇▅▇▄▁▃▅ ➡️ 20ms
canvas-zoom-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 6
canvas-zoom-sweep: style recalc count ▁▁▃▄▆▃▆█▄▄▆▁▆▁▆ ➡️ 32
canvas-zoom-sweep: task duration ▄▂▁▇▂▂▄▅▆▃█▄▁▁▅ ➡️ 338ms
canvas-zoom-sweep: script duration ▃▃▂▇▂▂▅▇▆▅█▄▁▂▆ ➡️ 30ms
canvas-zoom-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-zoom-sweep: heap used ➡️ NaN MB
canvas-zoom-sweep: DOM nodes ▄▃▁▅█▁▃▆▄▅▅▃▃▄▃ ➡️ 79
canvas-zoom-sweep: event listeners ▁▁▂▅█▂▁▅▁▅▅▄▁▅▁ ➡️ 19
dom-widget-clipping: avg frame time ▂▄▅▅▂▄█▇▅▇▇▅▅▁▇ ➡️ 17ms
dom-widget-clipping: p95 frame time ➡️ NaNms
dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: style recalc duration ▆▆▂▆▄▃██▄▁▆▇▆▃▅ ➡️ 10ms
dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
dom-widget-clipping: style recalc count ▇█▅█▅▄█▇▇▁▇▄▇▂▅ ➡️ 13
dom-widget-clipping: task duration ▃▃▁▅▄▃▅▆▅▂▇█▁▅▅ ➡️ 371ms
dom-widget-clipping: script duration ▅▄▄▆▆▅▇▇▆▃█▇▁▇▇ ➡️ 71ms
dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: heap used ➡️ NaN MB
dom-widget-clipping: DOM nodes ▇▇▄▇▅▄█▇▅▁▅▄▇▃▄ ➡️ 21
dom-widget-clipping: event listeners ▅▅▅▅▁▅██▁▁▁▁█▁▁ 📉 2
large-graph-idle: avg frame time ▅▅▅▅▅▂▁▂▄▅▄▂▂▅█ ➡️ 17ms
large-graph-idle: p95 frame time ➡️ NaNms
large-graph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: style recalc duration ▅▅▅▆▄▅▃▄▅▅▆█▁▄▆ ➡️ 13ms
large-graph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-idle: style recalc count █▆█▃▃▁▃▆▃▆▆▃▆██ ➡️ 12
large-graph-idle: task duration ▂▃▂▆▂▃▃▇▅▃██▁▂▅ ➡️ 569ms
large-graph-idle: script duration ▄▅▄▆▄▅▅▇▆▅█▆▁▃▆ ➡️ 110ms
large-graph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: heap used ➡️ NaN MB
large-graph-idle: DOM nodes ▆█▅▂▅▃▁▂▃▅▅▆▂▆▅ ➡️ 25
large-graph-idle: event listeners ███▇██▄▁▄▇▇█▂█▇ ➡️ 29
large-graph-pan: avg frame time ▆▃▃▆█▃▁█▆▆▆▆█▁▆ ➡️ 17ms
large-graph-pan: p95 frame time ➡️ NaNms
large-graph-pan: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: style recalc duration ▃▂▄▄▁▅▂▂▁▄▄█▃▁▂ ➡️ 17ms
large-graph-pan: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-pan: style recalc count ▆▃█▂▃▂▂▂▁▇▅▃█▆▃ ➡️ 69
large-graph-pan: task duration ▄▃▄▆▄▄▄▆▄▄█▆▁▂▅ ➡️ 1100ms
large-graph-pan: script duration ▅▄▅▆▆▅▄▆▄▅█▄▁▄▅ ➡️ 413ms
large-graph-pan: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: heap used ➡️ NaN MB
large-graph-pan: DOM nodes ▅▃▆▂▄▁▃▁▁▅▁▂█▅▂ ➡️ 18
large-graph-pan: event listeners █▆█▁▁▆▁▁▃▆▁▃██▃ ➡️ 5
minimap-idle: avg frame time ▃▆▆▃█▁█▆▆▃▃▆█▆█ ➡️ 17ms
minimap-idle: p95 frame time ➡️ NaNms
minimap-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: style recalc duration ▄█▁█▅▅█▅▅▃▅▁▁▄▆ ➡️ 10ms
minimap-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
minimap-idle: style recalc count ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 9
minimap-idle: task duration ▃▄▁▅▁▃▄▅▇▃█▅▁▁▅ ➡️ 547ms
minimap-idle: script duration ▄▆▃▇▃▅▆▆▇▅█▅▁▃▆ ➡️ 106ms
minimap-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: heap used ➡️ NaN MB
minimap-idle: DOM nodes ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 19
minimap-idle: event listeners ▃▃▆▁▁▁▃▁▁▆▁▃█▆▁ ➡️ 4
subgraph-dom-widget-clipping: avg frame time ▅▄▄▄▄▄█▄▄▄▃▁▆▃▃ ➡️ 17ms
subgraph-dom-widget-clipping: p95 frame time ➡️ NaNms
subgraph-dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: style recalc duration ▂▄▃▅▅▃▂▅▇▃▄█▁▄▆ ➡️ 14ms
subgraph-dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-dom-widget-clipping: style recalc count ▇█▆▃▆▃▁▆█▇▃▆▇█▅ ➡️ 48
subgraph-dom-widget-clipping: task duration ▂▃▃▆▅▅▂▅█▂▆█▁▂▇ ➡️ 398ms
subgraph-dom-widget-clipping: script duration ▃▃▃▄▅▅▂▄█▂▅▇▁▂▅ ➡️ 131ms
subgraph-dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: heap used ➡️ NaN MB
subgraph-dom-widget-clipping: DOM nodes ▅▇▅▂▅▂▁▅▅▅▁▇▅█▄ ➡️ 22
subgraph-dom-widget-clipping: event listeners ▅▅▅▂▅▁▅██▁▁█▅█▅ 📈 16
subgraph-idle: avg frame time ▆▆█▁▆▃▆▆▆▃▆▁▃▆█ ➡️ 17ms
subgraph-idle: p95 frame time ➡️ NaNms
subgraph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: style recalc duration ▁▇▃▆▂▄▂▃▃▆▆▄▃▇█ ➡️ 12ms
subgraph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-idle: style recalc count ▃▆▃▃▂▅▁▂▁▆▃▃██▇ ➡️ 12
subgraph-idle: task duration ▁▃▁▇▁▁▃▆▅▂█▅▁▁▄ ➡️ 378ms
subgraph-idle: script duration ▁▃▂▇▁▂▃▇▆▂█▅▂▁▅ ➡️ 22ms
subgraph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: heap used ➡️ NaN MB
subgraph-idle: DOM nodes ▃▅▃▂▁▄▁▂▁▅▃▂▇█▇ ➡️ 24
subgraph-idle: event listeners ▁▅▁▁▁▁▁▁▁▅▄▁███ 📈 21
subgraph-mouse-sweep: avg frame time ▅▄▁▃▃▄▆▄▆▃▃█▁▃▃ ➡️ 17ms
subgraph-mouse-sweep: p95 frame time ➡️ NaNms
subgraph-mouse-sweep: layout duration ▁▄▄▄▃▃▅▅▅▂█▇▂▃▆ ➡️ 5ms
subgraph-mouse-sweep: style recalc duration ▃▂▄▅▂▃▄▅█▃█▆▁▂▅ ➡️ 43ms
subgraph-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 16
subgraph-mouse-sweep: style recalc count ▅▂▅▅▁▄▃▅█▅▆▄▂▄▅ ➡️ 81
subgraph-mouse-sweep: task duration ▃▂▄▅▂▄▄▅▇▄█▆▁▃▅ ➡️ 785ms
subgraph-mouse-sweep: script duration ▄▅▄▇▅▅▆▇▆▅██▁▄▆ ➡️ 105ms
subgraph-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-mouse-sweep: heap used ➡️ NaN MB
subgraph-mouse-sweep: DOM nodes ▅▁▄▅▁▄▃▃█▅▅▄▂▅▃ ➡️ 66
subgraph-mouse-sweep: event listeners ▇▁▂▇▁▂▂▂█▇▂▂▇▇▂ 📈 5
workflow-execution: avg frame time ▆▆▆▄▆▆▃▄▁▄█▆▅▄▆ ➡️ 17ms
workflow-execution: p95 frame time ➡️ NaNms
workflow-execution: layout duration ▁▆▁▃▂▄▃▂▃▃▅█▄▂▅ ➡️ 2ms
workflow-execution: style recalc duration ▃▇▅▇▁▅▆▇█▁██▂▄▆ ➡️ 25ms
workflow-execution: layout count ▁█▂▃▂▃▃▁▃▃▄▃▂▃▂ ➡️ 5
workflow-execution: style recalc count ▃█▅▇▁▄▅▆▅▅▅▅▄▄▂ ➡️ 15
workflow-execution: task duration ▂▅▄▅▁▄▆▆▆▁▇█▁▃▃ ➡️ 120ms
workflow-execution: script duration ▄▃▄▄▃▅▄▅▆▂▇█▁▃▄ ➡️ 29ms
workflow-execution: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
workflow-execution: heap used ➡️ NaN MB
workflow-execution: DOM nodes ▂█▃▆▁▄▃▅▃█▃▃▄▃▁ ➡️ 152
workflow-execution: event listeners ▅███▁▅███▁██▅█▅ ➡️ 49
Raw data
{
  "timestamp": "2026-08-11T22:32:33.078Z",
  "gitSha": "436e04df2e01032bbc184b33e2e94a34828b64e1",
  "branch": "test/global-vitest-clock-baseline",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2068.263999999971,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.228,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 601.3159999999999,
      "heapDeltaBytes": 5751640,
      "heapUsedBytes": 70275512,
      "domNodes": 20,
      "jsHeapTotalBytes": 23855104,
      "scriptDurationMs": 27.235,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-idle",
      "durationMs": 2021.235000000047,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.802999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 611.682,
      "heapDeltaBytes": 5884848,
      "heapUsedBytes": 70206652,
      "domNodes": 16,
      "jsHeapTotalBytes": 24903680,
      "scriptDurationMs": 24.612999999999996,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1886.1739999999827,
      "styleRecalcs": 74,
      "styleRecalcDurationMs": 40.412000000000006,
      "layouts": 12,
      "layoutDurationMs": 3.9050000000000002,
      "taskDurationMs": 1008.623,
      "heapDeltaBytes": -17408332,
      "heapUsedBytes": 47080872,
      "domNodes": -284,
      "jsHeapTotalBytes": 23306240,
      "scriptDurationMs": 131.025,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1933.6939999999458,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 42.805,
      "layouts": 12,
      "layoutDurationMs": 3.6629999999999994,
      "taskDurationMs": 991.816,
      "heapDeltaBytes": -15785420,
      "heapUsedBytes": 48559052,
      "domNodes": -282,
      "jsHeapTotalBytes": 23306240,
      "scriptDurationMs": 128.237,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1735.1830000000064,
      "styleRecalcs": 30,
      "styleRecalcDurationMs": 16.791,
      "layouts": 6,
      "layoutDurationMs": 0.616,
      "taskDurationMs": 460.536,
      "heapDeltaBytes": 8733756,
      "heapUsedBytes": 73301956,
      "domNodes": 75,
      "jsHeapTotalBytes": 24641536,
      "scriptDurationMs": 27.822,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1739.7540000000618,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 21.029,
      "layouts": 6,
      "layoutDurationMs": 0.6719999999999998,
      "taskDurationMs": 455.25300000000004,
      "heapDeltaBytes": 8821112,
      "heapUsedBytes": 73213840,
      "domNodes": 79,
      "jsHeapTotalBytes": 24641536,
      "scriptDurationMs": 27.610000000000003,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 675.5380000000173,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 9.823000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 415.485,
      "heapDeltaBytes": -10924532,
      "heapUsedBytes": 53579896,
      "domNodes": 22,
      "jsHeapTotalBytes": 25165824,
      "scriptDurationMs": 64.27,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 617.0550000000503,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.019999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 412.412,
      "heapDeltaBytes": -11216464,
      "heapUsedBytes": 53136468,
      "domNodes": 16,
      "jsHeapTotalBytes": 25165824,
      "scriptDurationMs": 61.772999999999996,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2052.1870000000035,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 8.035,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 833.2060000000001,
      "heapDeltaBytes": 7522836,
      "heapUsedBytes": 67254120,
      "domNodes": -284,
      "jsHeapTotalBytes": 4034560,
      "scriptDurationMs": 127.13499999999999,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2035.532000000103,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 7.741999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 853.7180000000001,
      "heapDeltaBytes": 7572368,
      "heapUsedBytes": 68218188,
      "domNodes": -283,
      "jsHeapTotalBytes": 3510272,
      "scriptDurationMs": 125.23799999999999,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2211.6809999999987,
      "styleRecalcs": 67,
      "styleRecalcDurationMs": 14.683000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1419.02,
      "heapDeltaBytes": 5262448,
      "heapUsedBytes": 66150096,
      "domNodes": -287,
      "jsHeapTotalBytes": 3702784,
      "scriptDurationMs": 463.70700000000005,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2293.638000000101,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 15.498999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1426.725,
      "heapDeltaBytes": 3733408,
      "heapUsedBytes": 64675048,
      "domNodes": -287,
      "jsHeapTotalBytes": 3440640,
      "scriptDurationMs": 452.042,
      "eventListeners": -151,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3349.905000000035,
      "styleRecalcs": 64,
      "styleRecalcDurationMs": 16.054000000000002,
      "layouts": 60,
      "layoutDurationMs": 8.812999999999999,
      "taskDurationMs": 1627.015,
      "heapDeltaBytes": 25453620,
      "heapUsedBytes": 87763800,
      "domNodes": 10,
      "jsHeapTotalBytes": 8126464,
      "scriptDurationMs": 570.678,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3429.8840000000155,
      "styleRecalcs": 64,
      "styleRecalcDurationMs": 16.363,
      "layouts": 60,
      "layoutDurationMs": 8.775,
      "taskDurationMs": 1726.261,
      "heapDeltaBytes": 7901272,
      "heapUsedBytes": 70345168,
      "domNodes": -290,
      "jsHeapTotalBytes": 6393856,
      "scriptDurationMs": 592.9519999999999,
      "eventListeners": -151,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666636,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 2041.6169999999738,
      "styleRecalcs": 6,
      "styleRecalcDurationMs": 5.977000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 825.017,
      "heapDeltaBytes": 6934784,
      "heapUsedBytes": 68206332,
      "domNodes": -284,
      "jsHeapTotalBytes": 3510272,
      "scriptDurationMs": 129.531,
      "eventListeners": -151,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2059.1550000000325,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 6.165,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 853.9200000000001,
      "heapDeltaBytes": 7156484,
      "heapUsedBytes": 67577804,
      "domNodes": -285,
      "jsHeapTotalBytes": 3510272,
      "scriptDurationMs": 129.23499999999999,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 627.8130000000033,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 11.025999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 442.57699999999994,
      "heapDeltaBytes": -10715768,
      "heapUsedBytes": 53900540,
      "domNodes": 18,
      "jsHeapTotalBytes": 25952256,
      "scriptDurationMs": 127.72899999999998,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 644.4330000000491,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 11.971,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 438.955,
      "heapDeltaBytes": -10622380,
      "heapUsedBytes": 53886108,
      "domNodes": 20,
      "jsHeapTotalBytes": 26476544,
      "scriptDurationMs": 128.852,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2038.98700000002,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.480000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 548.5770000000001,
      "heapDeltaBytes": 5871808,
      "heapUsedBytes": 70060484,
      "domNodes": 18,
      "jsHeapTotalBytes": 24903680,
      "scriptDurationMs": 21.575999999999997,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2009.9299999999403,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.340000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 591.3439999999999,
      "heapDeltaBytes": 5822180,
      "heapUsedBytes": 70297900,
      "domNodes": 18,
      "jsHeapTotalBytes": 24641536,
      "scriptDurationMs": 21.801,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1752.1939999999745,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 39.891,
      "layouts": 16,
      "layoutDurationMs": 4.805,
      "taskDurationMs": 876.654,
      "heapDeltaBytes": -18770352,
      "heapUsedBytes": 45762976,
      "domNodes": 63,
      "jsHeapTotalBytes": 23306240,
      "scriptDurationMs": 103.128,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1739.6110000000817,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 41.793000000000006,
      "layouts": 16,
      "layoutDurationMs": 4.864,
      "taskDurationMs": 873.1329999999999,
      "heapDeltaBytes": -3288844,
      "heapUsedBytes": 61040588,
      "domNodes": 63,
      "jsHeapTotalBytes": 24379392,
      "scriptDurationMs": 102.70499999999998,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1418.057000000033,
      "styleRecalcs": 17,
      "styleRecalcDurationMs": 30.732999999999997,
      "layouts": 13,
      "layoutDurationMs": 11.862000000000002,
      "taskDurationMs": 1037.0539999999999,
      "heapDeltaBytes": 3841756,
      "heapUsedBytes": 76939384,
      "domNodes": 13673,
      "jsHeapTotalBytes": 15466496,
      "scriptDurationMs": 39.081,
      "eventListeners": 2375,
      "totalBlockingTimeMs": 138,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8616.59800000001,
      "styleRecalcs": 250,
      "styleRecalcDurationMs": 45.028,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 5020.58,
      "heapDeltaBytes": 12758708,
      "heapUsedBytes": 72164632,
      "domNodes": -280,
      "jsHeapTotalBytes": 6062080,
      "scriptDurationMs": 1448.683,
      "eventListeners": -131,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8819.549999999936,
      "styleRecalcs": 250,
      "styleRecalcDurationMs": 44.514,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 5001.968,
      "heapDeltaBytes": 10723360,
      "heapUsedBytes": 70122672,
      "domNodes": -281,
      "jsHeapTotalBytes": 5013504,
      "scriptDurationMs": 1457.9569999999999,
      "eventListeners": -161,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 18415.542000000016,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 18399.128999999997,
      "heapDeltaBytes": -39610544,
      "heapUsedBytes": 166472428,
      "domNodes": -8312,
      "jsHeapTotalBytes": -9117696,
      "scriptDurationMs": 558.1039999999999,
      "eventListeners": -16385,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.779999999999927,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 18658.15699999996,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 18626.89,
      "heapDeltaBytes": -50998596,
      "heapUsedBytes": 155426900,
      "domNodes": -8312,
      "jsHeapTotalBytes": -8065024,
      "scriptDurationMs": 604.8580000000002,
      "eventListeners": -16387,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 23419.992000000035,
      "styleRecalcs": 176,
      "styleRecalcDurationMs": 29.437999999999963,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 23399.358,
      "heapDeltaBytes": -27722744,
      "heapUsedBytes": 179125244,
      "domNodes": -8312,
      "jsHeapTotalBytes": -8663040,
      "scriptDurationMs": 981.437,
      "eventListeners": -16377,
      "totalBlockingTimeMs": 761,
      "frameDurationMs": 18.333333333333332,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 23310.29699999999,
      "styleRecalcs": 172,
      "styleRecalcDurationMs": 28.057,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 23264.291,
      "heapDeltaBytes": -30208876,
      "heapUsedBytes": 176724884,
      "domNodes": -8312,
      "jsHeapTotalBytes": -9416704,
      "scriptDurationMs": 941.729,
      "eventListeners": -16381,
      "totalBlockingTimeMs": 794,
      "frameDurationMs": 18.330000000000048,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "workflow-execution",
      "durationMs": 460.56799999996656,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 19.546999999999993,
      "layouts": 3,
      "layoutDurationMs": 0.6709999999999999,
      "taskDurationMs": 120.254,
      "heapDeltaBytes": 5060156,
      "heapUsedBytes": 68541228,
      "domNodes": 126,
      "jsHeapTotalBytes": 4718592,
      "scriptDurationMs": 10.789,
      "eventListeners": 99,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 516.8690000000424,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 22.98,
      "layouts": 3,
      "layoutDurationMs": 1.5459999999999998,
      "taskDurationMs": 151.26000000000002,
      "heapDeltaBytes": 5172016,
      "heapUsedBytes": 68614692,
      "domNodes": 145,
      "jsHeapTotalBytes": 4980736,
      "scriptDurationMs": 12.527999999999999,
      "eventListeners": 99,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    }
  ]
}

@DrJKL
DrJKL force-pushed the test/global-vitest-fake-timers-before-each branch from ff72059 to 42eada6 Compare August 11, 2026 20:15
@DrJKL
DrJKL force-pushed the test/global-vitest-clock-baseline branch from ddf670f to 1114a71 Compare August 11, 2026 20:19
coderabbitai[bot]
coderabbitai Bot previously approved these changes Aug 11, 2026
AustinMroz
AustinMroz previously approved these changes Aug 11, 2026
@codecov

codecov Bot commented Aug 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@           Coverage Diff            @@
##             main   #15052    +/-   ##
========================================
  Coverage   80.81%   80.81%            
========================================
  Files        1873     1873            
  Lines      121954   121954            
  Branches    37495    37954   +459     
========================================
  Hits        98557    98557            
+ Misses      22860    22850    -10     
- Partials      537      547    +10     
Flag Coverage Δ
unit 72.52% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.
see 8 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@DrJKL
DrJKL marked this pull request as ready for review August 11, 2026 21:51
@DrJKL
DrJKL requested a review from a team as a code owner August 11, 2026 21:51
@dosubot dosubot Bot added the size:XS This PR changes 0-9 lines, ignoring generated files. label Aug 11, 2026
Base automatically changed from test/global-vitest-fake-timers-before-each to main August 11, 2026 21:55
@DrJKL
DrJKL dismissed stale reviews from AustinMroz and coderabbitai[bot] August 11, 2026 21:55

The base branch was changed.

@DrJKL
DrJKL force-pushed the test/global-vitest-clock-baseline branch from ea7aee6 to 95a43cd Compare August 11, 2026 22:19
@DrJKL
DrJKL enabled auto-merge August 11, 2026 22:24
@DrJKL
DrJKL requested a review from AustinMroz August 11, 2026 22:25

@AustinMroz AustinMroz left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor additional nit: There's some inconsistency with adding a thousands seperator (1_000 vs 1000), but usage is generally in line with surrounding code.

@DrJKL
DrJKL added this pull request to the merge queue Aug 11, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Aug 11, 2026
@DrJKL
DrJKL added this pull request to the merge queue Aug 11, 2026
Merged via the queue into main with commit 2bdf764 Aug 11, 2026
63 checks passed
@DrJKL
DrJKL deleted the test/global-vitest-clock-baseline branch August 11, 2026 23:05
pull Bot pushed a commit to Penguinjanator/ComfyUI_frontend that referenced this pull request Aug 12, 2026
## Summary

Child of Comfy-Org#15052. Give every test a clean localStorage baseline through
the shared Vitest setup.

```ts
beforeEach(() => {
  globalThis.localStorage?.clear()
})
```

The optional access keeps the shared setup compatible with the website
and object-parser projects, which use Vitest's Node environment and do
not expose localStorage.

## Audit results

| Classification | Calls | Outcome |
|---|---:|---|
| Test-boundary setup/teardown | 50 | Removed as globally redundant |
| Intra-test fast-check run isolation | 1 | Retained |
| **Total audited** | **51** | **30 test files** |

The retained call separates generated command sequences and shrink
attempts inside a single Vitest test. A global `beforeEach` cannot
replace it.

The cleanup also removes empty hooks, stale comments, and unused
lifecycle imports. Net diff: 10 additions and 106 deletions across 31
files.

## Validation

| Project | Test files | Passed | Skipped | Failed |
|---|---:|---:|---:|---:|
| Root | 1,159 | 15,896 | 8 | 0 |
| Desktop UI | 16 | 125 | 0 | 0 |
| Website | 41 | 387 | 0 | 0 |
| Object info parser | 4 | 33 | 0 | 0 |

Also passed:

- `pnpm typecheck`
- `pnpm lint` (six pre-existing warnings, zero errors)
- oxfmt and type-aware Oxlint on all changed files
- pre-push `pnpm knip --cache`

Co-authored-by: Amp <amp@ampcode.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS This PR changes 0-9 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants