Skip to content

fix: restart timed-out billing operations - #14396

Merged
dante01yoon merged 2 commits into
mainfrom
agent/fix-billing-timeout-retry
Jul 30, 2026
Merged

fix: restart timed-out billing operations#14396
dante01yoon merged 2 commits into
mainfrom
agent/fix-billing-timeout-retry

Conversation

@dante01yoon

@dante01yoon dante01yoon commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Why this is needed

A 3DS/SCA subscription can spend up to five minutes waiting for the billing operation to expose its verification action. If that discovery window timed out, retrying Subscribe opened checkout again but left the confirmation dialog idle: the pending/loading state did not return, polling did not restart, and Complete verification could not appear until the page was refreshed.

This matches the QA report in Slack.

Root cause

billingOperationStore.startOperation() deduplicated every previously-seen operation ID. After the five-minute poll timeout, the timed-out operation stayed cached. The backend intentionally replayed the same billing operation ID on checkout retry, so the store returned that cached terminal operation instead of creating a new pending operation and polling it again.

Regression assessment

This is a regression in the new 3DS/SCA retry flow added by #14242. The operation-ID deduplication predates that change and remains correct for in-flight and completed operations, but the newly introduced five-minute action-discovery timeout made a terminal timeout operation retryable. That state was not covered by the original browser scenarios.

How this changes

  • Treat only cached timeout operations as restartable.
  • Clear the timed-out operation's stale promise/timer bookkeeping before recreating it as pending.
  • Preserve existing deduplication for pending, succeeded, and failed operations.
  • Restart polling immediately when the backend replays the same operation ID, restoring checkout loading state and allowing Complete verification to appear without a refresh.

Tests

  • Unit regression: timeout → retry same operation ID → pending/loading restored → polling succeeds.
  • E2E regression: real checkout dialog → five-minute timeout via Playwright Clock → retry same operation ID → pending UI disabled state returns → polling restarts → Complete verification appears.
  • The E2E test fails on the pre-fix implementation because the dialog remains idle, no second operation poll occurs, and the verification action stays hidden.

AS IS

After timeout and retry, checkout remains idle with Subscribe to Creator still available. The timeout toast remains, no loading state starts, and there is no Complete verification action.

AS IS — retry does not restart pending checkout

TO BE

Retrying the same backend operation ID recreates the pending operation. The CTA returns to loading, polling resumes, and the verification action appears as soon as the operation exposes its action URL.

TO BE — retry restores pending checkout and verification

Retry flow

Timeout to retry to Complete verification

Review focus

The retry boundary in startOperation(): only timed-out operations are restarted; pending and other terminal operation deduplication is unchanged.

@dante01yoon
dante01yoon requested a review from a team July 30, 2026 16:34
@dosubot dosubot Bot added the size:XS This PR changes 0-9 lines, ignoring generated files. label Jul 30, 2026
@dosubot

dosubot Bot commented Jul 30, 2026

Copy link
Copy Markdown

📄 Knowledge review

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


Leave Feedback Ask Dosu about ComfyUI_frontend Add Dosu to your team

@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 07/30/2026, 05:14:35 PM UTC

Links

🎭 Playwright: ✅ 1769 passed, 0 failed · 1 flaky

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

📦 Bundle: 8.18 MB gzip 🔴 +57 B

Details

Summary

  • Raw size: 34.4 MB baseline 34.4 MB — 🔴 +71 B
  • Gzip: 8.18 MB baseline 8.18 MB — 🔴 +57 B
  • Brotli: 5.67 MB baseline 5.67 MB — 🔴 +79 B
  • Bundles: 424 current • 424 baseline • 143 added / 143 removed

Category Glance
Data & Services 🔴 +71 B (3.43 MB) · Vendor & Third-Party ⚪ 0 B (15.7 MB) · Other ⚪ 0 B (12.6 MB) · Graph Workspace ⚪ 0 B (1.29 MB) · Panels & Settings ⚪ 0 B (551 kB) · Utilities & Hooks ⚪ 0 B (386 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-ceE0ZeIZ.js (removed) 3.66 kB 🟢 -3.66 kB 🟢 -1.84 kB 🟢 -1.61 kB
assets/index-CfYAgxbj.js (new) 3.66 kB 🔴 +3.66 kB 🔴 +1.84 kB 🔴 +1.6 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-B02NnOgt.js (new) 1.29 MB 🔴 +1.29 MB 🔴 +276 kB 🔴 +208 kB
assets/GraphView-Beku58IO.js (removed) 1.29 MB 🟢 -1.29 MB 🟢 -276 kB 🟢 -208 kB

Status: 1 added / 1 removed / 1 unchanged

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BAqlS3Js.js (new) 25 kB 🔴 +25 kB 🔴 +6.26 kB 🔴 +5.54 kB
assets/CloudSurveyView-vjL3T6V_.js (removed) 25 kB 🟢 -25 kB 🟢 -6.26 kB 🟢 -5.54 kB
assets/CloudLoginView-BND_Jp95.js (new) 11.6 kB 🔴 +11.6 kB 🔴 +3.14 kB 🔴 +2.76 kB
assets/CloudLoginView-CXYQhioP.js (removed) 11.6 kB 🟢 -11.6 kB 🟢 -3.14 kB 🟢 -2.75 kB
assets/CloudSignupView-C40bYmKL.js (removed) 9.96 kB 🟢 -9.96 kB 🟢 -2.81 kB 🟢 -2.46 kB
assets/CloudSignupView-Dm-TDZ0k.js (new) 9.96 kB 🔴 +9.96 kB 🔴 +2.81 kB 🔴 +2.47 kB
assets/CloudLayoutView-BnQsnTKc.js (new) 9.54 kB 🔴 +9.54 kB 🔴 +2.35 kB 🔴 +2.03 kB
assets/CloudLayoutView-YRgCeebO.js (removed) 9.54 kB 🟢 -9.54 kB 🟢 -2.35 kB 🟢 -2.02 kB
assets/UserCheckView-BxzvCurb.js (removed) 8.8 kB 🟢 -8.8 kB 🟢 -2.22 kB 🟢 -1.93 kB
assets/UserCheckView-jJs8ajA5.js (new) 8.8 kB 🔴 +8.8 kB 🔴 +2.22 kB 🔴 +1.93 kB
assets/WidgetTextPreview-_hA5Qniy.js (removed) 6.13 kB 🟢 -6.13 kB 🟢 -2.16 kB 🟢 -1.91 kB
assets/WidgetTextPreview-CnVKcfh9.js (new) 6.13 kB 🔴 +6.13 kB 🔴 +2.16 kB 🔴 +1.92 kB
assets/CloudSubscriptionRedirectView-BJ_0DBy-.js (new) 6.06 kB 🔴 +6.06 kB 🔴 +2.26 kB 🔴 +1.97 kB
assets/CloudSubscriptionRedirectView-CGV1oSkF.js (removed) 6.06 kB 🟢 -6.06 kB 🟢 -2.26 kB 🟢 -1.97 kB
assets/UserSelectView-C2FofqXf.js (new) 5.54 kB 🔴 +5.54 kB 🔴 +1.99 kB 🔴 +1.73 kB
assets/UserSelectView-DPu5lbeP.js (removed) 5.54 kB 🟢 -5.54 kB 🟢 -1.99 kB 🟢 -1.74 kB
assets/CloudForgotPasswordView-BlOG01YJ.js (new) 5.15 kB 🔴 +5.15 kB 🔴 +1.76 kB 🔴 +1.53 kB
assets/CloudForgotPasswordView-Cucy6jsf.js (removed) 5.15 kB 🟢 -5.15 kB 🟢 -1.76 kB 🟢 -1.54 kB
assets/CloudAuthTimeoutView-BI_JBvX7.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.57 kB 🟢 -1.37 kB
assets/CloudAuthTimeoutView-DeWKY2mj.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/OAuthLayoutView-B4W0ZeED.js (removed) 1.36 kB 🟢 -1.36 kB 🟢 -736 B 🟢 -622 B
assets/OAuthLayoutView-BMa3_G2r.js (new) 1.36 kB 🔴 +1.36 kB 🔴 +734 B 🔴 +620 B
assets/WidgetTextPreview-BB3eHaFz.js (new) 131 B 🔴 +131 B 🔴 +100 B 🔴 +89 B
assets/WidgetTextPreview-DnqaJprs.js (removed) 131 B 🟢 -131 B 🟢 -100 B 🟢 -89 B

Status: 12 added / 12 removed / 4 unchanged

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-BxY39bhe.js (new) 49.5 kB 🔴 +49.5 kB 🔴 +9.97 kB 🔴 +8.82 kB
assets/KeybindingPanel-C4bfH0no.js (removed) 49.5 kB 🟢 -49.5 kB 🟢 -9.97 kB 🟢 -8.83 kB
assets/SecretsPanel-CCs3LbIX.js (new) 31.3 kB 🔴 +31.3 kB 🔴 +7.61 kB 🔴 +6.67 kB
assets/SecretsPanel-D8vXEDjA.js (removed) 31.3 kB 🟢 -31.3 kB 🟢 -7.62 kB 🟢 -6.67 kB
assets/CreditsPanel-B4wZ5CHY.js (new) 16 kB 🔴 +16 kB 🔴 +4.66 kB 🔴 +4.09 kB
assets/CreditsPanel-gJxd7sFF.js (removed) 16 kB 🟢 -16 kB 🟢 -4.66 kB 🟢 -4.09 kB
assets/SubscriptionPanel-BaOQMtYX.js (new) 11.5 kB 🔴 +11.5 kB 🔴 +3.67 kB 🔴 +3.23 kB
assets/SubscriptionPanel-DPZBJWwp.js (removed) 11.5 kB 🟢 -11.5 kB 🟢 -3.66 kB 🟢 -3.23 kB
assets/AboutPanel-BZQVGpvs.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.06 kB 🔴 +2.74 kB
assets/AboutPanel-DdcLQeNQ.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.06 kB 🟢 -2.74 kB
assets/ExtensionPanel-Cdd64kuo.js (new) 9.24 kB 🔴 +9.24 kB 🔴 +2.54 kB 🔴 +2.25 kB
assets/ExtensionPanel-DOBjKU6O.js (removed) 9.24 kB 🟢 -9.24 kB 🟢 -2.54 kB 🟢 -2.25 kB
assets/ServerConfigPanel-CaibFCzz.js (new) 6.15 kB 🔴 +6.15 kB 🔴 +1.97 kB 🔴 +1.75 kB
assets/ServerConfigPanel-CwCd4nzd.js (removed) 6.15 kB 🟢 -6.15 kB 🟢 -1.97 kB 🟢 -1.75 kB
assets/UserPanel-CIj5TjpV.js (removed) 5.78 kB 🟢 -5.78 kB 🟢 -1.81 kB 🟢 -1.57 kB
assets/UserPanel-DqmJUUOt.js (new) 5.78 kB 🔴 +5.78 kB 🔴 +1.81 kB 🔴 +1.57 kB
assets/refreshRemoteConfig-Bc19lwUS.js (new) 2.97 kB 🔴 +2.97 kB 🔴 +1.26 kB 🔴 +1.11 kB
assets/refreshRemoteConfig-MTMjUjCH.js (removed) 2.97 kB 🟢 -2.97 kB 🟢 -1.27 kB 🟢 -1.11 kB
assets/cloudRemoteConfig-3rSAoFaz.js (removed) 988 B 🟢 -988 B 🟢 -536 B 🟢 -446 B
assets/cloudRemoteConfig-BS-YJjz6.js (new) 988 B 🔴 +988 B 🔴 +536 B 🔴 +450 B
assets/refreshRemoteConfig-lELj2DF6.js (removed) 110 B 🟢 -110 B 🟢 -89 B 🟢 -88 B
assets/refreshRemoteConfig-ND01AlYU.js (new) 110 B 🔴 +110 B 🔴 +89 B 🔴 +84 B

Status: 11 added / 11 removed / 15 unchanged

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SignUpForm-BSIo_2l6.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -4.18 kB 🟢 -3.65 kB
assets/SignUpForm-CG_KzzZl.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +4.18 kB 🔴 +3.65 kB
assets/auth-avSFMDHR.js (removed) 3.69 kB 🟢 -3.69 kB 🟢 -1.3 kB 🟢 -1.12 kB
assets/auth-D0y9xRIt.js (new) 3.69 kB 🔴 +3.69 kB 🔴 +1.3 kB 🔴 +1.12 kB
assets/usePostAuthRedirect-Df8JvFDX.js (removed) 3.33 kB 🟢 -3.33 kB 🟢 -1.27 kB 🟢 -1.11 kB
assets/usePostAuthRedirect-gjR8Hh_g.js (new) 3.33 kB 🔴 +3.33 kB 🔴 +1.27 kB 🔴 +1.11 kB
assets/UpdatePasswordContent-BD3gYKJL.js (removed) 1.91 kB 🟢 -1.91 kB 🟢 -871 B 🟢 -759 B
assets/UpdatePasswordContent-CdMmbz-L.js (new) 1.91 kB 🔴 +1.91 kB 🔴 +871 B 🔴 +759 B
assets/authStore-CQFeT8Hs.js (removed) 128 B 🟢 -128 B 🟢 -104 B 🟢 -105 B
assets/authStore-CuyYRsNY.js (new) 128 B 🔴 +128 B 🔴 +104 B 🔴 +104 B
assets/workspaceAuthStore-BGuiEKyN.js (removed) 108 B 🟢 -108 B 🟢 -99 B 🟢 -108 B
assets/workspaceAuthStore-DD3PBzRA.js (new) 108 B 🔴 +108 B 🔴 +99 B 🔴 +103 B
assets/auth-BmfMbGrN.js (new) 105 B 🔴 +105 B 🔴 +96 B 🔴 +80 B
assets/auth-Cw9eUe6P.js (removed) 105 B 🟢 -105 B 🟢 -96 B 🟢 -83 B

Status: 7 added / 7 removed / 3 unchanged

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyHubPublishDialog-C8j2qrx5.js (removed) 90 kB 🟢 -90 kB 🟢 -19.3 kB 🟢 -16.5 kB
assets/ComfyHubPublishDialog-CZpuXn7H.js (new) 90 kB 🔴 +90 kB 🔴 +19.3 kB 🔴 +16.5 kB
assets/useShareDialog-BEQfFXhU.js (new) 23.9 kB 🔴 +23.9 kB 🔴 +5.73 kB 🔴 +5.07 kB
assets/useShareDialog-BuK83_N9.js (removed) 23.9 kB 🟢 -23.9 kB 🟢 -5.73 kB 🟢 -5.06 kB
assets/feedbackDialog-2IYfR7jO.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.9 kB 🔴 +1.62 kB
assets/feedbackDialog-B-71Q4Rq.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.9 kB 🟢 -1.62 kB
assets/useRangeEditor-cU_tDE5L.js (new) 3.29 kB 🔴 +3.29 kB 🔴 +1.16 kB 🔴 +1.05 kB
assets/useRangeEditor-vALPdKzO.js (removed) 3.29 kB 🟢 -3.29 kB 🟢 -1.16 kB 🟢 -1.04 kB
assets/ComfyHubPublishDialog-BokMkDdO.js (removed) 143 B 🟢 -143 B 🟢 -105 B 🟢 -91 B
assets/ComfyHubPublishDialog-DOVQoDlI.js (new) 143 B 🔴 +143 B 🔴 +105 B 🔴 +89 B
assets/useSubscriptionDialog-B3byjT-y.js (new) 108 B 🔴 +108 B 🔴 +102 B 🔴 +89 B
assets/useSubscriptionDialog-D1-KC_4I.js (removed) 108 B 🟢 -108 B 🟢 -102 B 🟢 -99 B

Status: 6 added / 6 removed / 1 unchanged

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-BB7LbCr1.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.76 kB 🟢 -3.34 kB
assets/ComfyQueueButton-CdhArzrh.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.76 kB 🔴 +3.34 kB
assets/useTerminalTabs-B_BRu7Qg.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.72 kB 🟢 -3.29 kB
assets/useTerminalTabs-CoDxjP6m.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.72 kB 🔴 +3.29 kB
assets/InviteMembersForm-9j9tjsHO.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.67 kB 🟢 -2.37 kB
assets/InviteMembersForm-DyIc6NBE.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.68 kB 🔴 +2.38 kB
assets/SubscribeButton-C8jDJzPC.js (new) 2.18 kB 🔴 +2.18 kB 🔴 +988 B 🔴 +866 B
assets/SubscribeButton-nehMNoQC.js (removed) 2.18 kB 🟢 -2.18 kB 🟢 -986 B 🟢 -863 B
assets/cloudFeedbackTopbarButton-BFeBz5a9.js (new) 768 B 🔴 +768 B 🔴 +453 B 🔴 +411 B
assets/cloudFeedbackTopbarButton-CO-RYDO9.js (removed) 768 B 🟢 -768 B 🟢 -453 B 🟢 -418 B
assets/ComfyQueueButton-BCRdiXoe.js (removed) 128 B 🟢 -128 B 🟢 -99 B 🟢 -90 B
assets/ComfyQueueButton-DfqG9nWN.js (new) 128 B 🔴 +128 B 🔴 +99 B 🔴 +92 B

Status: 6 added / 6 removed / 9 unchanged

Data & Services — 3.43 MB (baseline 3.43 MB) • 🔴 +71 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/settingStore-C9gLgqt7.js (new) 3.16 MB 🔴 +3.16 MB 🔴 +731 kB 🔴 +551 kB
assets/settingStore-CKlo-lyO.js (removed) 3.16 MB 🟢 -3.16 MB 🟢 -731 kB 🟢 -551 kB
assets/load3dService-BZHkgoTr.js (removed) 132 kB 🟢 -132 kB 🟢 -29.3 kB 🟢 -24.6 kB
assets/load3dService-zPznRjZo.js (new) 132 kB 🔴 +132 kB 🔴 +29.3 kB 🔴 +24.6 kB
assets/api-B7t_Ef0N.js (new) 91.8 kB 🔴 +91.8 kB 🔴 +25.4 kB 🔴 +21.8 kB
assets/api-Biy7Z1Of.js (removed) 91.8 kB 🟢 -91.8 kB 🟢 -25.4 kB 🟢 -21.9 kB
assets/workflowShareService-CDBEVTjB.js (new) 16.5 kB 🔴 +16.5 kB 🔴 +4.92 kB 🔴 +4.37 kB
assets/workflowShareService-FGMS8Rbc.js (removed) 16.5 kB 🟢 -16.5 kB 🟢 -4.92 kB 🟢 -4.37 kB
assets/keybindingService-CpdOIu1t.js (new) 7.28 kB 🔴 +7.28 kB 🔴 +1.9 kB 🔴 +1.61 kB
assets/keybindingService-DD8p_LJk.js (removed) 7.28 kB 🟢 -7.28 kB 🟢 -1.9 kB 🟢 -1.62 kB
assets/releaseStore-BWl02yWp.js (removed) 6.77 kB 🟢 -6.77 kB 🟢 -2.06 kB 🟢 -1.8 kB
assets/releaseStore-CwNsDUzO.js (new) 6.77 kB 🔴 +6.77 kB 🔴 +2.06 kB 🔴 +1.79 kB
assets/systemStatsStore-01TOUVH2.js (removed) 4.99 kB 🟢 -4.99 kB 🟢 -1.77 kB 🟢 -1.5 kB
assets/systemStatsStore-PI4he1Kn.js (new) 4.99 kB 🔴 +4.99 kB 🔴 +1.77 kB 🔴 +1.5 kB
assets/userStore-BqNDjsOs.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -930 B 🟢 -819 B
assets/userStore-Cv1QLpzf.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +931 B 🔴 +825 B
assets/audioService-DHcU2jpK.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +862 B 🔴 +750 B
assets/audioService-DlsGeA_3.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -862 B 🟢 -748 B
assets/dialogService-DmpnhwpZ.js (removed) 98 B 🟢 -98 B 🟢 -97 B 🟢 -76 B
assets/dialogService-QHTc4k_Y.js (new) 98 B 🔴 +98 B 🔴 +97 B 🔴 +81 B
assets/releaseStore-CMNMDWa9.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -86 B
assets/releaseStore-WShY92TQ.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +81 B
assets/settingStore-BMr0RBP6.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +84 B
assets/settingStore-Cz9ClOSS.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -82 B
assets/assetsStore-BwTncnfb.js (new) 94 B 🔴 +94 B 🔴 +92 B 🔴 +86 B
assets/assetsStore-DZqh42a_.js (removed) 94 B 🟢 -94 B 🟢 -92 B 🟢 -85 B
assets/api-Bc1PPQVX.js (new) 62 B 🔴 +62 B 🔴 +74 B 🔴 +66 B
assets/api-Bt9ETWX_.js (removed) 62 B 🟢 -62 B 🟢 -74 B 🟢 -66 B

Status: 14 added / 14 removed / 3 unchanged

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-CqvSpZJA.js (removed) 235 kB 🟢 -235 kB 🟢 -52.5 kB 🟢 -42.7 kB
assets/useConflictDetection-mQvy0HDn.js (new) 235 kB 🔴 +235 kB 🔴 +52.5 kB 🔴 +42.8 kB
assets/useLoad3d-C0Ksl-6z.js (new) 25.8 kB 🔴 +25.8 kB 🔴 +5.82 kB 🔴 +5.16 kB
assets/useLoad3d-k2arejZ-.js (removed) 25.8 kB 🟢 -25.8 kB 🟢 -5.82 kB 🟢 -5.16 kB
assets/useLoad3dViewer-BWtBeS5H.js (new) 21.3 kB 🔴 +21.3 kB 🔴 +5.01 kB 🔴 +4.38 kB
assets/useLoad3dViewer-Df-2EWxz.js (removed) 21.3 kB 🟢 -21.3 kB 🟢 -5 kB 🟢 -4.38 kB
assets/useImageCrop-C86Bay5R.js (removed) 15.1 kB 🟢 -15.1 kB 🟢 -3.45 kB 🟢 -3.01 kB
assets/useImageCrop-CT2L2-qv.js (new) 15.1 kB 🔴 +15.1 kB 🔴 +3.45 kB 🔴 +3.01 kB
assets/useDowngradeToPersonal-CarcNttX.js (removed) 8.21 kB 🟢 -8.21 kB 🟢 -2.39 kB 🟢 -2.04 kB
assets/useDowngradeToPersonal-CWu5zpKx.js (new) 8.21 kB 🔴 +8.21 kB 🔴 +2.39 kB 🔴 +2.04 kB
assets/useFeatureFlags-Ci-Ukh0J.js (new) 7.26 kB 🔴 +7.26 kB 🔴 +2.17 kB 🔴 +1.83 kB
assets/useFeatureFlags-DZ6jK4Y2.js (removed) 7.26 kB 🟢 -7.26 kB 🟢 -2.17 kB 🟢 -1.83 kB
assets/assetPreviewUtil-C_vBeaCy.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1 kB 🔴 +867 B
assets/assetPreviewUtil-DkbmoObm.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -1 kB 🟢 -866 B
assets/useUpstreamValue-DK9h0Zdp.js (new) 2.04 kB 🔴 +2.04 kB 🔴 +787 B 🔴 +702 B
assets/useUpstreamValue-DXaZ8gq3.js (removed) 2.04 kB 🟢 -2.04 kB 🟢 -788 B 🟢 -701 B
assets/useWorkspaceTierLabel-DLjFqc4U.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -847 B 🟢 -730 B
assets/useWorkspaceTierLabel-DPlwSE3_.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +848 B 🔴 +731 B
assets/subscriptionCheckoutUtil-CO8G5rq_.js (removed) 903 B 🟢 -903 B 🟢 -537 B 🟢 -456 B
assets/subscriptionCheckoutUtil-CWgi0bGA.js (new) 903 B 🔴 +903 B 🔴 +536 B 🔴 +455 B
assets/useSessionCookie-CcL5IkOB.js (removed) 746 B 🟢 -746 B 🟢 -391 B 🟢 -335 B
assets/useSessionCookie-Cdh7QgER.js (new) 746 B 🔴 +746 B 🔴 +388 B 🔴 +336 B
assets/useLoad3d-CiI4KOnp.js (removed) 311 B 🟢 -311 B 🟢 -162 B 🟢 -146 B
assets/useLoad3d-Kh--wUq0.js (new) 311 B 🔴 +311 B 🔴 +164 B 🔴 +147 B
assets/useSessionCookie-CWnZEdWM.js (removed) 101 B 🟢 -101 B 🟢 -86 B 🟢 -85 B
assets/useSessionCookie-DBrj1bcx.js (new) 101 B 🔴 +101 B 🔴 +86 B 🔴 +77 B
assets/useFeatureFlags-DjRlXODW.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +84 B
assets/useFeatureFlags-QGLYdfz3.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -76 B
assets/useLoad3dViewer-7k2rV0nL.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -85 B
assets/useLoad3dViewer-C3QG0do3.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +83 B
assets/useCurrentUser-im_mlnpF.js (removed) 94 B 🟢 -94 B 🟢 -95 B 🟢 -92 B
assets/useCurrentUser-UVbBWbDq.js (new) 94 B 🔴 +94 B 🔴 +95 B 🔴 +85 B

Status: 16 added / 16 removed / 20 unchanged

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

External libraries and shared vendor chunks

Status: 16 unchanged

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

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-CS_Ry43a.js (new) 111 kB 🔴 +111 kB 🔴 +28.7 kB 🔴 +24.3 kB
assets/core-DkZTEXX8.js (removed) 111 kB 🟢 -111 kB 🟢 -28.7 kB 🟢 -24.3 kB
assets/WidgetSelect-DW9QOF_v.js (new) 88 kB 🔴 +88 kB 🔴 +20 kB 🔴 +17.1 kB
assets/WidgetSelect-GC8J_jiT.js (removed) 88 kB 🟢 -88 kB 🟢 -20 kB 🟢 -17.1 kB
assets/Load3D-CfNYnX0j.js (removed) 71.3 kB 🟢 -71.3 kB 🟢 -11.7 kB 🟢 -10 kB
assets/Load3D-DiSHWg-a.js (new) 71.3 kB 🔴 +71.3 kB 🔴 +11.7 kB 🔴 +10 kB
assets/WidgetVideoEdit-DCgE99fh.js (new) 63.5 kB 🔴 +63.5 kB 🔴 +14.6 kB 🔴 +12.9 kB
assets/WidgetVideoEdit-l3Mz2gBw.js (removed) 63.5 kB 🟢 -63.5 kB 🟢 -14.6 kB 🟢 -12.9 kB
assets/WorkspaceSettingsPanelContent-BGfElT28.js (removed) 61.6 kB 🟢 -61.6 kB 🟢 -13.2 kB 🟢 -11.5 kB
assets/WorkspaceSettingsPanelContent-BOX3Sl7y.js (new) 61.6 kB 🔴 +61.6 kB 🔴 +13.2 kB 🔴 +11.5 kB
assets/SubscriptionTransitionPreviewWorkspace-BzMrMSLl.js (new) 55.9 kB 🔴 +55.9 kB 🔴 +11.6 kB 🔴 +10.1 kB
assets/SubscriptionTransitionPreviewWorkspace-DSSNyh1L.js (removed) 55.9 kB 🟢 -55.9 kB 🟢 -11.6 kB 🟢 -10.1 kB
assets/Preview3d-BWTwsSZZ.js (removed) 50.9 kB 🟢 -50.9 kB 🟢 -8.34 kB 🟢 -7.26 kB
assets/Preview3d-DI5KBlI3.js (new) 50.9 kB 🔴 +50.9 kB 🔴 +8.34 kB 🔴 +7.27 kB
assets/main-BmP2U-y4.js (new) 46.7 kB 🔴 +46.7 kB 🔴 +13.8 kB 🔴 +11.9 kB
assets/main-CjYJ0-3R.js (removed) 46.7 kB 🟢 -46.7 kB 🟢 -13.8 kB 🟢 -11.9 kB
assets/SubscriptionRequiredDialogContentUnified-Bxcca8T5.js (new) 42.5 kB 🔴 +42.5 kB 🔴 +9.42 kB 🔴 +8.2 kB
assets/SubscriptionRequiredDialogContentUnified-Dy_yqdbB.js (removed) 42.5 kB 🟢 -42.5 kB 🟢 -9.43 kB 🟢 -8.2 kB
assets/MembersPanelContent-d4IhesuL.js (removed) 41.9 kB 🟢 -41.9 kB 🟢 -8.8 kB 🟢 -7.84 kB
assets/MembersPanelContent-D5WxgFVK.js (new) 41.9 kB 🔴 +41.9 kB 🔴 +8.8 kB 🔴 +7.84 kB
assets/WidgetBoundingBoxes-B2kNepd-.js (removed) 33.8 kB 🟢 -33.8 kB 🟢 -9.19 kB 🟢 -8.15 kB
assets/WidgetBoundingBoxes-DT_cdzrO.js (new) 33.8 kB 🔴 +33.8 kB 🔴 +9.19 kB 🔴 +8.16 kB
assets/WidgetPainter-Po5AZv4c.js (new) 32.7 kB 🔴 +32.7 kB 🔴 +7.9 kB 🔴 +7 kB
assets/WidgetPainter-qv-nbxPP.js (removed) 32.7 kB 🟢 -32.7 kB 🟢 -7.9 kB 🟢 -7 kB
assets/Load3dViewerContent-Bp3pIaIv.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -6.29 kB 🟢 -5.46 kB
assets/Load3dViewerContent-uv2sBOTu.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +6.29 kB 🔴 +5.46 kB
assets/SubscriptionPanelContentWorkspace-C5VcGH43.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +6.65 kB 🔴 +5.85 kB
assets/SubscriptionPanelContentWorkspace-ClF8mRs0.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -6.65 kB 🟢 -5.86 kB
assets/SubscriptionRequiredDialogContent-DMrmtL9I.js (new) 26.1 kB 🔴 +26.1 kB 🔴 +6.17 kB 🔴 +5.44 kB
assets/SubscriptionRequiredDialogContent-taij5rHm.js (removed) 26.1 kB 🟢 -26.1 kB 🟢 -6.17 kB 🟢 -5.43 kB
assets/SubscriptionRequiredDialogContentWorkspace-B9QbNlSX.js (new) 25.1 kB 🔴 +25.1 kB 🔴 +5.81 kB 🔴 +5.11 kB
assets/SubscriptionRequiredDialogContentWorkspace-DI64vYEF.js (removed) 25.1 kB 🟢 -25.1 kB 🟢 -5.8 kB 🟢 -5.11 kB
assets/load3d-CTKdaTiu.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.44 kB 🔴 +4.7 kB
assets/load3d-DwMBg69Q.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.44 kB 🟢 -4.69 kB
assets/CurrentUserPopoverWorkspace-CEPJdTsl.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +4.72 kB 🔴 +4.2 kB
assets/CurrentUserPopoverWorkspace-D-2yWqnz.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -4.72 kB 🟢 -4.21 kB
assets/SignInContent-ByxpXmC2.js (removed) 20.3 kB 🟢 -20.3 kB 🟢 -5.13 kB 🟢 -4.48 kB
assets/SignInContent-DuNaeN05.js (new) 20.3 kB 🔴 +20.3 kB 🔴 +5.13 kB 🔴 +4.48 kB
assets/CreditsTile-1EnQoTpm.js (removed) 17.3 kB 🟢 -17.3 kB 🟢 -4.58 kB 🟢 -4.04 kB
assets/CreditsTile-DWipnv6x.js (new) 17.3 kB 🔴 +17.3 kB 🔴 +4.58 kB 🔴 +4.04 kB
assets/WidgetRecordAudio-B9kSo2Oh.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.63 kB 🟢 -4.12 kB
assets/WidgetRecordAudio-BDS2nZsz.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.63 kB 🔴 +4.13 kB
assets/WidgetInputNumber-BtM1Tvrx.js (new) 14 kB 🔴 +14 kB 🔴 +3.67 kB 🔴 +3.23 kB
assets/WidgetInputNumber-BvISK6z2.js (removed) 14 kB 🟢 -14 kB 🟢 -3.67 kB 🟢 -3.23 kB
assets/WidgetRange-Bkdr15-r.js (removed) 13.8 kB 🟢 -13.8 kB 🟢 -3.57 kB 🟢 -3.15 kB
assets/WidgetRange-Da-9Dq9a.js (new) 13.8 kB 🔴 +13.8 kB 🔴 +3.57 kB 🔴 +3.15 kB
assets/WaveAudioPlayer-BWhr95pD.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +3.5 kB 🔴 +3.07 kB
assets/WaveAudioPlayer-CGHsYb2U.js (removed) 12.8 kB 🟢 -12.8 kB 🟢 -3.5 kB 🟢 -3.06 kB
assets/WidgetCurve-C-SJk85v.js (new) 11.3 kB 🔴 +11.3 kB 🔴 +3.51 kB 🔴 +3.16 kB
assets/WidgetCurve-C1XDRPoz.js (removed) 11.3 kB 🟢 -11.3 kB 🟢 -3.5 kB 🟢 -3.16 kB
assets/TeamWorkspacesDialogContent-CvrTnSq6.js (removed) 10.3 kB 🟢 -10.3 kB 🟢 -3 kB 🟢 -2.66 kB
assets/TeamWorkspacesDialogContent-DIu3Pck2.js (new) 10.3 kB 🔴 +10.3 kB 🔴 +3 kB 🔴 +2.66 kB
assets/onboardingCloudRoutes-BrVPR8Jw.js (new) 9.08 kB 🔴 +9.08 kB 🔴 +2.78 kB 🔴 +2.39 kB
assets/onboardingCloudRoutes-BZlhJVjT.js (removed) 9.08 kB 🟢 -9.08 kB 🟢 -2.78 kB 🟢 -2.39 kB
assets/Load3DConfiguration-CJqoNooc.js (removed) 8.97 kB 🟢 -8.97 kB 🟢 -2.63 kB 🟢 -2.32 kB
assets/Load3DConfiguration-JrsZG5Dv.js (new) 8.97 kB 🔴 +8.97 kB 🔴 +2.64 kB 🔴 +2.32 kB
assets/WidgetImageCrop-Bm5BIBiu.js (new) 8.55 kB 🔴 +8.55 kB 🔴 +2.68 kB 🔴 +2.37 kB
assets/WidgetImageCrop-Dfd5ZAZ4.js (removed) 8.55 kB 🟢 -8.55 kB 🟢 -2.68 kB 🟢 -2.37 kB
assets/SetMemberCreditLimitDialogContent-CLlIIq3i.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.37 kB 🔴 +2.08 kB
assets/SetMemberCreditLimitDialogContent-SKB-S5Pq.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.37 kB 🟢 -2.07 kB
assets/nodeTemplates-0wJo9bvA.js (new) 8.33 kB 🔴 +8.33 kB 🔴 +2.87 kB 🔴 +2.53 kB
assets/nodeTemplates-iG85Xzg1.js (removed) 8.33 kB 🟢 -8.33 kB 🟢 -2.87 kB 🟢 -2.54 kB
assets/NightlySurveyController-C0kOK621.js (removed) 7.56 kB 🟢 -7.56 kB 🟢 -2.59 kB 🟢 -2.26 kB
assets/NightlySurveyController-Kx9u9qJ4.js (new) 7.56 kB 🔴 +7.56 kB 🔴 +2.59 kB 🔴 +2.26 kB
assets/WidgetWithControl-BdZIpLqk.js (removed) 6.4 kB 🟢 -6.4 kB 🟢 -2.61 kB 🟢 -2.31 kB
assets/WidgetWithControl-DpmNG_Jk.js (new) 6.4 kB 🔴 +6.4 kB 🔴 +2.61 kB 🔴 +2.31 kB
assets/tierBenefits-CCasGYBh.js (removed) 6.25 kB 🟢 -6.25 kB 🟢 -2 kB 🟢 -1.74 kB
assets/tierBenefits-D2MbleRB.js (new) 6.25 kB 🔴 +6.25 kB 🔴 +2 kB 🔴 +1.74 kB
assets/CancelSubscriptionDialogContent-B8FOLuhW.js (new) 5.98 kB 🔴 +5.98 kB 🔴 +2.04 kB 🔴 +1.78 kB
assets/CancelSubscriptionDialogContent-BvPMu2mR.js (removed) 5.98 kB 🟢 -5.98 kB 🟢 -2.04 kB 🟢 -1.79 kB
assets/load3dPreviewExtensions-BdgOkAn6.js (new) 5.94 kB 🔴 +5.94 kB 🔴 +1.84 kB 🔴 +1.62 kB
assets/load3dPreviewExtensions-IDpxTSdR.js (removed) 5.94 kB 🟢 -5.94 kB 🟢 -1.84 kB 🟢 -1.62 kB
assets/missingModelDownload-B_3Jm0i-.js (new) 5.59 kB 🔴 +5.59 kB 🔴 +2.04 kB 🔴 +1.78 kB
assets/missingModelDownload-CweA7-Qm.js (removed) 5.59 kB 🟢 -5.59 kB 🟢 -2.04 kB 🟢 -1.78 kB
assets/CreateWorkspaceDialogContent-BizyHZUx.js (removed) 5.19 kB 🟢 -5.19 kB 🟢 -1.83 kB 🟢 -1.58 kB
assets/CreateWorkspaceDialogContent-BoAxIoTp.js (new) 5.19 kB 🔴 +5.19 kB 🔴 +1.83 kB 🔴 +1.58 kB
assets/ChangeMemberRoleDialogContent-CJ3sWpID.js (removed) 5.04 kB 🟢 -5.04 kB 🟢 -1.67 kB 🟢 -1.46 kB
assets/ChangeMemberRoleDialogContent-D8OIJ-uf.js (new) 5.04 kB 🔴 +5.04 kB 🔴 +1.67 kB 🔴 +1.46 kB
assets/EditWorkspaceDialogContent-Bqnx5P09.js (removed) 5 kB 🟢 -5 kB 🟢 -1.79 kB 🟢 -1.55 kB
assets/EditWorkspaceDialogContent-DZnyW4te.js (new) 5 kB 🔴 +5 kB 🔴 +1.79 kB 🔴 +1.55 kB
assets/WidgetTextarea-Bbj5zNqU.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.9 kB 🔴 +1.66 kB
assets/WidgetTextarea-CfofFMjs.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.9 kB 🟢 -1.66 kB
assets/saveMesh-DJbYd4ww.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.55 kB 🟢 -1.37 kB
assets/saveMesh-lVU6NlsA.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.55 kB 🔴 +1.37 kB
assets/WorkspacePanelContent-BAVUZ_7L.js (removed) 4.78 kB 🟢 -4.78 kB 🟢 -1.63 kB 🟢 -1.43 kB
assets/WorkspacePanelContent-CX46fwGL.js (new) 4.78 kB 🔴 +4.78 kB 🔴 +1.64 kB 🔴 +1.43 kB
assets/InviteMemberDialogContent-DpGETyTS.js (new) 4.75 kB 🔴 +4.75 kB 🔴 +1.61 kB 🔴 +1.4 kB
assets/InviteMemberDialogContent-lN4dOOjl.js (removed) 4.75 kB 🟢 -4.75 kB 🟢 -1.61 kB 🟢 -1.41 kB
assets/ValueControlPopover-BeBvl06P.js (new) 4.54 kB 🔴 +4.54 kB 🔴 +1.58 kB 🔴 +1.41 kB
assets/ValueControlPopover-BwzLQF3_.js (removed) 4.54 kB 🟢 -4.54 kB 🟢 -1.58 kB 🟢 -1.41 kB
assets/DeleteWorkspaceDialogContent-DirrV34Y.js (new) 3.91 kB 🔴 +3.91 kB 🔴 +1.47 kB 🔴 +1.26 kB
assets/DeleteWorkspaceDialogContent-monlNRRZ.js (removed) 3.91 kB 🟢 -3.91 kB 🟢 -1.47 kB 🟢 -1.26 kB
assets/LeaveWorkspaceDialogContent-BxJ8lTVl.js (removed) 3.73 kB 🟢 -3.73 kB 🟢 -1.41 kB 🟢 -1.21 kB
assets/LeaveWorkspaceDialogContent-Clox5vcb.js (new) 3.73 kB 🔴 +3.73 kB 🔴 +1.41 kB 🔴 +1.21 kB
assets/RemoveMemberDialogContent-C8dq0MKZ.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.37 kB 🟢 -1.18 kB
assets/RemoveMemberDialogContent-CvS8B_YX.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.37 kB 🔴 +1.18 kB
assets/RevokeInviteDialogContent-CSMBrwQu.js (removed) 3.62 kB 🟢 -3.62 kB 🟢 -1.38 kB 🟢 -1.2 kB
assets/RevokeInviteDialogContent-DiHtp3GN.js (new) 3.62 kB 🔴 +3.62 kB 🔴 +1.38 kB 🔴 +1.2 kB
assets/InviteMemberUpsellDialogContent-CmWSGwkr.js (new) 3.51 kB 🔴 +3.51 kB 🔴 +1.26 kB 🔴 +1.1 kB
assets/InviteMemberUpsellDialogContent-ZIw8eHFH.js (removed) 3.51 kB 🟢 -3.51 kB 🟢 -1.26 kB 🟢 -1.1 kB
assets/workspaceCheckoutTelemetry-DpUZsfS_.js (new) 3.46 kB 🔴 +3.46 kB 🔴 +1.55 kB 🔴 +1.35 kB
assets/workspaceCheckoutTelemetry-ujR0ILPR.js (removed) 3.46 kB 🟢 -3.46 kB 🟢 -1.55 kB 🟢 -1.35 kB
assets/Media3DTop-BzyIKhA7.js (removed) 3.26 kB 🟢 -3.26 kB 🟢 -1.29 kB 🟢 -1.13 kB
assets/Media3DTop-fhYwCFuE.js (new) 3.26 kB 🔴 +3.26 kB 🔴 +1.29 kB 🔴 +1.13 kB
assets/GlobalToast-CM6df_0G.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.25 kB 🔴 +1.1 kB
assets/GlobalToast-Dun5jM3K.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.25 kB 🟢 -1.11 kB
assets/load3dAdvanced-Bu84nOJF.js (removed) 2.87 kB 🟢 -2.87 kB 🟢 -1.13 kB 🟢 -972 B
assets/load3dAdvanced-C6A5dXPb.js (new) 2.87 kB 🔴 +2.87 kB 🔴 +1.13 kB 🔴 +975 B
assets/SubscribeToRun-DmjtqCcR.js (removed) 2.45 kB 🟢 -2.45 kB 🟢 -1.06 kB 🟢 -924 B
assets/SubscribeToRun-DrKv_4hO.js (new) 2.45 kB 🔴 +2.45 kB 🔴 +1.06 kB 🔴 +924 B
assets/MediaAudioTop-CeKkIkAH.js (new) 1.67 kB 🔴 +1.67 kB 🔴 +838 B 🔴 +694 B
assets/MediaAudioTop-CwRIJFNX.js (removed) 1.67 kB 🟢 -1.67 kB 🟢 -840 B 🟢 -695 B
assets/CloudRunButtonWrapper-aqgaxhfF.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -544 B 🟢 -477 B
assets/CloudRunButtonWrapper-DG_zDj90.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +547 B 🔴 +478 B
assets/cloudSessionCookie-CytOj3iO.js (removed) 989 B 🟢 -989 B 🟢 -460 B 🟢 -410 B
assets/cloudSessionCookie-DRX2DLv4.js (new) 989 B 🔴 +989 B 🔴 +462 B 🔴 +418 B
assets/cloudBadges-CJR7za1N.js (removed) 971 B 🟢 -971 B 🟢 -546 B 🟢 -485 B
assets/cloudBadges-DhDRGKE9.js (new) 971 B 🔴 +971 B 🔴 +546 B 🔴 +458 B
assets/Load3DAdvanced-C-mFT77u.js (new) 813 B 🔴 +813 B 🔴 +453 B 🔴 +405 B
assets/Load3DAdvanced-DAcFS4mN.js (removed) 813 B 🟢 -813 B 🟢 -454 B 🟢 -398 B
assets/nightlyBadges-BaYP7-Qs.js (removed) 462 B 🟢 -462 B 🟢 -303 B 🟢 -250 B
assets/nightlyBadges-CvG2q3dC.js (new) 462 B 🔴 +462 B 🔴 +303 B 🔴 +252 B
assets/missingModelDownload-CeofAISM.js (new) 326 B 🔴 +326 B 🔴 +188 B 🔴 +172 B
assets/missingModelDownload-Cimj_A3p.js (removed) 326 B 🟢 -326 B 🟢 -189 B 🟢 -167 B
assets/SubscriptionPanelContentWorkspace-BD3UEQgz.js (removed) 179 B 🟢 -179 B 🟢 -117 B 🟢 -91 B
assets/SubscriptionPanelContentWorkspace-vQx9UWXC.js (new) 179 B 🔴 +179 B 🔴 +117 B 🔴 +106 B
assets/Load3dViewerContent-CdhCyDC6.js (removed) 137 B 🟢 -137 B 🟢 -103 B 🟢 -90 B
assets/Load3dViewerContent-ClMeTzBB.js (new) 137 B 🔴 +137 B 🔴 +103 B 🔴 +91 B
assets/Load3DAdvanced-CcyLZHcm.js (new) 122 B 🔴 +122 B 🔴 +97 B 🔴 +83 B
assets/Load3DAdvanced-njIsiZYL.js (removed) 122 B 🟢 -122 B 🟢 -97 B 🟢 -88 B
assets/WidgetLegacy-CThPa3nB.js (new) 117 B 🔴 +117 B 🔴 +106 B 🔴 +92 B
assets/WidgetLegacy-DXKavCqJ.js (removed) 117 B 🟢 -117 B 🟢 -106 B 🟢 -102 B
assets/workflowDraftStoreV2-CuzjnEDU.js (new) 112 B 🔴 +112 B 🔴 +101 B 🔴 +109 B
assets/workflowDraftStoreV2-gX5EEuQD.js (removed) 112 B 🟢 -112 B 🟢 -101 B 🟢 -110 B
assets/Load3D-BtAFycol.js (new) 98 B 🔴 +98 B 🔴 +89 B 🔴 +86 B
assets/Load3D-Z6UMNtA9.js (removed) 98 B 🟢 -98 B 🟢 -89 B 🟢 -86 B
assets/changeTracker-B0ZRxRqB.js (removed) 91 B 🟢 -91 B 🟢 -93 B 🟢 -85 B
assets/changeTracker-BWAFtK7m.js (new) 91 B 🔴 +91 B 🔴 +93 B 🔴 +84 B

Status: 69 added / 69 removed / 209 unchanged

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.7 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 50.5 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 72.2 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.2 MB heap
large-graph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 63.9 MB heap
large-graph-pan: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 60.9 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.7 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 65.8 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.6 MB heap
subgraph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 56.4 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.1 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 121ms TBT · 94.0 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.6 MB heap
vue-large-graph-idle: · 54.5 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 160.8 MB heap
vue-large-graph-pan: · 53.7 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 458ms TBT · 170.2 MB heap
workflow-execution: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 57.7 MB heap

⚠️ 7 regressions detected

Show regressions
Metric Baseline PR (median) Δ Sig
canvas-idle: task duration 500ms 520ms +4% ⚠️ z=4.0
canvas-zoom-sweep: task duration 328ms 381ms +16% ⚠️ z=2.4
large-graph-idle: task duration 698ms 697ms -0% ⚠️ z=2.9
large-graph-pan: task duration 1154ms 1310ms +14% ⚠️ z=5.3
minimap-idle: task duration 683ms 688ms +1% ⚠️ z=3.4
subgraph-dom-widget-clipping: task duration 340ms 417ms +23% ⚠️ z=2.1
subgraph-idle: task duration 489ms 496ms +1% ⚠️ z=4.0
All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: avg frame time 17ms 17ms +0% z=-0.1
canvas-idle: p95 frame time 17ms 17ms +0%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 9ms 7ms -17% z=-4.2
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 10 9 -15% z=-4.7
canvas-idle: task duration 500ms 520ms +4% ⚠️ z=4.0
canvas-idle: script duration 23ms 22ms -6% z=-1.6
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 69.0 MB 69.7 MB +1%
canvas-idle: DOM nodes 20 17 -15% z=-4.4
canvas-idle: event listeners 6 4 -33% z=-1.6
canvas-mouse-sweep: avg frame time 17ms 17ms +0% z=-0.9
canvas-mouse-sweep: p95 frame time 17ms 17ms +0%
canvas-mouse-sweep: layout duration 3ms 4ms +25% z=1.0
canvas-mouse-sweep: style recalc duration 30ms 42ms +43% z=-0.1
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 72 78 +8% z=-0.3
canvas-mouse-sweep: task duration 782ms 947ms +21% z=1.4
canvas-mouse-sweep: script duration 102ms 120ms +18% z=-2.4
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 50.7 MB 50.5 MB -0%
canvas-mouse-sweep: DOM nodes -279 -280 +0% z=-132.2
canvas-mouse-sweep: event listeners -144 -147 +2% z=-37.3
canvas-zoom-sweep: avg frame time 17ms 17ms +0% z=0.5
canvas-zoom-sweep: p95 frame time 17ms 17ms -0%
canvas-zoom-sweep: layout duration 1ms 1ms +10% z=-0.6
canvas-zoom-sweep: style recalc duration 16ms 16ms +5% z=-1.7
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 30 32 +5% z=0.5
canvas-zoom-sweep: task duration 328ms 381ms +16% ⚠️ z=2.4
canvas-zoom-sweep: script duration 24ms 20ms -18% z=-2.5
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 72.2 MB 72.2 MB -0%
canvas-zoom-sweep: DOM nodes 77 77 -1% z=-3.5
canvas-zoom-sweep: event listeners 21 19 -10% z=-0.9
dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
dom-widget-clipping: p95 frame time 17ms 17ms +0%
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 7ms 8ms +15% z=-2.1
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 12 12 -4% z=-3.2
dom-widget-clipping: task duration 336ms 383ms +14% z=1.1
dom-widget-clipping: script duration 51ms 58ms +13% z=-3.1
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 52.8 MB 53.2 MB +1%
dom-widget-clipping: DOM nodes 20 19 -5% z=-2.2
dom-widget-clipping: event listeners 2 0 -100% variance too high
large-graph-idle: avg frame time 17ms 17ms -0% z=-0.6
large-graph-idle: p95 frame time 17ms 17ms -0%
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 7ms 7ms -9% z=-5.2
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 9 8 -17% z=-13.1
large-graph-idle: task duration 698ms 697ms -0% ⚠️ z=2.9
large-graph-idle: script duration 107ms 105ms -3% z=0.2
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 63.3 MB 63.9 MB +1%
large-graph-idle: DOM nodes -281 -283 +1% z=-339.9
large-graph-idle: event listeners -144 -143 -1% z=-27.7
large-graph-pan: avg frame time 17ms 17ms +0% z=-0.2
large-graph-pan: p95 frame time 17ms 17ms -1%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 15ms 15ms +4% z=-2.5
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 69 69 -1% z=-1.7
large-graph-pan: task duration 1154ms 1310ms +14% ⚠️ z=5.3
large-graph-pan: script duration 357ms 424ms +19% z=0.8
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 63.1 MB 60.9 MB -3%
large-graph-pan: DOM nodes -282 -285 +1% z=-184.0
large-graph-pan: event listeners -142 -143 +1% z=-178.6
large-graph-zoom: avg frame time 17ms 17ms +0%
large-graph-zoom: p95 frame time 17ms 17ms +0%
large-graph-zoom: layout duration 8ms 8ms +7%
large-graph-zoom: style recalc duration 15ms 14ms -6%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 66 64 -4%
large-graph-zoom: task duration 1404ms 1519ms +8%
large-graph-zoom: script duration 484ms 541ms +12%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 61.5 MB 69.7 MB +13%
large-graph-zoom: DOM nodes -287 -141 -51%
large-graph-zoom: event listeners -146 -70 -52%
minimap-idle: avg frame time 17ms 17ms +0% z=-0.4
minimap-idle: p95 frame time 17ms 17ms +0%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 6ms 7ms +9% z=-3.2
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 9 8 -17% z=-3.0
minimap-idle: task duration 683ms 688ms +1% ⚠️ z=3.4
minimap-idle: script duration 105ms 101ms -4% z=0.3
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 64.7 MB 65.8 MB +2%
minimap-idle: DOM nodes -282 -283 +0% z=-220.9
minimap-idle: event listeners -144 -144 +0% z=-225.0
subgraph-dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
subgraph-dom-widget-clipping: p95 frame time 17ms 17ms -0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms +0%
subgraph-dom-widget-clipping: style recalc duration 9ms 11ms +27% z=-1.4
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 46 48 +3% z=-0.8
subgraph-dom-widget-clipping: task duration 340ms 417ms +23% ⚠️ z=2.1
subgraph-dom-widget-clipping: script duration 99ms 127ms +28% z=-0.3
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 53.6 MB 53.6 MB -0%
subgraph-dom-widget-clipping: DOM nodes 18 21 +17% z=-1.1
subgraph-dom-widget-clipping: event listeners 8 6 -25% z=-1.7
subgraph-idle: avg frame time 17ms 17ms +0% z=0.4
subgraph-idle: p95 frame time 17ms 17ms -1%
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 8ms 8ms -3% z=-3.5
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 10 10 -5% z=-2.1
subgraph-idle: task duration 489ms 496ms +1% ⚠️ z=4.0
subgraph-idle: script duration 21ms 14ms -33% z=-2.4
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 69.4 MB 56.4 MB -19%
subgraph-idle: DOM nodes 20 -131 -753% z=-101.9
subgraph-idle: event listeners 6 -72 -1300% variance too high
subgraph-mouse-sweep: avg frame time 17ms 17ms -0% z=-0.1
subgraph-mouse-sweep: p95 frame time 17ms 17ms -0%
subgraph-mouse-sweep: layout duration 4ms 5ms +25% z=0.1
subgraph-mouse-sweep: style recalc duration 32ms 40ms +24% z=-0.9
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 76 77 +1% z=-1.9
subgraph-mouse-sweep: task duration 719ms 813ms +13% z=0.7
subgraph-mouse-sweep: script duration 83ms 92ms +11% z=-1.4
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 47.8 MB 53.1 MB +11%
subgraph-mouse-sweep: DOM nodes -279 -107 -62% z=-77.8
subgraph-mouse-sweep: event listeners -144 -72 -50% variance too high
subgraph-transition-enter: avg frame time 17ms 17ms -0%
subgraph-transition-enter: p95 frame time 17ms 17ms +1%
subgraph-transition-enter: layout duration 9ms 12ms +26%
subgraph-transition-enter: style recalc duration 25ms 30ms +21%
subgraph-transition-enter: layout count 14 15 +7%
subgraph-transition-enter: style recalc count 18 19 +6%
subgraph-transition-enter: task duration 814ms 942ms +16%
subgraph-transition-enter: script duration 31ms 44ms +40%
subgraph-transition-enter: TBT 86ms 121ms +41%
subgraph-transition-enter: heap used 91.7 MB 94.0 MB +3%
subgraph-transition-enter: DOM nodes 13673 13673 +0%
subgraph-transition-enter: event listeners 2371 2371 +0%
viewport-pan-sweep: avg frame time 17ms 17ms -0%
viewport-pan-sweep: p95 frame time 17ms 17ms -0%
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 40ms 43ms +7%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 249 250 +0%
viewport-pan-sweep: task duration 4006ms 4592ms +15%
viewport-pan-sweep: script duration 1158ms 1415ms +22%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 62.5 MB 68.6 MB +10%
viewport-pan-sweep: DOM nodes -281 -282 +0%
viewport-pan-sweep: event listeners -128 -128 +0%
vue-large-graph-idle: avg frame time 18ms 18ms +3%
vue-large-graph-idle: p95 frame time 17ms 17ms -1%
vue-large-graph-idle: layout duration 0ms 0ms +0%
vue-large-graph-idle: style recalc duration 0ms 0ms +0%
vue-large-graph-idle: layout count 0 0 +0%
vue-large-graph-idle: style recalc count 0 0 +0%
vue-large-graph-idle: task duration 15100ms 17769ms +18%
vue-large-graph-idle: script duration 455ms 560ms +23%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 173.4 MB 160.8 MB -7%
vue-large-graph-idle: DOM nodes -8312 -8312 +0%
vue-large-graph-idle: event listeners -16389 -16385 -0%
vue-large-graph-pan: avg frame time 17ms 19ms +8%
vue-large-graph-pan: p95 frame time 17ms 17ms +0%
vue-large-graph-pan: layout duration 0ms 0ms +0%
vue-large-graph-pan: style recalc duration 17ms 22ms +34%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 122 156 +27%
vue-large-graph-pan: task duration 17503ms 22011ms +26%
vue-large-graph-pan: script duration 710ms 876ms +23%
vue-large-graph-pan: TBT 13ms 458ms +3419%
vue-large-graph-pan: heap used 161.4 MB 170.2 MB +5%
vue-large-graph-pan: DOM nodes -8312 -8312 +0%
vue-large-graph-pan: event listeners -16385 -16382 -0%
workflow-execution: avg frame time 17ms 17ms +0% z=0.6
workflow-execution: p95 frame time 17ms 17ms -1%
workflow-execution: layout duration 1ms 1ms +9% z=-6.0
workflow-execution: style recalc duration 17ms 16ms -5% z=-3.8
workflow-execution: layout count 3 3 -17% z=-4.5
workflow-execution: style recalc count 13 11 -19% z=-3.6
workflow-execution: task duration 102ms 97ms -4% z=-2.4
workflow-execution: script duration 9ms 8ms -15% z=-7.1
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 48.7 MB 57.7 MB +18%
workflow-execution: DOM nodes 119 119 +0% z=-5.9
workflow-execution: event listeners 67 50 -25% z=-0.4
Historical variance (last 15 runs)
Metric μ σ CV
canvas-idle: avg frame time 17ms 0ms 0.0%
canvas-idle: layout duration 0ms 0ms 0.0%
canvas-idle: style recalc duration 11ms 1ms 8.2%
canvas-idle: layout count 0 0 0.0%
canvas-idle: style recalc count 11 1 5.0%
canvas-idle: task duration 395ms 31ms 7.9%
canvas-idle: script duration 25ms 2ms 8.8%
canvas-idle: TBT 0ms 0ms 0.0%
canvas-idle: DOM nodes 23 1 5.6%
canvas-idle: event listeners 12 5 40.9%
canvas-mouse-sweep: avg frame time 17ms 0ms 0.0%
canvas-mouse-sweep: layout duration 4ms 0ms 5.4%
canvas-mouse-sweep: style recalc duration 43ms 3ms 7.4%
canvas-mouse-sweep: layout count 12 0 0.0%
canvas-mouse-sweep: style recalc count 79 2 3.0%
canvas-mouse-sweep: task duration 865ms 58ms 6.7%
canvas-mouse-sweep: script duration 136ms 6ms 4.8%
canvas-mouse-sweep: TBT 0ms 0ms 0.0%
canvas-mouse-sweep: DOM nodes 62 3 4.2%
canvas-mouse-sweep: event listeners 8 4 49.4%
canvas-zoom-sweep: avg frame time 17ms 0ms 0.0%
canvas-zoom-sweep: layout duration 1ms 0ms 7.0%
canvas-zoom-sweep: style recalc duration 19ms 2ms 8.0%
canvas-zoom-sweep: layout count 6 0 0.0%
canvas-zoom-sweep: style recalc count 31 0 1.5%
canvas-zoom-sweep: task duration 327ms 23ms 7.1%
canvas-zoom-sweep: script duration 27ms 3ms 11.1%
canvas-zoom-sweep: TBT 0ms 0ms 0.0%
canvas-zoom-sweep: DOM nodes 79 1 1.0%
canvas-zoom-sweep: event listeners 24 5 21.8%
dom-widget-clipping: avg frame time 17ms 0ms 0.0%
dom-widget-clipping: layout duration 0ms 0ms 0.0%
dom-widget-clipping: style recalc duration 10ms 1ms 8.0%
dom-widget-clipping: layout count 0 0 0.0%
dom-widget-clipping: style recalc count 13 0 3.8%
dom-widget-clipping: task duration 365ms 16ms 4.5%
dom-widget-clipping: script duration 68ms 3ms 4.8%
dom-widget-clipping: TBT 0ms 0ms 0.0%
dom-widget-clipping: DOM nodes 22 1 6.4%
dom-widget-clipping: event listeners 8 6 81.2%
large-graph-idle: avg frame time 17ms 0ms 0.0%
large-graph-idle: layout duration 0ms 0ms 0.0%
large-graph-idle: style recalc duration 12ms 1ms 8.6%
large-graph-idle: layout count 0 0 0.0%
large-graph-idle: style recalc count 12 0 2.7%
large-graph-idle: task duration 542ms 54ms 10.0%
large-graph-idle: script duration 102ms 11ms 10.3%
large-graph-idle: TBT 0ms 0ms 0.0%
large-graph-idle: DOM nodes 25 1 3.7%
large-graph-idle: event listeners 26 6 23.2%
large-graph-pan: avg frame time 17ms 0ms 0.0%
large-graph-pan: layout duration 0ms 0ms 0.0%
large-graph-pan: style recalc duration 17ms 1ms 4.6%
large-graph-pan: layout count 0 0 0.0%
large-graph-pan: style recalc count 70 1 0.9%
large-graph-pan: task duration 1082ms 43ms 4.0%
large-graph-pan: script duration 408ms 20ms 4.8%
large-graph-pan: TBT 0ms 0ms 0.0%
large-graph-pan: DOM nodes 19 2 8.7%
large-graph-pan: event listeners 5 1 16.8%
minimap-idle: avg frame time 17ms 0ms 0.0%
minimap-idle: layout duration 0ms 0ms 0.0%
minimap-idle: style recalc duration 10ms 1ms 8.6%
minimap-idle: layout count 0 0 0.0%
minimap-idle: style recalc count 10 1 7.1%
minimap-idle: task duration 527ms 47ms 9.0%
minimap-idle: script duration 98ms 10ms 10.1%
minimap-idle: TBT 0ms 0ms 0.0%
minimap-idle: DOM nodes 19 1 7.1%
minimap-idle: event listeners 5 1 14.4%
subgraph-dom-widget-clipping: avg frame time 17ms 0ms 0.0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms 0.0%
subgraph-dom-widget-clipping: style recalc duration 13ms 1ms 7.4%
subgraph-dom-widget-clipping: layout count 0 0 0.0%
subgraph-dom-widget-clipping: style recalc count 48 1 1.2%
subgraph-dom-widget-clipping: task duration 378ms 18ms 4.9%
subgraph-dom-widget-clipping: script duration 128ms 6ms 4.9%
subgraph-dom-widget-clipping: TBT 0ms 0ms 0.0%
subgraph-dom-widget-clipping: DOM nodes 22 1 5.0%
subgraph-dom-widget-clipping: event listeners 16 6 36.0%
subgraph-idle: avg frame time 17ms 0ms 0.0%
subgraph-idle: layout duration 0ms 0ms 0.0%
subgraph-idle: style recalc duration 10ms 1ms 7.5%
subgraph-idle: layout count 0 0 0.0%
subgraph-idle: style recalc count 11 1 6.0%
subgraph-idle: task duration 370ms 31ms 8.5%
subgraph-idle: script duration 20ms 3ms 13.2%
subgraph-idle: TBT 0ms 0ms 0.0%
subgraph-idle: DOM nodes 22 1 6.9%
subgraph-idle: event listeners 10 7 64.5%
subgraph-mouse-sweep: avg frame time 17ms 0ms 0.0%
subgraph-mouse-sweep: layout duration 5ms 0ms 6.8%
subgraph-mouse-sweep: style recalc duration 42ms 3ms 7.8%
subgraph-mouse-sweep: layout count 16 0 0.0%
subgraph-mouse-sweep: style recalc count 80 2 2.4%
subgraph-mouse-sweep: task duration 766ms 69ms 9.0%
subgraph-mouse-sweep: script duration 101ms 7ms 6.5%
subgraph-mouse-sweep: TBT 0ms 0ms 0.0%
subgraph-mouse-sweep: DOM nodes 67 2 3.3%
subgraph-mouse-sweep: event listeners 8 4 52.6%
workflow-execution: avg frame time 17ms 0ms 0.0%
workflow-execution: layout duration 2ms 0ms 9.4%
workflow-execution: style recalc duration 24ms 2ms 9.1%
workflow-execution: layout count 5 1 11.0%
workflow-execution: style recalc count 18 2 11.5%
workflow-execution: task duration 123ms 11ms 8.8%
workflow-execution: script duration 29ms 3ms 10.2%
workflow-execution: TBT 0ms 0ms 0.0%
workflow-execution: DOM nodes 161 7 4.4%
workflow-execution: event listeners 52 4 8.4%
Trend (last 15 commits on main)
Metric Trend Dir Latest
canvas-idle: avg frame time ▆▃▆▁▆▃▆█▆▆▄▃▃▄▃ ➡️ 17ms
canvas-idle: p95 frame time ➡️ NaNms
canvas-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: style recalc duration ▇▇▆▆▃█▄▃▄▃▇▄▁▆▇ ➡️ 11ms
canvas-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
canvas-idle: style recalc count █▃▅▂▅▆▃▁▂▁▂▅▆▅▆ ➡️ 12
canvas-idle: task duration ▃▃▃▆▂▃▃▅▆▂█▃▁▃▃ ➡️ 391ms
canvas-idle: script duration ▄▃▅▇▂▅▃▆▇▅█▄▁▅▆ ➡️ 27ms
canvas-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: heap used ➡️ NaN MB
canvas-idle: DOM nodes █▇▆▅▃▇▃▁▂▂▅▆▆▆▇ ➡️ 24
canvas-idle: event listeners ▅█▅▄▁▅▁▁▁▄▅▅▁▅▄ 📉 11
canvas-mouse-sweep: avg frame time ▆█▆▃▁▃▁▆▆▁▃▆▆▃▃ ➡️ 17ms
canvas-mouse-sweep: p95 frame time ➡️ NaNms
canvas-mouse-sweep: layout duration ▁▃▂▄▁▂▁▃▆▂█▇▆▄▃ ➡️ 4ms
canvas-mouse-sweep: style recalc duration ▄▄▂▄▁▂▃▃▅▄█▆▂▄▄ ➡️ 43ms
canvas-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 12
canvas-mouse-sweep: style recalc count █▅▄▃▂▂▁▄▄▅▆▅▂▇▄ ➡️ 79
canvas-mouse-sweep: task duration █▆▄▂▂▃▂▄▄▅█▆▁▆▄ ➡️ 868ms
canvas-mouse-sweep: script duration ▄▅▄▆▄▆▆▆▅▅█▆▁▅▆ ➡️ 139ms
canvas-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-mouse-sweep: heap used ➡️ NaN MB
canvas-mouse-sweep: DOM nodes █▅▃▃▁▂▂▃▂▄▆▅▃▅▅ ➡️ 64
canvas-mouse-sweep: event listeners █▁▁▁▁▁▇▁▁▁██▇▁█ 📈 13
canvas-zoom-sweep: avg frame time ▅▅█▄▅▁▁▁▅▁▁▅▄▅▁ ➡️ 17ms
canvas-zoom-sweep: p95 frame time ➡️ NaNms
canvas-zoom-sweep: layout duration ▆▅▅▄▁▁█▅▃▅▇▆▁▂▆ ➡️ 1ms
canvas-zoom-sweep: style recalc duration ▆▅▄▆▅▃█▆▇▅▇▄▁▃▅ ➡️ 20ms
canvas-zoom-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 6
canvas-zoom-sweep: style recalc count ▁▁▃▄▆▃▆█▄▄▆▁▆▁▆ ➡️ 32
canvas-zoom-sweep: task duration ▄▂▁▇▂▂▄▅▆▃█▄▁▁▅ ➡️ 338ms
canvas-zoom-sweep: script duration ▃▃▂▇▂▂▅▇▆▅█▄▁▂▆ ➡️ 30ms
canvas-zoom-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-zoom-sweep: heap used ➡️ NaN MB
canvas-zoom-sweep: DOM nodes ▄▃▁▅█▁▃▆▄▅▅▃▃▄▃ ➡️ 79
canvas-zoom-sweep: event listeners ▁▁▂▅█▂▁▅▁▅▅▄▁▅▁ ➡️ 19
dom-widget-clipping: avg frame time ▂▄▅▅▂▄█▇▅▇▇▅▅▁▇ ➡️ 17ms
dom-widget-clipping: p95 frame time ➡️ NaNms
dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: style recalc duration ▆▆▂▆▄▃██▄▁▆▇▆▃▅ ➡️ 10ms
dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
dom-widget-clipping: style recalc count ▇█▅█▅▄█▇▇▁▇▄▇▂▅ ➡️ 13
dom-widget-clipping: task duration ▃▃▁▅▄▃▅▆▅▂▇█▁▅▅ ➡️ 371ms
dom-widget-clipping: script duration ▅▄▄▆▆▅▇▇▆▃█▇▁▇▇ ➡️ 71ms
dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: heap used ➡️ NaN MB
dom-widget-clipping: DOM nodes ▇▇▄▇▅▄█▇▅▁▅▄▇▃▄ ➡️ 21
dom-widget-clipping: event listeners ▅▅▅▅▁▅██▁▁▁▁█▁▁ 📉 2
large-graph-idle: avg frame time ▅▅▅▅▅▂▁▂▄▅▄▂▂▅█ ➡️ 17ms
large-graph-idle: p95 frame time ➡️ NaNms
large-graph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: style recalc duration ▅▅▅▆▄▅▃▄▅▅▆█▁▄▆ ➡️ 13ms
large-graph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-idle: style recalc count █▆█▃▃▁▃▆▃▆▆▃▆██ ➡️ 12
large-graph-idle: task duration ▂▃▂▆▂▃▃▇▅▃██▁▂▅ ➡️ 569ms
large-graph-idle: script duration ▄▅▄▆▄▅▅▇▆▅█▆▁▃▆ ➡️ 110ms
large-graph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: heap used ➡️ NaN MB
large-graph-idle: DOM nodes ▆█▅▂▅▃▁▂▃▅▅▆▂▆▅ ➡️ 25
large-graph-idle: event listeners ███▇██▄▁▄▇▇█▂█▇ ➡️ 29
large-graph-pan: avg frame time ▆▃▃▆█▃▁█▆▆▆▆█▁▆ ➡️ 17ms
large-graph-pan: p95 frame time ➡️ NaNms
large-graph-pan: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: style recalc duration ▃▂▄▄▁▅▂▂▁▄▄█▃▁▂ ➡️ 17ms
large-graph-pan: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-pan: style recalc count ▆▃█▂▃▂▂▂▁▇▅▃█▆▃ ➡️ 69
large-graph-pan: task duration ▄▃▄▆▄▄▄▆▄▄█▆▁▂▅ ➡️ 1100ms
large-graph-pan: script duration ▅▄▅▆▆▅▄▆▄▅█▄▁▄▅ ➡️ 413ms
large-graph-pan: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: heap used ➡️ NaN MB
large-graph-pan: DOM nodes ▅▃▆▂▄▁▃▁▁▅▁▂█▅▂ ➡️ 18
large-graph-pan: event listeners █▆█▁▁▆▁▁▃▆▁▃██▃ ➡️ 5
minimap-idle: avg frame time ▃▆▆▃█▁█▆▆▃▃▆█▆█ ➡️ 17ms
minimap-idle: p95 frame time ➡️ NaNms
minimap-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: style recalc duration ▄█▁█▅▅█▅▅▃▅▁▁▄▆ ➡️ 10ms
minimap-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
minimap-idle: style recalc count ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 9
minimap-idle: task duration ▃▄▁▅▁▃▄▅▇▃█▅▁▁▅ ➡️ 547ms
minimap-idle: script duration ▄▆▃▇▃▅▆▆▇▅█▅▁▃▆ ➡️ 106ms
minimap-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: heap used ➡️ NaN MB
minimap-idle: DOM nodes ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 19
minimap-idle: event listeners ▃▃▆▁▁▁▃▁▁▆▁▃█▆▁ ➡️ 4
subgraph-dom-widget-clipping: avg frame time ▅▄▄▄▄▄█▄▄▄▃▁▆▃▃ ➡️ 17ms
subgraph-dom-widget-clipping: p95 frame time ➡️ NaNms
subgraph-dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: style recalc duration ▂▄▃▅▅▃▂▅▇▃▄█▁▄▆ ➡️ 14ms
subgraph-dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-dom-widget-clipping: style recalc count ▇█▆▃▆▃▁▆█▇▃▆▇█▅ ➡️ 48
subgraph-dom-widget-clipping: task duration ▂▃▃▆▅▅▂▅█▂▆█▁▂▇ ➡️ 398ms
subgraph-dom-widget-clipping: script duration ▃▃▃▄▅▅▂▄█▂▅▇▁▂▅ ➡️ 131ms
subgraph-dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: heap used ➡️ NaN MB
subgraph-dom-widget-clipping: DOM nodes ▅▇▅▂▅▂▁▅▅▅▁▇▅█▄ ➡️ 22
subgraph-dom-widget-clipping: event listeners ▅▅▅▂▅▁▅██▁▁█▅█▅ 📈 16
subgraph-idle: avg frame time ▆▆█▁▆▃▆▆▆▃▆▁▃▆█ ➡️ 17ms
subgraph-idle: p95 frame time ➡️ NaNms
subgraph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: style recalc duration ▁▇▃▆▂▄▂▃▃▆▆▄▃▇█ ➡️ 12ms
subgraph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-idle: style recalc count ▃▆▃▃▂▅▁▂▁▆▃▃██▇ ➡️ 12
subgraph-idle: task duration ▁▃▁▇▁▁▃▆▅▂█▅▁▁▄ ➡️ 378ms
subgraph-idle: script duration ▁▃▂▇▁▂▃▇▆▂█▅▂▁▅ ➡️ 22ms
subgraph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: heap used ➡️ NaN MB
subgraph-idle: DOM nodes ▃▅▃▂▁▄▁▂▁▅▃▂▇█▇ ➡️ 24
subgraph-idle: event listeners ▁▅▁▁▁▁▁▁▁▅▄▁███ 📈 21
subgraph-mouse-sweep: avg frame time ▅▄▁▃▃▄▆▄▆▃▃█▁▃▃ ➡️ 17ms
subgraph-mouse-sweep: p95 frame time ➡️ NaNms
subgraph-mouse-sweep: layout duration ▁▄▄▄▃▃▅▅▅▂█▇▂▃▆ ➡️ 5ms
subgraph-mouse-sweep: style recalc duration ▃▂▄▅▂▃▄▅█▃█▆▁▂▅ ➡️ 43ms
subgraph-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 16
subgraph-mouse-sweep: style recalc count ▅▂▅▅▁▄▃▅█▅▆▄▂▄▅ ➡️ 81
subgraph-mouse-sweep: task duration ▃▂▄▅▂▄▄▅▇▄█▆▁▃▅ ➡️ 785ms
subgraph-mouse-sweep: script duration ▄▅▄▇▅▅▆▇▆▅██▁▄▆ ➡️ 105ms
subgraph-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-mouse-sweep: heap used ➡️ NaN MB
subgraph-mouse-sweep: DOM nodes ▅▁▄▅▁▄▃▃█▅▅▄▂▅▃ ➡️ 66
subgraph-mouse-sweep: event listeners ▇▁▂▇▁▂▂▂█▇▂▂▇▇▂ 📈 5
workflow-execution: avg frame time ▆▆▆▄▆▆▃▄▁▄█▆▅▄▆ ➡️ 17ms
workflow-execution: p95 frame time ➡️ NaNms
workflow-execution: layout duration ▁▆▁▃▂▄▃▂▃▃▅█▄▂▅ ➡️ 2ms
workflow-execution: style recalc duration ▃▇▅▇▁▅▆▇█▁██▂▄▆ ➡️ 25ms
workflow-execution: layout count ▁█▂▃▂▃▃▁▃▃▄▃▂▃▂ ➡️ 5
workflow-execution: style recalc count ▃█▅▇▁▄▅▆▅▅▅▅▄▄▂ ➡️ 15
workflow-execution: task duration ▂▅▄▅▁▄▆▆▆▁▇█▁▃▃ ➡️ 120ms
workflow-execution: script duration ▄▃▄▄▃▅▄▅▆▂▇█▁▃▄ ➡️ 29ms
workflow-execution: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
workflow-execution: heap used ➡️ NaN MB
workflow-execution: DOM nodes ▂█▃▆▁▄▃▅▃█▃▃▄▃▁ ➡️ 152
workflow-execution: event listeners ▅███▁▅███▁██▅█▅ ➡️ 49
Raw data
{
  "timestamp": "2026-07-30T17:25:07.762Z",
  "gitSha": "ae2818682a511c6be2a659249bc212dd14485f3a",
  "branch": "agent/fix-billing-timeout-retry",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2136.799999999994,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.003999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 571.4789999999999,
      "heapDeltaBytes": 5157464,
      "heapUsedBytes": 73022848,
      "domNodes": 18,
      "jsHeapTotalBytes": 20312064,
      "scriptDurationMs": 26.102999999999998,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-idle",
      "durationMs": 2017.9099999999153,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.244000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 469.32699999999994,
      "heapDeltaBytes": 5217328,
      "heapUsedBytes": 73178100,
      "domNodes": 16,
      "jsHeapTotalBytes": 20049920,
      "scriptDurationMs": 17.189000000000004,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2052.180999999962,
      "styleRecalcs": 81,
      "styleRecalcDurationMs": 45.54600000000001,
      "layouts": 12,
      "layoutDurationMs": 3.9440000000000004,
      "taskDurationMs": 982.035,
      "heapDeltaBytes": -14601588,
      "heapUsedBytes": 53364660,
      "domNodes": -278,
      "jsHeapTotalBytes": 21487616,
      "scriptDurationMs": 121.09100000000001,
      "eventListeners": -146,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1889.9020000000064,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 39.219,
      "layouts": 12,
      "layoutDurationMs": 3.673,
      "taskDurationMs": 911.865,
      "heapDeltaBytes": -15389232,
      "heapUsedBytes": 52502204,
      "domNodes": -281,
      "jsHeapTotalBytes": 20963328,
      "scriptDurationMs": 118.411,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1745.065000000011,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 15.503,
      "layouts": 6,
      "layoutDurationMs": 0.6399999999999999,
      "taskDurationMs": 367.918,
      "heapDeltaBytes": 7896280,
      "heapUsedBytes": 75759164,
      "domNodes": 76,
      "jsHeapTotalBytes": 20836352,
      "scriptDurationMs": 18.015000000000004,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1737.790999999902,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 17.403000000000002,
      "layouts": 6,
      "layoutDurationMs": 0.593,
      "taskDurationMs": 394.622,
      "heapDeltaBytes": 7932848,
      "heapUsedBytes": 75699344,
      "domNodes": 77,
      "jsHeapTotalBytes": 20049920,
      "scriptDurationMs": 21.086000000000002,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 578.1509999999912,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.078,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 382.14599999999996,
      "heapDeltaBytes": -11951960,
      "heapUsedBytes": 55818492,
      "domNodes": 18,
      "jsHeapTotalBytes": 22147072,
      "scriptDurationMs": 57.214,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666682,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 591.2159999999176,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 8.322000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 383.164,
      "heapDeltaBytes": -12265516,
      "heapUsedBytes": 55710816,
      "domNodes": 20,
      "jsHeapTotalBytes": 21884928,
      "scriptDurationMs": 58.015,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2035.7779999999934,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 6.533999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 687.127,
      "heapDeltaBytes": 7769420,
      "heapUsedBytes": 66639660,
      "domNodes": -282,
      "jsHeapTotalBytes": 4780032,
      "scriptDurationMs": 100.38600000000001,
      "eventListeners": -144,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2052.353000000039,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 7.023999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 706.185,
      "heapDeltaBytes": 8476708,
      "heapUsedBytes": 67352592,
      "domNodes": -283,
      "jsHeapTotalBytes": 4780032,
      "scriptDurationMs": 108.74,
      "eventListeners": -142,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2141.1959999999794,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 14.726000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1285.702,
      "heapDeltaBytes": 2182232,
      "heapUsedBytes": 61960920,
      "domNodes": -284,
      "jsHeapTotalBytes": 5529600,
      "scriptDurationMs": 411.169,
      "eventListeners": -142,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2180.894999999964,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 15.923000000000004,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1333.7930000000001,
      "heapDeltaBytes": 5196980,
      "heapUsedBytes": 65808276,
      "domNodes": -285,
      "jsHeapTotalBytes": 5791744,
      "scriptDurationMs": 436.732,
      "eventListeners": -144,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3230.3929999999923,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 14.895999999999999,
      "layouts": 60,
      "layoutDurationMs": 8.005,
      "taskDurationMs": 1504.1799999999998,
      "heapDeltaBytes": -591724,
      "heapUsedBytes": 60813308,
      "domNodes": -287,
      "jsHeapTotalBytes": 8450048,
      "scriptDurationMs": 533.1210000000001,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3162.5020000000177,
      "styleRecalcs": 62,
      "styleRecalcDurationMs": 13.734,
      "layouts": 60,
      "layoutDurationMs": 8.593,
      "taskDurationMs": 1533.8590000000002,
      "heapDeltaBytes": 23679340,
      "heapUsedBytes": 85327436,
      "domNodes": 6,
      "jsHeapTotalBytes": 8650752,
      "scriptDurationMs": 548.504,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2018.4129999999527,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 6.215999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 669.293,
      "heapDeltaBytes": 7945668,
      "heapUsedBytes": 68830320,
      "domNodes": -282,
      "jsHeapTotalBytes": 3469312,
      "scriptDurationMs": 95.05799999999999,
      "eventListeners": -144,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "minimap-idle",
      "durationMs": 2037.5159999999823,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.637999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 706.2069999999999,
      "heapDeltaBytes": 8284992,
      "heapUsedBytes": 69219588,
      "domNodes": -284,
      "jsHeapTotalBytes": 3993600,
      "scriptDurationMs": 107.682,
      "eventListeners": -144,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 610.3560000000243,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 11.232000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 423.77000000000004,
      "heapDeltaBytes": -12096216,
      "heapUsedBytes": 55784404,
      "domNodes": 20,
      "jsHeapTotalBytes": 21884928,
      "scriptDurationMs": 126.90299999999999,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 610.6889999999794,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 11.556000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 411.112,
      "heapDeltaBytes": -11521340,
      "heapUsedBytes": 56580740,
      "domNodes": 22,
      "jsHeapTotalBytes": 21884928,
      "scriptDurationMs": 126.26700000000002,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2047.0659999999725,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.079999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 504.8279999999999,
      "heapDeltaBytes": -22177892,
      "heapUsedBytes": 45820404,
      "domNodes": -279,
      "jsHeapTotalBytes": 20439040,
      "scriptDurationMs": 13.698,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2031.1719999999696,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.306,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 486.611,
      "heapDeltaBytes": 4603192,
      "heapUsedBytes": 72517724,
      "domNodes": 18,
      "jsHeapTotalBytes": 21098496,
      "scriptDurationMs": 13.85,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1703.7970000000087,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 36.111,
      "layouts": 16,
      "layoutDurationMs": 4.557,
      "taskDurationMs": 745.56,
      "heapDeltaBytes": -4808980,
      "heapUsedBytes": 63087196,
      "domNodes": 64,
      "jsHeapTotalBytes": 21360640,
      "scriptDurationMs": 86.01,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1790.6490000000304,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 42.922999999999995,
      "layouts": 16,
      "layoutDurationMs": 4.883,
      "taskDurationMs": 880.229,
      "heapDeltaBytes": -19677636,
      "heapUsedBytes": 48178816,
      "domNodes": -278,
      "jsHeapTotalBytes": 20439040,
      "scriptDurationMs": 97.815,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1384.2109999999934,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 30.068000000000005,
      "layouts": 15,
      "layoutDurationMs": 11.720999999999998,
      "taskDurationMs": 941.7959999999998,
      "heapDeltaBytes": 29184612,
      "heapUsedBytes": 98601244,
      "domNodes": 13673,
      "jsHeapTotalBytes": 16252928,
      "scriptDurationMs": 43.681,
      "eventListeners": 2371,
      "totalBlockingTimeMs": 121,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8295.211999999992,
      "styleRecalcs": 250,
      "styleRecalcDurationMs": 42.198,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4392.768,
      "heapDeltaBytes": 11043676,
      "heapUsedBytes": 69737612,
      "domNodes": -280,
      "jsHeapTotalBytes": 7856128,
      "scriptDurationMs": 1338.9489999999998,
      "eventListeners": -128,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8333.378000000039,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 43.068999999999996,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4792.182,
      "heapDeltaBytes": 15276892,
      "heapUsedBytes": 74103360,
      "domNodes": -283,
      "jsHeapTotalBytes": 9428992,
      "scriptDurationMs": 1491.412,
      "eventListeners": -128,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 17805.812,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 17748.926,
      "heapDeltaBytes": -36935060,
      "heapUsedBytes": 171269076,
      "domNodes": -8312,
      "jsHeapTotalBytes": -9641984,
      "scriptDurationMs": 592.957,
      "eventListeners": -16385,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.333333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 17809.683000000063,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 17788.139000000003,
      "heapDeltaBytes": -57672892,
      "heapUsedBytes": 165927516,
      "domNodes": -8312,
      "jsHeapTotalBytes": -15671296,
      "scriptDurationMs": 527.2320000000001,
      "eventListeners": -16385,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 18.333333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 22095.260999999995,
      "styleRecalcs": 161,
      "styleRecalcDurationMs": 23.218000000000018,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 22071.088,
      "heapDeltaBytes": -49245436,
      "heapUsedBytes": 179946052,
      "domNodes": -8312,
      "jsHeapTotalBytes": -12853248,
      "scriptDurationMs": 867.2159999999999,
      "eventListeners": -16381,
      "totalBlockingTimeMs": 516,
      "frameDurationMs": 18.333333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 21985.795999999937,
      "styleRecalcs": 150,
      "styleRecalcDurationMs": 21.47099999999996,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 21950.795,
      "heapDeltaBytes": -49503856,
      "heapUsedBytes": 177001056,
      "domNodes": -8312,
      "jsHeapTotalBytes": -12066816,
      "scriptDurationMs": 884.4429999999999,
      "eventListeners": -16383,
      "totalBlockingTimeMs": 399,
      "frameDurationMs": 18.886666666666617,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 457.416999999964,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 19.102,
      "layouts": 3,
      "layoutDurationMs": 0.7129999999999999,
      "taskDurationMs": 121.192,
      "heapDeltaBytes": -15912296,
      "heapUsedBytes": 51147556,
      "domNodes": 130,
      "jsHeapTotalBytes": 7729152,
      "scriptDurationMs": 10.262,
      "eventListeners": 67,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 117.8620000000592,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 12.5,
      "layouts": 2,
      "layoutDurationMs": 0.6569999999999998,
      "taskDurationMs": 73.037,
      "heapDeltaBytes": 3021772,
      "heapUsedBytes": 69905540,
      "domNodes": 108,
      "jsHeapTotalBytes": 3145728,
      "scriptDurationMs": 5.871999999999999,
      "eventListeners": 33,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666682,
      "p95FrameDurationMs": 16.700000000000728
    }
  ]
}

@coderabbitai

coderabbitai Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Timed-out billing operations are cleared before restart instead of being reused. Store and browser tests verify subscription retries recreate polling, return to pending, and display the verification state.

Changes

Billing operation timeout restart

Layer / File(s) Summary
Restart timed-out operations
src/platform/workspace/stores/billingOperationStore.ts, src/platform/workspace/stores/billingOperationStore.test.ts
startOperation clears existing operations in the timeout state, and subscription polling coverage verifies restart and successful completion.
Verify subscription retry flow
browser_tests/tests/dialogs/pricingTableDeepLink.spec.ts
Billing fixtures and a deep-link browser test verify additional subscription and polling requests after timeout, followed by the “Complete verification” UI.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Suggested reviewers: austinmroz

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant PricingDialog
  participant BillingOperationStore
  participant BillingAPI
  User->>PricingDialog: Re-click subscribe after timeout
  PricingDialog->>BillingOperationStore: Start subscription operation
  BillingOperationStore->>BillingAPI: Create subscription
  BillingAPI-->>BillingOperationStore: Pending operation
  BillingOperationStore->>BillingAPI: Poll operation status
  BillingAPI-->>BillingOperationStore: Verification-required status
  BillingOperationStore-->>PricingDialog: Show Complete verification
Loading

Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
End-To-End Regression Coverage For Fixes ❓ Inconclusive Commit subjects/title weren’t provided, so the bug-fix signal in condition 1 can’t be verified from the PR metadata alone. Please provide the PR title or commit subjects so I can verify whether the bug-fix language criterion applies.
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Adr Compliance For Entity/Litegraph Changes ✅ Passed Changed files are billing-operation/store and browser test code, not src/lib/litegraph/, src/ecs/, or graph-entity files, so ADR 0003/0008 checks don’t apply.
Title check ✅ Passed The title clearly states the main behavioral fix: restarting timed-out billing operations.
Description check ✅ Passed The description is thorough and covers motivation, root cause, behavior change, tests, and review focus, with only minor template mismatch.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch agent/fix-billing-timeout-retry

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

❤️ Share

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

coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 30, 2026
@codecov

codecov Bot commented Jul 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@            Coverage Diff             @@
##             main   #14396      +/-   ##
==========================================
+ Coverage   79.15%   79.31%   +0.15%     
==========================================
  Files        1761     1761              
  Lines      106143   104154    -1989     
  Branches    35178    34684     -494     
==========================================
- Hits        84015    82606    -1409     
+ Misses      21664    21101     -563     
+ Partials      464      447      -17     
Flag Coverage Δ
unit 69.68% <100.00%> (+<0.01%) ⬆️

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

Files with missing lines Coverage Δ
...platform/workspace/stores/billingOperationStore.ts 96.78% <100.00%> (+34.47%) ⬆️

... and 45 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@huang47 huang47 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I don't see concerns in this PR, however, overall I would advocate to have a state machine to manage states and it's transitions

@dante01yoon dante01yoon added needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch core/1.48 labels Jul 30, 2026
@dante01yoon
dante01yoon added this pull request to the merge queue Jul 30, 2026
Merged via the queue into main with commit 540e9f8 Jul 30, 2026
85 checks passed
@dante01yoon
dante01yoon deleted the agent/fix-billing-timeout-retry branch July 30, 2026 20:13
@comfy-pr-bot

Copy link
Copy Markdown
Member

