Skip to content

fix: resolve subgraph promoted widget panel regressions#10648

Open
jaeone94 wants to merge 4 commits intomainfrom
fix/subgraph-promoted-widget-regressions
Open

fix: resolve subgraph promoted widget panel regressions#10648
jaeone94 wants to merge 4 commits intomainfrom
fix/subgraph-promoted-widget-regressions

Conversation

@jaeone94
Copy link
Copy Markdown
Collaborator

@jaeone94 jaeone94 commented Mar 28, 2026

Summary

Fix four bugs in the subgraph promoted widget panel where linked promotions were not distinguished from independent ones, causing incorrect UI state in both the SubgraphEditor (Settings) panel and the Parameters tab WidgetActions menu.

Changes

  • What: Add isLinkedPromotion helper to correctly identify widgets driven by subgraph input connections. Fix disambiguatingSourceNodeId lookup mismatch that broke isWidgetShownOnParents and handleHideInput for non-nested promoted widgets. Replace fragile CSS icon selectors with data-testid attributes.

Bugs fixed

Companion fix PR for #10502 (red-green test PR). All 4 E2E tests from #10502 now pass:

Bug Root cause Fix
Linked promoted widgets have hide toggle enabled SubgraphEditor only checked node.id === -1 (physical) — linked promotions from subgraph input connections were not detected Added isLinkedPromotion helper that checks input._widget bindings; SubgraphNodeWidget :is-physical prop now covers both physical and linked cases
Linked promoted widgets show eye icon instead of link icon Same root cause as above — isPhysical prop was only true for node.id === -1 Extended the :is-physical condition to include isLinkedPromotion check
Widget labels show raw names instead of renamed values SubgraphEditor passed widget.name instead of widget.label || widget.name Changed :widget-name binding to prefer widget.label
WidgetActions menu shows Hide/Show for linked promotions v-if="hasParents" didn't exclude linked promotions Added canToggleVisibility computed that combines hasParents with !isLinked check via isLinkedPromotion

Additional bugs discovered and fixed

Bug Root cause Fix
"Show input" always displayed instead of "Hide input" for promoted widgets SectionWidgets.isWidgetShownOnParents used getSourceNodeId(widget) which falls back to widget.sourceNodeId when disambiguatingSourceNodeId is undefined — this mismatches the promotion store key (undefined) Changed to widget.disambiguatingSourceNodeId directly
"Hide input" click does nothing WidgetActions.handleHideInput used getSourceNodeId(widget) for the same reason — demote() couldn't find the entry to remove Same fix — use widget.disambiguatingSourceNodeId directly

Tests added

E2E (Playwright) — browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts

Test What it verifies
linked promoted widgets have hide toggle disabled All toggle buttons in SubgraphEditor shown section are disabled for linked widgets (covers 1-level and 2-level nested promotions via subgraph-nested-promotion fixture)
linked promoted widgets show link icon instead of eye icon Link icons appear for linked widgets, no eye icons present
widget labels display renamed values instead of raw names widget.label is displayed when set, not widget.name
linked promoted widget menu should not show Hide/Show input Three-dot menu on Parameters tab omits Hide/Show options for linked promotions, Rename is still available

Unit (Vitest) — src/core/graph/subgraph/promotionUtils.test.ts

7 tests covering isLinkedPromotion: basic matching, negative cases, nested subgraph with disambiguatingSourceNodeId, multiple inputs, and mixed linked/independent state.

Unit (Vitest) — src/components/rightSidePanel/parameters/WidgetActions.test.ts

  • Added isSubgraphNode: () => false to mock nodes to prevent crash from new isLinked computed

Review Focus

  • isLinkedPromotion reads input._widget (WeakRef-backed, non-reactive) directly in the template. This is intentional — _widget bindings are set during subgraph initialization before the user opens the panel, so stale reads don't occur in practice. A computed-based approach was attempted but reverted because _widget changes cannot trigger Vue reactivity.
  • getSourceNodeId removal in SectionWidgets and WidgetActions is intentional — the old fallback (?? widget.sourceNodeId) caused key mismatches with the promotion store for non-nested widgets.

Screenshots

Before
image

After
image

Add Playwright tests that expose three regressions in the subgraph
promoted widget panel introduced by the proxy-widget-v2 refactor:

- Linked promoted widgets (backed by subgraph input slots) show an
  enabled hide toggle in SubgraphEditor instead of a disabled link icon
- Linked promoted widgets expose Hide/Show input in the WidgetActions
  three-dot menu on the Parameters tab
- Widget labels in SubgraphEditor display raw widget.name instead of
  the renamed label from the subgraph input slot

Also adds data-testid attributes to SubgraphEditor, SubgraphNodeWidget,
and RightSidePanel for stable test selectors.
…panels

- Add isLinkedPromotion helper to promotionUtils that checks input._widget bindings
- SubgraphEditor: linked promotions show link icon, disabled toggle, correct label
- WidgetActions: hide Show/Hide menu for linked promotions
- SectionWidgets: fix disambiguatingSourceNodeId lookup causing stale isShownOnParents
- WidgetActions: fix handleHideInput using wrong key for promotion store demote
@jaeone94 jaeone94 requested a review from a team March 28, 2026 06:29
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Mar 28, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 28, 2026

🎭 Playwright: ✅ 742 passed, 0 failed · 3 flaky

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

@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 28, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/28/2026, 08:28:28 AM UTC

Links

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 28, 2026

📝 Walkthrough

Walkthrough

Adds isLinkedPromotion utility, tracks linked promoted widgets across subgraph editor and widget actions, updates components and test IDs to reflect linkage, prevents demotion of linked widgets, and adds Playwright tests and selector constants to validate promoted-widget UI behavior.

Changes

Cohort / File(s) Summary
Test infra & specs
browser_tests/fixtures/selectors.ts, browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts
Added TestIds.menu and TestIds.subgraphEditor constants and expanded TestIdValue. Added Playwright tests verifying subgraph promoted widget panel, toggles, link/eye icons, labels, and widget actions menu behavior.
Core promotion utils & tests
src/core/graph/subgraph/promotionUtils.ts, src/core/graph/subgraph/promotionUtils.test.ts
Added exported isLinkedPromotion(subgraphNode, sourceNodeId, sourceWidgetName) with unit tests covering matching, disambiguation, and edge cases.
Subgraph editor & widget UI
src/components/rightSidePanel/subgraph/SubgraphEditor.vue, src/components/rightSidePanel/subgraph/SubgraphNodeWidget.vue
Track linked widget keys; prevent demotion of linked widgets in hideAll(). Replace isPhysical prop with isLinked, update icon selection, label rendering, toggle disabled logic, and add data-testid attributes for sections, widget toggle, label, and icon types.
Widget actions & tests
src/components/rightSidePanel/parameters/WidgetActions.vue, src/components/rightSidePanel/parameters/WidgetActions.test.ts
Use isLinkedPromotion() to derive isLinked and canToggleVisibility; pass widget.disambiguatingSourceNodeId directly when constructing promotion sources. Add data-testid to More button and update mocks to include isSubgraphNode().
Minor adjustments
src/components/rightSidePanel/parameters/SectionWidgets.vue, src/components/rightSidePanel/RightSidePanel.vue, src/components/button/MoreButton.vue
Removed getSourceNodeId() usage in promotion checks; added data-testid="subgraph-editor-toggle" and data-testid="more-menu-content" to improve test selectors.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 I nibbled props and test IDs bright,
I linked the widgets through the night.
I kept safe those ties from demote's bite,
Icons winked, labels beamed just right,
A rabbit hops — code stitched tight 🥕✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.11% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: fixing regressions in the subgraph promoted widget panel. It accurately reflects the PR's primary objective.
End-To-End Regression Coverage For Fixes ✅ Passed PR satisfies condition 2: changes files under browser_tests/, specifically adding subgraphPromotedWidgetPanel.spec.ts with comprehensive e2e regression tests.
Adr Compliance For Entity/Litegraph Changes ✅ Passed PR modifies only Vue UI components, utilities, and tests. No changes to src/lib/litegraph/, src/ecs/, or core graph entity classes.
Description check ✅ Passed The pull request description comprehensively follows the template with a clear summary, detailed changes, and thorough documentation of bugs fixed with a review focus section.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 fix/subgraph-promoted-widget-regressions

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 28, 2026

📦 Bundle: 5.09 MB gzip 🔴 +6 B

Details

Summary

  • Raw size: 23.4 MB baseline 23.4 MB — 🔴 +1.52 kB
  • Gzip: 5.09 MB baseline 5.09 MB — 🔴 +6 B
  • Brotli: 3.94 MB baseline 3.94 MB — 🔴 +159 B
  • Bundles: 249 current • 249 baseline • 114 added / 114 removed

Category Glance
Graph Workspace 🔴 +969 B (1.14 MB) · Data & Services 🔴 +550 B (2.96 MB) · Vendor & Third-Party ⚪ 0 B (9.8 MB) · Other ⚪ 0 B (8.43 MB) · Panels & Settings ⚪ 0 B (484 kB) · Utilities & Hooks ⚪ 0 B (334 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-6QHnYqLf.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +7.93 kB 🔴 +6.8 kB
assets/index-DBSm7z_K.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -7.94 kB 🟢 -6.79 kB

Status: 1 added / 1 removed

Graph Workspace — 1.14 MB (baseline 1.14 MB) • 🔴 +969 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-sCWLbiWo.js (new) 1.14 MB 🔴 +1.14 MB 🔴 +245 kB 🔴 +184 kB
assets/GraphView-DjLapvWQ.js (removed) 1.14 MB 🟢 -1.14 MB 🟢 -244 kB 🟢 -184 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-DF0J1T39.js (removed) 15.7 kB 🟢 -15.7 kB 🟢 -3.4 kB 🟢 -2.91 kB
assets/CloudSurveyView-hUC4bOtW.js (new) 15.7 kB 🔴 +15.7 kB 🔴 +3.4 kB 🔴 +2.91 kB
assets/CloudLoginView-3G8Pq9B6.js (new) 12 kB 🔴 +12 kB 🔴 +3.35 kB 🔴 +2.97 kB
assets/CloudLoginView-sQ8eQLLI.js (removed) 12 kB 🟢 -12 kB 🟢 -3.36 kB 🟢 -2.97 kB
assets/CloudSignupView-DZDiAoWg.js (removed) 9.78 kB 🟢 -9.78 kB 🟢 -2.85 kB 🟢 -2.5 kB
assets/CloudSignupView-lgIwOzHZ.js (new) 9.78 kB 🔴 +9.78 kB 🔴 +2.85 kB 🔴 +2.49 kB
assets/UserCheckView-BOAOENfg.js (removed) 9.04 kB 🟢 -9.04 kB 🟢 -2.33 kB 🟢 -2.03 kB
assets/UserCheckView-G_Sp30co.js (new) 9.04 kB 🔴 +9.04 kB 🔴 +2.33 kB 🔴 +2.03 kB
assets/CloudLayoutView-B8IUPuhX.js (new) 7.54 kB 🔴 +7.54 kB 🔴 +2.36 kB 🔴 +2.06 kB
assets/CloudLayoutView-BXv7sXHs.js (removed) 7.54 kB 🟢 -7.54 kB 🟢 -2.36 kB 🟢 -2.07 kB
assets/CloudForgotPasswordView-BIGVucfd.js (new) 5.94 kB 🔴 +5.94 kB 🔴 +2.09 kB 🔴 +1.84 kB
assets/CloudForgotPasswordView-CfPImiRt.js (removed) 5.94 kB 🟢 -5.94 kB 🟢 -2.1 kB 🟢 -1.85 kB
assets/CloudAuthTimeoutView-BgUenu6l.js (removed) 5.31 kB 🟢 -5.31 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/CloudAuthTimeoutView-CE8tMiNp.js (new) 5.31 kB 🔴 +5.31 kB 🔴 +1.92 kB 🔴 +1.68 kB
assets/CloudSubscriptionRedirectView-CYogtj_d.js (removed) 5.08 kB 🟢 -5.08 kB 🟢 -1.91 kB 🟢 -1.69 kB
assets/CloudSubscriptionRedirectView-Dsee2cie.js (new) 5.08 kB 🔴 +5.08 kB 🔴 +1.9 kB 🔴 +1.69 kB
assets/UserSelectView-a9ykF7XX.js (new) 4.71 kB 🔴 +4.71 kB 🔴 +1.74 kB 🔴 +1.54 kB
assets/UserSelectView-DFuj5vzp.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.74 kB 🟢 -1.54 kB

Status: 9 added / 9 removed / 2 unchanged

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-0560KZ-G.js (removed) 46.6 kB 🟢 -46.6 kB 🟢 -9.53 kB 🟢 -8.47 kB
assets/KeybindingPanel-CjcLyPKi.js (new) 46.6 kB 🔴 +46.6 kB 🔴 +9.52 kB 🔴 +8.47 kB
assets/SecretsPanel-20SmAhUu.js (new) 22.4 kB 🔴 +22.4 kB 🔴 +5.42 kB 🔴 +4.76 kB
assets/SecretsPanel-BjMCLOlX.js (removed) 22.4 kB 🟢 -22.4 kB 🟢 -5.43 kB 🟢 -4.76 kB
assets/LegacyCreditsPanel-C_WyiB6b.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.82 kB 🟢 -5.13 kB
assets/LegacyCreditsPanel-De4KIRV7.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.81 kB 🔴 +5.13 kB
assets/SubscriptionPanel-D6-O2VM1.js (removed) 19.6 kB 🟢 -19.6 kB 🟢 -4.98 kB 🟢 -4.38 kB
assets/SubscriptionPanel-vThz_95O.js (new) 19.6 kB 🔴 +19.6 kB 🔴 +4.98 kB 🔴 +4.38 kB
assets/AboutPanel-CdJlLBir.js (removed) 12 kB 🟢 -12 kB 🟢 -3.33 kB 🟢 -2.98 kB
assets/AboutPanel-CYQ9bQXc.js (new) 12 kB 🔴 +12 kB 🔴 +3.33 kB 🔴 +2.98 kB
assets/ExtensionPanel-BvfsFdLs.js (removed) 9.78 kB 🟢 -9.78 kB 🟢 -2.82 kB 🟢 -2.5 kB
assets/ExtensionPanel-sO-fNRcX.js (new) 9.78 kB 🔴 +9.78 kB 🔴 +2.82 kB 🔴 +2.5 kB
assets/ServerConfigPanel-0m2dSzPr.js (removed) 6.85 kB 🟢 -6.85 kB 🟢 -2.28 kB 🟢 -2.03 kB
assets/ServerConfigPanel-5ipDcaQ7.js (new) 6.85 kB 🔴 +6.85 kB 🔴 +2.27 kB 🔴 +2.02 kB
assets/UserPanel-B8S2xCGi.js (new) 6.56 kB 🔴 +6.56 kB 🔴 +2.15 kB 🔴 +1.89 kB
assets/UserPanel-DJ8w6vEX.js (removed) 6.56 kB 🟢 -6.56 kB 🟢 -2.16 kB 🟢 -1.9 kB
assets/cloudRemoteConfig-B3t29Tv8.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +901 B 🔴 +794 B
assets/cloudRemoteConfig-DgyaBX5b.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -903 B 🟢 -795 B
assets/refreshRemoteConfig-C7o01OJX.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +648 B 🔴 +556 B
assets/refreshRemoteConfig-Vra7X-sV.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -650 B 🟢 -553 B

Status: 10 added / 10 removed / 12 unchanged

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-B2e7Rfc1.js (new) 3.57 kB 🔴 +3.57 kB 🔴 +1.26 kB 🔴 +1.08 kB
assets/auth-B5zFmV1L.js (removed) 3.57 kB 🟢 -3.57 kB 🟢 -1.26 kB 🟢 -1.08 kB
assets/SignUpForm-BpMqh7TV.js (removed) 3.16 kB 🟢 -3.16 kB 🟢 -1.29 kB 🟢 -1.14 kB
assets/SignUpForm-BvuF_5oV.js (new) 3.16 kB 🔴 +3.16 kB 🔴 +1.28 kB 🔴 +1.14 kB
assets/UpdatePasswordContent-BM0-f5Ae.js (new) 2.66 kB 🔴 +2.66 kB 🔴 +1.19 kB 🔴 +1.06 kB
assets/UpdatePasswordContent-CveqmcNJ.js (removed) 2.66 kB 🟢 -2.66 kB 🟢 -1.19 kB 🟢 -1.05 kB
assets/authStore-CCvntHno.js (removed) 989 B 🟢 -989 B 🟢 -483 B 🟢 -427 B
assets/authStore-DWxq6c04.js (new) 989 B 🔴 +989 B 🔴 +482 B 🔴 +432 B
assets/auth-Ct6ztQ7G.js (removed) 348 B 🟢 -348 B 🟢 -218 B 🟢 -188 B
assets/auth-QspXgJo3.js (new) 348 B 🔴 +348 B 🔴 +216 B 🔴 +188 B

Status: 5 added / 5 removed / 2 unchanged

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-0KmNbTVO.js (new) 108 kB 🔴 +108 kB 🔴 +22.4 kB 🔴 +18.9 kB
assets/useShareDialog-BQx5Wwst.js (removed) 108 kB 🟢 -108 kB 🟢 -22.4 kB 🟢 -18.9 kB
assets/useSubscriptionDialog-BiKkjypu.js (removed) 969 B 🟢 -969 B 🟢 -478 B 🟢 -415 B
assets/useSubscriptionDialog-Cg2pUXsr.js (new) 969 B 🔴 +969 B 🔴 +473 B 🔴 +417 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-B9K7D3Eq.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.79 kB 🟢 -3.37 kB
assets/ComfyQueueButton-CWXon-CI.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.79 kB 🔴 +3.37 kB
assets/useTerminalTabs-BE82oWv3.js (removed) 10.7 kB 🟢 -10.7 kB 🟢 -3.6 kB 🟢 -3.17 kB
assets/useTerminalTabs-BXD2q2cy.js (new) 10.7 kB 🔴 +10.7 kB 🔴 +3.6 kB 🔴 +3.16 kB
assets/SubscribeButton-DSkW9626.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.05 kB 🟢 -914 B
assets/SubscribeButton-DvG8pEOw.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +914 B
assets/cloudFeedbackTopbarButton-DQUX_fgr.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +842 B 🔴 +746 B
assets/cloudFeedbackTopbarButton-Dv0p0xyA.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -844 B 🟢 -748 B
assets/ComfyQueueButton-Bw7WAfQq.js (new) 1.03 kB 🔴 +1.03 kB 🔴 +485 B 🔴 +439 B
assets/ComfyQueueButton-D2SW2Fq9.js (removed) 1.03 kB 🟢 -1.03 kB 🟢 -491 B 🟢 -438 B

Status: 5 added / 5 removed / 8 unchanged

Data & Services — 2.96 MB (baseline 2.96 MB) • 🔴 +550 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-DJhYclt9.js (new) 1.92 MB 🔴 +1.92 MB 🔴 +443 kB 🔴 +336 kB
assets/dialogService-CK_gKjGs.js (removed) 1.92 MB 🟢 -1.92 MB 🟢 -443 kB 🟢 -336 kB
assets/api-BSvgJAwr.js (new) 884 kB 🔴 +884 kB 🔴 +211 kB 🔴 +166 kB
assets/api-BYBzzI7f.js (removed) 884 kB 🟢 -884 kB 🟢 -211 kB 🟢 -166 kB
assets/load3dService-BbNpZm4c.js (new) 92.5 kB 🔴 +92.5 kB 🔴 +19.7 kB 🔴 +16.9 kB
assets/load3dService-C9UIeMP_.js (removed) 92.5 kB 🟢 -92.5 kB 🟢 -19.7 kB 🟢 -16.9 kB
assets/workflowShareService-hrv0OO61.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.88 kB 🔴 +4.32 kB
assets/workflowShareService-sNUCiqfb.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.88 kB 🟢 -4.32 kB
assets/keybindingService-BMJbJ7F2.js (removed) 13.8 kB 🟢 -13.8 kB 🟢 -3.66 kB 🟢 -3.21 kB
assets/keybindingService-DouZ9SJm.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.66 kB 🔴 +3.21 kB
assets/releaseStore-DQQHsuC1.js (removed) 8.12 kB 🟢 -8.12 kB 🟢 -2.28 kB 🟢 -2 kB
assets/releaseStore-QBhFOdGT.js (new) 8.12 kB 🔴 +8.12 kB 🔴 +2.28 kB 🔴 +2 kB
assets/userStore-BabNURl0.js (removed) 2.24 kB 🟢 -2.24 kB 🟢 -870 B 🟢 -761 B
assets/userStore-CbSDjzkD.js (new) 2.24 kB 🔴 +2.24 kB 🔴 +868 B 🔴 +768 B
assets/audioService-CvRcUq72.js (removed) 1.8 kB 🟢 -1.8 kB 🟢 -880 B 🟢 -763 B
assets/audioService-SaLdDfNC.js (new) 1.8 kB 🔴 +1.8 kB 🔴 +876 B 🔴 +758 B
assets/releaseStore--VSQM131.js (new) 993 B 🔴 +993 B 🔴 +476 B 🔴 +429 B
assets/releaseStore-DBqoP5yK.js (removed) 993 B 🟢 -993 B 🟢 -482 B 🟢 -425 B
assets/workflowDraftStore-D3NwqhJu.js (new) 969 B 🔴 +969 B 🔴 +471 B 🔴 +424 B
assets/workflowDraftStore-DzahZnKI.js (removed) 969 B 🟢 -969 B 🟢 -476 B 🟢 -422 B
assets/dialogService-CFtDUdUr.js (removed) 958 B 🟢 -958 B 🟢 -468 B 🟢 -417 B
assets/dialogService-LQWqs4Ht.js (new) 958 B 🔴 +958 B 🔴 +464 B 🔴 +416 B
assets/settingStore-CUhXyS-S.js (new) 956 B 🔴 +956 B 🔴 +467 B 🔴 +415 B
assets/settingStore-CwHBoaDu.js (removed) 956 B 🟢 -956 B 🟢 -472 B 🟢 -413 B
assets/assetsStore-BnRkAcRB.js (removed) 955 B 🟢 -955 B 🟢 -472 B 🟢 -417 B
assets/assetsStore-BQGnd1ys.js (new) 955 B 🔴 +955 B 🔴 +467 B 🔴 +417 B

Status: 13 added / 13 removed / 4 unchanged

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-CPyXwiPX.js (new) 232 kB 🔴 +232 kB 🔴 +51.3 kB 🔴 +41.8 kB
assets/useConflictDetection-DPjmlLA9.js (removed) 232 kB 🟢 -232 kB 🟢 -51.3 kB 🟢 -41.8 kB
assets/useLoad3dViewer-CahpGSQG.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.44 kB 🟢 -3.91 kB
assets/useLoad3dViewer-CEzGSQbi.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.44 kB 🔴 +3.89 kB
assets/useLoad3d-3lHPpXSx.js (new) 15 kB 🔴 +15 kB 🔴 +3.79 kB 🔴 +3.35 kB
assets/useLoad3d-CRX-1wiI.js (removed) 15 kB 🟢 -15 kB 🟢 -3.79 kB 🟢 -3.35 kB
assets/useFeatureFlags-aOe1B-Yc.js (new) 5.78 kB 🔴 +5.78 kB 🔴 +1.75 kB 🔴 +1.48 kB
assets/useFeatureFlags-CD5qxCQe.js (removed) 5.78 kB 🟢 -5.78 kB 🟢 -1.75 kB 🟢 -1.48 kB
assets/useCopyToClipboard-CdrltPa0.js (new) 5.29 kB 🔴 +5.29 kB 🔴 +1.86 kB 🔴 +1.57 kB
assets/useCopyToClipboard-iRGVUYvY.js (removed) 5.29 kB 🟢 -5.29 kB 🟢 -1.86 kB 🟢 -1.57 kB
assets/useWorkspaceUI-CBW0M2gX.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -981 B 🟢 -810 B
assets/useWorkspaceUI-Cq1VQHlS.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +981 B 🔴 +812 B
assets/subscriptionCheckoutUtil-DGPSe-Ls.js (new) 2.97 kB 🔴 +2.97 kB 🔴 +1.31 kB 🔴 +1.14 kB
assets/subscriptionCheckoutUtil-GuzNFchM.js (removed) 2.97 kB 🟢 -2.97 kB 🟢 -1.31 kB 🟢 -1.14 kB
assets/assetPreviewUtil-BTcYsIMd.js (removed) 2.27 kB 🟢 -2.27 kB 🟢 -958 B 🟢 -832 B
assets/assetPreviewUtil-DuWswtMv.js (new) 2.27 kB 🔴 +2.27 kB 🔴 +956 B 🔴 +833 B
assets/useUpstreamValue-DSW3HchJ.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -805 B 🟢 -713 B
assets/useUpstreamValue-ZNXmESYW.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +803 B 🔴 +716 B
assets/useLoad3d-BCRp67Oq.js (new) 1.13 kB 🔴 +1.13 kB 🔴 +536 B 🔴 +483 B
assets/useLoad3d-ZLgmvxHp.js (removed) 1.13 kB 🟢 -1.13 kB 🟢 -539 B 🟢 -478 B
assets/useLoad3dViewer-CDyJ9r_9.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -506 B 🟢 -456 B
assets/useLoad3dViewer-YTnNcTPQ.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +504 B 🔴 +455 B
assets/useCurrentUser-BZNIqYyd.js (new) 955 B 🔴 +955 B 🔴 +468 B 🔴 +416 B
assets/useCurrentUser-CXzoUSmg.js (removed) 955 B 🟢 -955 B 🟢 -472 B 🟢 -416 B
assets/useWorkspaceSwitch-Bju-xHZL.js (new) 747 B 🔴 +747 B 🔴 +385 B 🔴 +327 B
assets/useWorkspaceSwitch-DVmkfacK.js (removed) 747 B 🟢 -747 B 🟢 -385 B 🟢 -332 B

Status: 13 added / 13 removed / 12 unchanged

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

External libraries and shared vendor chunks

Status: 16 unchanged

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

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-CFe4DPGs.js (new) 76.8 kB 🔴 +76.8 kB 🔴 +19.9 kB 🔴 +16.9 kB
assets/core-CI9D9gdM.js (removed) 76.8 kB 🟢 -76.8 kB 🟢 -19.9 kB 🟢 -16.9 kB
assets/groupNode-BhUW0yj4.js (removed) 74 kB 🟢 -74 kB 🟢 -18.5 kB 🟢 -16.3 kB
assets/groupNode-DinpmdVh.js (new) 74 kB 🔴 +74 kB 🔴 +18.5 kB 🔴 +16.3 kB
assets/WidgetSelect-dC7x0VFY.js (new) 64.6 kB 🔴 +64.6 kB 🔴 +14.1 kB 🔴 +12.1 kB
assets/WidgetSelect-Dv72zhl7.js (removed) 64.6 kB 🟢 -64.6 kB 🟢 -14.1 kB 🟢 -12.2 kB
assets/SubscriptionRequiredDialogContentWorkspace-CAdARTIa.js (new) 48.9 kB 🔴 +48.9 kB 🔴 +9.28 kB 🔴 +7.93 kB
assets/SubscriptionRequiredDialogContentWorkspace-q2OewIof.js (removed) 48.9 kB 🟢 -48.9 kB 🟢 -9.3 kB 🟢 -7.95 kB
assets/WidgetPainter-BbOrbfUV.js (removed) 33.3 kB 🟢 -33.3 kB 🟢 -8.11 kB 🟢 -7.2 kB
assets/WidgetPainter-Bxw8A8sR.js (new) 33.3 kB 🔴 +33.3 kB 🔴 +8.11 kB 🔴 +7.2 kB
assets/Load3DControls-DBRUcFw-.js (removed) 32.1 kB 🟢 -32.1 kB 🟢 -5.47 kB 🟢 -4.78 kB
assets/Load3DControls-DEBNNClj.js (new) 32.1 kB 🔴 +32.1 kB 🔴 +5.47 kB 🔴 +4.77 kB
assets/WorkspacePanelContent-BTl1HOVD.js (new) 29.9 kB 🔴 +29.9 kB 🔴 +6.32 kB 🔴 +5.55 kB
assets/WorkspacePanelContent-CqsTULD7.js (removed) 29.9 kB 🟢 -29.9 kB 🟢 -6.33 kB 🟢 -5.56 kB
assets/SubscriptionRequiredDialogContent-5zcXkq2D.js (removed) 28.2 kB 🟢 -28.2 kB 🟢 -7.17 kB 🟢 -6.31 kB
assets/SubscriptionRequiredDialogContent-QGLDIbET.js (new) 28.2 kB 🔴 +28.2 kB 🔴 +7.16 kB 🔴 +6.29 kB
assets/Load3dViewerContent-B9IGE_K-.js (removed) 24.3 kB 🟢 -24.3 kB 🟢 -5.32 kB 🟢 -4.63 kB
assets/Load3dViewerContent-mPexVp4i.js (new) 24.3 kB 🔴 +24.3 kB 🔴 +5.32 kB 🔴 +4.63 kB
assets/WidgetImageCrop-BGlYHqL8.js (removed) 23.3 kB 🟢 -23.3 kB 🟢 -5.83 kB 🟢 -5.14 kB
assets/WidgetImageCrop-DZGHBDUJ.js (new) 23.3 kB 🔴 +23.3 kB 🔴 +5.82 kB 🔴 +5.13 kB
assets/SubscriptionPanelContentWorkspace-Bwk3z2Gd.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.18 kB 🟢 -4.56 kB
assets/SubscriptionPanelContentWorkspace-DiLuJhJp.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.18 kB 🔴 +4.55 kB
assets/SignInContent-BgG5LpQ2.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -5.29 kB 🟢 -4.63 kB
assets/SignInContent-Dvtu1WaK.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +5.29 kB 🔴 +4.62 kB
assets/CurrentUserPopoverWorkspace-BSeejrpm.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -4.84 kB 🟢 -4.32 kB
assets/CurrentUserPopoverWorkspace-DSf-nSpA.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +4.83 kB 🔴 +4.32 kB
assets/WidgetInputNumber-DdE3_VfI.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.84 kB 🟢 -4.3 kB
assets/WidgetInputNumber-QVe_3HUT.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.84 kB 🔴 +4.3 kB
assets/WidgetRecordAudio-BFIyoCs9.js (new) 18.1 kB 🔴 +18.1 kB 🔴 +5.17 kB 🔴 +4.64 kB
assets/WidgetRecordAudio-CZncZk7c.js (removed) 18.1 kB 🟢 -18.1 kB 🟢 -5.18 kB 🟢 -4.64 kB
assets/Load3D-CbDtxe2-.js (removed) 16.9 kB 🟢 -16.9 kB 🟢 -4.12 kB 🟢 -3.59 kB
assets/Load3D-DOCZceLr.js (new) 16.9 kB 🔴 +16.9 kB 🔴 +4.12 kB 🔴 +3.59 kB
assets/WidgetCurve-53QfCsVI.js (new) 16.1 kB 🔴 +16.1 kB 🔴 +4.96 kB 🔴 +4.45 kB
assets/WidgetCurve-D5_KQ32H.js (removed) 16.1 kB 🟢 -16.1 kB 🟢 -4.97 kB 🟢 -4.46 kB
assets/load3d-CpwVOOiE.js (new) 15 kB 🔴 +15 kB 🔴 +4.32 kB 🔴 +3.73 kB
assets/load3d-Dmw-CZhE.js (removed) 15 kB 🟢 -15 kB 🟢 -4.32 kB 🟢 -3.73 kB
assets/WaveAudioPlayer-BM0H6qR7.js (removed) 13.4 kB 🟢 -13.4 kB 🟢 -3.68 kB 🟢 -3.23 kB
assets/WaveAudioPlayer-Bverj_XT.js (new) 13.4 kB 🔴 +13.4 kB 🔴 +3.68 kB 🔴 +3.22 kB
assets/TeamWorkspacesDialogContent-B4vzbbAg.js (removed) 11.1 kB 🟢 -11.1 kB 🟢 -3.33 kB 🟢 -2.97 kB
assets/TeamWorkspacesDialogContent-BAE0aNke.js (new) 11.1 kB 🔴 +11.1 kB 🔴 +3.33 kB 🔴 +2.96 kB
assets/nodeTemplates-CTWJSZGe.js (removed) 9.58 kB 🟢 -9.58 kB 🟢 -3.38 kB 🟢 -2.97 kB
assets/nodeTemplates-CY90tjVs.js (new) 9.58 kB 🔴 +9.58 kB 🔴 +3.37 kB 🔴 +2.96 kB
assets/InviteMemberDialogContent-CZ0oSUZq.js (new) 7.77 kB 🔴 +7.77 kB 🔴 +2.44 kB 🔴 +2.13 kB
assets/InviteMemberDialogContent-DSCruVYT.js (removed) 7.77 kB 🟢 -7.77 kB 🟢 -2.45 kB 🟢 -2.14 kB
assets/Load3DConfiguration-BuI2T5lE.js (removed) 6.6 kB 🟢 -6.6 kB 🟢 -2.04 kB 🟢 -1.78 kB
assets/Load3DConfiguration-D8s1MCXS.js (new) 6.6 kB 🔴 +6.6 kB 🔴 +2.04 kB 🔴 +1.78 kB
assets/onboardingCloudRoutes-Bm1K-vIB.js (new) 6.53 kB 🔴 +6.53 kB 🔴 +2.04 kB 🔴 +1.75 kB
assets/onboardingCloudRoutes-DcygmS8u.js (removed) 6.53 kB 🟢 -6.53 kB 🟢 -2.04 kB 🟢 -1.76 kB
assets/WidgetWithControl-D7hUs53n.js (removed) 5.99 kB 🟢 -5.99 kB 🟢 -2.38 kB 🟢 -2.12 kB
assets/WidgetWithControl-Wv8myDhh.js (new) 5.99 kB 🔴 +5.99 kB 🔴 +2.38 kB 🔴 +2.12 kB
assets/CreateWorkspaceDialogContent-CLQWN8Py.js (removed) 5.95 kB 🟢 -5.95 kB 🟢 -2.15 kB 🟢 -1.89 kB
assets/CreateWorkspaceDialogContent-gbME276y.js (new) 5.95 kB 🔴 +5.95 kB 🔴 +2.15 kB 🔴 +1.87 kB
assets/FreeTierDialogContent-Cey5j8R9.js (removed) 5.82 kB 🟢 -5.82 kB 🟢 -2.05 kB 🟢 -1.8 kB
assets/FreeTierDialogContent-PLoRCr0u.js (new) 5.82 kB 🔴 +5.82 kB 🔴 +2.04 kB 🔴 +1.81 kB
assets/EditWorkspaceDialogContent-BJTrggoa.js (new) 5.75 kB 🔴 +5.75 kB 🔴 +2.1 kB 🔴 +1.84 kB
assets/EditWorkspaceDialogContent-Dvn99d3e.js (removed) 5.75 kB 🟢 -5.75 kB 🟢 -2.11 kB 🟢 -1.84 kB
assets/WidgetTextarea-BF2AHq4R.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -2.17 kB 🟢 -1.92 kB
assets/WidgetTextarea-C2SnR8QR.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +2.17 kB 🔴 +1.93 kB
assets/Preview3d-Bc6hf784.js (new) 5.36 kB 🔴 +5.36 kB 🔴 +1.79 kB 🔴 +1.57 kB
assets/Preview3d-DFTg5jgE.js (removed) 5.36 kB 🟢 -5.36 kB 🟢 -1.79 kB 🟢 -1.57 kB
assets/ValueControlPopover-hd1OkNls.js (new) 5.33 kB 🔴 +5.33 kB 🔴 +1.93 kB 🔴 +1.72 kB
assets/ValueControlPopover-m1WFr4LY.js (removed) 5.33 kB 🟢 -5.33 kB 🟢 -1.93 kB 🟢 -1.72 kB
assets/CancelSubscriptionDialogContent-CNKR55sd.js (removed) 5.22 kB 🟢 -5.22 kB 🟢 -1.95 kB 🟢 -1.7 kB
assets/CancelSubscriptionDialogContent-Dhn4zNuQ.js (new) 5.22 kB 🔴 +5.22 kB 🔴 +1.94 kB 🔴 +1.7 kB
assets/DeleteWorkspaceDialogContent-D-04YFfY.js (new) 4.65 kB 🔴 +4.65 kB 🔴 +1.78 kB 🔴 +1.55 kB
assets/DeleteWorkspaceDialogContent-f-tyDXlN.js (removed) 4.65 kB 🟢 -4.65 kB 🟢 -1.79 kB 🟢 -1.55 kB
assets/LeaveWorkspaceDialogContent-CBk-HORl.js (new) 4.48 kB 🔴 +4.48 kB 🔴 +1.73 kB 🔴 +1.5 kB
assets/LeaveWorkspaceDialogContent-CVYT8t5l.js (removed) 4.48 kB 🟢 -4.48 kB 🟢 -1.74 kB 🟢 -1.51 kB
assets/RemoveMemberDialogContent-Cn7pToZA.js (new) 4.46 kB 🔴 +4.46 kB 🔴 +1.68 kB 🔴 +1.47 kB
assets/RemoveMemberDialogContent-CUNuchE2.js (removed) 4.46 kB 🟢 -4.46 kB 🟢 -1.69 kB 🟢 -1.47 kB
assets/tierBenefits-C2DPs3nO.js (removed) 4.45 kB 🟢 -4.45 kB 🟢 -1.58 kB 🟢 -1.36 kB
assets/tierBenefits-C8SSyWjH.js (new) 4.45 kB 🔴 +4.45 kB 🔴 +1.58 kB 🔴 +1.36 kB
assets/RevokeInviteDialogContent-CgW4YjIP.js (new) 4.37 kB 🔴 +4.37 kB 🔴 +1.69 kB 🔴 +1.48 kB
assets/RevokeInviteDialogContent-DlLHA68K.js (removed) 4.37 kB 🟢 -4.37 kB 🟢 -1.7 kB 🟢 -1.49 kB
assets/InviteMemberUpsellDialogContent-7IpQXsXL.js (removed) 4.27 kB 🟢 -4.27 kB 🟢 -1.57 kB 🟢 -1.37 kB
assets/InviteMemberUpsellDialogContent-BOf4gQHq.js (new) 4.27 kB 🔴 +4.27 kB 🔴 +1.56 kB 🔴 +1.36 kB
assets/cloudSessionCookie-GKROgThj.js (new) 4.12 kB 🔴 +4.12 kB 🔴 +1.48 kB 🔴 +1.29 kB
assets/cloudSessionCookie-PngY6sel.js (removed) 4.12 kB 🟢 -4.12 kB 🟢 -1.49 kB 🟢 -1.29 kB
assets/saveMesh-CXQiYbWi.js (new) 3.92 kB 🔴 +3.92 kB 🔴 +1.68 kB 🔴 +1.48 kB
assets/saveMesh-DaDoXlib.js (removed) 3.92 kB 🟢 -3.92 kB 🟢 -1.68 kB 🟢 -1.48 kB
assets/Media3DTop-BDMVXm7J.js (new) 3.85 kB 🔴 +3.85 kB 🔴 +1.62 kB 🔴 +1.43 kB
assets/Media3DTop-ChXrwGrm.js (removed) 3.85 kB 🟢 -3.85 kB 🟢 -1.62 kB 🟢 -1.43 kB
assets/GlobalToast-BMtygp0H.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.26 kB 🔴 +1.1 kB
assets/GlobalToast-DHeXWxSR.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.26 kB 🟢 -1.07 kB
assets/SubscribeToRun-COTOsoP8.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +982 B 🔴 +873 B
assets/SubscribeToRun-o9hhgsZ5.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -984 B 🟢 -871 B
assets/MediaAudioTop-BlUvnAmH.js (new) 2.02 kB 🔴 +2.02 kB 🔴 +982 B 🔴 +880 B
assets/MediaAudioTop-q_O9Eo88.js (removed) 2.02 kB 🟢 -2.02 kB 🟢 -983 B 🟢 -878 B
assets/CloudRunButtonWrapper-Dj4yZtr_.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -912 B 🟢 -810 B
assets/CloudRunButtonWrapper-DxnalSph.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +907 B 🔴 +805 B
assets/graphHasMissingNodes-Bos0cAf2.js (new) 1.83 kB 🔴 +1.83 kB 🔴 +860 B 🔴 +751 B
assets/graphHasMissingNodes-BselRpvM.js (removed) 1.83 kB 🟢 -1.83 kB 🟢 -861 B 🟢 -748 B
assets/cloudBadges-CgXE0Brq.js (new) 1.77 kB 🔴 +1.77 kB 🔴 +888 B 🔴 +771 B
assets/cloudBadges-JdimmceW.js (removed) 1.77 kB 🟢 -1.77 kB 🟢 -893 B 🟢 -787 B
assets/cloudSubscription-Db-gOU7k.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -815 B 🟢 -712 B
assets/cloudSubscription-PRJ_JFH_.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +811 B 🔴 +713 B
assets/previousFullPath-C09_lNUg.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +693 B 🔴 +602 B
assets/previousFullPath-C7uqb3YQ.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -695 B 🟢 -601 B
assets/Load3D-BaOkWnwH.js (removed) 1.34 kB 🟢 -1.34 kB 🟢 -611 B 🟢 -543 B
assets/Load3D-tmDRAXXq.js (new) 1.34 kB 🔴 +1.34 kB 🔴 +615 B 🔴 +553 B
assets/nightlyBadges-D65y8ADY.js (removed) 1.29 kB 🟢 -1.29 kB 🟢 -659 B 🟢 -580 B
assets/nightlyBadges-E8E7IZXw.js (new) 1.29 kB 🔴 +1.29 kB 🔴 +655 B 🔴 +584 B
assets/Load3dViewerContent-bF9Y3fXo.js (removed) 1.23 kB 🟢 -1.23 kB 🟢 -566 B 🟢 -500 B
assets/Load3dViewerContent-l_F8PIkb.js (new) 1.23 kB 🔴 +1.23 kB 🔴 +565 B 🔴 +503 B
assets/SubscriptionPanelContentWorkspace-CvfoMsUM.js (removed) 1.15 kB 🟢 -1.15 kB 🟢 -537 B 🟢 -467 B
assets/SubscriptionPanelContentWorkspace-JX6SV2Wb.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +532 B 🔴 +470 B
assets/WidgetLegacy-29A4WY8j.js (new) 978 B 🔴 +978 B 🔴 +479 B 🔴 +422 B
assets/WidgetLegacy-Didx_B49.js (removed) 978 B 🟢 -978 B 🟢 -483 B 🟢 -422 B
assets/changeTracker-DGRZbS7X.js (removed) 952 B 🟢 -952 B 🟢 -472 B 🟢 -413 B
assets/changeTracker-DWRXpl0C.js (new) 952 B 🔴 +952 B 🔴 +467 B 🔴 +416 B

Status: 55 added / 55 removed / 79 unchanged

⚡ Performance Report

⚠️ 4 regressions detected

Metric Baseline PR (median) Δ Sig
canvas-zoom-sweep: frame duration 17ms 17ms +0% ⚠️ z=2.2
large-graph-idle: script duration 97ms 127ms +30% ⚠️ z=2.3
large-graph-pan: task duration 1136ms 1195ms +5% ⚠️ z=2.6
subgraph-mouse-sweep: task duration 912ms 927ms +2% ⚠️ z=2.3
All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 10ms 10ms +2% z=-0.7
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 10 10 +0% z=-2.1
canvas-idle: task duration 368ms 390ms +6% z=-0.1
canvas-idle: script duration 19ms 25ms +30% z=-0.3
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: frame duration 17ms 17ms -0% z=-1.8
canvas-idle: heap used 60.1 MB 60.2 MB +0%
canvas-idle: DOM nodes 20 20 +0% z=-2.0
canvas-idle: event listeners 6 6 +0% z=-1.2
canvas-mouse-sweep: layout duration 3ms 4ms +6% z=-0.0
canvas-mouse-sweep: style recalc duration 43ms 40ms -6% z=-0.7
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 81 76 -6% z=-1.1
canvas-mouse-sweep: task duration 955ms 797ms -17% z=-1.2
canvas-mouse-sweep: script duration 135ms 137ms +2% z=0.3
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: frame duration 17ms 17ms -0% z=-2.6
canvas-mouse-sweep: heap used 55.6 MB 56.6 MB +2%
canvas-mouse-sweep: DOM nodes 65 58 -11% z=-1.7
canvas-mouse-sweep: event listeners 6 6 +0% z=-0.6
canvas-zoom-sweep: layout duration 1ms 1ms +24% z=0.8
canvas-zoom-sweep: style recalc duration 17ms 17ms +1% z=-1.3
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 31 31 +0% z=-0.6
canvas-zoom-sweep: task duration 296ms 310ms +5% z=-0.7
canvas-zoom-sweep: script duration 24ms 26ms +8% z=-0.5
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: frame duration 17ms 17ms +0% ⚠️ z=2.2
canvas-zoom-sweep: heap used 64.2 MB 64.0 MB -0%
canvas-zoom-sweep: DOM nodes 79 79 +0% z=-0.3
canvas-zoom-sweep: event listeners 19 19 +0% z=-0.9
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 9ms 9ms +1% z=-0.6
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 13 13 +0% z=-0.2
dom-widget-clipping: task duration 344ms 355ms +3% z=-0.6
dom-widget-clipping: script duration 67ms 69ms +3% z=0.3
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: frame duration 17ms 17ms -0% z=-1.3
dom-widget-clipping: heap used 46.9 MB 46.8 MB -0%
dom-widget-clipping: DOM nodes 22 22 +0% z=-0.1
dom-widget-clipping: event listeners 2 2 +0% variance too high
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 9ms 11ms +23% z=-1.1
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 10 10 +0% z=-5.1
large-graph-idle: task duration 539ms 625ms +16% z=1.5
large-graph-idle: script duration 97ms 127ms +30% ⚠️ z=2.3
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: frame duration 17ms 17ms +0% z=0.6
large-graph-idle: heap used 54.1 MB 53.2 MB -2%
large-graph-idle: DOM nodes -258 -257 -0% z=-311.7
large-graph-idle: event listeners -127 -125 -2% z=-24.8
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 16ms 18ms +8% z=0.5
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 69 69 +0% z=-0.9
large-graph-pan: task duration 1136ms 1195ms +5% ⚠️ z=2.6
large-graph-pan: script duration 455ms 426ms -6% z=0.9
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: frame duration 17ms 17ms -0% z=-1.8
large-graph-pan: heap used 69.0 MB 67.8 MB -2%
large-graph-pan: DOM nodes -260 -262 +1% z=-170.3
large-graph-pan: event listeners -125 -127 +2% z=-159.3
large-graph-zoom: layout duration 7ms 8ms +3%
large-graph-zoom: style recalc duration 17ms 17ms -2%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 66 66 +0%
large-graph-zoom: task duration 1357ms 1390ms +2%
large-graph-zoom: script duration 511ms 527ms +3%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: frame duration 17ms 17ms +0%
large-graph-zoom: heap used 59.5 MB 58.8 MB -1%
large-graph-zoom: DOM nodes -262 -265 +1%
large-graph-zoom: event listeners -123 -123 +0%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 9ms 10ms +13% z=0.3
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 10 10 +0% z=0.6
minimap-idle: task duration 531ms 565ms +7% z=0.8
minimap-idle: script duration 98ms 109ms +12% z=1.1
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: frame duration 17ms 17ms +0% z=-2.0
minimap-idle: heap used 54.4 MB 54.1 MB -0%
minimap-idle: DOM nodes -259 -258 -0% z=-202.6
minimap-idle: event listeners -125 -127 +2% z=-199.3
subgraph-dom-widget-clipping: layout duration 0ms 0ms +0%
subgraph-dom-widget-clipping: style recalc duration 11ms 12ms +10% z=-0.3
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 48 48 +0% z=0.1
subgraph-dom-widget-clipping: task duration 359ms 376ms +5% z=-0.1
subgraph-dom-widget-clipping: script duration 126ms 128ms +2% z=0.0
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: frame duration 17ms 17ms +0% z=-2.0
subgraph-dom-widget-clipping: heap used 47.1 MB 47.2 MB +0%
subgraph-dom-widget-clipping: DOM nodes 22 22 +0% z=-0.2
subgraph-dom-widget-clipping: event listeners 8 6 -25% z=-1.7
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 10ms 10ms +2% z=-0.0
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 11 11 +0% z=0.2
subgraph-idle: task duration 339ms 379ms +12% z=0.3
subgraph-idle: script duration 18ms 21ms +13% z=0.2
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: frame duration 17ms 17ms +0% z=1.5
subgraph-idle: heap used 60.0 MB 60.0 MB +0%
subgraph-idle: DOM nodes 22 22 +0% z=0.1
subgraph-idle: event listeners 6 6 +0% variance too high
subgraph-mouse-sweep: layout duration 4ms 5ms +12% z=0.5
subgraph-mouse-sweep: style recalc duration 44ms 47ms +7% z=1.3
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 84 83 -1% z=1.5
subgraph-mouse-sweep: task duration 912ms 927ms +2% ⚠️ z=2.3
subgraph-mouse-sweep: script duration 101ms 104ms +3% z=0.5
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: frame duration 17ms 17ms -0% z=-1.4
subgraph-mouse-sweep: heap used 52.4 MB 52.3 MB -0%
subgraph-mouse-sweep: DOM nodes 71 71 +0% z=1.8
subgraph-mouse-sweep: event listeners 6 6 +0% variance too high
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 12198ms 12668ms +4%
vue-large-graph-idle: script duration 609ms 699ms +15%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: frame duration 18ms 18ms +0%
vue-large-graph-idle: heap used 157.6 MB 150.9 MB -4%
vue-large-graph-idle: DOM nodes -8333 -8331 -0%
vue-large-graph-idle: event listeners -16464 -16466 +0%
vue-large-graph-pan: layout duration 0ms 0ms +0%
vue-large-graph-pan: style recalc duration 14ms 15ms +5%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 64 69 +8%
vue-large-graph-pan: task duration 14190ms 14693ms +4%
vue-large-graph-pan: script duration 860ms 983ms +14%
vue-large-graph-pan: TBT 0ms 0ms +0%
vue-large-graph-pan: frame duration 20ms 20ms +0%
vue-large-graph-pan: heap used 164.8 MB 164.7 MB -0%
vue-large-graph-pan: DOM nodes -8333 -8331 -0%
vue-large-graph-pan: event listeners -16460 -16458 -0%
workflow-execution: layout duration 1ms 1ms -1% z=-1.5
workflow-execution: style recalc duration 26ms 21ms -19% z=-1.4
workflow-execution: layout count 5 5 +0% z=0.1
workflow-execution: style recalc count 19 15 -21% z=-1.4
workflow-execution: task duration 126ms 123ms -2% z=-0.0
workflow-execution: script duration 31ms 30ms -4% z=0.2
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: frame duration 17ms 17ms +0% z=1.6
workflow-execution: heap used 46.7 MB 47.9 MB +3%
workflow-execution: DOM nodes 157 156 -1% z=-0.7
workflow-execution: event listeners 71 69 -3% z=3.9
Historical variance (last 15 runs)
Metric μ σ CV
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: frame duration 17ms 0ms 0.0%
canvas-idle: DOM nodes 23 1 5.6%
canvas-idle: event listeners 12 5 40.9%
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: frame duration 17ms 0ms 0.0%
canvas-mouse-sweep: DOM nodes 62 3 4.2%
canvas-mouse-sweep: event listeners 8 4 49.4%
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: frame duration 17ms 0ms 0.0%
canvas-zoom-sweep: DOM nodes 79 1 1.0%
canvas-zoom-sweep: event listeners 24 5 21.8%
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: frame duration 17ms 0ms 0.0%
dom-widget-clipping: DOM nodes 22 1 6.4%
dom-widget-clipping: event listeners 8 6 81.2%
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: frame duration 17ms 0ms 0.0%
large-graph-idle: DOM nodes 25 1 3.7%
large-graph-idle: event listeners 26 6 23.2%
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: frame duration 17ms 0ms 0.0%
large-graph-pan: DOM nodes 19 2 8.7%
large-graph-pan: event listeners 5 1 16.8%
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: frame duration 17ms 0ms 0.0%
minimap-idle: DOM nodes 19 1 7.1%
minimap-idle: event listeners 5 1 14.4%
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: frame duration 17ms 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: 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: frame duration 17ms 0ms 0.0%
subgraph-idle: DOM nodes 22 1 6.9%
subgraph-idle: event listeners 10 7 64.5%
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: frame duration 17ms 0ms 0.0%
subgraph-mouse-sweep: DOM nodes 67 2 3.3%
subgraph-mouse-sweep: event listeners 8 4 52.6%
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: frame duration 17ms 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: 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: frame duration ▆▃▆▁▆▃▆█▆▆▄▃▃▄▃ ➡️ 17ms
canvas-idle: heap used ➡️ NaN MB
canvas-idle: DOM nodes █▇▆▅▃▇▃▁▂▂▅▆▆▆▇ ➡️ 24
canvas-idle: event listeners ▅█▅▄▁▅▁▁▁▄▅▅▁▅▄ 📉 11
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: frame duration ▆█▆▃▁▃▁▆▆▁▃▆▆▃▃ ➡️ 17ms
canvas-mouse-sweep: heap used ➡️ NaN MB
canvas-mouse-sweep: DOM nodes █▅▃▃▁▂▂▃▂▄▆▅▃▅▅ ➡️ 64
canvas-mouse-sweep: event listeners █▁▁▁▁▁▇▁▁▁██▇▁█ 📈 13
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: frame duration ▅▅█▄▅▁▁▁▅▁▁▅▄▅▁ ➡️ 17ms
canvas-zoom-sweep: heap used ➡️ NaN MB
canvas-zoom-sweep: DOM nodes ▄▃▁▅█▁▃▆▄▅▅▃▃▄▃ ➡️ 79
canvas-zoom-sweep: event listeners ▁▁▂▅█▂▁▅▁▅▅▄▁▅▁ ➡️ 19
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: frame duration ▂▄▅▅▂▄█▇▅▇▇▅▅▁▇ ➡️ 17ms
dom-widget-clipping: heap used ➡️ NaN MB
dom-widget-clipping: DOM nodes ▇▇▄▇▅▄█▇▅▁▅▄▇▃▄ ➡️ 21
dom-widget-clipping: event listeners ▅▅▅▅▁▅██▁▁▁▁█▁▁ 📉 2
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: frame duration ▅▅▅▅▅▂▁▂▄▅▄▂▂▅█ ➡️ 17ms
large-graph-idle: heap used ➡️ NaN MB
large-graph-idle: DOM nodes ▆█▅▂▅▃▁▂▃▅▅▆▂▆▅ ➡️ 25
large-graph-idle: event listeners ███▇██▄▁▄▇▇█▂█▇ ➡️ 29
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: frame duration ▆▃▃▆█▃▁█▆▆▆▆█▁▆ ➡️ 17ms
large-graph-pan: heap used ➡️ NaN MB
large-graph-pan: DOM nodes ▅▃▆▂▄▁▃▁▁▅▁▂█▅▂ ➡️ 18
large-graph-pan: event listeners █▆█▁▁▆▁▁▃▆▁▃██▃ ➡️ 5
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: frame duration ▃▆▆▃█▁█▆▆▃▃▆█▆█ ➡️ 17ms
minimap-idle: heap used ➡️ NaN MB
minimap-idle: DOM nodes ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 19
minimap-idle: event listeners ▃▃▆▁▁▁▃▁▁▆▁▃█▆▁ ➡️ 4
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: frame duration ▅▄▄▄▄▄█▄▄▄▃▁▆▃▃ ➡️ 17ms
subgraph-dom-widget-clipping: heap used ➡️ NaN MB
subgraph-dom-widget-clipping: DOM nodes ▅▇▅▂▅▂▁▅▅▅▁▇▅█▄ ➡️ 22
subgraph-dom-widget-clipping: event listeners ▅▅▅▂▅▁▅██▁▁█▅█▅ 📈 16
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: frame duration ▆▆█▁▆▃▆▆▆▃▆▁▃▆█ ➡️ 17ms
subgraph-idle: heap used ➡️ NaN MB
subgraph-idle: DOM nodes ▃▅▃▂▁▄▁▂▁▅▃▂▇█▇ ➡️ 24
subgraph-idle: event listeners ▁▅▁▁▁▁▁▁▁▅▄▁███ 📈 21
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: frame duration ▅▄▁▃▃▄▆▄▆▃▃█▁▃▃ ➡️ 17ms
subgraph-mouse-sweep: heap used ➡️ NaN MB
subgraph-mouse-sweep: DOM nodes ▅▁▄▅▁▄▃▃█▅▅▄▂▅▃ ➡️ 66
subgraph-mouse-sweep: event listeners ▇▁▂▇▁▂▂▂█▇▂▂▇▇▂ 📈 5
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: frame duration ▆▆▆▄▆▆▃▄▁▄█▆▅▄▆ ➡️ 17ms
workflow-execution: heap used ➡️ NaN MB
workflow-execution: DOM nodes ▂█▃▆▁▄▃▅▃█▃▃▄▃▁ ➡️ 152
workflow-execution: event listeners ▅███▁▅███▁██▅█▅ ➡️ 49
Raw data
{
  "timestamp": "2026-03-28T08:38:38.863Z",
  "gitSha": "07ffd8266e5125597a11bd264865212cbe7a884c",
  "branch": "fix/subgraph-promoted-widget-regressions",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2041.3509999999917,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.821999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 390.072,
      "heapDeltaBytes": 19897792,
      "heapUsedBytes": 63061432,
      "domNodes": 16,
      "jsHeapTotalBytes": 22544384,
      "scriptDurationMs": 18.137,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "canvas-idle",
      "durationMs": 2039.7980000000189,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 10.148000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 436.19399999999996,
      "heapDeltaBytes": 20259112,
      "heapUsedBytes": 64090328,
      "domNodes": 20,
      "jsHeapTotalBytes": 22806528,
      "scriptDurationMs": 30.161,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-idle",
      "durationMs": 2058.9669999999387,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 11.380999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 381.94700000000006,
      "heapDeltaBytes": 20312576,
      "heapUsedBytes": 63073980,
      "domNodes": 22,
      "jsHeapTotalBytes": 22282240,
      "scriptDurationMs": 24.554000000000002,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2066.768999999994,
      "styleRecalcs": 84,
      "styleRecalcDurationMs": 45.201,
      "layouts": 12,
      "layoutDurationMs": 3.4020000000000006,
      "taskDurationMs": 976.5569999999999,
      "heapDeltaBytes": 16550604,
      "heapUsedBytes": 59370444,
      "domNodes": 66,
      "jsHeapTotalBytes": 23330816,
      "scriptDurationMs": 134.76899999999998,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1840.9879999999816,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 38.832,
      "layouts": 12,
      "layoutDurationMs": 3.783,
      "taskDurationMs": 796.7579999999999,
      "heapDeltaBytes": 16692928,
      "heapUsedBytes": 59335608,
      "domNodes": 58,
      "jsHeapTotalBytes": 23330816,
      "scriptDurationMs": 137.354,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000073
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1826.6700000000355,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 40.398,
      "layouts": 12,
      "layoutDurationMs": 3.6100000000000003,
      "taskDurationMs": 785.5169999999999,
      "heapDeltaBytes": 15909580,
      "heapUsedBytes": 58715252,
      "domNodes": 58,
      "jsHeapTotalBytes": 23068672,
      "scriptDurationMs": 141.79899999999998,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1725.4399999999634,
      "styleRecalcs": 30,
      "styleRecalcDurationMs": 16.86,
      "layouts": 6,
      "layoutDurationMs": 0.673,
      "taskDurationMs": 310.17900000000003,
      "heapDeltaBytes": 24658956,
      "heapUsedBytes": 67003056,
      "domNodes": 79,
      "jsHeapTotalBytes": 20185088,
      "scriptDurationMs": 25.514999999999997,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1729.219999999998,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 19.895000000000003,
      "layouts": 6,
      "layoutDurationMs": 0.68,
      "taskDurationMs": 325.21199999999993,
      "heapDeltaBytes": 24584172,
      "heapUsedBytes": 67074316,
      "domNodes": 80,
      "jsHeapTotalBytes": 20185088,
      "scriptDurationMs": 26.976,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1727.7390000000423,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 17.208000000000002,
      "layouts": 6,
      "layoutDurationMs": 0.702,
      "taskDurationMs": 306.757,
      "heapDeltaBytes": 24647504,
      "heapUsedBytes": 67404796,
      "domNodes": 77,
      "jsHeapTotalBytes": 20447232,
      "scriptDurationMs": 24.743000000000002,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000073
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 584.165999999982,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 9.68,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 349.298,
      "heapDeltaBytes": 6549688,
      "heapUsedBytes": 49080496,
      "domNodes": 21,
      "jsHeapTotalBytes": 13107200,
      "scriptDurationMs": 69.021,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.67999999999997
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 560.5059999999753,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 9.275000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 357.292,
      "heapDeltaBytes": 6528548,
      "heapUsedBytes": 48959448,
      "domNodes": 22,
      "jsHeapTotalBytes": 12845056,
      "scriptDurationMs": 68.292,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 577.2529999999279,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 9.395999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 355.27500000000003,
      "heapDeltaBytes": 7013600,
      "heapUsedBytes": 49463792,
      "domNodes": 22,
      "jsHeapTotalBytes": 13369344,
      "scriptDurationMs": 68.822,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2055.8489999999947,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 11.119,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 642.2829999999999,
      "heapDeltaBytes": 5158740,
      "heapUsedBytes": 55789860,
      "domNodes": -257,
      "jsHeapTotalBytes": 16191488,
      "scriptDurationMs": 131.041,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000073
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2040.5640000000176,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.645000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 568.1650000000001,
      "heapDeltaBytes": 4273296,
      "heapUsedBytes": 54953616,
      "domNodes": -259,
      "jsHeapTotalBytes": 16191488,
      "scriptDurationMs": 108.86699999999999,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2073.285999999939,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 14.751999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 625.3580000000001,
      "heapDeltaBytes": 5473848,
      "heapUsedBytes": 56187924,
      "domNodes": -256,
      "jsHeapTotalBytes": 15929344,
      "scriptDurationMs": 126.69800000000001,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2125.076999999976,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 16.282999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1157.06,
      "heapDeltaBytes": 17664984,
      "heapUsedBytes": 71061044,
      "domNodes": -262,
      "jsHeapTotalBytes": 18493440,
      "scriptDurationMs": 425.649,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2133.3829999999807,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 17.714000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1207.0249999999999,
      "heapDeltaBytes": 16256004,
      "heapUsedBytes": 69777624,
      "domNodes": -261,
      "jsHeapTotalBytes": 18231296,
      "scriptDurationMs": 464.933,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2150.6630000000087,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 18.641000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1195.115,
      "heapDeltaBytes": 15778900,
      "heapUsedBytes": 71159172,
      "domNodes": -263,
      "jsHeapTotalBytes": 17211392,
      "scriptDurationMs": 420.317,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3162.7340000000004,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 16.569000000000003,
      "layouts": 60,
      "layoutDurationMs": 7.619000000000001,
      "taskDurationMs": 1369.237,
      "heapDeltaBytes": 7223968,
      "heapUsedBytes": 61512640,
      "domNodes": -263,
      "jsHeapTotalBytes": 17240064,
      "scriptDurationMs": 527.254,
      "eventListeners": -123,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3180.8530000000133,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 17.539,
      "layouts": 60,
      "layoutDurationMs": 7.692,
      "taskDurationMs": 1399.37,
      "heapDeltaBytes": 7061160,
      "heapUsedBytes": 61677880,
      "domNodes": -265,
      "jsHeapTotalBytes": 17240064,
      "scriptDurationMs": 532.087,
      "eventListeners": -123,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000073
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3198.54399999997,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 16.874999999999996,
      "layouts": 60,
      "layoutDurationMs": 7.5969999999999995,
      "taskDurationMs": 1390.31,
      "heapDeltaBytes": 9524872,
      "heapUsedBytes": 64376040,
      "domNodes": -266,
      "jsHeapTotalBytes": 15405056,
      "scriptDurationMs": 527.2829999999999,
      "eventListeners": -123,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "minimap-idle",
      "durationMs": 2027.2970000000328,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 10.088,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 565.446,
      "heapDeltaBytes": 4394928,
      "heapUsedBytes": 56732628,
      "domNodes": -258,
      "jsHeapTotalBytes": 16191488,
      "scriptDurationMs": 109.19900000000001,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "minimap-idle",
      "durationMs": 2027.6949999999943,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.819999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 643.3709999999999,
      "heapDeltaBytes": 3635628,
      "heapUsedBytes": 56109324,
      "domNodes": -258,
      "jsHeapTotalBytes": 16453632,
      "scriptDurationMs": 132.751,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000073
    },
    {
      "name": "minimap-idle",
      "durationMs": 2028.978000000052,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.188000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 563.1389999999999,
      "heapDeltaBytes": 13332956,
      "heapUsedBytes": 66861208,
      "domNodes": -259,
      "jsHeapTotalBytes": 15724544,
      "scriptDurationMs": 107.817,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 558.1720000000132,
      "styleRecalcs": 49,
      "styleRecalcDurationMs": 13.781999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 366.5630000000001,
      "heapDeltaBytes": 6443132,
      "heapUsedBytes": 49197820,
      "domNodes": 24,
      "jsHeapTotalBytes": 12845056,
      "scriptDurationMs": 128.48499999999999,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 582.6279999999997,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 11.632,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 376.12100000000004,
      "heapDeltaBytes": 6477016,
      "heapUsedBytes": 49484064,
      "domNodes": 20,
      "jsHeapTotalBytes": 13107200,
      "scriptDurationMs": 132.36399999999998,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 561.5889999999126,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 12.392,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 377.597,
      "heapDeltaBytes": -2245716,
      "heapUsedBytes": 49706152,
      "domNodes": 22,
      "jsHeapTotalBytes": 16252928,
      "scriptDurationMs": 127.47599999999998,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1992.7920000000086,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 10.911999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 383.53799999999995,
      "heapDeltaBytes": 19904944,
      "heapUsedBytes": 62900236,
      "domNodes": 22,
      "jsHeapTotalBytes": 22806528,
      "scriptDurationMs": 20.634,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1992.211999999995,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 10.271,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 353.89899999999994,
      "heapDeltaBytes": 19898632,
      "heapUsedBytes": 62902768,
      "domNodes": 21,
      "jsHeapTotalBytes": 23068672,
      "scriptDurationMs": 17.230999999999995,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2026.3760000000275,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 10.398,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 378.87100000000004,
      "heapDeltaBytes": 20331820,
      "heapUsedBytes": 63227316,
      "domNodes": 23,
      "jsHeapTotalBytes": 23330816,
      "scriptDurationMs": 20.921000000000003,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 2026.7880000000105,
      "styleRecalcs": 86,
      "styleRecalcDurationMs": 48.163,
      "layouts": 16,
      "layoutDurationMs": 4.395,
      "taskDurationMs": 944.0450000000001,
      "heapDeltaBytes": 11884408,
      "heapUsedBytes": 54842092,
      "domNodes": 73,
      "jsHeapTotalBytes": 22544384,
      "scriptDurationMs": 104.28099999999999,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1698.3230000000162,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 38.538000000000004,
      "layouts": 16,
      "layoutDurationMs": 4.853,
      "taskDurationMs": 708.485,
      "heapDeltaBytes": 2088196,
      "heapUsedBytes": 54900496,
      "domNodes": 63,
      "jsHeapTotalBytes": 25952256,
      "scriptDurationMs": 101.79100000000001,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1967.585999999983,
      "styleRecalcs": 83,
      "styleRecalcDurationMs": 46.786,
      "layouts": 16,
      "layoutDurationMs": 4.883,
      "taskDurationMs": 926.6959999999999,
      "heapDeltaBytes": 11853680,
      "heapUsedBytes": 54858356,
      "domNodes": 71,
      "jsHeapTotalBytes": 23068672,
      "scriptDurationMs": 110.879,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 12872.869999999977,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12852.088000000002,
      "heapDeltaBytes": -29633604,
      "heapUsedBytes": 157038320,
      "domNodes": -8335,
      "jsHeapTotalBytes": 14245888,
      "scriptDurationMs": 713.626,
      "eventListeners": -16466,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.329999999999927
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 12609.178999999984,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12597.821,
      "heapDeltaBytes": -47442020,
      "heapUsedBytes": 158206504,
      "domNodes": -8331,
      "jsHeapTotalBytes": 16867328,
      "scriptDurationMs": 677.697,
      "eventListeners": -16466,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 20
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 12681.128000000059,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12668.26,
      "heapDeltaBytes": -30097272,
      "heapUsedBytes": 165220772,
      "domNodes": -8331,
      "jsHeapTotalBytes": 26042368,
      "scriptDurationMs": 698.651,
      "eventListeners": -16462,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.33000000000029
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14593.89299999998,
      "styleRecalcs": 67,
      "styleRecalcDurationMs": 14.097000000000026,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14565.514000000001,
      "heapDeltaBytes": -22282280,
      "heapUsedBytes": 172693328,
      "domNodes": -8331,
      "jsHeapTotalBytes": 24383488,
      "scriptDurationMs": 948.6769999999999,
      "eventListeners": -16464,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 19.98999999999978
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14976.828999999952,
      "styleRecalcs": 71,
      "styleRecalcDurationMs": 15.498000000000012,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14955.297,
      "heapDeltaBytes": -21633448,
      "heapUsedBytes": 172990300,
      "domNodes": -8331,
      "jsHeapTotalBytes": 24907776,
      "scriptDurationMs": 1010.2739999999999,
      "eventListeners": -16453,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 21.660000000000217
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14716.151999999965,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 14.537000000000022,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14692.951999999997,
      "heapDeltaBytes": -33962160,
      "heapUsedBytes": 159735964,
      "domNodes": -8331,
      "jsHeapTotalBytes": -3665920,
      "scriptDurationMs": 983.394,
      "eventListeners": -16458,
      "totalBlockingTimeMs": 39,
      "frameDurationMs": 20
    },
    {
      "name": "workflow-execution",
      "durationMs": 444.562000000019,
      "styleRecalcs": 15,
      "styleRecalcDurationMs": 23.835,
      "layouts": 5,
      "layoutDurationMs": 1.564,
      "taskDurationMs": 124.92799999999998,
      "heapDeltaBytes": 4586772,
      "heapUsedBytes": 50349672,
      "domNodes": 164,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 25.426999999999992,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "workflow-execution",
      "durationMs": 465.53500000004533,
      "styleRecalcs": 15,
      "styleRecalcDurationMs": 21.159000000000002,
      "layouts": 5,
      "layoutDurationMs": 1.33,
      "taskDurationMs": 116.178,
      "heapDeltaBytes": 4482332,
      "heapUsedBytes": 50160828,
      "domNodes": 154,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 29.590000000000003,
      "eventListeners": 69,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "workflow-execution",
      "durationMs": 451.8239999999878,
      "styleRecalcs": 16,
      "styleRecalcDurationMs": 21.141999999999996,
      "layouts": 5,
      "layoutDurationMs": 1.317,
      "taskDurationMs": 122.76100000000001,
      "heapDeltaBytes": 4489188,
      "heapUsedBytes": 50277340,
      "domNodes": 156,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 29.950999999999997,
      "eventListeners": 69,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    }
  ]
}

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (3)
browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts (1)

22-25: Guard against missing node refs before indexing [0].

If fixture data changes, this fails with a less actionable runtime error. Add an
explicit assertion that at least one node ref exists before dereferencing.

🧩 Suggested hardening
-const subgraphNode = (
-  await comfyPage.nodeOps.getNodeRefsByTitle(nodeTitle)
-)[0]
+const subgraphNodes = await comfyPage.nodeOps.getNodeRefsByTitle(nodeTitle)
+expect(subgraphNodes.length).toBeGreaterThan(0)
+const subgraphNode = subgraphNodes[0]

Also applies to: 133-136

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts` around lines 22 -
25, Guard against empty results from comfyPage.nodeOps.getNodeRefsByTitle before
dereferencing: check the returned array from getNodeRefsByTitle (used where
subgraphNode is assigned and also in the similar block around lines 133-136) and
assert it has at least one element (e.g., expect(refs.length).toBeGreaterThan(0)
or throw a descriptive Error) before accessing [0]; fail fast with a clear
message mentioning the nodeTitle so the test failure is actionable.
src/core/graph/subgraph/promotionUtils.test.ts (2)

373-385: Consolidate overlapping negative cases.

The tests at Line 373 and Line 380 both exercise the same “no linked input
present” branch; combining them would keep the suite lean without reducing
behavioral coverage.

As per coding guidelines: "Be parsimonious in testing; do not write redundant tests."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/core/graph/subgraph/promotionUtils.test.ts` around lines 373 - 385,
Combine the two redundant negative tests into a single test that asserts
isLinkedPromotion returns false for both "no inputs match" and "empty inputs"
scenarios: replace the two it blocks with one it('returns false when no linked
input is present', ...) that creates subgraph via createTestSubgraph and
subgraphNode via createTestSubgraphNode and then calls
expect(isLinkedPromotion(subgraphNode, '999', 'nonexistent')).toBe(false) and
expect(isLinkedPromotion(subgraphNode, '1', 'value')).toBe(false); keep
references to isLinkedPromotion, createTestSubgraph, and createTestSubgraphNode
so the assertion coverage remains but the tests are not redundant.

350-364: Extract a typed widget fixture factory to avoid repeated double-casts.

The repeated inline _widget objects with as unknown as IBaseWidget make this
block harder to maintain. A single helper with a shared typed base object would
reduce drift across cases.

♻️ Proposed refactor
+function createLinkedWidgetFixture(
+  sourceNodeId: string,
+  sourceWidgetName: string,
+  overrides: Partial<IBaseWidget> = {}
+): IBaseWidget {
+  const base = {
+    sourceNodeId,
+    sourceWidgetName,
+    name: 'value',
+    type: 'text',
+    value: '',
+    options: {},
+    y: 0
+  } satisfies Partial<IBaseWidget>
+
+  return { ...base, ...overrides } as IBaseWidget
+}
+
 function mockLinkedWidget(
   subgraphNode: ReturnType<typeof createSubgraphWithInput>,
   sourceNodeId: string,
   sourceWidgetName: string
 ) {
-  subgraphNode.inputs[0]._widget = {
-    sourceNodeId,
-    sourceWidgetName,
-    name: 'value',
-    type: 'text',
-    value: '',
-    options: {},
-    y: 0
-  } as unknown as IBaseWidget
+  subgraphNode.inputs[0]._widget = createLinkedWidgetFixture(
+    sourceNodeId,
+    sourceWidgetName
+  )
 }
Based on learnings: "In test files matching **/*.test.ts under src, when creating test helper functions that construct mock objects implementing an interface (e.g., AssetItem), prefer using satisfies InterfaceType for shape validation instead of type assertions like as Partial as InterfaceType or as any."

Also applies to: 406-415, 430-438, 440-448, 462-470

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/core/graph/subgraph/promotionUtils.test.ts` around lines 350 - 364, The
tests repeatedly assign inline objects to subgraphNode.inputs[0]._widget using
"as unknown as IBaseWidget"; replace these with a small typed fixture factory
function (e.g., createMockWidget) that returns a properly shaped object typed
with "satisfies IBaseWidget" (or Partial<IBaseWidget> satisfies IBaseWidget when
fields are intentionally omitted) and use that factory in mockLinkedWidget and
the other similar test helpers; locate mockLinkedWidget, createSubgraphWithInput
usage, and the other inline _widget assignments (the other occurrences you
noted) and swap the double-cast object literals for calls to the new factory so
the shape is validated without unsafe "as unknown as" casts.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts`:
- Around line 146-148: The assertions are currently global (await
expect(comfyPage.page.getByText(...))) and can match unrelated UI; scope them to
the opened menu popover by targeting the popover locator (e.g., use
comfyPage.page.locator('.p-contextmenu') or a new data-testid added inside
WidgetActions.vue menu content) and then call .getByText('Hide
input')/.getByText('Show input')/.getByText('Rename') on that locator so the
checks are limited to the opened popover and deterministic.

In `@src/components/rightSidePanel/subgraph/SubgraphEditor.vue`:
- Around line 48-60: The linkedKeys computed currently constructs identity using
`${w.sourceNodeId}:${w.sourceWidgetName}` which can collide when a promoted
widget has a differing disambiguatingSourceNodeId; update the key construction
in linkedKeys (and the other places building the same identity) to include
w.disambiguatingSourceNodeId (e.g.,
`${w.sourceNodeId}:${w.sourceWidgetName}:${w.disambiguatingSourceNodeId}`) so
each promoted widget is uniquely identified; adjust any code that reads or
compares these keys to expect the extended form and ensure isPromotedWidgetView
accesses disambiguatingSourceNodeId safely.

---

Nitpick comments:
In `@browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts`:
- Around line 22-25: Guard against empty results from
comfyPage.nodeOps.getNodeRefsByTitle before dereferencing: check the returned
array from getNodeRefsByTitle (used where subgraphNode is assigned and also in
the similar block around lines 133-136) and assert it has at least one element
(e.g., expect(refs.length).toBeGreaterThan(0) or throw a descriptive Error)
before accessing [0]; fail fast with a clear message mentioning the nodeTitle so
the test failure is actionable.

In `@src/core/graph/subgraph/promotionUtils.test.ts`:
- Around line 373-385: Combine the two redundant negative tests into a single
test that asserts isLinkedPromotion returns false for both "no inputs match" and
"empty inputs" scenarios: replace the two it blocks with one it('returns false
when no linked input is present', ...) that creates subgraph via
createTestSubgraph and subgraphNode via createTestSubgraphNode and then calls
expect(isLinkedPromotion(subgraphNode, '999', 'nonexistent')).toBe(false) and
expect(isLinkedPromotion(subgraphNode, '1', 'value')).toBe(false); keep
references to isLinkedPromotion, createTestSubgraph, and createTestSubgraphNode
so the assertion coverage remains but the tests are not redundant.
- Around line 350-364: The tests repeatedly assign inline objects to
subgraphNode.inputs[0]._widget using "as unknown as IBaseWidget"; replace these
with a small typed fixture factory function (e.g., createMockWidget) that
returns a properly shaped object typed with "satisfies IBaseWidget" (or
Partial<IBaseWidget> satisfies IBaseWidget when fields are intentionally
omitted) and use that factory in mockLinkedWidget and the other similar test
helpers; locate mockLinkedWidget, createSubgraphWithInput usage, and the other
inline _widget assignments (the other occurrences you noted) and swap the
double-cast object literals for calls to the new factory so the shape is
validated without unsafe "as unknown as" casts.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ea621a47-40f9-48ff-9638-60fe503784a8

📥 Commits

Reviewing files that changed from the base of the PR and between 82242f1 and b68948e.

📒 Files selected for processing (10)
  • browser_tests/fixtures/selectors.ts
  • browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/rightSidePanel/parameters/SectionWidgets.vue
  • src/components/rightSidePanel/parameters/WidgetActions.test.ts
  • src/components/rightSidePanel/parameters/WidgetActions.vue
  • src/components/rightSidePanel/subgraph/SubgraphEditor.vue
  • src/components/rightSidePanel/subgraph/SubgraphNodeWidget.vue
  • src/core/graph/subgraph/promotionUtils.test.ts
  • src/core/graph/subgraph/promotionUtils.ts

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

♻️ Duplicate comments (1)
browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts (1)

145-147: ⚠️ Potential issue | 🟡 Minor

Scope WidgetActions assertions to the opened menu container.

Line 145–147 currently query the whole page, so unrelated “Hide input” / “Show input” / “Rename” text can affect this test. Assert inside the opened menu popover only.

Suggested fix
         await moreButtons.first().click()

-        await expect(comfyPage.page.getByText('Hide input')).toHaveCount(0)
-        await expect(comfyPage.page.getByText('Show input')).toHaveCount(0)
-        await expect(comfyPage.page.getByText('Rename')).toBeVisible()
+        const actionsMenu = comfyPage.page.getByRole('menu').last()
+        await expect(actionsMenu.getByText('Hide input')).toHaveCount(0)
+        await expect(actionsMenu.getByText('Show input')).toHaveCount(0)
+        await expect(actionsMenu.getByText('Rename')).toBeVisible()
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts` around lines 145 -
147, The assertions currently query the whole page via comfyPage.page.getByText
and can match unrelated elements; scope them to the opened menu popover by first
locating the menu container (e.g., using comfyPage.page.locator(...) or
comfyPage.page.getByRole('menu') / a specific data-testid/aria selector for the
promoted-widget menu) and then call menuLocator.getByText('Hide input'),
menuLocator.getByText('Show input'), and menuLocator.getByText('Rename') so the
checks are limited to items inside the opened menu popover.
🧹 Nitpick comments (1)
browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts (1)

28-36: Avoid unconditional editor-toggle clicks to reduce state-dependent flakiness.

Line 30 always toggles, which can collapse the section when it is already open. Gate the click on section visibility (or expanded state) before toggling.

Suggested fix
   const editorToggle = comfyPage.page.getByTestId(TestIds.subgraphEditor.toggle)
   await expect(editorToggle).toBeVisible()
-  await editorToggle.click()

   const shownSection = comfyPage.page.getByTestId(
     TestIds.subgraphEditor.shownSection
   )
+  if (!(await shownSection.isVisible())) {
+    await editorToggle.click()
+  }
   await expect(shownSection).toBeVisible()
   return shownSection
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts` around lines 28 -
36, The test currently always clicks editorToggle
(TestIds.subgraphEditor.toggle) which can collapse the panel if it's already
open; instead, query the shownSection (TestIds.subgraphEditor.shownSection) or
check the toggle's expanded state on comfyPage.page and only call
editorToggle.click() when the section is not visible/expanded. Implement a
conditional: await shownSection.isVisible() (or check
editorToggle.getAttribute('aria-expanded')) and only perform the click when that
check indicates the panel is closed, then assert shownSection is visible before
returning it.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts`:
- Around line 145-147: The assertions currently query the whole page via
comfyPage.page.getByText and can match unrelated elements; scope them to the
opened menu popover by first locating the menu container (e.g., using
comfyPage.page.locator(...) or comfyPage.page.getByRole('menu') / a specific
data-testid/aria selector for the promoted-widget menu) and then call
menuLocator.getByText('Hide input'), menuLocator.getByText('Show input'), and
menuLocator.getByText('Rename') so the checks are limited to items inside the
opened menu popover.

---

Nitpick comments:
In `@browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts`:
- Around line 28-36: The test currently always clicks editorToggle
(TestIds.subgraphEditor.toggle) which can collapse the panel if it's already
open; instead, query the shownSection (TestIds.subgraphEditor.shownSection) or
check the toggle's expanded state on comfyPage.page and only call
editorToggle.click() when the section is not visible/expanded. Implement a
conditional: await shownSection.isVisible() (or check
editorToggle.getAttribute('aria-expanded')) and only perform the click when that
check indicates the panel is closed, then assert shownSection is visible before
returning it.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 24bd6c6e-18c1-4d6a-a9a8-75e168294070

📥 Commits

Reviewing files that changed from the base of the PR and between b68948e and 3598591.

📒 Files selected for processing (2)
  • browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts
  • src/core/graph/subgraph/promotionUtils.test.ts
✅ Files skipped from review due to trivial changes (1)
  • src/core/graph/subgraph/promotionUtils.test.ts

- Guard against missing node refs in E2E helpers with explicit assertion
- Scope menu-item assertions to MoreButton popover via data-testid
- Add data-testid to MoreButton popover content
- Extract linkedWidget fixture factory in unit tests
- Consolidate redundant negative test cases
- Fix isLinkedPromotion optional chaining returning boolean | undefined
@jaeone94 jaeone94 force-pushed the fix/subgraph-promoted-widget-regressions branch from 3598591 to 55423a5 Compare March 28, 2026 08:27
@jaeone94 jaeone94 requested a review from viva-jinyi as a code owner March 28, 2026 08:27
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts (1)

81-101: Consider asserting link icon count for consistency.

The test correctly validates that linked promoted widgets show link icons and no eye icons. However, Line 95 asserts only that the first link icon is visible without first checking the count. While .first().toBeVisible() will fail if no icons exist (making the test safe), explicitly asserting await expect(linkIcons).not.toHaveCount(0) before Line 95 would align with the pattern used in the first test (Line 74) and improve clarity.

✨ Optional: Add explicit count check
 const linkIcons = shownSection.getByTestId(
   TestIds.subgraphEditor.iconLink
 )
+await expect(linkIcons).not.toHaveCount(0)
 await expect(linkIcons.first()).toBeVisible()
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts` around lines 81 -
101, Add an explicit non-zero count assertion for the link icons before checking
visibility: in the test body (function starting with test('linked promoted
widgets show link icon instead of eye icon', ...)) after obtaining linkIcons
(const linkIcons = shownSection.getByTestId(TestIds.subgraphEditor.iconLink)),
insert an assertion like await expect(linkIcons).not.toHaveCount(0) before
awaiting expect(linkIcons.first()).toBeVisible(); this mirrors the pattern used
earlier and makes the intent explicit while keeping the existing checks for
iconEye count intact.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts`:
- Around line 81-101: Add an explicit non-zero count assertion for the link
icons before checking visibility: in the test body (function starting with
test('linked promoted widgets show link icon instead of eye icon', ...)) after
obtaining linkIcons (const linkIcons =
shownSection.getByTestId(TestIds.subgraphEditor.iconLink)), insert an assertion
like await expect(linkIcons).not.toHaveCount(0) before awaiting
expect(linkIcons.first()).toBeVisible(); this mirrors the pattern used earlier
and makes the intent explicit while keeping the existing checks for iconEye
count intact.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 3f24c1cf-85ad-4a6b-840e-b0a78bbdddbc

📥 Commits

Reviewing files that changed from the base of the PR and between 3598591 and 55423a5.

📒 Files selected for processing (5)
  • browser_tests/fixtures/selectors.ts
  • browser_tests/tests/subgraphPromotedWidgetPanel.spec.ts
  • src/components/button/MoreButton.vue
  • src/core/graph/subgraph/promotionUtils.test.ts
  • src/core/graph/subgraph/promotionUtils.ts
✅ Files skipped from review due to trivial changes (1)
  • src/components/button/MoreButton.vue
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/core/graph/subgraph/promotionUtils.test.ts
  • browser_tests/fixtures/selectors.ts

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

Labels

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