Skip to content

test(infra): cloud Playwright project with @cloud/@oss tagging#10546

Merged
christian-byrne merged 12 commits intomainfrom
feat/cloud-e2e-project
Mar 29, 2026
Merged

test(infra): cloud Playwright project with @cloud/@oss tagging#10546
christian-byrne merged 12 commits intomainfrom
feat/cloud-e2e-project

Conversation

@christian-byrne
Copy link
Copy Markdown
Contributor

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

What

Adds a cloud Playwright project so E2E tests can run against DISTRIBUTION=cloud builds, with @cloud / @oss test tagging.

Why

100+ usages of isCloud / DISTRIBUTION across 9 categories (API routing, UI visibility, settings, auth). Zero cloud test infrastructure existed — cloud-specific UI components (LoginButton, SubscribeButton, etc.) had no E2E coverage path.

Investigation: Runtime Toggle

Investigated whether isCloud could be made runtime-toggleable in dev/test mode (via window.__FORCE_CLOUD__). Not feasible__DISTRIBUTION__ is a Vite define compile-time constant used for dead-code elimination. Runtime override would break tree-shaking in production.

Full investigation: research/architecture/cloud-runtime-toggle-investigation.md

What's included

Playwright Config

  • New cloud project alongside existing chromium
  • Cloud project: grep: /@cloud/ — only runs @cloud tagged tests
  • Chromium project: grepInvert: /@cloud/ — excludes cloud tests

Build Script

  • npm run build:cloudDISTRIBUTION=cloud vite build

Test Tagging Convention

test('works in both', async () => { ... });
test('subscription button visible @cloud', async () => { ... });
test('install manager prompt @oss', async () => { ... });

Example Tests

  • 2 cloud-only tests validating cloud UI visibility

NOT included (future work)

  • CI workflow job for cloud tests (separate PR)
  • Cloud project is opt-in — not run by default locally

Unblocks

  • Cloud-specific E2E tests for entire team
  • TB-03 LoginButton, TB-04 SubscribeButton (@KaiLi Yang)
  • DLG-04 SignIn, DLG-06 CancelSubscription

Part of: Test Coverage Q2 Overhaul

┆Issue is synchronized with this Notion page by Unito

@dosubot dosubot bot added the size:M This PR changes 30-99 lines, ignoring generated files. label Mar 26, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 26, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a cloud-specific Playwright test file, a new TestId for the topbar subscribe button, a build:cloud npm script, and Playwright config changes that run @cloud tests in a dedicated cloud project while excluding them from the default Chromium project.

Changes

Cohort / File(s) Summary
Playwright config
playwright.config.ts
Updated chromium project's grepInvert to also exclude @cloud; added a new cloud project using devices['Desktop Chrome'], timeout: 15000, grep: /@cloud/, and grepInvert: /@oss/.
Cloud tests
browser_tests/tests/cloud.spec.ts
Added Cloud distribution UI @cloud`` test suite with two tests: one asserts topbar-subscribe-button is attached; the other asserts `side-toolbar` is visible and that no bottom-panel/terminal toggle button exists.
Selectors / TestIds
browser_tests/fixtures/selectors.ts
Added topbar.subscribeButton TestId ('topbar-subscribe-button'); TestIdValue union now includes the new literal.
Build scripts
package.json
Added build:cloud script: cross-env DISTRIBUTION=cloud NODE_OPTIONS='--max-old-space-size=8192' nx build.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐇 I hopped into clouds with a tiny test,
I nudged the topbar button and checked its rest,
I scanned the toolbar where terminals hide,
I added a script and watched builds glide,
🥕⛅ — the rabbit hums, cloud-ready and blessed.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and specifically describes the main change: introducing a cloud Playwright project with @cloud/@oss test tagging infrastructure.
Description check ✅ Passed The description comprehensively covers all required template sections (Summary, Changes, Review Focus) with detailed context, investigation notes, implementation details, and unblocking information.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
End-To-End Regression Coverage For Fixes ✅ Passed PR title uses 'test(infra)' language and modifies multiple files under browser_tests/, meeting criteria for infrastructure work not requiring regression testing.
Adr Compliance For Entity/Litegraph Changes ✅ Passed PR modifies only test infrastructure and configuration files; none are in src/lib/litegraph/, src/ecs/, or graph entity paths, so check passes immediately per requirements.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/cloud-e2e-project

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

@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 26, 2026

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

📊 Browser Reports
  • chromium: View Report (✅ 753 / ❌ 0 / ⚠️ 2 / ⏭️ 1)
  • 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 26, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/29/2026, 04:40:24 AM UTC

Links

@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 26, 2026

📦 Bundle: 5.09 MB gzip 🟢 -11 B

Details

Summary

  • Raw size: 23.4 MB baseline 23.4 MB — ⚪ 0 B
  • Gzip: 5.09 MB baseline 5.09 MB — 🟢 -11 B
  • Brotli: 3.94 MB baseline 3.94 MB — 🔴 +47 B
  • Bundles: 249 current • 249 baseline • 114 added / 114 removed

Category Glance
Vendor & Third-Party ⚪ 0 B (9.8 MB) · Other ⚪ 0 B (8.43 MB) · Data & Services ⚪ 0 B (2.96 MB) · Graph Workspace ⚪ 0 B (1.14 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-CAIbsuCJ.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +7.93 kB 🔴 +6.79 kB
assets/index-CckJCjy_.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -7.93 kB 🟢 -6.77 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-C7qHhq4W.js (new) 1.14 MB 🔴 +1.14 MB 🔴 +244 kB 🔴 +184 kB
assets/GraphView-Cd7pcLTJ.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-CZpdoaKn.js (new) 15.7 kB 🔴 +15.7 kB 🔴 +3.4 kB 🔴 +2.9 kB
assets/CloudSurveyView-jJeLo-qe.js (removed) 15.7 kB 🟢 -15.7 kB 🟢 -3.4 kB 🟢 -2.91 kB
assets/CloudLoginView-CbbxramC.js (removed) 12 kB 🟢 -12 kB 🟢 -3.35 kB 🟢 -2.96 kB
assets/CloudLoginView-DB4cAYwQ.js (new) 12 kB 🔴 +12 kB 🔴 +3.36 kB 🔴 +2.97 kB
assets/CloudSignupView-CE1QvzzD.js (new) 9.78 kB 🔴 +9.78 kB 🔴 +2.85 kB 🔴 +2.51 kB
assets/CloudSignupView-CVesnL-X.js (removed) 9.78 kB 🟢 -9.78 kB 🟢 -2.85 kB 🟢 -2.5 kB
assets/UserCheckView-DSgvvP2e.js (removed) 9.04 kB 🟢 -9.04 kB 🟢 -2.33 kB 🟢 -2.03 kB
assets/UserCheckView-DwoH3mt1.js (new) 9.04 kB 🔴 +9.04 kB 🔴 +2.33 kB 🔴 +2.03 kB
assets/CloudLayoutView-7LH0Fxgw.js (new) 7.54 kB 🔴 +7.54 kB 🔴 +2.36 kB 🔴 +2.04 kB
assets/CloudLayoutView-DVF_Gi5E.js (removed) 7.54 kB 🟢 -7.54 kB 🟢 -2.36 kB 🟢 -2.04 kB
assets/CloudForgotPasswordView-B-AfHjBK.js (removed) 5.94 kB 🟢 -5.94 kB 🟢 -2.09 kB 🟢 -1.85 kB
assets/CloudForgotPasswordView-Bkmvp5Gx.js (new) 5.94 kB 🔴 +5.94 kB 🔴 +2.09 kB 🔴 +1.83 kB
assets/CloudAuthTimeoutView-6LHc5Ghj.js (new) 5.31 kB 🔴 +5.31 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/CloudAuthTimeoutView-GME4EvBH.js (removed) 5.31 kB 🟢 -5.31 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/CloudSubscriptionRedirectView-BPm7QPzT.js (removed) 5.08 kB 🟢 -5.08 kB 🟢 -1.91 kB 🟢 -1.69 kB
assets/CloudSubscriptionRedirectView-CLrNsqnM.js (new) 5.08 kB 🔴 +5.08 kB 🔴 +1.91 kB 🔴 +1.69 kB
assets/UserSelectView-BAB6UZ9U.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.74 kB 🟢 -1.55 kB
assets/UserSelectView-BWJoETlN.js (new) 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-B0HF8ebM.js (new) 46.6 kB 🔴 +46.6 kB 🔴 +9.52 kB 🔴 +8.49 kB
assets/KeybindingPanel-GJAY9g4g.js (removed) 46.6 kB 🟢 -46.6 kB 🟢 -9.52 kB 🟢 -8.47 kB
assets/SecretsPanel-CCdvqKrW.js (new) 22.4 kB 🔴 +22.4 kB 🔴 +5.42 kB 🔴 +4.76 kB
assets/SecretsPanel-rRBHhXXd.js (removed) 22.4 kB 🟢 -22.4 kB 🟢 -5.42 kB 🟢 -4.76 kB
assets/LegacyCreditsPanel-BqviIJvC.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.81 kB 🔴 +5.14 kB
assets/LegacyCreditsPanel-DmIVmCg4.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.81 kB 🟢 -5.12 kB
assets/SubscriptionPanel-CjVjgB67.js (removed) 19.7 kB 🟢 -19.7 kB 🟢 -5.01 kB 🟢 -4.41 kB
assets/SubscriptionPanel-Dv0cSpfA.js (new) 19.7 kB 🔴 +19.7 kB 🔴 +5.01 kB 🔴 +4.39 kB
assets/AboutPanel-BU_BXjxO.js (new) 12 kB 🔴 +12 kB 🔴 +3.32 kB 🔴 +2.98 kB
assets/AboutPanel-vFu9krMr.js (removed) 12 kB 🟢 -12 kB 🟢 -3.32 kB 🟢 -2.98 kB
assets/ExtensionPanel-Cdnh_RKd.js (removed) 9.78 kB 🟢 -9.78 kB 🟢 -2.82 kB 🟢 -2.5 kB
assets/ExtensionPanel-D6RVRe52.js (new) 9.78 kB 🔴 +9.78 kB 🔴 +2.82 kB 🔴 +2.5 kB
assets/ServerConfigPanel-BL5OMC3D.js (removed) 6.85 kB 🟢 -6.85 kB 🟢 -2.27 kB 🟢 -2.03 kB
assets/ServerConfigPanel-VhFnsuvT.js (new) 6.85 kB 🔴 +6.85 kB 🔴 +2.27 kB 🔴 +2.02 kB
assets/UserPanel-6X6VojZe.js (removed) 6.56 kB 🟢 -6.56 kB 🟢 -2.15 kB 🟢 -1.9 kB
assets/UserPanel-CZQLoa6V.js (new) 6.56 kB 🔴 +6.56 kB 🔴 +2.15 kB 🔴 +1.89 kB
assets/cloudRemoteConfig-CgReZs3T.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -899 B 🟢 -777 B
assets/cloudRemoteConfig-xK6Awmfj.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +901 B 🔴 +799 B
assets/refreshRemoteConfig-6LSi3NP_.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -649 B 🟢 -549 B
assets/refreshRemoteConfig-DSy5wR1n.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +646 B 🔴 +555 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-BGTL6oou.js (removed) 3.57 kB 🟢 -3.57 kB 🟢 -1.26 kB 🟢 -1.07 kB
assets/auth-m_NdqLyC.js (new) 3.57 kB 🔴 +3.57 kB 🔴 +1.26 kB 🔴 +1.07 kB
assets/SignUpForm-BsgG5QcE.js (new) 3.16 kB 🔴 +3.16 kB 🔴 +1.28 kB 🔴 +1.15 kB
assets/SignUpForm-BYyYOzn0.js (removed) 3.16 kB 🟢 -3.16 kB 🟢 -1.28 kB 🟢 -1.14 kB
assets/UpdatePasswordContent-Dc1sP1QK.js (new) 2.66 kB 🔴 +2.66 kB 🔴 +1.19 kB 🔴 +1.05 kB
assets/UpdatePasswordContent-DubnI-To.js (removed) 2.66 kB 🟢 -2.66 kB 🟢 -1.19 kB 🟢 -1.06 kB
assets/authStore-CXvJ9ecR.js (removed) 989 B 🟢 -989 B 🟢 -479 B 🟢 -429 B
assets/authStore-D7GPb93L.js (new) 989 B 🔴 +989 B 🔴 +480 B 🔴 +428 B
assets/auth-CTQsf3pn.js (new) 348 B 🔴 +348 B 🔴 +215 B 🔴 +190 B
assets/auth-CxsnlH21.js (removed) 348 B 🟢 -348 B 🟢 -216 B 🟢 -189 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-BPkEbZgg.js (new) 108 kB 🔴 +108 kB 🔴 +22.4 kB 🔴 +18.9 kB
assets/useShareDialog-Bu_TLlRL.js (removed) 108 kB 🟢 -108 kB 🟢 -22.4 kB 🟢 -18.9 kB
assets/useSubscriptionDialog-Br035pR8.js (removed) 969 B 🟢 -969 B 🟢 -471 B 🟢 -419 B
assets/useSubscriptionDialog-D59j25CE.js (new) 969 B 🔴 +969 B 🔴 +475 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-C4R0n2ji.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.79 kB 🔴 +3.37 kB
assets/ComfyQueueButton-CvT8lYIO.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.79 kB 🟢 -3.38 kB
assets/useTerminalTabs-BESbfTzM.js (new) 10.7 kB 🔴 +10.7 kB 🔴 +3.6 kB 🔴 +3.17 kB
assets/useTerminalTabs-CVhBizaE.js (removed) 10.7 kB 🟢 -10.7 kB 🟢 -3.59 kB 🟢 -3.17 kB
assets/SubscribeButton-Cuyanaeh.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -913 B
assets/SubscribeButton-DhJElsdE.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +914 B
assets/cloudFeedbackTopbarButton-C-paLk__.js (removed) 1.66 kB 🟢 -1.66 kB 🟢 -842 B 🟢 -748 B
assets/cloudFeedbackTopbarButton-Cxq1oy7A.js (new) 1.66 kB 🔴 +1.66 kB 🔴 +841 B 🔴 +768 B
assets/ComfyQueueButton-A0oJd2BP.js (new) 1.03 kB 🔴 +1.03 kB 🔴 +488 B 🔴 +437 B
assets/ComfyQueueButton-BNM5d91G.js (removed) 1.03 kB 🟢 -1.03 kB 🟢 -488 B 🟢 -439 B

Status: 5 added / 5 removed / 8 unchanged

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

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-CbSKdR2g.js (removed) 1.92 MB 🟢 -1.92 MB 🟢 -443 kB 🟢 -336 kB
assets/dialogService-DlBhw3gD.js (new) 1.92 MB 🔴 +1.92 MB 🔴 +443 kB 🔴 +336 kB
assets/api-CFiiCAHB.js (removed) 885 kB 🟢 -885 kB 🟢 -211 kB 🟢 -167 kB
assets/api-D-udwNUw.js (new) 885 kB 🔴 +885 kB 🔴 +211 kB 🔴 +167 kB
assets/load3dService-DCoQdHJs.js (new) 92.5 kB 🔴 +92.5 kB 🔴 +19.7 kB 🔴 +16.9 kB
assets/load3dService-QX4hBvZ4.js (removed) 92.5 kB 🟢 -92.5 kB 🟢 -19.7 kB 🟢 -16.9 kB
assets/workflowShareService-C7ULzPSB.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.88 kB 🟢 -4.32 kB
assets/workflowShareService-TRup6UD_.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.88 kB 🔴 +4.32 kB
assets/keybindingService-8g_dByh8.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.67 kB 🔴 +3.21 kB
assets/keybindingService-DzfZZaT-.js (removed) 13.8 kB 🟢 -13.8 kB 🟢 -3.67 kB 🟢 -3.21 kB
assets/releaseStore-BbSzWpi8.js (removed) 8.12 kB 🟢 -8.12 kB 🟢 -2.28 kB 🟢 -2 kB
assets/releaseStore-C5Trl9WR.js (new) 8.12 kB 🔴 +8.12 kB 🔴 +2.28 kB 🔴 +2 kB
assets/userStore-BH11sSCu.js (new) 2.24 kB 🔴 +2.24 kB 🔴 +866 B 🔴 +766 B
assets/userStore-Q-i5kyIr.js (removed) 2.24 kB 🟢 -2.24 kB 🟢 -869 B 🟢 -767 B
assets/audioService-BqopwNtE.js (new) 1.8 kB 🔴 +1.8 kB 🔴 +876 B 🔴 +763 B
assets/audioService-BsMp9wWA.js (removed) 1.8 kB 🟢 -1.8 kB 🟢 -877 B 🟢 -761 B
assets/releaseStore-BAXh2a3T.js (new) 993 B 🔴 +993 B 🔴 +479 B 🔴 +425 B
assets/releaseStore-DsZZeAPs.js (removed) 993 B 🟢 -993 B 🟢 -480 B 🟢 -428 B
assets/workflowDraftStore-BDE80FTw.js (new) 969 B 🔴 +969 B 🔴 +473 B 🔴 +420 B
assets/workflowDraftStore-BQtBxGRv.js (removed) 969 B 🟢 -969 B 🟢 -472 B 🟢 -426 B
assets/dialogService-C5o_z8y0.js (new) 958 B 🔴 +958 B 🔴 +466 B 🔴 +418 B
assets/dialogService-DvPfHvKd.js (removed) 958 B 🟢 -958 B 🟢 -463 B 🟢 -418 B
assets/settingStore-CqpRAlrp.js (new) 956 B 🔴 +956 B 🔴 +469 B 🔴 +414 B
assets/settingStore-exgGLdcY.js (removed) 956 B 🟢 -956 B 🟢 -466 B 🟢 -416 B
assets/assetsStore-Ca1FcXVB.js (new) 955 B 🔴 +955 B 🔴 +469 B 🔴 +417 B
assets/assetsStore-D4-q-NLY.js (removed) 955 B 🟢 -955 B 🟢 -466 B 🟢 -418 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-DHoFo06m.js (new) 232 kB 🔴 +232 kB 🔴 +51.3 kB 🔴 +41.7 kB
assets/useConflictDetection-KeSFBdeb.js (removed) 232 kB 🟢 -232 kB 🟢 -51.3 kB 🟢 -41.7 kB
assets/useLoad3dViewer-CGkVTA1Z.js (new) 18.7 kB 🔴 +18.7 kB 🔴 +4.44 kB 🔴 +3.89 kB
assets/useLoad3dViewer-vKsApLeB.js (removed) 18.7 kB 🟢 -18.7 kB 🟢 -4.44 kB 🟢 -3.88 kB
assets/useLoad3d-B52uGcsM.js (removed) 15 kB 🟢 -15 kB 🟢 -3.79 kB 🟢 -3.36 kB
assets/useLoad3d-DZd1Cuz4.js (new) 15 kB 🔴 +15 kB 🔴 +3.79 kB 🔴 +3.38 kB
assets/useFeatureFlags-DnQwvPVY.js (removed) 5.78 kB 🟢 -5.78 kB 🟢 -1.75 kB 🟢 -1.49 kB
assets/useFeatureFlags-DWA4uAja.js (new) 5.78 kB 🔴 +5.78 kB 🔴 +1.75 kB 🔴 +1.48 kB
assets/useCopyToClipboard-CyaGNb5p.js (removed) 5.29 kB 🟢 -5.29 kB 🟢 -1.86 kB 🟢 -1.57 kB
assets/useCopyToClipboard-DODyGeSp.js (new) 5.29 kB 🔴 +5.29 kB 🔴 +1.86 kB 🔴 +1.57 kB
assets/useWorkspaceUI-BCoz2qqQ.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +979 B 🔴 +812 B
assets/useWorkspaceUI-BcWKj1MT.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -980 B 🟢 -808 B
assets/subscriptionCheckoutUtil-BTfrXpdF.js (removed) 2.97 kB 🟢 -2.97 kB 🟢 -1.31 kB 🟢 -1.14 kB
assets/subscriptionCheckoutUtil-C_hV7GMN.js (new) 2.97 kB 🔴 +2.97 kB 🔴 +1.31 kB 🔴 +1.14 kB
assets/assetPreviewUtil-BHdhIwhY.js (removed) 2.27 kB 🟢 -2.27 kB 🟢 -958 B 🟢 -837 B
assets/assetPreviewUtil-Bt41dZL2.js (new) 2.27 kB 🔴 +2.27 kB 🔴 +957 B 🔴 +838 B
assets/useUpstreamValue-3lvH3d21.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -804 B 🟢 -720 B
assets/useUpstreamValue-Crkouv69.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +802 B 🔴 +725 B
assets/useLoad3d-B1PwtLDY.js (removed) 1.13 kB 🟢 -1.13 kB 🟢 -539 B 🟢 -481 B
assets/useLoad3d-DM5jIw6o.js (new) 1.13 kB 🔴 +1.13 kB 🔴 +539 B 🔴 +483 B
assets/useLoad3dViewer-CCneIXLs.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +506 B 🔴 +456 B
assets/useLoad3dViewer-zVTCUbWK.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -506 B 🟢 -457 B
assets/useCurrentUser-JW9KrxFE.js (removed) 955 B 🟢 -955 B 🟢 -466 B 🟢 -416 B
assets/useCurrentUser-Ozn_xnDD.js (new) 955 B 🔴 +955 B 🔴 +469 B 🔴 +416 B
assets/useWorkspaceSwitch-98dTzwPr.js (removed) 747 B 🟢 -747 B 🟢 -387 B 🟢 -335 B
assets/useWorkspaceSwitch-DXLm0rf1.js (new) 747 B 🔴 +747 B 🔴 +384 B 🔴 +333 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-CqSqJns2.js (removed) 76.8 kB 🟢 -76.8 kB 🟢 -19.9 kB 🟢 -17 kB
assets/core-Fw1swrbS.js (new) 76.8 kB 🔴 +76.8 kB 🔴 +19.9 kB 🔴 +16.9 kB
assets/groupNode-BWfm2A4K.js (new) 74 kB 🔴 +74 kB 🔴 +18.5 kB 🔴 +16.3 kB
assets/groupNode-LFEMYxv2.js (removed) 74 kB 🟢 -74 kB 🟢 -18.5 kB 🟢 -16.3 kB
assets/WidgetSelect-05K12Zuh.js (new) 64.6 kB 🔴 +64.6 kB 🔴 +14.1 kB 🔴 +12.1 kB
assets/WidgetSelect-l4qxzubx.js (removed) 64.6 kB 🟢 -64.6 kB 🟢 -14.1 kB 🟢 -12.1 kB
assets/SubscriptionRequiredDialogContentWorkspace-Dc0-4wdL.js (new) 48.9 kB 🔴 +48.9 kB 🔴 +9.29 kB 🔴 +7.93 kB
assets/SubscriptionRequiredDialogContentWorkspace-Dkx_Q35I.js (removed) 48.9 kB 🟢 -48.9 kB 🟢 -9.29 kB 🟢 -7.94 kB
assets/WidgetPainter-BQNTN9W4.js (removed) 33.3 kB 🟢 -33.3 kB 🟢 -8.11 kB 🟢 -7.19 kB
assets/WidgetPainter-DmihoR-O.js (new) 33.3 kB 🔴 +33.3 kB 🔴 +8.11 kB 🔴 +7.2 kB
assets/Load3DControls-BgTHodar.js (new) 32.1 kB 🔴 +32.1 kB 🔴 +5.47 kB 🔴 +4.75 kB
assets/Load3DControls-EDfEdfDC.js (removed) 32.1 kB 🟢 -32.1 kB 🟢 -5.47 kB 🟢 -4.77 kB
assets/WorkspacePanelContent-D5Zj6ldd.js (new) 29.9 kB 🔴 +29.9 kB 🔴 +6.33 kB 🔴 +5.55 kB
assets/WorkspacePanelContent-DsbhfCmm.js (removed) 29.9 kB 🟢 -29.9 kB 🟢 -6.33 kB 🟢 -5.54 kB
assets/SubscriptionRequiredDialogContent-BLhJbA_c.js (removed) 28.2 kB 🟢 -28.2 kB 🟢 -7.16 kB 🟢 -6.3 kB
assets/SubscriptionRequiredDialogContent-C3cJe7GS.js (new) 28.2 kB 🔴 +28.2 kB 🔴 +7.16 kB 🔴 +6.31 kB
assets/Load3dViewerContent-BmVAr0Xi.js (new) 24.3 kB 🔴 +24.3 kB 🔴 +5.32 kB 🔴 +4.63 kB
assets/Load3dViewerContent-DLVP_FnI.js (removed) 24.3 kB 🟢 -24.3 kB 🟢 -5.32 kB 🟢 -4.64 kB
assets/WidgetImageCrop-BE5FyDSk.js (removed) 23.3 kB 🟢 -23.3 kB 🟢 -5.82 kB 🟢 -5.14 kB
assets/WidgetImageCrop-Z5sI0t-m.js (new) 23.3 kB 🔴 +23.3 kB 🔴 +5.82 kB 🔴 +5.13 kB
assets/SubscriptionPanelContentWorkspace-BWYlC333.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.18 kB 🟢 -4.56 kB
assets/SubscriptionPanelContentWorkspace-DUWL5vuZ.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.18 kB 🔴 +4.55 kB
assets/SignInContent-DaRNcoJ5.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -5.29 kB 🟢 -4.62 kB
assets/SignInContent-IapTEf-5.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +5.29 kB 🔴 +4.64 kB
assets/CurrentUserPopoverWorkspace-Cc54iSGu.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -4.83 kB 🟢 -4.32 kB
assets/CurrentUserPopoverWorkspace-CPRJ3UEl.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +4.83 kB 🔴 +4.33 kB
assets/WidgetInputNumber-onHkDPZZ.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.84 kB 🔴 +4.3 kB
assets/WidgetInputNumber-rH_IZQGN.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.84 kB 🟢 -4.29 kB
assets/WidgetRecordAudio-C2IbGL3D.js (removed) 18.1 kB 🟢 -18.1 kB 🟢 -5.18 kB 🟢 -4.64 kB
assets/WidgetRecordAudio-EtFIjF5E.js (new) 18.1 kB 🔴 +18.1 kB 🔴 +5.18 kB 🔴 +4.64 kB
assets/Load3D-DC87Ntr2.js (new) 16.9 kB 🔴 +16.9 kB 🔴 +4.12 kB 🔴 +3.58 kB
assets/Load3D-PGJbMwES.js (removed) 16.9 kB 🟢 -16.9 kB 🟢 -4.11 kB 🟢 -3.59 kB
assets/WidgetCurve-B6wY8GrT.js (new) 16.1 kB 🔴 +16.1 kB 🔴 +4.97 kB 🔴 +4.46 kB
assets/WidgetCurve-Ci-UUuDL.js (removed) 16.1 kB 🟢 -16.1 kB 🟢 -4.96 kB 🟢 -4.45 kB
assets/load3d-CysQlbjk.js (removed) 15 kB 🟢 -15 kB 🟢 -4.32 kB 🟢 -3.74 kB
assets/load3d-XjTd8eQZ.js (new) 15 kB 🔴 +15 kB 🔴 +4.32 kB 🔴 +3.74 kB
assets/WaveAudioPlayer-B2CDKSpz.js (removed) 13.4 kB 🟢 -13.4 kB 🟢 -3.68 kB 🟢 -3.22 kB
assets/WaveAudioPlayer-BXXXgRMH.js (new) 13.4 kB 🔴 +13.4 kB 🔴 +3.68 kB 🔴 +3.22 kB
assets/TeamWorkspacesDialogContent-B-iCJQIB.js (removed) 11.1 kB 🟢 -11.1 kB 🟢 -3.33 kB 🟢 -2.97 kB
assets/TeamWorkspacesDialogContent-DKradimC.js (new) 11.1 kB 🔴 +11.1 kB 🔴 +3.33 kB 🔴 +2.96 kB
assets/nodeTemplates-CXlBIInw.js (removed) 9.58 kB 🟢 -9.58 kB 🟢 -3.37 kB 🟢 -2.96 kB
assets/nodeTemplates-YmnlvjjJ.js (new) 9.58 kB 🔴 +9.58 kB 🔴 +3.37 kB 🔴 +2.96 kB
assets/InviteMemberDialogContent-9tcC5nBX.js (removed) 7.77 kB 🟢 -7.77 kB 🟢 -2.45 kB 🟢 -2.14 kB
assets/InviteMemberDialogContent-B0JftPUN.js (new) 7.77 kB 🔴 +7.77 kB 🔴 +2.45 kB 🔴 +2.15 kB
assets/Load3DConfiguration-Byt5hfyo.js (new) 6.6 kB 🔴 +6.6 kB 🔴 +2.04 kB 🔴 +1.78 kB
assets/Load3DConfiguration-CWx1f5_q.js (removed) 6.6 kB 🟢 -6.6 kB 🟢 -2.04 kB 🟢 -1.78 kB
assets/onboardingCloudRoutes-BX9aYRd3.js (new) 6.53 kB 🔴 +6.53 kB 🔴 +2.04 kB 🔴 +1.75 kB
assets/onboardingCloudRoutes-DT2XxDrw.js (removed) 6.53 kB 🟢 -6.53 kB 🟢 -2.04 kB 🟢 -1.75 kB
assets/WidgetWithControl-D_2QDCc6.js (removed) 5.99 kB 🟢 -5.99 kB 🟢 -2.38 kB 🟢 -2.13 kB
assets/WidgetWithControl-gZFrrZ4u.js (new) 5.99 kB 🔴 +5.99 kB 🔴 +2.38 kB 🔴 +2.12 kB
assets/CreateWorkspaceDialogContent-CIE430bH.js (removed) 5.95 kB 🟢 -5.95 kB 🟢 -2.15 kB 🟢 -1.88 kB
assets/CreateWorkspaceDialogContent-D6IUV234.js (new) 5.95 kB 🔴 +5.95 kB 🔴 +2.15 kB 🔴 +1.88 kB
assets/FreeTierDialogContent-4oILLIgU.js (removed) 5.82 kB 🟢 -5.82 kB 🟢 -2.04 kB 🟢 -1.8 kB
assets/FreeTierDialogContent-vDg3iKkw.js (new) 5.82 kB 🔴 +5.82 kB 🔴 +2.04 kB 🔴 +1.8 kB
assets/EditWorkspaceDialogContent-B3H1ee7x.js (removed) 5.75 kB 🟢 -5.75 kB 🟢 -2.11 kB 🟢 -1.84 kB
assets/EditWorkspaceDialogContent-DRPFofqX.js (new) 5.75 kB 🔴 +5.75 kB 🔴 +2.11 kB 🔴 +1.85 kB
assets/WidgetTextarea-BEwM73SH.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -2.17 kB 🟢 -1.93 kB
assets/WidgetTextarea-xGMgW7wq.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +2.17 kB 🔴 +1.91 kB
assets/Preview3d-BucLRwJh.js (new) 5.36 kB 🔴 +5.36 kB 🔴 +1.79 kB 🔴 +1.56 kB
assets/Preview3d-CWkG-rJr.js (removed) 5.36 kB 🟢 -5.36 kB 🟢 -1.79 kB 🟢 -1.56 kB
assets/ValueControlPopover-Ck0Tf0RB.js (removed) 5.33 kB 🟢 -5.33 kB 🟢 -1.93 kB 🟢 -1.72 kB
assets/ValueControlPopover-ENZpnj_f.js (new) 5.33 kB 🔴 +5.33 kB 🔴 +1.93 kB 🔴 +1.72 kB
assets/CancelSubscriptionDialogContent-DveZs4xz.js (new) 5.22 kB 🔴 +5.22 kB 🔴 +1.94 kB 🔴 +1.7 kB
assets/CancelSubscriptionDialogContent-x7OhZXhK.js (removed) 5.22 kB 🟢 -5.22 kB 🟢 -1.95 kB 🟢 -1.7 kB
assets/DeleteWorkspaceDialogContent-BJv4-MjQ.js (new) 4.65 kB 🔴 +4.65 kB 🔴 +1.79 kB 🔴 +1.55 kB
assets/DeleteWorkspaceDialogContent-BThsrH5d.js (removed) 4.65 kB 🟢 -4.65 kB 🟢 -1.79 kB 🟢 -1.55 kB
assets/LeaveWorkspaceDialogContent-9ytO5AZE.js (new) 4.48 kB 🔴 +4.48 kB 🔴 +1.73 kB 🔴 +1.5 kB
assets/LeaveWorkspaceDialogContent-DAUjJnsU.js (removed) 4.48 kB 🟢 -4.48 kB 🟢 -1.73 kB 🟢 -1.51 kB
assets/RemoveMemberDialogContent-6yxvSj2a.js (removed) 4.46 kB 🟢 -4.46 kB 🟢 -1.69 kB 🟢 -1.47 kB
assets/RemoveMemberDialogContent-CGA3C2qn.js (new) 4.46 kB 🔴 +4.46 kB 🔴 +1.69 kB 🔴 +1.47 kB
assets/tierBenefits-7tMYl6or.js (new) 4.45 kB 🔴 +4.45 kB 🔴 +1.57 kB 🔴 +1.36 kB
assets/tierBenefits-CqIxf8uW.js (removed) 4.45 kB 🟢 -4.45 kB 🟢 -1.58 kB 🟢 -1.36 kB
assets/RevokeInviteDialogContent-CAaRcV3-.js (removed) 4.37 kB 🟢 -4.37 kB 🟢 -1.7 kB 🟢 -1.49 kB
assets/RevokeInviteDialogContent-WuB6hkKV.js (new) 4.37 kB 🔴 +4.37 kB 🔴 +1.7 kB 🔴 +1.48 kB
assets/InviteMemberUpsellDialogContent-9sXtBNiw.js (new) 4.27 kB 🔴 +4.27 kB 🔴 +1.56 kB 🔴 +1.37 kB
assets/InviteMemberUpsellDialogContent-CncORBwm.js (removed) 4.27 kB 🟢 -4.27 kB 🟢 -1.56 kB 🟢 -1.37 kB
assets/cloudSessionCookie-a7jUcib_.js (new) 4.12 kB 🔴 +4.12 kB 🔴 +1.49 kB 🔴 +1.29 kB
assets/cloudSessionCookie-JL8rpwCU.js (removed) 4.12 kB 🟢 -4.12 kB 🟢 -1.49 kB 🟢 -1.29 kB
assets/saveMesh-Bi-dqjF3.js (new) 3.92 kB 🔴 +3.92 kB 🔴 +1.68 kB 🔴 +1.48 kB
assets/saveMesh-CTu7kaQb.js (removed) 3.92 kB 🟢 -3.92 kB 🟢 -1.68 kB 🟢 -1.48 kB
assets/Media3DTop-AEPQTACQ.js (removed) 3.85 kB 🟢 -3.85 kB 🟢 -1.62 kB 🟢 -1.44 kB
assets/Media3DTop-Dc1L-Wvi.js (new) 3.85 kB 🔴 +3.85 kB 🔴 +1.62 kB 🔴 +1.43 kB
assets/GlobalToast-CAjHlRxQ.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.26 kB 🔴 +1.07 kB
assets/GlobalToast-DCq6_4pa.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.26 kB 🟢 -1.07 kB
assets/SubscribeToRun-B-nb3UHQ.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -981 B 🟢 -867 B
assets/SubscribeToRun-CuLFZo3i.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +982 B 🔴 +870 B
assets/MediaAudioTop-D5BSkGp5.js (removed) 2.02 kB 🟢 -2.02 kB 🟢 -983 B 🟢 -872 B
assets/MediaAudioTop-LI1GuLUP.js (new) 2.02 kB 🔴 +2.02 kB 🔴 +981 B 🔴 +867 B
assets/CloudRunButtonWrapper-C3jzCT_o.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +910 B 🔴 +808 B
assets/CloudRunButtonWrapper-DjH4xfMn.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -910 B 🟢 -811 B
assets/graphHasMissingNodes-Dq9V5Zd7.js (new) 1.83 kB 🔴 +1.83 kB 🔴 +862 B 🔴 +753 B
assets/graphHasMissingNodes-GtI-exQy.js (removed) 1.83 kB 🟢 -1.83 kB 🟢 -859 B 🟢 -751 B
assets/cloudBadges-BVDncBVk.js (removed) 1.77 kB 🟢 -1.77 kB 🟢 -890 B 🟢 -772 B
assets/cloudBadges-C-yp2hM1.js (new) 1.77 kB 🔴 +1.77 kB 🔴 +890 B 🔴 +775 B
assets/cloudSubscription-DkB1NFKP.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +813 B 🔴 +702 B
assets/cloudSubscription-mm0d2h0o.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -812 B 🟢 -711 B
assets/previousFullPath-BzJwcMnJ.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -694 B 🟢 -603 B
assets/previousFullPath-j1T6LXko.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +694 B 🔴 +599 B
assets/Load3D-CXOrtHrA.js (new) 1.34 kB 🔴 +1.34 kB 🔴 +612 B 🔴 +544 B
assets/Load3D-q-yOHREH.js (removed) 1.34 kB 🟢 -1.34 kB 🟢 -617 B 🟢 -557 B
assets/nightlyBadges-CALTQ0Du.js (new) 1.29 kB 🔴 +1.29 kB 🔴 +655 B 🔴 +577 B
assets/nightlyBadges-DZK--Mj2.js (removed) 1.29 kB 🟢 -1.29 kB 🟢 -657 B 🟢 -582 B
assets/Load3dViewerContent-CdEd12hV.js (removed) 1.23 kB 🟢 -1.23 kB 🟢 -567 B 🟢 -503 B
assets/Load3dViewerContent-CXQUnp8x.js (new) 1.23 kB 🔴 +1.23 kB 🔴 +565 B 🔴 +501 B
assets/SubscriptionPanelContentWorkspace-BOBu4l_0.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +534 B 🔴 +470 B
assets/SubscriptionPanelContentWorkspace-C4hesFv2.js (removed) 1.15 kB 🟢 -1.15 kB 🟢 -534 B 🟢 -470 B
assets/WidgetLegacy-BFZMrq6_.js (removed) 978 B 🟢 -978 B 🟢 -480 B 🟢 -424 B
assets/WidgetLegacy-DTwRn_Cg.js (new) 978 B 🔴 +978 B 🔴 +481 B 🔴 +428 B
assets/changeTracker-DCg7zH2X.js (new) 952 B 🔴 +952 B 🔴 +469 B 🔴 +415 B
assets/changeTracker-YTvP8DSX.js (removed) 952 B 🟢 -952 B 🟢 -465 B 🟢 -416 B

Status: 55 added / 55 removed / 79 unchanged

⚡ Performance Report

⚠️ 4 regressions detected

Metric Baseline PR (median) Δ Sig
canvas-mouse-sweep: task duration 1069ms 983ms -8% ⚠️ z=2.0
canvas-zoom-sweep: layout duration 1ms 1ms +7% ⚠️ z=2.3
canvas-zoom-sweep: frame duration 17ms 17ms +0% ⚠️ z=2.2
subgraph-mouse-sweep: task duration 978ms 933ms -5% ⚠️ z=2.4
All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 10ms 8ms -16% z=-2.7
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 10 9 -10% z=-3.8
canvas-idle: task duration 462ms 374ms -19% z=-0.7
canvas-idle: script duration 32ms 24ms -26% z=-0.7
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: frame duration 17ms 17ms +0% z=0.8
canvas-idle: heap used 60.8 MB 61.1 MB +1%
canvas-idle: DOM nodes 20 18 -10% z=-3.6
canvas-idle: event listeners 6 6 +0% z=-1.2
canvas-mouse-sweep: layout duration 4ms 4ms +1% z=0.8
canvas-mouse-sweep: style recalc duration 48ms 44ms -9% z=0.5
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 83 82 -1% z=1.4
canvas-mouse-sweep: task duration 1069ms 983ms -8% ⚠️ z=2.0
canvas-mouse-sweep: script duration 145ms 127ms -12% z=-1.3
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: frame duration 17ms 17ms +0% z=0.7
canvas-mouse-sweep: heap used 56.3 MB 56.6 MB +1%
canvas-mouse-sweep: DOM nodes 67 66 -1% z=1.4
canvas-mouse-sweep: event listeners 6 6 +0% z=-0.6
canvas-zoom-sweep: layout duration 1ms 1ms +7% ⚠️ z=2.3
canvas-zoom-sweep: style recalc duration 20ms 18ms -12% z=-1.0
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 31 32 +3% z=1.6
canvas-zoom-sweep: task duration 378ms 313ms -17% z=-0.6
canvas-zoom-sweep: script duration 33ms 26ms -22% z=-0.4
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: frame duration 17ms 17ms +0% ⚠️ z=2.2
canvas-zoom-sweep: heap used 65.2 MB 64.0 MB -2%
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 10ms 9ms -13% z=-1.4
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 12 13 +8% z=-0.2
dom-widget-clipping: task duration 386ms 337ms -13% z=-1.7
dom-widget-clipping: script duration 72ms 60ms -16% z=-2.3
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: frame duration 17ms 17ms +0% z=0.9
dom-widget-clipping: heap used 48.0 MB 47.1 MB -2%
dom-widget-clipping: DOM nodes 20 22 +10% 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 11ms 9ms -22% z=-3.2
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 11 10 -9% z=-5.1
large-graph-idle: task duration 700ms 552ms -21% z=0.2
large-graph-idle: script duration 129ms 92ms -29% z=-1.0
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: frame duration 17ms 17ms -0% z=0.6
large-graph-idle: heap used 52.6 MB 53.2 MB +1%
large-graph-idle: DOM nodes -258 -258 +0% z=-312.8
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 17ms 17ms -3% z=-0.7
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 1228ms 1118ms -9% z=0.8
large-graph-pan: script duration 446ms 404ms -9% z=-0.2
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: frame duration 17ms 17ms +0% z=1.3
large-graph-pan: heap used 69.1 MB 65.8 MB -5%
large-graph-pan: DOM nodes -260 -259 -0% z=-168.5
large-graph-pan: event listeners -127 -125 -2% z=-156.9
large-graph-zoom: layout duration 8ms 8ms -3%
large-graph-zoom: style recalc duration 18ms 18ms -4%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 66 66 +0%
large-graph-zoom: task duration 1481ms 1314ms -11%
large-graph-zoom: script duration 567ms 462ms -18%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: frame duration 17ms 17ms -0%
large-graph-zoom: heap used 59.1 MB 58.7 MB -1%
large-graph-zoom: DOM nodes -264 -262 -1%
large-graph-zoom: event listeners -123 -123 +0%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 9ms 8ms -13% z=-2.3
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 8 9 +13% z=-0.8
minimap-idle: task duration 688ms 527ms -23% z=-0.0
minimap-idle: script duration 118ms 83ms -30% z=-1.5
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: frame duration 17ms 17ms -0% z=-2.0
minimap-idle: heap used 54.5 MB 54.7 MB +1%
minimap-idle: DOM nodes -262 -262 +0% z=-205.6
minimap-idle: event listeners -127 -125 -2% z=-196.2
subgraph-dom-widget-clipping: layout duration 0ms 0ms +0%
subgraph-dom-widget-clipping: style recalc duration 13ms 11ms -15% z=-1.7
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 47 49 +4% z=1.8
subgraph-dom-widget-clipping: task duration 393ms 349ms -11% z=-1.6
subgraph-dom-widget-clipping: script duration 134ms 116ms -14% z=-2.0
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: frame duration 17ms 17ms -0% z=1.2
subgraph-dom-widget-clipping: heap used 47.4 MB 46.9 MB -1%
subgraph-dom-widget-clipping: DOM nodes 20 23 +15% z=0.7
subgraph-dom-widget-clipping: event listeners 8 8 +0% z=-1.4
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 11ms 9ms -16% z=-1.3
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 11 11 +0% z=0.2
subgraph-idle: task duration 455ms 353ms -22% z=-0.5
subgraph-idle: script duration 29ms 21ms -29% z=0.1
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: frame duration 17ms 17ms +0% z=1.5
subgraph-idle: heap used 60.0 MB 60.6 MB +1%
subgraph-idle: DOM nodes 21 22 +5% z=0.1
subgraph-idle: event listeners 6 6 +0% variance too high
subgraph-mouse-sweep: layout duration 5ms 5ms +2% z=1.3
subgraph-mouse-sweep: style recalc duration 52ms 47ms -9% z=1.4
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 84 84 +0% z=2.0
subgraph-mouse-sweep: task duration 978ms 933ms -5% ⚠️ z=2.4
subgraph-mouse-sweep: script duration 112ms 98ms -13% 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.0 MB 52.1 MB +0%
subgraph-mouse-sweep: DOM nodes 73 72 -1% z=2.3
subgraph-mouse-sweep: event listeners 6 6 +0% variance too high
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 48ms 45ms -7%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 252 251 -0%
viewport-pan-sweep: task duration 4219ms 3691ms -13%
viewport-pan-sweep: script duration 1378ms 1202ms -13%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: frame duration 17ms 17ms +0%
viewport-pan-sweep: heap used 74.5 MB 72.7 MB -2%
viewport-pan-sweep: DOM nodes -257 -256 -0%
viewport-pan-sweep: event listeners -111 -107 -4%
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 12800ms 10523ms -18%
vue-large-graph-idle: script duration 656ms 547ms -17%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: frame duration 18ms 17ms -9%
vue-large-graph-idle: heap used 150.7 MB 155.3 MB +3%
vue-large-graph-idle: DOM nodes -8331 -8331 +0%
vue-large-graph-idle: event listeners -16462 -16468 +0%
vue-large-graph-pan: layout duration 0ms 0ms +0%
vue-large-graph-pan: style recalc duration 16ms 14ms -11%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 70 67 -4%
vue-large-graph-pan: task duration 15004ms 12688ms -15%
vue-large-graph-pan: script duration 955ms 827ms -13%
vue-large-graph-pan: TBT 0ms 0ms +0%
vue-large-graph-pan: frame duration 18ms 18ms +0%
vue-large-graph-pan: heap used 141.4 MB 141.8 MB +0%
vue-large-graph-pan: DOM nodes -8331 -8331 +0%
vue-large-graph-pan: event listeners -16486 -16488 +0%
workflow-execution: layout duration 2ms 1ms -10% z=-0.8
workflow-execution: style recalc duration 24ms 16ms -33% z=-3.7
workflow-execution: layout count 5 5 +0% z=0.1
workflow-execution: style recalc count 16 10 -38% z=-3.8
workflow-execution: task duration 127ms 89ms -30% z=-3.2
workflow-execution: script duration 27ms 24ms -11% z=-1.7
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: frame duration 17ms 17ms +0% z=-1.4
workflow-execution: heap used 46.8 MB 45.5 MB -3%
workflow-execution: DOM nodes 156 147 -6% z=-1.9
workflow-execution: event listeners 71 37 -48% z=-3.4
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-29T04:50:15.234Z",
  "gitSha": "79d3d07cfa36b5c71409decc492165dd74922d92",
  "branch": "feat/cloud-e2e-project",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2024.1749999999854,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.402,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 433.503,
      "heapDeltaBytes": 19961680,
      "heapUsedBytes": 62993008,
      "domNodes": 18,
      "jsHeapTotalBytes": 22544384,
      "scriptDurationMs": 24.082,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-idle",
      "durationMs": 2032.521000000031,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.661999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 353.56699999999995,
      "heapDeltaBytes": 20407524,
      "heapUsedBytes": 64077512,
      "domNodes": 22,
      "jsHeapTotalBytes": 22282240,
      "scriptDurationMs": 23.712999999999997,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-idle",
      "durationMs": 1986.460999999963,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.530000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 374.153,
      "heapDeltaBytes": 20001172,
      "heapUsedBytes": 64407704,
      "domNodes": 16,
      "jsHeapTotalBytes": 22544384,
      "scriptDurationMs": 18.856,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1993.5279999999977,
      "styleRecalcs": 81,
      "styleRecalcDurationMs": 44.096000000000004,
      "layouts": 12,
      "layoutDurationMs": 3.77,
      "taskDurationMs": 984.694,
      "heapDeltaBytes": 18469200,
      "heapUsedBytes": 67169220,
      "domNodes": 66,
      "jsHeapTotalBytes": 24903680,
      "scriptDurationMs": 128.502,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1990.364999999997,
      "styleRecalcs": 84,
      "styleRecalcDurationMs": 43.068000000000005,
      "layouts": 12,
      "layoutDurationMs": 3.7340000000000004,
      "taskDurationMs": 974.553,
      "heapDeltaBytes": 16321316,
      "heapUsedBytes": 59064620,
      "domNodes": 68,
      "jsHeapTotalBytes": 23068672,
      "scriptDurationMs": 126.98500000000001,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1984.7709999999097,
      "styleRecalcs": 82,
      "styleRecalcDurationMs": 44.269999999999996,
      "layouts": 12,
      "layoutDurationMs": 4.058,
      "taskDurationMs": 982.6160000000001,
      "heapDeltaBytes": 16667136,
      "heapUsedBytes": 59375648,
      "domNodes": 64,
      "jsHeapTotalBytes": 23068672,
      "scriptDurationMs": 125.498,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1724.240999999978,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 17.586,
      "layouts": 6,
      "layoutDurationMs": 0.7460000000000001,
      "taskDurationMs": 312.884,
      "heapDeltaBytes": 24673572,
      "heapUsedBytes": 67095624,
      "domNodes": 79,
      "jsHeapTotalBytes": 20185088,
      "scriptDurationMs": 25.637,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1738.6579999999867,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 17.7,
      "layouts": 6,
      "layoutDurationMs": 0.743,
      "taskDurationMs": 319.501,
      "heapDeltaBytes": 15111092,
      "heapUsedBytes": 65984612,
      "domNodes": 80,
      "jsHeapTotalBytes": 21757952,
      "scriptDurationMs": 29.48,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1732.0209999999179,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 16.184,
      "layouts": 6,
      "layoutDurationMs": 0.869,
      "taskDurationMs": 292.343,
      "heapDeltaBytes": 24678432,
      "heapUsedBytes": 67433600,
      "domNodes": 78,
      "jsHeapTotalBytes": 20971520,
      "scriptDurationMs": 25.875999999999998,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 581.2579999999912,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 12.381000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 365.86199999999997,
      "heapDeltaBytes": 7621548,
      "heapUsedBytes": 50396396,
      "domNodes": 22,
      "jsHeapTotalBytes": 12582912,
      "scriptDurationMs": 64.325,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 592.5510000000145,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 7.3919999999999995,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 333.901,
      "heapDeltaBytes": 6587172,
      "heapUsedBytes": 49335652,
      "domNodes": 19,
      "jsHeapTotalBytes": 13107200,
      "scriptDurationMs": 60.217,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 561.7359999999962,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 8.761999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 337.108,
      "heapDeltaBytes": 6549152,
      "heapUsedBytes": 49241812,
      "domNodes": 22,
      "jsHeapTotalBytes": 13369344,
      "scriptDurationMs": 58.95499999999999,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2064.0949999999802,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.36,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 552.451,
      "heapDeltaBytes": 4776260,
      "heapUsedBytes": 55815844,
      "domNodes": -259,
      "jsHeapTotalBytes": 16297984,
      "scriptDurationMs": 91.76899999999999,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2044.2940000000362,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.655000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 524.241,
      "heapDeltaBytes": 4850624,
      "heapUsedBytes": 55809956,
      "domNodes": -255,
      "jsHeapTotalBytes": 16453632,
      "scriptDurationMs": 84.708,
      "eventListeners": -121,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2056.2079999999696,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.899000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 568.698,
      "heapDeltaBytes": 4633072,
      "heapUsedBytes": 55166956,
      "domNodes": -258,
      "jsHeapTotalBytes": 16453632,
      "scriptDurationMs": 97.171,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2195.3519999999853,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 16.711999999999996,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1165.1560000000002,
      "heapDeltaBytes": 22145368,
      "heapUsedBytes": 75760004,
      "domNodes": -259,
      "jsHeapTotalBytes": 18493440,
      "scriptDurationMs": 434.77900000000005,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2139.589000000001,
      "styleRecalcs": 71,
      "styleRecalcDurationMs": 18.919999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1102.0159999999998,
      "heapDeltaBytes": -12374516,
      "heapUsedBytes": 47786644,
      "domNodes": -256,
      "jsHeapTotalBytes": 17616896,
      "scriptDurationMs": 379.822,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000073
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2148.131000000035,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 15.741000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1117.6339999999998,
      "heapDeltaBytes": 15887536,
      "heapUsedBytes": 68944396,
      "domNodes": -259,
      "jsHeapTotalBytes": 18755584,
      "scriptDurationMs": 404.014,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000073
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3177.6030000000046,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 19.601,
      "layouts": 60,
      "layoutDurationMs": 8.068000000000001,
      "taskDurationMs": 1349.8860000000002,
      "heapDeltaBytes": 7039924,
      "heapUsedBytes": 61582700,
      "domNodes": -262,
      "jsHeapTotalBytes": 17764352,
      "scriptDurationMs": 477.98199999999997,
      "eventListeners": -123,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3111.924999999985,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 16.819,
      "layouts": 60,
      "layoutDurationMs": 7.495,
      "taskDurationMs": 1253.8870000000002,
      "heapDeltaBytes": 7970776,
      "heapUsedBytes": 63433776,
      "domNodes": -261,
      "jsHeapTotalBytes": 17297408,
      "scriptDurationMs": 444.98199999999997,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3162.83999999996,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 17.556,
      "layouts": 60,
      "layoutDurationMs": 7.639999999999999,
      "taskDurationMs": 1313.57,
      "heapDeltaBytes": 7007888,
      "heapUsedBytes": 61533968,
      "domNodes": -264,
      "jsHeapTotalBytes": 17502208,
      "scriptDurationMs": 462.1719999999999,
      "eventListeners": -123,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "minimap-idle",
      "durationMs": 2025.7090000000062,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.253,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 570.903,
      "heapDeltaBytes": 16118020,
      "heapUsedBytes": 69390224,
      "domNodes": -258,
      "jsHeapTotalBytes": 14151680,
      "scriptDurationMs": 96.439,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "minimap-idle",
      "durationMs": 2015.6949999999938,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.0120000000000005,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 519.0680000000001,
      "heapDeltaBytes": 3106096,
      "heapUsedBytes": 57382352,
      "domNodes": -262,
      "jsHeapTotalBytes": 15405056,
      "scriptDurationMs": 80.089,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "minimap-idle",
      "durationMs": 2046.858000000043,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.648999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 526.8770000000001,
      "heapDeltaBytes": 3264272,
      "heapUsedBytes": 56754200,
      "domNodes": -262,
      "jsHeapTotalBytes": 15929344,
      "scriptDurationMs": 82.96100000000001,
      "eventListeners": -125,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 552.2109999999998,
      "styleRecalcs": 49,
      "styleRecalcDurationMs": 10.924,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 348.92400000000004,
      "heapDeltaBytes": 6136912,
      "heapUsedBytes": 49169828,
      "domNodes": 23,
      "jsHeapTotalBytes": 13631488,
      "scriptDurationMs": 116.85,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 534.6519999999941,
      "styleRecalcs": 49,
      "styleRecalcDurationMs": 13.064999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 355.14200000000005,
      "heapDeltaBytes": 6821276,
      "heapUsedBytes": 49502024,
      "domNodes": 25,
      "jsHeapTotalBytes": 13369344,
      "scriptDurationMs": 115.88400000000001,
      "eventListeners": 12,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 521.3990000000877,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 11.122,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 333.315,
      "heapDeltaBytes": 6133160,
      "heapUsedBytes": 49162728,
      "domNodes": 22,
      "jsHeapTotalBytes": 13631488,
      "scriptDurationMs": 112.80199999999999,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2024.6080000000006,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.409999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 353.15799999999996,
      "heapDeltaBytes": 19836808,
      "heapUsedBytes": 64218628,
      "domNodes": 20,
      "jsHeapTotalBytes": 22806528,
      "scriptDurationMs": 20.576,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2011.8640000000028,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.93,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 342.879,
      "heapDeltaBytes": 19937432,
      "heapUsedBytes": 63012096,
      "domNodes": 22,
      "jsHeapTotalBytes": 22544384,
      "scriptDurationMs": 17.355000000000004,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2020.7110000000057,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 12.512,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 368.914,
      "heapDeltaBytes": 20122312,
      "heapUsedBytes": 63509508,
      "domNodes": 23,
      "jsHeapTotalBytes": 22544384,
      "scriptDurationMs": 21.447,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 2017.4769999999853,
      "styleRecalcs": 89,
      "styleRecalcDurationMs": 47.114000000000004,
      "layouts": 16,
      "layoutDurationMs": 5.105,
      "taskDurationMs": 932.549,
      "heapDeltaBytes": 12246816,
      "heapUsedBytes": 55324760,
      "domNodes": 72,
      "jsHeapTotalBytes": 23330816,
      "scriptDurationMs": 97.701,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1710.6310000000349,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 41.159,
      "layouts": 16,
      "layoutDurationMs": 7.109999999999999,
      "taskDurationMs": 690.64,
      "heapDeltaBytes": 11941840,
      "heapUsedBytes": 54675244,
      "domNodes": 65,
      "jsHeapTotalBytes": 23592960,
      "scriptDurationMs": 91.09900000000002,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 2038.9719999999443,
      "styleRecalcs": 84,
      "styleRecalcDurationMs": 47.861000000000004,
      "layouts": 16,
      "layoutDurationMs": 4.409000000000001,
      "taskDurationMs": 946.1010000000001,
      "heapDeltaBytes": 2700300,
      "heapUsedBytes": 54365488,
      "domNodes": 74,
      "jsHeapTotalBytes": 25427968,
      "scriptDurationMs": 99.388,
      "eventListeners": 10,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999947
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8225.090999999991,
      "styleRecalcs": 252,
      "styleRecalcDurationMs": 46.235,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3655.988,
      "heapDeltaBytes": 27989968,
      "heapUsedBytes": 78916488,
      "domNodes": -253,
      "jsHeapTotalBytes": 19542016,
      "scriptDurationMs": 1204.213,
      "eventListeners": -105,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8170.540999999957,
      "styleRecalcs": 251,
      "styleRecalcDurationMs": 45.06399999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3711.785,
      "heapDeltaBytes": 24478372,
      "heapUsedBytes": 75082096,
      "domNodes": -257,
      "jsHeapTotalBytes": 19542016,
      "scriptDurationMs": 1201.327,
      "eventListeners": -111,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000073
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8183.445000000006,
      "styleRecalcs": 251,
      "styleRecalcDurationMs": 45.075,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3691.466000000001,
      "heapDeltaBytes": 25217980,
      "heapUsedBytes": 76239544,
      "domNodes": -256,
      "jsHeapTotalBytes": 19804160,
      "scriptDurationMs": 1201.854,
      "eventListeners": -107,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 10533.663999999988,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 10522.532,
      "heapDeltaBytes": -31543380,
      "heapUsedBytes": 163373876,
      "domNodes": -8331,
      "jsHeapTotalBytes": 23683072,
      "scriptDurationMs": 548.388,
      "eventListeners": -16468,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000073
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 10512.842000000035,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 10497.828,
      "heapDeltaBytes": -37496564,
      "heapUsedBytes": 157190368,
      "domNodes": -8331,
      "jsHeapTotalBytes": 16343040,
      "scriptDurationMs": 547.4159999999999,
      "eventListeners": -16466,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000073
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 10665.596999999934,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 10649.431,
      "heapDeltaBytes": -33645944,
      "heapUsedBytes": 162851056,
      "domNodes": -8331,
      "jsHeapTotalBytes": 24731648,
      "scriptDurationMs": 531.4810000000001,
      "eventListeners": -16468,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999971
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 12718.185000000005,
      "styleRecalcs": 67,
      "styleRecalcDurationMs": 14.201000000000018,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12695.11,
      "heapDeltaBytes": -45048164,
      "heapUsedBytes": 148547292,
      "domNodes": -8331,
      "jsHeapTotalBytes": -3842048,
      "scriptDurationMs": 819.6159999999999,
      "eventListeners": -16488,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999971
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 12706.457999999999,
      "styleRecalcs": 67,
      "styleRecalcDurationMs": 14.585999999999988,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12687.669000000002,
      "heapDeltaBytes": -45858000,
      "heapUsedBytes": 148710732,
      "domNodes": -8333,
      "jsHeapTotalBytes": -1482752,
      "scriptDurationMs": 844.3759999999999,
      "eventListeners": -16488,
      "totalBlockingTimeMs": 34,
      "frameDurationMs": 18.329999999999927
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 12515.919000000053,
      "styleRecalcs": 64,
      "styleRecalcDurationMs": 14.068999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12495.244,
      "heapDeltaBytes": -21719076,
      "heapUsedBytes": 173807040,
      "domNodes": -8331,
      "jsHeapTotalBytes": 25432064,
      "scriptDurationMs": 827.452,
      "eventListeners": -16460,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.33000000000029
    },
    {
      "name": "workflow-execution",
      "durationMs": 108.78599999995231,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 16.031999999999996,
      "layouts": 5,
      "layoutDurationMs": 1.474,
      "taskDurationMs": 88.57799999999999,
      "heapDeltaBytes": 2904104,
      "heapUsedBytes": 46736264,
      "domNodes": 147,
      "jsHeapTotalBytes": 524288,
      "scriptDurationMs": 23.892000000000003,
      "eventListeners": 37,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000027
    },
    {
      "name": "workflow-execution",
      "durationMs": 465.5450000000201,
      "styleRecalcs": 17,
      "styleRecalcDurationMs": 23.605,
      "layouts": 5,
      "layoutDurationMs": 1.426,
      "taskDurationMs": 127.36799999999998,
      "heapDeltaBytes": 4503516,
      "heapUsedBytes": 48825492,
      "domNodes": 158,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 29.248,
      "eventListeners": 71,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.65999999999999
    },
    {
      "name": "workflow-execution",
      "durationMs": 101.81899999997768,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 12.735999999999997,
      "layouts": 4,
      "layoutDurationMs": 1.2020000000000002,
      "taskDurationMs": 81.992,
      "heapDeltaBytes": 2566840,
      "heapUsedBytes": 47722564,
      "domNodes": 142,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 19.875999999999998,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.660000000000036
    }
  ]
}

@comfy-pr-bot comfy-pr-bot requested a review from a team March 26, 2026 01:37
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/cloud.spec.ts (1)

9-11: Replace raw data-testid strings with centralized selectors.

Lines 9-11 and Line 21 hardcode test IDs. Please import and use shared TestIds constants to prevent selector drift.

As per coding guidelines: "Use centralized TestIds from fixtures/selectors.ts for DOM element selection in E2E tests".

Also applies to: 21-21

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

In `@browser_tests/tests/cloud.spec.ts` around lines 9 - 11, The test hardcodes
data-testid strings when selecting elements (e.g., the subscribeButton created
via comfyPage.page.getByTestId('topbar-subscribe-button') and the other selector
at line 21); import the shared TestIds constant from fixtures/selectors.ts and
replace those raw strings with the appropriate TestIds properties (e.g.,
TestIds.TopbarSubscribe or the matching key) when calling getByTestId so all
selectors use the centralized TestIds object instead of literal test-id strings.
🤖 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/cloud.spec.ts`:
- Around line 9-11: The test hardcodes data-testid strings when selecting
elements (e.g., the subscribeButton created via
comfyPage.page.getByTestId('topbar-subscribe-button') and the other selector at
line 21); import the shared TestIds constant from fixtures/selectors.ts and
replace those raw strings with the appropriate TestIds properties (e.g.,
TestIds.TopbarSubscribe or the matching key) when calling getByTestId so all
selectors use the centralized TestIds object instead of literal test-id strings.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 877f1ad4-2f7a-48bd-8f64-1d220a22863c

📥 Commits

Reviewing files that changed from the base of the PR and between 6c7c3ea and a0b4c8e.

📒 Files selected for processing (3)
  • browser_tests/tests/cloud.spec.ts
  • package.json
  • playwright.config.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.

Actionable comments posted: 1

🧹 Nitpick comments (2)
browser_tests/tests/cloud.spec.ts (2)

9-10: Use centralized TestIds instead of inline string literals

Please replace raw test-id strings with constants from browser_tests/fixtures/selectors.ts for consistency and safer refactors.

As per coding guidelines: "Use centralized TestIds from fixtures/selectors.ts for DOM element selection in E2E tests".

Also applies to: 23-23

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

In `@browser_tests/tests/cloud.spec.ts` around lines 9 - 10, Replace inline
test-id string literals used in comfyPage.page.getByTestId (e.g., the
'topbar-subscribe-button' occurrence assigned to subscribeButton and the similar
usage at the other location) with the centralized constants exported from
browser_tests/fixtures/selectors.ts; import the appropriate constant (for
example TOPBAR_SUBSCRIBE_BUTTON or the name used in selectors.ts) at the top of
the test file and pass that constant to comfyPage.page.getByTestId instead of
the raw string for both occurrences.

27-30: Prefer explicit non-rendered assertion for cloud-only removal

Line 30 uses toBeHidden(), which also passes for elements that exist but are merely hidden. Since this behavior is distribution-gated, toHaveCount(0) is a stricter check.

Suggested fix
-    await expect(bottomPanelToggle).toBeHidden()
+    await expect(bottomPanelToggle).toHaveCount(0)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@browser_tests/tests/cloud.spec.ts` around lines 27 - 30, The test currently
asserts existence+hidden via the locator bottomPanelToggle and
expect(...).toBeHidden(), which can pass for an element that exists but is
hidden; instead assert non-rendered by checking the locator has count 0. Replace
the toBeHidden() assertion on bottomPanelToggle (from
sideToolbar.getByRole('button', { name: /bottom panel|terminal/i })) with an
assertion that that locator has count 0 (await
expect(bottomPanelToggle).toHaveCount(0) or re-query via
sideToolbar.getByRole(...).toHaveCount(0)) so the test fails if the button
exists but is hidden.
🤖 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/cloud.spec.ts`:
- Around line 15-17: Replace the flaky assertion that uses
subscribeButton.or(comfyPage.page.locator('body')) with a direct DOM existence
check and centralize the selector: change the test to assert await
expect(subscribeButton).toBeAttached() (or await
expect(subscribeButton).toBeVisible() if you mock billing state) so the body
fallback cannot mask failures, and add the 'topbar-subscribe-button' selector to
the TestIds export in fixtures/selectors.ts (mirroring how side-toolbar is
centralized) so the test imports TestIds.topbarSubscribeButton instead of
hardcoding the locator.

---

Nitpick comments:
In `@browser_tests/tests/cloud.spec.ts`:
- Around line 9-10: Replace inline test-id string literals used in
comfyPage.page.getByTestId (e.g., the 'topbar-subscribe-button' occurrence
assigned to subscribeButton and the similar usage at the other location) with
the centralized constants exported from browser_tests/fixtures/selectors.ts;
import the appropriate constant (for example TOPBAR_SUBSCRIBE_BUTTON or the name
used in selectors.ts) at the top of the test file and pass that constant to
comfyPage.page.getByTestId instead of the raw string for both occurrences.
- Around line 27-30: The test currently asserts existence+hidden via the locator
bottomPanelToggle and expect(...).toBeHidden(), which can pass for an element
that exists but is hidden; instead assert non-rendered by checking the locator
has count 0. Replace the toBeHidden() assertion on bottomPanelToggle (from
sideToolbar.getByRole('button', { name: /bottom panel|terminal/i })) with an
assertion that that locator has count 0 (await
expect(bottomPanelToggle).toHaveCount(0) or re-query via
sideToolbar.getByRole(...).toHaveCount(0)) so the test fails if the button
exists but is hidden.
🪄 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: d6ccd66b-def2-4e3f-9232-838c463c002a

📥 Commits

Reviewing files that changed from the base of the PR and between a0b4c8e and d9c53b2.

📒 Files selected for processing (1)
  • browser_tests/tests/cloud.spec.ts

@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:M This PR changes 30-99 lines, ignoring generated files. labels Mar 26, 2026
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: 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 `@browser_tests/tests/cloud.spec.ts`:
- Around line 7-14: The test name currently claims "subscribe button is visible
for free-tier users `@cloud`" but the assertion uses
comfyPage.page.getByTestId(TestIds.topbar.subscribeButton) and await
expect(subscribeButton).toBeAttached(), which only checks attachment, not
visibility; either update the assertion to await
expect(subscribeButton).toBeVisible() to match the test title or rename the test
string in the test("...") to say "is attached" (or similar). Locate the test by
the test name and symbols comfyPage, subscribeButton, and
TestIds.topbar.subscribeButton and make the single change so the name and
assertion align.
🪄 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: fd9681e6-7ce4-4658-bbea-73988bbaee93

📥 Commits

Reviewing files that changed from the base of the PR and between d9c53b2 and 3e35b8f.

📒 Files selected for processing (2)
  • browser_tests/fixtures/selectors.ts
  • browser_tests/tests/cloud.spec.ts

@Myestery
Copy link
Copy Markdown
Contributor

testing locally....

@Myestery
Copy link
Copy Markdown
Contributor

testing locally....

wasn't able to get past authentication locally. Can we fix the merge conflicts pls

@christian-byrne christian-byrne requested a review from DrJKL March 26, 2026 22:17
coderabbitai[bot]
coderabbitai bot previously approved these changes Mar 27, 2026
@christian-byrne christian-byrne force-pushed the feat/cloud-e2e-project branch from cca34c4 to 07d32a9 Compare March 27, 2026 05:08
@dosubot dosubot bot added size:M This PR changes 30-99 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Mar 27, 2026
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: 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 `@browser_tests/tests/cloud.spec.ts`:
- Around line 7-14: The test "subscribe button is attached in cloud mode `@cloud`"
depends on a free-tier authenticated user, so either document that precondition
near the test, ensure the cloud test fixture authenticates a free-tier user
(update the comfyPage setup/auth helper used by this test to sign in a free-tier
account), or guard the test with a runtime skip if the current user isn't
free-tier (use the same pattern as missingMedia.spec.ts); locate the test by the
name and the use of TestIds.topbar.subscribeButton / comfyPage.page.getByTestId
and apply one of these fixes so the test no longer fails when run against
non-free-tier cloud environments.
🪄 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: 313c173f-9aca-432e-a237-32e5b92aae41

📥 Commits

Reviewing files that changed from the base of the PR and between cca34c4 and 07d32a9.

📒 Files selected for processing (4)
  • browser_tests/fixtures/selectors.ts
  • browser_tests/tests/cloud.spec.ts
  • package.json
  • playwright.config.ts
✅ Files skipped from review due to trivial changes (1)
  • package.json
🚧 Files skipped from review as they are similar to previous changes (2)
  • browser_tests/fixtures/selectors.ts
  • playwright.config.ts

DrJKL
DrJKL previously approved these changes Mar 27, 2026
Copy link
Copy Markdown
Contributor Author

@christian-byrne christian-byrne left a comment

Choose a reason for hiding this comment

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

We need to add a new workflow variant of https://github.com/Comfy-Org/ComfyUI_frontend/blob/main/.github/workflows/ci-tests-e2e.yaml that just uses env variable DISTRIBUTION=cloud during the setup frontend step. Otherwise the vite define variable is not interpolated at build time.

If possible, use matrix in playwright config or matrix in the existing ci-tests-e2e.yaml instead of duplicating a ton of code.

coderabbitai[bot]
coderabbitai bot previously approved these changes Mar 28, 2026
Copy link
Copy Markdown
Contributor Author

@christian-byrne christian-byrne left a comment

Choose a reason for hiding this comment

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

Did you not see previous comments or reviews? we still need a build step that does DISTRIBUTION=cloud pnpm build

christian-byrne and others added 7 commits March 28, 2026 16:06
- Add 'cloud' Playwright project for testing DISTRIBUTION=cloud builds
- Add build:cloud npm script (DISTRIBUTION=cloud vite build)
- Cloud project uses grep: /@cloud/ to run cloud-only tests
- Default chromium project uses grepInvert to exclude @cloud tests
- Add 2 example cloud-only tests (subscribe button, bottom panel toggle)
- Runtime toggle investigation: NOT feasible (breaks tree-shaking)
  → separate build approach chosen

Convention:
  test('feature works @cloud', ...) — cloud-only
  test('feature works @oss', ...) — OSS-only
  test('feature works', ...) — runs in both

Part of: Test Coverage Q2 Overhaul (UTIL-07)
@christian-byrne christian-byrne force-pushed the feat/cloud-e2e-project branch from d20fb2b to 703283e Compare March 28, 2026 23:09
coderabbitai[bot]
coderabbitai bot previously approved these changes Mar 28, 2026
@christian-byrne
Copy link
Copy Markdown
Contributor Author

Branch has been rebased onto main — no conflicts. Force-pushed with the rebased history.

@christian-byrne
Copy link
Copy Markdown
Contributor Author

Addressed in the latest force-push:

  • Build step: The setup job in ci-tests-e2e.yaml now builds both OSS (pnpm build) and cloud (DISTRIBUTION=cloud pnpm build) distributions, uploading them as separate artifacts (frontend-dist and frontend-dist-cloud). The playwright-tests job conditionally downloads frontend-dist-cloud when matrix.browser == 'cloud', otherwise frontend-dist. This ensures cloud tests run against the cloud build where __DISTRIBUTION__ is properly set.

  • Merge conflicts: Branch rebased onto main with no conflicts.

Nx cached the first OSS build and returned it for the cloud build
since env vars aren't part of the cache key. This caused cloud
tests to run against the OSS build where __DISTRIBUTION__ is
'localhost' instead of 'cloud', making cloud-only UI elements
(subscribe button, hidden bottom panel) not render correctly.
@socket-security
Copy link
Copy Markdown

socket-security bot commented Mar 28, 2026

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addedvite@​8.0.0941008299100

View full report

@socket-security
Copy link
Copy Markdown

socket-security bot commented Mar 28, 2026

Warning

Review the following alerts detected in dependencies.

According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.

Action Severity Alert  (click "▶" to expand/collapse)
Warn High
Obfuscated code: npm vite is 91.0% likely obfuscated

Confidence: 0.91

Location: Package overview

From: apps/desktop-ui/package.jsonnpm/vite@8.0.0

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/vite@8.0.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

View full report

christian-byrne and others added 3 commits March 28, 2026 16:49
Cloud build has an auth guard that redirects to /cloud/login when
no Firebase auth is configured (CI has no auth). Previous tests
used comfyPageFixture which waits for the graph editor to load,
causing timeouts since the auth guard redirects before that.

New tests verify:
1. Cloud build redirects to /cloud/login (route only exists in
   cloud distribution, tree-shaken in OSS)
2. Cloud login page renders sign-in options

Uses raw Playwright test fixture instead of comfyPageFixture since
we don't need the full graph editor setup.
@christian-byrne christian-byrne merged commit ba9f348 into main Mar 29, 2026
37 checks passed
@christian-byrne christian-byrne deleted the feat/cloud-e2e-project branch March 29, 2026 05:34
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.

4 participants