@dante01yoon Successfully backported to #14408

@comfy-pr-bot

Copy link
Copy Markdown
Member

@dante01yoon Successfully backported to #14409

@github-actions github-actions Bot removed the needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch label Jul 30, 2026
comfy-pr-bot added a commit that referenced this pull request Jul 30, 2026
Backport of #14396 to `core/1.48`

Automatically created by backport workflow.

Co-authored-by: Dante <bunggl@naver.com>
Co-authored-by: dante01yoon <6510430+dante01yoon@users.noreply.github.com>
Co-authored-by: Amp <amp@ampcode.com>

@CodeJuggernaut CodeJuggernaut left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Two minor E2E test issues below; the production fix looks correct.

test('restores pending checkout when retrying a timed-out operation', async ({
page
}) => {
const subscribeRequests: Request[] = []

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Severity: Minor

What: This test declares its request trackers and performs its init script, cloud setup, and route registrations inside test().

Why this is an issue: The binding browser-test guidance requires mock setup and fixture arrangement in beforeEach or fixtures, with test bodies limited to act/assert. This couples stateful setup to the scenario and violates the repository’s required test structure.

Proposed Fix: Put this scenario in a nested test.describe and move the trackers and route setup into test.beforeEach or a custom fixture.

})
const backButton = page.getByRole('button', { name: 'Back', exact: true })
await cloudAppExpect(subscribeButton).toBeVisible()
await page.clock.install({ time: new Date('2026-07-30T00:00:00Z') })

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Severity: Minor

What: page.clock.install() runs after page.goto() and after the subscription UI renders.

Why this is an issue: Workspace boot has already used Date.now() and setTimeout() to schedule token refresh. Playwright documents this installation order as undefined behavior, so the timeout regression test has an avoidable reliability hole despite passing CI.

Proposed Fix: Move page.clock.install() immediately before page.goto(), after init scripts and route registration. Keep fastForward() where it is.

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

Labels

size:XS This PR changes 0-9 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants