Skip to content

fix: fix perf CI pipeline — z-score baselines, force-push staleness, baseline storage#9886

Merged
christian-byrne merged 3 commits intomainfrom
fix/perf-ci-pipeline-fixes
Mar 15, 2026
Merged

fix: fix perf CI pipeline — z-score baselines, force-push staleness, baseline storage#9886
christian-byrne merged 3 commits intomainfrom
fix/perf-ci-pipeline-fixes

Conversation

@christian-byrne
Copy link
Contributor

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

Summary

Fixes three critical issues with the CI performance reporting pipeline that made perf reports useless on PRs (demonstrated by PR #9248 — deep watcher removal merged without useful perf signal).

Changes

1. Fix z-score baseline variance collection (0/5 runs)

Root cause: PR #9305 added z-score statistical analysis code to perf-report.ts, but the historical data download step was placed in the wrong workflow file. The report is generated in pr-perf-report.yaml (a workflow_run-triggered job), but the historical download was in ci-perf-report.yaml (the test runner) — different runners, different filesystems.

Fix: Implement perf-data orphan branch storage:

  • On push to main: save perf-metrics.json to perf-data branch with timestamped filename
  • On PR report: fetch last 5 baselines from perf-data branch into temp/perf-history/
  • Rolling window of 20 baselines, oldest pruned automatically
  • Same pattern used by github-action-benchmark (33.7k repos)

2. Fix force-push comment staleness

Root cause: cancel-in-progress: true kills the perf test run before it uploads artifacts. The downstream report workflow only triggers on conclusion == 'success' — cancelled runs are ignored, so the comment from the first successful run goes stale.

Fix:

  • Change cancel-in-progress: false — with GitHub's queue depth of 1, rapid pushes (A,B,C,D) run A and D, skipping B and C
  • Add SHA validation in pr-perf-report.yaml — before posting, check if the workflow_run's head SHA still matches the PR's current head. Skip posting stale results.

3. Add permissions for baseline operations

  • contents: write on CI job (needed for pushing to perf-data branch)
  • actions: read on both workflows (needed for artifact/baseline access)

One-time setup required

After merging, create the perf-data orphan branch:

git checkout --orphan perf-data
git rm -rf .
echo '# Performance Baselines' > README.md
mkdir -p baselines
git add README.md baselines
git commit -m 'Initialize perf-data branch'
git push origin perf-data

The first 2 pushes to main after setup will build up variance data, and z-scores will start appearing in PR reports (threshold is historical.length >= 2).

Testing

  • YAML validated with yaml.safe_load()
  • perf-report.ts loadHistoricalReports() already reads from temp/perf-history/<index>/perf-metrics.json — no code changes needed
  • All new steps use continue-on-error: true for graceful degradation

┆Issue is synchronized with this Notion page by Unito

…baseline storage

- Fix z-score '0/5 runs': add perf-data branch storage + historical baseline
  loading in pr-perf-report.yaml (data was being downloaded in wrong workflow)
- Fix force-push comment staleness: change cancel-in-progress to false so last
  push always completes, add SHA validation to skip posting stale results
- Add perf-data orphan branch mechanism: on push to main, save perf-metrics.json
  to rolling 20-baseline window in perf-data branch
- Load last 5 baselines into temp/perf-history/ for z-score computation
- Add actions: read permission for baseline loading
@christian-byrne christian-byrne requested a review from a team as a code owner March 13, 2026 17:23
@github-actions
Copy link

github-actions bot commented Mar 13, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/15/2026, 04:51:55 AM UTC

Links

@github-actions
Copy link

github-actions bot commented Mar 13, 2026

🎭 Playwright: ✅ 551 passed, 0 failed · 9 flaky

📊 Browser Reports
  • chromium: View Report (✅ 538 / ❌ 0 / ⚠️ 9 / ⏭️ 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)

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 13, 2026

📝 Walkthrough

Walkthrough

Saves CI perf baselines to an orphan perf-data branch on main, and adds a PR staleness check that conditionally loads historical baselines and skips artifact/report steps when the PR head SHA is outdated.

Changes

Cohort / File(s) Summary
CI perf baseline persistence
.github/workflows/ci-perf-report.yaml
Disabled cancel-in-progress, changed checkout to persist-credentials: false, expanded permissions (contents: write, actions: read), and added a step that creates/updates an orphan perf-data branch via Git worktree, timestamps SHA-tagged baselines, retains only the latest 20, commits if changed, and pushes using GH_TOKEN.
PR perf staleness & historical baselines
.github/workflows/pr-perf-report.yaml
Added actions: read permission, introduced a SHA freshness check step that sets stale output, guarded artifact download/report/comment steps on stale != 'true', and added a step to fetch/load up to 5 historical baselines from perf-data when the run is current.

Sequence Diagram(s)

sequenceDiagram
  participant CI as Workflow Runner
  participant GH as GitHub API
  participant Git as Git Remote (origin / perf-data)
  participant AR as Artifact Store

  CI->>GH: Trigger on push to main -> perf job completes
  CI->>Git: Create/fetch orphan `perf-data` branch (worktree)
  CI->>Git: Write timestamped SHA baselines, prune to last 20
  CI->>Git: Commit & push `perf-data` using GH_TOKEN

  CI->>GH: On PR workflow start -> query PR head SHA
  GH-->>CI: Return PR head SHA
  CI->>CI: Compare run head_sha vs PR head SHA -> set `stale`
  alt not stale
    CI->>Git: Fetch `perf-data`, load up to 5 historical baselines
    CI->>AR: Download perf artifacts
    CI->>CI: Generate report using baselines
    CI->>GH: Post perf report/comment to PR
  else stale
    CI->>CI: Skip artifact download / report generation
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

I hopped through commits with a keen little grin,
Saved perf leaves in branches, each tagged with a spin.
I checked PR SHAs, skipped stale crumbs from the past—
Fresh baselines and history, cached neat and fast! 🐇📈

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
End-To-End Regression Coverage For Fixes ⚠️ Warning PR fails all three conditions: uses 'fix' language, modifies only workflow files (not browser_tests/), and lacks concrete explanation of why E2E testing isn't practical. Add a Playwright regression test under browser_tests/ or explicitly explain why E2E testing is impractical for GitHub Actions workflow changes.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the three main fixes: z-score baselines, force-push staleness, and baseline storage.
Description check ✅ Passed The description is comprehensive and complete, covering all required template sections with detailed explanations of changes, root causes, fixes, and testing approach.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/perf-ci-pipeline-fixes
📝 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 13, 2026

📦 Bundle: 4.99 MB gzip 🔴 +28 B

Details

Summary

  • Raw size: 23 MB baseline 23 MB — ⚪ 0 B
  • Gzip: 4.99 MB baseline 4.99 MB — 🔴 +28 B
  • Brotli: 3.85 MB baseline 3.85 MB — 🟢 -64 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-uoOjzxV3.js (new) 21.7 kB 🔴 +21.7 kB 🔴 +7.71 kB 🔴 +6.63 kB
assets/index-wMyC3a0v.js (removed) 21.7 kB 🟢 -21.7 kB 🟢 -7.71 kB 🟢 -6.65 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-CA8Z7-xH.js (removed) 1.08 MB 🟢 -1.08 MB 🟢 -230 kB 🟢 -174 kB
assets/GraphView-DLIdLKgS.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-DUtVU8je.js (removed) 15.6 kB 🟢 -15.6 kB 🟢 -3.38 kB 🟢 -2.88 kB
assets/CloudSurveyView-tj7hD8Yw.js (new) 15.6 kB 🔴 +15.6 kB 🔴 +3.38 kB 🔴 +2.88 kB
assets/CloudLoginView-ClIrHz64.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.26 kB 🔴 +2.88 kB
assets/CloudLoginView-Dewgnx_e.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.26 kB 🟢 -2.88 kB
assets/CloudSignupView-ByJijaUb.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.75 kB 🔴 +2.41 kB
assets/CloudSignupView-CXCnLKan.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.75 kB 🟢 -2.42 kB
assets/UserCheckView-BGg-ezcr.js (removed) 9.01 kB 🟢 -9.01 kB 🟢 -2.31 kB 🟢 -2 kB
assets/UserCheckView-C7UUUsOW.js (new) 9.01 kB 🔴 +9.01 kB 🔴 +2.31 kB 🔴 +2 kB
assets/CloudLayoutView-BfMoydSM.js (new) 7.3 kB 🔴 +7.3 kB 🔴 +2.26 kB 🔴 +1.98 kB
assets/CloudLayoutView-wlp916rz.js (removed) 7.3 kB 🟢 -7.3 kB 🟢 -2.26 kB 🟢 -1.97 kB
assets/CloudForgotPasswordView-B9Ii1Po4.js (removed) 5.73 kB 🟢 -5.73 kB 🟢 -1.99 kB 🟢 -1.75 kB
assets/CloudForgotPasswordView-vBsUpXM7.js (new) 5.73 kB 🔴 +5.73 kB 🔴 +1.99 kB 🔴 +1.75 kB
assets/CloudAuthTimeoutView-B2bj6FR2.js (removed) 5.09 kB 🟢 -5.09 kB 🟢 -1.83 kB 🟢 -1.6 kB
assets/CloudAuthTimeoutView-BaEwYXWd.js (new) 5.09 kB 🔴 +5.09 kB 🔴 +1.83 kB 🔴 +1.6 kB
assets/CloudSubscriptionRedirectView-CpC9yVZ8.js (removed) 4.93 kB 🟢 -4.93 kB 🟢 -1.83 kB 🟢 -1.62 kB
assets/CloudSubscriptionRedirectView-JUE-_87L.js (new) 4.93 kB 🔴 +4.93 kB 🔴 +1.84 kB 🔴 +1.63 kB
assets/UserSelectView-DBhNhjSj.js (removed) 4.67 kB 🟢 -4.67 kB 🟢 -1.73 kB 🟢 -1.53 kB
assets/UserSelectView-DsJzgZly.js (new) 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-CNm153we.js (new) 28.8 kB 🔴 +28.8 kB 🔴 +6.14 kB 🔴 +5.46 kB
assets/KeybindingPanel-DvXSrFwZ.js (removed) 28.8 kB 🟢 -28.8 kB 🟢 -6.14 kB 🟢 -5.46 kB
assets/SecretsPanel-CRmsB4t-.js (removed) 22.3 kB 🟢 -22.3 kB 🟢 -5.41 kB 🟢 -4.77 kB
assets/SecretsPanel-optpbSXX.js (new) 22.3 kB 🔴 +22.3 kB 🔴 +5.41 kB 🔴 +4.75 kB
assets/LegacyCreditsPanel-BJ_MNJE4.js (new) 21.2 kB 🔴 +21.2 kB 🔴 +5.66 kB 🔴 +5 kB
assets/LegacyCreditsPanel-D4ioZEQO.js (removed) 21.2 kB 🟢 -21.2 kB 🟢 -5.66 kB 🟢 -4.99 kB
assets/SubscriptionPanel-5aUfadV0.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.82 kB 🔴 +4.25 kB
assets/SubscriptionPanel-BnRUO18K.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.82 kB 🟢 -4.27 kB
assets/AboutPanel-Du3U80s8.js (new) 11.9 kB 🔴 +11.9 kB 🔴 +3.3 kB 🔴 +2.96 kB
assets/AboutPanel-SBAARCbZ.js (removed) 11.9 kB 🟢 -11.9 kB 🟢 -3.3 kB 🟢 -2.96 kB
assets/ExtensionPanel-B510NHa3.js (new) 9.54 kB 🔴 +9.54 kB 🔴 +2.71 kB 🔴 +2.41 kB
assets/ExtensionPanel-Dh_DIwoR.js (removed) 9.54 kB 🟢 -9.54 kB 🟢 -2.71 kB 🟢 -2.41 kB
assets/ServerConfigPanel-BMZxD1hI.js (removed) 6.62 kB 🟢 -6.62 kB 🟢 -2.19 kB 🟢 -1.97 kB
assets/ServerConfigPanel-CP2RoYq6.js (new) 6.62 kB 🔴 +6.62 kB 🔴 +2.19 kB 🔴 +1.96 kB
assets/UserPanel-Ce_DembC.js (new) 6.33 kB 🔴 +6.33 kB 🔴 +2.05 kB 🔴 +1.79 kB
assets/UserPanel-DGvAdpGv.js (removed) 6.33 kB 🟢 -6.33 kB 🟢 -2.05 kB 🟢 -1.79 kB
assets/cloudRemoteConfig-CjR8JHsC.js (new) 1.62 kB 🔴 +1.62 kB 🔴 +801 B 🔴 +683 B
assets/cloudRemoteConfig-cX6fzu-z.js (removed) 1.62 kB 🟢 -1.62 kB 🟢 -799 B 🟢 -684 B
assets/refreshRemoteConfig-B5KAypyw.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +647 B 🔴 +549 B
assets/refreshRemoteConfig-De6QT39E.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -648 B 🟢 -548 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-CZfywnzj.js (new) 3.57 kB 🔴 +3.57 kB 🔴 +1.26 kB 🔴 +1.07 kB
assets/auth-DSzqnuoL.js (removed) 3.57 kB 🟢 -3.57 kB 🟢 -1.26 kB 🟢 -1.07 kB
assets/SignUpForm-A4x3TH9w.js (removed) 3.18 kB 🟢 -3.18 kB 🟢 -1.29 kB 🟢 -1.15 kB
assets/SignUpForm-B56msQ3i.js (new) 3.18 kB 🔴 +3.18 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/UpdatePasswordContent-CKXwLvrQ.js (removed) 2.44 kB 🟢 -2.44 kB 🟢 -1.09 kB 🟢 -973 B
assets/UpdatePasswordContent-Dh9Hgcwx.js (new) 2.44 kB 🔴 +2.44 kB 🔴 +1.09 kB 🔴 +972 B
assets/firebaseAuthStore-uP3EoQmh.js (new) 788 B 🔴 +788 B 🔴 +385 B 🔴 +342 B
assets/firebaseAuthStore-ve2_9jH_.js (removed) 788 B 🟢 -788 B 🟢 -386 B 🟢 -340 B
assets/auth-A2UKEfN0.js (new) 313 B 🔴 +313 B 🔴 +198 B 🔴 +183 B
assets/auth-Cfqvcm9c.js (removed) 313 B 🟢 -313 B 🟢 -197 B 🟢 -169 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-Cj9DPv18.js (new) 81 kB 🔴 +81 kB 🔴 +16.9 kB 🔴 +14.5 kB
assets/useShareDialog-DnaAxK5y.js (removed) 81 kB 🟢 -81 kB 🟢 -16.9 kB 🟢 -14.5 kB
assets/useSubscriptionDialog-C0WR4zRY.js (removed) 736 B 🟢 -736 B 🟢 -378 B 🟢 -327 B
assets/useSubscriptionDialog-Ch8koKn5.js (new) 736 B 🔴 +736 B 🔴 +378 B 🔴 +329 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-By6gPbqw.js (new) 14.3 kB 🔴 +14.3 kB 🔴 +4.01 kB 🔴 +3.58 kB
assets/ComfyQueueButton-jBOgHLNM.js (removed) 14.3 kB 🟢 -14.3 kB 🟢 -4 kB 🟢 -3.58 kB
assets/useTerminalTabs-ChJ3GtNK.js (new) 10.4 kB 🔴 +10.4 kB 🔴 +3.5 kB 🔴 +3.08 kB
assets/useTerminalTabs-CNIyXY1y.js (removed) 10.4 kB 🟢 -10.4 kB 🟢 -3.5 kB 🟢 -3.08 kB
assets/SubscribeButton-B-okYe6i.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +916 B
assets/SubscribeButton-BHH-Mf62.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.05 kB 🟢 -918 B
assets/cloudFeedbackTopbarButton-CUOJwHod.js (removed) 1.43 kB 🟢 -1.43 kB 🟢 -742 B 🟢 -653 B
assets/cloudFeedbackTopbarButton-D5IooBye.js (new) 1.43 kB 🔴 +1.43 kB 🔴 +742 B 🔴 +665 B
assets/ComfyQueueButton-D4fjl-at.js (removed) 793 B 🟢 -793 B 🟢 -394 B 🟢 -347 B
assets/ComfyQueueButton-DUNh5YTZ.js (new) 793 B 🔴 +793 B 🔴 +393 B 🔴 +347 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-nH9OoKID.js (removed) 2.15 MB 🟢 -2.15 MB 🟢 -495 kB 🟢 -370 kB
assets/dialogService-o18WxtJG.js (new) 2.15 MB 🔴 +2.15 MB 🔴 +495 kB 🔴 +370 kB
assets/api-Bn6tAi8g.js (removed) 862 kB 🟢 -862 kB 🟢 -206 kB 🟢 -162 kB
assets/api-DdENIpi1.js (new) 862 kB 🔴 +862 kB 🔴 +206 kB 🔴 +162 kB
assets/load3dService-CMEVdevw.js (new) 93.3 kB 🔴 +93.3 kB 🔴 +19.8 kB 🔴 +17 kB
assets/load3dService-DcU932mE.js (removed) 93.3 kB 🟢 -93.3 kB 🟢 -19.8 kB 🟢 -17 kB
assets/extensionStore-B3PEfui8.js (new) 19.9 kB 🔴 +19.9 kB 🔴 +6.7 kB 🔴 +5.86 kB
assets/extensionStore-BpdvequD.js (removed) 19.9 kB 🟢 -19.9 kB 🟢 -6.7 kB 🟢 -5.86 kB
assets/workflowShareService-B7qNYJfi.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -4.32 kB 🟢 -3.8 kB
assets/workflowShareService-CI-MRokJ.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +4.32 kB 🔴 +3.8 kB
assets/releaseStore-ArPF20Ye.js (removed) 8.07 kB 🟢 -8.07 kB 🟢 -2.25 kB 🟢 -1.97 kB
assets/releaseStore-NZOKJcC6.js (new) 8.07 kB 🔴 +8.07 kB 🔴 +2.26 kB 🔴 +1.98 kB
assets/keybindingService-CWz_yEc-.js (removed) 6.99 kB 🟢 -6.99 kB 🟢 -1.74 kB 🟢 -1.49 kB
assets/keybindingService-rkQLMEqs.js (new) 6.99 kB 🔴 +6.99 kB 🔴 +1.74 kB 🔴 +1.5 kB
assets/userStore-CKp2K_8q.js (removed) 2.24 kB 🟢 -2.24 kB 🟢 -870 B 🟢 -763 B
assets/userStore-DOy8rR0K.js (new) 2.24 kB 🔴 +2.24 kB 🔴 +869 B 🔴 +761 B
assets/bootstrapStore-Be01vmxW.js (new) 2.11 kB 🔴 +2.11 kB 🔴 +891 B 🔴 +811 B
assets/bootstrapStore-CgAG03FM.js (removed) 2.11 kB 🟢 -2.11 kB 🟢 -892 B 🟢 -808 B
assets/audioService-bHoh7t8f.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +864 B 🔴 +740 B
assets/audioService-NfpZddw7.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -862 B 🟢 -747 B
assets/releaseStore-39zknW0q.js (new) 760 B 🔴 +760 B 🔴 +385 B 🔴 +345 B
assets/releaseStore-CgMrk10F.js (removed) 760 B 🟢 -760 B 🟢 -383 B 🟢 -338 B
assets/workflowDraftStore--SjEiYw1.js (new) 736 B 🔴 +736 B 🔴 +378 B 🔴 +336 B
assets/workflowDraftStore-DQkLx3RD.js (removed) 736 B 🟢 -736 B 🟢 -378 B 🟢 -334 B
assets/dialogService-D-FOB4OW.js (removed) 725 B 🟢 -725 B 🟢 -368 B 🟢 -326 B
assets/dialogService-wNDy8BPr.js (new) 725 B 🔴 +725 B 🔴 +370 B 🔴 +329 B
assets/settingStore-C4NYpVkP.js (removed) 723 B 🟢 -723 B 🟢 -371 B 🟢 -328 B
assets/settingStore-CndG6gwc.js (new) 723 B 🔴 +723 B 🔴 +372 B 🔴 +327 B
assets/assetsStore-BIIV2AkO.js (removed) 722 B 🟢 -722 B 🟢 -373 B 🟢 -329 B
assets/assetsStore-Wij07IaQ.js (new) 722 B 🔴 +722 B 🔴 +372 B 🔴 +328 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-BO-aVsmX.js (new) 15.1 kB 🔴 +15.1 kB 🔴 +3.42 kB 🔴 +3.02 kB
assets/useLoad3dViewer-YodwNbnl.js (removed) 15.1 kB 🟢 -15.1 kB 🟢 -3.42 kB 🟢 -3.02 kB
assets/useLoad3d-BmAW4sL6.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.65 kB 🔴 +3.23 kB
assets/useLoad3d-CoaY92aW.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.65 kB 🟢 -3.23 kB
assets/useFeatureFlags-Id3p6NSE.js (removed) 5.78 kB 🟢 -5.78 kB 🟢 -1.75 kB 🟢 -1.49 kB
assets/useFeatureFlags-wwoLo1PL.js (new) 5.78 kB 🔴 +5.78 kB 🔴 +1.75 kB 🔴 +1.49 kB
assets/useWorkspaceUI-C4_TSXEQ.js (new) 3.34 kB 🔴 +3.34 kB 🔴 +980 B 🔴 +813 B
assets/useWorkspaceUI-DAApT91j.js (removed) 3.34 kB 🟢 -3.34 kB 🟢 -979 B 🟢 -812 B
assets/subscriptionCheckoutUtil-Brhbkcg9.js (removed) 3.04 kB 🟢 -3.04 kB 🟢 -1.31 kB 🟢 -1.15 kB
assets/subscriptionCheckoutUtil-QWEY8X2n.js (new) 3.04 kB 🔴 +3.04 kB 🔴 +1.32 kB 🔴 +1.15 kB
assets/useUpstreamValue-CG1LirGH.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -805 B 🟢 -719 B
assets/useUpstreamValue-CLzmh4Q2.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +805 B 🔴 +723 B
assets/useErrorHandling-BWFObsmj.js (new) 1.54 kB 🔴 +1.54 kB 🔴 +649 B 🔴 +552 B
assets/useErrorHandling-CJPcde-W.js (removed) 1.54 kB 🟢 -1.54 kB 🟢 -647 B 🟢 -557 B
assets/audioUtils-BN1wbmV0.js (removed) 958 B 🟢 -958 B 🟢 -564 B 🟢 -461 B
assets/audioUtils-DgqzjCVv.js (new) 958 B 🔴 +958 B 🔴 +566 B 🔴 +487 B
assets/useLoad3d-BqeQhQsa.js (removed) 859 B 🟢 -859 B 🟢 -423 B 🟢 -379 B
assets/useLoad3d-DfeVlg_9.js (new) 859 B 🔴 +859 B 🔴 +423 B 🔴 +378 B
assets/useLoad3dViewer-Bshw9Hl7.js (removed) 838 B 🟢 -838 B 🟢 -409 B 🟢 -366 B
assets/useLoad3dViewer-EO5OpjPq.js (new) 838 B 🔴 +838 B 🔴 +408 B 🔴 +369 B
assets/useWorkspaceSwitch-BWDX4n7Q.js (new) 747 B 🔴 +747 B 🔴 +387 B 🔴 +336 B
assets/useWorkspaceSwitch-CWz0xgIg.js (removed) 747 B 🟢 -747 B 🟢 -387 B 🟢 -327 B
assets/useCurrentUser-DVL4Y90B.js (removed) 722 B 🟢 -722 B 🟢 -373 B 🟢 -330 B
assets/useCurrentUser-zyesHvN9.js (new) 722 B 🔴 +722 B 🔴 +373 B 🔴 +330 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-aSNqLAz3.js (removed) 75.7 kB 🟢 -75.7 kB 🟢 -19.5 kB 🟢 -16.7 kB
assets/core-CHahdyZg.js (new) 75.7 kB 🔴 +75.7 kB 🔴 +19.5 kB 🔴 +16.7 kB
assets/groupNode-BfzGt2DC.js (removed) 73.9 kB 🟢 -73.9 kB 🟢 -18.5 kB 🟢 -16.3 kB
assets/groupNode-oIx3rgaR.js (new) 73.9 kB 🔴 +73.9 kB 🔴 +18.5 kB 🔴 +16.3 kB
assets/WidgetSelect-C1EZgDUk.js (removed) 63.2 kB 🟢 -63.2 kB 🟢 -13.8 kB 🟢 -11.9 kB
assets/WidgetSelect-DYECEAL4.js (new) 63.2 kB 🔴 +63.2 kB 🔴 +13.8 kB 🔴 +11.9 kB
assets/SubscriptionRequiredDialogContentWorkspace-COD3avsf.js (removed) 47.1 kB 🟢 -47.1 kB 🟢 -8.75 kB 🟢 -7.57 kB
assets/SubscriptionRequiredDialogContentWorkspace-DcX8a6N5.js (new) 47.1 kB 🔴 +47.1 kB 🔴 +8.75 kB 🔴 +7.59 kB
assets/WidgetPainter-B88AgtDP.js (new) 33.1 kB 🔴 +33.1 kB 🔴 +8.01 kB 🔴 +7.1 kB
assets/WidgetPainter-BUlcIRcK.js (removed) 33.1 kB 🟢 -33.1 kB 🟢 -8.01 kB 🟢 -7.1 kB
assets/Load3DControls-BzPmScVS.js (new) 32.1 kB 🔴 +32.1 kB 🔴 +5.47 kB 🔴 +4.75 kB
assets/Load3DControls-hyDLjY9v.js (removed) 32.1 kB 🟢 -32.1 kB 🟢 -5.47 kB 🟢 -4.75 kB
assets/WorkspacePanelContent-CwPFcJst.js (removed) 29.7 kB 🟢 -29.7 kB 🟢 -6.22 kB 🟢 -5.48 kB
assets/WorkspacePanelContent-DDFytsT7.js (new) 29.7 kB 🔴 +29.7 kB 🔴 +6.22 kB 🔴 +5.46 kB
assets/SubscriptionRequiredDialogContent-Bqj-djbs.js (removed) 26.1 kB 🟢 -26.1 kB 🟢 -6.61 kB 🟢 -5.83 kB
assets/SubscriptionRequiredDialogContent-VayEwMFZ.js (new) 26.1 kB 🔴 +26.1 kB 🔴 +6.61 kB 🔴 +5.83 kB
assets/Load3dViewerContent-DhzKElW5.js (new) 24.3 kB 🔴 +24.3 kB 🔴 +5.31 kB 🔴 +4.62 kB
assets/Load3dViewerContent-giCRKYUg.js (removed) 24.3 kB 🟢 -24.3 kB 🟢 -5.31 kB 🟢 -4.63 kB
assets/WidgetImageCrop-DAlXiWn_.js (new) 23.1 kB 🔴 +23.1 kB 🔴 +5.75 kB 🔴 +5.06 kB
assets/WidgetImageCrop-FzamG1U6.js (removed) 23.1 kB 🟢 -23.1 kB 🟢 -5.75 kB 🟢 -5.07 kB
assets/SubscriptionPanelContentWorkspace-BmhyBxxh.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.18 kB 🔴 +4.55 kB
assets/SubscriptionPanelContentWorkspace-CoKexi9v.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.17 kB 🟢 -4.56 kB
assets/CurrentUserPopoverWorkspace-CsfXr7kl.js (removed) 20.8 kB 🟢 -20.8 kB 🟢 -4.99 kB 🟢 -4.46 kB
assets/CurrentUserPopoverWorkspace-QyFV8HGY.js (new) 20.8 kB 🔴 +20.8 kB 🔴 +4.99 kB 🔴 +4.46 kB
assets/SignInContent-DGjna3ux.js (removed) 20 kB 🟢 -20 kB 🟢 -5.16 kB 🟢 -4.5 kB
assets/SignInContent-S-MaNdzP.js (new) 20 kB 🔴 +20 kB 🔴 +5.16 kB 🔴 +4.49 kB
assets/WidgetInputNumber-CppFsa0u.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.84 kB 🟢 -4.29 kB
assets/WidgetInputNumber-sX3bODUe.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.84 kB 🔴 +4.29 kB
assets/WidgetRecordAudio-BGpsZoQw.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -5.09 kB 🟢 -4.57 kB
assets/WidgetRecordAudio-DmK0McS_.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +5.09 kB 🔴 +4.57 kB
assets/Load3D-Cp3P-yw8.js (new) 16.8 kB 🔴 +16.8 kB 🔴 +4.11 kB 🔴 +3.59 kB
assets/Load3D-fbCODLC2.js (removed) 16.8 kB 🟢 -16.8 kB 🟢 -4.12 kB 🟢 -3.59 kB
assets/load3d-BC2ZEbZr.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -4.2 kB 🟢 -3.64 kB
assets/load3d-C7ldVA8l.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +4.2 kB 🔴 +3.65 kB
assets/WidgetCurve-C7nlYwje.js (new) 11.7 kB 🔴 +11.7 kB 🔴 +3.89 kB 🔴 +3.5 kB
assets/WidgetCurve-DkDwUC-L.js (removed) 11.7 kB 🟢 -11.7 kB 🟢 -3.89 kB 🟢 -3.5 kB
assets/AudioPreviewPlayer-BGoK4bKQ.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.3 kB 🟢 -2.96 kB
assets/AudioPreviewPlayer-DHG3hfIU.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.3 kB 🔴 +2.96 kB
assets/nodeTemplates-Cw5ccTC2.js (new) 9.33 kB 🔴 +9.33 kB 🔴 +3.28 kB 🔴 +2.88 kB
assets/nodeTemplates-DLKij9-m.js (removed) 9.33 kB 🟢 -9.33 kB 🟢 -3.28 kB 🟢 -2.88 kB
assets/InviteMemberDialogContent-BY2ZmcvZ.js (removed) 7.53 kB 🟢 -7.53 kB 🟢 -2.36 kB 🟢 -2.05 kB
assets/InviteMemberDialogContent-Cp5ORAsh.js (new) 7.53 kB 🔴 +7.53 kB 🔴 +2.36 kB 🔴 +2.06 kB
assets/Load3DConfiguration-BDziek4k.js (removed) 6.55 kB 🟢 -6.55 kB 🟢 -2.03 kB 🟢 -1.77 kB
assets/Load3DConfiguration-W_yZddH8.js (new) 6.55 kB 🔴 +6.55 kB 🔴 +2.03 kB 🔴 +1.77 kB
assets/onboardingCloudRoutes-BstS7AoU.js (removed) 6.15 kB 🟢 -6.15 kB 🟢 -1.91 kB 🟢 -1.67 kB
assets/onboardingCloudRoutes-CUyNnnBt.js (new) 6.15 kB 🔴 +6.15 kB 🔴 +1.91 kB 🔴 +1.67 kB
assets/WidgetWithControl-CCzvwnqY.js (new) 5.76 kB 🔴 +5.76 kB 🔴 +2.25 kB 🔴 +2.02 kB
assets/WidgetWithControl-CpvjZCB8.js (removed) 5.76 kB 🟢 -5.76 kB 🟢 -2.25 kB 🟢 -2.02 kB
assets/CreateWorkspaceDialogContent-ClDShAXz.js (removed) 5.71 kB 🟢 -5.71 kB 🟢 -2.05 kB 🟢 -1.78 kB
assets/CreateWorkspaceDialogContent-nt0jWg2O.js (new) 5.71 kB 🔴 +5.71 kB 🔴 +2.05 kB 🔴 +1.78 kB
assets/FreeTierDialogContent-B8JDf2Yw.js (removed) 5.54 kB 🟢 -5.54 kB 🟢 -1.93 kB 🟢 -1.72 kB
assets/FreeTierDialogContent-qjVJ_P9V.js (new) 5.54 kB 🔴 +5.54 kB 🔴 +1.93 kB 🔴 +1.7 kB
assets/EditWorkspaceDialogContent-BS05ZoGn.js (new) 5.51 kB 🔴 +5.51 kB 🔴 +2.01 kB 🔴 +1.76 kB
assets/EditWorkspaceDialogContent-CY8jbDEV.js (removed) 5.51 kB 🟢 -5.51 kB 🟢 -2.01 kB 🟢 -1.76 kB
assets/ValueControlPopover-CD81Fqbe.js (removed) 5.1 kB 🟢 -5.1 kB 🟢 -1.82 kB 🟢 -1.63 kB
assets/ValueControlPopover-g-qk91Wg.js (new) 5.1 kB 🔴 +5.1 kB 🔴 +1.82 kB 🔴 +1.63 kB
assets/Preview3d-CrCzBDer.js (removed) 5.08 kB 🟢 -5.08 kB 🟢 -1.67 kB 🟢 -1.46 kB
assets/Preview3d-oivjWOMk.js (new) 5.08 kB 🔴 +5.08 kB 🔴 +1.67 kB 🔴 +1.46 kB
assets/WidgetTextarea-B-lgd8jC.js (removed) 5.03 kB 🟢 -5.03 kB 🟢 -1.96 kB 🟢 -1.76 kB
assets/WidgetTextarea-qOflgR55.js (new) 5.03 kB 🔴 +5.03 kB 🔴 +1.96 kB 🔴 +1.73 kB
assets/CancelSubscriptionDialogContent-C7OJN08R.js (new) 4.98 kB 🔴 +4.98 kB 🔴 +1.85 kB 🔴 +1.61 kB
assets/CancelSubscriptionDialogContent-DIruCIIq.js (removed) 4.98 kB 🟢 -4.98 kB 🟢 -1.84 kB 🟢 -1.61 kB
assets/tierBenefits-BYIZZ9tk.js (removed) 4.47 kB 🟢 -4.47 kB 🟢 -1.58 kB 🟢 -1.36 kB
assets/tierBenefits-CCyURHzB.js (new) 4.47 kB 🔴 +4.47 kB 🔴 +1.58 kB 🔴 +1.36 kB
assets/DeleteWorkspaceDialogContent-BG4A-mJF.js (new) 4.41 kB 🔴 +4.41 kB 🔴 +1.69 kB 🔴 +1.47 kB
assets/DeleteWorkspaceDialogContent-Dz4DY1Z2.js (removed) 4.41 kB 🟢 -4.41 kB 🟢 -1.69 kB 🟢 -1.47 kB
assets/LeaveWorkspaceDialogContent-CSWs50G5.js (removed) 4.24 kB 🟢 -4.24 kB 🟢 -1.64 kB 🟢 -1.42 kB
assets/LeaveWorkspaceDialogContent-DIBX1q_i.js (new) 4.24 kB 🔴 +4.24 kB 🔴 +1.64 kB 🔴 +1.42 kB
assets/RemoveMemberDialogContent-BN76_30W.js (removed) 4.22 kB 🟢 -4.22 kB 🟢 -1.59 kB 🟢 -1.38 kB
assets/RemoveMemberDialogContent-D0J068Ff.js (new) 4.22 kB 🔴 +4.22 kB 🔴 +1.59 kB 🔴 +1.39 kB
assets/RevokeInviteDialogContent-BdpKHvM4.js (removed) 4.13 kB 🟢 -4.13 kB 🟢 -1.6 kB 🟢 -1.4 kB
assets/RevokeInviteDialogContent-DqB07NMQ.js (new) 4.13 kB 🔴 +4.13 kB 🔴 +1.6 kB 🔴 +1.4 kB
assets/InviteMemberUpsellDialogContent-CqUD_EeS.js (removed) 4.03 kB 🟢 -4.03 kB 🟢 -1.46 kB 🟢 -1.28 kB
assets/InviteMemberUpsellDialogContent-S-hTm3j7.js (new) 4.03 kB 🔴 +4.03 kB 🔴 +1.46 kB 🔴 +1.28 kB
assets/cloudSessionCookie-B7GDbbiX.js (removed) 3.9 kB 🟢 -3.9 kB 🟢 -1.38 kB 🟢 -1.2 kB
assets/cloudSessionCookie-cIDXwhFp.js (new) 3.9 kB 🔴 +3.9 kB 🔴 +1.38 kB 🔴 +1.2 kB
assets/saveMesh-DB7QMbEn.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -1.47 kB 🟢 -1.29 kB
assets/saveMesh-DhXrO3En.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +1.46 kB 🔴 +1.3 kB
assets/GlobalToast--45kDwbo.js (new) 3.04 kB 🔴 +3.04 kB 🔴 +1.26 kB 🔴 +1.08 kB
assets/GlobalToast-BO9xs5SM.js (removed) 3.04 kB 🟢 -3.04 kB 🟢 -1.26 kB 🟢 -1.08 kB
assets/SubscribeToRun-Dzt0tV6F.js (new) 2.13 kB 🔴 +2.13 kB 🔴 +976 B 🔴 +868 B
assets/SubscribeToRun-OAaI1Iip.js (removed) 2.13 kB 🟢 -2.13 kB 🟢 -977 B 🟢 -855 B
assets/CloudRunButtonWrapper-_YbrckPm.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -810 B 🟢 -723 B
assets/CloudRunButtonWrapper-bo9L-LG0.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +811 B 🔴 +749 B
assets/cloudBadges-B9E6Mmnn.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +789 B 🔴 +705 B
assets/cloudBadges-DiUCzhSi.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -788 B 🟢 -688 B
assets/previousFullPath-3iG1AlY6.js (removed) 1.53 kB 🟢 -1.53 kB 🟢 -696 B 🟢 -625 B
assets/previousFullPath-CisAxkbh.js (new) 1.53 kB 🔴 +1.53 kB 🔴 +693 B 🔴 +601 B
assets/cloudSubscription-BVb_NDWt.js (new) 1.45 kB 🔴 +1.45 kB 🔴 +709 B 🔴 +608 B
assets/cloudSubscription-DQJdg4LR.js (removed) 1.45 kB 🟢 -1.45 kB 🟢 -707 B 🟢 -604 B
assets/Load3D-COGCW5hS.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +495 B 🔴 +444 B
assets/Load3D-OlpyQHyK.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -496 B 🟢 -441 B
assets/nightlyBadges-B_Luh8S9.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -554 B 🟢 -492 B
assets/nightlyBadges-CpvcRHST.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +554 B 🔴 +495 B
assets/Load3dViewerContent-CPz6MTEl.js (new) 993 B 🔴 +993 B 🔴 +464 B 🔴 +415 B
assets/Load3dViewerContent-Dc_K46NZ.js (removed) 993 B 🟢 -993 B 🟢 -465 B 🟢 -416 B
assets/SubscriptionPanelContentWorkspace-BFt1VzOD.js (new) 920 B 🔴 +920 B 🔴 +437 B 🔴 +380 B
assets/SubscriptionPanelContentWorkspace-C-6YtGl-.js (removed) 920 B 🟢 -920 B 🟢 -435 B 🟢 -380 B
assets/graphHasMissingNodes-CKGFEHZ0.js (new) 822 B 🔴 +822 B 🔴 +411 B 🔴 +348 B
assets/graphHasMissingNodes-DVUqlktn.js (removed) 822 B 🟢 -822 B 🟢 -412 B 🟢 -347 B
assets/WidgetLegacy-D3fOVTea.js (removed) 744 B 🟢 -744 B 🟢 -383 B 🟢 -350 B
assets/WidgetLegacy-PDtTvfrG.js (new) 744 B 🔴 +744 B 🔴 +384 B 🔴 +340 B
assets/changeTracker-Bq7ukvtp.js (removed) 720 B 🟢 -720 B 🟢 -373 B 🟢 -351 B
assets/changeTracker-Co9U8Xp7.js (new) 720 B 🔴 +720 B 🔴 +373 B 🔴 +327 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

@github-actions
Copy link

github-actions bot commented Mar 13, 2026

⚡ Performance Report

ℹ️ Collecting baseline variance data (0/5 runs). Significance will appear after 2 main branch runs.

Metric Baseline PR Δ
canvas-idle: style recalcs 11 11 -6%
canvas-idle: layouts 0 0 +0%
canvas-idle: task duration 392ms 403ms +3%
canvas-mouse-sweep: style recalcs 78 79 +0%
canvas-mouse-sweep: layouts 12 12 +0%
canvas-mouse-sweep: task duration 938ms 865ms -8%
dom-widget-clipping: style recalcs 14 14 +2%
dom-widget-clipping: layouts 0 0 +0%
dom-widget-clipping: task duration 393ms 362ms -8%
subgraph-dom-widget-clipping: style recalcs 48 49 +1%
subgraph-dom-widget-clipping: layouts 0 0 +0%
subgraph-dom-widget-clipping: task duration 378ms 368ms -3%
subgraph-idle: style recalcs 11 12 +12%
subgraph-idle: layouts 0 0 +0%
subgraph-idle: task duration 467ms 394ms -16%
subgraph-mouse-sweep: style recalcs 80 87 +9%
subgraph-mouse-sweep: layouts 16 16 +0%
subgraph-mouse-sweep: task duration 839ms 940ms +12%
Raw data
{
  "timestamp": "2026-03-15T04:55:12.630Z",
  "gitSha": "760cfdde3603c031d3435bf385dbb9748eeb91d8",
  "branch": "fix/perf-ci-pipeline-fixes",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2051.9949999999767,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.845999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 416.74999999999994,
      "heapDeltaBytes": 823648
    },
    {
      "name": "canvas-idle",
      "durationMs": 2047.6230000000442,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.229000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 397.444,
      "heapDeltaBytes": -5736564
    },
    {
      "name": "canvas-idle",
      "durationMs": 2025.4999999999654,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 11.450999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 394.57599999999996,
      "heapDeltaBytes": 756028
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1866.517999999985,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 47.568,
      "layouts": 12,
      "layoutDurationMs": 3.7039999999999997,
      "taskDurationMs": 832.4090000000001,
      "heapDeltaBytes": 17464444
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1799.4939999999815,
      "styleRecalcs": 74,
      "styleRecalcDurationMs": 39.716,
      "layouts": 12,
      "layoutDurationMs": 3.6290000000000004,
      "taskDurationMs": 773.514,
      "heapDeltaBytes": -3384044
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2036.371000000031,
      "styleRecalcs": 84,
      "styleRecalcDurationMs": 44.678000000000004,
      "layouts": 12,
      "layoutDurationMs": 3.3420000000000005,
      "taskDurationMs": 988.0439999999999,
      "heapDeltaBytes": 17804868
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 600.3379999999652,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 9.687999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 360.81,
      "heapDeltaBytes": 12852280
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 566.080999999997,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 10.399999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 350.955,
      "heapDeltaBytes": 13328840
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 616.2689999999884,
      "styleRecalcs": 16,
      "styleRecalcDurationMs": 15.236,
      "layouts": 1,
      "layoutDurationMs": 0.347,
      "taskDurationMs": 375.474,
      "heapDeltaBytes": 13616432
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 590.6990000000292,
      "styleRecalcs": 49,
      "styleRecalcDurationMs": 13.494000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 375.342,
      "heapDeltaBytes": 12656784
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 565.3169999999932,
      "styleRecalcs": 49,
      "styleRecalcDurationMs": 12.645999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 357.23900000000003,
      "heapDeltaBytes": 12608512
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 589.6450000000186,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 12.353000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 372.77,
      "heapDeltaBytes": 12741712
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2004.3419999999514,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 13.097000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 399.10400000000004,
      "heapDeltaBytes": 575092
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2054.2580000000044,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 12.424,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 392.84799999999996,
      "heapDeltaBytes": 303532
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2021.9079999999963,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 12.054999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 389.361,
      "heapDeltaBytes": 652488
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1991.6279999999915,
      "styleRecalcs": 88,
      "styleRecalcDurationMs": 50.339999999999996,
      "layouts": 16,
      "layoutDurationMs": 5.156,
      "taskDurationMs": 948.6199999999999,
      "heapDeltaBytes": -7671800
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 2005.8669999999665,
      "styleRecalcs": 88,
      "styleRecalcDurationMs": 49.663,
      "layouts": 16,
      "layoutDurationMs": 4.469,
      "taskDurationMs": 945.5179999999999,
      "heapDeltaBytes": -6936084
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1985.5019999999968,
      "styleRecalcs": 86,
      "styleRecalcDurationMs": 46.745,
      "layouts": 16,
      "layoutDurationMs": 4.361999999999999,
      "taskDurationMs": 925.749,
      "heapDeltaBytes": -7658876
    }
  ]
}

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In @.github/workflows/ci-perf-report.yaml:
- Around line 82-93: The workflow creates an orphan perf-data branch and pushes
it (git checkout --orphan perf-data / git push origin perf-data) but does not
fetch the new remote ref before using it, so the subsequent git worktree add
/tmp/perf-data origin/perf-data fails on first-run; fix by adding a git fetch
origin perf-data (or a full git fetch) immediately after the git push origin
perf-data so the origin/perf-data remote-tracking ref exists locally before
running git worktree add.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 5c81435f-4644-49aa-9f43-a576b9a39663

📥 Commits

Reviewing files that changed from the base of the PR and between f1626ac and 4da2c59.

📒 Files selected for processing (2)
  • .github/workflows/ci-perf-report.yaml
  • .github/workflows/pr-perf-report.yaml

@socket-security
Copy link

socket-security bot commented Mar 13, 2026

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

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

View full report

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 (1)
.github/workflows/ci-perf-report.yaml (1)

73-111: Solid implementation of the baseline storage pattern.

The worktree-based approach correctly isolates operations on the perf-data branch without disrupting the main checkout. Key observations:

  • ✅ Past review feedback addressed: git fetch origin perf-data (line 91) now follows the initial push
  • ✅ Graceful degradation with continue-on-error: true
  • ✅ Pruning logic correctly retains latest 20 baselines
  • ✅ Smart to copy metrics to /tmp before branch operations (line 80)

Minor: The GH_TOKEN env var (line 111) appears unused since git push uses the authentication configured by actions/checkout. It's harmless but could be removed for clarity.

,

♻️ Optional: Remove unused env var
          git worktree remove /tmp/perf-data --force 2>/dev/null || true
-        env:
-          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/ci-perf-report.yaml around lines 73 - 111, The GH_TOKEN
environment variable is defined but never used in the "Save perf baseline to
perf-data branch" step; remove the unused GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
entry from the step's env block to avoid confusion and keep the workflow minimal
(look for the step named "Save perf baseline to perf-data branch" and the
GH_TOKEN env variable).
🤖 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/ci-perf-report.yaml:
- Around line 73-111: The GH_TOKEN environment variable is defined but never
used in the "Save perf baseline to perf-data branch" step; remove the unused
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} entry from the step's env block to avoid
confusion and keep the workflow minimal (look for the step named "Save perf
baseline to perf-data branch" and the GH_TOKEN env variable).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d1e4d062-b924-4e46-b638-50eb3d03b784

📥 Commits

Reviewing files that changed from the base of the PR and between 4da2c59 and ddb481b.

📒 Files selected for processing (1)
  • .github/workflows/ci-perf-report.yaml

@dosubot dosubot bot added the size:M This PR changes 30-99 lines, ignoring generated files. label Mar 13, 2026
password: ${{ secrets.GITHUB_TOKEN }}
permissions:
contents: read
contents: write
Copy link
Member

Choose a reason for hiding this comment

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

do we need write here?. This job checks out PR-controlled code and then runs repo-controlled actions/scripts from that checkout, and actions/checkout persists authenticated git credentials by default.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

good catch - fixed in c634daa. added persist-credentials: false to the checkout step so PR-triggered runs never have write-capable git credentials available to PR-controlled code. contents: write is still needed at the job level because the baseline push step (push-to-main only) does git push origin HEAD:perf-data, but credentials are now set up explicitly only in that step via git config url."https://x-access-token:...".insteadOf, so write access is scoped to exactly where it's needed.

Add persist-credentials: false to actions/checkout so PR-triggered
runs never have write-capable git credentials available to
PR-controlled code. Credentials are set up explicitly only in the
baseline push step (which only runs on push to main).

Addresses review feedback:
#9886 (comment)
@socket-security
Copy link

Warning

Review the following alerts detected in dependencies.

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

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

Confidence: 0.91

Location: Package overview

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

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

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

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

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

View full report

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 (1)
.github/workflows/ci-perf-report.yaml (1)

99-102: Baseline filename approach is clear and functional.

The timestamped naming with truncated SHA provides good traceability.

Minor observation: bash parameter expansion (SHA="${GITHUB_SHA:0:8}") could replace the echo | cut pipeline, but the current approach is readable and works correctly.

♻️ Optional: Use parameter expansion
 TIMESTAMP=$(date -u +%Y%m%dT%H%M%SZ)
-SHA=$(echo "${{ github.sha }}" | cut -c1-8)
+SHA="${GITHUB_SHA:0:8}"

Note: GITHUB_SHA is automatically available as an environment variable in GitHub Actions.

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

In @.github/workflows/ci-perf-report.yaml around lines 99 - 102, Replace the
pipeline that computes SHA with bash parameter expansion to simplify and avoid
spawning a subshell: change the SHA assignment that currently uses SHA=$(echo
"${{ github.sha }}" | cut -c1-8) to use the GITHUB_SHA environment variable and
parameter expansion (refer to the TIMESTAMP and SHA variables in the workflow
snippet) so SHA is set from GITHUB_SHA truncated to 8 characters; keep the rest
of the timestamped filename logic (mkdir and cp to
/tmp/perf-data/baselines/perf-${TIMESTAMP}-${SHA}.json) unchanged.
🤖 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/ci-perf-report.yaml:
- Around line 99-102: Replace the pipeline that computes SHA with bash parameter
expansion to simplify and avoid spawning a subshell: change the SHA assignment
that currently uses SHA=$(echo "${{ github.sha }}" | cut -c1-8) to use the
GITHUB_SHA environment variable and parameter expansion (refer to the TIMESTAMP
and SHA variables in the workflow snippet) so SHA is set from GITHUB_SHA
truncated to 8 characters; keep the rest of the timestamped filename logic
(mkdir and cp to /tmp/perf-data/baselines/perf-${TIMESTAMP}-${SHA}.json)
unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e7a86775-3cc0-432c-bc0a-215ce8cf96dd

📥 Commits

Reviewing files that changed from the base of the PR and between ddb481b and c634daa.

📒 Files selected for processing (1)
  • .github/workflows/ci-perf-report.yaml

@christian-byrne christian-byrne merged commit a7218b2 into main Mar 15, 2026
35 checks passed
@christian-byrne christian-byrne deleted the fix/perf-ci-pipeline-fixes branch March 15, 2026 09:46
christian-byrne added a commit that referenced this pull request Mar 15, 2026
## Summary

Adds Total Blocking Time (TBT) and frame duration metrics to the
performance testing infrastructure, plus three new test scenarios
covering zoom, pan, and many-nodes-idle.

## Changes

### New Metrics
- **`totalBlockingTimeMs`** — Computed from PerformanceObserver
`longtask` entries: `sum(duration - 50ms)` for tasks >50ms. Measures
main thread blocking.
- **`frameDurationMs`** — Average frame duration via rAF timing (16.67ms
= 60fps target). Measures rendering smoothness.

### New Test Scenarios
| Scenario | Description |
|---|---|
| `canvas-zoom-sweep` | 10 zoom-in + 10 zoom-out cycles on default
workflow |
| `canvas-pan-many-nodes` | 10 pan sweeps over 100-node workflow |
| `canvas-many-nodes-idle` | 2-second idle measurement with 100 nodes
rendered |

### Infrastructure
- `PerformanceHelper.ts`: Installs PerformanceObserver for longtask,
collects TBT, measures frame duration via rAF
- `perf-report.ts`: Reports TBT and frame duration in PR comment tables
- `browser_tests/assets/perf/many_nodes_100.json`: 100-node (10×10 grid)
test fixture

## Review Focus
- TBT collection clears entries at `startMeasuring()` and reads at
`stopMeasuring()` — ensure no race with observer buffering
- Frame duration sampling uses 10 frames — enough for signal without
slowing tests

Depends on: #9886, #9887

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9910-feat-add-TBT-frameDuration-metrics-and-new-perf-test-scenarios-3236d73d365081488ae3c594a8bf7cff)
by [Unito](https://www.unito.io)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants