Skip to content

fix: clear workflow status when an account precondition ends a run - #15161

Merged
christian-byrne merged 1 commit into
mainfrom
fix/clear-workflow-status-on-account-precondition-error
Aug 13, 2026
Merged

fix: clear workflow status when an account precondition ends a run#15161
christian-byrne merged 1 commit into
mainfrom
fix/clear-workflow-status-on-account-precondition-error

Conversation

@christian-byrne

Copy link
Copy Markdown
Contributor

Summary

A runtime credits refusal leaves the workflow's execution status stuck at running forever.

Changes

  • What: handleAccountPreconditionError in src/stores/executionStore.ts now clears the workflow's workflowStatus entry before resetting execution state.

Mechanism on main:

  • handleExecutionError calls handleAccountPreconditionError(e.detail) and returns early when it returns true. These errors (INSUFFICIENT_CREDITS / WORKSPACE_INSUFFICIENT_CREDITS, routed via resolveAccountPrecondition) open their own modal and are deliberately kept out of the error panel and error count.
  • handleAccountPreconditionError only called clearInitializationByJobId then resetExecutionState.
  • resetExecutionState deletes queuedJobs[jobId] and the jobIdToWorkflow entry, but never touches workflowStatus.

These are runtime errors: the job was accepted, got a machine, and execution_start already wrote running before the refusal arrives. So the status map keeps running indefinitely, and every reader of getWorkflowStatus (status badges, the first-run tour result card) promises a result that will never arrive.

handleExecutionInterrupted already does the right thing and is the precedent this copies. Ordering matters: the jobIdToWorkflow lookup and status clear must happen before resetExecutionState, which deletes that mapping.

Review Focus

  • Clearing rather than writing failed is intentional and matches the interrupt path — an account precondition is a gating state with its own modal, not a workflow failure, so it should leave no badge.
  • Sibling early-return branches (handleServiceLevelError, handleCloudValidationError) were left alone. Service-level errors have an existing test asserting the status stays running, so changing that is a separate decision.
  • Unit test added in src/stores/executionStore.test.ts: paid-style credits payload after execution_start, asserting the status goes from running to cleared. Verified it fails on main (expected 'running' to be undefined) and passes with the fix.

Found while reviewing #15091. Distinct from #14619, which covers the submit-time refusal where no prompt_id is ever issued and the status never passes through running at all; this is the accepted-then-refused runtime path.

A runtime INSUFFICIENT_CREDITS / WORKSPACE_INSUFFICIENT_CREDITS error is
routed to its own modal and returns early from handleExecutionError, so
the workflow's entry in workflowStatus keeps the 'running' value written
by execution_start. resetExecutionState drops queuedJobs and
jobIdToWorkflow but never touches workflowStatus, leaving every reader of
getWorkflowStatus promising a result that will never arrive.

Clear the status before resetExecutionState drops the jobId -> workflow
mapping, matching handleExecutionInterrupted.
@christian-byrne
christian-byrne requested a review from a team August 12, 2026 22:39
@dosubot dosubot Bot added the size:XS This PR changes 0-9 lines, ignoring generated files. label Aug 12, 2026
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: f40fc52b-5d3e-4a41-a8b7-67ae0b2ff8dc

📥 Commits

Reviewing files that changed from the base of the PR and between c4f9b91 and 28f2c23.

📒 Files selected for processing (2)
  • src/stores/executionStore.test.ts
  • src/stores/executionStore.ts

📝 Walkthrough

Walkthrough

The execution store now clears a workflow’s running status when an account-precondition error occurs. A test verifies this behavior for InsufficientFundsError.

Changes

Workflow status cleanup

Layer / File(s) Summary
Account-precondition status reset
src/stores/executionStore.ts, src/stores/executionStore.test.ts
handleAccountPreconditionError clears the registered workflow status before resetting execution state. The test verifies that InsufficientFundsError changes a started workflow from running to no status.

Estimated code review effort: 1 (Trivial) | ~5 minutes

Mergeability Score: ⚪ Minimal · up to 28f2c

The change clears stale workflow status when an account precondition ends an accepted run and includes a focused regression test; no actionable merge-blocking risk remains beyond normal checks and review.

Suggested reviewers: drjkl


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 are not available in the review context, so the required bug-fix signal cannot be verified under this check. Provide the PR title and all commit subjects, plus the complete base...head changed-file list, to determine whether the check fails.
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the primary fix: clearing workflow status after an account precondition ends a run.
Description check ✅ Passed The description includes the required summary, changes, review focus, rationale, edge cases, and test coverage.
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 The changed files are executionStore.ts and executionStore.test.ts. Neither path is under litegraph, ecs, nor graph-entity files, so this check does not apply.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/clear-workflow-status-on-account-precondition-error

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

@github-actions

github-actions Bot commented Aug 12, 2026

Copy link
Copy Markdown

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

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

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 08/12/2026, 10:41:13 PM UTC

Links

📦 Bundle: 8.71 MB gzip 🔴 +7 B

Details

Summary

  • Raw size: 36.8 MB baseline 36.8 MB — 🔴 +105 B
  • Gzip: 8.71 MB baseline 8.71 MB — 🔴 +7 B
  • Brotli: 6.07 MB baseline 6.07 MB — 🔴 +221 B
  • Bundles: 436 current • 436 baseline • 145 added / 145 removed

Category Glance
Data & Services 🔴 +105 B (3.51 MB) · Vendor & Third-Party ⚪ 0 B (16.3 MB) · Other ⚪ 0 B (14.1 MB) · Graph Workspace ⚪ 0 B (1.36 MB) · Panels & Settings ⚪ 0 B (565 kB) · Utilities & Hooks ⚪ 0 B (550 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CDYtJxFU.js (removed) 3.67 kB 🟢 -3.67 kB 🟢 -1.84 kB 🟢 -1.59 kB
assets/index-DadZl-Bw.js (new) 3.67 kB 🔴 +3.67 kB 🔴 +1.83 kB 🔴 +1.59 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-1_oBwOhi.js (new) 1.36 MB 🔴 +1.36 MB 🔴 +295 kB 🔴 +222 kB
assets/GraphView-DY95StYd.js (removed) 1.36 MB 🟢 -1.36 MB 🟢 -295 kB 🟢 -222 kB
assets/WidgetCompositor-BtBSx3Zx.js (new) 8.17 kB 🔴 +8.17 kB 🔴 +2.76 kB 🔴 +2.46 kB
assets/WidgetCompositor-CkNujlmR.js (removed) 8.17 kB 🟢 -8.17 kB 🟢 -2.76 kB 🟢 -2.45 kB

Status: 2 added / 2 removed / 1 unchanged

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BBL5isVr.js (removed) 25 kB 🟢 -25 kB 🟢 -6.24 kB 🟢 -5.52 kB
assets/CloudSurveyView-DNIXXVCN.js (new) 25 kB 🔴 +25 kB 🔴 +6.25 kB 🔴 +5.52 kB
assets/CloudLayoutView-C8Cmqd7W.js (removed) 21.8 kB 🟢 -21.8 kB 🟢 -6.57 kB 🟢 -5.74 kB
assets/CloudLayoutView-uZIT7qtU.js (new) 21.8 kB 🔴 +21.8 kB 🔴 +6.57 kB 🔴 +5.74 kB
assets/UserCheckView-BN1lTp-t.js (removed) 8.75 kB 🟢 -8.75 kB 🟢 -2.18 kB 🟢 -1.9 kB
assets/UserCheckView-D6BBZKO4.js (new) 8.75 kB 🔴 +8.75 kB 🔴 +2.19 kB 🔴 +1.91 kB
assets/CloudLoginView-CL87Qamh.js (removed) 8.74 kB 🟢 -8.74 kB 🟢 -2.55 kB 🟢 -2.25 kB
assets/CloudLoginView-vinvMU70.js (new) 8.74 kB 🔴 +8.74 kB 🔴 +2.55 kB 🔴 +2.25 kB
assets/useCloudAuthPage-C9W3AQ5y.js (removed) 7.08 kB 🟢 -7.08 kB 🟢 -2.52 kB 🟢 -2.21 kB
assets/useCloudAuthPage-CieIY_Xv.js (new) 7.08 kB 🔴 +7.08 kB 🔴 +2.52 kB 🔴 +2.2 kB
assets/CloudSignupView-CXKOpOIw.js (removed) 6.56 kB 🟢 -6.56 kB 🟢 -2.17 kB 🟢 -1.91 kB
assets/CloudSignupView-DMOIr0j1.js (new) 6.56 kB 🔴 +6.56 kB 🔴 +2.17 kB 🔴 +1.91 kB
assets/WidgetTextPreview-B9zzA6Dj.js (removed) 6.07 kB 🟢 -6.07 kB 🟢 -2.13 kB 🟢 -1.89 kB
assets/WidgetTextPreview-CaqRNM1v.js (new) 6.07 kB 🔴 +6.07 kB 🔴 +2.13 kB 🔴 +1.89 kB
assets/CloudSubscriptionRedirectView-CddO_46f.js (removed) 6.05 kB 🟢 -6.05 kB 🟢 -2.25 kB 🟢 -1.96 kB
assets/CloudSubscriptionRedirectView-DYGd2BTn.js (new) 6.05 kB 🔴 +6.05 kB 🔴 +2.25 kB 🔴 +1.96 kB
assets/UserSelectView-DtOy_38v.js (removed) 5.49 kB 🟢 -5.49 kB 🟢 -1.96 kB 🟢 -1.71 kB
assets/UserSelectView-gJvHIe79.js (new) 5.49 kB 🔴 +5.49 kB 🔴 +1.96 kB 🔴 +1.71 kB
assets/CloudForgotPasswordView-DlpACk7X.js (new) 4.97 kB 🔴 +4.97 kB 🔴 +1.73 kB 🔴 +1.49 kB
assets/CloudForgotPasswordView-DRvmDunk.js (removed) 4.97 kB 🟢 -4.97 kB 🟢 -1.73 kB 🟢 -1.49 kB
assets/CloudAuthTimeoutView-BgnZGy9X.js (removed) 4.43 kB 🟢 -4.43 kB 🟢 -1.54 kB 🟢 -1.34 kB
assets/CloudAuthTimeoutView-Cg9P8NNl.js (new) 4.43 kB 🔴 +4.43 kB 🔴 +1.54 kB 🔴 +1.34 kB
assets/OAuthLayoutView-B79Fj7Sg.js (removed) 1.31 kB 🟢 -1.31 kB 🟢 -703 B 🟢 -587 B
assets/OAuthLayoutView-C36akWmc.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +701 B 🔴 +587 B
assets/WidgetTextPreview-COnYZLTY.js (new) 131 B 🔴 +131 B 🔴 +100 B 🔴 +88 B
assets/WidgetTextPreview-Dl4xiBYV.js (removed) 131 B 🟢 -131 B 🟢 -100 B 🟢 -90 B

Status: 13 added / 13 removed / 4 unchanged

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-BUblEaTZ.js (new) 49.4 kB 🔴 +49.4 kB 🔴 +9.94 kB 🔴 +8.79 kB
assets/KeybindingPanel-DbbGQH0W.js (removed) 49.4 kB 🟢 -49.4 kB 🟢 -9.94 kB 🟢 -8.81 kB
assets/SecretsPanel-CH11pjM2.js (new) 33.7 kB 🔴 +33.7 kB 🔴 +7.87 kB 🔴 +6.9 kB
assets/SecretsPanel-CTuoI3DK.js (removed) 33.7 kB 🟢 -33.7 kB 🟢 -7.87 kB 🟢 -6.9 kB
assets/CreditsPanel-CezQuik2.js (new) 11.5 kB 🔴 +11.5 kB 🔴 +3.2 kB 🔴 +2.81 kB
assets/CreditsPanel-DhzJitmy.js (removed) 11.5 kB 🟢 -11.5 kB 🟢 -3.2 kB 🟢 -2.81 kB
assets/AboutPanel-2O-HWvqD.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.03 kB 🟢 -2.73 kB
assets/AboutPanel-BpT3nyzZ.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.03 kB 🔴 +2.73 kB
assets/ExtensionPanel-CvSD0Ldg.js (removed) 9.19 kB 🟢 -9.19 kB 🟢 -2.51 kB 🟢 -2.22 kB
assets/ExtensionPanel-ljnBuRPc.js (new) 9.19 kB 🔴 +9.19 kB 🔴 +2.51 kB 🔴 +2.22 kB
assets/ServerConfigPanel-BXAZUZHZ.js (removed) 6.09 kB 🟢 -6.09 kB 🟢 -1.94 kB 🟢 -1.72 kB
assets/ServerConfigPanel-D5KZ0dds.js (new) 6.09 kB 🔴 +6.09 kB 🔴 +1.94 kB 🔴 +1.72 kB
assets/UserPanel-Bho_6X_x.js (removed) 5.73 kB 🟢 -5.73 kB 🟢 -1.78 kB 🟢 -1.54 kB
assets/UserPanel-BzGznMPY.js (new) 5.73 kB 🔴 +5.73 kB 🔴 +1.78 kB 🔴 +1.54 kB
assets/refreshRemoteConfig-B8pFsNdo.js (new) 3.44 kB 🔴 +3.44 kB 🔴 +1.34 kB 🔴 +1.18 kB
assets/refreshRemoteConfig-DLADuF8e.js (removed) 3.44 kB 🟢 -3.44 kB 🟢 -1.33 kB 🟢 -1.17 kB
assets/cloudRemoteConfig-DNlsjsec.js (removed) 951 B 🟢 -951 B 🟢 -516 B 🟢 -421 B
assets/cloudRemoteConfig-Dzg2gbML.js (new) 951 B 🔴 +951 B 🔴 +514 B 🔴 +419 B
assets/refreshRemoteConfig-Cey3feRz.js (removed) 110 B 🟢 -110 B 🟢 -89 B 🟢 -93 B
assets/refreshRemoteConfig-CTNKaYyD.js (new) 110 B 🔴 +110 B 🔴 +89 B 🔴 +86 B

Status: 10 added / 10 removed / 16 unchanged

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SignUpForm-BxXTUMGw.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +4.32 kB 🔴 +3.76 kB
assets/SignUpForm-DCeNSI_C.js (removed) 12.8 kB 🟢 -12.8 kB 🟢 -4.32 kB 🟢 -3.76 kB
assets/auth-CvLAd2M0.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.29 kB 🔴 +1.1 kB
assets/auth-lU4OeHnV.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.29 kB 🟢 -1.1 kB
assets/UpdatePasswordContent-eJvAQ0Db.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +840 B 🔴 +735 B
assets/UpdatePasswordContent-MrE0EEJw.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -841 B 🟢 -731 B
assets/authStore-Bc41hg7b.js (new) 128 B 🔴 +128 B 🔴 +107 B 🔴 +101 B
assets/authStore-fbL9F35i.js (removed) 128 B 🟢 -128 B 🟢 -107 B 🟢 -103 B
assets/workspaceAuthStore-CRW_HesG.js (removed) 108 B 🟢 -108 B 🟢 -99 B 🟢 -111 B
assets/workspaceAuthStore-DDrupOAh.js (new) 108 B 🔴 +108 B 🔴 +99 B 🔴 +105 B
assets/auth-DzYiUdmi.js (new) 105 B 🔴 +105 B 🔴 +96 B 🔴 +89 B
assets/auth-j6XTpKNE.js (removed) 105 B 🟢 -105 B 🟢 -96 B 🟢 -87 B

Status: 6 added / 6 removed / 4 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-BxNwnJWB.js (new) 90.1 kB 🔴 +90.1 kB 🔴 +19.3 kB 🔴 +16.5 kB
assets/ComfyHubPublishDialog-DbBPCP9m.js (removed) 90.1 kB 🟢 -90.1 kB 🟢 -19.3 kB 🟢 -16.5 kB
assets/useShareDialog-B_n-tsOd.js (new) 23.9 kB 🔴 +23.9 kB 🔴 +5.69 kB 🔴 +5.03 kB
assets/useShareDialog-D2_0Bhd6.js (removed) 23.9 kB 🟢 -23.9 kB 🟢 -5.69 kB 🟢 -5.03 kB
assets/feedbackDialog-CBDj1Wun.js (new) 4.45 kB 🔴 +4.45 kB 🔴 +1.87 kB 🔴 +1.59 kB
assets/feedbackDialog-CqNyd-3G.js (removed) 4.45 kB 🟢 -4.45 kB 🟢 -1.87 kB 🟢 -1.59 kB
assets/useRangeEditor-CIhGjGAe.js (new) 3.29 kB 🔴 +3.29 kB 🔴 +1.14 kB 🔴 +1.03 kB
assets/useRangeEditor-N0LDhqLS.js (removed) 3.29 kB 🟢 -3.29 kB 🟢 -1.14 kB 🟢 -1.03 kB
assets/useLayerEditor-Ch1BswdE.js (new) 1.01 kB 🔴 +1.01 kB 🔴 +491 B 🔴 +407 B
assets/useLayerEditor-TRVcT5E3.js (removed) 1.01 kB 🟢 -1.01 kB 🟢 -492 B 🟢 -408 B
assets/ComfyHubPublishDialog-5zXMoxUK.js (removed) 143 B 🟢 -143 B 🟢 -105 B 🟢 -89 B
assets/ComfyHubPublishDialog-CuY-ePai.js (new) 143 B 🔴 +143 B 🔴 +105 B 🔴 +91 B
assets/useSubscriptionDialog-D0xCEzQL.js (removed) 108 B 🟢 -108 B 🟢 -102 B 🟢 -85 B
assets/useSubscriptionDialog-n7CvSP4c.js (new) 108 B 🔴 +108 B 🔴 +102 B 🔴 +97 B

Status: 7 added / 7 removed / 1 unchanged

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-BER3U41J.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.97 kB 🔴 +3.52 kB
assets/ComfyQueueButton-DDOTf1TO.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.97 kB 🟢 -3.53 kB
assets/useTerminalTabs-95Dj4_UG.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.69 kB 🔴 +3.27 kB
assets/useTerminalTabs-W44zkyD_.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.69 kB 🟢 -3.27 kB
assets/InviteMembersForm-BPMg2MNL.js (removed) 8.2 kB 🟢 -8.2 kB 🟢 -2.72 kB 🟢 -2.44 kB
assets/InviteMembersForm-DGFKI64o.js (new) 8.2 kB 🔴 +8.2 kB 🔴 +2.72 kB 🔴 +2.43 kB
assets/SubscribeButton-CkeHAjFk.js (removed) 2.15 kB 🟢 -2.15 kB 🟢 -970 B 🟢 -846 B
assets/SubscribeButton-DdmAB3s8.js (new) 2.15 kB 🔴 +2.15 kB 🔴 +970 B 🔴 +851 B
assets/cloudFeedbackTopbarButton-bfHHwwz4.js (new) 705 B 🔴 +705 B 🔴 +421 B 🔴 +360 B
assets/cloudFeedbackTopbarButton-BYxcQwc6.js (removed) 705 B 🟢 -705 B 🟢 -421 B 🟢 -360 B
assets/ComfyQueueButton-B8KYeQ6a.js (new) 128 B 🔴 +128 B 🔴 +99 B 🔴 +89 B
assets/ComfyQueueButton-DBT-VRog.js (removed) 128 B 🟢 -128 B 🟢 -99 B 🟢 -89 B

Status: 6 added / 6 removed / 8 unchanged

Data & Services — 3.51 MB (baseline 3.51 MB) • 🔴 +105 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/settingStore-BPDEtrV6.js (new) 3.23 MB 🔴 +3.23 MB 🔴 +749 kB 🔴 +563 kB
assets/settingStore-XsEkzDk-.js (removed) 3.23 MB 🟢 -3.23 MB 🟢 -749 kB 🟢 -563 kB
assets/load3dService-AWN7k_vl.js (removed) 132 kB 🟢 -132 kB 🟢 -29.3 kB 🟢 -24.6 kB
assets/load3dService-fKyZiyCV.js (new) 132 kB 🔴 +132 kB 🔴 +29.3 kB 🔴 +24.6 kB
assets/api-BtjF35kY.js (new) 98.3 kB 🔴 +98.3 kB 🔴 +27.2 kB 🔴 +23.4 kB
assets/api-DN8Z1a3r.js (removed) 98.3 kB 🟢 -98.3 kB 🟢 -27.2 kB 🟢 -23.3 kB
assets/workflowShareService-DmvZNxo_.js (removed) 16.5 kB 🟢 -16.5 kB 🟢 -4.92 kB 🟢 -4.34 kB
assets/workflowShareService-DpFspVtw.js (new) 16.5 kB 🔴 +16.5 kB 🔴 +4.92 kB 🔴 +4.35 kB
assets/keybindingService-C4uvZWhc.js (new) 6.89 kB 🔴 +6.89 kB 🔴 +1.73 kB 🔴 +1.5 kB
assets/keybindingService-YlTBWGCQ.js (removed) 6.89 kB 🟢 -6.89 kB 🟢 -1.73 kB 🟢 -1.5 kB
assets/releaseStore-1eIB2gtz.js (removed) 6.72 kB 🟢 -6.72 kB 🟢 -2.03 kB 🟢 -1.77 kB
assets/releaseStore-Cy6FMhiK.js (new) 6.72 kB 🔴 +6.72 kB 🔴 +2.03 kB 🔴 +1.77 kB
assets/systemStatsStore-DTesviRm.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.74 kB 🟢 -1.47 kB
assets/systemStatsStore-mKJRI-I7.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.74 kB 🔴 +1.47 kB
assets/userStore-C9U6E-Dw.js (removed) 2.38 kB 🟢 -2.38 kB 🟢 -899 B 🟢 -794 B
assets/userStore-DhD_zUDJ.js (new) 2.38 kB 🔴 +2.38 kB 🔴 +899 B 🔴 +796 B
assets/audioService-BFGEv-WX.js (removed) 1.71 kB 🟢 -1.71 kB 🟢 -831 B 🟢 -723 B
assets/audioService-BTdfnFsM.js (new) 1.71 kB 🔴 +1.71 kB 🔴 +830 B 🔴 +733 B
assets/dialogService-C_7WWeve.js (removed) 98 B 🟢 -98 B 🟢 -97 B 🟢 -82 B
assets/dialogService-xJviN9HS.js (new) 98 B 🔴 +98 B 🔴 +97 B 🔴 +81 B
assets/releaseStore-17JGxnAC.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -84 B
assets/releaseStore-EaGi7eoL.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +90 B
assets/settingStore-CeXABEmG.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +77 B
assets/settingStore-CUHOhXC2.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -76 B
assets/assetsStore--bkGEmPw.js (new) 94 B 🔴 +94 B 🔴 +92 B 🔴 +83 B
assets/assetsStore-D-0MeF1o.js (removed) 94 B 🟢 -94 B 🟢 -92 B 🟢 -83 B
assets/api-C54UZCQh.js (new) 62 B 🔴 +62 B 🔴 +74 B 🔴 +66 B
assets/api-Dtre3ytv.js (removed) 62 B 🟢 -62 B 🟢 -74 B 🟢 -66 B

Status: 14 added / 14 removed / 3 unchanged

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useConflictDetection-D1404DDy.js (new) 236 kB 🔴 +236 kB 🔴 +53 kB 🔴 +43.1 kB
assets/useConflictDetection-DOO9tMHK.js (removed) 236 kB 🟢 -236 kB 🟢 -53 kB 🟢 -43.2 kB
assets/useLayerEditorSession-b7VXSTcb.js (removed) 158 kB 🟢 -158 kB 🟢 -40.8 kB 🟢 -34.3 kB
assets/useLayerEditorSession-DQA8qA-n.js (new) 158 kB 🔴 +158 kB 🔴 +40.8 kB 🔴 +34.3 kB
assets/useLoad3d-C5dMHH9p.js (removed) 25.8 kB 🟢 -25.8 kB 🟢 -5.8 kB 🟢 -5.14 kB
assets/useLoad3d-efLl6ZEV.js (new) 25.8 kB 🔴 +25.8 kB 🔴 +5.8 kB 🔴 +5.13 kB
assets/useLoad3dViewer-_rbkjN4F.js (removed) 21.2 kB 🟢 -21.2 kB 🟢 -4.98 kB 🟢 -4.37 kB
assets/useLoad3dViewer-DqzlVXCg.js (new) 21.2 kB 🔴 +21.2 kB 🔴 +4.98 kB 🔴 +4.36 kB
assets/useImageCrop-BFoQh8xT.js (removed) 14.9 kB 🟢 -14.9 kB 🟢 -3.42 kB 🟢 -2.98 kB
assets/useImageCrop-Cw4oUsDX.js (new) 14.9 kB 🔴 +14.9 kB 🔴 +3.42 kB 🔴 +2.98 kB
assets/useDowngradeToPersonal-BkioewXZ.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +2.75 kB 🔴 +2.36 kB
assets/useDowngradeToPersonal-CVRss0uR.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -2.75 kB 🟢 -2.36 kB
assets/useFeatureFlags-ByQF9zHK.js (new) 6.99 kB 🔴 +6.99 kB 🔴 +2 kB 🔴 +1.7 kB
assets/useFeatureFlags-Cin-oC2B.js (removed) 6.99 kB 🟢 -6.99 kB 🟢 -2 kB 🟢 -1.69 kB
assets/useCompositorLayers-BDbHGRRo.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -898 B 🟢 -806 B
assets/useCompositorLayers-CIUdwvAy.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +898 B 🔴 +807 B
assets/assetPreviewUtil-BG-J54Fa.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -970 B 🟢 -843 B
assets/assetPreviewUtil-CxuJl4n6.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +968 B 🔴 +849 B
assets/useUpstreamValue-Cb0svVSq.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -758 B 🟢 -684 B
assets/useUpstreamValue-EkhP_qwT.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +759 B 🔴 +684 B
assets/useWorkspaceTierLabel-AyijdRcf.js (new) 1.93 kB 🔴 +1.93 kB 🔴 +813 B 🔴 +698 B
assets/useWorkspaceTierLabel-CCqzXuZ9.js (removed) 1.93 kB 🟢 -1.93 kB 🟢 -814 B 🟢 -698 B
assets/subscriptionCheckoutUtil-BZMs5Bcf.js (new) 877 B 🔴 +877 B 🔴 +521 B 🔴 +434 B
assets/subscriptionCheckoutUtil-Ch8y0gG8.js (removed) 877 B 🟢 -877 B 🟢 -522 B 🟢 -434 B
assets/useSessionCookie-BAdQS7oI.js (removed) 652 B 🟢 -652 B 🟢 -338 B 🟢 -290 B
assets/useSessionCookie-PEFq7YJI.js (new) 652 B 🔴 +652 B 🔴 +337 B 🔴 +293 B
assets/useLoad3d-BEHRnGwq.js (removed) 311 B 🟢 -311 B 🟢 -164 B 🟢 -149 B
assets/useLoad3d-DBmxo1kd.js (new) 311 B 🔴 +311 B 🔴 +165 B 🔴 +148 B
assets/useSessionCookie-Dw_HGZmT.js (removed) 101 B 🟢 -101 B 🟢 -86 B 🟢 -83 B
assets/useSessionCookie-W7tBqr9g.js (new) 101 B 🔴 +101 B 🔴 +86 B 🔴 +80 B
assets/useFeatureFlags-BTRMS7Uq.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +81 B
assets/useFeatureFlags-C4TbOcRU.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -89 B
assets/useLoad3dViewer-B6pGs5tM.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -85 B
assets/useLoad3dViewer-DiOVkEDd.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +82 B
assets/useCurrentUser-BjLLveTi.js (removed) 94 B 🟢 -94 B 🟢 -95 B 🟢 -81 B
assets/useCurrentUser-BSjF-AXr.js (new) 94 B 🔴 +94 B 🔴 +95 B 🔴 +92 B

Status: 18 added / 18 removed / 20 unchanged

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

External libraries and shared vendor chunks

Status: 17 unchanged

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

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-BoBw_FSJ.js (removed) 115 kB 🟢 -115 kB 🟢 -29.7 kB 🟢 -25.1 kB
assets/core-BoQZg476.js (new) 115 kB 🔴 +115 kB 🔴 +29.7 kB 🔴 +25.1 kB
assets/WidgetSelect-C8zWLHnM.js (removed) 88.8 kB 🟢 -88.8 kB 🟢 -20.1 kB 🟢 -17.2 kB
assets/WidgetSelect-DyLzWhVg.js (new) 88.8 kB 🔴 +88.8 kB 🔴 +20.1 kB 🔴 +17.2 kB
assets/SubscriptionPanelContentWorkspace-BZE1Kikw.js (new) 80 kB 🔴 +80 kB 🔴 +15.8 kB 🔴 +13.6 kB
assets/SubscriptionPanelContentWorkspace-DJZV__Ya.js (removed) 80 kB 🟢 -80 kB 🟢 -15.8 kB 🟢 -13.6 kB
assets/Load3D-C1uRiZ3S.js (removed) 71.3 kB 🟢 -71.3 kB 🟢 -11.7 kB 🟢 -9.98 kB
assets/Load3D-O5-rweNv.js (new) 71.3 kB 🔴 +71.3 kB 🔴 +11.7 kB 🔴 +9.97 kB
assets/WidgetVideoEdit-Bx5aDeX3.js (removed) 67.5 kB 🟢 -67.5 kB 🟢 -15.7 kB 🟢 -13.9 kB
assets/WidgetVideoEdit-h3e8_r3_.js (new) 67.5 kB 🔴 +67.5 kB 🔴 +15.7 kB 🔴 +13.9 kB
assets/SubscriptionTransitionPreviewWorkspace-CtzOLGL3.js (new) 66.4 kB 🔴 +66.4 kB 🔴 +13.4 kB 🔴 +11.7 kB
assets/SubscriptionTransitionPreviewWorkspace-DPwVUwKy.js (removed) 66.4 kB 🟢 -66.4 kB 🟢 -13.4 kB 🟢 -11.7 kB
assets/WorkspaceSettingsPanelContent-BQe_DI0P.js (new) 58.2 kB 🔴 +58.2 kB 🔴 +12.4 kB 🔴 +10.8 kB
assets/WorkspaceSettingsPanelContent-Du8pwmvZ.js (removed) 58.2 kB 🟢 -58.2 kB 🟢 -12.4 kB 🟢 -10.8 kB
assets/Preview3d-DvfH23qp.js (removed) 50.9 kB 🟢 -50.9 kB 🟢 -8.32 kB 🟢 -7.26 kB
assets/Preview3d-sNQLqyMY.js (new) 50.9 kB 🔴 +50.9 kB 🔴 +8.32 kB 🔴 +7.26 kB
assets/main-B096LSDM.js (new) 45.1 kB 🔴 +45.1 kB 🔴 +13.1 kB 🔴 +11.4 kB
assets/main-B2xaKAcg.js (removed) 45.1 kB 🟢 -45.1 kB 🟢 -13.1 kB 🟢 -11.4 kB
assets/SubscriptionRequiredDialogContentUnified-AcYAWHfi.js (new) 42.6 kB 🔴 +42.6 kB 🔴 +9.36 kB 🔴 +8.16 kB
assets/SubscriptionRequiredDialogContentUnified-R7Oe_x3W.js (removed) 42.6 kB 🟢 -42.6 kB 🟢 -9.36 kB 🟢 -8.16 kB
assets/LayerEditorContent-BdhzxrQD.js (new) 42.5 kB 🔴 +42.5 kB 🔴 +9.62 kB 🔴 +8.43 kB
assets/LayerEditorContent-CpN_55V8.js (removed) 42.5 kB 🟢 -42.5 kB 🟢 -9.62 kB 🟢 -8.43 kB
assets/WidgetBoundingBoxes-Bf1P741U.js (new) 33.7 kB 🔴 +33.7 kB 🔴 +9.16 kB 🔴 +8.13 kB
assets/WidgetBoundingBoxes-Va2upIgG.js (removed) 33.7 kB 🟢 -33.7 kB 🟢 -9.16 kB 🟢 -8.12 kB
assets/WidgetPainter-BCfksJOa.js (removed) 32.6 kB 🟢 -32.6 kB 🟢 -7.88 kB 🟢 -6.97 kB
assets/WidgetPainter-Cu47JNNc.js (new) 32.6 kB 🔴 +32.6 kB 🔴 +7.88 kB 🔴 +6.97 kB
assets/Load3dViewerContent-DKt-xO-D.js (removed) 30.8 kB 🟢 -30.8 kB 🟢 -6.29 kB 🟢 -5.45 kB
assets/Load3dViewerContent-v9NTyTNC.js (new) 30.8 kB 🔴 +30.8 kB 🔴 +6.29 kB 🔴 +5.45 kB
assets/SubscriptionRequiredDialogContent-DvGeDEsY.js (new) 26.9 kB 🔴 +26.9 kB 🔴 +6.36 kB 🔴 +5.61 kB
assets/SubscriptionRequiredDialogContent-SjeFjEJ3.js (removed) 26.9 kB 🟢 -26.9 kB 🟢 -6.36 kB 🟢 -5.61 kB
assets/SubscriptionRequiredDialogContentWorkspace-Bu7_yDIo.js (removed) 25.1 kB 🟢 -25.1 kB 🟢 -5.79 kB 🟢 -5.1 kB
assets/SubscriptionRequiredDialogContentWorkspace-Dap64FP3.js (new) 25.1 kB 🔴 +25.1 kB 🔴 +5.79 kB 🔴 +5.11 kB
assets/CreditsTile-C5eo-KuK.js (removed) 24.9 kB 🟢 -24.9 kB 🟢 -6.65 kB 🟢 -5.82 kB
assets/CreditsTile-DzSX1l75.js (new) 24.9 kB 🔴 +24.9 kB 🔴 +6.65 kB 🔴 +5.83 kB
assets/load3d-DHG27ttQ.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.4 kB 🔴 +4.67 kB
assets/load3d-DosFhBqP.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.41 kB 🟢 -4.67 kB
assets/CurrentUserPopoverWorkspace--oHUClB3.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +4.85 kB 🔴 +4.31 kB
assets/CurrentUserPopoverWorkspace--X259yOt.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -4.85 kB 🟢 -4.31 kB
assets/SignInContent-BkBaLTIw.js (new) 20.2 kB 🔴 +20.2 kB 🔴 +5.09 kB 🔴 +4.46 kB
assets/SignInContent-dYG30BZ1.js (removed) 20.2 kB 🟢 -20.2 kB 🟢 -5.09 kB 🟢 -4.45 kB
assets/WidgetRecordAudio-Hk7w2wY0.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.6 kB 🔴 +4.11 kB
assets/WidgetRecordAudio-ogMVT-ml.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.6 kB 🟢 -4.1 kB
assets/WidgetInputNumber-CBuyjC09.js (new) 13.9 kB 🔴 +13.9 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/WidgetInputNumber-DDDPADCz.js (removed) 13.9 kB 🟢 -13.9 kB 🟢 -3.63 kB 🟢 -3.21 kB
assets/WidgetRange-CF6u2vl_.js (removed) 13.7 kB 🟢 -13.7 kB 🟢 -3.55 kB 🟢 -3.12 kB
assets/WidgetRange-CR0MRvmI.js (new) 13.7 kB 🔴 +13.7 kB 🔴 +3.55 kB 🔴 +3.13 kB
assets/WaveAudioPlayer-pkbQDq93.js (removed) 12.8 kB 🟢 -12.8 kB 🟢 -3.46 kB 🟢 -3.04 kB
assets/WaveAudioPlayer-tzOpjRz2.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +3.46 kB 🔴 +3.04 kB
assets/WidgetCurve-CxExRQ_C.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.48 kB 🟢 -3.15 kB
assets/WidgetCurve-JmEvOTGR.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.48 kB 🔴 +3.15 kB
assets/TeamWorkspacesDialogContent-B8eRYPUO.js (new) 10.3 kB 🔴 +10.3 kB 🔴 +2.97 kB 🔴 +2.63 kB
assets/TeamWorkspacesDialogContent-Clbu_OgW.js (removed) 10.3 kB 🟢 -10.3 kB 🟢 -2.97 kB 🟢 -2.63 kB
assets/onboardingCloudRoutes-B1WPBqyd.js (removed) 9.33 kB 🟢 -9.33 kB 🟢 -2.83 kB 🟢 -2.43 kB
assets/onboardingCloudRoutes-Bkcz7MCZ.js (new) 9.33 kB 🔴 +9.33 kB 🔴 +2.84 kB 🔴 +2.43 kB
assets/Load3DConfiguration-DfhNQklY.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.61 kB 🔴 +2.3 kB
assets/Load3DConfiguration-DgzF-E5Q.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.61 kB 🟢 -2.29 kB
assets/WidgetImageCrop-DeonDq3h.js (removed) 8.49 kB 🟢 -8.49 kB 🟢 -2.66 kB 🟢 -2.34 kB
assets/WidgetImageCrop-DokdDeOG.js (new) 8.49 kB 🔴 +8.49 kB 🔴 +2.65 kB 🔴 +2.34 kB
assets/SetMemberCreditLimitDialogContent-D-rlEm8L.js (new) 8.47 kB 🔴 +8.47 kB 🔴 +2.34 kB 🔴 +2.05 kB
assets/SetMemberCreditLimitDialogContent-VCkrRfjx.js (removed) 8.47 kB 🟢 -8.47 kB 🟢 -2.34 kB 🟢 -2.05 kB
assets/nodeTemplates-A5JjFJn4.js (new) 8.32 kB 🔴 +8.32 kB 🔴 +2.85 kB 🔴 +2.5 kB
assets/nodeTemplates-BerodwqB.js (removed) 8.32 kB 🟢 -8.32 kB 🟢 -2.85 kB 🟢 -2.5 kB
assets/NightlySurveyController-B93VKAA7.js (new) 7.5 kB 🔴 +7.5 kB 🔴 +2.56 kB 🔴 +2.25 kB
assets/NightlySurveyController-D9Pd5Y8T.js (removed) 7.5 kB 🟢 -7.5 kB 🟢 -2.56 kB 🟢 -2.25 kB
assets/CloudRunButtonWrapper-CAqAs2Au.js (new) 6.84 kB 🔴 +6.84 kB 🔴 +2.18 kB 🔴 +1.91 kB
assets/CloudRunButtonWrapper-DPcb_JAV.js (removed) 6.84 kB 🟢 -6.84 kB 🟢 -2.18 kB 🟢 -1.91 kB
assets/WidgetWithControl-CkNEA0Mb.js (removed) 6.41 kB 🟢 -6.41 kB 🟢 -2.61 kB 🟢 -2.31 kB
assets/WidgetWithControl-Dc5LCsO-.js (new) 6.41 kB 🔴 +6.41 kB 🔴 +2.61 kB 🔴 +2.31 kB
assets/missingModelMetadata-BSG86L9f.js (new) 6.17 kB 🔴 +6.17 kB 🔴 +2.13 kB 🔴 +1.86 kB
assets/missingModelMetadata-CHg0_Xer.js (removed) 6.17 kB 🟢 -6.17 kB 🟢 -2.13 kB 🟢 -1.86 kB
assets/CancelSubscriptionDialogContent-CPdr15Dt.js (removed) 5.97 kB 🟢 -5.97 kB 🟢 -1.98 kB 🟢 -1.75 kB
assets/CancelSubscriptionDialogContent-DmEc8THH.js (new) 5.97 kB 🔴 +5.97 kB 🔴 +1.98 kB 🔴 +1.75 kB
assets/load3dPreviewExtensions-BMz0QcS7.js (removed) 5.88 kB 🟢 -5.88 kB 🟢 -1.81 kB 🟢 -1.6 kB
assets/load3dPreviewExtensions-C7HSh0Iw.js (new) 5.88 kB 🔴 +5.88 kB 🔴 +1.81 kB 🔴 +1.6 kB
assets/launchCancellationFlow-BBwAJ-XU.js (new) 5.18 kB 🔴 +5.18 kB 🔴 +1.78 kB 🔴 +1.56 kB
assets/launchCancellationFlow-CsZCn_k4.js (removed) 5.18 kB 🟢 -5.18 kB 🟢 -1.78 kB 🟢 -1.55 kB
assets/CreateWorkspaceDialogContent-B-_yRU6G.js (removed) 5.12 kB 🟢 -5.12 kB 🟢 -1.79 kB 🟢 -1.55 kB
assets/CreateWorkspaceDialogContent-Dnq7Olgx.js (new) 5.12 kB 🔴 +5.12 kB 🔴 +1.79 kB 🔴 +1.55 kB
assets/ChangeMemberRoleDialogContent-CdQz_UUX.js (new) 4.97 kB 🔴 +4.97 kB 🔴 +1.64 kB 🔴 +1.42 kB
assets/ChangeMemberRoleDialogContent-CO5v4aRi.js (removed) 4.97 kB 🟢 -4.97 kB 🟢 -1.64 kB 🟢 -1.42 kB
assets/InviteMemberDialogContent-DO3vkE94.js (removed) 4.96 kB 🟢 -4.96 kB 🟢 -1.64 kB 🟢 -1.44 kB
assets/InviteMemberDialogContent-DpRVmXcv.js (new) 4.96 kB 🔴 +4.96 kB 🔴 +1.64 kB 🔴 +1.44 kB
assets/EditWorkspaceDialogContent-BsZNhX-F.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.76 kB 🔴 +1.53 kB
assets/EditWorkspaceDialogContent-DlP1IQL-.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.76 kB 🟢 -1.53 kB
assets/WidgetTextarea-Cpta0BXy.js (removed) 4.81 kB 🟢 -4.81 kB 🟢 -1.87 kB 🟢 -1.63 kB
assets/WidgetTextarea-Dk24NFs6.js (new) 4.81 kB 🔴 +4.81 kB 🔴 +1.87 kB 🔴 +1.64 kB
assets/saveMesh-D4UC7H73.js (new) 4.76 kB 🔴 +4.76 kB 🔴 +1.51 kB 🔴 +1.36 kB
assets/saveMesh-DKD2prWT.js (removed) 4.76 kB 🟢 -4.76 kB 🟢 -1.52 kB 🟢 -1.35 kB
assets/WorkspacePanelContent-CZDBgsU6.js (removed) 4.74 kB 🟢 -4.74 kB 🟢 -1.63 kB 🟢 -1.44 kB
assets/WorkspacePanelContent-DKVue1D9.js (new) 4.74 kB 🔴 +4.74 kB 🔴 +1.63 kB 🔴 +1.44 kB
assets/ValueControlPopover-BmEmHpi9.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.55 kB 🔴 +1.38 kB
assets/ValueControlPopover-COLOoC9f.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.55 kB 🟢 -1.38 kB
assets/DeleteWorkspaceDialogContent-CIcWnhNo.js (removed) 3.84 kB 🟢 -3.84 kB 🟢 -1.44 kB 🟢 -1.24 kB
assets/DeleteWorkspaceDialogContent-CK_Dn9JR.js (new) 3.84 kB 🔴 +3.84 kB 🔴 +1.44 kB 🔴 +1.24 kB
assets/RemoveMemberDialogContent-CzRdLs-e.js (removed) 3.76 kB 🟢 -3.76 kB 🟢 -1.38 kB 🟢 -1.2 kB
assets/RemoveMemberDialogContent-DGlWILJF.js (new) 3.76 kB 🔴 +3.76 kB 🔴 +1.38 kB 🔴 +1.2 kB
assets/RevokeInviteDialogContent-DnZ39cMD.js (new) 3.67 kB 🔴 +3.67 kB 🔴 +1.39 kB 🔴 +1.22 kB
assets/RevokeInviteDialogContent-Sjtuf5kP.js (removed) 3.67 kB 🟢 -3.67 kB 🟢 -1.39 kB 🟢 -1.22 kB
assets/LeaveWorkspaceDialogContent-DjGvOvnj.js (new) 3.67 kB 🔴 +3.67 kB 🔴 +1.38 kB 🔴 +1.19 kB
assets/LeaveWorkspaceDialogContent-hv82TWM3.js (removed) 3.67 kB 🟢 -3.67 kB 🟢 -1.38 kB 🟢 -1.19 kB
assets/InviteMemberUpsellDialogContent-9qhpRcr0.js (removed) 3.47 kB 🟢 -3.47 kB 🟢 -1.24 kB 🟢 -1.09 kB
assets/InviteMemberUpsellDialogContent-Dc2_jNO2.js (new) 3.47 kB 🔴 +3.47 kB 🔴 +1.24 kB 🔴 +1.09 kB
assets/workspaceCheckoutTelemetry-C-SjNbrf.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.52 kB 🔴 +1.33 kB
assets/workspaceCheckoutTelemetry-DSXPSCTR.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.52 kB 🟢 -1.33 kB
assets/GlobalToast-CGJDIIP-.js (new) 3.25 kB 🔴 +3.25 kB 🔴 +1.3 kB 🔴 +1.16 kB
assets/GlobalToast-Dvptx2Ob.js (removed) 3.25 kB 🟢 -3.25 kB 🟢 -1.3 kB 🟢 -1.11 kB
assets/Media3DTop-0cx7iMeh.js (new) 3.21 kB 🔴 +3.21 kB 🔴 +1.26 kB 🔴 +1.11 kB
assets/Media3DTop-CJSGsrw_.js (removed) 3.21 kB 🟢 -3.21 kB 🟢 -1.26 kB 🟢 -1.1 kB
assets/load3dAdvanced-CW6ALMEc.js (removed) 2.82 kB 🟢 -2.82 kB 🟢 -1.1 kB 🟢 -954 B
assets/load3dAdvanced-CWOv_F2m.js (new) 2.82 kB 🔴 +2.82 kB 🔴 +1.09 kB 🔴 +957 B
assets/SubscribeToRun-CqFVQFgd.js (new) 2.39 kB 🔴 +2.39 kB 🔴 +1.03 kB 🔴 +906 B
assets/SubscribeToRun-Dp8zNy-Q.js (removed) 2.39 kB 🟢 -2.39 kB 🟢 -1.03 kB 🟢 -907 B
assets/MediaAudioTop-BJl8I_sh.js (new) 1.62 kB 🔴 +1.62 kB 🔴 +808 B 🔴 +669 B
assets/MediaAudioTop-yABzRtLV.js (removed) 1.62 kB 🟢 -1.62 kB 🟢 -808 B 🟢 -669 B
assets/cloudSessionCookie-_zjYRqB2.js (removed) 933 B 🟢 -933 B 🟢 -431 B 🟢 -378 B
assets/cloudSessionCookie-CbMYmrab.js (new) 933 B 🔴 +933 B 🔴 +434 B 🔴 +377 B
assets/cloudBadges-Bpy9H8lh.js (new) 922 B 🔴 +922 B 🔴 +514 B 🔴 +436 B
assets/cloudBadges-CCkNev0r.js (removed) 922 B 🟢 -922 B 🟢 -516 B 🟢 -435 B
assets/Load3DAdvanced-DAA-j_4D.js (removed) 761 B 🟢 -761 B 🟢 -423 B 🟢 -358 B
assets/Load3DAdvanced-mrFZTH1n.js (new) 761 B 🔴 +761 B 🔴 +422 B 🔴 +357 B
assets/nightlyBadges-C0YppJwe.js (new) 411 B 🔴 +411 B 🔴 +273 B 🔴 +229 B
assets/nightlyBadges-LmpXpVO7.js (removed) 411 B 🟢 -411 B 🟢 -273 B 🟢 -261 B
assets/Load3dViewerContent-C9uleqKU.js (new) 137 B 🔴 +137 B 🔴 +103 B 🔴 +91 B
assets/Load3dViewerContent-CjuU0vc4.js (removed) 137 B 🟢 -137 B 🟢 -103 B 🟢 -92 B
assets/missingModelMetadata-CvGW7mfz.js (new) 125 B 🔴 +125 B 🔴 +103 B 🔴 +104 B
assets/missingModelMetadata-DAX1pAs-.js (removed) 125 B 🟢 -125 B 🟢 -103 B 🟢 -104 B
assets/Load3DAdvanced-BciheQra.js (removed) 122 B 🟢 -122 B 🟢 -97 B 🟢 -85 B
assets/Load3DAdvanced-Bkd63hAM.js (new) 122 B 🔴 +122 B 🔴 +97 B 🔴 +88 B
assets/WidgetLegacy-H3suH3_3.js (removed) 117 B 🟢 -117 B 🟢 -106 B 🟢 -100 B
assets/WidgetLegacy-POrjGDrh.js (new) 117 B 🔴 +117 B 🔴 +106 B 🔴 +93 B
assets/workflowDraftStoreV2-BnlLpVft.js (new) 112 B 🔴 +112 B 🔴 +101 B 🔴 +108 B
assets/workflowDraftStoreV2-FVy6ClVd.js (removed) 112 B 🟢 -112 B 🟢 -101 B 🟢 -109 B
assets/Load3D-EFNLvbvO.js (new) 98 B 🔴 +98 B 🔴 +89 B 🔴 +73 B
assets/Load3D-pXVysWMc.js (removed) 98 B 🟢 -98 B 🟢 -89 B 🟢 -82 B
assets/changeTracker--Ct0FWWt.js (new) 91 B 🔴 +91 B 🔴 +93 B 🔴 +92 B
assets/changeTracker-Cah3c5WZ.js (removed) 91 B 🟢 -91 B 🟢 -93 B 🟢 -83 B

Status: 68 added / 68 removed / 217 unchanged

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.0 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 48.3 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.7 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 50.8 MB heap
large-graph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 63.6 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 55.5 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.4 MB heap
minimap-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 64.6 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 51.2 MB heap
subgraph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.1 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 51.0 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 147ms TBT · 95.9 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.5 MB heap
vue-large-graph-idle: · 56.3 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 169.0 MB heap
vue-large-graph-pan: · 55.4 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 198ms TBT · 157.7 MB heap
workflow-execution: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 65.4 MB heap

⚠️ 6 regressions detected

Show regressions
Metric Baseline PR (median) Δ Sig
canvas-idle: task duration 485ms 471ms -3% ⚠️ z=2.4
canvas-zoom-sweep: task duration 384ms 392ms +2% ⚠️ z=2.8
large-graph-idle: task duration 689ms 690ms +0% ⚠️ z=2.7
large-graph-pan: task duration 1318ms 1282ms -3% ⚠️ z=4.7
minimap-idle: task duration 688ms 680ms -1% ⚠️ z=3.2
subgraph-idle: task duration 481ms 480ms -0% ⚠️ z=3.5
All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: avg frame time 17ms 17ms -0% z=-0.9
canvas-idle: p95 frame time 17ms 17ms +0%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 8ms 7ms -7% z=-3.9
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 9 9 -6% z=-4.7
canvas-idle: task duration 485ms 471ms -3% ⚠️ z=2.4
canvas-idle: script duration 18ms 17ms -9% z=-3.9
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 67.0 MB 67.0 MB -0%
canvas-idle: DOM nodes 18 17 -6% z=-4.4
canvas-idle: event listeners 4 4 +0% z=-1.6
canvas-mouse-sweep: avg frame time 17ms 17ms -0% z=-0.9
canvas-mouse-sweep: p95 frame time 17ms 17ms -1%
canvas-mouse-sweep: layout duration 4ms 4ms -7% z=-0.5
canvas-mouse-sweep: style recalc duration 41ms 38ms -7% z=-1.4
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 76 76 -1% z=-1.4
canvas-mouse-sweep: task duration 904ms 968ms +7% z=1.8
canvas-mouse-sweep: script duration 119ms 127ms +7% z=-1.3
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 50.8 MB 48.3 MB -5%
canvas-mouse-sweep: DOM nodes -282 -282 +0% z=-133.1
canvas-mouse-sweep: event listeners -153 -153 +0% z=-38.7
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=-2.0
canvas-zoom-sweep: style recalc duration 16ms 17ms +4% z=-1.5
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 31 31 +0% z=-0.6
canvas-zoom-sweep: task duration 384ms 392ms +2% ⚠️ z=2.8
canvas-zoom-sweep: script duration 19ms 20ms +8% z=-2.4
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 69.8 MB 69.7 MB -0%
canvas-zoom-sweep: DOM nodes 77 77 +0% z=-2.8
canvas-zoom-sweep: event listeners 19 19 +0% 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 +20% z=-1.9
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 11 12 +5% z=-3.2
dom-widget-clipping: task duration 377ms 389ms +3% z=1.5
dom-widget-clipping: script duration 59ms 61ms +3% z=-2.1
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 50.7 MB 50.8 MB +0%
dom-widget-clipping: DOM nodes 18 19 +6% z=-2.2
dom-widget-clipping: event listeners 0 1 variance too high
large-graph-idle: avg frame time 17ms 17ms +0% z=0.2
large-graph-idle: p95 frame time 17ms 17ms +0%
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 7ms 9ms +19% z=-3.5
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 9 10 +6% z=-6.7
large-graph-idle: task duration 689ms 690ms +0% ⚠️ z=2.7
large-graph-idle: script duration 95ms 109ms +14% z=0.6
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 63.6 MB 63.6 MB +0%
large-graph-idle: DOM nodes -282 -283 +0% z=-340.4
large-graph-idle: event listeners -149 -149 +0% z=-28.7
large-graph-pan: avg frame time 17ms 17ms +0% z=0.3
large-graph-pan: p95 frame time 17ms 17ms +0%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 15ms 13ms -12% z=-5.4
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 1318ms 1282ms -3% ⚠️ z=4.7
large-graph-pan: script duration 438ms 434ms -1% z=1.3
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 53.2 MB 55.5 MB +4%
large-graph-pan: DOM nodes -285 -285 -0% z=-184.0
large-graph-pan: event listeners -179 -163 -9% z=-202.8
large-graph-zoom: avg frame time 17ms 17ms -0%
large-graph-zoom: p95 frame time 17ms 17ms +0%
large-graph-zoom: layout duration 8ms 7ms -13%
large-graph-zoom: style recalc duration 16ms 14ms -15%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 65 64 -2%
large-graph-zoom: task duration 1524ms 1533ms +1%
large-graph-zoom: script duration 534ms 556ms +4%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 57.4 MB 71.4 MB +24%
large-graph-zoom: DOM nodes -287 -139 -52%
large-graph-zoom: event listeners -153 -73 -53%
minimap-idle: avg frame time 17ms 17ms -0% z=-0.4
minimap-idle: p95 frame time 17ms 17ms -1%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 7ms 7ms +2% z=-2.9
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 8 8 +0% z=-2.3
minimap-idle: task duration 688ms 680ms -1% ⚠️ z=3.2
minimap-idle: script duration 99ms 108ms +9% z=1.0
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 64.4 MB 64.6 MB +0%
minimap-idle: DOM nodes -284 -284 +0% z=-221.6
minimap-idle: event listeners -149 -149 +0% z=-232.6
subgraph-dom-widget-clipping: avg frame time 17ms 17ms -0% z=-0.4
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 10ms +9% z=-2.6
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 46 46 -1% z=-4.2
subgraph-dom-widget-clipping: task duration 396ms 404ms +2% z=1.4
subgraph-dom-widget-clipping: script duration 122ms 123ms +1% z=-0.9
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 51.3 MB 51.2 MB -0%
subgraph-dom-widget-clipping: DOM nodes 18 17 -6% z=-4.6
subgraph-dom-widget-clipping: event listeners 6 7 +17% z=-1.6
subgraph-idle: avg frame time 17ms 17ms +0% z=0.4
subgraph-idle: p95 frame time 17ms 17ms +0%
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 8ms 8ms -5% z=-3.4
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 10 10 -5% z=-2.1
subgraph-idle: task duration 481ms 480ms -0% ⚠️ z=3.5
subgraph-idle: script duration 14ms 15ms +4% z=-2.1
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 67.2 MB 67.1 MB -0%
subgraph-idle: DOM nodes 20 19 -5% z=-1.9
subgraph-idle: event listeners 4 4 +0% 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 4ms -5% z=-1.6
subgraph-mouse-sweep: style recalc duration 34ms 36ms +8% z=-1.8
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 76 77 +1% z=-1.6
subgraph-mouse-sweep: task duration 804ms 782ms -3% z=0.2
subgraph-mouse-sweep: script duration 87ms 91ms +4% z=-1.6
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 45.1 MB 51.0 MB +13%
subgraph-mouse-sweep: DOM nodes 1 -108 -10850% z=-78.1
subgraph-mouse-sweep: event listeners -153 -75 -51% 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 13ms 13ms -2%
subgraph-transition-enter: style recalc duration 31ms 31ms +2%
subgraph-transition-enter: layout count 13 14 +8%
subgraph-transition-enter: style recalc count 17 18 +6%
subgraph-transition-enter: task duration 956ms 995ms +4%
subgraph-transition-enter: script duration 36ms 39ms +8%
subgraph-transition-enter: TBT 120ms 147ms +23%
subgraph-transition-enter: heap used 96.1 MB 95.9 MB -0%
subgraph-transition-enter: DOM nodes 13673 13673 +0%
subgraph-transition-enter: event listeners 2375 2375 +0%
viewport-pan-sweep: avg frame time 17ms 17ms -0%
viewport-pan-sweep: p95 frame time 17ms 17ms -0%
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 39ms 37ms -6%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 249 250 +0%
viewport-pan-sweep: task duration 4386ms 4649ms +6%
viewport-pan-sweep: script duration 1301ms 1445ms +11%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 68.2 MB 68.5 MB +0%
viewport-pan-sweep: DOM nodes -283 -283 -0%
viewport-pan-sweep: event listeners -133 -131 -2%
vue-large-graph-idle: avg frame time 18ms 18ms -0%
vue-large-graph-idle: p95 frame time 17ms 17ms +0%
vue-large-graph-idle: layout duration 0ms 0ms +0%
vue-large-graph-idle: style recalc duration 0ms 0ms +0%
vue-large-graph-idle: layout count 0 0 +0%
vue-large-graph-idle: style recalc count 0 0 +0%
vue-large-graph-idle: task duration 17651ms 17037ms -3%
vue-large-graph-idle: script duration 559ms 574ms +3%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 174.0 MB 169.0 MB -3%
vue-large-graph-idle: DOM nodes -8312 -8312 +0%
vue-large-graph-idle: event listeners -16387 -16389 +0%
vue-large-graph-pan: avg frame time 18ms 18ms +2%
vue-large-graph-pan: p95 frame time 17ms 17ms +0%
vue-large-graph-pan: layout duration 0ms 0ms +0%
vue-large-graph-pan: style recalc duration 24ms 16ms -34%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 168 138 -18%
vue-large-graph-pan: task duration 22515ms 20377ms -9%
vue-large-graph-pan: script duration 935ms 872ms -7%
vue-large-graph-pan: TBT 576ms 198ms -66%
vue-large-graph-pan: heap used 159.1 MB 157.7 MB -1%
vue-large-graph-pan: DOM nodes -8312 -8312 +0%
vue-large-graph-pan: event listeners -16381 -16384 +0%
workflow-execution: avg frame time 17ms 17ms -0% z=-0.9
workflow-execution: p95 frame time 17ms 17ms +0%
workflow-execution: layout duration 1ms 1ms +42% z=-4.3
workflow-execution: style recalc duration 20ms 20ms +1% z=-1.9
workflow-execution: layout count 3 3 -17% z=-4.5
workflow-execution: style recalc count 12 16 +29% z=-1.1
workflow-execution: task duration 111ms 125ms +12% z=0.2
workflow-execution: script duration 11ms 9ms -15% z=-6.7
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 65.4 MB 65.4 MB +0%
workflow-execution: DOM nodes 125 136 +8% z=-3.6
workflow-execution: event listeners 97 98 +1% z=10.6
Historical variance (last 15 runs)
Metric μ σ CV
canvas-idle: avg frame time 17ms 0ms 0.0%
canvas-idle: layout duration 0ms 0ms 0.0%
canvas-idle: style recalc duration 11ms 1ms 8.2%
canvas-idle: layout count 0 0 0.0%
canvas-idle: style recalc count 11 1 5.0%
canvas-idle: task duration 395ms 31ms 7.9%
canvas-idle: script duration 25ms 2ms 8.8%
canvas-idle: TBT 0ms 0ms 0.0%
canvas-idle: DOM nodes 23 1 5.6%
canvas-idle: event listeners 12 5 40.9%
canvas-mouse-sweep: avg frame time 17ms 0ms 0.0%
canvas-mouse-sweep: layout duration 4ms 0ms 5.4%
canvas-mouse-sweep: style recalc duration 43ms 3ms 7.4%
canvas-mouse-sweep: layout count 12 0 0.0%
canvas-mouse-sweep: style recalc count 79 2 3.0%
canvas-mouse-sweep: task duration 865ms 58ms 6.7%
canvas-mouse-sweep: script duration 136ms 6ms 4.8%
canvas-mouse-sweep: TBT 0ms 0ms 0.0%
canvas-mouse-sweep: DOM nodes 62 3 4.2%
canvas-mouse-sweep: event listeners 8 4 49.4%
canvas-zoom-sweep: avg frame time 17ms 0ms 0.0%
canvas-zoom-sweep: layout duration 1ms 0ms 7.0%
canvas-zoom-sweep: style recalc duration 19ms 2ms 8.0%
canvas-zoom-sweep: layout count 6 0 0.0%
canvas-zoom-sweep: style recalc count 31 0 1.5%
canvas-zoom-sweep: task duration 327ms 23ms 7.1%
canvas-zoom-sweep: script duration 27ms 3ms 11.1%
canvas-zoom-sweep: TBT 0ms 0ms 0.0%
canvas-zoom-sweep: DOM nodes 79 1 1.0%
canvas-zoom-sweep: event listeners 24 5 21.8%
dom-widget-clipping: avg frame time 17ms 0ms 0.0%
dom-widget-clipping: layout duration 0ms 0ms 0.0%
dom-widget-clipping: style recalc duration 10ms 1ms 8.0%
dom-widget-clipping: layout count 0 0 0.0%
dom-widget-clipping: style recalc count 13 0 3.8%
dom-widget-clipping: task duration 365ms 16ms 4.5%
dom-widget-clipping: script duration 68ms 3ms 4.8%
dom-widget-clipping: TBT 0ms 0ms 0.0%
dom-widget-clipping: DOM nodes 22 1 6.4%
dom-widget-clipping: event listeners 8 6 81.2%
large-graph-idle: avg frame time 17ms 0ms 0.0%
large-graph-idle: layout duration 0ms 0ms 0.0%
large-graph-idle: style recalc duration 12ms 1ms 8.6%
large-graph-idle: layout count 0 0 0.0%
large-graph-idle: style recalc count 12 0 2.7%
large-graph-idle: task duration 542ms 54ms 10.0%
large-graph-idle: script duration 102ms 11ms 10.3%
large-graph-idle: TBT 0ms 0ms 0.0%
large-graph-idle: DOM nodes 25 1 3.7%
large-graph-idle: event listeners 26 6 23.2%
large-graph-pan: avg frame time 17ms 0ms 0.0%
large-graph-pan: layout duration 0ms 0ms 0.0%
large-graph-pan: style recalc duration 17ms 1ms 4.6%
large-graph-pan: layout count 0 0 0.0%
large-graph-pan: style recalc count 70 1 0.9%
large-graph-pan: task duration 1082ms 43ms 4.0%
large-graph-pan: script duration 408ms 20ms 4.8%
large-graph-pan: TBT 0ms 0ms 0.0%
large-graph-pan: DOM nodes 19 2 8.7%
large-graph-pan: event listeners 5 1 16.8%
minimap-idle: avg frame time 17ms 0ms 0.0%
minimap-idle: layout duration 0ms 0ms 0.0%
minimap-idle: style recalc duration 10ms 1ms 8.6%
minimap-idle: layout count 0 0 0.0%
minimap-idle: style recalc count 10 1 7.1%
minimap-idle: task duration 527ms 47ms 9.0%
minimap-idle: script duration 98ms 10ms 10.1%
minimap-idle: TBT 0ms 0ms 0.0%
minimap-idle: DOM nodes 19 1 7.1%
minimap-idle: event listeners 5 1 14.4%
subgraph-dom-widget-clipping: avg frame time 17ms 0ms 0.0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms 0.0%
subgraph-dom-widget-clipping: style recalc duration 13ms 1ms 7.4%
subgraph-dom-widget-clipping: layout count 0 0 0.0%
subgraph-dom-widget-clipping: style recalc count 48 1 1.2%
subgraph-dom-widget-clipping: task duration 378ms 18ms 4.9%
subgraph-dom-widget-clipping: script duration 128ms 6ms 4.9%
subgraph-dom-widget-clipping: TBT 0ms 0ms 0.0%
subgraph-dom-widget-clipping: DOM nodes 22 1 5.0%
subgraph-dom-widget-clipping: event listeners 16 6 36.0%
subgraph-idle: avg frame time 17ms 0ms 0.0%
subgraph-idle: layout duration 0ms 0ms 0.0%
subgraph-idle: style recalc duration 10ms 1ms 7.5%
subgraph-idle: layout count 0 0 0.0%
subgraph-idle: style recalc count 11 1 6.0%
subgraph-idle: task duration 370ms 31ms 8.5%
subgraph-idle: script duration 20ms 3ms 13.2%
subgraph-idle: TBT 0ms 0ms 0.0%
subgraph-idle: DOM nodes 22 1 6.9%
subgraph-idle: event listeners 10 7 64.5%
subgraph-mouse-sweep: avg frame time 17ms 0ms 0.0%
subgraph-mouse-sweep: layout duration 5ms 0ms 6.8%
subgraph-mouse-sweep: style recalc duration 42ms 3ms 7.8%
subgraph-mouse-sweep: layout count 16 0 0.0%
subgraph-mouse-sweep: style recalc count 80 2 2.4%
subgraph-mouse-sweep: task duration 766ms 69ms 9.0%
subgraph-mouse-sweep: script duration 101ms 7ms 6.5%
subgraph-mouse-sweep: TBT 0ms 0ms 0.0%
subgraph-mouse-sweep: DOM nodes 67 2 3.3%
subgraph-mouse-sweep: event listeners 8 4 52.6%
workflow-execution: avg frame time 17ms 0ms 0.0%
workflow-execution: layout duration 2ms 0ms 9.4%
workflow-execution: style recalc duration 24ms 2ms 9.1%
workflow-execution: layout count 5 1 11.0%
workflow-execution: style recalc count 18 2 11.5%
workflow-execution: task duration 123ms 11ms 8.8%
workflow-execution: script duration 29ms 3ms 10.2%
workflow-execution: TBT 0ms 0ms 0.0%
workflow-execution: DOM nodes 161 7 4.4%
workflow-execution: event listeners 52 4 8.4%
Trend (last 15 commits on main)
Metric Trend Dir Latest
canvas-idle: avg frame time ▆▃▆▁▆▃▆█▆▆▄▃▃▄▃ ➡️ 17ms
canvas-idle: p95 frame time ➡️ NaNms
canvas-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: style recalc duration ▇▇▆▆▃█▄▃▄▃▇▄▁▆▇ ➡️ 11ms
canvas-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
canvas-idle: style recalc count █▃▅▂▅▆▃▁▂▁▂▅▆▅▆ ➡️ 12
canvas-idle: task duration ▃▃▃▆▂▃▃▅▆▂█▃▁▃▃ ➡️ 391ms
canvas-idle: script duration ▄▃▅▇▂▅▃▆▇▅█▄▁▅▆ ➡️ 27ms
canvas-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: heap used ➡️ NaN MB
canvas-idle: DOM nodes █▇▆▅▃▇▃▁▂▂▅▆▆▆▇ ➡️ 24
canvas-idle: event listeners ▅█▅▄▁▅▁▁▁▄▅▅▁▅▄ 📉 11
canvas-mouse-sweep: avg frame time ▆█▆▃▁▃▁▆▆▁▃▆▆▃▃ ➡️ 17ms
canvas-mouse-sweep: p95 frame time ➡️ NaNms
canvas-mouse-sweep: layout duration ▁▃▂▄▁▂▁▃▆▂█▇▆▄▃ ➡️ 4ms
canvas-mouse-sweep: style recalc duration ▄▄▂▄▁▂▃▃▅▄█▆▂▄▄ ➡️ 43ms
canvas-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 12
canvas-mouse-sweep: style recalc count █▅▄▃▂▂▁▄▄▅▆▅▂▇▄ ➡️ 79
canvas-mouse-sweep: task duration █▆▄▂▂▃▂▄▄▅█▆▁▆▄ ➡️ 868ms
canvas-mouse-sweep: script duration ▄▅▄▆▄▆▆▆▅▅█▆▁▅▆ ➡️ 139ms
canvas-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-mouse-sweep: heap used ➡️ NaN MB
canvas-mouse-sweep: DOM nodes █▅▃▃▁▂▂▃▂▄▆▅▃▅▅ ➡️ 64
canvas-mouse-sweep: event listeners █▁▁▁▁▁▇▁▁▁██▇▁█ 📈 13
canvas-zoom-sweep: avg frame time ▅▅█▄▅▁▁▁▅▁▁▅▄▅▁ ➡️ 17ms
canvas-zoom-sweep: p95 frame time ➡️ NaNms
canvas-zoom-sweep: layout duration ▆▅▅▄▁▁█▅▃▅▇▆▁▂▆ ➡️ 1ms
canvas-zoom-sweep: style recalc duration ▆▅▄▆▅▃█▆▇▅▇▄▁▃▅ ➡️ 20ms
canvas-zoom-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 6
canvas-zoom-sweep: style recalc count ▁▁▃▄▆▃▆█▄▄▆▁▆▁▆ ➡️ 32
canvas-zoom-sweep: task duration ▄▂▁▇▂▂▄▅▆▃█▄▁▁▅ ➡️ 338ms
canvas-zoom-sweep: script duration ▃▃▂▇▂▂▅▇▆▅█▄▁▂▆ ➡️ 30ms
canvas-zoom-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-zoom-sweep: heap used ➡️ NaN MB
canvas-zoom-sweep: DOM nodes ▄▃▁▅█▁▃▆▄▅▅▃▃▄▃ ➡️ 79
canvas-zoom-sweep: event listeners ▁▁▂▅█▂▁▅▁▅▅▄▁▅▁ ➡️ 19
dom-widget-clipping: avg frame time ▂▄▅▅▂▄█▇▅▇▇▅▅▁▇ ➡️ 17ms
dom-widget-clipping: p95 frame time ➡️ NaNms
dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: style recalc duration ▆▆▂▆▄▃██▄▁▆▇▆▃▅ ➡️ 10ms
dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
dom-widget-clipping: style recalc count ▇█▅█▅▄█▇▇▁▇▄▇▂▅ ➡️ 13
dom-widget-clipping: task duration ▃▃▁▅▄▃▅▆▅▂▇█▁▅▅ ➡️ 371ms
dom-widget-clipping: script duration ▅▄▄▆▆▅▇▇▆▃█▇▁▇▇ ➡️ 71ms
dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: heap used ➡️ NaN MB
dom-widget-clipping: DOM nodes ▇▇▄▇▅▄█▇▅▁▅▄▇▃▄ ➡️ 21
dom-widget-clipping: event listeners ▅▅▅▅▁▅██▁▁▁▁█▁▁ 📉 2
large-graph-idle: avg frame time ▅▅▅▅▅▂▁▂▄▅▄▂▂▅█ ➡️ 17ms
large-graph-idle: p95 frame time ➡️ NaNms
large-graph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: style recalc duration ▅▅▅▆▄▅▃▄▅▅▆█▁▄▆ ➡️ 13ms
large-graph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-idle: style recalc count █▆█▃▃▁▃▆▃▆▆▃▆██ ➡️ 12
large-graph-idle: task duration ▂▃▂▆▂▃▃▇▅▃██▁▂▅ ➡️ 569ms
large-graph-idle: script duration ▄▅▄▆▄▅▅▇▆▅█▆▁▃▆ ➡️ 110ms
large-graph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: heap used ➡️ NaN MB
large-graph-idle: DOM nodes ▆█▅▂▅▃▁▂▃▅▅▆▂▆▅ ➡️ 25
large-graph-idle: event listeners ███▇██▄▁▄▇▇█▂█▇ ➡️ 29
large-graph-pan: avg frame time ▆▃▃▆█▃▁█▆▆▆▆█▁▆ ➡️ 17ms
large-graph-pan: p95 frame time ➡️ NaNms
large-graph-pan: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: style recalc duration ▃▂▄▄▁▅▂▂▁▄▄█▃▁▂ ➡️ 17ms
large-graph-pan: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-pan: style recalc count ▆▃█▂▃▂▂▂▁▇▅▃█▆▃ ➡️ 69
large-graph-pan: task duration ▄▃▄▆▄▄▄▆▄▄█▆▁▂▅ ➡️ 1100ms
large-graph-pan: script duration ▅▄▅▆▆▅▄▆▄▅█▄▁▄▅ ➡️ 413ms
large-graph-pan: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: heap used ➡️ NaN MB
large-graph-pan: DOM nodes ▅▃▆▂▄▁▃▁▁▅▁▂█▅▂ ➡️ 18
large-graph-pan: event listeners █▆█▁▁▆▁▁▃▆▁▃██▃ ➡️ 5
minimap-idle: avg frame time ▃▆▆▃█▁█▆▆▃▃▆█▆█ ➡️ 17ms
minimap-idle: p95 frame time ➡️ NaNms
minimap-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: style recalc duration ▄█▁█▅▅█▅▅▃▅▁▁▄▆ ➡️ 10ms
minimap-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
minimap-idle: style recalc count ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 9
minimap-idle: task duration ▃▄▁▅▁▃▄▅▇▃█▅▁▁▅ ➡️ 547ms
minimap-idle: script duration ▄▆▃▇▃▅▆▆▇▅█▅▁▃▆ ➡️ 106ms
minimap-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: heap used ➡️ NaN MB
minimap-idle: DOM nodes ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 19
minimap-idle: event listeners ▃▃▆▁▁▁▃▁▁▆▁▃█▆▁ ➡️ 4
subgraph-dom-widget-clipping: avg frame time ▅▄▄▄▄▄█▄▄▄▃▁▆▃▃ ➡️ 17ms
subgraph-dom-widget-clipping: p95 frame time ➡️ NaNms
subgraph-dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: style recalc duration ▂▄▃▅▅▃▂▅▇▃▄█▁▄▆ ➡️ 14ms
subgraph-dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-dom-widget-clipping: style recalc count ▇█▆▃▆▃▁▆█▇▃▆▇█▅ ➡️ 48
subgraph-dom-widget-clipping: task duration ▂▃▃▆▅▅▂▅█▂▆█▁▂▇ ➡️ 398ms
subgraph-dom-widget-clipping: script duration ▃▃▃▄▅▅▂▄█▂▅▇▁▂▅ ➡️ 131ms
subgraph-dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: heap used ➡️ NaN MB
subgraph-dom-widget-clipping: DOM nodes ▅▇▅▂▅▂▁▅▅▅▁▇▅█▄ ➡️ 22
subgraph-dom-widget-clipping: event listeners ▅▅▅▂▅▁▅██▁▁█▅█▅ 📈 16
subgraph-idle: avg frame time ▆▆█▁▆▃▆▆▆▃▆▁▃▆█ ➡️ 17ms
subgraph-idle: p95 frame time ➡️ NaNms
subgraph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: style recalc duration ▁▇▃▆▂▄▂▃▃▆▆▄▃▇█ ➡️ 12ms
subgraph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-idle: style recalc count ▃▆▃▃▂▅▁▂▁▆▃▃██▇ ➡️ 12
subgraph-idle: task duration ▁▃▁▇▁▁▃▆▅▂█▅▁▁▄ ➡️ 378ms
subgraph-idle: script duration ▁▃▂▇▁▂▃▇▆▂█▅▂▁▅ ➡️ 22ms
subgraph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: heap used ➡️ NaN MB
subgraph-idle: DOM nodes ▃▅▃▂▁▄▁▂▁▅▃▂▇█▇ ➡️ 24
subgraph-idle: event listeners ▁▅▁▁▁▁▁▁▁▅▄▁███ 📈 21
subgraph-mouse-sweep: avg frame time ▅▄▁▃▃▄▆▄▆▃▃█▁▃▃ ➡️ 17ms
subgraph-mouse-sweep: p95 frame time ➡️ NaNms
subgraph-mouse-sweep: layout duration ▁▄▄▄▃▃▅▅▅▂█▇▂▃▆ ➡️ 5ms
subgraph-mouse-sweep: style recalc duration ▃▂▄▅▂▃▄▅█▃█▆▁▂▅ ➡️ 43ms
subgraph-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 16
subgraph-mouse-sweep: style recalc count ▅▂▅▅▁▄▃▅█▅▆▄▂▄▅ ➡️ 81
subgraph-mouse-sweep: task duration ▃▂▄▅▂▄▄▅▇▄█▆▁▃▅ ➡️ 785ms
subgraph-mouse-sweep: script duration ▄▅▄▇▅▅▆▇▆▅██▁▄▆ ➡️ 105ms
subgraph-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-mouse-sweep: heap used ➡️ NaN MB
subgraph-mouse-sweep: DOM nodes ▅▁▄▅▁▄▃▃█▅▅▄▂▅▃ ➡️ 66
subgraph-mouse-sweep: event listeners ▇▁▂▇▁▂▂▂█▇▂▂▇▇▂ 📈 5
workflow-execution: avg frame time ▆▆▆▄▆▆▃▄▁▄█▆▅▄▆ ➡️ 17ms
workflow-execution: p95 frame time ➡️ NaNms
workflow-execution: layout duration ▁▆▁▃▂▄▃▂▃▃▅█▄▂▅ ➡️ 2ms
workflow-execution: style recalc duration ▃▇▅▇▁▅▆▇█▁██▂▄▆ ➡️ 25ms
workflow-execution: layout count ▁█▂▃▂▃▃▁▃▃▄▃▂▃▂ ➡️ 5
workflow-execution: style recalc count ▃█▅▇▁▄▅▆▅▅▅▅▄▄▂ ➡️ 15
workflow-execution: task duration ▂▅▄▅▁▄▆▆▆▁▇█▁▃▃ ➡️ 120ms
workflow-execution: script duration ▄▃▄▄▃▅▄▅▆▂▇█▁▃▄ ➡️ 29ms
workflow-execution: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
workflow-execution: heap used ➡️ NaN MB
workflow-execution: DOM nodes ▂█▃▆▁▄▃▅▃█▃▃▄▃▁ ➡️ 152
workflow-execution: event listeners ▅███▁▅███▁██▅█▅ ➡️ 49
Raw data
{
  "timestamp": "2026-08-12T22:51:46.272Z",
  "gitSha": "870ef39da5667a6daa076e9a7ce411a5498e25e6",
  "branch": "fix/clear-workflow-status-on-account-precondition-error",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2070.451999999989,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.370000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 477.09200000000004,
      "heapDeltaBytes": 5585920,
      "heapUsedBytes": 70111532,
      "domNodes": 16,
      "jsHeapTotalBytes": 24641536,
      "scriptDurationMs": 16.540000000000003,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-idle",
      "durationMs": 2010.499999999979,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.308000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 464.1719999999999,
      "heapDeltaBytes": 5784616,
      "heapUsedBytes": 70384220,
      "domNodes": 18,
      "jsHeapTotalBytes": 24117248,
      "scriptDurationMs": 16.733999999999998,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1989.4819999999527,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 41.759,
      "layouts": 12,
      "layoutDurationMs": 3.9819999999999993,
      "taskDurationMs": 1040.124,
      "heapDeltaBytes": -12824744,
      "heapUsedBytes": 51618296,
      "domNodes": -284,
      "jsHeapTotalBytes": 24088576,
      "scriptDurationMs": 130.138,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1823.759999999993,
      "styleRecalcs": 74,
      "styleRecalcDurationMs": 34.941,
      "layouts": 12,
      "layoutDurationMs": 3.0260000000000002,
      "taskDurationMs": 895.6039999999999,
      "heapDeltaBytes": -14794396,
      "heapUsedBytes": 49574516,
      "domNodes": -280,
      "jsHeapTotalBytes": 23302144,
      "scriptDurationMs": 124.73799999999999,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1675.907000000052,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 16.449,
      "layouts": 6,
      "layoutDurationMs": 0.4940000000000001,
      "taskDurationMs": 394.78099999999995,
      "heapDeltaBytes": 8506532,
      "heapUsedBytes": 73029176,
      "domNodes": 78,
      "jsHeapTotalBytes": 24903680,
      "scriptDurationMs": 20.496,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1728.2319999999345,
      "styleRecalcs": 30,
      "styleRecalcDurationMs": 17.228,
      "layouts": 6,
      "layoutDurationMs": 0.6069999999999999,
      "taskDurationMs": 389.74699999999996,
      "heapDeltaBytes": 8750096,
      "heapUsedBytes": 73210816,
      "domNodes": 76,
      "jsHeapTotalBytes": 24379392,
      "scriptDurationMs": 19.552999999999997,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 576.3110000000324,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.453999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 391.70099999999996,
      "heapDeltaBytes": -11410068,
      "heapUsedBytes": 53329088,
      "domNodes": 18,
      "jsHeapTotalBytes": 25165824,
      "scriptDurationMs": 60.85,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 581.6800000000057,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 8.309999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 386.677,
      "heapDeltaBytes": -11177380,
      "heapUsedBytes": 53186740,
      "domNodes": 20,
      "jsHeapTotalBytes": 25165824,
      "scriptDurationMs": 61.04600000000001,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2055.138999999997,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.7909999999999995,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 685.705,
      "heapDeltaBytes": 7482364,
      "heapUsedBytes": 66971576,
      "domNodes": -283,
      "jsHeapTotalBytes": 2981888,
      "scriptDurationMs": 110.10600000000001,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2020.7639999999856,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.434999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 694.462,
      "heapDeltaBytes": 6897484,
      "heapUsedBytes": 66473104,
      "domNodes": -283,
      "jsHeapTotalBytes": 3506176,
      "scriptDurationMs": 107.03800000000001,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2184.6689999999853,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 13.376,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1293.3590000000002,
      "heapDeltaBytes": 1144320,
      "heapUsedBytes": 61801968,
      "domNodes": -283,
      "jsHeapTotalBytes": 3698688,
      "scriptDurationMs": 437.34599999999995,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2186.914999999999,
      "styleRecalcs": 68,
      "styleRecalcDurationMs": 12.538999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1270.997,
      "heapDeltaBytes": -5917300,
      "heapUsedBytes": 54682028,
      "domNodes": -286,
      "jsHeapTotalBytes": 3506176,
      "scriptDurationMs": 431.576,
      "eventListeners": -179,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3211.19299999998,
      "styleRecalcs": 63,
      "styleRecalcDurationMs": 12.676999999999998,
      "layouts": 60,
      "layoutDurationMs": 7.147,
      "taskDurationMs": 1517.643,
      "heapDeltaBytes": -2461544,
      "heapUsedBytes": 60229320,
      "domNodes": -289,
      "jsHeapTotalBytes": 6389760,
      "scriptDurationMs": 538.237,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3247.463000000039,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 14.376,
      "layouts": 60,
      "layoutDurationMs": 7.236999999999999,
      "taskDurationMs": 1548.7380000000003,
      "heapDeltaBytes": 26538744,
      "heapUsedBytes": 89426356,
      "domNodes": 12,
      "jsHeapTotalBytes": 8388608,
      "scriptDurationMs": 574.296,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2027.99600000003,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.194000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 668.2099999999999,
      "heapDeltaBytes": 7222748,
      "heapUsedBytes": 68278872,
      "domNodes": -284,
      "jsHeapTotalBytes": 1933312,
      "scriptDurationMs": 102.457,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2035.4559999999537,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.160999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 692.1579999999998,
      "heapDeltaBytes": 6743460,
      "heapUsedBytes": 67243184,
      "domNodes": -284,
      "jsHeapTotalBytes": 3768320,
      "scriptDurationMs": 112.98500000000001,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 590.4629999999997,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 10.413,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 403.6930000000001,
      "heapDeltaBytes": -10726500,
      "heapUsedBytes": 53814756,
      "domNodes": 18,
      "jsHeapTotalBytes": 25427968,
      "scriptDurationMs": 122.442,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 591.5559999999687,
      "styleRecalcs": 45,
      "styleRecalcDurationMs": 10.192,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 405.143,
      "heapDeltaBytes": -11171532,
      "heapUsedBytes": 53611468,
      "domNodes": 16,
      "jsHeapTotalBytes": 26214400,
      "scriptDurationMs": 122.82,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2028.250000000014,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.302000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 483.69100000000003,
      "heapDeltaBytes": 5927828,
      "heapUsedBytes": 70360324,
      "domNodes": 20,
      "jsHeapTotalBytes": 24379392,
      "scriptDurationMs": 13.845999999999998,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2004.899000000023,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.254999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 476.0179999999999,
      "heapDeltaBytes": 5810564,
      "heapUsedBytes": 70427152,
      "domNodes": 18,
      "jsHeapTotalBytes": 24379392,
      "scriptDurationMs": 15.623,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1709.2979999999898,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 35.367000000000004,
      "layouts": 16,
      "layoutDurationMs": 4.072,
      "taskDurationMs": 795.0619999999999,
      "heapDeltaBytes": -18369132,
      "heapUsedBytes": 46221816,
      "domNodes": -280,
      "jsHeapTotalBytes": 23302144,
      "scriptDurationMs": 89.678,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1726.643000000081,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 37.473,
      "layouts": 16,
      "layoutDurationMs": 4.27,
      "taskDurationMs": 769.355,
      "heapDeltaBytes": -3781620,
      "heapUsedBytes": 60722488,
      "domNodes": 65,
      "jsHeapTotalBytes": 25165824,
      "scriptDurationMs": 91.464,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1430.1459999999793,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 31.079000000000008,
      "layouts": 14,
      "layoutDurationMs": 12.770000000000003,
      "taskDurationMs": 994.5460000000002,
      "heapDeltaBytes": 31067372,
      "heapUsedBytes": 100555060,
      "domNodes": 13673,
      "jsHeapTotalBytes": 15204352,
      "scriptDurationMs": 38.868,
      "eventListeners": 2375,
      "totalBlockingTimeMs": 147,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8389.791000000003,
      "styleRecalcs": 251,
      "styleRecalcDurationMs": 37.26599999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4625.717000000001,
      "heapDeltaBytes": 9807680,
      "heapUsedBytes": 68742916,
      "domNodes": -280,
      "jsHeapTotalBytes": 7106560,
      "scriptDurationMs": 1451.786,
      "eventListeners": -131,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.80000000000109
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8438.444000000003,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 36.596,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4672.519,
      "heapDeltaBytes": 15314212,
      "heapUsedBytes": 74894492,
      "domNodes": -285,
      "jsHeapTotalBytes": 5533696,
      "scriptDurationMs": 1437.297,
      "eventListeners": -131,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 17279.453999999987,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 17257.038,
      "heapDeltaBytes": -20142260,
      "heapUsedBytes": 183492764,
      "domNodes": -8312,
      "jsHeapTotalBytes": -10686464,
      "scriptDurationMs": 603.328,
      "eventListeners": -16389,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666763,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 16833.782000000043,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16816.584,
      "heapDeltaBytes": -35310544,
      "heapUsedBytes": 170969040,
      "domNodes": -8312,
      "jsHeapTotalBytes": -10428416,
      "scriptDurationMs": 544.8550000000001,
      "eventListeners": -16389,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 20648.707000000002,
      "styleRecalcs": 142,
      "styleRecalcDurationMs": 16.18699999999995,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 20602.199,
      "heapDeltaBytes": -28548276,
      "heapUsedBytes": 176873104,
      "domNodes": -8312,
      "jsHeapTotalBytes": -8400896,
      "scriptDurationMs": 885.192,
      "eventListeners": -16381,
      "totalBlockingTimeMs": 180,
      "frameDurationMs": 17.77333333333336,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 20177.831999999966,
      "styleRecalcs": 134,
      "styleRecalcDurationMs": 15.644000000000046,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 20152.151000000005,
      "heapDeltaBytes": -51497244,
      "heapUsedBytes": 153939172,
      "domNodes": -8312,
      "jsHeapTotalBytes": -12259328,
      "scriptDurationMs": 858.396,
      "eventListeners": -16387,
      "totalBlockingTimeMs": 216,
      "frameDurationMs": 18.333333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 453.44699999998284,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 18.154999999999998,
      "layouts": 2,
      "layoutDurationMs": 0.39800000000000013,
      "taskDurationMs": 108.06900000000002,
      "heapDeltaBytes": 5063304,
      "heapUsedBytes": 68583072,
      "domNodes": 126,
      "jsHeapTotalBytes": 5505024,
      "scriptDurationMs": 8.912999999999998,
      "eventListeners": 99,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.659999999999975,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 512.0480000000498,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 21.995999999999995,
      "layouts": 3,
      "layoutDurationMs": 1.463,
      "taskDurationMs": 141.00099999999998,
      "heapDeltaBytes": 5175800,
      "heapUsedBytes": 68656740,
      "domNodes": 145,
      "jsHeapTotalBytes": 4980736,
      "scriptDurationMs": 9.836999999999998,
      "eventListeners": 97,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    }
  ]
}

@github-actions

Copy link
Copy Markdown

🎨 Storybook: 🚧 Building...

@codecov

codecov Bot commented Aug 12, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@           Coverage Diff           @@
##             main   #15161   +/-   ##
=======================================
  Coverage   81.08%   81.08%           
=======================================
  Files        1882     1882           
  Lines      108347   108349    +2     
  Branches    34020    34021    +1     
=======================================
+ Hits        87851    87853    +2     
+ Misses      20146    20137    -9     
- Partials      350      359    +9     
Flag Coverage Δ
unit 72.55% <100.00%> (+<0.01%) ⬆️

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

Files with missing lines Coverage Δ
src/stores/executionStore.ts 95.22% <100.00%> (+0.02%) ⬆️

... and 7 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.

@christian-byrne

Copy link
Copy Markdown
Contributor Author

Filed the sibling-handler question as #15171 rather than folding it in here, since it needs a call on whether executionStore.test.ts:900 is pinning intended behavior.

that test asserts getWorkflowStatus === 'running' after a StagnationError, but it is named tracks service-level failures without writing failed and its real assertion is the trackExecutionOutcome payload. so the surviving 'running' may be an unexamined side effect rather than a guarantee. a stagnated job is terminal, so leaving it at running looks like the same bug this PR fixes, but that is worth confirming rather than assuming.

@benjcooley if you have context on that assertion, it would unblock the issue.

@christian-byrne
christian-byrne added this pull request to the merge queue Aug 13, 2026
Merged via the queue into main with commit 0bc18c4 Aug 13, 2026
76 of 77 checks passed
@christian-byrne
christian-byrne deleted the fix/clear-workflow-status-on-account-precondition-error branch August 13, 2026 20:44
christian-byrne added a commit that referenced this pull request Aug 17, 2026
…nning

Addresses @benjcooley's three SHOULD FIX items.

The status watcher's `status === 'running'` branch was unconditional, and its
source re-evaluates whenever the `workflowStatus` map is replaced — which
`mutateStatus` does for *any* workflow — or whenever an error flag flips. On
paths that drop a job without clearing its status the stale `running` survives,
so each of those re-evaluations put the card back on "your result lands right
here" after the acceptance-loss watcher had already failed the run. Gated on an
actual transition.

The comments named the wrong handler. #15161 made
`handleAccountPreconditionError` clear the status, so the mid-run credits path
now ends via the existing `undefined`-after-`running` branch. The paths this
watcher actually covers are an accepted job dropped with no status ever written,
and `handleServiceLevelError`, which drops the job and records a prompt error
but never touches `workflowStatus`.

The gate also removes the registration-order dependency the old comment
overclaimed away: with it, the terminal branches are the only ones that write,
and they overwrite unconditionally.

Tests: 60 green. `stays failed when an unrelated workflow churns the status map`
fails without the gate (`expected 'generating' to be 'failed'`).
@dante01yoon dante01yoon added needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch core/1.51 Backport PRs for core 1.51 cloud/1.51 Backport PRs for cloud 1.51 labels Aug 21, 2026
@github-actions

Copy link
Copy Markdown

@christian-byrne Commit 0bc18c434016b61a72553f208ac8d315e0f764e9 already exists on branch core/1.51. No backport needed.

1 similar comment
@github-actions

Copy link
Copy Markdown

@christian-byrne Commit 0bc18c434016b61a72553f208ac8d315e0f764e9 already exists on branch core/1.51. No backport needed.

@github-actions

Copy link
Copy Markdown

@christian-byrne Commit 0bc18c434016b61a72553f208ac8d315e0f764e9 already exists on branch cloud/1.51. No backport needed.

christian-byrne added a commit that referenced this pull request Aug 23, 2026
…15172)

Stacked on #15091 — base is `fix/14619-tour-unaccepted-run`, merge after
it.

#15091 gave the first-run tour a 15s acceptance deadline, which covers a
submission the backend refuses outright. It left one hole: a run that
*was* accepted and then loses its job without an outcome. Two live paths
do that, and **neither is the mid-run credits path this description
originally led with** — thanks @benjcooley for catching that:

| path | what it leaves behind | covered before this PR? |
| --- | --- | --- |
| accepted job dropped with **no status ever written** — the cloud
"waiting for a machine" job cancelled or reconciled away | nothing | ❌
no branch can fire |
| `handleServiceLevelError` ("Job has stagnated") — drops the job,
records a prompt error, never touches `workflowStatus` | a stale
`running` | ❌ the stale `running` shadowed the error branch |
| ~~mid-run credits (`handleAccountPreconditionError`)~~ | ~~stale
`running`~~ | ✅ **already covered** — #15161 clears the status, so it
ends via the existing `undefined`-after-`running` branch |

In the uncovered cases `runState` sits on `generating` forever and the
card keeps promising "Hang tight, your result lands right here the
moment it's ready."

The controller had two disarms and no re-arm. This makes losing
acceptance a signal in its own right: extend the existing
`tourRunAccepted` watcher so true -> false fails the run when it is
still `generating`.

```ts
watch(tourRunAccepted, (accepted) => {
  if (accepted) stopAcceptDeadline()
  else if (runState.value === 'generating') runState.value = 'failed'
})
```

No re-armed deadline — this is immediate, not a second timer.

The `'generating'` gate is what keeps healthy runs safe: every run
leaves the queue when it finishes. `handleExecutionSuccess` and
`handleExecutionError` write the terminal status and call
`resetExecutionState` in the same synchronous handler, and the status
watcher is registered before this one, so a finished run has already
left `generating` by the time this fires. Test 3 below covers exactly
that tick.

Tests, in the existing `'a run behind a dropped socket'` describe:
- accepted job removed with no status -> `failed`
- accepted job, status `running`, removed (the stagnation case) ->
`failed`
- accepted job, status `completed` written in the same tick as the
removal -> stays `succeeded`
- accepted job, status `failed`, then removed -> stays `failed`

The first two fail on the base branch (`expected 'generating' to be
'failed'`). Of the last two terminal-status guards, **only the
`completed` one discriminates** — ungated, the `failed` case writes
`'failed'` over `'failed'` and still passes. It is kept as documentation
of intent, not as a guard; the earlier claim that both pinned the gate
was wrong.

Two tests added in review:

- `stays failed when an unrelated workflow churns the status map` — pins
the transition gate below. Fails without it (`expected 'generating' to
be 'failed'`).
- `gives up on a stagnated job that leaves an error and a stale status`
— the other half of the stagnation path. Documents it; does not
discriminate the gate.

**Review fix:** the status watcher's `status === 'running'` branch was
unconditional, and its source re-evaluates whenever the `workflowStatus`
map is replaced (`mutateStatus` swaps the whole map, so *any* workflow's
change re-runs it) or an error flag flips. With a stale `running`
sitting there, each re-evaluation put the card back on "your result
lands right here" after this watcher had already failed the run. It is
now gated on an actual transition into `running`, which also removes the
registration-order dependency the old comment overclaimed away.

Complementary to #15161 (**merged 2026-08-13**), which fixes the same
user-visible symptom from the store side by clearing the stale status.
Independent of it: this is the controller refusing to promise regardless
of whether the store cleans up. Both are wanted; neither duplicates the
other.

Requested by @benjcooley in review on #15091 (acceptance-loss watch for
the mid-run credits variant) and by CodeRabbit (acceptance-loss
coverage, terminal statuses stay terminal).

## Tests
- 58 unit tests green in `useFirstRunTourController.test.ts` (54
existing + 4 new), full-file and each new test in isolation.
- `pnpm lint`, `pnpm typecheck`, `pnpm format:check` pass.

---------

Co-authored-by: Connor Byrne <c.byrne@comfy.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cloud/1.51 Backport PRs for cloud 1.51 core/1.51 Backport PRs for core 1.51 needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch size:XS This PR changes 0-9 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants