Skip to content

ci: fold website e2e and release comments into the unified PR report#12939

Open
christian-byrne wants to merge 6 commits into
mainfrom
unify-website-release-comments
Open

ci: fold website e2e and release comments into the unified PR report#12939
christian-byrne wants to merge 6 commits into
mainfrom
unify-website-release-comments

Conversation

@christian-byrne

Copy link
Copy Markdown
Contributor

Follow-up to #11935. Folds the remaining standalone bot comments into the single unified PR report comment (<!-- COMFYUI_FRONTEND_PR_REPORT -->).

Changes

  • Website CI sections (e2e, preview, screenshot-update) now upsert into the unified comment instead of a separate <!-- WEBSITE_CI_REPORT --> comment. Added WEBSITE_CI_REPORT to the legacy-comment cleanup in pr-report.yaml so the old standalone comment is removed.
  • Release summary (comment-release-links action) now upserts a release / desktop-release section into the unified comment instead of posting a separate release-summary comment.

Not included

  • Backport comments (pr-backport.yaml) are intentionally left as standalone comments: they @mention the author with conflict details that require manual action, and a unified-comment section is edited (not posted), so it would not trigger a notification. Folding them would regress that.

Addresses the remaining items from this review:
#11935 (review)

@christian-byrne
christian-byrne requested a review from a team June 18, 2026 01:30
@dosubot dosubot Bot added the size:XS This PR changes 0-9 lines, ignoring generated files. label Jun 18, 2026
@coderabbitai

coderabbitai Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

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

Use the following commands to manage reviews:

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

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The upsert action now retries concurrent updates and verifies section survival. The release-links action uses named sections and the shared upsert action. Remaining workflows switch to the unified report marker, and legacy cleanup removes the old marker.

Changes

Unified PR Report Comment Migration

Layer / File(s) Summary
upsert-comment-section retry and verification
.github/actions/upsert-comment-section/action.yaml
Adds section matching, paginated comment lookup, bounded retries, duplicate cleanup, and post-write verification.
Release-links section wiring
.github/actions/comment-release-links/action.yaml
Adds section naming and outputs, removes embedded markers, and routes release links through the unified report upsert action.
Workflow marker updates and legacy cleanup
.github/workflows/ci-website-e2e.yaml, .github/workflows/pr-update-website-screenshots.yaml, .github/workflows/pr-vercel-website-preview.yaml, .github/workflows/pr-report.yaml
Replaces the website report marker with the unified report marker and adds the old marker to legacy cleanup.

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

Sequence Diagram(s)

sequenceDiagram
  participant Workflow
  participant UpsertCommentSection
  participant GitHubAPI
  participant PRReportComment
  Workflow->>UpsertCommentSection: provide section name and content
  UpsertCommentSection->>GitHubAPI: find or create unified report comment
  UpsertCommentSection->>GitHubAPI: replace or append section
  GitHubAPI->>PRReportComment: save updated body
  UpsertCommentSection->>GitHubAPI: re-fetch and verify markers
Loading

Possibly related PRs

Suggested reviewers: drjkl

🚥 Pre-merge checks | ✅ 6
✅ Passed checks (6 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: folding website e2e and release comments into the unified PR report.
Description check ✅ Passed The description covers Summary and Changes well and explains the intentional exclusion; only Review Focus and Screenshots are omitted.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
End-To-End Regression Coverage For Fixes ✅ Passed CI-only changes; no bug-fix language in title/commits and no src/packages or browser_tests changes, so the regression-test requirement does not apply.
Adr Compliance For Entity/Litegraph Changes ✅ Passed Changed files are only GitHub Actions/workflows, not under src/lib/litegraph/, src/ecs/, or graph-entity code, so ADR checks don’t apply.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch unify-website-release-comments

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

@github-actions

github-actions Bot commented Jun 18, 2026

Copy link
Copy Markdown

🎭 Playwright: ✅ 1709 passed, 0 failed · 4 flaky

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

📦 Bundle: 7.91 MB gzip ⚪ 0 B

Details

Summary

  • Raw size: 33.4 MB baseline 33.4 MB — ⚪ 0 B
  • Gzip: 7.91 MB baseline 7.91 MB — ⚪ 0 B
  • Brotli: 5.45 MB baseline 5.45 MB — ⚪ 0 B
  • Bundles: 302 current • 302 baseline

Category Glance
Vendor & Third-Party ⚪ 0 B (15.7 MB) · Other ⚪ 0 B (11.9 MB) · Utilities & Hooks ⚪ 0 B (3.4 MB) · Graph Workspace ⚪ 0 B (1.25 MB) · Panels & Settings ⚪ 0 B (550 kB) · Data & Services ⚪ 0 B (270 kB) · + 5 more

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

Main entry bundles and manifests

Status: 1 unchanged

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

Graph editor runtime, canvas, workflow orchestration

Status: 1 unchanged

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

Top-level views, pages, and routed surfaces

Status: 14 unchanged

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

Configuration panels, inspectors, and settings screens

Status: 26 unchanged

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

Authentication, profile, and account management bundles

Status: 10 unchanged

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

Modals, dialogs, drawers, and in-app editors

Status: 6 unchanged

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

Reusable component library chunks

Status: 13 unchanged

Data & Services — 270 kB (baseline 270 kB) • ⚪ 0 B

Stores, services, APIs, and repositories

Status: 16 unchanged

Utilities & Hooks — 3.4 MB (baseline 3.4 MB) • ⚪ 0 B

Helpers, composables, and utility bundles

Status: 36 unchanged

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

External libraries and shared vendor chunks

Status: 16 unchanged

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

Bundles that do not match a named category

Status: 163 unchanged

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 43.8 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 56.9 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 72.7 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.4 MB heap
large-graph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 62.5 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.5 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 52.2 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 63.1 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.8 MB heap
subgraph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 57.1 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.2 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 103ms TBT · 92.7 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 70.8 MB heap
vue-large-graph-idle: · 58.1 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 165.5 MB heap
vue-large-graph-pan: · 59.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 28ms TBT · 161.1 MB heap
workflow-execution: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 49.5 MB heap

⚠️ 2 regressions detected

Show regressions
Metric Baseline PR (median) Δ Sig
canvas-idle: task duration 435ms 482ms +11% ⚠️ z=2.8
subgraph-idle: task duration 392ms 438ms +12% ⚠️ z=2.2
All metrics
Metric Baseline PR (median) Δ Sig
canvas-idle: avg frame time 17ms 17ms +0% z=-0.1
canvas-idle: p95 frame time 17ms 17ms -0%
canvas-idle: layout duration 0ms 0ms +0%
canvas-idle: style recalc duration 8ms 7ms -10% z=-3.9
canvas-idle: layout count 0 0 +0%
canvas-idle: style recalc count 10 10 -5% z=-2.9
canvas-idle: task duration 435ms 482ms +11% ⚠️ z=2.8
canvas-idle: script duration 18ms 25ms +36% z=-0.2
canvas-idle: TBT 0ms 0ms +0%
canvas-idle: heap used 69.3 MB 43.8 MB -37%
canvas-idle: DOM nodes 14 -267 -2004% z=-226.7
canvas-idle: event listeners 4 -133 -3425% z=-30.5
canvas-mouse-sweep: avg frame time 17ms 17ms +0% z=0.2
canvas-mouse-sweep: p95 frame time 17ms 17ms -1%
canvas-mouse-sweep: layout duration 4ms 3ms -20% z=-2.7
canvas-mouse-sweep: style recalc duration 39ms 32ms -18% z=-3.3
canvas-mouse-sweep: layout count 12 12 +0%
canvas-mouse-sweep: style recalc count 73 73 -1% z=-2.6
canvas-mouse-sweep: task duration 802ms 713ms -11% z=-2.6
canvas-mouse-sweep: script duration 122ms 104ms -15% z=-4.9
canvas-mouse-sweep: TBT 0ms 0ms +0%
canvas-mouse-sweep: heap used 49.9 MB 56.9 MB +14%
canvas-mouse-sweep: DOM nodes -265 -105 -61% z=-64.5
canvas-mouse-sweep: event listeners -133 -65 -52% z=-17.5
canvas-zoom-sweep: avg frame time 17ms 17ms +0% z=1.4
canvas-zoom-sweep: p95 frame time 17ms 17ms +0%
canvas-zoom-sweep: layout duration 1ms 1ms -10% z=-1.0
canvas-zoom-sweep: style recalc duration 17ms 17ms -2% z=-1.4
canvas-zoom-sweep: layout count 6 6 +0%
canvas-zoom-sweep: style recalc count 32 31 -5% z=-1.7
canvas-zoom-sweep: task duration 304ms 305ms +0% z=-0.9
canvas-zoom-sweep: script duration 17ms 22ms +30% z=-1.7
canvas-zoom-sweep: TBT 0ms 0ms +0%
canvas-zoom-sweep: heap used 72.9 MB 72.7 MB -0%
canvas-zoom-sweep: DOM nodes 79 78 -2% z=-2.2
canvas-zoom-sweep: event listeners 19 21 +11% z=-0.5
dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.5
dom-widget-clipping: p95 frame time 17ms 17ms +1%
dom-widget-clipping: layout duration 0ms 0ms +0%
dom-widget-clipping: style recalc duration 9ms 7ms -24% z=-3.4
dom-widget-clipping: layout count 0 0 +0%
dom-widget-clipping: style recalc count 13 12 -8% z=-2.2
dom-widget-clipping: task duration 341ms 320ms -6% z=-2.7
dom-widget-clipping: script duration 56ms 50ms -11% z=-5.6
dom-widget-clipping: TBT 0ms 0ms +0%
dom-widget-clipping: heap used 54.6 MB 54.4 MB -0%
dom-widget-clipping: DOM nodes 22 20 -9% z=-1.5
dom-widget-clipping: event listeners 2 2 +0% variance too high
large-graph-idle: avg frame time 17ms 17ms +0% z=-0.2
large-graph-idle: p95 frame time 17ms 17ms -0%
large-graph-idle: layout duration 0ms 0ms +0%
large-graph-idle: style recalc duration 9ms 9ms +1% z=-2.7
large-graph-idle: layout count 0 0 +0%
large-graph-idle: style recalc count 9 10 +11% z=-5.1
large-graph-idle: task duration 532ms 614ms +15% z=1.3
large-graph-idle: script duration 92ms 93ms +2% z=-0.9
large-graph-idle: TBT 0ms 0ms +0%
large-graph-idle: heap used 62.3 MB 62.5 MB +0%
large-graph-idle: DOM nodes -265 -266 +0% z=-321.1
large-graph-idle: event listeners -129 -128 -1% z=-25.3
large-graph-pan: avg frame time 17ms 17ms +0% z=0.3
large-graph-pan: p95 frame time 17ms 17ms +0%
large-graph-pan: layout duration 0ms 0ms +0%
large-graph-pan: style recalc duration 14ms 16ms +8% z=-2.1
large-graph-pan: layout count 0 0 +0%
large-graph-pan: style recalc count 69 69 +0% z=-0.9
large-graph-pan: task duration 1090ms 1006ms -8% z=-1.8
large-graph-pan: script duration 387ms 331ms -15% z=-3.9
large-graph-pan: TBT 0ms 0ms +0%
large-graph-pan: heap used 54.0 MB 71.5 MB +32%
large-graph-pan: DOM nodes -269 -268 -0% z=-174.0
large-graph-pan: event listeners -129 -128 -1% z=-160.5
large-graph-zoom: avg frame time 17ms 17ms -0%
large-graph-zoom: p95 frame time 17ms 17ms +0%
large-graph-zoom: layout duration 7ms 8ms +1%
large-graph-zoom: style recalc duration 15ms 16ms +6%
large-graph-zoom: layout count 60 60 +0%
large-graph-zoom: style recalc count 65 66 +2%
large-graph-zoom: task duration 1340ms 1217ms -9%
large-graph-zoom: script duration 481ms 425ms -12%
large-graph-zoom: TBT 0ms 0ms +0%
large-graph-zoom: heap used 53.6 MB 52.2 MB -3%
large-graph-zoom: DOM nodes -273 -269 -1%
large-graph-zoom: event listeners -133 -132 -1%
minimap-idle: avg frame time 17ms 17ms -0% z=-0.4
minimap-idle: p95 frame time 17ms 17ms -0%
minimap-idle: layout duration 0ms 0ms +0%
minimap-idle: style recalc duration 8ms 8ms -8% z=-2.3
minimap-idle: layout count 0 0 +0%
minimap-idle: style recalc count 9 9 +0% z=-0.8
minimap-idle: task duration 559ms 556ms -1% z=0.6
minimap-idle: script duration 97ms 88ms -8% z=-1.0
minimap-idle: TBT 0ms 0ms +0%
minimap-idle: heap used 63.6 MB 63.1 MB -1%
minimap-idle: DOM nodes -267 -267 -0% z=-208.8
minimap-idle: event listeners -129 -129 +0% z=-202.3
subgraph-dom-widget-clipping: avg frame time 17ms 17ms +0% z=0.1
subgraph-dom-widget-clipping: p95 frame time 17ms 17ms +0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms +0%
subgraph-dom-widget-clipping: style recalc duration 11ms 10ms -5% z=-2.6
subgraph-dom-widget-clipping: layout count 0 0 +0%
subgraph-dom-widget-clipping: style recalc count 47 48 +2% z=0.1
subgraph-dom-widget-clipping: task duration 358ms 316ms -12% z=-3.4
subgraph-dom-widget-clipping: script duration 118ms 99ms -17% z=-4.6
subgraph-dom-widget-clipping: TBT 0ms 0ms +0%
subgraph-dom-widget-clipping: heap used 54.9 MB 54.8 MB -0%
subgraph-dom-widget-clipping: DOM nodes 20 22 +10% z=-0.2
subgraph-dom-widget-clipping: event listeners 6 7 +17% z=-1.6
subgraph-idle: avg frame time 17ms 17ms +0% z=0.4
subgraph-idle: p95 frame time 17ms 17ms +0%
subgraph-idle: layout duration 0ms 0ms +0%
subgraph-idle: style recalc duration 9ms 9ms -8% z=-2.3
subgraph-idle: layout count 0 0 +0%
subgraph-idle: style recalc count 9 11 +17% z=-0.6
subgraph-idle: task duration 392ms 438ms +12% ⚠️ z=2.2
subgraph-idle: script duration 13ms 20ms +56% z=-0.1
subgraph-idle: TBT 0ms 0ms +0%
subgraph-idle: heap used 45.4 MB 57.1 MB +26%
subgraph-idle: DOM nodes -266 -122 -54% z=-96.2
subgraph-idle: event listeners -133 -63 -53% variance too high
subgraph-mouse-sweep: avg frame time 17ms 17ms -0% z=-0.5
subgraph-mouse-sweep: p95 frame time 17ms 17ms -1%
subgraph-mouse-sweep: layout duration 4ms 4ms +3% z=-1.8
subgraph-mouse-sweep: style recalc duration 37ms 34ms -8% z=-2.6
subgraph-mouse-sweep: layout count 16 16 +0%
subgraph-mouse-sweep: style recalc count 76 77 +1% z=-1.9
subgraph-mouse-sweep: task duration 708ms 674ms -5% z=-1.3
subgraph-mouse-sweep: script duration 89ms 87ms -2% z=-2.2
subgraph-mouse-sweep: TBT 0ms 0ms +0%
subgraph-mouse-sweep: heap used 47.5 MB 53.2 MB +12%
subgraph-mouse-sweep: DOM nodes -263 -102 -61% z=-75.6
subgraph-mouse-sweep: event listeners -133 -63 -53% variance too high
subgraph-transition-enter: avg frame time 17ms 17ms +0%
subgraph-transition-enter: p95 frame time 17ms 17ms +1%
subgraph-transition-enter: layout duration 15ms 11ms -28%
subgraph-transition-enter: style recalc duration 33ms 26ms -21%
subgraph-transition-enter: layout count 15 15 +0%
subgraph-transition-enter: style recalc count 19 19 +0%
subgraph-transition-enter: task duration 843ms 683ms -19%
subgraph-transition-enter: script duration 37ms 25ms -32%
subgraph-transition-enter: TBT 148ms 103ms -30%
subgraph-transition-enter: heap used 81.9 MB 92.7 MB +13%
subgraph-transition-enter: DOM nodes 13673 13673 +0%
subgraph-transition-enter: event listeners 2371 2369 -0%
viewport-pan-sweep: avg frame time 17ms 17ms +0%
viewport-pan-sweep: p95 frame time 17ms 17ms -0%
viewport-pan-sweep: layout duration 0ms 0ms +0%
viewport-pan-sweep: style recalc duration 37ms 41ms +8%
viewport-pan-sweep: layout count 0 0 +0%
viewport-pan-sweep: style recalc count 250 249 -0%
viewport-pan-sweep: task duration 3758ms 3459ms -8%
viewport-pan-sweep: script duration 1228ms 1043ms -15%
viewport-pan-sweep: TBT 0ms 0ms +0%
viewport-pan-sweep: heap used 70.4 MB 70.8 MB +1%
viewport-pan-sweep: DOM nodes -267 -268 +0%
viewport-pan-sweep: event listeners -115 -113 -2%
vue-large-graph-idle: avg frame time 17ms 17ms -0%
vue-large-graph-idle: p95 frame time 17ms 17ms -0%
vue-large-graph-idle: layout duration 0ms 0ms +0%
vue-large-graph-idle: style recalc duration 0ms 0ms +0%
vue-large-graph-idle: layout count 0 0 +0%
vue-large-graph-idle: style recalc count 0 0 +0%
vue-large-graph-idle: task duration 12728ms 11689ms -8%
vue-large-graph-idle: script duration 533ms 461ms -13%
vue-large-graph-idle: TBT 0ms 0ms +0%
vue-large-graph-idle: heap used 163.2 MB 165.5 MB +1%
vue-large-graph-idle: DOM nodes -8311 -8311 +0%
vue-large-graph-idle: event listeners -16384 -16386 +0%
vue-large-graph-pan: avg frame time 17ms 17ms -2%
vue-large-graph-pan: p95 frame time 17ms 17ms -0%
vue-large-graph-pan: layout duration 0ms 0ms +0%
vue-large-graph-pan: style recalc duration 12ms 13ms +11%
vue-large-graph-pan: layout count 0 0 +0%
vue-large-graph-pan: style recalc count 77 66 -15%
vue-large-graph-pan: task duration 15448ms 14079ms -9%
vue-large-graph-pan: script duration 860ms 733ms -15%
vue-large-graph-pan: TBT 55ms 28ms -50%
vue-large-graph-pan: heap used 169.2 MB 161.1 MB -5%
vue-large-graph-pan: DOM nodes -8311 -8311 +0%
vue-large-graph-pan: event listeners -16382 -16381 -0%
workflow-execution: avg frame time 17ms 17ms -0% z=-0.4
workflow-execution: p95 frame time 17ms 17ms -0%
workflow-execution: layout duration 0ms 1ms +213% z=-2.1
workflow-execution: style recalc duration 21ms 21ms +1% z=-1.6
workflow-execution: layout count 2 3 +50% z=-3.6
workflow-execution: style recalc count 14 16 +14% z=-0.9
workflow-execution: task duration 120ms 119ms -1% z=-0.4
workflow-execution: script duration 10ms 10ms -3% z=-6.5
workflow-execution: TBT 0ms 0ms +0%
workflow-execution: heap used 49.3 MB 49.5 MB +0%
workflow-execution: DOM nodes 121 137 +13% z=-3.4
workflow-execution: event listeners 65 65 +0% z=3.0
Historical variance (last 15 runs)
Metric μ σ CV
canvas-idle: avg frame time 17ms 0ms 0.0%
canvas-idle: layout duration 0ms 0ms 0.0%
canvas-idle: style recalc duration 11ms 1ms 8.2%
canvas-idle: layout count 0 0 0.0%
canvas-idle: style recalc count 11 1 5.0%
canvas-idle: task duration 395ms 31ms 7.9%
canvas-idle: script duration 25ms 2ms 8.8%
canvas-idle: TBT 0ms 0ms 0.0%
canvas-idle: DOM nodes 23 1 5.6%
canvas-idle: event listeners 12 5 40.9%
canvas-mouse-sweep: avg frame time 17ms 0ms 0.0%
canvas-mouse-sweep: layout duration 4ms 0ms 5.4%
canvas-mouse-sweep: style recalc duration 43ms 3ms 7.4%
canvas-mouse-sweep: layout count 12 0 0.0%
canvas-mouse-sweep: style recalc count 79 2 3.0%
canvas-mouse-sweep: task duration 865ms 58ms 6.7%
canvas-mouse-sweep: script duration 136ms 6ms 4.8%
canvas-mouse-sweep: TBT 0ms 0ms 0.0%
canvas-mouse-sweep: DOM nodes 62 3 4.2%
canvas-mouse-sweep: event listeners 8 4 49.4%
canvas-zoom-sweep: avg frame time 17ms 0ms 0.0%
canvas-zoom-sweep: layout duration 1ms 0ms 7.0%
canvas-zoom-sweep: style recalc duration 19ms 2ms 8.0%
canvas-zoom-sweep: layout count 6 0 0.0%
canvas-zoom-sweep: style recalc count 31 0 1.5%
canvas-zoom-sweep: task duration 327ms 23ms 7.1%
canvas-zoom-sweep: script duration 27ms 3ms 11.1%
canvas-zoom-sweep: TBT 0ms 0ms 0.0%
canvas-zoom-sweep: DOM nodes 79 1 1.0%
canvas-zoom-sweep: event listeners 24 5 21.8%
dom-widget-clipping: avg frame time 17ms 0ms 0.0%
dom-widget-clipping: layout duration 0ms 0ms 0.0%
dom-widget-clipping: style recalc duration 10ms 1ms 8.0%
dom-widget-clipping: layout count 0 0 0.0%
dom-widget-clipping: style recalc count 13 0 3.8%
dom-widget-clipping: task duration 365ms 16ms 4.5%
dom-widget-clipping: script duration 68ms 3ms 4.8%
dom-widget-clipping: TBT 0ms 0ms 0.0%
dom-widget-clipping: DOM nodes 22 1 6.4%
dom-widget-clipping: event listeners 8 6 81.2%
large-graph-idle: avg frame time 17ms 0ms 0.0%
large-graph-idle: layout duration 0ms 0ms 0.0%
large-graph-idle: style recalc duration 12ms 1ms 8.6%
large-graph-idle: layout count 0 0 0.0%
large-graph-idle: style recalc count 12 0 2.7%
large-graph-idle: task duration 542ms 54ms 10.0%
large-graph-idle: script duration 102ms 11ms 10.3%
large-graph-idle: TBT 0ms 0ms 0.0%
large-graph-idle: DOM nodes 25 1 3.7%
large-graph-idle: event listeners 26 6 23.2%
large-graph-pan: avg frame time 17ms 0ms 0.0%
large-graph-pan: layout duration 0ms 0ms 0.0%
large-graph-pan: style recalc duration 17ms 1ms 4.6%
large-graph-pan: layout count 0 0 0.0%
large-graph-pan: style recalc count 70 1 0.9%
large-graph-pan: task duration 1082ms 43ms 4.0%
large-graph-pan: script duration 408ms 20ms 4.8%
large-graph-pan: TBT 0ms 0ms 0.0%
large-graph-pan: DOM nodes 19 2 8.7%
large-graph-pan: event listeners 5 1 16.8%
minimap-idle: avg frame time 17ms 0ms 0.0%
minimap-idle: layout duration 0ms 0ms 0.0%
minimap-idle: style recalc duration 10ms 1ms 8.6%
minimap-idle: layout count 0 0 0.0%
minimap-idle: style recalc count 10 1 7.1%
minimap-idle: task duration 527ms 47ms 9.0%
minimap-idle: script duration 98ms 10ms 10.1%
minimap-idle: TBT 0ms 0ms 0.0%
minimap-idle: DOM nodes 19 1 7.1%
minimap-idle: event listeners 5 1 14.4%
subgraph-dom-widget-clipping: avg frame time 17ms 0ms 0.0%
subgraph-dom-widget-clipping: layout duration 0ms 0ms 0.0%
subgraph-dom-widget-clipping: style recalc duration 13ms 1ms 7.4%
subgraph-dom-widget-clipping: layout count 0 0 0.0%
subgraph-dom-widget-clipping: style recalc count 48 1 1.2%
subgraph-dom-widget-clipping: task duration 378ms 18ms 4.9%
subgraph-dom-widget-clipping: script duration 128ms 6ms 4.9%
subgraph-dom-widget-clipping: TBT 0ms 0ms 0.0%
subgraph-dom-widget-clipping: DOM nodes 22 1 5.0%
subgraph-dom-widget-clipping: event listeners 16 6 36.0%
subgraph-idle: avg frame time 17ms 0ms 0.0%
subgraph-idle: layout duration 0ms 0ms 0.0%
subgraph-idle: style recalc duration 10ms 1ms 7.5%
subgraph-idle: layout count 0 0 0.0%
subgraph-idle: style recalc count 11 1 6.0%
subgraph-idle: task duration 370ms 31ms 8.5%
subgraph-idle: script duration 20ms 3ms 13.2%
subgraph-idle: TBT 0ms 0ms 0.0%
subgraph-idle: DOM nodes 22 1 6.9%
subgraph-idle: event listeners 10 7 64.5%
subgraph-mouse-sweep: avg frame time 17ms 0ms 0.0%
subgraph-mouse-sweep: layout duration 5ms 0ms 6.8%
subgraph-mouse-sweep: style recalc duration 42ms 3ms 7.8%
subgraph-mouse-sweep: layout count 16 0 0.0%
subgraph-mouse-sweep: style recalc count 80 2 2.4%
subgraph-mouse-sweep: task duration 766ms 69ms 9.0%
subgraph-mouse-sweep: script duration 101ms 7ms 6.5%
subgraph-mouse-sweep: TBT 0ms 0ms 0.0%
subgraph-mouse-sweep: DOM nodes 67 2 3.3%
subgraph-mouse-sweep: event listeners 8 4 52.6%
workflow-execution: avg frame time 17ms 0ms 0.0%
workflow-execution: layout duration 2ms 0ms 9.4%
workflow-execution: style recalc duration 24ms 2ms 9.1%
workflow-execution: layout count 5 1 11.0%
workflow-execution: style recalc count 18 2 11.5%
workflow-execution: task duration 123ms 11ms 8.8%
workflow-execution: script duration 29ms 3ms 10.2%
workflow-execution: TBT 0ms 0ms 0.0%
workflow-execution: DOM nodes 161 7 4.4%
workflow-execution: event listeners 52 4 8.4%
Trend (last 15 commits on main)
Metric Trend Dir Latest
canvas-idle: avg frame time ▆▃▆▁▆▃▆█▆▆▄▃▃▄▃ ➡️ 17ms
canvas-idle: p95 frame time ➡️ NaNms
canvas-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: style recalc duration ▇▇▆▆▃█▄▃▄▃▇▄▁▆▇ ➡️ 11ms
canvas-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
canvas-idle: style recalc count █▃▅▂▅▆▃▁▂▁▂▅▆▅▆ ➡️ 12
canvas-idle: task duration ▃▃▃▆▂▃▃▅▆▂█▃▁▃▃ ➡️ 391ms
canvas-idle: script duration ▄▃▅▇▂▅▃▆▇▅█▄▁▅▆ ➡️ 27ms
canvas-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-idle: heap used ➡️ NaN MB
canvas-idle: DOM nodes █▇▆▅▃▇▃▁▂▂▅▆▆▆▇ ➡️ 24
canvas-idle: event listeners ▅█▅▄▁▅▁▁▁▄▅▅▁▅▄ 📉 11
canvas-mouse-sweep: avg frame time ▆█▆▃▁▃▁▆▆▁▃▆▆▃▃ ➡️ 17ms
canvas-mouse-sweep: p95 frame time ➡️ NaNms
canvas-mouse-sweep: layout duration ▁▃▂▄▁▂▁▃▆▂█▇▆▄▃ ➡️ 4ms
canvas-mouse-sweep: style recalc duration ▄▄▂▄▁▂▃▃▅▄█▆▂▄▄ ➡️ 43ms
canvas-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 12
canvas-mouse-sweep: style recalc count █▅▄▃▂▂▁▄▄▅▆▅▂▇▄ ➡️ 79
canvas-mouse-sweep: task duration █▆▄▂▂▃▂▄▄▅█▆▁▆▄ ➡️ 868ms
canvas-mouse-sweep: script duration ▄▅▄▆▄▆▆▆▅▅█▆▁▅▆ ➡️ 139ms
canvas-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-mouse-sweep: heap used ➡️ NaN MB
canvas-mouse-sweep: DOM nodes █▅▃▃▁▂▂▃▂▄▆▅▃▅▅ ➡️ 64
canvas-mouse-sweep: event listeners █▁▁▁▁▁▇▁▁▁██▇▁█ 📈 13
canvas-zoom-sweep: avg frame time ▅▅█▄▅▁▁▁▅▁▁▅▄▅▁ ➡️ 17ms
canvas-zoom-sweep: p95 frame time ➡️ NaNms
canvas-zoom-sweep: layout duration ▆▅▅▄▁▁█▅▃▅▇▆▁▂▆ ➡️ 1ms
canvas-zoom-sweep: style recalc duration ▆▅▄▆▅▃█▆▇▅▇▄▁▃▅ ➡️ 20ms
canvas-zoom-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 6
canvas-zoom-sweep: style recalc count ▁▁▃▄▆▃▆█▄▄▆▁▆▁▆ ➡️ 32
canvas-zoom-sweep: task duration ▄▂▁▇▂▂▄▅▆▃█▄▁▁▅ ➡️ 338ms
canvas-zoom-sweep: script duration ▃▃▂▇▂▂▅▇▆▅█▄▁▂▆ ➡️ 30ms
canvas-zoom-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
canvas-zoom-sweep: heap used ➡️ NaN MB
canvas-zoom-sweep: DOM nodes ▄▃▁▅█▁▃▆▄▅▅▃▃▄▃ ➡️ 79
canvas-zoom-sweep: event listeners ▁▁▂▅█▂▁▅▁▅▅▄▁▅▁ ➡️ 19
dom-widget-clipping: avg frame time ▂▄▅▅▂▄█▇▅▇▇▅▅▁▇ ➡️ 17ms
dom-widget-clipping: p95 frame time ➡️ NaNms
dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: style recalc duration ▆▆▂▆▄▃██▄▁▆▇▆▃▅ ➡️ 10ms
dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
dom-widget-clipping: style recalc count ▇█▅█▅▄█▇▇▁▇▄▇▂▅ ➡️ 13
dom-widget-clipping: task duration ▃▃▁▅▄▃▅▆▅▂▇█▁▅▅ ➡️ 371ms
dom-widget-clipping: script duration ▅▄▄▆▆▅▇▇▆▃█▇▁▇▇ ➡️ 71ms
dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
dom-widget-clipping: heap used ➡️ NaN MB
dom-widget-clipping: DOM nodes ▇▇▄▇▅▄█▇▅▁▅▄▇▃▄ ➡️ 21
dom-widget-clipping: event listeners ▅▅▅▅▁▅██▁▁▁▁█▁▁ 📉 2
large-graph-idle: avg frame time ▅▅▅▅▅▂▁▂▄▅▄▂▂▅█ ➡️ 17ms
large-graph-idle: p95 frame time ➡️ NaNms
large-graph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: style recalc duration ▅▅▅▆▄▅▃▄▅▅▆█▁▄▆ ➡️ 13ms
large-graph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-idle: style recalc count █▆█▃▃▁▃▆▃▆▆▃▆██ ➡️ 12
large-graph-idle: task duration ▂▃▂▆▂▃▃▇▅▃██▁▂▅ ➡️ 569ms
large-graph-idle: script duration ▄▅▄▆▄▅▅▇▆▅█▆▁▃▆ ➡️ 110ms
large-graph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-idle: heap used ➡️ NaN MB
large-graph-idle: DOM nodes ▆█▅▂▅▃▁▂▃▅▅▆▂▆▅ ➡️ 25
large-graph-idle: event listeners ███▇██▄▁▄▇▇█▂█▇ ➡️ 29
large-graph-pan: avg frame time ▆▃▃▆█▃▁█▆▆▆▆█▁▆ ➡️ 17ms
large-graph-pan: p95 frame time ➡️ NaNms
large-graph-pan: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: style recalc duration ▃▂▄▄▁▅▂▂▁▄▄█▃▁▂ ➡️ 17ms
large-graph-pan: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
large-graph-pan: style recalc count ▆▃█▂▃▂▂▂▁▇▅▃█▆▃ ➡️ 69
large-graph-pan: task duration ▄▃▄▆▄▄▄▆▄▄█▆▁▂▅ ➡️ 1100ms
large-graph-pan: script duration ▅▄▅▆▆▅▄▆▄▅█▄▁▄▅ ➡️ 413ms
large-graph-pan: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
large-graph-pan: heap used ➡️ NaN MB
large-graph-pan: DOM nodes ▅▃▆▂▄▁▃▁▁▅▁▂█▅▂ ➡️ 18
large-graph-pan: event listeners █▆█▁▁▆▁▁▃▆▁▃██▃ ➡️ 5
minimap-idle: avg frame time ▃▆▆▃█▁█▆▆▃▃▆█▆█ ➡️ 17ms
minimap-idle: p95 frame time ➡️ NaNms
minimap-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: style recalc duration ▄█▁█▅▅█▅▅▃▅▁▁▄▆ ➡️ 10ms
minimap-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
minimap-idle: style recalc count ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 9
minimap-idle: task duration ▃▄▁▅▁▃▄▅▇▃█▅▁▁▅ ➡️ 547ms
minimap-idle: script duration ▄▆▃▇▃▅▆▆▇▅█▅▁▃▆ ➡️ 106ms
minimap-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
minimap-idle: heap used ➡️ NaN MB
minimap-idle: DOM nodes ▃▅▂▄█▃▆▁▂▅▂▁▅▆▃ ➡️ 19
minimap-idle: event listeners ▃▃▆▁▁▁▃▁▁▆▁▃█▆▁ ➡️ 4
subgraph-dom-widget-clipping: avg frame time ▅▄▄▄▄▄█▄▄▄▃▁▆▃▃ ➡️ 17ms
subgraph-dom-widget-clipping: p95 frame time ➡️ NaNms
subgraph-dom-widget-clipping: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: style recalc duration ▂▄▃▅▅▃▂▅▇▃▄█▁▄▆ ➡️ 14ms
subgraph-dom-widget-clipping: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-dom-widget-clipping: style recalc count ▇█▆▃▆▃▁▆█▇▃▆▇█▅ ➡️ 48
subgraph-dom-widget-clipping: task duration ▂▃▃▆▅▅▂▅█▂▆█▁▂▇ ➡️ 398ms
subgraph-dom-widget-clipping: script duration ▃▃▃▄▅▅▂▄█▂▅▇▁▂▅ ➡️ 131ms
subgraph-dom-widget-clipping: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-dom-widget-clipping: heap used ➡️ NaN MB
subgraph-dom-widget-clipping: DOM nodes ▅▇▅▂▅▂▁▅▅▅▁▇▅█▄ ➡️ 22
subgraph-dom-widget-clipping: event listeners ▅▅▅▂▅▁▅██▁▁█▅█▅ 📈 16
subgraph-idle: avg frame time ▆▆█▁▆▃▆▆▆▃▆▁▃▆█ ➡️ 17ms
subgraph-idle: p95 frame time ➡️ NaNms
subgraph-idle: layout duration ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: style recalc duration ▁▇▃▆▂▄▂▃▃▆▆▄▃▇█ ➡️ 12ms
subgraph-idle: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0
subgraph-idle: style recalc count ▃▆▃▃▂▅▁▂▁▆▃▃██▇ ➡️ 12
subgraph-idle: task duration ▁▃▁▇▁▁▃▆▅▂█▅▁▁▄ ➡️ 378ms
subgraph-idle: script duration ▁▃▂▇▁▂▃▇▆▂█▅▂▁▅ ➡️ 22ms
subgraph-idle: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-idle: heap used ➡️ NaN MB
subgraph-idle: DOM nodes ▃▅▃▂▁▄▁▂▁▅▃▂▇█▇ ➡️ 24
subgraph-idle: event listeners ▁▅▁▁▁▁▁▁▁▅▄▁███ 📈 21
subgraph-mouse-sweep: avg frame time ▅▄▁▃▃▄▆▄▆▃▃█▁▃▃ ➡️ 17ms
subgraph-mouse-sweep: p95 frame time ➡️ NaNms
subgraph-mouse-sweep: layout duration ▁▄▄▄▃▃▅▅▅▂█▇▂▃▆ ➡️ 5ms
subgraph-mouse-sweep: style recalc duration ▃▂▄▅▂▃▄▅█▃█▆▁▂▅ ➡️ 43ms
subgraph-mouse-sweep: layout count ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 16
subgraph-mouse-sweep: style recalc count ▅▂▅▅▁▄▃▅█▅▆▄▂▄▅ ➡️ 81
subgraph-mouse-sweep: task duration ▃▂▄▅▂▄▄▅▇▄█▆▁▃▅ ➡️ 785ms
subgraph-mouse-sweep: script duration ▄▅▄▇▅▅▆▇▆▅██▁▄▆ ➡️ 105ms
subgraph-mouse-sweep: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
subgraph-mouse-sweep: heap used ➡️ NaN MB
subgraph-mouse-sweep: DOM nodes ▅▁▄▅▁▄▃▃█▅▅▄▂▅▃ ➡️ 66
subgraph-mouse-sweep: event listeners ▇▁▂▇▁▂▂▂█▇▂▂▇▇▂ 📈 5
workflow-execution: avg frame time ▆▆▆▄▆▆▃▄▁▄█▆▅▄▆ ➡️ 17ms
workflow-execution: p95 frame time ➡️ NaNms
workflow-execution: layout duration ▁▆▁▃▂▄▃▂▃▃▅█▄▂▅ ➡️ 2ms
workflow-execution: style recalc duration ▃▇▅▇▁▅▆▇█▁██▂▄▆ ➡️ 25ms
workflow-execution: layout count ▁█▂▃▂▃▃▁▃▃▄▃▂▃▂ ➡️ 5
workflow-execution: style recalc count ▃█▅▇▁▄▅▆▅▅▅▅▄▄▂ ➡️ 15
workflow-execution: task duration ▂▅▄▅▁▄▆▆▆▁▇█▁▃▃ ➡️ 120ms
workflow-execution: script duration ▄▃▄▄▃▅▄▅▆▂▇█▁▃▄ ➡️ 29ms
workflow-execution: TBT ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ➡️ 0ms
workflow-execution: heap used ➡️ NaN MB
workflow-execution: DOM nodes ▂█▃▆▁▄▃▅▃█▃▃▄▃▁ ➡️ 152
workflow-execution: event listeners ▅███▁▅███▁██▅█▅ ➡️ 49
Raw data
{
  "timestamp": "2026-07-17T22:22:40.898Z",
  "gitSha": "bca675569051062ed0c41b706f0f57d31bae6686",
  "branch": "unify-website-release-comments",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2056.175000000053,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 6.676000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 480.76300000000003,
      "heapDeltaBytes": -22764028,
      "heapUsedBytes": 46213280,
      "domNodes": -268,
      "jsHeapTotalBytes": 19279872,
      "scriptDurationMs": 22.805,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-idle",
      "durationMs": 2044.2899999999895,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.991,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 483.87299999999993,
      "heapDeltaBytes": -23400880,
      "heapUsedBytes": 45596348,
      "domNodes": -265,
      "jsHeapTotalBytes": 19279872,
      "scriptDurationMs": 26.894000000000002,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1716.6320000000042,
      "styleRecalcs": 72,
      "styleRecalcDurationMs": 30.608000000000004,
      "layouts": 12,
      "layoutDurationMs": 2.92,
      "taskDurationMs": 644.694,
      "heapDeltaBytes": -1755832,
      "heapUsedBytes": 66878948,
      "domNodes": 56,
      "jsHeapTotalBytes": 20987904,
      "scriptDurationMs": 97.64200000000001,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1763.9859999999885,
      "styleRecalcs": 73,
      "styleRecalcDurationMs": 33.594,
      "layouts": 12,
      "layoutDurationMs": 3.2419999999999995,
      "taskDurationMs": 780.623,
      "heapDeltaBytes": -16481312,
      "heapUsedBytes": 52368484,
      "domNodes": -265,
      "jsHeapTotalBytes": 19279872,
      "scriptDurationMs": 110.682,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1713.7650000000235,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 16.299,
      "layouts": 6,
      "layoutDurationMs": 0.6249999999999999,
      "taskDurationMs": 319.59700000000004,
      "heapDeltaBytes": 7598592,
      "heapUsedBytes": 76559144,
      "domNodes": 78,
      "jsHeapTotalBytes": 19152896,
      "scriptDurationMs": 23.639,
      "eventListeners": 21,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1723.7519999999904,
      "styleRecalcs": 30,
      "styleRecalcDurationMs": 17.615,
      "layouts": 6,
      "layoutDurationMs": 0.5690000000000001,
      "taskDurationMs": 291.042,
      "heapDeltaBytes": 7070356,
      "heapUsedBytes": 75951124,
      "domNodes": 77,
      "jsHeapTotalBytes": 19939328,
      "scriptDurationMs": 20.225,
      "eventListeners": 21,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 532.0919999999774,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 7.2379999999999995,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 318.996,
      "heapDeltaBytes": -11887088,
      "heapUsedBytes": 56940284,
      "domNodes": 20,
      "jsHeapTotalBytes": 20463616,
      "scriptDurationMs": 48.762,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 545.4490000000192,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 7.108,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 321.386,
      "heapDeltaBytes": -11571956,
      "heapUsedBytes": 57104924,
      "domNodes": 20,
      "jsHeapTotalBytes": 20201472,
      "scriptDurationMs": 50.67000000000001,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666682,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2022.0069999999737,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.437999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 578.1590000000001,
      "heapDeltaBytes": 5345808,
      "heapUsedBytes": 66541348,
      "domNodes": -265,
      "jsHeapTotalBytes": 4669440,
      "scriptDurationMs": 91.408,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2026.6899999999737,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 9.379,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 649.261,
      "heapDeltaBytes": 5639000,
      "heapUsedBytes": 64603296,
      "domNodes": -266,
      "jsHeapTotalBytes": 4145152,
      "scriptDurationMs": 95.17,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2109.983999999997,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 15.137,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 984.3720000000001,
      "heapDeltaBytes": 1271944,
      "heapUsedBytes": 63516712,
      "domNodes": -267,
      "jsHeapTotalBytes": 4874240,
      "scriptDurationMs": 318.29200000000003,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2095.9740000000124,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 16.135000000000005,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1028.381,
      "heapDeltaBytes": 26228544,
      "heapUsedBytes": 86441112,
      "domNodes": -269,
      "jsHeapTotalBytes": 5136384,
      "scriptDurationMs": 343.15299999999996,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3108.910999999978,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 15.36,
      "layouts": 60,
      "layoutDurationMs": 7.500000000000001,
      "taskDurationMs": 1191.1190000000001,
      "heapDeltaBytes": -7654744,
      "heapUsedBytes": 54063308,
      "domNodes": -268,
      "jsHeapTotalBytes": 7553024,
      "scriptDurationMs": 409.71200000000005,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3137.0959999999286,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 16.169999999999998,
      "layouts": 60,
      "layoutDurationMs": 7.568,
      "taskDurationMs": 1242.269,
      "heapDeltaBytes": -8520524,
      "heapUsedBytes": 55428292,
      "domNodes": -270,
      "jsHeapTotalBytes": 8077312,
      "scriptDurationMs": 439.876,
      "eventListeners": -131,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2021.2750000000028,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.984000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 579.861,
      "heapDeltaBytes": 5327916,
      "heapUsedBytes": 66151584,
      "domNodes": -266,
      "jsHeapTotalBytes": 5455872,
      "scriptDurationMs": 91.882,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 1992.1319999999696,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.276999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 531.593,
      "heapDeltaBytes": 5289812,
      "heapUsedBytes": 66163884,
      "domNodes": -267,
      "jsHeapTotalBytes": 4931584,
      "scriptDurationMs": 84.926,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 550.7579999999734,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 9.729999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 325.64200000000005,
      "heapDeltaBytes": -11453636,
      "heapUsedBytes": 57497628,
      "domNodes": 20,
      "jsHeapTotalBytes": 20987904,
      "scriptDurationMs": 100.78200000000001,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 519.1010000000915,
      "styleRecalcs": 49,
      "styleRecalcDurationMs": 10.782000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 305.851,
      "heapDeltaBytes": -11451724,
      "heapUsedBytes": 57490188,
      "domNodes": 24,
      "jsHeapTotalBytes": 20463616,
      "scriptDurationMs": 96.86699999999999,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000273
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2022.81899999997,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.335000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 412.49,
      "heapDeltaBytes": 3844856,
      "heapUsedBytes": 72789200,
      "domNodes": 20,
      "jsHeapTotalBytes": 19939328,
      "scriptDurationMs": 19.327,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1994.324000000006,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.883,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 463.70599999999996,
      "heapDeltaBytes": -22040704,
      "heapUsedBytes": 46883680,
      "domNodes": -264,
      "jsHeapTotalBytes": 20066304,
      "scriptDurationMs": 20.769,
      "eventListeners": -131,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1702.2309999999834,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 30.420999999999996,
      "layouts": 16,
      "layoutDurationMs": 3.688,
      "taskDurationMs": 675.2249999999999,
      "heapDeltaBytes": -21166656,
      "heapUsedBytes": 47851748,
      "domNodes": -267,
      "jsHeapTotalBytes": 19017728,
      "scriptDurationMs": 84.46100000000001,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1708.5340000000429,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 37.175,
      "layouts": 16,
      "layoutDurationMs": 4.535,
      "taskDurationMs": 671.7850000000001,
      "heapDeltaBytes": -5156040,
      "heapUsedBytes": 63729840,
      "domNodes": 63,
      "jsHeapTotalBytes": 20725760,
      "scriptDurationMs": 88.58099999999999,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 882.4700000000121,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 26.074999999999996,
      "layouts": 15,
      "layoutDurationMs": 10.598,
      "taskDurationMs": 683.3530000000001,
      "heapDeltaBytes": 27170316,
      "heapUsedBytes": 97181396,
      "domNodes": 13673,
      "jsHeapTotalBytes": 15990784,
      "scriptDurationMs": 25.141999999999996,
      "eventListeners": 2369,
      "totalBlockingTimeMs": 103,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8140.54699999997,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 40.311,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3499.4990000000003,
      "heapDeltaBytes": 15354852,
      "heapUsedBytes": 74270752,
      "domNodes": -267,
      "jsHeapTotalBytes": 7233536,
      "scriptDurationMs": 1043.8780000000002,
      "eventListeners": -113,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8155.479000000014,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 40.695,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3418.984,
      "heapDeltaBytes": 15250976,
      "heapUsedBytes": 74259544,
      "domNodes": -268,
      "jsHeapTotalBytes": 6709248,
      "scriptDurationMs": 1041.7749999999999,
      "eventListeners": -113,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.80000000000109
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 11802.06899999996,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 11784.695000000002,
      "heapDeltaBytes": -37515928,
      "heapUsedBytes": 183124992,
      "domNodes": -8311,
      "jsHeapTotalBytes": -8327168,
      "scriptDurationMs": 454.263,
      "eventListeners": -16384,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 11609.909000000016,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 11593.311,
      "heapDeltaBytes": -66085628,
      "heapUsedBytes": 163861552,
      "domNodes": -8311,
      "jsHeapTotalBytes": -7802880,
      "scriptDurationMs": 467.735,
      "eventListeners": -16388,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.219999999999953,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14180.465000000026,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 13.41500000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 14161.520999999999,
      "heapDeltaBytes": -38294304,
      "heapUsedBytes": 176705016,
      "domNodes": -8311,
      "jsHeapTotalBytes": -15228928,
      "scriptDurationMs": 734.2109999999999,
      "eventListeners": -16380,
      "totalBlockingTimeMs": 49,
      "frameDurationMs": 17.220000000000073,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 14018.204000000082,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 13.115000000000016,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 13995.617,
      "heapDeltaBytes": -47219544,
      "heapUsedBytes": 161243216,
      "domNodes": -8311,
      "jsHeapTotalBytes": -9900032,
      "scriptDurationMs": 732.4190000000001,
      "eventListeners": -16382,
      "totalBlockingTimeMs": 6,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 465.2060000000233,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 23.623,
      "layouts": 3,
      "layoutDurationMs": 1.447,
      "taskDurationMs": 128.78699999999998,
      "heapDeltaBytes": -16392824,
      "heapUsedBytes": 51787744,
      "domNodes": 130,
      "jsHeapTotalBytes": 6569984,
      "scriptDurationMs": 10.167,
      "eventListeners": 65,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "workflow-execution",
      "durationMs": 453.0040000000781,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 17.972,
      "layouts": 3,
      "layoutDurationMs": 1.054,
      "taskDurationMs": 108.236,
      "heapDeltaBytes": -16073164,
      "heapUsedBytes": 51999772,
      "domNodes": 143,
      "jsHeapTotalBytes": 6569984,
      "scriptDurationMs": 9.437999999999999,
      "eventListeners": 65,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.799999999999727
    }
  ]
}

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/actions/comment-release-links/action.yaml:
- Around line 104-111: The upsert-comment-section action in the
comment-release-links workflow at the step "Upsert release section into unified
report" uses a shared marker (<!-- COMFYUI_FRONTEND_PR_REPORT -->) that is now
targeted by multiple concurrent workflows, causing read-modify-write race
conditions where unrelated sections can be lost. Implement a solution by either:
(1) adding a concurrency strategy or locking mechanism at the workflow level to
serialize all writes to the same PR using the shared marker, or (2) modify the
upsert-comment-section action itself to be conflict-tolerant by implementing
retry logic with re-reading and merging instead of simple read-modify-write.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: c34fbe1a-df17-4c13-aed2-b7d005c7c058

📥 Commits

Reviewing files that changed from the base of the PR and between 0a4021d and 13129d2.

📒 Files selected for processing (5)
  • .github/actions/comment-release-links/action.yaml
  • .github/workflows/ci-website-e2e.yaml
  • .github/workflows/pr-report.yaml
  • .github/workflows/pr-update-website-screenshots.yaml
  • .github/workflows/pr-vercel-website-preview.yaml

Comment thread .github/actions/comment-release-links/action.yaml
@codecov

codecov Bot commented Jun 18, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@            Coverage Diff             @@
##             main   #12939      +/-   ##
==========================================
- Coverage   77.52%   77.34%   -0.19%     
==========================================
  Files        1649     1687      +38     
  Lines      109395   115148    +5753     
  Branches    37655    38926    +1271     
==========================================
+ Hits        84812    89058    +4246     
- Misses      23715    25381    +1666     
+ Partials      868      709     -159     
Flag Coverage Δ
unit 67.24% <ø> (+1.67%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.
see 482 files with indirect coverage changes

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

christian-byrne pushed a commit that referenced this pull request Jun 19, 2026
…writers

Several workflows now share one PR comment via read-modify-write, which the
REST API can't do atomically. Re-read immediately before each write and verify
our section plus every previously-present section survived; on a detected
clobber, re-read and retry with backoff so concurrent writers converge instead
of dropping each other's sections.

Addresses review feedback:
#12939 (comment)
@github-actions

github-actions Bot commented Jun 25, 2026

Copy link
Copy Markdown

✅ All contributors have signed the CLA. Thank you! This PR is ready to be merged.
Posted by the CLA Assistant Lite bot.

@christian-byrne

Copy link
Copy Markdown
Contributor Author

I have read and agree to the Contributor License Agreement

Point the website e2e, preview, and screenshot-update sections at the shared
COMFYUI_FRONTEND_PR_REPORT comment instead of the separate WEBSITE_CI_REPORT
comment, and add WEBSITE_CI_REPORT to the legacy-comment cleanup so the old
standalone website comment is removed.

Addresses review feedback:
#11935 (review)
Convert comment-release-links to upsert a release / desktop-release section
into the shared COMFYUI_FRONTEND_PR_REPORT comment instead of posting a
separate release-summary comment.
…writers

Several workflows now share one PR comment via read-modify-write, which the
REST API can't do atomically. Re-read immediately before each write and verify
our section plus every previously-present section survived; on a detected
clobber, re-read and retry with backoff so concurrent writers converge instead
of dropping each other's sections.

Addresses review feedback:
#12939 (comment)
@DrJKL
DrJKL force-pushed the unify-website-release-comments branch from 3e84c8f to 9a986bc Compare July 7, 2026 06:18

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/actions/comment-release-links/action.yaml:
- Around line 100-102: The composite action is already writing new_version to
GITHUB_OUTPUT, but it is not exposed through the action’s outputs definition.
Update the outputs block in action.yaml to include new_version alongside
prev_version so callers can reference steps.<id>.outputs.new_version; use the
existing output name consistently with the echo statements in the action’s main
script.

In @.github/actions/upsert-comment-section/action.yaml:
- Around line 102-107: The update path in the comment upsert flow is missing the
same retry resilience as the create path: `github.rest.issues.updateComment` is
called without a `try/catch`, so transient failures will abort immediately. Wrap
the `updateComment` call in the same retry/backoff handling used around
`createComment` in the action logic, and make sure the `existing`/`updated`
comment flow continues to retry on temporary errors instead of failing fast.
- Around line 96-112: The post-write verification in the comment upsert flow
only checks for section markers, so stale reads can still clobber concurrent
edits inside the section. Update the logic around the section update path in the
action’s comment handling to compare the full section block content (or a hash
of it) after `github.rest.issues.updateComment` and treat any mismatch as a
failed write. Use the existing `sectionStartsIn`, `sectionRegex`,
`sectionBlock`, and `findComment` flow to locate the check, and retry when the
returned comment body does not exactly match the expected block.
- Around line 82-94: The first-write path in the upsert comment action can still
create duplicate marker comments because `findComment()` and
`github.rest.issues.createComment()` are not protected against concurrent
callers. Update the logic in the action handler so the initial creation is
serialized across callers, or add a post-create deduplication step that removes
extra comments with the same marker. Keep the retry/update flow intact, but
ensure only one marker comment survives after concurrent first writes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 54fba75d-83cf-4ac9-88b8-3eb40c27c288

📥 Commits

Reviewing files that changed from the base of the PR and between 3e84c8f and 9a986bc.

📒 Files selected for processing (6)
  • .github/actions/comment-release-links/action.yaml
  • .github/actions/upsert-comment-section/action.yaml
  • .github/workflows/ci-website-e2e.yaml
  • .github/workflows/pr-report.yaml
  • .github/workflows/pr-update-website-screenshots.yaml
  • .github/workflows/pr-vercel-website-preview.yaml

Comment thread .github/actions/comment-release-links/action.yaml
Comment thread .github/actions/upsert-comment-section/action.yaml
Comment thread .github/actions/upsert-comment-section/action.yaml
Comment thread .github/actions/upsert-comment-section/action.yaml Outdated

@DrJKL DrJKL left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Batched review comments for the duplicate unified-comment creation concern.

return github.rest.issues.createComment({
if (!existing) {
try {
await github.rest.issues.createComment({

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Multiple callers can still create duplicate unified comments here. If two workflows both observe no existing COMFYUI_FRONTEND_PR_REPORT, both createComment calls can succeed and return because issue comments have no uniqueness constraint, splitting sections across separate comments. Re-read after creation and merge/delete duplicates, or serialize all writers on one PR-scoped concurrency key.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

✅ Fixed in 6eb3eeb. After createComment succeeds, we now re-read all PR comments and delete any other github-actions[bot] comments with the same marker, so concurrent first-writes converge to a single comment.

return github.rest.issues.createComment({
if (!existing) {
try {
await github.rest.issues.createComment({

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Multiple callers can still create duplicate unified comments here. If two workflows both observe no existing COMFYUI_FRONTEND_PR_REPORT, both createComment calls can succeed and return because issue comments have no uniqueness constraint, splitting sections across separate comments. Re-read after creation and merge/delete duplicates, or serialize all writers on one PR-scoped concurrency key.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

✅ Fixed in 6eb3eeb. After createComment succeeds, we now re-read all PR comments and delete any other github-actions[bot] comments with the same marker, so concurrent first-writes converge to a single comment.

@DrJKL DrJKL assigned christian-byrne and unassigned DrJKL Jul 7, 2026
After createComment succeeds, re-read all PR comments and delete any
other github-actions[bot] comments containing the same marker. Closes
the race where two callers both miss findComment() and each post a copy,
splitting sections across separate comments.

Addresses review feedback:
#12939 (comment)
#12939 (comment)
#12939 (comment)
…aviour

Transient failures (rate limit, 5xx, deleted comment) in updateComment
previously aborted immediately. Now they re-enter the retry loop with
the same backoff as the create path.

Addresses review feedback:
#12939 (comment)

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/actions/upsert-comment-section/action.yaml:
- Around line 89-109: Update the duplicate-handling flow around allComments and
duplicates to preserve content: select the lowest-ID marker comment as
canonical, merge all section blocks from competing comments into it, update and
verify that canonical body, then delete only confirmed duplicates. If merging or
verification fails, retry or leave duplicates intact rather than deleting
comments and losing sections; ensure concurrent writers cannot delete each
other’s content.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 0e4b8300-8609-4a0f-bf13-4fe78b11672f

📥 Commits

Reviewing files that changed from the base of the PR and between 9a986bc and 17bd2eb.

📒 Files selected for processing (2)
  • .github/actions/comment-release-links/action.yaml
  • .github/actions/upsert-comment-section/action.yaml

Comment on lines +89 to +109
// Concurrent writers may have also created a comment; deduplicate
// by keeping the lowest-id copy and deleting the rest.
const allComments = await github.paginate(
github.rest.issues.listComments,
{ ...context.repo, issue_number: prNumber }
)
const duplicates = allComments.filter(
(c) =>
c.user?.login === 'github-actions[bot]' &&
c.body?.includes(commentMarker) &&
c.id !== created.data.id
)
for (const dup of duplicates) {
try {
await github.rest.issues.deleteComment({
...context.repo,
comment_id: dup.id
})
} catch (_) {}
}
return

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Merge duplicate bodies before deleting them.

This deletes every competing marker comment without preserving its sections—and despite the comment, retains the newly-created ID rather than the lowest ID. Concurrent first writes for e2e and release, for example, can delete one another’s sections; if both list before either deletion, each can even delete the other’s comment. Merge all section blocks into one canonical comment, verify it, then delete duplicates; otherwise retry/leave duplicates rather than lose report content.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/actions/upsert-comment-section/action.yaml around lines 89 - 109,
Update the duplicate-handling flow around allComments and duplicates to preserve
content: select the lowest-ID marker comment as canonical, merge all section
blocks from competing comments into it, update and verify that canonical body,
then delete only confirmed duplicates. If merging or verification fails, retry
or leave duplicates intact rather than deleting comments and losing sections;
ensure concurrent writers cannot delete each other’s content.

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants