Skip to content

test: cover shift/Ctrl multi-select on video assets - #15655

Draft
christian-byrne wants to merge 1 commit into
mainfrom
glary/test-video-asset-multi-select
Draft

test: cover shift/Ctrl multi-select on video assets#15655
christian-byrne wants to merge 1 commit into
mainfrom
glary/test-video-asset-multi-select

Conversation

@christian-byrne

Copy link
Copy Markdown
Contributor

PR Created by the Glary-Bot Agent


Automates one item from the QA test plan for cloud 1.50 → 1.51 (Asset Management, #14347 / #14765 / #14848 / #14858):

Shift-click and Ctrl/Cmd-click video assets — verify multi-selection works the same as image assets

Why this item needs its own test

Video is the one media kind whose plain preview click is deliberately swallowed — MediaAssetCard.handlePreviewClick returns early for fileKind === 'video' so a click plays the clip instead of selecting it. That early return is skipped only while a selection modifier is held, which makes the modifier paths the only way to build a multi-selection on video.

Nothing covered that. A regression in the guard would silently make video assets unselectable while images kept working. No existing spec covered shift-range click on assets of any kind.

What it asserts

Against three mocked video jobs, in one test:

  • an unmodified click selects nothing (the guard itself)
  • Ctrl/Cmd-click selects one and seeds the range anchor
  • shift-click extends anchor → target to three
  • Ctrl/Cmd-click on a selected card toggles just that one off, leaving two
  • the bulk-action footer (delete / download) appears

Selection is read from real state — [data-selected="true"] counts plus the footer text — not from the click merely succeeding.

Verification

  • Passes locally against a real backend + dev server, repeated runs, no flake.
  • Mutation-checked: removing the modifier exemption in MediaAssetCard.handlePreviewClick (if (fileKind.value === 'video') return) turns the test red. It is not a vacuous pass.
  • pnpm lint, pnpm format:check, pnpm typecheck clean.
  • Reviewed by a two-model reviewer pair; verdict PASS.

Uses ControlOrMeta so the Cmd path is exercised on macOS runners rather than only Ctrl. plain_video.mp4 is served for the mocked /api/view responses so the cards mount a real <video> element.

Screenshots

Assets sidebar with three video assets; footer reads '2 selected' with delete and download actions, and output_video-b is toggled off

Video is the one media kind whose plain preview click is deliberately
swallowed so the clip plays instead of selecting, which leaves the
modifier paths as the only way to build a multi-selection on it. Nothing
covered that, so a regression in the guard would make video assets
unselectable while images kept working.

Part of the QA test plan for cloud 1.50 -> 1.51 (Asset Management).
@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown

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

📊 Browser Reports
  • chromium: View Report (✅ 1959 / ❌ 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)
  • New-test walkthrough (chromium, recorded video): View Report

📦 Bundle: 9.11 MB gzip ⚪ 0 B

Details

Summary

  • Raw size: 38.6 MB baseline 38.6 MB — ⚪ 0 B
  • Gzip: 9.11 MB baseline 9.11 MB — ⚪ 0 B
  • Brotli: 6.37 MB baseline 6.37 MB — ⚪ 0 B
  • Bundles: 438 current • 438 baseline

Category Glance
Vendor & Third-Party ⚪ 0 B (18.1 MB) · Other ⚪ 0 B (14.1 MB) · Data & Services ⚪ 0 B (3.53 MB) · Graph Workspace ⚪ 0 B (1.37 MB) · Panels & Settings ⚪ 0 B (591 kB) · Utilities & Hooks ⚪ 0 B (549 kB) · + 5 more

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

Main entry bundles and manifests

Status: 1 unchanged

Graph Workspace — 1.37 MB (baseline 1.37 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 — 591 kB (baseline 591 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

Status: 27 unchanged

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

Authentication, profile, and account management bundles

Status: 11 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.53 MB (baseline 3.53 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

Status: 17 unchanged

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

Helpers, composables, and utility bundles

Status: 37 unchanged

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

External libraries and shared vendor chunks

Status: 18 unchanged

Other — 14.1 MB (baseline 14.1 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 · 55.3 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 66.8 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 62.3 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.1 MB heap
large-graph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 77.5 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.8 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 79.2 MB heap
legacy-node-drag: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 64.8 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.2 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 70.7 MB heap
subgraph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 61.4 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 58.3 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 118ms TBT · 91.7 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 82.8 MB heap
vue-large-graph-idle: · 58.1 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 171.3 MB heap
vue-large-graph-pan: · 58.1 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 3ms TBT · 178.5 MB heap
workflow-execution: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 62.2 MB heap

⚠️ 2 regressions detected

Show regressions
Metric Baseline PR (median) Δ Sig
canvas-idle: task duration 416ms 486ms +17% ⚠️ z=3.0
subgraph-idle: task duration 406ms 442ms +9% ⚠️ z=2.3
All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: avg frame time 17ms 17ms -0% z=-0.5
canvas-idle: p95 frame time 17ms 17ms +0%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 5ms 6ms +11% z=-6.0
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 9 9 +0% z=-3.8
canvas-idle: task duration 416ms 486ms +17% ⚠️ z=3.0
canvas-idle: script duration 6ms 7ms +9% z=-8.4
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 53.5 MB 55.3 MB +3%
canvas-idle: DOM nodes -281 -280 -0% z=-237.3
canvas-idle: event listeners -151 -167 +11% z=-37.7
canvas-mouse-sweep: avg frame time 17ms 17ms -0% z=-0.9
canvas-mouse-sweep: p95 frame time 17ms 17ms -0%
canvas-mouse-sweep: layout duration 2ms 3ms +34% z=-2.6
canvas-mouse-sweep: style recalc duration 22ms 26ms +17% z=-5.2
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 71 71 -1% z=-3.5
canvas-mouse-sweep: task duration 640ms 704ms +10% z=-2.8
canvas-mouse-sweep: script duration 70ms 80ms +13% z=-8.6
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 69.6 MB 66.8 MB -4%
canvas-mouse-sweep: DOM nodes -280 -283 +1% z=-133.3
canvas-mouse-sweep: event listeners -181 -182 +1% z=-45.7
canvas-zoom-sweep: avg frame time 17ms 17ms -0% z=0.5
canvas-zoom-sweep: p95 frame time 17ms 17ms -0%
canvas-zoom-sweep: layout duration 1ms 1ms +7% z=-0.9
canvas-zoom-sweep: style recalc duration 13ms 13ms +7% z=-3.7
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 32 31 -3% z=-0.6
canvas-zoom-sweep: task duration 286ms 311ms +9% z=-0.7
canvas-zoom-sweep: script duration 8ms 9ms +15% z=-6.1
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 62.4 MB 62.3 MB -0%
canvas-zoom-sweep: DOM nodes 78 77 -1% 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 +1%
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 5ms 6ms +22% z=-5.0
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 11 12 +5% z=-3.2
dom-widget-clipping: task duration 258ms 307ms +19% z=-3.5
dom-widget-clipping: script duration 36ms 44ms +22% z=-7.4
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 68.7 MB 69.1 MB +1%
dom-widget-clipping: DOM nodes 18 19 +6% z=-2.2
dom-widget-clipping: event listeners 0 1 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 6ms 6ms +3% z=-6.3
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 9 9 -6% z=-9.9
large-graph-idle: task duration 508ms 545ms +7% z=0.1
large-graph-idle: script duration 13ms 13ms +2% z=-8.5
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 60.5 MB 77.5 MB +28%
large-graph-idle: DOM nodes -282 -277 -2% z=-333.8
large-graph-idle: event listeners -177 -163 -8% z=-31.0
large-graph-pan: avg frame time 17ms 17ms +0% z=0.3
large-graph-pan: p95 frame time 17ms 17ms -0%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 10ms 13ms +35% z=-5.3
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 68 70 +3% z=0.7
large-graph-pan: task duration 887ms 983ms +11% z=-2.3
large-graph-pan: script duration 233ms 264ms +13% z=-7.3
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 83.7 MB 71.8 MB -14%
large-graph-pan: DOM nodes -282 -235 -17% z=-153.9
large-graph-pan: event listeners -179 -147 -18% z=-183.5
large-graph-zoom: avg frame time 17ms 17ms -0%
large-graph-zoom: p95 frame time 17ms 17ms -0%
large-graph-zoom: layout duration 6ms 8ms +38%
large-graph-zoom: style recalc duration 11ms 15ms +30%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 66 66 -1%
large-graph-zoom: task duration 1032ms 1159ms +12%
large-graph-zoom: script duration 260ms 311ms +20%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 61.0 MB 79.2 MB +30%
large-graph-zoom: DOM nodes -272 14 -105%
large-graph-zoom: event listeners -145 8 -106%
legacy-node-drag: avg frame time 17ms 17ms +0%
legacy-node-drag: p95 frame time 17ms 17ms +0%
legacy-node-drag: layout duration 0ms 0ms +0%
legacy-node-drag: style recalc duration 10ms 9ms -12%
legacy-node-drag: layout count 0 0 +0%
legacy-node-drag: style recalc count 48 47 -2%
legacy-node-drag: task duration 1044ms 1223ms +17%
legacy-node-drag: script duration 323ms 377ms +17%
legacy-node-drag: TBT 0ms 0ms +0%
legacy-node-drag: heap used 85.5 MB 64.8 MB -24%
legacy-node-drag: DOM nodes 14 -113 -907%
legacy-node-drag: event listeners 184 110 -40%
minimap-idle: avg frame time 17ms 17ms +0% z=0.1
minimap-idle: p95 frame time 17ms 17ms -0%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 5ms 5ms +7% z=-5.0
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 8 8 +0% z=-2.3
minimap-idle: task duration 502ms 533ms +6% z=0.1
minimap-idle: script duration 11ms 13ms +12% z=-8.6
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 66.7 MB 67.2 MB +1%
minimap-idle: DOM nodes -280 -279 -0% z=-218.0
minimap-idle: event listeners -149 -163 +9% z=-253.8
subgraph-dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
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 7ms 8ms +14% z=-5.1
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 47 47 -1% z=-2.5
subgraph-dom-widget-clipping: task duration 287ms 327ms +14% z=-2.8
subgraph-dom-widget-clipping: script duration 80ms 95ms +19% z=-5.3
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 70.6 MB 70.7 MB +0%
subgraph-dom-widget-clipping: DOM nodes 20 19 -5% z=-2.8
subgraph-dom-widget-clipping: event listeners 6 7 +17% z=-1.6
subgraph-idle: avg frame time 17ms 17ms +0% z=0.4
subgraph-idle: p95 frame time 17ms 17ms +0%
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 5ms 6ms +7% z=-6.1
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 9 10 +6% z=-2.1
subgraph-idle: task duration 406ms 442ms +9% ⚠️ z=2.3
subgraph-idle: script duration 5ms 6ms +14% z=-5.2
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 65.5 MB 61.4 MB -6%
subgraph-idle: DOM nodes -281 -281 +0% z=-202.5
subgraph-idle: event listeners -183 -152 -17% variance too high
subgraph-mouse-sweep: avg frame time 17ms 17ms +0% z=0.4
subgraph-mouse-sweep: p95 frame time 17ms 17ms +0%
subgraph-mouse-sweep: layout duration 3ms 4ms +42% z=-2.3
subgraph-mouse-sweep: style recalc duration 25ms 30ms +21% z=-3.8
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 76 76 -1% z=-2.4
subgraph-mouse-sweep: task duration 610ms 690ms +13% z=-1.1
subgraph-mouse-sweep: script duration 55ms 64ms +17% z=-5.6
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 54.9 MB 58.3 MB +6%
subgraph-mouse-sweep: DOM nodes -280 -281 +0% z=-155.7
subgraph-mouse-sweep: event listeners -151 -166 +10% 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 10ms 11ms +14%
subgraph-transition-enter: style recalc duration 24ms 27ms +13%
subgraph-transition-enter: layout count 16 16 +0%
subgraph-transition-enter: style recalc count 21 21 +0%
subgraph-transition-enter: task duration 696ms 764ms +10%
subgraph-transition-enter: script duration 11ms 13ms +18%
subgraph-transition-enter: TBT 106ms 118ms +11%
subgraph-transition-enter: heap used 91.7 MB 91.7 MB +0%
subgraph-transition-enter: DOM nodes 13673 13673 +0%
subgraph-transition-enter: event listeners 2373 2373 +0%
viewport-pan-sweep: avg frame time 17ms 17ms +0%
viewport-pan-sweep: p95 frame time 17ms 17ms -1%
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 26ms 36ms +36%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 249 250 +0%
viewport-pan-sweep: task duration 3065ms 3529ms +15%
viewport-pan-sweep: script duration 713ms 875ms +23%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 76.7 MB 82.8 MB +8%
viewport-pan-sweep: DOM nodes -277 -257 -7%
viewport-pan-sweep: event listeners -133 -148 +11%
vue-large-graph-idle: avg frame time 17ms 17ms +0%
vue-large-graph-idle: p95 frame time 17ms 17ms +1%
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 11301ms 13240ms +17%
vue-large-graph-idle: script duration 77ms 83ms +8%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 173.9 MB 171.3 MB -1%
vue-large-graph-idle: DOM nodes -8312 -8312 +0%
vue-large-graph-idle: event listeners -16393 -16392 -0%
vue-large-graph-pan: avg frame time 17ms 17ms +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 13ms 17ms +37%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 74 130 +76%
vue-large-graph-pan: task duration 14033ms 16342ms +16%
vue-large-graph-pan: script duration 343ms 416ms +21%
vue-large-graph-pan: TBT 0ms 3ms
vue-large-graph-pan: heap used 184.3 MB 178.5 MB -3%
vue-large-graph-pan: DOM nodes -8312 -8312 +0%
vue-large-graph-pan: event listeners -16391 -16389 -0%
workflow-execution: avg frame time 17ms 17ms +0% z=1.1
workflow-execution: p95 frame time 17ms 17ms -1%
workflow-execution: layout duration 1ms 1ms +12% z=-4.2
workflow-execution: style recalc duration 12ms 10ms -17% z=-6.4
workflow-execution: layout count 2 4 +75% z=-2.7
workflow-execution: style recalc count 7 7 +0% z=-5.3
workflow-execution: task duration 65ms 64ms -2% z=-5.5
workflow-execution: script duration 5ms 4ms -22% z=-8.4
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 62.4 MB 62.2 MB -0%
workflow-execution: DOM nodes 126 128 +1% z=-4.7
workflow-execution: event listeners 25 25 +0% z=-6.1
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-23T00:33:14.282Z",
  "gitSha": "feacaeee1fe615b6cfd5bd7baeca6ddf2cbd5876",
  "branch": "glary/test-video-asset-multi-select",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2044.8149999999714,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 4.673,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 531.749,
      "heapDeltaBytes": -5794356,
      "heapUsedBytes": 55904812,
      "domNodes": -281,
      "jsHeapTotalBytes": 4448256,
      "scriptDurationMs": 6.753000000000002,
      "eventListeners": -151,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-idle",
      "durationMs": 2007.3569999999563,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 6.360999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 441.051,
      "heapDeltaBytes": -1970576,
      "heapUsedBytes": 60089528,
      "domNodes": -279,
      "jsHeapTotalBytes": 4448256,
      "scriptDurationMs": 6.273999999999998,
      "eventListeners": -183,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1727.803999999992,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 26.392,
      "layouts": 12,
      "layoutDurationMs": 3.0389999999999997,
      "taskDurationMs": 717.14,
      "heapDeltaBytes": 5173284,
      "heapUsedBytes": 67148056,
      "domNodes": -283,
      "jsHeapTotalBytes": 5758976,
      "scriptDurationMs": 81.46199999999999,
      "eventListeners": -183,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1750.1829999999927,
      "styleRecalcs": 71,
      "styleRecalcDurationMs": 25.817,
      "layouts": 12,
      "layoutDurationMs": 3.1789999999999994,
      "taskDurationMs": 691.309,
      "heapDeltaBytes": 10810152,
      "heapUsedBytes": 73043404,
      "domNodes": -282,
      "jsHeapTotalBytes": 6021120,
      "scriptDurationMs": 77.771,
      "eventListeners": -181,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1726.2519999999881,
      "styleRecalcs": 30,
      "styleRecalcDurationMs": 13.969,
      "layouts": 6,
      "layoutDurationMs": 0.616,
      "taskDurationMs": 309.44399999999996,
      "heapDeltaBytes": 3247780,
      "heapUsedBytes": 65714536,
      "domNodes": 76,
      "jsHeapTotalBytes": 4980736,
      "scriptDurationMs": 8.631000000000002,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1669.7020000000293,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 13.02,
      "layouts": 6,
      "layoutDurationMs": 0.5840000000000001,
      "taskDurationMs": 312.20000000000005,
      "heapDeltaBytes": 2753660,
      "heapUsedBytes": 64905844,
      "domNodes": 78,
      "jsHeapTotalBytes": 4718592,
      "scriptDurationMs": 9.125,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 536.4579999999819,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 6.858,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 322.122,
      "heapDeltaBytes": 9729380,
      "heapUsedBytes": 71476828,
      "domNodes": 20,
      "jsHeapTotalBytes": 5242880,
      "scriptDurationMs": 46.394,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 519.3160000000034,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 4.932999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 291.921,
      "heapDeltaBytes": 10810440,
      "heapUsedBytes": 73357000,
      "domNodes": 18,
      "jsHeapTotalBytes": 4718592,
      "scriptDurationMs": 41.013,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2040.0399999999763,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 5.95,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 550.452,
      "heapDeltaBytes": -2161728,
      "heapUsedBytes": 73761648,
      "domNodes": -271,
      "jsHeapTotalBytes": -2363392,
      "scriptDurationMs": 13.051999999999998,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2016.742000000022,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 5.416999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 538.8969999999999,
      "heapDeltaBytes": 13034540,
      "heapUsedBytes": 88859996,
      "domNodes": -283,
      "jsHeapTotalBytes": 3928064,
      "scriptDurationMs": 13.637999999999998,
      "eventListeners": -179,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2124.8469999999884,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 13.707999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 999.0060000000001,
      "heapDeltaBytes": -3443296,
      "heapUsedBytes": 74199448,
      "domNodes": -237,
      "jsHeapTotalBytes": 221184,
      "scriptDurationMs": 274.00800000000004,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2096.71400000002,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 12.38,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 967.3830000000002,
      "heapDeltaBytes": -1225836,
      "heapUsedBytes": 76356016,
      "domNodes": -233,
      "jsHeapTotalBytes": 221184,
      "scriptDurationMs": 253.65099999999995,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3080.1660000000197,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 14.517999999999999,
      "layouts": 60,
      "layoutDurationMs": 8.015999999999998,
      "taskDurationMs": 1151.9499999999998,
      "heapDeltaBytes": 17367828,
      "heapUsedBytes": 96601292,
      "domNodes": 16,
      "jsHeapTotalBytes": 7114752,
      "scriptDurationMs": 303.71500000000003,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3082.3380000000498,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 14.498999999999999,
      "layouts": 60,
      "layoutDurationMs": 8.728,
      "taskDurationMs": 1165.552,
      "heapDeltaBytes": -9659276,
      "heapUsedBytes": 69501140,
      "domNodes": 12,
      "jsHeapTotalBytes": 5804032,
      "scriptDurationMs": 318.58599999999996,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 2128.114000000039,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 8.28,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1149.664,
      "heapDeltaBytes": -14954996,
      "heapUsedBytes": 70319072,
      "domNodes": 14,
      "jsHeapTotalBytes": 7376896,
      "scriptDurationMs": 357.70599999999996,
      "eventListeners": 186,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 2189.4110000000637,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 9.463000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1296.816,
      "heapDeltaBytes": -19673356,
      "heapUsedBytes": 65672184,
      "domNodes": -240,
      "jsHeapTotalBytes": 7073792,
      "scriptDurationMs": 395.489,
      "eventListeners": 33,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 2029.258000000027,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 5.044999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 529.44,
      "heapDeltaBytes": -12639528,
      "heapUsedBytes": 70746816,
      "domNodes": -282,
      "jsHeapTotalBytes": 3928064,
      "scriptDurationMs": 11.873999999999999,
      "eventListeners": -177,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "minimap-idle",
      "durationMs": 2026.8399999999929,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 5.821,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 537.196,
      "heapDeltaBytes": -13271488,
      "heapUsedBytes": 70192420,
      "domNodes": -276,
      "jsHeapTotalBytes": 3928064,
      "scriptDurationMs": 13.690999999999999,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 535.8099999999695,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 7.8320000000000025,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 318.20899999999995,
      "heapDeltaBytes": 11421796,
      "heapUsedBytes": 74178404,
      "domNodes": 20,
      "jsHeapTotalBytes": 5767168,
      "scriptDurationMs": 92.487,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 553.9710000000468,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 7.927000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 335.42699999999996,
      "heapDeltaBytes": 11927920,
      "heapUsedBytes": 74000552,
      "domNodes": 18,
      "jsHeapTotalBytes": 4718592,
      "scriptDurationMs": 97.02900000000001,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2039.0140000000088,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 5.3599999999999985,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 434.75399999999996,
      "heapDeltaBytes": -4724880,
      "heapUsedBytes": 57785792,
      "domNodes": -280,
      "jsHeapTotalBytes": 3923968,
      "scriptDurationMs": 6.308000000000001,
      "eventListeners": -151,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2009.7879999999577,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 5.941999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 448.523,
      "heapDeltaBytes": 8644108,
      "heapUsedBytes": 71071016,
      "domNodes": -282,
      "jsHeapTotalBytes": 4710400,
      "scriptDurationMs": 6.191000000000001,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1690.0269999999864,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 30.477999999999998,
      "layouts": 16,
      "layoutDurationMs": 4.339,
      "taskDurationMs": 705.493,
      "heapDeltaBytes": 2253276,
      "heapUsedBytes": 64499192,
      "domNodes": -282,
      "jsHeapTotalBytes": 4186112,
      "scriptDurationMs": 67.05499999999999,
      "eventListeners": -181,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1724.884999999972,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 28.870000000000005,
      "layouts": 16,
      "layoutDurationMs": 3.596,
      "taskDurationMs": 675.222,
      "heapDeltaBytes": -4699296,
      "heapUsedBytes": 57801656,
      "domNodes": -280,
      "jsHeapTotalBytes": 5496832,
      "scriptDurationMs": 61.892,
      "eventListeners": -151,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 916.0389999999552,
      "styleRecalcs": 21,
      "styleRecalcDurationMs": 26.590000000000003,
      "layouts": 16,
      "layoutDurationMs": 10.956999999999999,
      "taskDurationMs": 764.324,
      "heapDeltaBytes": -2156956,
      "heapUsedBytes": 96184980,
      "domNodes": 13673,
      "jsHeapTotalBytes": 14417920,
      "scriptDurationMs": 13.157000000000002,
      "eventListeners": 2373,
      "totalBlockingTimeMs": 118,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8140.602000000001,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 31.972,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3541.2800000000007,
      "heapDeltaBytes": 18955828,
      "heapUsedBytes": 94864072,
      "domNodes": -281,
      "jsHeapTotalBytes": 4939776,
      "scriptDurationMs": 909.611,
      "eventListeners": -163,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8141.549999999938,
      "styleRecalcs": 251,
      "styleRecalcDurationMs": 39.888000000000005,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3515.986,
      "heapDeltaBytes": 2205060,
      "heapUsedBytes": 78794688,
      "domNodes": -233,
      "jsHeapTotalBytes": -303104,
      "scriptDurationMs": 840.557,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 14125.270999999997,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 13135.283,
      "heapDeltaBytes": -43842220,
      "heapUsedBytes": 176828488,
      "domNodes": -8312,
      "jsHeapTotalBytes": -25038848,
      "scriptDurationMs": 72.92000000000002,
      "eventListeners": -16393,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.220000000000073,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 14534.90899999997,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 13344.411999999998,
      "heapDeltaBytes": -38196592,
      "heapUsedBytes": 182415344,
      "domNodes": -8312,
      "jsHeapTotalBytes": -15863808,
      "scriptDurationMs": 93.599,
      "eventListeners": -16391,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.223333333333237,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 16903.391999999996,
      "styleRecalcs": 125,
      "styleRecalcDurationMs": 17.127000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16259.714000000002,
      "heapDeltaBytes": -33304892,
      "heapUsedBytes": 193978372,
      "domNodes": -8312,
      "jsHeapTotalBytes": -22700032,
      "scriptDurationMs": 469.426,
      "eventListeners": -16389,
      "totalBlockingTimeMs": 5,
      "frameDurationMs": 17.220000000000073,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 17111.87200000006,
      "styleRecalcs": 135,
      "styleRecalcDurationMs": 17.639000000000017,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16424.174,
      "heapDeltaBytes": -40335932,
      "heapUsedBytes": 180347496,
      "domNodes": -8312,
      "jsHeapTotalBytes": -26157056,
      "scriptDurationMs": 362.657,
      "eventListeners": -16389,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.219999999999953,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 102.42400000004181,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 11.161999999999999,
      "layouts": 6,
      "layoutDurationMs": 1.224,
      "taskDurationMs": 68.62,
      "heapDeltaBytes": 3061360,
      "heapUsedBytes": 65284928,
      "domNodes": 129,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 4.459,
      "eventListeners": 25,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666682,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "workflow-execution",
      "durationMs": 94.50900000001639,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 8.947000000000001,
      "layouts": 1,
      "layoutDurationMs": 0.6510000000000001,
      "taskDurationMs": 58.809,
      "heapDeltaBytes": 3028272,
      "heapUsedBytes": 65244736,
      "domNodes": 126,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 4.136000000000001,
      "eventListeners": 25,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.700000000000273
    }
  ]
}

@coderabbitai

coderabbitai Bot commented Aug 23, 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: e08e9895-2909-46a1-9771-5aa99a91e916

📥 Commits

Reviewing files that changed from the base of the PR and between cb66aee and bc00937.

📒 Files selected for processing (1)
  • browser_tests/tests/sidebar/video-asset-multi-select.spec.ts

Included review availability: 0 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 1 review per hour.


📝 Walkthrough

Walkthrough

Added Playwright coverage for video asset multi-selection. The test mocks video assets and view responses, then validates plain clicks, Ctrl/Cmd-click selection, Shift-click range selection, deselection, and bulk action controls.

Changes

Video asset selection tests

Layer / File(s) Summary
Mocked video asset setup
browser_tests/tests/sidebar/video-asset-multi-select.spec.ts
Adds deterministic video fixtures, mock jobs, timestamps, and /api/view responses for known assets.
Selection interaction coverage
browser_tests/tests/sidebar/video-asset-multi-select.spec.ts
Validates plain clicks, Ctrl/Cmd-click selection, Shift-click range selection, deselection, and bulk action visibility.

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

Merge Risk: ⚪ Minimal · up to bc009

This PR adds focused coverage for modifier-based multi-selection of video assets without changing product behavior. No actionable merge-blocking risk remains beyond normal checks and review.


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 and description are available, but the PR title and commit subjects are not provided; the required bug-fix signal cannot be verified. Provide the PR title and commit subjects so the check can determine whether the explicit bug-fix condition applies.
✅ Passed checks (6 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the added Shift/Ctrl multi-selection test for video assets.
Description check ✅ Passed The description clearly covers the test scope, assertions, verification, review context, and screenshot, despite not matching every template heading.
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.
Website End-To-End Regression Coverage ✅ Passed The PR changes only browser_tests/tests/sidebar/video-asset-multi-select.spec.ts. It does not change apps/website/src/ or apps/website/public/, so this check is out of scope.
Adr Compliance For Entity/Litegraph Changes ✅ Passed The changed-file list contains only browser_tests/tests/sidebar/video-asset-multi-select.spec.ts, so no applicable litegraph, ECS, or graph-entity files changed.
✨ 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 glary/test-video-asset-multi-select

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

@github-actions github-actions Bot added the risk:R2 PR risk grade (advisory shadow check; grader-owned) label Aug 23, 2026
@codecov

codecov Bot commented Aug 23, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@            Coverage Diff             @@
##             main   #15655      +/-   ##
==========================================
+ Coverage   79.39%   81.86%   +2.47%     
==========================================
  Files        2217     1887     -330     
  Lines      112188   107228    -4960     
  Branches    35091    34361     -730     
==========================================
- Hits        89069    87782    -1287     
+ Misses      22640    19106    -3534     
+ Partials      479      340     -139     
Flag Coverage Δ
e2e 67.44% <ø> (-0.04%) ⬇️
unit 73.43% <ø> (+0.01%) ⬆️
website-unit ?

Flags with carried forward coverage won't be shown. Click here to find out more.
see 343 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:R2 PR risk grade (advisory shadow check; grader-owned)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants