test: DO NOT MERGE, combined demo of coverage split (#13250-#13268)#13273
test: DO NOT MERGE, combined demo of coverage split (#13250-#13268)#13273huang47 wants to merge 47 commits into
Conversation
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.
🎨 Storybook: 🚧 Building...🎭 Playwright: ✅ 1691 passed, 0 failed · 1 flaky📊 Browser Reports
📦 Bundle Size
⚡ Performance Report
Absolute values
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
}
]
} |
📝 WalkthroughWalkthroughIntroduces a critical test coverage enforcement system: a new CI step runs ChangesCritical Coverage Initiative
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 inconclusive)
✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
Codecov Report❌ Patch coverage is
@@ 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
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 55 files with indirect coverage changes 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
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 winKeep 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 fromqueuedJobs, nullactiveJobId, and clear its live progress instead of only cleaning upjobId.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
📒 Files selected for processing (102)
.github/workflows/ci-tests-unit.yaml.github/workflows/ci-website-e2e.yamlbrowser_tests/tests/cloud.spec.tsbrowser_tests/tests/execution.spec.tsbrowser_tests/tests/extensionAPI.spec.tsbrowser_tests/tests/graph.spec.tsbrowser_tests/tests/nodeSearchBoxV2.spec.tsbrowser_tests/tests/propertiesPanel/errorsTabMissingModels.spec.tsbrowser_tests/tests/propertiesPanel/errorsTabMissingNodes.spec.tsbrowser_tests/tests/queue/queueOverlay.spec.tsbrowser_tests/tests/subgraph/subgraphSerialization.spec.tspackage.jsonsrc/base/common/async.test.tssrc/base/credits/comfyCredits.test.tssrc/composables/canvas/useSelectionToolboxPosition.test.tssrc/composables/graph/useGroupMenuOptions.test.tssrc/composables/graph/useImageMenuOptions.test.tssrc/composables/graph/useMoreOptionsMenu.test.tssrc/composables/graph/useNodeCustomization.test.tssrc/composables/graph/useNodeMenuOptions.test.tssrc/composables/graph/useSelectionOperations.test.tssrc/composables/graph/useSelectionState.test.tssrc/composables/node/useNodeBadge.test.tssrc/composables/node/useNodePricing.test.tssrc/composables/useTreeExpansion.test.tssrc/extensions/core/groupNode.test.tssrc/platform/settings/composables/useSettingUI.test.tssrc/platform/workflow/management/stores/workflowLists.test.tssrc/platform/workflow/management/stores/workflowNodeLocator.test.tssrc/platform/workflow/management/stores/workflowTabs.test.tssrc/platform/workflow/templates/repositories/workflowTemplatesStore.test.tssrc/renderer/extensions/vueNodes/composables/usePartitionedBadges.test.tssrc/scripts/metadata/parser.test.tssrc/stores/aboutPanelStore.test.tssrc/stores/actionBarButtonStore.test.tssrc/stores/appModeStore.test.tssrc/stores/assetDownloadStore.test.tssrc/stores/assetExportStore.test.tssrc/stores/assetsStore.test.tssrc/stores/assetsStore.tssrc/stores/authStore.test.tssrc/stores/bootstrapStore.test.tssrc/stores/comfyRegistryStore.test.tssrc/stores/commandStore.test.tssrc/stores/dialogStore.test.tssrc/stores/domWidgetStore.test.tssrc/stores/electronDownloadStore.nonDesktop.test.tssrc/stores/electronDownloadStore.test.tssrc/stores/electronDownloadStore.tssrc/stores/executionError.test.tssrc/stores/executionErrorStore.test.tssrc/stores/executionInterrupt.test.tssrc/stores/executionLifecycle.test.tssrc/stores/executionNodeProgress.test.tssrc/stores/executionRunningState.test.tssrc/stores/executionStore.test.tssrc/stores/executionStore.tssrc/stores/executionWorkflowStatus.test.tssrc/stores/jobPreviewStore.test.tssrc/stores/menuItemStore.test.tssrc/stores/modelStore.test.tssrc/stores/modelStore.tssrc/stores/modelToNodeStore.test.tssrc/stores/nodeBookmarkStore.test.tssrc/stores/nodeBookmarkStore.tssrc/stores/nodeDefStore.test.tssrc/stores/nodeDefStore.tssrc/stores/nodeOutputStore.test.tssrc/stores/previewExposureStore.test.tssrc/stores/queueResultItem.test.tssrc/stores/queueStore.loadWorkflow.test.tssrc/stores/queueStore.test.tssrc/stores/queueStore.tssrc/stores/queueTaskItem.test.tssrc/stores/resultItemParsing.test.tssrc/stores/subgraphNavigationStore.navigateToHash.test.tssrc/stores/subgraphNavigationStore.tssrc/stores/subgraphNavigationStore.viewport.test.tssrc/stores/subgraphStore.test.tssrc/stores/subgraphStore.tssrc/stores/systemStatsStore.test.tssrc/stores/templateRankingStore.test.tssrc/stores/topbarBadgeStore.test.tssrc/stores/userFileStore.test.tssrc/stores/userStore.test.tssrc/stores/workspace/favoritedWidgetsStore.test.tssrc/stores/workspaceStore.test.tssrc/utils/fuseUtil.test.tssrc/utils/gridUtil.test.tssrc/utils/litegraphUtil.test.tssrc/utils/mapperUtil.test.tssrc/utils/mouseDownUtil.test.tssrc/utils/nodeTitleUtil.test.tssrc/utils/objectUrlUtil.test.tssrc/utils/queueDisplay.test.tssrc/utils/rafBatch.test.tssrc/utils/treeUtil.test.tssrc/utils/treeUtil.tssrc/utils/typeGuardUtil.test.tssrc/workbench/extensions/manager/composables/nodePack/usePackInstall.test.tssrc/workbench/extensions/manager/composables/useManagerDisplayPacks.test.tsvite.config.mts
💤 Files with no reviewable changes (1)
- src/stores/queueStore.ts
|
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:
No code changes were required. |
|
@coderabbitai review |
✅ Action performedReview finished.
|
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.
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.
b1c775d to
833b0be
Compare
…ion' into HEAD # Conflicts: # src/stores/nodeBookmarkStore.test.ts
…eanups' into HEAD # Conflicts: # src/stores/electronDownloadStore.test.ts
…ettle' into HEAD # Conflicts: # src/stores/assetsStore.test.ts
…anvas-guard' into HEAD
|
@coderabbitai review Created by Codex |
|
✅ Action performedReview finished.
|
|
@coderabbitai approve Created by Codex |
Rate Limit Exceeded
|
…nderer-utils' into HEAD
…' into HEAD # Conflicts: # src/stores/subgraphStore.test.ts
|
@coderabbitai approve Created by Codex |
|
✅ Action performedComments resolved and changes approved. |
|
Replaced by #13351 so the draft PR uses an origin-backed branch. |
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-infrabaseline. Real review happens in the individual scoped PRs.What's in here
Review Focus