Skip to content

fix: deterministic DOM widget clip-path for flaky screenshot test#9400

Merged
christian-byrne merged 3 commits intomainfrom
ci/fix-flaky-test
Mar 5, 2026
Merged

fix: deterministic DOM widget clip-path for flaky screenshot test#9400
christian-byrne merged 3 commits intomainfrom
ci/fix-flaky-test

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Mar 5, 2026

Summary

Fix deterministic DOM widget clip-path rendering to resolve the flaky "Can drag node" screenshot test.

Root Cause

useDomClipping.updateClipPath() schedules clip-path calculation in a requestAnimationFrame, but DomWidget.vue's watcher reads clippingStyle.value synchronously before the RAF fires. The stale clip-path gets baked into style.value and never updated when the RAF completes, causing the textarea DOM widget to non-deterministically render in front of or behind the canvas-drawn node selection border.

Fix

  • Extract composeStyle() function and add a dedicated watcher on clippingStyle that recomposes the final inline style whenever the RAF-deferred clip-path updates

  • Add enableDomClipping to the main watcher dependency array so toggling the clipping setting immediately recomposes the style

  • Add moveMouseToEmptyArea() call in the test as a secondary stabilizer against hover highlight non-determinism

  • Delete stale snapshot so CI regenerates it with correct clip-path behavior

  • Fixes [test] Fix flaky playwright tests in CI #4658

@christian-byrne christian-byrne requested a review from a team as a code owner March 5, 2026 00:57
@dosubot dosubot bot added the size:XS This PR changes 0-9 lines, ignoring generated files. label Mar 5, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 5, 2026

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (3)
  • browser_tests/tests/interaction.spec.ts-snapshots/dragged-node1-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/loadWorkflowInMedia.spec.ts-snapshots/no-workflow-webp-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/nodeSearchBox.spec.ts-snapshots/added-node-no-connection-chromium-linux.png is excluded by !**/*.png

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 8f0c8e68-86c9-4ae0-826b-7167becceb23

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a post-drag mouse move in a browser interaction test to avoid hover highlight at drop, and refactors DomWidget.vue to introduce a composeStyle helper and a clippingStyle watcher so composed styles are reapplied after asynchronous clip-path updates.

Changes

Cohort / File(s) Summary
Test Stabilization
browser_tests/tests/interaction.spec.ts
After dragging a node, move the mouse to an empty area before capturing the frame to prevent hover/highlight at the drop location.
DomWidget style refactor
src/components/graph/widgets/DomWidget.vue
Add composeStyle to centralize style computation (position, optional clip-path, z-index, pointer-events, opacity); replace inline style assembly with calls to it; watch enableDomClipping and clippingStyle so composed styles are reapplied after RAF-driven clipping updates.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

area:testing

Suggested reviewers

  • pythongosssss
  • DrJKL

Poem

🐰
I hopped the mouse to calmer ground,
So drags land clean and tests stay sound.
I stitched the styles with careful paws,
Fixed clipping snares and smoothed the laws.
Hop—small changes, fewer frowns.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: fixing a deterministic DOM widget clip-path issue that resolves a flaky screenshot test.
Description check ✅ Passed The description provides comprehensive context including root cause analysis, the fix details, test changes, and issue reference, meeting the template requirements.
Linked Issues check ✅ Passed The PR addresses the 'Can drag-and-drop animated webp image' test from issue #4658 by fixing the root cause of non-deterministic clip-path rendering and adding stabilization to prevent hover highlight non-determinism.
Out of Scope Changes check ✅ Passed All changes are focused on fixing the flaky test: DomWidget.vue changes ensure deterministic clip-path rendering, and interaction.spec.ts adds mouse movement to prevent hover non-determinism.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch ci/fix-flaky-test

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

@github-actions
Copy link

github-actions bot commented Mar 5, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/05/2026, 05:25:30 AM UTC

Links

@github-actions
Copy link

github-actions bot commented Mar 5, 2026

🎭 Playwright: ✅ 549 passed, 0 failed · 5 flaky

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

@github-actions
Copy link

github-actions bot commented Mar 5, 2026

📦 Bundle: 4.49 MB gzip 🔴 +21 B

Details

Summary

  • Raw size: 21.1 MB baseline 21.1 MB — 🔴 +144 B
  • Gzip: 4.49 MB baseline 4.49 MB — 🔴 +21 B
  • Brotli: 3.47 MB baseline 3.47 MB — 🟢 -129 B
  • Bundles: 228 current • 228 baseline • 2 added / 2 removed

Category Glance
Graph Workspace 🔴 +144 B (913 kB) · Vendor & Third-Party ⚪ 0 B (8.86 MB) · Other ⚪ 0 B (7.92 MB) · Data & Services ⚪ 0 B (2.73 MB) · Panels & Settings ⚪ 0 B (436 kB) · Views & Navigation ⚪ 0 B (72.4 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-DIzYTFeC.js (new) 17.8 kB 🔴 +17.8 kB 🔴 +6.29 kB 🔴 +5.49 kB
assets/index-DqBd1e5V.js (removed) 17.8 kB 🟢 -17.8 kB 🟢 -6.29 kB 🟢 -5.47 kB

Status: 1 added / 1 removed

Graph Workspace — 913 kB (baseline 913 kB) • 🔴 +144 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-CBqBLE1b.js (new) 913 kB 🔴 +913 kB 🔴 +194 kB 🔴 +147 kB
assets/GraphView-CrvXAuVS.js (removed) 913 kB 🟢 -913 kB 🟢 -194 kB 🟢 -147 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudAuthTimeoutView-CCaCJbM2.js 4.95 kB 4.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudForgotPasswordView-DUUUBVZM.js 5.6 kB 5.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudLayoutView-BTq0JcxG.js 6.47 kB 6.47 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudLoginView-BRg_46dJ.js 11.5 kB 11.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSignupView-DoqCX67Q.js 9.41 kB 9.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSorryContactSupportView-DwQRNUxH.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSubscriptionRedirectView-CyE10tgF.js 4.8 kB 4.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSurveyView-D3r1Alnh.js 15.5 kB 15.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-CTBdQNLF.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserCheckView-C8bALEqN.js 8.41 kB 8.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserSelectView-gXdBhPUT.js 4.5 kB 4.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Panels & Settings — 436 kB (baseline 436 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/AboutPanel-CSFEzAZD.js 9.79 kB 9.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudRemoteConfig-DLiKfaxK.js 1.48 kB 1.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/config-Dim-BcsI.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ExtensionPanel-CPEy9rxH.js 9.42 kB 9.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/KeybindingPanel-Camm4WT0.js 12.3 kB 12.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LegacyCreditsPanel-D8HHPDKt.js 20.7 kB 20.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/refreshRemoteConfig-C26qJhVr.js 1.14 kB 1.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SecretsPanel-D9x2ufo_.js 21.5 kB 21.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ServerConfigPanel-wez3wHKZ.js 6.49 kB 6.49 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Az4QGSr7.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Bc1kL5ht.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BxoUe5GJ.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-ClhpchbB.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D9qrBXiF.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DXfL5vCm.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-jzj0F3XL.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-KcouHUkA.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-MfieTybP.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-V6oR26kh.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-YUrYiWmR.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanel-D1i-892g.js 18.7 kB 18.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserPanel-CXSp78VC.js 6.21 kB 6.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
User & Accounts — 16.1 kB (baseline 16.1 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-BLIWd9Tw.js 357 B 357 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auth-C86XiMjU.js 3.4 kB 3.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/firebaseAuthStore-BEps9A2j.js 831 B 831 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/PasswordFields-C2IR8Uml.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SignUpForm-Ca27adug.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UpdatePasswordContent-CXzOLvIx.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-KL8Hs2yn.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Editors & Dialogs — 779 B (baseline 779 B) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-B4U6bUxP.js 779 B 779 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
UI Components — 47 kB (baseline 47 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Button-D-9gIyaN.js 3.08 kB 3.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-Cx_Hg1jw.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudFeedbackTopbarButton-Da7-upAy.js 1.64 kB 1.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyQueueButton-D6_xrEp6.js 836 B 836 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyQueueButton-vP77_bCO.js 8.02 kB 8.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-y8BSEeZq.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-BS8_8a5j.js 5.95 kB 5.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscribeButton-Q9LYbKRb.js 2.34 kB 2.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-D1EvgBfE.js 7.39 kB 7.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-BQCZ8iNl.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useTerminalTabs-CkdAV59o.js 9.89 kB 9.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-DGB_HZfA.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Data & Services — 2.73 MB (baseline 2.73 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/api-DaYKKCQv.js 689 kB 689 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/audioService-B4XjmxpP.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/bootstrapStore-JU2P3dKY.js 2.08 kB 2.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/dialogService-m3qiQjaR.js 1.91 MB 1.91 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/dialogService-w5SuTTto.js 768 B 768 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/extensionStore-PyaEErsN.js 13 kB 13 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/keybindingService-Cdxqod6P.js 6.52 kB 6.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/load3dService-DIfs98ru.js 91 kB 91 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/releaseStore-BTcvFtT0.js 7.96 kB 7.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/releaseStore-vLTyEqob.js 803 B 803 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/serverConfigStore-BJqmVNuT.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settingStore-Ci8R35aq.js 787 B 787 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/userStore-ykeeCoCy.js 1.85 kB 1.85 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/workflowDraftStore-CnmmdEbN.js 779 B 779 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
Utilities & Hooks — 56.6 kB (baseline 56.6 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/_plugin-vue_export-helper-ralzwvFM.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/audioUtils-RkAp7VQ9.js 858 B 858 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-BJSyqxym.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-CC-l-L9z.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-Cddas8Zl.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-CsnHjXS0.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/subscriptionCheckoutUtil-DSPFbotE.js 2.53 kB 2.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCopyToClipboard-BO59-OsU.js 944 B 944 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCurrentUser-B1Myr5lL.js 765 B 765 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useErrorHandling-uqFwb_23.js 1.5 kB 1.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-kHTV1WH8.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useFeatureFlags-B0qfjiRi.js 4.14 kB 4.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3d-2UZJbcAo.js 14.6 kB 14.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3d-BGD9-VjY.js 902 B 902 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3dViewer-C29MtMP4.js 881 B 881 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3dViewer-Do7kb006.js 14.1 kB 14.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useWorkspaceSwitch-C766BQ9a.js 1.25 kB 1.25 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useWorkspaceUI-BAplK0Y4.js 3 kB 3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Vendor & Third-Party — 8.86 MB (baseline 8.86 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-l-KY-tZQ.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-DccD0mxo.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-D5S6AC80.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-BSv7ubBF.js 1.52 MB 1.52 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-D2gQvLCc.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-C-tDe-KL.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-ueviNA60.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-BnYkbQDM.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-CmHHRvL9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-cYXYo6hi.js 121 kB 121 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-XVeHlCL4.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.92 MB (baseline 7.92 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/AnimationControls-Bal5YgT5.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-BRnxPwkH.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/AudioPreviewPlayer-BqCYVncF.js 11 kB 11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-Bt3L7FBS.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-BU8wYnsH.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CancelSubscriptionDialogContent-fKEG8lih.js 4.83 kB 4.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/changeTracker-fN3QLRSj.js 9.44 kB 9.44 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/changeTracker-JHz_pUiK.js 800 B 800 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudBadges-CbAKzRL9.js 1.41 kB 1.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudRunButtonWrapper-4rbFqHd_.js 1.72 kB 1.72 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudSessionCookie-5QM1CBF9.js 3.14 kB 3.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudSubscription-BN0ibyGO.js 1.37 kB 1.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-CoSPG7JX.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-CXepDPJT.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-32T5PqF_.js 19 kB 19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Ak-xav7X.js 17.7 kB 17.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B7yDR3IF.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BfgrmbF3.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BKiowuzF.js 17.1 kB 17.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C2ScMdCP.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CIaXr_da.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CQ_1hcIQ.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D9CRAR5X.js 17.7 kB 17.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DgrxZ384.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Dm6gdG1p.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-CobilG8q.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/core-DZqzvhZY.js 73.7 kB 73.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CreateWorkspaceDialogContent-CCrR9bH6.js 5.57 kB 5.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CurrentUserPopoverWorkspace-BJXw18r5.js 20.5 kB 20.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/DeleteWorkspaceDialogContent-uz9zqkIu.js 4.27 kB 4.27 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/EditWorkspaceDialogContent-rpXdyuWa.js 5.37 kB 5.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FreeTierDialogContent-Bls8MsR9.js 5.43 kB 5.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/GlobalToast-2YygvxSI.js 2.91 kB 2.91 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/graphHasMissingNodes-BQTsAX7G.js 761 B 761 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/groupNode-jGX5iDBS.js 71.8 kB 71.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-CgFxmlcu.js 535 kB 535 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-eWU18WjT.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/InviteMemberDialogContent-DEaldzQ7.js 7.43 kB 7.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/InviteMemberUpsellDialogContent-yRaVDhs2.js 3.87 kB 3.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LeaveWorkspaceDialogContent-DqH_8R2Q.js 4.1 kB 4.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3D-BQmYGoT9.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/load3d-Bs_4MHqQ.js 14.8 kB 14.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3D-CQpK48ZY.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3DConfiguration-DrMYGPNo.js 6.27 kB 6.27 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3DControls-Bna5YtpY.js 30.9 kB 30.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3dViewerContent-BzKHHROI.js 1.04 kB 1.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3dViewerContent-CwwRktAl.js 23 kB 23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-a_fD2A1w.js 151 kB 151 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bi1XfdpF.js 188 kB 188 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BJQ0M9Yj.js 210 kB 210 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BvVDOLZZ.js 150 kB 150 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BZLcIBqp.js 173 kB 173 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CjbGas6Z.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CZaOv97H.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D6nxp_Jl.js 153 kB 153 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-dKpvLPCH.js 181 kB 181 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-dXT40Jsi.js 158 kB 158 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-WPbnhfZ5.js 155 kB 155 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-CZ4wk4U1.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-pqbTSt64.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-CfDqPsGU.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-B84VMc_d.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-DIqLHunN.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-WILUyTDj.js 2.77 kB 2.77 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nightlyBadges-CowOCCNk.js 1.04 kB 1.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-46r0KRED.js 451 kB 451 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BrUpuJ60.js 396 kB 396 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C5Naq7UG.js 364 kB 364 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CenyYNO8.js 450 kB 450 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CN3CzRXx.js 404 kB 404 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Cz73oY7a.js 368 kB 368 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D22mZTDT.js 400 kB 400 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Dh2PHfFx.js 391 kB 391 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DJ0GsBGj.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DJKCo7UK.js 416 kB 416 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-FjSUW2rw.js 491 kB 491 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeTemplates-QXMg8K9N.js 9.34 kB 9.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/onboardingCloudRoutes-Chl0l04h.js 5.47 kB 5.47 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-iM3e9lB4.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Preview3d-C9NoDMPz.js 4.89 kB 4.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-Bci9gesb.js 1.39 kB 1.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/RemoveMemberDialogContent-DJIpBCm5.js 4.08 kB 4.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/RevokeInviteDialogContent-7ZPezcTr.js 4 kB 4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/saveMesh-DzSXKiNH.js 3.42 kB 3.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-CedvgC2B.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SignInContent-D9zJIB_0.js 18.9 kB 18.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-CUgdREzQ.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-D4A5BM3I.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-KRN59wM5.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscribeToRun-CBK1h4x_.js 2.06 kB 2.06 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-BxBbqnOZ.js 2.01 kB 2.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanelContentWorkspace-3igN4NtJ.js 22 kB 22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanelContentWorkspace-BujS0jKV.js 963 B 963 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionRequiredDialogContent-DO69qetW.js 25.7 kB 25.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionRequiredDialogContentWorkspace-C_uHZ2Bi.js 46.4 kB 46.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/tierBenefits-ee-xlnnc.js 3.66 kB 3.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ValueControlPopover-B5BzdpgS.js 4.96 kB 4.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-d1kDZ1Hw.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DIRwAHBY.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-Dx4DYlRd.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-ThP4bP1R.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-YZCBKjIT.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-C4yd_6Zg.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetCurve-C3tuuOR3.js 9.36 kB 9.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-tNR6Ubxu.js 3.61 kB 3.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-HFijaR80.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCrop-CQ6ZK_gK.js 22.2 kB 22.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputNumber-CZbvlYQI.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-W9vcgWMp.js 1.86 kB 1.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-S6xnM-i1.js 1.98 kB 1.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLegacy-_rv0cTAX.js 787 B 787 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-BqPoJLFX.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetPainter-BWPyBBvc.js 32.9 kB 32.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-C6ZYch5M.js 1.1 kB 1.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetRecordAudio-C-fvocwE.js 17.4 kB 17.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetSelect-BCoR6Bll.js 58.3 kB 58.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-CXXorPof.js 5.07 kB 5.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-9dIESGMI.js 6.8 kB 6.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-DYLaC2lj.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetWithControl-D2UNTAlT.js 4.14 kB 4.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspacePanelContent-CsYePB9Y.js 29.3 kB 29.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

DrJKL
DrJKL previously approved these changes Mar 5, 2026
@github-actions
Copy link

github-actions bot commented Mar 5, 2026

⚡ Performance Report

No regressions detected.

All metrics
Metric Baseline PR (n=3) Δ Sig
canvas-idle: style recalcs 123 124 +0% z=-0.1
canvas-idle: layouts 0 0 variance too high
canvas-idle: task duration 409ms 409ms -0% z=-0.3
canvas-mouse-sweep: style recalcs 178 175 -2% z=-0.0
canvas-mouse-sweep: layouts 12 12 -3% z=-1.1
canvas-mouse-sweep: task duration 976ms 836ms -14% z=-0.7
dom-widget-clipping: style recalcs 43 41 -5% z=-0.3
dom-widget-clipping: layouts 0 0 +0%
dom-widget-clipping: task duration 373ms 349ms -6% z=-0.5
subgraph-dom-widget-clipping: style recalcs 74 73 -2% z=-0.7
subgraph-dom-widget-clipping: layouts 0 0 +0%
subgraph-dom-widget-clipping: task duration 425ms 414ms -3% z=-0.5
subgraph-idle: style recalcs 121 121 +1% z=0.5
subgraph-idle: layouts 0 0 +0% variance too high
subgraph-idle: task duration 385ms 388ms +1% z=-0.2
subgraph-mouse-sweep: style recalcs 168 168 -0% z=0.6
subgraph-mouse-sweep: layouts 16 16 -2% z=-0.4
subgraph-mouse-sweep: task duration 920ms 917ms -0% z=0.6
Historical variance (last 5 runs)
Metric μ σ CV
canvas-idle: style recalcs 124 1 0.7%
canvas-idle: layouts 0 0 136.9%
canvas-idle: task duration 422ms 48ms 11.4%
canvas-mouse-sweep: style recalcs 176 8 4.7%
canvas-mouse-sweep: layouts 12 0 1.5%
canvas-mouse-sweep: task duration 920ms 118ms 12.8%
dom-widget-clipping: style recalcs 42 2 3.7%
dom-widget-clipping: layouts 0 0 0.0%
dom-widget-clipping: task duration 359ms 20ms 5.7%
subgraph-dom-widget-clipping: style recalcs 73 1 1.5%
subgraph-dom-widget-clipping: layouts 0 0 0.0%
subgraph-dom-widget-clipping: task duration 422ms 15ms 3.6%
subgraph-idle: style recalcs 121 1 0.5%
subgraph-idle: layouts 0 0 149.1%
subgraph-idle: task duration 393ms 25ms 6.5%
subgraph-mouse-sweep: style recalcs 164 6 3.8%
subgraph-mouse-sweep: layouts 16 0 0.9%
subgraph-mouse-sweep: task duration 865ms 84ms 9.7%
Raw data
{
  "timestamp": "2026-03-05T05:28:34.342Z",
  "gitSha": "fe8bed3ce70fac103a3861a8b9ce1c9ed1ed01aa",
  "branch": "ci/fix-flaky-test",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2038.3249999999862,
      "styleRecalcs": 124,
      "styleRecalcDurationMs": 24.282999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 441.1039999999999,
      "heapDeltaBytes": -1616204
    },
    {
      "name": "canvas-idle",
      "durationMs": 2016.4629999999875,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 19.849999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 379.84299999999996,
      "heapDeltaBytes": -3188600
    },
    {
      "name": "canvas-idle",
      "durationMs": 2049.6720000000437,
      "styleRecalcs": 126,
      "styleRecalcDurationMs": 25.953999999999997,
      "layouts": 1,
      "layoutDurationMs": 0.308,
      "taskDurationMs": 406.70099999999996,
      "heapDeltaBytes": -2940044
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1971.347000000037,
      "styleRecalcs": 182,
      "styleRecalcDurationMs": 57.844,
      "layouts": 12,
      "layoutDurationMs": 3.75,
      "taskDurationMs": 890.463,
      "heapDeltaBytes": -2902412
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1892.3340000000053,
      "styleRecalcs": 172,
      "styleRecalcDurationMs": 49.891000000000005,
      "layouts": 12,
      "layoutDurationMs": 3.221,
      "taskDurationMs": 825.1429999999999,
      "heapDeltaBytes": -3120496
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1894.6599999999876,
      "styleRecalcs": 172,
      "styleRecalcDurationMs": 48.307,
      "layouts": 12,
      "layoutDurationMs": 3.2739999999999996,
      "taskDurationMs": 793.6590000000001,
      "heapDeltaBytes": -2896556
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 550.6709999999657,
      "styleRecalcs": 40,
      "styleRecalcDurationMs": 14.068,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 356.974,
      "heapDeltaBytes": 7715576
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 546.4709999999968,
      "styleRecalcs": 40,
      "styleRecalcDurationMs": 12.847000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 333.178,
      "heapDeltaBytes": 6697492
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 581.5680000000043,
      "styleRecalcs": 43,
      "styleRecalcDurationMs": 13.136999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 355.742,
      "heapDeltaBytes": 7739480
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 586.6170000000466,
      "styleRecalcs": 73,
      "styleRecalcDurationMs": 15.386000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 418.62999999999994,
      "heapDeltaBytes": -7905356
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 576.3979999999833,
      "styleRecalcs": 72,
      "styleRecalcDurationMs": 14.037999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 404.35800000000006,
      "heapDeltaBytes": -8774336
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 596.3380000000029,
      "styleRecalcs": 73,
      "styleRecalcDurationMs": 15.147999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 418.509,
      "heapDeltaBytes": -9309416
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2023.0730000000108,
      "styleRecalcs": 122,
      "styleRecalcDurationMs": 20.898,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 391.10200000000003,
      "heapDeltaBytes": -3275712
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2005.5389999999989,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 21.171000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 391.73900000000003,
      "heapDeltaBytes": -2136200
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2003.341999999975,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 20.610000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 382.47900000000004,
      "heapDeltaBytes": -2751796
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1714.9969999999826,
      "styleRecalcs": 156,
      "styleRecalcDurationMs": 46.397,
      "layouts": 16,
      "layoutDurationMs": 4.407,
      "taskDurationMs": 747.22,
      "heapDeltaBytes": -4017768
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 2018.478000000016,
      "styleRecalcs": 174,
      "styleRecalcDurationMs": 55.931999999999995,
      "layouts": 16,
      "layoutDurationMs": 4.675000000000001,
      "taskDurationMs": 985.344,
      "heapDeltaBytes": -4601768
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 2012.8520000000094,
      "styleRecalcs": 173,
      "styleRecalcDurationMs": 56.458000000000006,
      "layouts": 16,
      "layoutDurationMs": 4.634,
      "taskDurationMs": 1017.9909999999999,
      "heapDeltaBytes": -2846068
    }
  ]
}

@DrJKL DrJKL added the New Browser Test Expectations New browser test screenshot should be set by github action label Mar 5, 2026
@github-actions
Copy link

github-actions bot commented Mar 5, 2026

Updating Playwright Expectations

@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Mar 5, 2026
@dosubot dosubot bot added size:M This PR changes 30-99 lines, ignoring generated files. and removed size:XS This PR changes 0-9 lines, ignoring generated files. labels Mar 5, 2026
@christian-byrne christian-byrne changed the title test: fix flaky 'Can drag node' screenshot test fix: deterministic DOM widget clip-path for flaky screenshot test Mar 5, 2026
Copy link
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: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/graph/widgets/DomWidget.vue`:
- Around line 121-131: The watch that currently observes [() => widgetState,
left, top] must also include enableDomClipping (use enableDomClipping.value) so
toggling Comfy.DOMClippingEnabled retriggers the callback; update the same for
the second watch that observes clippingStyle so it also lists enableDomClipping
as a dependency. In practice, add enableDomClipping to both watch dependency
arrays so when the toggle changes the callback runs and calls composeStyle()
(and updateDomClipping() when enabled), ensuring clippingStyle and DOM clipping
are recomputed immediately.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: b5f83e4a-fb2a-461f-9107-958094b2e6b0

📥 Commits

Reviewing files that changed from the base of the PR and between 917209c and 622c903.

⛔ Files ignored due to path filters (1)
  • browser_tests/tests/interaction.spec.ts-snapshots/dragged-node1-chromium-linux.png is excluded by !**/*.png
📒 Files selected for processing (1)
  • src/components/graph/widgets/DomWidget.vue

@christian-byrne
Copy link
Contributor Author

/update-playwright

@christian-byrne christian-byrne added the New Browser Test Expectations New browser test screenshot should be set by github action label Mar 5, 2026
@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Mar 5, 2026
@christian-byrne christian-byrne merged commit 6c20d64 into main Mar 5, 2026
32 checks passed
@christian-byrne christian-byrne deleted the ci/fix-flaky-test branch March 5, 2026 05:44
christian-byrne added a commit that referenced this pull request Mar 5, 2026
…eview

Two flaky screenshot tests were identified during the PR #9400 snapshot
update, where baselines regenerated without any code changes affecting them:

1. added-node-no-connection (nodeSearchBox.spec.ts):
   Root cause: fillAndSelectFirstNode('KSampler') selected nth(0) from
   the dropdown, but search result ordering is non-deterministic when the
   search box opens via link release (with filter chips). Sometimes
   'Preview Image' appeared first instead of 'KSampler'.
   Fix: Add exact:true option that uses aria-label selector to click the
   specific matching result instead of blindly selecting the first item.

2. no-workflow-webp (loadWorkflowInMedia.spec.ts):
   Root cause: Dropping no_workflow.webp (no embedded workflow) creates a
   LoadImage node and uploads the file. The image preview then loads
   asynchronously via /view API. The screenshot was taken before the
   upload and preview load completed, causing the preview to sometimes
   show the image and sometimes show a black/empty area.
   Fix: Wait for the upload response and subsequent /view response before
   taking the screenshot.

Both baselines are deleted for CI regeneration.

Fixes #4658

Amp-Thread-ID: https://ampcode.com/threads/T-019cbc87-ce1f-7338-93c7-d0677a632805
christian-byrne added a commit that referenced this pull request Mar 5, 2026
…#9426)

## Summary

Fixes flaky screenshot test that was identified during the PR #9400
snapshot update, where baselines regenerated without any code changes
affecting them.

**Root cause:** `fillAndSelectFirstNode('KSampler')` selected `nth(0)`
from the autocomplete dropdown, but search result ordering is
non-deterministic when the search box opens via link release with filter
chips. Sometimes 'Preview Image' appeared as the first result instead of
'KSampler', causing a completely different node to be added.

**Fix:** Added an `exact: true` option to `fillAndSelectFirstNode` that
uses an `aria-label` selector to click the specific matching result
instead of blindly selecting the first item.

- Fixes #4658

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9426-fix-stabilize-flaky-screenshot-tests-for-search-results-and-image-preview-31a6d73d365081598167ce285416995c)
by [Unito](https://www.unito.io)

---------

Co-authored-by: github-actions <github-actions@github.com>
Myestery pushed a commit that referenced this pull request Mar 5, 2026
)

## Summary

Fix deterministic DOM widget clip-path rendering to resolve the flaky
"Can drag node" screenshot test.

## Root Cause

`useDomClipping.updateClipPath()` schedules clip-path calculation in a
`requestAnimationFrame`, but `DomWidget.vue`'s watcher reads
`clippingStyle.value` synchronously before the RAF fires. The stale
clip-path gets baked into `style.value` and never updated when the RAF
completes, causing the textarea DOM widget to non-deterministically
render in front of or behind the canvas-drawn node selection border.

## Fix

- Extract `composeStyle()` function and add a dedicated watcher on
`clippingStyle` that recomposes the final inline style whenever the
RAF-deferred clip-path updates
- Add `enableDomClipping` to the main watcher dependency array so
toggling the clipping setting immediately recomposes the style
- Add `moveMouseToEmptyArea()` call in the test as a secondary
stabilizer against hover highlight non-determinism
- Delete stale snapshot so CI regenerates it with correct clip-path
behavior

- Fixes #4658

---------

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

Labels

size:M This PR changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[test] Fix flaky playwright tests in CI

2 participants