Skip to content

[backport core/1.49] feat(first-run-tour): read tour roles off an unpinned graph - #14664

Merged
comfy-pr-bot merged 1 commit into
core/1.49from
backport-14145-to-core-1.49
Aug 4, 2026
Merged

[backport core/1.49] feat(first-run-tour): read tour roles off an unpinned graph#14664
comfy-pr-bot merged 1 commit into
core/1.49from
backport-14145-to-core-1.49

Conversation

@comfy-pr-bot

Copy link
Copy Markdown
Member

Backport of #14145 to core/1.49

Automatically created by backport workflow.

> **Stack — 6 of 6.** Rebuilt from scratch after the review on #13725,
split into short PRs.
> Based on #13290 (coachmark engine); each PR stacks on the one before
it.
>
> 1. #14140 — engine: canvas targets for the coachmark tour
> 2. #14141 — Getting Started screen + entry gating
> 3. #14142 — role pins + live drift guard
> 4. #14143 — the tour itself + e2e walk
> 5. #14144 — post-tour nudge
> 6. #14145 — unpinned workflows (share / template links)  ← this PR

## Summary

Pins cover the eight templates the grid can show. This covers everything
else — a shared workflow, or a template URL nobody curated — by reading
the roles off the graph itself. Simon asked that any-workflow generality
land as its own stacked PR with adversarial tests rather than riding
along untested; this is that PR.

## Changes

- `heuristicRoles` finds the source, prompt and sink on an unpinned
graph. Pins still win where they exist; anything else falls through to
here, so the heuristics are the default path rather than dead code.
- Prompt selection is ranked, not matched: labels are normalised for
case and separators, wiring to a `positive` input outranks a label
saying so, and `negative` / `system` disqualify. A tie returns nothing
rather than guessing.
- `?share=` and `?template=` links offer the tour once their workflow is
actually on canvas.

## Review focus

The tests are adversarial by design — negative-before-positive ports, a
node carrying both boxes, disagreeing sinks, bypassed nodes, ties, a
50-node graph — all built on real `LGraph` instances rather than copied
templates. That was the condition for bringing heuristics back at all.

---------

Co-authored-by: pythongosssss <125205205+pythongosssss@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: AustinMroz <austin@comfy.org>
Co-authored-by: Maanil Verma <maanil@comfy.org>
Co-authored-by: bymyself <cbyrne@comfy.org>
@comfy-pr-bot comfy-pr-bot added the backport Backporting a PR onto a release candidate label Aug 4, 2026
@comfy-pr-bot comfy-pr-bot added the backport Backporting a PR onto a release candidate label Aug 4, 2026
@comfy-pr-bot
comfy-pr-bot enabled auto-merge (squash) August 4, 2026 05:00
@dosubot dosubot Bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Aug 4, 2026
@dosubot

dosubot Bot commented Aug 4, 2026

Copy link
Copy Markdown

📄 Knowledge review

Dosu skipped reviewing this PR because your organization has used its 200 included credits for the month. Your usage will reset on 2026-09-01. To have Dosu review this PR before then, ask your organization admin to upgrade to a pro account.


Leave Feedback Ask Dosu about ComfyUI_frontend Add Dosu to your team

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

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

📊 Browser Reports
  • chromium: View Report (✅ 1765 / ❌ 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/04/2026, 05:02:29 AM UTC

Links

📦 Bundle Size

⏳ Size data collection in progress…

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 70.1 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 46.5 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 72.6 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.5 MB heap
large-graph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 62.4 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 57.8 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 59.2 MB heap
minimap-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 66.4 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.6 MB heap
subgraph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.8 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 60.9 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 130ms TBT · 94.4 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.0 MB heap
vue-large-graph-idle: · 55.4 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 158.8 MB heap
vue-large-graph-pan: · 56.2 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 166ms TBT · 166.4 MB heap
workflow-execution: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 49.2 MB heap

⚠️ 7 regressions detected

Show regressions
Metric Baseline PR (median) Δ Sig
canvas-idle: task duration 474ms 478ms +1% ⚠️ z=2.7
canvas-zoom-sweep: task duration 387ms 381ms -2% ⚠️ z=2.3
large-graph-idle: task duration 687ms 669ms -3% ⚠️ z=2.3
large-graph-pan: task duration 1308ms 1285ms -2% ⚠️ z=4.7
minimap-idle: task duration 692ms 670ms -3% ⚠️ z=3.0
subgraph-idle: task duration 458ms 453ms -1% ⚠️ z=2.6
workflow-execution: event listeners 62 98 +58% ⚠️ z=10.6
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 9ms 9ms +9% z=-1.7
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 10 11 +11% z=-1.2
canvas-idle: task duration 474ms 478ms +1% ⚠️ z=2.7
canvas-idle: script duration 17ms 17ms -3% z=-3.9
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 69.8 MB 70.1 MB +0%
canvas-idle: DOM nodes 19 21 +11% z=-1.2
canvas-idle: event listeners 4 4 +0% z=-1.6
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 +5% z=0.9
canvas-mouse-sweep: style recalc duration 40ms 40ms -0% z=-0.9
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 74 76 +3% z=-1.4
canvas-mouse-sweep: task duration 957ms 981ms +2% z=2.0
canvas-mouse-sweep: script duration 127ms 133ms +4% z=-0.4
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 47.5 MB 46.5 MB -2%
canvas-mouse-sweep: DOM nodes -279 -282 +1% z=-132.9
canvas-mouse-sweep: event listeners -153 -152 -1% z=-38.5
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 +13% z=0.7
canvas-zoom-sweep: style recalc duration 17ms 18ms +8% z=-0.5
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 31 32 +3% z=1.6
canvas-zoom-sweep: task duration 387ms 381ms -2% ⚠️ z=2.3
canvas-zoom-sweep: script duration 21ms 19ms -7% z=-2.6
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 72.5 MB 72.6 MB +0%
canvas-zoom-sweep: DOM nodes 76 78 +3% z=-1.6
canvas-zoom-sweep: event listeners 19 19 +0% z=-0.9
dom-widget-clipping: avg frame time 17ms 17ms -0% z=-0.2
dom-widget-clipping: p95 frame time 17ms 17ms -1%
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 8ms 8ms -8% z=-2.7
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 13 11 -12% z=-4.2
dom-widget-clipping: task duration 369ms 394ms +7% z=1.8
dom-widget-clipping: script duration 58ms 60ms +5% z=-2.4
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 53.2 MB 53.5 MB +1%
dom-widget-clipping: DOM nodes 21 18 -14% z=-2.9
dom-widget-clipping: event listeners 1 2 +100% variance too high
large-graph-idle: avg frame time 17ms 17ms +0% z=0.2
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 -0% z=-3.8
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 9 9 +6% z=-8.3
large-graph-idle: task duration 687ms 669ms -3% ⚠️ z=2.3
large-graph-idle: script duration 109ms 104ms -4% z=0.2
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 64.3 MB 62.4 MB -3%
large-graph-idle: DOM nodes -284 -282 -1% z=-338.8
large-graph-idle: event listeners -149 -179 +20% z=-33.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 14ms -9% z=-4.1
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 70 69 -1% z=-0.9
large-graph-pan: task duration 1308ms 1285ms -2% ⚠️ z=4.7
large-graph-pan: script duration 436ms 433ms -1% z=1.3
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 56.6 MB 57.8 MB +2%
large-graph-pan: DOM nodes -284 -282 -1% z=-182.4
large-graph-pan: event listeners -163 -164 +1% z=-204.0
large-graph-zoom: avg frame time 17ms 17ms -0%
large-graph-zoom: p95 frame time 17ms 17ms -0%
large-graph-zoom: layout duration 7ms 7ms +1%
large-graph-zoom: style recalc duration 14ms 13ms -4%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 65 64 -2%
large-graph-zoom: task duration 1490ms 1534ms +3%
large-graph-zoom: script duration 522ms 547ms +5%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 69.1 MB 59.2 MB -14%
large-graph-zoom: DOM nodes -139 -291 +109%
large-graph-zoom: event listeners -88 -183 +109%
minimap-idle: avg frame time 17ms 17ms -0% z=-0.4
minimap-idle: p95 frame time 17ms 17ms +0%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 8ms 8ms -0% z=-2.0
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 8 8 +0% z=-2.3
minimap-idle: task duration 692ms 670ms -3% ⚠️ z=3.0
minimap-idle: script duration 112ms 104ms -7% z=0.6
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 66.3 MB 66.4 MB +0%
minimap-idle: DOM nodes -283 -283 +0% z=-220.9
minimap-idle: event listeners -150 -148 -1% z=-231.1
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 11ms 11ms +3% z=-2.0
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 47 47 +0% z=-1.6
subgraph-dom-widget-clipping: task duration 400ms 402ms +0% z=1.3
subgraph-dom-widget-clipping: script duration 120ms 119ms -1% z=-1.5
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 54.7 MB 54.6 MB -0%
subgraph-dom-widget-clipping: DOM nodes 20 20 +0% z=-1.9
subgraph-dom-widget-clipping: event listeners 7 7 +0% 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 8ms 8ms -5% z=-3.1
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 10 10 +0% z=-2.1
subgraph-idle: task duration 458ms 453ms -1% ⚠️ z=2.6
subgraph-idle: script duration 14ms 13ms -6% z=-2.6
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 69.6 MB 69.8 MB +0%
subgraph-idle: DOM nodes 19 19 +0% z=-1.9
subgraph-idle: event listeners 4 4 +0% variance too high
subgraph-mouse-sweep: avg frame time 17ms 17ms +0% z=0.8
subgraph-mouse-sweep: p95 frame time 17ms 17ms +0%
subgraph-mouse-sweep: layout duration 4ms 5ms +11% z=0.0
subgraph-mouse-sweep: style recalc duration 37ms 38ms +3% z=-1.4
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 77 76 -1% z=-2.1
subgraph-mouse-sweep: task duration 793ms 795ms +0% z=0.4
subgraph-mouse-sweep: script duration 91ms 93ms +2% z=-1.2
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 52.6 MB 60.9 MB +16%
subgraph-mouse-sweep: DOM nodes -109 62 -157% z=-2.2
subgraph-mouse-sweep: event listeners -75 4 -105% 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 -1%
subgraph-transition-enter: style recalc duration 30ms 30ms +1%
subgraph-transition-enter: layout count 14 15 +7%
subgraph-transition-enter: style recalc count 18 19 +6%
subgraph-transition-enter: task duration 978ms 904ms -8%
subgraph-transition-enter: script duration 36ms 33ms -10%
subgraph-transition-enter: TBT 125ms 130ms +4%
subgraph-transition-enter: heap used 96.5 MB 94.4 MB -2%
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 37ms 36ms -4%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 250 249 -0%
viewport-pan-sweep: task duration 4495ms 4492ms -0%
viewport-pan-sweep: script duration 1378ms 1392ms +1%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 64.6 MB 68.0 MB +5%
viewport-pan-sweep: DOM nodes -282 -283 +0%
viewport-pan-sweep: event listeners -147 -146 -1%
vue-large-graph-idle: avg frame time 18ms 18ms +2%
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 17313ms 17038ms -2%
vue-large-graph-idle: script duration 587ms 578ms -1%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 160.0 MB 158.8 MB -1%
vue-large-graph-idle: DOM nodes -8312 -8312 +0%
vue-large-graph-idle: event listeners -16388 -16386 -0%
vue-large-graph-pan: avg frame time 18ms 18ms -2%
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 18ms 17ms -6%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 146 142 -3%
vue-large-graph-pan: task duration 20934ms 20723ms -1%
vue-large-graph-pan: script duration 881ms 891ms +1%
vue-large-graph-pan: TBT 295ms 166ms -44%
vue-large-graph-pan: heap used 158.3 MB 166.4 MB +5%
vue-large-graph-pan: DOM nodes -8312 -8312 +0%
vue-large-graph-pan: event listeners -16382 -16384 +0%
workflow-execution: avg frame time 17ms 17ms -2% z=-0.4
workflow-execution: p95 frame time 17ms 17ms -0%
workflow-execution: layout duration 1ms 1ms -13% z=-4.1
workflow-execution: style recalc duration 19ms 22ms +19% z=-0.9
workflow-execution: layout count 2 3 +50% z=-3.6
workflow-execution: style recalc count 14 14 +0% z=-2.1
workflow-execution: task duration 110ms 129ms +17% z=0.6
workflow-execution: script duration 9ms 10ms +9% z=-6.5
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 58.1 MB 49.2 MB -15%
workflow-execution: DOM nodes 142 129 -9% z=-4.5
workflow-execution: event listeners 62 98 +58% ⚠️ z=10.6
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-04T05:12:52.185Z",
  "gitSha": "185d5b7fde434f5309c493337d679bbd286409ef",
  "branch": "backport-14145-to-core-1.49",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2019.7450000000003,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.22,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 470.39099999999996,
      "heapDeltaBytes": 5347368,
      "heapUsedBytes": 73619596,
      "domNodes": 20,
      "jsHeapTotalBytes": 19779584,
      "scriptDurationMs": 15.903,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-idle",
      "durationMs": 2057.47800000006,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.410000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 485.20699999999994,
      "heapDeltaBytes": 5207872,
      "heapUsedBytes": 73297616,
      "domNodes": 22,
      "jsHeapTotalBytes": 19779584,
      "scriptDurationMs": 17.406000000000002,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2081.591000000003,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 44.047000000000004,
      "layouts": 12,
      "layoutDurationMs": 3.913,
      "taskDurationMs": 1072.6200000000001,
      "heapDeltaBytes": -17784080,
      "heapUsedBytes": 50381200,
      "domNodes": -281,
      "jsHeapTotalBytes": 20955136,
      "scriptDurationMs": 140.25400000000002,
      "eventListeners": -151,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1834.3569999999545,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 35.29900000000001,
      "layouts": 12,
      "layoutDurationMs": 3.666,
      "taskDurationMs": 888.5079999999999,
      "heapDeltaBytes": -21109884,
      "heapUsedBytes": 47121980,
      "domNodes": -282,
      "jsHeapTotalBytes": 20430848,
      "scriptDurationMs": 125.33,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1731.3739999999598,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 18.629,
      "layouts": 6,
      "layoutDurationMs": 0.662,
      "taskDurationMs": 382.656,
      "heapDeltaBytes": 8059532,
      "heapUsedBytes": 76403524,
      "domNodes": 78,
      "jsHeapTotalBytes": 19779584,
      "scriptDurationMs": 19.318,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1755.5739999999105,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 18.201999999999998,
      "layouts": 6,
      "layoutDurationMs": 0.6910000000000001,
      "taskDurationMs": 378.71700000000004,
      "heapDeltaBytes": 7878968,
      "heapUsedBytes": 75934368,
      "domNodes": 78,
      "jsHeapTotalBytes": 20828160,
      "scriptDurationMs": 19.041000000000004,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 620.7300000000373,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 7.953,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 402.70500000000004,
      "heapDeltaBytes": -12055392,
      "heapUsedBytes": 56276104,
      "domNodes": 18,
      "jsHeapTotalBytes": 21352448,
      "scriptDurationMs": 59.065999999999995,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 600.1400000000103,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 7.4860000000000015,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 385.874,
      "heapDeltaBytes": -12286844,
      "heapUsedBytes": 55976944,
      "domNodes": 18,
      "jsHeapTotalBytes": 21090304,
      "scriptDurationMs": 61.137,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2023.181999999963,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.5729999999999995,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 659.168,
      "heapDeltaBytes": 5039548,
      "heapUsedBytes": 64184832,
      "domNodes": -281,
      "jsHeapTotalBytes": 4775936,
      "scriptDurationMs": 102.04199999999999,
      "eventListeners": -179,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2041.0570000000234,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.948,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 678.083,
      "heapDeltaBytes": 7712864,
      "heapUsedBytes": 66720080,
      "domNodes": -282,
      "jsHeapTotalBytes": 4513792,
      "scriptDurationMs": 106.524,
      "eventListeners": -179,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2144.3160000000034,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 13.519999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1272.125,
      "heapDeltaBytes": 5668036,
      "heapUsedBytes": 66031336,
      "domNodes": -281,
      "jsHeapTotalBytes": 5525504,
      "scriptDurationMs": 426.194,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2262.047999999936,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 14.48,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1298.67,
      "heapDeltaBytes": -4954504,
      "heapUsedBytes": 55265004,
      "domNodes": -283,
      "jsHeapTotalBytes": 4251648,
      "scriptDurationMs": 439.50600000000003,
      "eventListeners": -181,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3212.742999999989,
      "styleRecalcs": 64,
      "styleRecalcDurationMs": 13.219999999999999,
      "layouts": 60,
      "layoutDurationMs": 7.3069999999999995,
      "taskDurationMs": 1538.224,
      "heapDeltaBytes": -745848,
      "heapUsedBytes": 61355280,
      "domNodes": -289,
      "jsHeapTotalBytes": 8183808,
      "scriptDurationMs": 553.981,
      "eventListeners": -183,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3246.010999999953,
      "styleRecalcs": 63,
      "styleRecalcDurationMs": 12.795999999999998,
      "layouts": 60,
      "layoutDurationMs": 7.263,
      "taskDurationMs": 1530.0810000000001,
      "heapDeltaBytes": 509592,
      "heapUsedBytes": 62698652,
      "domNodes": -292,
      "jsHeapTotalBytes": 6610944,
      "scriptDurationMs": 539.0319999999999,
      "eventListeners": -183,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2027.0790000000147,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.046000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 660.051,
      "heapDeltaBytes": 8872036,
      "heapUsedBytes": 69591452,
      "domNodes": -282,
      "jsHeapTotalBytes": 3989504,
      "scriptDurationMs": 101.132,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "minimap-idle",
      "durationMs": 2026.8459999999777,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 7.721000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 680.5880000000001,
      "heapDeltaBytes": 8457832,
      "heapUsedBytes": 69580384,
      "domNodes": -284,
      "jsHeapTotalBytes": 3727360,
      "scriptDurationMs": 107.20200000000001,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 603.1689999999799,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 10.781,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 403.0440000000001,
      "heapDeltaBytes": -10995196,
      "heapUsedBytes": 57314300,
      "domNodes": 20,
      "jsHeapTotalBytes": 21614592,
      "scriptDurationMs": 120.42800000000001,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 601.20100000006,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 10.783000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 399.966,
      "heapDeltaBytes": -11188736,
      "heapUsedBytes": 57199272,
      "domNodes": 20,
      "jsHeapTotalBytes": 21090304,
      "scriptDurationMs": 117.54100000000001,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2009.352999999976,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.831,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 452.335,
      "heapDeltaBytes": 4894424,
      "heapUsedBytes": 73161104,
      "domNodes": 20,
      "jsHeapTotalBytes": 20303872,
      "scriptDurationMs": 13.636000000000001,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2018.4470000000374,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.15,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 453.62800000000004,
      "heapDeltaBytes": 4944436,
      "heapUsedBytes": 73141692,
      "domNodes": 18,
      "jsHeapTotalBytes": 20303872,
      "scriptDurationMs": 13.139999999999999,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1697.9149999999663,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 36.089999999999996,
      "layouts": 16,
      "layoutDurationMs": 4.606,
      "taskDurationMs": 789.9860000000001,
      "heapDeltaBytes": -4506048,
      "heapUsedBytes": 63901388,
      "domNodes": 61,
      "jsHeapTotalBytes": 20828160,
      "scriptDurationMs": 92.143,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1751.751000000013,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 39.461999999999996,
      "layouts": 16,
      "layoutDurationMs": 4.8149999999999995,
      "taskDurationMs": 800.6560000000001,
      "heapDeltaBytes": -4405884,
      "heapUsedBytes": 63834752,
      "domNodes": 63,
      "jsHeapTotalBytes": 20828160,
      "scriptDurationMs": 93.892,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1383.9100000000144,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 30.307000000000002,
      "layouts": 15,
      "layoutDurationMs": 12.368,
      "taskDurationMs": 903.9970000000002,
      "heapDeltaBytes": 6963188,
      "heapUsedBytes": 98973136,
      "domNodes": 13673,
      "jsHeapTotalBytes": 14680064,
      "scriptDurationMs": 32.969,
      "eventListeners": 2375,
      "totalBlockingTimeMs": 130,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8384.736999999972,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 35.535,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4487.947,
      "heapDeltaBytes": 11348072,
      "heapUsedBytes": 70444316,
      "domNodes": -281,
      "jsHeapTotalBytes": 6279168,
      "scriptDurationMs": 1386.377,
      "eventListeners": -161,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333338,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8341.07199999994,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 35.507,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4496.206000000001,
      "heapDeltaBytes": 13145076,
      "heapUsedBytes": 72109988,
      "domNodes": -285,
      "jsHeapTotalBytes": 6279168,
      "scriptDurationMs": 1396.8559999999998,
      "eventListeners": -131,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 17032.96700000004,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16999.395999999997,
      "heapDeltaBytes": -61149000,
      "heapUsedBytes": 165335528,
      "domNodes": -8312,
      "jsHeapTotalBytes": -3088384,
      "scriptDurationMs": 583.24,
      "eventListeners": -16387,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.77333333333336,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 17103.926,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 17076.143000000004,
      "heapDeltaBytes": -43768920,
      "heapUsedBytes": 167588136,
      "domNodes": -8312,
      "jsHeapTotalBytes": -10166272,
      "scriptDurationMs": 573.292,
      "eventListeners": -16385,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.333333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 20768.12799999999,
      "styleRecalcs": 141,
      "styleRecalcDurationMs": 16.244999999999955,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 20703.456000000002,
      "heapDeltaBytes": -38315456,
      "heapUsedBytes": 170093388,
      "domNodes": -8312,
      "jsHeapTotalBytes": -10760192,
      "scriptDurationMs": 902.4239999999999,
      "eventListeners": -16385,
      "totalBlockingTimeMs": 162,
      "frameDurationMs": 17.779999999999927,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 20788.701999999943,
      "styleRecalcs": 142,
      "styleRecalcDurationMs": 16.898000000000025,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 20742.058,
      "heapDeltaBytes": -30229320,
      "heapUsedBytes": 178877756,
      "domNodes": -8312,
      "jsHeapTotalBytes": -9973760,
      "scriptDurationMs": 878.9149999999998,
      "eventListeners": -16383,
      "totalBlockingTimeMs": 170,
      "frameDurationMs": 17.776666666666763,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 483.20799999999053,
      "styleRecalcs": 15,
      "styleRecalcDurationMs": 24.926999999999996,
      "layouts": 3,
      "layoutDurationMs": 1.2,
      "taskDurationMs": 140.737,
      "heapDeltaBytes": -15554508,
      "heapUsedBytes": 51822600,
      "domNodes": 134,
      "jsHeapTotalBytes": 7720960,
      "scriptDurationMs": 10.792000000000002,
      "eventListeners": 99,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 459.49499999994714,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 19.482,
      "layouts": 3,
      "layoutDurationMs": 0.714,
      "taskDurationMs": 117.675,
      "heapDeltaBytes": -15883148,
      "heapUsedBytes": 51450880,
      "domNodes": 123,
      "jsHeapTotalBytes": 7196672,
      "scriptDurationMs": 8.921999999999999,
      "eventListeners": 97,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    }
  ]
}

@codecov

codecov Bot commented Aug 4, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 91.22807% with 10 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/components/graph/GraphCanvas.vue 0.00% 7 Missing ⚠️
...ersistence/composables/useWorkflowPersistenceV2.ts 0.00% 3 Missing ⚠️
@@              Coverage Diff              @@
##           core/1.49   #14664      +/-   ##
=============================================
+ Coverage      78.58%   78.59%   +0.01%     
=============================================
  Files           1788     1789       +1     
  Lines         104332   104420      +88     
  Branches       31984    32881     +897     
=============================================
+ Hits           81994    82074      +80     
- Misses         21908    21916       +8     
  Partials         430      430              
Flag Coverage Δ
unit 70.74% <91.22%> (+0.02%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
.../sharing/composables/useSharedWorkflowUrlLoader.ts 96.42% <ø> (ø)
...flow/templates/composables/useTemplateUrlLoader.ts 100.00% <100.00%> (ø)
...firstRunTour/gettingStarted/GettingStartedCard.vue 94.44% <ø> (ø)
...sions/firstRunTour/gettingStarted/firstRunEntry.ts 97.14% <100.00%> (+0.59%) ⬆️
...er/extensions/firstRunTour/roles/heuristicRoles.ts 100.00% <100.00%> (ø)
.../extensions/firstRunTour/roles/resolveTourRoles.ts 100.00% <100.00%> (ø)
...erer/extensions/firstRunTour/roles/tourRolePins.ts 100.00% <ø> (ø)
...nsions/firstRunTour/tour/firstRunTourDefinition.ts 100.00% <ø> (ø)
...ons/firstRunTour/tour/useFirstRunTourController.ts 100.00% <100.00%> (ø)
...ersistence/composables/useWorkflowPersistenceV2.ts 91.20% <0.00%> (-0.89%) ⬇️
... and 1 more
🚀 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.

@christian-byrne christian-byrne left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Approving — final backport of the first-run tour stack (#14145), reviewed and approved on main. CI green: 49 success.

This completes the feature on 1.49. It carries heuristicRoles.ts and its test, which are the last files the release branches were missing.

Its earlier auto-backport attempts failed twice, both times because the PRs beneath it were not yet on the branch — the bot cherry-picks each PR of a stack independently. Once #14144's backport landed, this one was produced cleanly on the first try. That pattern held at all four levels, so it is a property of the workflow rather than anything about this code.

Two things worth passing to whoever owns PR Backport:

  • The manual workflow_dispatch is broken — it fails validation with "PR not found or inaccessible" because its gh pr view calls lack repo context. Already tracked in open PR #13699.
  • The working re-trigger is the labeled event — remove and re-add needs-backport on the merged PR.

Findings on this PR remain tracked as #14623 and #14625, neither blocking, and both now have fixes in flight.

@comfy-pr-bot
comfy-pr-bot merged commit bb6488c into core/1.49 Aug 4, 2026
84 checks passed
@comfy-pr-bot
comfy-pr-bot deleted the backport-14145-to-core-1.49 branch August 4, 2026 05:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport Backporting a PR onto a release candidate size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants