Skip to content

test: DO NOT MERGE, combined demo of coverage split (#13250-#13268)#13273

Closed
huang47 wants to merge 47 commits into
Comfy-Org:mainfrom
huang47:shihchi/coverage-all-combined-demo
Closed

test: DO NOT MERGE, combined demo of coverage split (#13250-#13268)#13273
huang47 wants to merge 47 commits into
Comfy-Org:mainfrom
huang47:shihchi/coverage-all-combined-demo

Conversation

@huang47

@huang47 huang47 commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Summary

DEMO / DO NOT MERGE. This PR is the combined union of the redone split PRs #13250-#13268, rebased onto #13313's codex/coverage-gate-infra baseline. Real review happens in the individual scoped PRs.

What's in here

Review Focus

Add a COVERAGE_CRITICAL gate that measures coverage over a curated
allow-list of critical files and wire it into the unit CI job. Thresholds
are locked to the current main baseline (statements 58 / branches 47 /
functions 54 / lines 58); later PRs ratchet them upward as tests land.
@github-actions

github-actions Bot commented Jun 29, 2026

Copy link
Copy Markdown

🎨 Storybook: 🚧 Building...

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

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

⏳ Size data collection in progress…

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.2 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 49.6 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 57.9 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 63.3 MB heap
large-graph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 59.5 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 81.3 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.7 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 60.9 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 64.4 MB heap
subgraph-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.0 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 46.2 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 180ms TBT · 77.5 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 66.6 MB heap
vue-large-graph-idle: · 57.1 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 167.9 MB heap
vue-large-graph-pan: · 58.1 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 174.5 MB heap
workflow-execution: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 59.1 MB heap

ℹ️ No baseline found — significance unavailable.

Absolute values
Metric Value
canvas-idle: avg frame time 17ms
canvas-idle: p95 frame time 17ms
canvas-idle: layout duration 0ms
canvas-idle: style recalc duration 10ms
canvas-idle: layout count 0
canvas-idle: style recalc count 9
canvas-idle: task duration 485ms
canvas-idle: script duration 27ms
canvas-idle: TBT 0ms
canvas-idle: heap used 54.2 MB
canvas-idle: DOM nodes 18
canvas-idle: event listeners 5
canvas-mouse-sweep: avg frame time 17ms
canvas-mouse-sweep: p95 frame time 17ms
canvas-mouse-sweep: layout duration 4ms
canvas-mouse-sweep: style recalc duration 50ms
canvas-mouse-sweep: layout count 12
canvas-mouse-sweep: style recalc count 77
canvas-mouse-sweep: task duration 945ms
canvas-mouse-sweep: script duration 142ms
canvas-mouse-sweep: TBT 0ms
canvas-mouse-sweep: heap used 49.6 MB
canvas-mouse-sweep: DOM nodes 59
canvas-mouse-sweep: event listeners 5
canvas-zoom-sweep: avg frame time 17ms
canvas-zoom-sweep: p95 frame time 17ms
canvas-zoom-sweep: layout duration 1ms
canvas-zoom-sweep: style recalc duration 18ms
canvas-zoom-sweep: layout count 6
canvas-zoom-sweep: style recalc count 31
canvas-zoom-sweep: task duration 360ms
canvas-zoom-sweep: script duration 26ms
canvas-zoom-sweep: TBT 0ms
canvas-zoom-sweep: heap used 57.9 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 17ms
dom-widget-clipping: layout duration 0ms
dom-widget-clipping: style recalc duration 9ms
dom-widget-clipping: layout count 0
dom-widget-clipping: style recalc count 12
dom-widget-clipping: task duration 399ms
dom-widget-clipping: script duration 67ms
dom-widget-clipping: TBT 0ms
dom-widget-clipping: heap used 63.3 MB
dom-widget-clipping: DOM nodes 19
dom-widget-clipping: event listeners 2
large-graph-idle: avg frame time 17ms
large-graph-idle: p95 frame time 17ms
large-graph-idle: layout duration 0ms
large-graph-idle: style recalc duration 11ms
large-graph-idle: layout count 0
large-graph-idle: style recalc count 10
large-graph-idle: task duration 665ms
large-graph-idle: script duration 115ms
large-graph-idle: TBT 0ms
large-graph-idle: heap used 59.5 MB
large-graph-idle: DOM nodes 19
large-graph-idle: event listeners 6
large-graph-pan: avg frame time 17ms
large-graph-pan: p95 frame time 17ms
large-graph-pan: layout duration 0ms
large-graph-pan: style recalc duration 20ms
large-graph-pan: layout count 0
large-graph-pan: style recalc count 69
large-graph-pan: task duration 1172ms
large-graph-pan: script duration 438ms
large-graph-pan: TBT 0ms
large-graph-pan: heap used 81.3 MB
large-graph-pan: DOM nodes 17
large-graph-pan: event listeners 6
large-graph-zoom: avg frame time 17ms
large-graph-zoom: p95 frame time 17ms
large-graph-zoom: layout duration 8ms
large-graph-zoom: style recalc duration 20ms
large-graph-zoom: layout count 60
large-graph-zoom: style recalc count 65
large-graph-zoom: task duration 1405ms
large-graph-zoom: script duration 532ms
large-graph-zoom: TBT 0ms
large-graph-zoom: heap used 67.7 MB
large-graph-zoom: DOM nodes 11
large-graph-zoom: event listeners 8
minimap-idle: avg frame time 17ms
minimap-idle: p95 frame time 17ms
minimap-idle: layout duration 0ms
minimap-idle: style recalc duration 9ms
minimap-idle: layout count 0
minimap-idle: style recalc count 9
minimap-idle: task duration 632ms
minimap-idle: script duration 115ms
minimap-idle: TBT 0ms
minimap-idle: heap used 60.9 MB
minimap-idle: DOM nodes 17
minimap-idle: event listeners 6
subgraph-dom-widget-clipping: avg frame time 17ms
subgraph-dom-widget-clipping: p95 frame time 17ms
subgraph-dom-widget-clipping: layout duration 0ms
subgraph-dom-widget-clipping: style recalc duration 13ms
subgraph-dom-widget-clipping: layout count 0
subgraph-dom-widget-clipping: style recalc count 48
subgraph-dom-widget-clipping: task duration 405ms
subgraph-dom-widget-clipping: script duration 131ms
subgraph-dom-widget-clipping: TBT 0ms
subgraph-dom-widget-clipping: heap used 64.4 MB
subgraph-dom-widget-clipping: DOM nodes 21
subgraph-dom-widget-clipping: event listeners 7
subgraph-idle: avg frame time 17ms
subgraph-idle: p95 frame time 17ms
subgraph-idle: layout duration 0ms
subgraph-idle: style recalc duration 11ms
subgraph-idle: layout count 0
subgraph-idle: style recalc count 10
subgraph-idle: task duration 501ms
subgraph-idle: script duration 24ms
subgraph-idle: TBT 0ms
subgraph-idle: heap used 54.0 MB
subgraph-idle: DOM nodes 20
subgraph-idle: event listeners 4
subgraph-mouse-sweep: avg frame time 17ms
subgraph-mouse-sweep: p95 frame time 17ms
subgraph-mouse-sweep: layout duration 5ms
subgraph-mouse-sweep: style recalc duration 42ms
subgraph-mouse-sweep: layout count 16
subgraph-mouse-sweep: style recalc count 78
subgraph-mouse-sweep: task duration 797ms
subgraph-mouse-sweep: script duration 104ms
subgraph-mouse-sweep: TBT 0ms
subgraph-mouse-sweep: heap used 46.2 MB
subgraph-mouse-sweep: DOM nodes 64
subgraph-mouse-sweep: event listeners 4
subgraph-transition-enter: avg frame time 17ms
subgraph-transition-enter: p95 frame time 17ms
subgraph-transition-enter: layout duration 15ms
subgraph-transition-enter: style recalc duration 31ms
subgraph-transition-enter: layout count 4
subgraph-transition-enter: style recalc count 16
subgraph-transition-enter: task duration 883ms
subgraph-transition-enter: script duration 43ms
subgraph-transition-enter: TBT 180ms
subgraph-transition-enter: heap used 77.5 MB
subgraph-transition-enter: DOM nodes 13833
subgraph-transition-enter: event listeners 2533
viewport-pan-sweep: avg frame time 17ms
viewport-pan-sweep: p95 frame time 17ms
viewport-pan-sweep: layout duration 0ms
viewport-pan-sweep: style recalc duration 58ms
viewport-pan-sweep: layout count 0
viewport-pan-sweep: style recalc count 251
viewport-pan-sweep: task duration 4124ms
viewport-pan-sweep: script duration 1329ms
viewport-pan-sweep: TBT 0ms
viewport-pan-sweep: heap used 66.6 MB
viewport-pan-sweep: DOM nodes 19
viewport-pan-sweep: event listeners 20
vue-large-graph-idle: avg frame time 18ms
vue-large-graph-idle: p95 frame time 17ms
vue-large-graph-idle: layout duration 0ms
vue-large-graph-idle: style recalc duration 0ms
vue-large-graph-idle: layout count 0
vue-large-graph-idle: style recalc count 0
vue-large-graph-idle: task duration 13587ms
vue-large-graph-idle: script duration 550ms
vue-large-graph-idle: TBT 0ms
vue-large-graph-idle: heap used 167.9 MB
vue-large-graph-idle: DOM nodes -3304
vue-large-graph-idle: event listeners -16372
vue-large-graph-pan: avg frame time 17ms
vue-large-graph-pan: p95 frame time 17ms
vue-large-graph-pan: layout duration 0ms
vue-large-graph-pan: style recalc duration 21ms
vue-large-graph-pan: layout count 0
vue-large-graph-pan: style recalc count 79
vue-large-graph-pan: task duration 15557ms
vue-large-graph-pan: script duration 879ms
vue-large-graph-pan: TBT 0ms
vue-large-graph-pan: heap used 174.5 MB
vue-large-graph-pan: DOM nodes -3302
vue-large-graph-pan: event listeners -16372
workflow-execution: avg frame time 17ms
workflow-execution: p95 frame time 17ms
workflow-execution: layout duration 1ms
workflow-execution: style recalc duration 22ms
workflow-execution: layout count 4
workflow-execution: style recalc count 17
workflow-execution: task duration 114ms
workflow-execution: script duration 18ms
workflow-execution: TBT 0ms
workflow-execution: heap used 59.1 MB
workflow-execution: DOM nodes 169
workflow-execution: event listeners 53
Raw data
{
  "timestamp": "2026-06-30T07:14:25.869Z",
  "gitSha": "e49583fb37d66699f9b4eb6c18c58f454d0e2f8c",
  "branch": "shihchi/coverage-all-combined-demo",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2037.6279999999838,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 10.082999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 462.90799999999996,
      "heapDeltaBytes": -1918728,
      "heapUsedBytes": 56887988,
      "domNodes": 18,
      "jsHeapTotalBytes": 25165824,
      "scriptDurationMs": 25.739999999999995,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-idle",
      "durationMs": 2021.9540000000507,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 9.259000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 507.38399999999996,
      "heapDeltaBytes": -2045004,
      "heapUsedBytes": 56725792,
      "domNodes": 18,
      "jsHeapTotalBytes": 25427968,
      "scriptDurationMs": 27.824,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2023.8130000000183,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 52.623000000000005,
      "layouts": 12,
      "layoutDurationMs": 3.5160000000000005,
      "taskDurationMs": 955.846,
      "heapDeltaBytes": -6983764,
      "heapUsedBytes": 51923876,
      "domNodes": 59,
      "jsHeapTotalBytes": 25952256,
      "scriptDurationMs": 140.179,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1922.5020000000086,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 47.747,
      "layouts": 12,
      "layoutDurationMs": 4.276000000000001,
      "taskDurationMs": 934.3839999999999,
      "heapDeltaBytes": -6665004,
      "heapUsedBytes": 52095624,
      "domNodes": 58,
      "jsHeapTotalBytes": 25427968,
      "scriptDurationMs": 144.18200000000002,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1738.7840000000097,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 19.189999999999998,
      "layouts": 6,
      "layoutDurationMs": 0.631,
      "taskDurationMs": 383.693,
      "heapDeltaBytes": 1978644,
      "heapUsedBytes": 60683764,
      "domNodes": 79,
      "jsHeapTotalBytes": 24641536,
      "scriptDurationMs": 28.963999999999995,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1708.6330000000771,
      "styleRecalcs": 30,
      "styleRecalcDurationMs": 17.564,
      "layouts": 6,
      "layoutDurationMs": 0.591,
      "taskDurationMs": 336.058,
      "heapDeltaBytes": 1897016,
      "heapUsedBytes": 60656416,
      "domNodes": 78,
      "jsHeapTotalBytes": 25165824,
      "scriptDurationMs": 22.821,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 628.4370000000195,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 8.357000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 385.081,
      "heapDeltaBytes": 7904612,
      "heapUsedBytes": 66585904,
      "domNodes": 20,
      "jsHeapTotalBytes": 19136512,
      "scriptDurationMs": 64.17699999999999,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 661.7259999999305,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.471,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 412.238,
      "heapDeltaBytes": 7494456,
      "heapUsedBytes": 66219724,
      "domNodes": 18,
      "jsHeapTotalBytes": 19398656,
      "scriptDurationMs": 69.79400000000001,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2054.791000000023,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 11.832000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 642.514,
      "heapDeltaBytes": -9361728,
      "heapUsedBytes": 62351796,
      "domNodes": 20,
      "jsHeapTotalBytes": 9842688,
      "scriptDurationMs": 114.508,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2018.6879999999974,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 11.144000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 687.54,
      "heapDeltaBytes": -9865644,
      "heapUsedBytes": 62378264,
      "domNodes": 18,
      "jsHeapTotalBytes": 11677696,
      "scriptDurationMs": 115.984,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2133.954000000017,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 20.811,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1145.6810000000003,
      "heapDeltaBytes": 11380444,
      "heapUsedBytes": 84445996,
      "domNodes": 18,
      "jsHeapTotalBytes": 10018816,
      "scriptDurationMs": 414.56,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2149.635999999987,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 19.278000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1198.993,
      "heapDeltaBytes": 13019672,
      "heapUsedBytes": 86027084,
      "domNodes": 16,
      "jsHeapTotalBytes": 12378112,
      "scriptDurationMs": 460.509,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3203.6469999999895,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 20.337999999999997,
      "layouts": 60,
      "layoutDurationMs": 8.041999999999998,
      "taskDurationMs": 1456.9260000000002,
      "heapDeltaBytes": 15502808,
      "heapUsedBytes": 70734628,
      "domNodes": 12,
      "jsHeapTotalBytes": 7602176,
      "scriptDurationMs": 558.958,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3146.152999999913,
      "styleRecalcs": 64,
      "styleRecalcDurationMs": 19.557,
      "layouts": 60,
      "layoutDurationMs": 8.012,
      "taskDurationMs": 1353.6870000000001,
      "heapDeltaBytes": 15606744,
      "heapUsedBytes": 71255912,
      "domNodes": 10,
      "jsHeapTotalBytes": 5242880,
      "scriptDurationMs": 504.50700000000006,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2017.5569999999539,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 9.679,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 689.6669999999999,
      "heapDeltaBytes": -9693228,
      "heapUsedBytes": 63871324,
      "domNodes": 16,
      "jsHeapTotalBytes": 8007680,
      "scriptDurationMs": 120.45599999999997,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 2019.5779999999104,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.721,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 574.431,
      "heapDeltaBytes": -9325244,
      "heapUsedBytes": 63854204,
      "domNodes": 18,
      "jsHeapTotalBytes": 8531968,
      "scriptDurationMs": 110.212,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 587.7200000000471,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 13.53,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 407.2680000000001,
      "heapDeltaBytes": 8423940,
      "heapUsedBytes": 67171056,
      "domNodes": 22,
      "jsHeapTotalBytes": 19660800,
      "scriptDurationMs": 131.49,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 597.2210000001041,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 12.162999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 403.51400000000007,
      "heapDeltaBytes": 9133872,
      "heapUsedBytes": 67928324,
      "domNodes": 20,
      "jsHeapTotalBytes": 18874368,
      "scriptDurationMs": 130.47099999999998,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2007.2490000000016,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 10.713000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 487.472,
      "heapDeltaBytes": -2144648,
      "heapUsedBytes": 56624556,
      "domNodes": 20,
      "jsHeapTotalBytes": 25165824,
      "scriptDurationMs": 23.867,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2005.8530000000019,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 11.285,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 515.3810000000001,
      "heapDeltaBytes": -2250100,
      "heapUsedBytes": 56599604,
      "domNodes": 20,
      "jsHeapTotalBytes": 25165824,
      "scriptDurationMs": 25.078000000000003,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1674.032000000011,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 38.469,
      "layouts": 16,
      "layoutDurationMs": 4.691,
      "taskDurationMs": 758.221,
      "heapDeltaBytes": -10488044,
      "heapUsedBytes": 48354848,
      "domNodes": 61,
      "jsHeapTotalBytes": 26476544,
      "scriptDurationMs": 100.786,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1755.9999999999718,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 45.501,
      "layouts": 16,
      "layoutDurationMs": 4.851,
      "taskDurationMs": 835.9060000000001,
      "heapDeltaBytes": -10371956,
      "heapUsedBytes": 48529752,
      "domNodes": 66,
      "jsHeapTotalBytes": 24641536,
      "scriptDurationMs": 106.74300000000001,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1399.150000000077,
      "styleRecalcs": 16,
      "styleRecalcDurationMs": 30.921000000000003,
      "layouts": 4,
      "layoutDurationMs": 15.095999999999998,
      "taskDurationMs": 882.811,
      "heapDeltaBytes": 4595800,
      "heapUsedBytes": 81266172,
      "domNodes": 13833,
      "jsHeapTotalBytes": 17563648,
      "scriptDurationMs": 43.27099999999999,
      "eventListeners": 2533,
      "totalBlockingTimeMs": 180,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8240.41500000004,
      "styleRecalcs": 250,
      "styleRecalcDurationMs": 58.711999999999996,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4229.777,
      "heapDeltaBytes": -620316,
      "heapUsedBytes": 70897364,
      "domNodes": 18,
      "jsHeapTotalBytes": 18407424,
      "scriptDurationMs": 1344.398,
      "eventListeners": 20,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333338,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8127.099000000044,
      "styleRecalcs": 251,
      "styleRecalcDurationMs": 57.203,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 4017.851,
      "heapDeltaBytes": -3686680,
      "heapUsedBytes": 68675132,
      "domNodes": 20,
      "jsHeapTotalBytes": 16834560,
      "scriptDurationMs": 1314.0910000000001,
      "eventListeners": 20,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 13708.961999999985,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 13688.932999999999,
      "heapDeltaBytes": -4385804,
      "heapUsedBytes": 184549068,
      "domNodes": -3304,
      "jsHeapTotalBytes": 15962112,
      "scriptDurationMs": 554.702,
      "eventListeners": -16372,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.779999999999927,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 13508.088000000043,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 13485.069999999998,
      "heapDeltaBytes": -21918860,
      "heapUsedBytes": 167534988,
      "domNodes": -3304,
      "jsHeapTotalBytes": 17272832,
      "scriptDurationMs": 546.231,
      "eventListeners": -16371,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.220000000000073,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 15494.282,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 20.046000000000006,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 15468.599999999999,
      "heapDeltaBytes": -30253820,
      "heapUsedBytes": 184212144,
      "domNodes": -3302,
      "jsHeapTotalBytes": 19546112,
      "scriptDurationMs": 825.521,
      "eventListeners": -16374,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.220000000000073,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 15672.095000000012,
      "styleRecalcs": 80,
      "styleRecalcDurationMs": 21.174000000000028,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 15645.74,
      "heapDeltaBytes": -14306028,
      "heapUsedBytes": 181806216,
      "domNodes": -3302,
      "jsHeapTotalBytes": 17448960,
      "scriptDurationMs": 932.226,
      "eventListeners": -16370,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.219999999999953,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 469.8600000000397,
      "styleRecalcs": 22,
      "styleRecalcDurationMs": 28.601000000000003,
      "layouts": 5,
      "layoutDurationMs": 1.921,
      "taskDurationMs": 140.711,
      "heapDeltaBytes": 5505420,
      "heapUsedBytes": 60630648,
      "domNodes": 192,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 20.955,
      "eventListeners": 69,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "workflow-execution",
      "durationMs": 116.26799999999093,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 14.855,
      "layouts": 3,
      "layoutDurationMs": 0.866,
      "taskDurationMs": 87.60299999999998,
      "heapDeltaBytes": 3432152,
      "heapUsedBytes": 63320176,
      "domNodes": 145,
      "jsHeapTotalBytes": 1310720,
      "scriptDurationMs": 14.378,
      "eventListeners": 37,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    }
  ]
}

@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Introduces a critical test coverage enforcement system: a new CI step runs pnpm test:coverage:critical, a fork-aware deploy guard is added to the E2E workflow, @critical Playwright tags are applied to key browser tests, and a large number of new Vitest unit tests are added across stores, composables, and utilities. Several minor production code fixes accompany the new tests.

Changes

Critical Coverage Initiative

Layer / File(s) Summary
Coverage gate CI and Vite config
.github/workflows/ci-tests-unit.yaml, .github/workflows/ci-website-e2e.yaml, package.json, vite.config.mts
Adds a CI step enforcing critical coverage, a fork-aware deploy guard, three new npm scripts (test:browser:critical, test:browser:cloud-critical, test:coverage:critical), and Vitest coverage configuration with a critical-mode file allowlist and pass/fail thresholds.
E2E browser test @critical tagging
browser_tests/tests/cloud.spec.ts, browser_tests/tests/execution.spec.ts, browser_tests/tests/extensionAPI.spec.ts, browser_tests/tests/graph.spec.ts, browser_tests/tests/nodeSearchBoxV2.spec.ts, browser_tests/tests/propertiesPanel/*, browser_tests/tests/queue/queueOverlay.spec.ts, browser_tests/tests/subgraph/subgraphSerialization.spec.ts
Adds { tag: '@critical' } to nine existing E2E tests; test logic and assertions are unchanged.
Production code fixes
src/stores/electronDownloadStore.ts, src/stores/executionStore.ts, src/stores/queueStore.ts, src/stores/subgraphStore.ts, src/stores/subgraphNavigationStore.ts, src/stores/nodeDefStore.ts, src/stores/assetsStore.ts, src/stores/modelStore.ts, src/stores/nodeBookmarkStore.ts, src/utils/treeUtil.ts
Minor targeted fixes: electronDownloadStore progress handler refactor; executionStore eviction, activeJob, resetExecutionState, and cloud-error-message default; queueStore output-loading guard removal; subgraphStore validateSubgraph return type and extractMetadataToWorkflowExtra parameter; subgraphNavigationStore unconditional applyViewport; nodeDefStore _migrateDefaultInput typing; assetsStore Promise.all error handling; modelStore filename slice; nodeBookmarkStore and treeUtil lastIndexOf slice.
Execution store unit tests
src/stores/executionError.test.ts, src/stores/executionErrorStore.test.ts, src/stores/executionInterrupt.test.ts, src/stores/executionLifecycle.test.ts, src/stores/executionNodeProgress.test.ts, src/stores/executionRunningState.test.ts, src/stores/executionStore.test.ts, src/stores/executionWorkflowStatus.test.ts
New and expanded suites covering error routing, error store derived state, interrupt/cached-node tracking, lifecycle progress, node-level progress_state, running state with cloud error classification, regression cases, and workflow status buffering.
Queue, subgraph, and navigation store tests
src/stores/queueResultItem.test.ts, src/stores/queueStore.loadWorkflow.test.ts, src/stores/queueStore.test.ts, src/stores/queueTaskItem.test.ts, src/stores/resultItemParsing.test.ts, src/stores/subgraphNavigationStore.navigateToHash.test.ts, src/stores/subgraphNavigationStore.viewport.test.ts, src/stores/subgraphStore.test.ts
New suites covering ResultItemImpl URL/media classification, TaskItemImpl lifecycle and flatten, loadWorkflow output loading, parseNodeOutput guard, subgraph hash navigation/recovery, viewport save/restore with unavailable canvas, and blueprint publish/delete/load flows.
Other store unit tests
src/stores/assetsStore.test.ts, src/stores/assetExportStore.test.ts, src/stores/assetDownloadStore.test.ts, src/stores/authStore.test.ts, src/stores/appModeStore.test.ts, src/platform/workflow/management/stores/..., src/platform/workflow/templates/..., src/stores/aboutPanelStore.test.ts, src/stores/actionBarButtonStore.test.ts, src/stores/bootstrapStore.test.ts, src/stores/comfyRegistryStore.test.ts, src/stores/commandStore.test.ts, src/stores/dialogStore.test.ts, src/stores/domWidgetStore.test.ts, src/stores/electronDownloadStore*.test.ts, src/stores/jobPreviewStore.test.ts, src/stores/menuItemStore.test.ts, src/stores/modelStore.test.ts, src/stores/modelToNodeStore.test.ts, src/stores/nodeBookmarkStore.test.ts, src/stores/nodeDefStore.test.ts, src/stores/nodeOutputStore.test.ts, src/stores/previewExposureStore.test.ts, src/stores/systemStatsStore.test.ts, src/stores/userFileStore.test.ts, src/stores/userStore.test.ts, src/stores/workspace/favoritedWidgetsStore.test.ts, src/stores/workspaceStore.test.ts
New and expanded tests across all remaining stores, adding coverage for pagination/sorting, cache invalidation, download tracking, auth token selection, selection pruning, workflow list/tab/locator management, template filtering, dialog lifecycle, widget replacement, and more.
Composable and utility unit tests
src/base/common/async.test.ts, src/base/credits/comfyCredits.test.ts, src/composables/..., src/extensions/core/groupNode.test.ts, src/platform/settings/composables/useSettingUI.test.ts, src/renderer/extensions/vueNodes/composables/usePartitionedBadges.test.ts, src/scripts/metadata/parser.test.ts, src/utils/fuseUtil.test.ts, src/utils/gridUtil.test.ts, src/utils/litegraphUtil.test.ts, src/utils/mapperUtil.test.ts, src/utils/mouseDownUtil.test.ts, src/utils/nodeTitleUtil.test.ts, src/utils/objectUrlUtil.test.ts, src/utils/queueDisplay.test.ts, src/utils/rafBatch.test.ts, src/utils/treeUtil.test.ts, src/utils/typeGuardUtil.test.ts, src/workbench/extensions/manager/composables/...
New suites for runWhenGlobalIdle, clampUsd, canvas/graph/node composables, useTreeExpansion, groupNode extension, settings panels, badge partitioning, metadata parser routing, Fuse search, grid styles, litegraph helpers, mapper utilities, mouseDown, node titles, object URLs, queue display formatting, RAF batching, tree utilities, type guards, pack install, and manager display packs.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • Comfy-Org/ComfyUI_frontend#10759: Restructures the subgraph serialization browser test suite — this PR adds the @critical tag to the first test in that same spec file.

Suggested labels

size:XXL

Suggested reviewers

  • jtydhr88
  • christian-byrne
  • AustinMroz

Poem

🐰 A rabbit in the CI warren hops,
Checking critical paths before it stops—
With @critical tags on every test,
And coverage gates enforced with zest!
No flaky builds shall get away,
The warren's tests are here to stay! 🎉


Important

Pre-merge checks failed

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

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
End-To-End Regression Coverage For Fixes ❓ Inconclusive Commit subjects/title text aren’t available here, so the bug-fix keyword check can’t be verified without guessing. Provide the PR title and commit subjects (or mark them explicitly absent); then I can determine whether the E2E regression-test requirement applies.
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Adr Compliance For Entity/Litegraph Changes ✅ Passed Graph-related production changes are store-level; no LGraph*/ECS entity APIs, callbacks, or direct entity spatial mutations are introduced in the described diff.
Title check ✅ Passed The title is directly related to the diff and clearly signals the combined coverage-split demo, despite some noisy draft wording.
Description check ✅ Passed The PR description covers the summary, scope, and review focus well enough for this roll-up demo, with only non-critical template sections omitted.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

❤️ Share

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

@codecov

codecov Bot commented Jun 29, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 94.44444% with 3 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/stores/subgraphStore.ts 85.71% 3 Missing ⚠️
@@                      Coverage Diff                      @@
##           codex/coverage-gate-infra   #13273      +/-   ##
=============================================================
+ Coverage                      78.24%   79.10%   +0.86%     
=============================================================
  Files                           1633     1633              
  Lines                         114228   114082     -146     
  Branches                       39071    38999      -72     
=============================================================
+ Hits                           89382    90250     +868     
+ Misses                         23937    22965     -972     
+ Partials                         909      867      -42     
Flag Coverage Δ
unit 68.19% <94.44%> (+2.92%) ⬆️

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

Files with missing lines Coverage Δ
src/stores/assetsStore.ts 77.73% <100.00%> (+4.27%) ⬆️
src/stores/electronDownloadStore.ts 87.50% <100.00%> (+84.64%) ⬆️
src/stores/executionStore.ts 92.32% <100.00%> (+1.85%) ⬆️
src/stores/modelStore.ts 94.25% <100.00%> (+1.14%) ⬆️
src/stores/nodeBookmarkStore.ts 100.00% <100.00%> (+23.91%) ⬆️
src/stores/nodeDefStore.ts 96.96% <100.00%> (+0.34%) ⬆️
src/stores/queueStore.ts 90.72% <ø> (+7.68%) ⬆️
src/stores/subgraphNavigationStore.ts 99.14% <100.00%> (+1.70%) ⬆️
src/utils/treeUtil.ts 100.00% <100.00%> (+7.59%) ⬆️
src/stores/subgraphStore.ts 87.38% <85.71%> (+4.88%) ⬆️

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

@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: 9

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/stores/executionStore.ts (1)

670-683: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Keep execution teardown scoped to the requested job.

Lines 678-684 still clear the current active execution unconditionally. If a late success/error arrives for an older queued job after a newer job has started, resetExecutionState(jobId) will delete the newer job from queuedJobs, null activeJobId, and clear its live progress instead of only cleaning up jobId.

Suggested fix
 function resetExecutionState(jobId: JobId) {
-  executionIdToLocatorCache.clear()
-  nodeProgressStates.value = {}
   const map = { ...nodeProgressStatesByJob.value }
   delete map[jobId]
   nodeProgressStatesByJob.value = map
   useJobPreviewStore().clearPreview(jobId)
   jobIdToWorkflow.delete(jobId)
-  if (activeJobId.value) {
-    delete queuedJobs.value[activeJobId.value]
-  }
-  activeJobId.value = null
-  _executingNodeProgress.value = null
-  executionErrorStore.clearPromptError()
+  delete queuedJobs.value[jobId]
+  if (activeJobId.value !== jobId) return
+  executionIdToLocatorCache.clear()
+  nodeProgressStates.value = {}
+  activeJobId.value = null
+  _executingNodeProgress.value = null
+  executionErrorStore.clearPromptError()
 }
🤖 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 `@src/stores/executionStore.ts` around lines 670 - 683, Keep execution teardown
scoped to the requested job: in resetExecutionState(jobId), avoid clearing
activeJobId, queuedJobs, and _executingNodeProgress unless they belong to the
same job being reset. Use the passed jobId together with activeJobId and
queuedJobs to conditionally remove only that job’s state, while preserving newer
active execution state started after it. Also ensure
executionErrorStore.clearPromptError and other cleanup remain limited to the
job-specific teardown path.
🤖 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 `@src/extensions/core/groupNode.test.ts`:
- Around line 61-75: The shared test fixture helper makeNodeDef currently uses
an unchecked cast to ComfyNodeDef, which bypasses compile-time drift checks.
Update the returned object in makeNodeDef to use satisfies ComfyNodeDef instead
of as ComfyNodeDef so the helper still accepts overrides while validating
required fields and nested shapes against the ComfyNodeDef contract.

In `@src/platform/workflow/templates/repositories/workflowTemplatesStore.test.ts`:
- Around line 231-239: The test for WorkflowTemplatesStore caching only checks
state and not the actual no-refetch behavior. Update the mocked API methods used
by useWorkflowTemplatesStore()/loadWorkflowTemplates() to vi.fn() spies, then
assert their call counts before and after the second load so the test verifies
the fetch is skipped. Keep the existing knownTemplateNames check if useful, but
make the primary assertion in this test that the second load does not invoke the
API again.

In `@src/stores/aboutPanelStore.test.ts`:
- Around line 7-11: The test fixture is duplicating the system info shape
locally, which can drift from the real contract used by the store. Replace the
local SystemInfo interface in aboutPanelStore.test.ts with the actual type
exported by the system-stats module that defines systemStats.system, and update
the fixture to use that imported type so schema changes fail at compile time.
Use the existing store/test symbols around systemStats and aboutPanelStore to
locate the fixture and remove the duplicate definition.

In `@src/stores/bootstrapStore.test.ts`:
- Around line 96-105: The test currently only checks isI18nReady, so it can pass
even if startStoreBootstrap keeps re-running authenticated-store loaders. Update
the bootstrapStore.test.ts case around useBootstrapStore and startStoreBootstrap
to assert the mocked authenticated loaders stay at a single call after the
second invocation, rather than relying on the i18n readiness flag. Use the
existing loadI18n/authenticated loader mocks to verify the guarded side effect
remains skipped on the second bootstrap.

In `@src/stores/subgraphNavigationStore.viewport.test.ts`:
- Around line 140-151: The tests around useSubgraphNavigationStore are mutating
the singleton app.canvas without guaranteed cleanup, which can leak undefined
into later cases. Update the affected tests that temporarily set app.canvas to
undefined so the original canvas is always restored in a finally block, or move
the cleanup into afterEach. Keep the restore logic close to the saveViewport and
restoreViewport test setups so failures in the assertions do not affect
subsequent tests.

In `@src/stores/subgraphStore.ts`:
- Around line 61-74: In validateSubgraph, guard against missing
definitions.subgraphs before using .some() in isSubgraphNode. Treat subgraphs
the same way load() does by defaulting to an empty array when it is absent, so
validateSubgraph returns the intended validation error instead of a raw
TypeError. Update the local destructuring around validState.definitions and keep
the single-node check intact.
- Around line 119-126: The metadata extraction in extractMetadataToWorkflowExtra
is using definitions.subgraphs[0], which can point to the wrong subgraph when
entries are nested or reordered. Update this lookup to resolve the subgraph by
the root node’s subgraph id, matching the approach already used in load() with
find((sg) => sg.id == st.nodes[0].type). Then copy and delete metadata from that
matched subgraph’s extra, not the first entry.

In `@src/utils/gridUtil.test.ts`:
- Around line 45-53: The `createGridStyle` test for `columns: 0` is inconsistent
with the invalid-columns behavior already covered by the `createGridStyle`
helper. Update the `columns: 0` expectation in `src/utils/gridUtil.test.ts` so
it matches the same fallback contract as the other invalid values (using the
`createGridStyle` result and warning), and avoid asserting `auto-fill` for a
value that should be treated as invalid.

---

Outside diff comments:
In `@src/stores/executionStore.ts`:
- Around line 670-683: Keep execution teardown scoped to the requested job: in
resetExecutionState(jobId), avoid clearing activeJobId, queuedJobs, and
_executingNodeProgress unless they belong to the same job being reset. Use the
passed jobId together with activeJobId and queuedJobs to conditionally remove
only that job’s state, while preserving newer active execution state started
after it. Also ensure executionErrorStore.clearPromptError and other cleanup
remain limited to the job-specific teardown path.
🪄 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: 3f830cc3-8e8e-4f91-954b-dc986ccaf08e

📥 Commits

Reviewing files that changed from the base of the PR and between 3377b8e and b1c775d.

📒 Files selected for processing (102)
  • .github/workflows/ci-tests-unit.yaml
  • .github/workflows/ci-website-e2e.yaml
  • browser_tests/tests/cloud.spec.ts
  • browser_tests/tests/execution.spec.ts
  • browser_tests/tests/extensionAPI.spec.ts
  • browser_tests/tests/graph.spec.ts
  • browser_tests/tests/nodeSearchBoxV2.spec.ts
  • browser_tests/tests/propertiesPanel/errorsTabMissingModels.spec.ts
  • browser_tests/tests/propertiesPanel/errorsTabMissingNodes.spec.ts
  • browser_tests/tests/queue/queueOverlay.spec.ts
  • browser_tests/tests/subgraph/subgraphSerialization.spec.ts
  • package.json
  • src/base/common/async.test.ts
  • src/base/credits/comfyCredits.test.ts
  • src/composables/canvas/useSelectionToolboxPosition.test.ts
  • src/composables/graph/useGroupMenuOptions.test.ts
  • src/composables/graph/useImageMenuOptions.test.ts
  • src/composables/graph/useMoreOptionsMenu.test.ts
  • src/composables/graph/useNodeCustomization.test.ts
  • src/composables/graph/useNodeMenuOptions.test.ts
  • src/composables/graph/useSelectionOperations.test.ts
  • src/composables/graph/useSelectionState.test.ts
  • src/composables/node/useNodeBadge.test.ts
  • src/composables/node/useNodePricing.test.ts
  • src/composables/useTreeExpansion.test.ts
  • src/extensions/core/groupNode.test.ts
  • src/platform/settings/composables/useSettingUI.test.ts
  • src/platform/workflow/management/stores/workflowLists.test.ts
  • src/platform/workflow/management/stores/workflowNodeLocator.test.ts
  • src/platform/workflow/management/stores/workflowTabs.test.ts
  • src/platform/workflow/templates/repositories/workflowTemplatesStore.test.ts
  • src/renderer/extensions/vueNodes/composables/usePartitionedBadges.test.ts
  • src/scripts/metadata/parser.test.ts
  • src/stores/aboutPanelStore.test.ts
  • src/stores/actionBarButtonStore.test.ts
  • src/stores/appModeStore.test.ts
  • src/stores/assetDownloadStore.test.ts
  • src/stores/assetExportStore.test.ts
  • src/stores/assetsStore.test.ts
  • src/stores/assetsStore.ts
  • src/stores/authStore.test.ts
  • src/stores/bootstrapStore.test.ts
  • src/stores/comfyRegistryStore.test.ts
  • src/stores/commandStore.test.ts
  • src/stores/dialogStore.test.ts
  • src/stores/domWidgetStore.test.ts
  • src/stores/electronDownloadStore.nonDesktop.test.ts
  • src/stores/electronDownloadStore.test.ts
  • src/stores/electronDownloadStore.ts
  • src/stores/executionError.test.ts
  • src/stores/executionErrorStore.test.ts
  • src/stores/executionInterrupt.test.ts
  • src/stores/executionLifecycle.test.ts
  • src/stores/executionNodeProgress.test.ts
  • src/stores/executionRunningState.test.ts
  • src/stores/executionStore.test.ts
  • src/stores/executionStore.ts
  • src/stores/executionWorkflowStatus.test.ts
  • src/stores/jobPreviewStore.test.ts
  • src/stores/menuItemStore.test.ts
  • src/stores/modelStore.test.ts
  • src/stores/modelStore.ts
  • src/stores/modelToNodeStore.test.ts
  • src/stores/nodeBookmarkStore.test.ts
  • src/stores/nodeBookmarkStore.ts
  • src/stores/nodeDefStore.test.ts
  • src/stores/nodeDefStore.ts
  • src/stores/nodeOutputStore.test.ts
  • src/stores/previewExposureStore.test.ts
  • src/stores/queueResultItem.test.ts
  • src/stores/queueStore.loadWorkflow.test.ts
  • src/stores/queueStore.test.ts
  • src/stores/queueStore.ts
  • src/stores/queueTaskItem.test.ts
  • src/stores/resultItemParsing.test.ts
  • src/stores/subgraphNavigationStore.navigateToHash.test.ts
  • src/stores/subgraphNavigationStore.ts
  • src/stores/subgraphNavigationStore.viewport.test.ts
  • src/stores/subgraphStore.test.ts
  • src/stores/subgraphStore.ts
  • src/stores/systemStatsStore.test.ts
  • src/stores/templateRankingStore.test.ts
  • src/stores/topbarBadgeStore.test.ts
  • src/stores/userFileStore.test.ts
  • src/stores/userStore.test.ts
  • src/stores/workspace/favoritedWidgetsStore.test.ts
  • src/stores/workspaceStore.test.ts
  • src/utils/fuseUtil.test.ts
  • src/utils/gridUtil.test.ts
  • src/utils/litegraphUtil.test.ts
  • src/utils/mapperUtil.test.ts
  • src/utils/mouseDownUtil.test.ts
  • src/utils/nodeTitleUtil.test.ts
  • src/utils/objectUrlUtil.test.ts
  • src/utils/queueDisplay.test.ts
  • src/utils/rafBatch.test.ts
  • src/utils/treeUtil.test.ts
  • src/utils/treeUtil.ts
  • src/utils/typeGuardUtil.test.ts
  • src/workbench/extensions/manager/composables/nodePack/usePackInstall.test.ts
  • src/workbench/extensions/manager/composables/useManagerDisplayPacks.test.ts
  • vite.config.mts
💤 Files with no reviewable changes (1)
  • src/stores/queueStore.ts

Comment thread src/composables/graph/useImageMenuOptions.test.ts
Comment thread src/extensions/core/groupNode.test.ts
Comment thread src/stores/aboutPanelStore.test.ts
Comment thread src/stores/bootstrapStore.test.ts
Comment thread src/stores/subgraphNavigationStore.viewport.test.ts
Comment thread src/stores/subgraphStore.ts
Comment thread src/stores/subgraphStore.ts
Comment thread src/utils/gridUtil.test.ts
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jun 29, 2026
@huang47

huang47 commented Jun 29, 2026

Copy link
Copy Markdown
Contributor Author

All 9 CodeRabbit threads addressed and resolved. This PR is the combined demo roll-up — the merged union of the 20 already-CodeRabbit-approved split PRs (#13249#13268). Each change here was reviewed and approved in its individual split PR, and all GitHub checks pass.

Disposition:

  • 7 test-file threads (clipboard restore, satisfies vs as, refetch assertion, local SystemInfo fixture, bootstrap guard assertion, app.canvas restore, gridUtil columns:0): test-isolation/typing nits or assertions of actual current behavior — out of scope for this roll-up, resolved with rationale.
  • 2 subgraphStore.ts threads (definitions.subgraphs guard; metadata vs subgraphs[0]): both Major, not Critical, and unreachable for valid blueprints given validateSubgraph constrains the root graph to a single subgraph node. Resolved with rationale.

No code changes were required.

@huang47

huang47 commented Jun 29, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

huang47 added 21 commits June 29, 2026 15:22
Add unit tests for fuseUtil, gridUtil, mouseDownUtil, nodeTitleUtil,
objectUrlUtil, queueDisplay, rafBatch, typeGuardUtil and base async/credits
helpers.
Add unit branch-coverage for useSelectionOperations, useSelectionState,
useNodeCustomization, useNodeMenuOptions, useGroupMenuOptions,
useMoreOptionsMenu graph composables and useNodePricing.
Add unit branch-coverage for scripts/metadata/parser dispatcher,
usePackInstall and useManagerDisplayPacks.
Add unit branch-coverage for aboutPanelStore, nodeBookmarkStore, queueStore
(incl. loadWorkflow) and execution-error routing in executionStore.
Add the test:browser:critical script (chromium project, @critical grep) and
tag stable graph, execution, node-search, queue, missing-deps, subgraph and
extension-API journeys @critical.
Add the test:browser:cloud-critical script (cloud project, @critical grep) and
tag stable cloud auth-redirect journeys @critical.
Guard the website e2e report/deploy step so it only runs for non-fork PRs,
avoiding failures when fork PRs lack deploy secrets.
Replace split('/').pop() ?? '' with slice(lastIndexOf('/') + 1) in modelStore
and nodeBookmarkStore. Equivalent across no-slash/trailing-slash/empty inputs and
drops the nullish fallback branch.
- queueStore: drop unreachable !outputs guards (outputs always defaults to {})
- treeUtil: clone empty children arrays consistently
- electronDownloadStore: early-return when the download is new
- nodeDefStore: narrow _migrateDefaultInput so input is always defined
- apiKeyAuthStore: route the no-user case through reportError

Includes the treeUtil and apiKeyAuthStore tests that pin the new behavior.
- guard classifyCloudValidationError against a missing exception_message
- make resetExecutionState take an explicit jobId
- simplify activeJob lookup and stale-entry eviction casts

Includes the executionStore suite that exercises these paths.
validateSubgraph returns the validated workflow JSON and passes it to
extractMetadataToWorkflowExtra, removing redundant activeState re-checks and
narrowing the subgraph-node type.
@huang47 huang47 force-pushed the shihchi/coverage-all-combined-demo branch from b1c775d to 833b0be Compare June 30, 2026 06:01
@huang47 huang47 changed the base branch from main to codex/coverage-gate-infra June 30, 2026 06:02
@huang47 huang47 changed the title test: DO NOT MERGE — combined demo of coverage split (#13249–#13268) test: DO NOT MERGE, combined demo of coverage split (#13250-#13268) Jun 30, 2026
@huang47

huang47 commented Jun 30, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

Created by Codex

@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

@huang47 Hopping on it — I’ll review the changes. A quick bunny run before the code is done.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@huang47

huang47 commented Jun 30, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai approve

Created by Codex

@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Rate Limit Exceeded

@huang47 have exceeded the limit for the number of chat messages per hour. Please wait 39 minutes and 49 seconds before sending another message.

@huang47

huang47 commented Jun 30, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai approve

Created by Codex

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

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

@huang47 Approving the changes.

✅ Action performed

Comments resolved and changes approved.

@huang47 huang47 deleted the branch Comfy-Org:main June 30, 2026 22:17
@huang47 huang47 closed this Jun 30, 2026
@github-actions github-actions Bot locked and limited conversation to collaborators Jun 30, 2026
@huang47 huang47 reopened this Jun 30, 2026
@huang47 huang47 changed the base branch from codex/coverage-gate-infra to main June 30, 2026 22:23
@huang47 huang47 dismissed coderabbitai[bot]’s stale review June 30, 2026 22:23

The base branch was changed.

@huang47

huang47 commented Jul 1, 2026

Copy link
Copy Markdown
Contributor Author

Replaced by #13351 so the draft PR uses an origin-backed branch.

@huang47 huang47 closed this Jul 1, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant