Skip to content

feat: unified PR report combining bundle size and runtime perf#9911

Open
christian-byrne wants to merge 2 commits intomainfrom
feat/unified-pr-perf-report
Open

feat: unified PR report combining bundle size and runtime perf#9911
christian-byrne wants to merge 2 commits intomainfrom
feat/unified-pr-perf-report

Conversation

@christian-byrne
Copy link
Contributor

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

Summary

Replaces two separate PR comment workflows (bundle size + performance) with a single unified report that posts one combined comment per PR.

Changes

  • What: New pr-report.yaml aggregator workflow triggers on both CI: Size Data and CI: Performance Report completions. Finds sibling workflow runs by PR head SHA. Renders combined report via unified-report.js (shells out to existing size-report.js and perf-report.ts). Sections show "pending" or "failed" placeholders when data is unavailable.
  • Breaking: Removes pr-size-report.yaml and pr-perf-report.yaml. Legacy <!-- COMFYUI_FRONTEND_SIZE --> and <!-- COMFYUI_FRONTEND_PERF --> comments are auto-cleaned on first run.
  • Dependencies: None

Review Focus

  • Concurrency key uses head_sha so the later-completing workflow cancels the earlier report run, ensuring the final comment always has both sections.
  • Stale-run guard: verifies workflow_run SHA matches the live PR head before posting.
  • The workflow_dispatch re-trigger path from pr-size-report.yaml is not carried forward — the unified workflow handles re-trigger naturally via its dual-trigger design.

┆Issue is synchronized with this Notion page by Unito

@christian-byrne christian-byrne requested a review from a team as a code owner March 14, 2026 03:41
@dosubot dosubot bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Mar 14, 2026
@github-actions
Copy link

github-actions bot commented Mar 14, 2026

🎭 Playwright: ✅ 550 passed, 0 failed · 10 flaky

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

@github-actions
Copy link

github-actions bot commented Mar 14, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/15/2026, 10:37:14 AM UTC

Links

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 14, 2026

📝 Walkthrough

Walkthrough

Deletes two legacy PR-reporting workflows, updates CI workflows to save PR head SHA metadata, adds a new unified PR workflow that aggregates size and perf artifacts and posts a single PR comment, and introduces a script to generate the combined size+performance report.

Changes

Cohort / File(s) Summary
CI metadata updates
.github/workflows/ci-perf-report.yaml, .github/workflows/ci-size-data.yaml
Write PR head SHA to temp files (temp/perf-meta/head-sha.txt, temp/size/head-sha.txt); rename step to "Save PR metadata"; add concurrency and expand artifact upload in size workflow.
Removed legacy PR reporters
.github/workflows/pr-perf-report.yaml, .github/workflows/pr-size-report.yaml
Removed separate "PR: Performance Report" and "PR: Size Report" workflows and all associated artifact download/validation/commenting steps.
New unified PR reporter
.github/workflows/pr-report.yaml
Adds "PR: Unified Report" workflow triggered on CI completions; resolves PR/run status, locates size and perf workflow runs, downloads current and baseline artifacts with fallbacks, generates pr-report.md, removes legacy comments, and posts a unified PR comment.
Report generation script
scripts/unified-report.js
New Node script that composes "Bundle Size" and "Performance" sections based on --size-status and --perf-status, invoking existing size/perf report scripts when statuses are ready.

Sequence Diagram

sequenceDiagram
    participant Dev as Developer
    participant CI_Size as CI: Size Data
    participant CI_Perf as CI: Performance Report
    participant Artifact as Artifact Storage
    participant PR_Workflow as PR: Unified Report
    participant Script as unified-report.js
    participant GitHub as GitHub (PR)

    Dev->>CI_Size: push / run CI
    Dev->>CI_Perf: push / run CI
    CI_Size->>Artifact: upload size data + head-sha.txt
    CI_Perf->>Artifact: upload perf metrics + head-sha.txt

    CI_Size->>PR_Workflow: workflow_run complete
    CI_Perf->>PR_Workflow: workflow_run complete
    PR_Workflow->>CI_Size: fetch run metadata/status
    PR_Workflow->>CI_Perf: fetch run metadata/status
    PR_Workflow->>Artifact: download current & baseline size data
    PR_Workflow->>Artifact: download current & baseline perf metrics
    PR_Workflow->>Script: exec unified-report.js --size-status --perf-status
    Script->>Script: generate Bundle Size section (calls size-report.js if ready)
    Script->>Script: generate Performance section (calls perf-report.ts if ready)
    Script-->>PR_Workflow: pr-report.md
    PR_Workflow->>GitHub: remove legacy comments
    PR_Workflow->>GitHub: post unified report comment
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 minutes

Poem

🐰 I sniffed the SHAs, stitched size and speed,
Rolled them in one note — a tidy feed.
Old reporters hopped away, anew I write,
One comment now, snug and light. 🥕✨

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: consolidating bundle size and performance PR reports into a single unified report.
Description check ✅ Passed The description covers all required template sections with clear explanations of changes, breaking changes, and review focus areas.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
End-To-End Regression Coverage For Fixes ✅ Passed PR title uses feature language (feat:), not bug-fix language; automated commit references formatting corrections, not functional bugs; no regression test requirement applies.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/unified-pr-perf-report
📝 Coding Plan
  • Generate coding plan for human review comments

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

@github-actions
Copy link

github-actions bot commented Mar 14, 2026

📦 Bundle: 4.99 MB gzip 🔴 +317 B

Details

Summary

  • Raw size: 23 MB baseline 23 MB — ⚪ 0 B
  • Gzip: 4.99 MB baseline 4.99 MB — 🔴 +317 B
  • Brotli: 3.85 MB baseline 3.85 MB — 🔴 +153 B
  • Bundles: 235 current • 235 baseline • 112 added / 112 removed

Category Glance
Vendor & Third-Party ⚪ 0 B (9.78 MB) · Other ⚪ 0 B (8.21 MB) · Data & Services ⚪ 0 B (3.17 MB) · Graph Workspace ⚪ 0 B (1.08 MB) · Panels & Settings ⚪ 0 B (460 kB) · Editors & Dialogs ⚪ 0 B (81.8 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BO64odnD.js (new) 21.7 kB 🔴 +21.7 kB 🔴 +7.71 kB 🔴 +6.66 kB
assets/index-uPDuYeYi.js (removed) 21.7 kB 🟢 -21.7 kB 🟢 -7.71 kB 🟢 -6.64 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BxBFwS5Z.js (removed) 1.08 MB 🟢 -1.08 MB 🟢 -230 kB 🟢 -174 kB
assets/GraphView-C6I6wDPX.js (new) 1.08 MB 🔴 +1.08 MB 🔴 +230 kB 🔴 +174 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-D2edo4Nb.js (removed) 15.6 kB 🟢 -15.6 kB 🟢 -3.38 kB 🟢 -2.88 kB
assets/CloudSurveyView-OrDtxRT_.js (new) 15.6 kB 🔴 +15.6 kB 🔴 +3.38 kB 🔴 +2.88 kB
assets/CloudLoginView-CsmtmqbE.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.26 kB 🟢 -2.89 kB
assets/CloudLoginView-wxhgTWF7.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.27 kB 🔴 +2.88 kB
assets/CloudSignupView-B9Qw9HUi.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.76 kB 🟢 -2.42 kB
assets/CloudSignupView-CujBaMn8.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.76 kB 🔴 +2.42 kB
assets/UserCheckView-Bg1nSua0.js (removed) 9.01 kB 🟢 -9.01 kB 🟢 -2.31 kB 🟢 -2.01 kB
assets/UserCheckView-C-AVm2gZ.js (new) 9.01 kB 🔴 +9.01 kB 🔴 +2.31 kB 🔴 +2.02 kB
assets/CloudLayoutView-BhaKXe46.js (removed) 7.3 kB 🟢 -7.3 kB 🟢 -2.26 kB 🟢 -1.96 kB
assets/CloudLayoutView-DVsY9RvI.js (new) 7.3 kB 🔴 +7.3 kB 🔴 +2.27 kB 🔴 +1.98 kB
assets/CloudForgotPasswordView-Aq9kSSv9.js (new) 5.73 kB 🔴 +5.73 kB 🔴 +2 kB 🔴 +1.75 kB
assets/CloudForgotPasswordView-DLiKOBTc.js (removed) 5.73 kB 🟢 -5.73 kB 🟢 -1.99 kB 🟢 -1.75 kB
assets/CloudAuthTimeoutView-C88n-s-X.js (new) 5.09 kB 🔴 +5.09 kB 🔴 +1.83 kB 🔴 +1.59 kB
assets/CloudAuthTimeoutView-Cb8nKasF.js (removed) 5.09 kB 🟢 -5.09 kB 🟢 -1.83 kB 🟢 -1.6 kB
assets/CloudSubscriptionRedirectView-BpJNP7F9.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.84 kB 🔴 +1.62 kB
assets/CloudSubscriptionRedirectView-Cx4sYJg8.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.84 kB 🟢 -1.62 kB
assets/UserSelectView-Cg5XFfy7.js (new) 4.67 kB 🔴 +4.67 kB 🔴 +1.73 kB 🔴 +1.53 kB
assets/UserSelectView-DZjJn7Nz.js (removed) 4.67 kB 🟢 -4.67 kB 🟢 -1.73 kB 🟢 -1.53 kB
assets/CloudSorryContactSupportView-DVucrv0K.js 1.21 kB 1.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-BE0wPzm2.js 385 B 385 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-BMPiGj6n.js (removed) 28.8 kB 🟢 -28.8 kB 🟢 -6.14 kB 🟢 -5.46 kB
assets/KeybindingPanel-DrAH4ntb.js (new) 28.8 kB 🔴 +28.8 kB 🔴 +6.14 kB 🔴 +5.48 kB
assets/SecretsPanel-BQo8NudS.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +5.41 kB 🔴 +4.76 kB
assets/SecretsPanel-BQxjBKaw.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.41 kB 🟢 -4.75 kB
assets/LegacyCreditsPanel-80ElA9nQ.js (removed) 21.2 kB 🟢 -21.2 kB 🟢 -5.67 kB 🟢 -4.99 kB
assets/LegacyCreditsPanel-yR1qblwd.js (new) 21.2 kB 🔴 +21.2 kB 🔴 +5.67 kB 🔴 +4.99 kB
assets/SubscriptionPanel-_HIGaGQN.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.83 kB 🔴 +4.24 kB
assets/SubscriptionPanel-CSXBczO3.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.82 kB 🟢 -4.24 kB
assets/AboutPanel-DyngOvfX.js (new) 11.9 kB 🔴 +11.9 kB 🔴 +3.3 kB 🔴 +2.96 kB
assets/AboutPanel-eVCKm6ge.js (removed) 11.9 kB 🟢 -11.9 kB 🟢 -3.3 kB 🟢 -2.95 kB
assets/ExtensionPanel-BrZtwMqi.js (new) 9.54 kB 🔴 +9.54 kB 🔴 +2.71 kB 🔴 +2.41 kB
assets/ExtensionPanel-I4Dy5Kfu.js (removed) 9.54 kB 🟢 -9.54 kB 🟢 -2.71 kB 🟢 -2.41 kB
assets/ServerConfigPanel-BBJpgImU.js (removed) 6.62 kB 🟢 -6.62 kB 🟢 -2.19 kB 🟢 -1.96 kB
assets/ServerConfigPanel-CcF7-bc3.js (new) 6.62 kB 🔴 +6.62 kB 🔴 +2.19 kB 🔴 +1.97 kB
assets/UserPanel-BpzWVl7A.js (removed) 6.33 kB 🟢 -6.33 kB 🟢 -2.05 kB 🟢 -1.8 kB
assets/UserPanel-cLOKs1B_.js (new) 6.33 kB 🔴 +6.33 kB 🔴 +2.05 kB 🔴 +1.79 kB
assets/cloudRemoteConfig-C1bt4Zs2.js (removed) 1.62 kB 🟢 -1.62 kB 🟢 -800 B 🟢 -681 B
assets/cloudRemoteConfig-CXGSJjyp.js (new) 1.62 kB 🔴 +1.62 kB 🔴 +804 B 🔴 +681 B
assets/refreshRemoteConfig-BXVvUQPz.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -650 B 🟢 -552 B
assets/refreshRemoteConfig-Ng2HW_Dh.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +652 B 🔴 +550 B
assets/config-BazmIiy7.js 1.79 kB 1.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-4x1YHshq.js 28.9 kB 28.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-9RehNOAa.js 28.9 kB 28.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CgIImzXZ.js 34.4 kB 34.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-ChUKcC_S.js 28 kB 28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CyVE159k.js 30.1 kB 30.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DcAJ3VeS.js 32.6 kB 32.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DcxL5WJ9.js 24 kB 24 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DPGGy1ee.js 30.7 kB 30.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-fYZUwZW3.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-JqHYHJz0.js 38.8 kB 38.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-WgI_mXzx.js 24.6 kB 24.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-CvMbbaB-.js (new) 3.57 kB 🔴 +3.57 kB 🔴 +1.26 kB 🔴 +1.07 kB
assets/auth-DkFcza7K.js (removed) 3.57 kB 🟢 -3.57 kB 🟢 -1.26 kB 🟢 -1.07 kB
assets/SignUpForm-CknOgwYY.js (new) 3.18 kB 🔴 +3.18 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/SignUpForm-DmF_4VqQ.js (removed) 3.18 kB 🟢 -3.18 kB 🟢 -1.29 kB 🟢 -1.15 kB
assets/UpdatePasswordContent-Bm9BG9ai.js (new) 2.44 kB 🔴 +2.44 kB 🔴 +1.09 kB 🔴 +968 B
assets/UpdatePasswordContent-YMtAgfvz.js (removed) 2.44 kB 🟢 -2.44 kB 🟢 -1.09 kB 🟢 -969 B
assets/firebaseAuthStore-DwtBTPpV.js (new) 788 B 🔴 +788 B 🔴 +389 B 🔴 +342 B
assets/firebaseAuthStore-wUFa0V9V.js (removed) 788 B 🟢 -788 B 🟢 -385 B 🟢 -344 B
assets/auth-4WdtoQUg.js (removed) 313 B 🟢 -313 B 🟢 -198 B 🟢 -173 B
assets/auth-D1r7GIgl.js (new) 313 B 🔴 +313 B 🔴 +203 B 🔴 +178 B
assets/PasswordFields-DcCUqFkG.js 4.68 kB 4.68 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-CVvFhrNa.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-C2J0VhhN.js (new) 81 kB 🔴 +81 kB 🔴 +16.9 kB 🔴 +14.5 kB
assets/useShareDialog-CbAkVjUC.js (removed) 81 kB 🟢 -81 kB 🟢 -16.9 kB 🟢 -14.5 kB
assets/useSubscriptionDialog-BFEVInuM.js (removed) 736 B 🟢 -736 B 🟢 -378 B 🟢 -329 B
assets/useSubscriptionDialog-Ke2Ka9ql.js (new) 736 B 🔴 +736 B 🔴 +381 B 🔴 +331 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-BvaTc9Ae.js (new) 14.3 kB 🔴 +14.3 kB 🔴 +4 kB 🔴 +3.58 kB
assets/ComfyQueueButton-DH1GX6IY.js (removed) 14.3 kB 🟢 -14.3 kB 🟢 -4 kB 🟢 -3.58 kB
assets/useTerminalTabs-BtXUE2O-.js (new) 10.4 kB 🔴 +10.4 kB 🔴 +3.5 kB 🔴 +3.08 kB
assets/useTerminalTabs-ofJT_47R.js (removed) 10.4 kB 🟢 -10.4 kB 🟢 -3.5 kB 🟢 -3.08 kB
assets/SubscribeButton-BE0eovsh.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -918 B
assets/SubscribeButton-Dnv0bX9W.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.05 kB 🔴 +918 B
assets/cloudFeedbackTopbarButton-DjorCoRA.js (new) 1.43 kB 🔴 +1.43 kB 🔴 +743 B 🔴 +667 B
assets/cloudFeedbackTopbarButton-DTNhstw4.js (removed) 1.43 kB 🟢 -1.43 kB 🟢 -741 B 🟢 -663 B
assets/ComfyQueueButton-CWalOw-X.js (removed) 793 B 🟢 -793 B 🟢 -394 B 🟢 -352 B
assets/ComfyQueueButton-D6-OwZT3.js (new) 793 B 🔴 +793 B 🔴 +395 B 🔴 +349 B
assets/Button-CzCLfUsG.js 3.42 kB 3.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-B8l4Ioh2.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-BpEgMicB.js 3.94 kB 3.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-Dx7LngHp.js 6.27 kB 6.27 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/toggle-group-By5E1G-i.js 4.03 kB 4.03 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-Bnm3BoM3.js 7.53 kB 7.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-XBmTe5nW.js 1.24 kB 1.24 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-C5HuExH9.js 2.04 kB 2.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

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

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-C5Ug0yUX.js (new) 2.15 MB 🔴 +2.15 MB 🔴 +495 kB 🔴 +370 kB
assets/dialogService-CdvXzRgr.js (removed) 2.15 MB 🟢 -2.15 MB 🟢 -495 kB 🟢 -370 kB
assets/api-Bsz7cux6.js (removed) 862 kB 🟢 -862 kB 🟢 -206 kB 🟢 -162 kB
assets/api-DV17IX5B.js (new) 862 kB 🔴 +862 kB 🔴 +206 kB 🔴 +162 kB
assets/load3dService-BxbEt1EX.js (new) 93.3 kB 🔴 +93.3 kB 🔴 +19.8 kB 🔴 +17 kB
assets/load3dService-CYtnHqzJ.js (removed) 93.3 kB 🟢 -93.3 kB 🟢 -19.8 kB 🟢 -17 kB
assets/extensionStore-BRPzNv33.js (removed) 19.9 kB 🟢 -19.9 kB 🟢 -6.7 kB 🟢 -5.87 kB
assets/extensionStore-CjfiJ89A.js (new) 19.9 kB 🔴 +19.9 kB 🔴 +6.7 kB 🔴 +5.86 kB
assets/workflowShareService-BgPf_DPQ.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +4.32 kB 🔴 +3.81 kB
assets/workflowShareService-v0Uv9ITF.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -4.32 kB 🟢 -3.8 kB
assets/releaseStore-C84N7pfM.js (new) 8.07 kB 🔴 +8.07 kB 🔴 +2.26 kB 🔴 +1.98 kB
assets/releaseStore-DMpKjnSv.js (removed) 8.07 kB 🟢 -8.07 kB 🟢 -2.25 kB 🟢 -1.98 kB
assets/keybindingService-B5ppWniF.js (new) 6.99 kB 🔴 +6.99 kB 🔴 +1.74 kB 🔴 +1.5 kB
assets/keybindingService-Dre4LgTP.js (removed) 6.99 kB 🟢 -6.99 kB 🟢 -1.73 kB 🟢 -1.49 kB
assets/userStore-8ctU6_A1.js (new) 2.24 kB 🔴 +2.24 kB 🔴 +872 B 🔴 +764 B
assets/userStore-uUsw0KB0.js (removed) 2.24 kB 🟢 -2.24 kB 🟢 -869 B 🟢 -765 B
assets/bootstrapStore-C407xYX7.js (new) 2.11 kB 🔴 +2.11 kB 🔴 +892 B 🔴 +810 B
assets/bootstrapStore-ceewq-F2.js (removed) 2.11 kB 🟢 -2.11 kB 🟢 -891 B 🟢 -807 B
assets/audioService-BawzHS8x.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +866 B 🔴 +742 B
assets/audioService-BehI35KS.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -865 B 🟢 -746 B
assets/releaseStore-C4pa4mOM.js (new) 760 B 🔴 +760 B 🔴 +387 B 🔴 +339 B
assets/releaseStore-DdV9BELo.js (removed) 760 B 🟢 -760 B 🟢 -384 B 🟢 -340 B
assets/workflowDraftStore-BSSXem0c.js (new) 736 B 🔴 +736 B 🔴 +380 B 🔴 +336 B
assets/workflowDraftStore-CaUW2jTI.js (removed) 736 B 🟢 -736 B 🟢 -378 B 🟢 -334 B
assets/dialogService-B8jzNYyC.js (new) 725 B 🔴 +725 B 🔴 +371 B 🔴 +331 B
assets/dialogService-B9_w395O.js (removed) 725 B 🟢 -725 B 🟢 -366 B 🟢 -329 B
assets/settingStore-DhHRUWXp.js (removed) 723 B 🟢 -723 B 🟢 -373 B 🟢 -328 B
assets/settingStore-Dvc5Xhp9.js (new) 723 B 🔴 +723 B 🔴 +375 B 🔴 +331 B
assets/assetsStore-C9PfcxQt.js (removed) 722 B 🟢 -722 B 🟢 -369 B 🟢 -329 B
assets/assetsStore-Qte-cxUX.js (new) 722 B 🔴 +722 B 🔴 +375 B 🔴 +332 B
assets/serverConfigStore-BMw7voHC.js 2.35 kB 2.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 15 added / 15 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3dViewer-BSJ3HtLL.js (removed) 15.1 kB 🟢 -15.1 kB 🟢 -3.42 kB 🟢 -3.03 kB
assets/useLoad3dViewer-CH-ytChx.js (new) 15.1 kB 🔴 +15.1 kB 🔴 +3.42 kB 🔴 +3.02 kB
assets/useLoad3d-CcESPFSf.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.65 kB 🔴 +3.23 kB
assets/useLoad3d-sV4PKRUa.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.65 kB 🟢 -3.23 kB
assets/useFeatureFlags-aBYzJ7W-.js (new) 5.78 kB 🔴 +5.78 kB 🔴 +1.75 kB 🔴 +1.48 kB
assets/useFeatureFlags-B4RdRbXy.js (removed) 5.78 kB 🟢 -5.78 kB 🟢 -1.75 kB 🟢 -1.48 kB
assets/useWorkspaceUI--R3vc9aT.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -978 B 🟢 -812 B
assets/useWorkspaceUI-DZZH1Ceb.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +979 B 🔴 +812 B
assets/subscriptionCheckoutUtil-B79qtG5n.js (new) 3.04 kB 🔴 +3.04 kB 🔴 +1.32 kB 🔴 +1.15 kB
assets/subscriptionCheckoutUtil-BWXrwXTa.js (removed) 3.04 kB 🟢 -3.04 kB 🟢 -1.31 kB 🟢 -1.15 kB
assets/useUpstreamValue-BkvWtA1F.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -803 B 🟢 -718 B
assets/useUpstreamValue-jeG1cvWU.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +804 B 🔴 +713 B
assets/useErrorHandling-1Rh-Zq-v.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +651 B 🔴 +554 B
assets/useErrorHandling-BPMjGFrB.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -649 B 🟢 -550 B
assets/audioUtils-Bm2Ei2cL.js (removed) 958 B 🟢 -958 B 🟢 -564 B 🟢 -497 B
assets/audioUtils-Diwjhfci.js (new) 958 B 🔴 +958 B 🔴 +563 B 🔴 +462 B
assets/useLoad3d-DMHSimja.js (removed) 859 B 🟢 -859 B 🟢 -423 B 🟢 -377 B
assets/useLoad3d-DOzGWhG3.js (new) 859 B 🔴 +859 B 🔴 +426 B 🔴 +378 B
assets/useLoad3dViewer-BPnfuiZB.js (new) 838 B 🔴 +838 B 🔴 +410 B 🔴 +367 B
assets/useLoad3dViewer-DKIfFtdF.js (removed) 838 B 🟢 -838 B 🟢 -407 B 🟢 -366 B
assets/useWorkspaceSwitch-B_AGWjfi.js (new) 747 B 🔴 +747 B 🔴 +387 B 🔴 +332 B
assets/useWorkspaceSwitch-nYjZQ3CY.js (removed) 747 B 🟢 -747 B 🟢 -385 B 🟢 -329 B
assets/useCurrentUser-B6dVLIDt.js (removed) 722 B 🟢 -722 B 🟢 -372 B 🟢 -330 B
assets/useCurrentUser-zI1oSrwa.js (new) 722 B 🔴 +722 B 🔴 +375 B 🔴 +332 B
assets/_plugin-vue_export-helper-DqNI4win.js 365 B 365 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/assetMetadataUtils-Cu1m4aen.js 4.78 kB 4.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-BoDX6eKf.js 8.89 kB 8.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-BOOGgtql.js 489 B 489 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-AGO63igr.js 1.59 kB 1.59 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-BrLYgVOH.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-_Rbq0GZz.js 3.04 kB 3.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-B-zaJ78_.js 93 kB 93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-QIvOlSgA.js 411 kB 411 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-x5F51RZV.js 1.01 MB 1.01 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-TjUfhse9.js 140 kB 140 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-BAquA4iy.js 110 kB 110 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-DD8n2cnE.js 1.76 MB 1.76 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-DGRjWEoA.js 1.75 MB 1.75 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-CCjqphhL.js 474 kB 474 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-Dn2jSJwd.js 267 kB 267 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-D0iKHrgP.js 1.83 MB 1.83 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-bePjZBYs.js 737 kB 737 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-Ba0aGEmU.js 328 kB 328 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-DrtiTSko.js 136 kB 136 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-DZ7n4cB7.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-B0izGxZ6.js 246 kB 246 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-W_VsqAhz.js 111 kB 111 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 8.21 MB (baseline 8.21 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-D9C4jBBe.js (removed) 75.7 kB 🟢 -75.7 kB 🟢 -19.5 kB 🟢 -16.7 kB
assets/core-DGtqDYN8.js (new) 75.7 kB 🔴 +75.7 kB 🔴 +19.6 kB 🔴 +16.7 kB
assets/groupNode-CUsPgvya.js (removed) 73.9 kB 🟢 -73.9 kB 🟢 -18.5 kB 🟢 -16.2 kB
assets/groupNode-Dx-CjDcL.js (new) 73.9 kB 🔴 +73.9 kB 🔴 +18.5 kB 🔴 +16.3 kB
assets/WidgetSelect-B96StZUD.js (removed) 63.2 kB 🟢 -63.2 kB 🟢 -13.8 kB 🟢 -11.9 kB
assets/WidgetSelect-D7cfXq6l.js (new) 63.2 kB 🔴 +63.2 kB 🔴 +13.8 kB 🔴 +11.9 kB
assets/SubscriptionRequiredDialogContentWorkspace-Dbgq6d46.js (new) 47.1 kB 🔴 +47.1 kB 🔴 +8.76 kB 🔴 +7.58 kB
assets/SubscriptionRequiredDialogContentWorkspace-DMboqq_F.js (removed) 47.1 kB 🟢 -47.1 kB 🟢 -8.75 kB 🟢 -7.56 kB
assets/WidgetPainter-CP0iVXnj.js (new) 33.1 kB 🔴 +33.1 kB 🔴 +8.01 kB 🔴 +7.11 kB
assets/WidgetPainter-O7lk9fU_.js (removed) 33.1 kB 🟢 -33.1 kB 🟢 -8.01 kB 🟢 -7.12 kB
assets/Load3DControls-C383Y7wh.js (new) 32.1 kB 🔴 +32.1 kB 🔴 +5.47 kB 🔴 +4.75 kB
assets/Load3DControls-M-DM_foc.js (removed) 32.1 kB 🟢 -32.1 kB 🟢 -5.47 kB 🟢 -4.76 kB
assets/WorkspacePanelContent-D89zd_1C.js (removed) 29.7 kB 🟢 -29.7 kB 🟢 -6.22 kB 🟢 -5.45 kB
assets/WorkspacePanelContent-DARBq3k9.js (new) 29.7 kB 🔴 +29.7 kB 🔴 +6.23 kB 🔴 +5.46 kB
assets/SubscriptionRequiredDialogContent-Cf0KAPCW.js (removed) 26.1 kB 🟢 -26.1 kB 🟢 -6.61 kB 🟢 -5.83 kB
assets/SubscriptionRequiredDialogContent-DIop44Z2.js (new) 26.1 kB 🔴 +26.1 kB 🔴 +6.62 kB 🔴 +5.82 kB
assets/Load3dViewerContent-CJQNiR5T.js (new) 24.3 kB 🔴 +24.3 kB 🔴 +5.31 kB 🔴 +4.62 kB
assets/Load3dViewerContent-D6-o6THj.js (removed) 24.3 kB 🟢 -24.3 kB 🟢 -5.32 kB 🟢 -4.63 kB
assets/WidgetImageCrop-BKr1topQ.js (new) 23.1 kB 🔴 +23.1 kB 🔴 +5.75 kB 🔴 +5.07 kB
assets/WidgetImageCrop-Crs4AVBS.js (removed) 23.1 kB 🟢 -23.1 kB 🟢 -5.75 kB 🟢 -5.08 kB
assets/SubscriptionPanelContentWorkspace-3t6ZqIGW.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.17 kB 🟢 -4.55 kB
assets/SubscriptionPanelContentWorkspace-hdGiW-o_.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.17 kB 🔴 +4.56 kB
assets/CurrentUserPopoverWorkspace-BnaXBd6-.js (new) 20.8 kB 🔴 +20.8 kB 🔴 +4.99 kB 🔴 +4.45 kB
assets/CurrentUserPopoverWorkspace-J3ru3ZDU.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -4.99 kB 🟢 -4.45 kB
assets/SignInContent-C28lbMmr.js (new) 20 kB 🔴 +20 kB 🔴 +5.16 kB 🔴 +4.51 kB
assets/SignInContent-DlBu4Qtl.js (removed) 20 kB 🟢 -20 kB 🟢 -5.16 kB 🟢 -4.5 kB
assets/WidgetInputNumber-BqYsWIJw.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.84 kB 🔴 +4.29 kB
assets/WidgetInputNumber-DiFHcxf7.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.84 kB 🟢 -4.3 kB
assets/WidgetRecordAudio-cJOQUbus.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -5.09 kB 🟢 -4.57 kB
assets/WidgetRecordAudio-DhoDjxQp.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +5.1 kB 🔴 +4.57 kB
assets/Load3D-7isBbLgw.js (removed) 16.8 kB 🟢 -16.8 kB 🟢 -4.11 kB 🟢 -3.6 kB
assets/Load3D-REMQH3Gi.js (new) 16.8 kB 🔴 +16.8 kB 🔴 +4.12 kB 🔴 +3.6 kB
assets/load3d-Cn-tWdQM.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.2 kB 🟢 -3.65 kB
assets/load3d-iyZQ4K2V.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.21 kB 🔴 +3.65 kB
assets/WidgetCurve-CIUTRDfC.js (removed) 11.7 kB 🟢 -11.7 kB 🟢 -3.89 kB 🟢 -3.5 kB
assets/WidgetCurve-DfJe-sRw.js (new) 11.7 kB 🔴 +11.7 kB 🔴 +3.9 kB 🔴 +3.51 kB
assets/AudioPreviewPlayer-Bs9L4alo.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.3 kB 🟢 -2.96 kB
assets/AudioPreviewPlayer-wYKALrJn.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.3 kB 🔴 +2.95 kB
assets/nodeTemplates-CNE8y3JL.js (removed) 9.33 kB 🟢 -9.33 kB 🟢 -3.28 kB 🟢 -2.88 kB
assets/nodeTemplates-Dl8iGE1w.js (new) 9.33 kB 🔴 +9.33 kB 🔴 +3.28 kB 🔴 +2.88 kB
assets/InviteMemberDialogContent-CthHFudL.js (new) 7.53 kB 🔴 +7.53 kB 🔴 +2.36 kB 🔴 +2.05 kB
assets/InviteMemberDialogContent-D5zKdiTW.js (removed) 7.53 kB 🟢 -7.53 kB 🟢 -2.35 kB 🟢 -2.06 kB
assets/Load3DConfiguration-c6spx2uU.js (removed) 6.55 kB 🟢 -6.55 kB 🟢 -2.03 kB 🟢 -1.77 kB
assets/Load3DConfiguration-mJxljL71.js (new) 6.55 kB 🔴 +6.55 kB 🔴 +2.03 kB 🔴 +1.77 kB
assets/onboardingCloudRoutes-Btq1y9l9.js (new) 6.15 kB 🔴 +6.15 kB 🔴 +1.91 kB 🔴 +1.65 kB
assets/onboardingCloudRoutes-DUZc9cXi.js (removed) 6.15 kB 🟢 -6.15 kB 🟢 -1.91 kB 🟢 -1.67 kB
assets/WidgetWithControl-B7gazSnL.js (new) 5.76 kB 🔴 +5.76 kB 🔴 +2.25 kB 🔴 +2.03 kB
assets/WidgetWithControl-Csf-VHBt.js (removed) 5.76 kB 🟢 -5.76 kB 🟢 -2.25 kB 🟢 -2.01 kB
assets/CreateWorkspaceDialogContent-CPTA111F.js (new) 5.71 kB 🔴 +5.71 kB 🔴 +2.05 kB 🔴 +1.78 kB
assets/CreateWorkspaceDialogContent-DCUqI38T.js (removed) 5.71 kB 🟢 -5.71 kB 🟢 -2.05 kB 🟢 -1.78 kB
assets/FreeTierDialogContent-7M_RSxaE.js (removed) 5.54 kB 🟢 -5.54 kB 🟢 -1.93 kB 🟢 -1.72 kB
assets/FreeTierDialogContent-BTkiNHDN.js (new) 5.54 kB 🔴 +5.54 kB 🔴 +1.94 kB 🔴 +1.71 kB
assets/EditWorkspaceDialogContent-DTNEGa-_.js (new) 5.51 kB 🔴 +5.51 kB 🔴 +2.02 kB 🔴 +1.75 kB
assets/EditWorkspaceDialogContent-F3__FwVP.js (removed) 5.51 kB 🟢 -5.51 kB 🟢 -2.01 kB 🟢 -1.76 kB
assets/ValueControlPopover-CuW7YKzM.js (new) 5.1 kB 🔴 +5.1 kB 🔴 +1.82 kB 🔴 +1.63 kB
assets/ValueControlPopover-DvyMoOlv.js (removed) 5.1 kB 🟢 -5.1 kB 🟢 -1.82 kB 🟢 -1.63 kB
assets/Preview3d-BZRhFtST.js (removed) 5.08 kB 🟢 -5.08 kB 🟢 -1.67 kB 🟢 -1.46 kB
assets/Preview3d-CvgRbJqB.js (new) 5.08 kB 🔴 +5.08 kB 🔴 +1.67 kB 🔴 +1.45 kB
assets/WidgetTextarea-BZXxo41e.js (removed) 5.03 kB 🟢 -5.03 kB 🟢 -1.96 kB 🟢 -1.73 kB
assets/WidgetTextarea-DRLWToMh.js (new) 5.03 kB 🔴 +5.03 kB 🔴 +1.97 kB 🔴 +1.73 kB
assets/CancelSubscriptionDialogContent-BFTPpYXN.js (new) 4.98 kB 🔴 +4.98 kB 🔴 +1.85 kB 🔴 +1.62 kB
assets/CancelSubscriptionDialogContent-CxLneyiG.js (removed) 4.98 kB 🟢 -4.98 kB 🟢 -1.84 kB 🟢 -1.62 kB
assets/tierBenefits-GoEI5T7O.js (new) 4.47 kB 🔴 +4.47 kB 🔴 +1.58 kB 🔴 +1.37 kB
assets/tierBenefits-m5c9GWBG.js (removed) 4.47 kB 🟢 -4.47 kB 🟢 -1.58 kB 🟢 -1.36 kB
assets/DeleteWorkspaceDialogContent-Cv_GMzfs.js (new) 4.41 kB 🔴 +4.41 kB 🔴 +1.69 kB 🔴 +1.47 kB
assets/DeleteWorkspaceDialogContent-DA1kh0m1.js (removed) 4.41 kB 🟢 -4.41 kB 🟢 -1.69 kB 🟢 -1.47 kB
assets/LeaveWorkspaceDialogContent-BTB2TjZ_.js (new) 4.24 kB 🔴 +4.24 kB 🔴 +1.64 kB 🔴 +1.42 kB
assets/LeaveWorkspaceDialogContent-DCIp9Ugs.js (removed) 4.24 kB 🟢 -4.24 kB 🟢 -1.64 kB 🟢 -1.42 kB
assets/RemoveMemberDialogContent-DPkLmf6a.js (removed) 4.22 kB 🟢 -4.22 kB 🟢 -1.59 kB 🟢 -1.39 kB
assets/RemoveMemberDialogContent-GYRqlP0g.js (new) 4.22 kB 🔴 +4.22 kB 🔴 +1.59 kB 🔴 +1.38 kB
assets/RevokeInviteDialogContent-BAR3SX7U.js (removed) 4.13 kB 🟢 -4.13 kB 🟢 -1.6 kB 🟢 -1.4 kB
assets/RevokeInviteDialogContent-CQOvJmDh.js (new) 4.13 kB 🔴 +4.13 kB 🔴 +1.6 kB 🔴 +1.4 kB
assets/InviteMemberUpsellDialogContent-B-w_12oG.js (removed) 4.03 kB 🟢 -4.03 kB 🟢 -1.46 kB 🟢 -1.28 kB
assets/InviteMemberUpsellDialogContent-Bp-w-ZP9.js (new) 4.03 kB 🔴 +4.03 kB 🔴 +1.47 kB 🔴 +1.28 kB
assets/cloudSessionCookie-BhJM3gUI.js (new) 3.9 kB 🔴 +3.9 kB 🔴 +1.39 kB 🔴 +1.19 kB
assets/cloudSessionCookie-BOvBv9vD.js (removed) 3.9 kB 🟢 -3.9 kB 🟢 -1.38 kB 🟢 -1.2 kB
assets/saveMesh-9lR5WUTw.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +1.47 kB 🔴 +1.3 kB
assets/saveMesh-CsHAopF7.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -1.46 kB 🟢 -1.3 kB
assets/GlobalToast-C8AEKpU4.js (new) 3.04 kB 🔴 +3.04 kB 🔴 +1.26 kB 🔴 +1.08 kB
assets/GlobalToast-Cjv7DJFT.js (removed) 3.04 kB 🟢 -3.04 kB 🟢 -1.26 kB 🟢 -1.08 kB
assets/SubscribeToRun-BAN2nvCm.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +979 B 🔴 +874 B
assets/SubscribeToRun-C0FoHOG1.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -977 B 🟢 -878 B
assets/CloudRunButtonWrapper-CcyUh6cu.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +812 B 🔴 +721 B
assets/CloudRunButtonWrapper-Cnd5nz8f.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -809 B 🟢 -740 B
assets/cloudBadges-BFj982Lk.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -788 B 🟢 -692 B
assets/cloudBadges-OySEpAQr.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +790 B 🔴 +701 B
assets/previousFullPath-DGwZQMMU.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +695 B 🔴 +602 B
assets/previousFullPath-DVhcI05Z.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -692 B 🟢 -619 B
assets/cloudSubscription-1M_ePFO2.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +711 B 🔴 +608 B
assets/cloudSubscription-DjlC2zAs.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -706 B 🟢 -612 B
assets/Load3D-BFO8kr70.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +501 B 🔴 +443 B
assets/Load3D-BZdIuFk_.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -495 B 🟢 -445 B
assets/nightlyBadges-Bz7ADkdS.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +557 B 🔴 +496 B
assets/nightlyBadges-CXBjvDM_.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -553 B 🟢 -500 B
assets/Load3dViewerContent-DTMdkSRv.js (new) 993 B 🔴 +993 B 🔴 +468 B 🔴 +417 B
assets/Load3dViewerContent-v1-Tit22.js (removed) 993 B 🟢 -993 B 🟢 -465 B 🟢 -417 B
assets/SubscriptionPanelContentWorkspace-BSjC8tUU.js (removed) 920 B 🟢 -920 B 🟢 -438 B 🟢 -379 B
assets/SubscriptionPanelContentWorkspace-Dp_1yubH.js (new) 920 B 🔴 +920 B 🔴 +439 B 🔴 +378 B
assets/graphHasMissingNodes-Ddl6rrl5.js (new) 822 B 🔴 +822 B 🔴 +414 B 🔴 +347 B
assets/graphHasMissingNodes-DekfbCCj.js (removed) 822 B 🟢 -822 B 🟢 -413 B 🟢 -348 B
assets/WidgetLegacy-CjsY5Eh6.js (removed) 744 B 🟢 -744 B 🟢 -384 B 🟢 -340 B
assets/WidgetLegacy-DIfnMQeo.js (new) 744 B 🔴 +744 B 🔴 +387 B 🔴 +342 B
assets/changeTracker-B-VESS32.js (removed) 720 B 🟢 -720 B 🟢 -370 B 🟢 -330 B
assets/changeTracker-DiiwpUGH.js (new) 720 B 🔴 +720 B 🔴 +375 B 🔴 +329 B
assets/AnimationControls-D_ssPKpl.js 4.78 kB 4.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-122DuhFE.js 2.86 kB 2.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-Da_dLKSr.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-BO4bu8SW.js 1.92 kB 1.92 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single--m8ho-x0.js 272 B 272 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-B5_02-pL.js 960 B 960 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-6C7uscef.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-aHWGoXwC.js 15.3 kB 15.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B0dAi43J.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Bm9EUr3J.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Bp4kggpz.js 17.8 kB 17.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CfrqwZHT.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CWNMjnpx.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D6U7YFhN.js 17.8 kB 17.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DC5sgzz0.js 19.1 kB 19.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Dm1AG3mI.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-pcbFneET.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-CDJrbKEX.js 766 B 766 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-CfPFpEth.js 553 kB 553 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-E31GmVX_.js 137 B 137 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Loader-D9NTeFNU.js 1.26 kB 1.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BIs1qLld.js 204 kB 204 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BUVqJDoB.js 187 kB 187 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BYJEKs0c.js 162 kB 162 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CBpFsmCa.js 168 kB 168 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CduD3FWK.js 165 kB 165 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CE7GagrW.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CO5hcLH6.js 171 kB 171 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cpo91t82.js 144 kB 144 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Db-L7jAY.js 196 kB 196 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DbpvTHsj.js 228 kB 228 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-ULS0BFNt.js 163 kB 163 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-lR1JiQqq.js 1.98 kB 1.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-DDwe88_i.js 1.59 kB 1.59 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-B3Ndzn8y.js 2.02 kB 2.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-DLyNtqwJ.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-BPdj4Cu9.js 1.06 kB 1.06 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-DKoWz3mq.js 2.94 kB 2.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/NightlySurveyController-BJ7Yfxt0.js 9.5 kB 9.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BhazHjGG.js 373 kB 373 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BHJWB8Hi.js 411 kB 411 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BLiR_Cci.js 423 kB 423 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BwxSR87L.js 500 kB 500 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C109fHHV.js 459 kB 459 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CeR-W4r5.js 406 kB 406 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CVv25Zq-.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CYNwkBlA.js 403 kB 403 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DGeylh_m.js 458 kB 458 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Dimlxn51.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DXcKksxR.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-xbED3XYT.js 3.77 kB 3.77 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DBfy44LZ.js 2.02 kB 2.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-BkB8Nehs.js 9.8 kB 9.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-Cp3pGVrA.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-BYG1u0oC.js 3.57 kB 3.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-C5oPOZUH.js 290 B 290 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-CecH6qXS.js 2.28 kB 2.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-7ZMuZPoG.js 443 B 443 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Textarea-BCdbAQYh.js 1.42 kB 1.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-BqIM6TDt.js 313 B 313 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-BEMiTJfJ.js 1.51 kB 1.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DloL8--t.js 3.5 kB 3.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BR7_6Tzc.js 3.62 kB 3.62 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-C7hcUvUl.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-Br2tE61m.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-7LajmWlG.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-BP4f8SEB.js 3.8 kB 3.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-DRrbKltR.js 7.78 kB 7.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-DZD-PABh.js 3.09 kB 3.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-DQtrhTV6.js 2.37 kB 2.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-CifbFnvo.js 3.13 kB 3.13 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-U-tRpxOF.js 1.52 kB 1.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-CMqqTQxu.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-ju3asrao.js 416 B 416 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 52 added / 52 removed

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (2)
.github/workflows/pr-report.yaml (1)

195-211: Legacy comment deletion won't paginate beyond 100 comments.

listComments with per_page: 100 will only return the first 100 comments. For PRs with more comments, legacy markers beyond the first page won't be deleted. This is likely acceptable for most cases, but worth noting if legacy cleanup completeness is important.

♻️ Optional: Add pagination for complete cleanup
-            const { data: comments } = await github.rest.issues.listComments({
-              owner: context.repo.owner,
-              repo: context.repo.repo,
-              issue_number: prNumber,
-              per_page: 100,
-            });
+            const comments = await github.paginate(github.rest.issues.listComments, {
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              issue_number: prNumber,
+              per_page: 100,
+            });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/pr-report.yaml around lines 195 - 211, The current cleanup
only fetches the first page because github.rest.issues.listComments is called
with per_page: 100; replace that call with Octokit's pagination (e.g.,
github.paginate or octokit.paginate) to retrieve all comments for the PR before
iterating, then keep the existing loop that checks legacyMarkers and calls
github.rest.issues.deleteComment for each match; update the variable usage
around the returned collection (comments) so the for (const comment of comments)
logic operates on the fully paginated list instead of a single page.
scripts/unified-report.js (1)

21-27: Consider adding error handling for subprocess failures.

execFileSync will throw if the child process exits with a non-zero code. While the workflow may handle step failures, wrapping these calls in try-catch would allow for graceful fallback messages in the report rather than workflow failures.

♻️ Optional: Add try-catch for graceful degradation
 if (sizeStatus === 'ready') {
-  const sizeReport = execFileSync(
-    'node',
-    ['scripts/size-report.js'],
-    { encoding: 'utf-8' }
-  ).trimEnd()
-  lines.push(sizeReport)
+  try {
+    const sizeReport = execFileSync(
+      'node',
+      ['scripts/size-report.js'],
+      { encoding: 'utf-8' }
+    ).trimEnd()
+    lines.push(sizeReport)
+  } catch {
+    lines.push('## 📦 Bundle Size')
+    lines.push('')
+    lines.push('> ⚠️ Size report generation failed. Check the CI workflow logs.')
+  }
 } else if (sizeStatus === 'failed') {

Apply similar wrapping for the perf section (lines 42-47).

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

In `@scripts/unified-report.js` around lines 21 - 27, Wrap the synchronous
child-process calls that build the report in try-catch blocks to avoid crashing
the whole script on non-zero exits: specifically, surround the execFileSync call
that runs 'node' with ['scripts/size-report.js'] (used when sizeStatus ===
'ready' and assigns sizeReport, then pushes to lines) with try/catch and on
error push a clear fallback message (including error.message) to lines instead
of letting the exception propagate; do the same for the perf execFileSync call
that runs ['scripts/perf-report.js'] (the code that assigns perfReport and
pushes to lines) so both sections gracefully degrade and include error details
in the report.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In @.github/workflows/pr-report.yaml:
- Around line 195-211: The current cleanup only fetches the first page because
github.rest.issues.listComments is called with per_page: 100; replace that call
with Octokit's pagination (e.g., github.paginate or octokit.paginate) to
retrieve all comments for the PR before iterating, then keep the existing loop
that checks legacyMarkers and calls github.rest.issues.deleteComment for each
match; update the variable usage around the returned collection (comments) so
the for (const comment of comments) logic operates on the fully paginated list
instead of a single page.

In `@scripts/unified-report.js`:
- Around line 21-27: Wrap the synchronous child-process calls that build the
report in try-catch blocks to avoid crashing the whole script on non-zero exits:
specifically, surround the execFileSync call that runs 'node' with
['scripts/size-report.js'] (used when sizeStatus === 'ready' and assigns
sizeReport, then pushes to lines) with try/catch and on error push a clear
fallback message (including error.message) to lines instead of letting the
exception propagate; do the same for the perf execFileSync call that runs
['scripts/perf-report.js'] (the code that assigns perfReport and pushes to
lines) so both sections gracefully degrade and include error details in the
report.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 2f3578dd-819d-4e0a-a1c2-07a878ad33f1

📥 Commits

Reviewing files that changed from the base of the PR and between 11fc092 and b982aeb.

📒 Files selected for processing (6)
  • .github/workflows/ci-perf-report.yaml
  • .github/workflows/ci-size-data.yaml
  • .github/workflows/pr-perf-report.yaml
  • .github/workflows/pr-report.yaml
  • .github/workflows/pr-size-report.yaml
  • scripts/unified-report.js
💤 Files with no reviewable changes (2)
  • .github/workflows/pr-size-report.yaml
  • .github/workflows/pr-perf-report.yaml

@github-actions
Copy link

github-actions bot commented Mar 14, 2026

⚡ Performance Report

⚠️ 2 regressions detected

Metric Baseline PR (n=3) Δ Sig
canvas-mouse-sweep: DOM nodes 66 90 +36% ⚠️ z=12.0
subgraph-mouse-sweep: DOM nodes 78 93 +19% ⚠️ z=2.1
All metrics
Metric Baseline PR (n=3) Δ Sig
canvas-idle: style recalcs 12 13 +3% z=1.1
canvas-idle: layouts 0 0 +0% variance too high
canvas-idle: task duration 362ms 395ms +9% z=-0.1
canvas-idle: DOM nodes 37 37 +0% z=0.7
canvas-idle: script duration 22ms 27ms +22% z=0.1
canvas-idle: event listeners 12 12 +0% variance too high
canvas-mouse-sweep: style recalcs 81 78 -4% z=-2.1
canvas-mouse-sweep: layouts 12 13 +6%
canvas-mouse-sweep: task duration 923ms 798ms -14% z=-2.0
canvas-mouse-sweep: DOM nodes 66 90 +36% ⚠️ z=12.0
canvas-mouse-sweep: script duration 136ms 127ms -7% z=-1.5
canvas-mouse-sweep: event listeners 6 15 +156%
dom-widget-clipping: style recalcs 14 13 -7%
dom-widget-clipping: layouts 0 0 +0% variance too high
dom-widget-clipping: task duration 343ms 345ms +1% z=-0.7
dom-widget-clipping: DOM nodes 23 22 -4% z=-0.8
dom-widget-clipping: script duration 65ms 62ms -5% z=-1.1
dom-widget-clipping: event listeners 2 2 +0% variance too high
large-graph-idle: style recalcs 13 14 +8%
large-graph-idle: layouts 1 1 +50%
large-graph-idle: task duration 493ms 568ms +15%
large-graph-idle: DOM nodes 53 69 +30%
large-graph-idle: script duration 93ms 99ms +7%
large-graph-idle: event listeners 17 23 +33%
large-graph-pan: style recalcs 70 70 +0%
large-graph-pan: layouts 0 0 +0%
large-graph-pan: task duration 1001ms 1110ms +11%
large-graph-pan: DOM nodes 22 21 -3%
large-graph-pan: script duration 387ms 401ms +4%
large-graph-pan: event listeners 6 6 +0%
subgraph-dom-widget-clipping: style recalcs 51 50 -2% z=-0.7
subgraph-dom-widget-clipping: layouts 1 0 -50%
subgraph-dom-widget-clipping: task duration 376ms 381ms +1% z=-0.5
subgraph-dom-widget-clipping: DOM nodes 53 38 -28% z=-62.9
subgraph-dom-widget-clipping: script duration 125ms 124ms -1% z=-1.1
subgraph-dom-widget-clipping: event listeners 19 14 -29%
subgraph-idle: style recalcs 13 13 +0% z=0.7
subgraph-idle: layouts 0 0 +0% variance too high
subgraph-idle: task duration 351ms 373ms +6% z=-0.2
subgraph-idle: DOM nodes 39 38 -2% z=0.6
subgraph-idle: script duration 18ms 20ms +11% z=-0.2
subgraph-idle: event listeners 12 12 +0% variance too high
subgraph-mouse-sweep: style recalcs 78 78 +1% z=-0.6
subgraph-mouse-sweep: layouts 16 17 +2%
subgraph-mouse-sweep: task duration 666ms 762ms +14% z=-0.2
subgraph-mouse-sweep: DOM nodes 78 93 +19% ⚠️ z=2.1
subgraph-mouse-sweep: script duration 98ms 98ms -0% z=-0.7
subgraph-mouse-sweep: event listeners 11 16 +45%
Historical variance (last 2 runs)
Metric μ σ CV
canvas-idle: style recalcs 12 1 8.1%
canvas-idle: layouts 0 0 141.4%
canvas-idle: task duration 400ms 54ms 13.5%
canvas-idle: DOM nodes 30 10 35.0%
canvas-idle: script duration 26ms 6ms 22.2%
canvas-idle: event listeners 9 4 52.7%
canvas-mouse-sweep: style recalcs 83 2 2.8%
canvas-mouse-sweep: layouts 12 0 0.0%
canvas-mouse-sweep: task duration 991ms 97ms 9.7%
canvas-mouse-sweep: DOM nodes 67 2 2.8%
canvas-mouse-sweep: script duration 144ms 11ms 7.8%
canvas-mouse-sweep: event listeners 6 0 0.0%
dom-widget-clipping: style recalcs 14 0 0.0%
dom-widget-clipping: layouts 0 0 141.4%
dom-widget-clipping: task duration 372ms 41ms 10.9%
dom-widget-clipping: DOM nodes 30 10 32.0%
dom-widget-clipping: script duration 70ms 8ms 10.8%
dom-widget-clipping: event listeners 5 4 82.9%
subgraph-dom-widget-clipping: style recalcs 51 1 1.4%
subgraph-dom-widget-clipping: layouts 1 0 0.0%
subgraph-dom-widget-clipping: task duration 391ms 21ms 5.3%
subgraph-dom-widget-clipping: DOM nodes 53 0 0.4%
subgraph-dom-widget-clipping: script duration 127ms 3ms 2.2%
subgraph-dom-widget-clipping: event listeners 19 0 0.0%
subgraph-idle: style recalcs 12 1 10.0%
subgraph-idle: layouts 0 0 141.4%
subgraph-idle: task duration 384ms 46ms 11.9%
subgraph-idle: DOM nodes 31 12 37.9%
subgraph-idle: script duration 21ms 4ms 18.4%
subgraph-idle: event listeners 9 4 52.7%
subgraph-mouse-sweep: style recalcs 81 4 5.5%
subgraph-mouse-sweep: layouts 16 0 0.0%
subgraph-mouse-sweep: task duration 804ms 195ms 24.2%
subgraph-mouse-sweep: DOM nodes 82 5 6.3%
subgraph-mouse-sweep: script duration 106ms 11ms 10.8%
subgraph-mouse-sweep: event listeners 11 0 0.0%
Raw data
{
  "timestamp": "2026-03-15T10:42:42.426Z",
  "gitSha": "6287e3c25135e8c88009c7394c2cf2258e42019a",
  "branch": "feat/unified-pr-perf-report",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2030.7090000000017,
      "styleRecalcs": 15,
      "styleRecalcDurationMs": 15.303999999999998,
      "layouts": 1,
      "layoutDurationMs": 0.30099999999999993,
      "taskDurationMs": 381.31299999999993,
      "heapDeltaBytes": 1266604,
      "domNodes": 68,
      "jsHeapTotalBytes": 18874368,
      "scriptDurationMs": 23.270000000000003,
      "eventListeners": 23
    },
    {
      "name": "canvas-idle",
      "durationMs": 2028.9999999999964,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 10.059999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 382.424,
      "heapDeltaBytes": 1286412,
      "domNodes": 22,
      "jsHeapTotalBytes": 18350080,
      "scriptDurationMs": 27.266,
      "eventListeners": 6
    },
    {
      "name": "canvas-idle",
      "durationMs": 2037.7480000000219,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.665999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 421.427,
      "heapDeltaBytes": 542756,
      "domNodes": 21,
      "jsHeapTotalBytes": 18874368,
      "scriptDurationMs": 30.063,
      "eventListeners": 6
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1820.0630000000046,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 43.052,
      "layouts": 13,
      "layoutDurationMs": 3.826,
      "taskDurationMs": 764.972,
      "heapDeltaBytes": -2775092,
      "domNodes": 104,
      "jsHeapTotalBytes": 19922944,
      "scriptDurationMs": 122.88399999999999,
      "eventListeners": 21
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1888.3789999999863,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 52.656,
      "layouts": 13,
      "layoutDurationMs": 4.1419999999999995,
      "taskDurationMs": 832.1999999999999,
      "heapDeltaBytes": -3339944,
      "domNodes": 106,
      "jsHeapTotalBytes": 19660800,
      "scriptDurationMs": 132.64,
      "eventListeners": 21
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1831.875000000025,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 42.87,
      "layouts": 12,
      "layoutDurationMs": 3.9489999999999994,
      "taskDurationMs": 797.7529999999999,
      "heapDeltaBytes": -2774472,
      "domNodes": 60,
      "jsHeapTotalBytes": 18350080,
      "scriptDurationMs": 126.554,
      "eventListeners": 4
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 551.2219999999957,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 9.172999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 341.774,
      "heapDeltaBytes": 12550500,
      "domNodes": 22,
      "jsHeapTotalBytes": 17825792,
      "scriptDurationMs": 60.24499999999999,
      "eventListeners": 2
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 571.4760000000183,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 9.575000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 352.123,
      "heapDeltaBytes": 12770676,
      "domNodes": 22,
      "jsHeapTotalBytes": 15466496,
      "scriptDurationMs": 63.56,
      "eventListeners": 2
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 549.5999999999981,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 8.476,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 339.8059999999999,
      "heapDeltaBytes": 7003736,
      "domNodes": 23,
      "jsHeapTotalBytes": 12845056,
      "scriptDurationMs": 61.224000000000004,
      "eventListeners": 2
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2021.9260000000077,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 14.335,
      "layouts": 1,
      "layoutDurationMs": 0.19399999999999973,
      "taskDurationMs": 547.071,
      "heapDeltaBytes": 16980216,
      "domNodes": 69,
      "jsHeapTotalBytes": 8101888,
      "scriptDurationMs": 100.65000000000002,
      "eventListeners": 23
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2047.7779999999939,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 15.286999999999999,
      "layouts": 1,
      "layoutDurationMs": 0.2179999999999999,
      "taskDurationMs": 613.2249999999999,
      "heapDeltaBytes": 16362432,
      "domNodes": 68,
      "jsHeapTotalBytes": 8712192,
      "scriptDurationMs": 102.984,
      "eventListeners": 23
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2046.1950000000115,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 13.098,
      "layouts": 1,
      "layoutDurationMs": 0.21699999999999975,
      "taskDurationMs": 543.3760000000001,
      "heapDeltaBytes": -10146900,
      "domNodes": 69,
      "jsHeapTotalBytes": 8364032,
      "scriptDurationMs": 93.593,
      "eventListeners": 23
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2100.732999999991,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 18.526999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1081.658,
      "heapDeltaBytes": 2871740,
      "domNodes": 22,
      "jsHeapTotalBytes": 9236480,
      "scriptDurationMs": 383.37,
      "eventListeners": 6
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2101.62600000001,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 17.566,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1130.7310000000002,
      "heapDeltaBytes": 3287232,
      "domNodes": 20,
      "jsHeapTotalBytes": 9760768,
      "scriptDurationMs": 415.835,
      "eventListeners": 6
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2110.810000000015,
      "styleRecalcs": 71,
      "styleRecalcDurationMs": 18.785000000000004,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1118.542,
      "heapDeltaBytes": 3130580,
      "domNodes": 22,
      "jsHeapTotalBytes": 8450048,
      "scriptDurationMs": 403.406,
      "eventListeners": 6
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 586.593999999991,
      "styleRecalcs": 52,
      "styleRecalcDurationMs": 16.939999999999998,
      "layouts": 1,
      "layoutDurationMs": 0.2840000000000001,
      "taskDurationMs": 379.707,
      "heapDeltaBytes": 13264068,
      "domNodes": 68,
      "jsHeapTotalBytes": 16515072,
      "scriptDurationMs": 118.099,
      "eventListeners": 25
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 580.8480000000031,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 12.134,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 388.90799999999996,
      "heapDeltaBytes": 12811388,
      "domNodes": 22,
      "jsHeapTotalBytes": 13369344,
      "scriptDurationMs": 130.67199999999997,
      "eventListeners": 8
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 567.6339999999982,
      "styleRecalcs": 50,
      "styleRecalcDurationMs": 13.472999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 374.855,
      "heapDeltaBytes": 11794232,
      "domNodes": 25,
      "jsHeapTotalBytes": 17039360,
      "scriptDurationMs": 123.152,
      "eventListeners": 8
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2015.8680000000118,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 14.675,
      "layouts": 1,
      "layoutDurationMs": 0.27200000000000013,
      "taskDurationMs": 368.004,
      "heapDeltaBytes": 761124,
      "domNodes": 68,
      "jsHeapTotalBytes": 18874368,
      "scriptDurationMs": 19.338,
      "eventListeners": 23
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2000.4480000000058,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 10.306000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 383.275,
      "heapDeltaBytes": 260808,
      "domNodes": 22,
      "jsHeapTotalBytes": 18350080,
      "scriptDurationMs": 20.907000000000004,
      "eventListeners": 6
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2007.5969999999757,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 10.6,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 368.59600000000006,
      "heapDeltaBytes": 584948,
      "domNodes": 24,
      "jsHeapTotalBytes": 15990784,
      "scriptDurationMs": 20.948999999999995,
      "eventListeners": 6
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1731.5810000000056,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 46.457,
      "layouts": 16,
      "layoutDurationMs": 5.747999999999999,
      "taskDurationMs": 810.9699999999999,
      "heapDeltaBytes": 19307876,
      "domNodes": 65,
      "jsHeapTotalBytes": 19922944,
      "scriptDurationMs": 105.666,
      "eventListeners": 6
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1712.2810000000186,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 45.196,
      "layouts": 17,
      "layoutDurationMs": 5.154000000000001,
      "taskDurationMs": 764.544,
      "heapDeltaBytes": -7217048,
      "domNodes": 107,
      "jsHeapTotalBytes": 19398656,
      "scriptDurationMs": 97.54,
      "eventListeners": 21
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1693.853000000047,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 41.961,
      "layouts": 17,
      "layoutDurationMs": 4.774000000000001,
      "taskDurationMs": 709.518,
      "heapDeltaBytes": -7221904,
      "domNodes": 107,
      "jsHeapTotalBytes": 19398656,
      "scriptDurationMs": 90.727,
      "eventListeners": 21
    }
  ]
}

Replace separate pr-size-report.yaml and pr-perf-report.yaml with a
single pr-report.yaml aggregator that triggers on both CI workflow
completions. Produces one combined PR comment with bundle size and
performance sections, showing 'pending' placeholders for whichever
section hasn't completed yet.

Key changes:
- Add head-sha metadata to both CI workflows for stale-run detection
- Add concurrency to ci-size-data.yaml (matches ci-perf-report.yaml)
- Create unified-report.js that shells out to existing size-report.js
  and perf-report.ts, combining their output
- Clean up legacy separate comment markers on first run
- Use PR head SHA as concurrency key to prevent race conditions
@christian-byrne christian-byrne force-pushed the feat/unified-pr-perf-report branch from 70269a8 to 8b7a7e4 Compare March 15, 2026 10:32
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (1)
.github/workflows/pr-report.yaml (1)

195-211: Consider implementing pagination for legacy comment cleanup.

The code fetches comments without a page parameter, retrieving only the first ~100 comments. PRs with longer discussion threads will retain legacy markers beyond the first page.

For best results, use octokit's built-in pagination helper instead of manual looping:

const comments = await github.paginate(github.rest.issues.listComments, {
  owner: context.repo.owner,
  repo: context.repo.repo,
  issue_number: prNumber,
  per_page: 100,
});

This automatically handles all pages. For memory-sensitive scenarios, use github.paginate.iterator() to process page-by-page.

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

In @.github/workflows/pr-report.yaml around lines 195 - 211, The current cleanup
fetches only the first page via github.rest.issues.listComments (per_page:100)
so legacyMarkers and comment deletion loop can miss later pages; replace that
call with octokit's pagination (use
github.paginate(github.rest.issues.listComments, { owner: context.repo.owner,
repo: context.repo.repo, issue_number: prNumber, per_page: 100 }) to get all
comments) and then iterate the returned comments array checking
legacyMarkers.some(...) and calling github.rest.issues.deleteComment for
matching comment.id; alternatively, for large PRs use github.paginate.iterator
to process pages one-by-one to avoid high memory usage.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/pr-report.yaml:
- Around line 52-63: Add a second head-SHA revalidation immediately before the
Post PR comment step: call github.rest.pulls.get to fetch the live PR (same
owner/repo/pull_number used earlier) and compare livePr.head.sha against the
previously stored head SHA (the value you saved from
context.payload.workflow_run.head_sha or earlier variable). If they differ, log
a message and set core.setOutput('skip','true') (and return/exit the job path)
so the posting step is skipped; otherwise proceed to post the comment as normal.

In `@scripts/unified-report.js`:
- Around line 21-27: The execFileSync invocation that runs the size report when
sizeStatus === 'ready' (calling 'node' with 'scripts/size-report.js' and pushing
sizeReport into lines) must be wrapped in a try-catch so a non-zero exit doesn't
abort the whole pipeline; catch the error and push a clear placeholder line
(e.g. a section-level failure message mentioning the size report) into lines
instead. Do the same for the performance report execFileSync call (the analogous
call around line ~40 that runs 'scripts/perf-report.js' or similar): wrap in
try-catch and push a performance-section failure placeholder on error, ensuring
the rest of the unified report continues to run. Ensure you reference the same
function/variable names (sizeStatus, lines, sizeReport, and the performance
report variables) when making the change.

---

Nitpick comments:
In @.github/workflows/pr-report.yaml:
- Around line 195-211: The current cleanup fetches only the first page via
github.rest.issues.listComments (per_page:100) so legacyMarkers and comment
deletion loop can miss later pages; replace that call with octokit's pagination
(use github.paginate(github.rest.issues.listComments, { owner:
context.repo.owner, repo: context.repo.repo, issue_number: prNumber, per_page:
100 }) to get all comments) and then iterate the returned comments array
checking legacyMarkers.some(...) and calling github.rest.issues.deleteComment
for matching comment.id; alternatively, for large PRs use
github.paginate.iterator to process pages one-by-one to avoid high memory usage.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 048b7893-925a-43f4-86f9-53906daccd2a

📥 Commits

Reviewing files that changed from the base of the PR and between 70269a8 and 8b7a7e4.

📒 Files selected for processing (6)
  • .github/workflows/ci-perf-report.yaml
  • .github/workflows/ci-size-data.yaml
  • .github/workflows/pr-perf-report.yaml
  • .github/workflows/pr-report.yaml
  • .github/workflows/pr-size-report.yaml
  • scripts/unified-report.js
💤 Files with no reviewable changes (2)
  • .github/workflows/pr-perf-report.yaml
  • .github/workflows/pr-size-report.yaml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/ci-perf-report.yaml

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
scripts/unified-report.js (1)

21-25: ⚠️ Potential issue | 🟠 Major

Add section-level failure handling around subprocess execution.

Line 22 and Line 40 call execFileSync without local handling. If either command exits non-zero, unified report generation aborts instead of emitting the section fallback.

Suggested patch
 import { execFileSync } from 'node:child_process'
 import { existsSync } from 'node:fs'
@@
 /** `@type` {string[]} */
 const lines = []
+
+/**
+ * `@param` {string} command
+ * `@param` {string[]} commandArgs
+ * `@param` {string[]} fallbackLines
+ */
+function appendReportOrFallback(command, commandArgs, fallbackLines) {
+  try {
+    const out = execFileSync(command, commandArgs, { encoding: 'utf-8' }).trimEnd()
+    lines.push(out)
+  } catch {
+    lines.push(...fallbackLines)
+  }
+}
@@
 if (sizeStatus === 'ready') {
-  const sizeReport = execFileSync('node', ['scripts/size-report.js'], {
-    encoding: 'utf-8'
-  }).trimEnd()
-  lines.push(sizeReport)
+  appendReportOrFallback('node', ['scripts/size-report.js'], [
+    '## 📦 Bundle Size',
+    '',
+    '> ⚠️ Failed to render bundle size report. Check the CI workflow logs.'
+  ])
@@
 if (perfStatus === 'ready' && existsSync('test-results/perf-metrics.json')) {
-  const perfReport = execFileSync(
-    'pnpm',
-    ['exec', 'tsx', 'scripts/perf-report.ts'],
-    { encoding: 'utf-8' }
-  ).trimEnd()
-  lines.push(perfReport)
+  appendReportOrFallback('pnpm', ['exec', 'tsx', 'scripts/perf-report.ts'], [
+    '## ⚡ Performance',
+    '',
+    '> ⚠️ Failed to render performance report. Check the CI workflow logs.'
+  ])
#!/bin/bash
# Verify subprocess calls exist and are not locally wrapped by try/catch in this file.
rg -n -C3 'execFileSync\(' scripts/unified-report.js
rg -n -C3 '^\s*try\s*\{' scripts/unified-report.js

Also applies to: 40-45

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

In `@scripts/unified-report.js` around lines 21 - 25, Wrap each execFileSync
invocation (e.g., the call that assigns sizeReport and the other execFileSync at
lines ~40-45) in a local try/catch so a non-zero exit does not abort the whole
report; on error catch the exception and push a fallback section into lines
(using the same section boundary format as the successful output) that includes
a short failure message and the error.message/exit code, and continue execution.
Ensure you still call .trimEnd() on successful outputs (e.g., sizeReport) and
keep encoding:'utf-8' when invoking execFileSync; reference the variables
sizeReport and the array lines when inserting the fallback.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@scripts/unified-report.js`:
- Around line 39-54: The current branch treats perfStatus === 'ready' with a
missing 'test-results/perf-metrics.json' as "in progress"; change the branching
so that a missing metrics file when perfStatus is 'ready' is considered
unavailable/failed: adjust the condition around the
existsSync('test-results/perf-metrics.json') and perfStatus checks so that if
perfStatus === 'failed' OR (perfStatus === 'ready' && !existsSync(...)) you push
the unavailable/failed placeholder (the same block that currently handles
perfStatus === 'failed'), and only run execFileSync and append perfReport when
perfStatus === 'ready' AND the metrics file exists; update the messages produced
by lines.push in the unavailable branch accordingly.

---

Duplicate comments:
In `@scripts/unified-report.js`:
- Around line 21-25: Wrap each execFileSync invocation (e.g., the call that
assigns sizeReport and the other execFileSync at lines ~40-45) in a local
try/catch so a non-zero exit does not abort the whole report; on error catch the
exception and push a fallback section into lines (using the same section
boundary format as the successful output) that includes a short failure message
and the error.message/exit code, and continue execution. Ensure you still call
.trimEnd() on successful outputs (e.g., sizeReport) and keep encoding:'utf-8'
when invoking execFileSync; reference the variables sizeReport and the array
lines when inserting the fallback.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 97ec0b78-97fb-4270-9b3b-1faa838ed258

📥 Commits

Reviewing files that changed from the base of the PR and between 8b7a7e4 and c1acccb.

📒 Files selected for processing (1)
  • scripts/unified-report.js

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

Labels

size:XL This PR changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants