Skip to content

refactor: centralize remaining ECS entity data - #15544

Draft
DrJKL wants to merge 23 commits into
test/ecs-migration-behavior-coveragefrom
docs/ecs-component-entity-gap-audit
Draft

refactor: centralize remaining ECS entity data#15544
DrJKL wants to merge 23 commits into
test/ecs-migration-behavior-coveragefrom
docs/ecs-component-entity-gap-audit

Conversation

@DrJKL

@DrJKL DrJKL commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Summary

Centralize the remaining component and entity data identified by the ECS audit while preserving legacy extension-facing projections.

Changes

  • What: Moves the 19 audited concerns into focused store authorities and pure projections, including graph definitions and metadata, node geometry and slots, link and widget state, lifecycle cleanup, extension persistence, invalidation, execution order, and store-driven serialization.
  • What: Adds regression and parity coverage for each migration step and records every concern and commit in the component/entity data audit.

Review Focus

Review the commits in sequence; each audit concern is isolated in its own commit. Pay particular attention to compatibility projections, cleanup boundaries, extension payload isolation, and differential serialization parity.

Verification: full Vitest suite (16,718 passed, 8 skipped);
! comfy(no-redundant-vitest-cleanup): vi.unstubAllGlobals() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/vitestSetup.test.ts:13:5]
12 | afterEach(() => {
13 | vi.unstubAllGlobals()
: ^^^^^^^^^^^^^^^^^^^^^
14 | })
`----

! comfy(no-redundant-vitest-cleanup): vi.resetAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/renderer/extensions/vueNodes/composables/useNodePointerInteractions.test.ts:120:5]
119 | beforeEach(async () => {
120 | vi.resetAllMocks()
: ^^^^^^^^^^^^^^^^^^
121 | setActivePinia(createTestingPinia())
`----

! comfy(no-module-scope-vitest-mocks): Install vi.spyOn() in beforeEach or a test because automatic Vitest cleanup removes earlier mock installations before assertions run.
,-[src/platform/workflow/core/services/workflowService.insertWorkflow.test.ts:143:3]
142 | } = HTMLCanvasElement.prototype
143 | vi.spyOn(canvasPrototype, 'getContext').mockReturnValue(
: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
144 | createMockCanvasRenderingContext2D()
`----

! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/platform/workflow/core/services/workflowService.insertWorkflow.test.ts:150:3]
149 | LiteGraph.unregisterNodeType(PROBE_NODE_TYPE)
150 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
151 | })
`----

! comfy(no-redundant-vitest-cleanup): vi.unstubAllGlobals() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/renderer/extensions/layerEditor/composables/useLayerEditorSession.test.ts:152:3]
151 | afterEach(() => {
152 | vi.unstubAllGlobals()
: ^^^^^^^^^^^^^^^^^^^^^
153 | })
`----

! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/renderer/extensions/vueNodes/components/LGraphNode.subgraph.test.ts:82:5]
81 | rootGraph = new LGraph()
82 | vi.clearAllMocks()
: ^^^^^^^^^^^^^^^^^^
83 | })
`----

! oxc(erasing-op): Unexpected erasing operation. This expression will always evaluate to zero.
,-[src/renderer/extensions/layerEditor/engine/editor/selectionMath.test.ts:222:19]
221 | expect(m.data[0]).toBe(1)
222 | expect(m.data[0 * 5 + 4]).toBe(1)
: ^^^^^
223 | expect(m.data[0 * 5 + 2]).toBe(0)
`----
help: This is most likely not the intended outcome. Consider removing the operation, or directly assigning zero to the variable

! oxc(erasing-op): Unexpected erasing operation. This expression will always evaluate to zero.
,-[src/renderer/extensions/layerEditor/engine/editor/selectionMath.test.ts:223:19]
222 | expect(m.data[0 * 5 + 4]).toBe(1)
223 | expect(m.data[0 * 5 + 2]).toBe(0)
: ^^^^^
224 | })
`----
help: This is most likely not the intended outcome. Consider removing the operation, or directly assigning zero to the variable

! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/renderer/extensions/vueNodes/layout/ensureCorrectLayoutScale.test.ts:74:5]
73 | beforeEach(() => {
74 | vi.clearAllMocks()
: ^^^^^^^^^^^^^^^^^^
75 | setActivePinia(createTestingPinia({ stubActions: false }))
`----

! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/stores/rerouteStore.test.ts:56:5]
55 | afterEach(() => {
56 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
57 | })
`----

! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/renderer/extensions/minimap/composables/useMinimap.test.ts:298:5]
297 | beforeEach(() => {
298 | vi.clearAllMocks()
: ^^^^^^^^^^^^^^^^^^
299 | setActivePinia(createTestingPinia({ stubActions: false }))
`----

! comfy(no-redundant-vitest-cleanup): vi.resetAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/components/rightSidePanel/parameters/WidgetActions.test.ts:93:5]
92 | setActivePinia(createTestingPinia({ stubActions: false }))
93 | vi.resetAllMocks()
: ^^^^^^^^^^^^^^^^^^
94 | mockIsFavorited.mockReturnValue(false)
`----

! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/renderer/extensions/vueNodes/layout/nodeSizeReflow.test.ts:38:5]
37 | afterEach(() => {
38 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
39 | })
`----

! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/renderer/extensions/minimap/minimapCanvasRenderer.test.ts:48:5]
47 | beforeEach(() => {
48 | vi.clearAllMocks()
: ^^^^^^^^^^^^^^^^^^
49 | setActivePinia(createTestingPinia({ stubActions: false }))
`----

! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/stores/linkStore.test.ts:51:5]
50 | afterEach(() => {
51 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
52 | })
`----

! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/lib/litegraph/src/LGraphCanvas.drawConnections.test.ts:79:5]
78 | beforeEach(() => {
79 | vi.clearAllMocks()
: ^^^^^^^^^^^^^^^^^^
80 | setActivePinia(createTestingPinia({ stubActions: false }))
`----

! comfy(no-module-scope-vitest-mocks): Install vi.spyOn() in beforeEach or a test because automatic Vitest cleanup removes earlier mock installations before assertions run.
,-[src/base/common/downloadUtil.test.ts:29:26]
28 | // Global stubs
29 | ,-> let createObjectURLSpy = vi
30 | -> .spyOn(URL, 'createObjectURL') 31 | .mockReturnValue('blob:mock-url') ----

! comfy(no-module-scope-vitest-mocks): Install vi.spyOn() in beforeEach or a test because automatic Vitest cleanup removes earlier mock installations before assertions run.
,-[src/base/common/downloadUtil.test.ts:32:26]
31 | .mockReturnValue('blob:mock-url')
32 | ,-> let revokeObjectURLSpy = vi
33 | -> .spyOn(URL, 'revokeObjectURL') 34 | .mockImplementation(() => {}) ----

! comfy(no-redundant-vitest-cleanup): vi.unstubAllGlobals() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/platform/cloud/onboarding/CloudLoginView.test.ts:70:3]
69 | isEmbeddedWebView.value = false
70 | vi.unstubAllGlobals()
: ^^^^^^^^^^^^^^^^^^^^^
71 | })
`----

! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/components/rightSidePanel/RightSidePanel.test.ts:121:5]
120 | beforeEach(() => {
121 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
122 | mockApp.rootGraph = null
`----

! comfy(no-redundant-vitest-cleanup): vi.unstubAllGlobals() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/utils/videoMetadataUtil.test.ts:107:5]
106 | afterEach(() => {
107 | vi.unstubAllGlobals()
: ^^^^^^^^^^^^^^^^^^^^^
108 | })
`----

! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/platform/assets/utils/assetUrlUtil.test.ts:27:20]
26 | describe('getAssetSubfolder', () => {
27 | beforeEach(() => vi.clearAllMocks())
: ^^^^^^^^^^^^^^^^^^
28 |
`----

! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/platform/assets/utils/assetUrlUtil.test.ts:57:20]
56 | describe('getAssetUrl', () => {
57 | beforeEach(() => vi.clearAllMocks())
: ^^^^^^^^^^^^^^^^^^
58 |
`----

! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/utils/sessionFeatureFlagOverride.test.ts:34:5]
33 | afterEach(() => {
34 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
35 | })
`----

! comfy(no-redundant-vitest-cleanup): vi.resetAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/composables/useCopySystemInfo.test.ts:69:5]
68 | beforeEach(() => {
69 | vi.resetAllMocks()
: ^^^^^^^^^^^^^^^^^^
70 | distributionFlags.isCloud = false
`----

! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/lib/litegraph/src/LLink.store.test.ts:23:19]
22 | beforeEach(() => setActivePinia(createTestingPinia({ stubActions: false })))
23 | afterEach(() => vi.restoreAllMocks())
: ^^^^^^^^^^^^^^^^^^^^
24 |
`----

! comfy(no-redundant-vitest-cleanup): vi.unstubAllEnvs() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/schemas/nodeDef/inputSpecUtil.test.ts:9:5]
8 | afterEach(() => {
9 | vi.unstubAllEnvs()
: ^^^^^^^^^^^^^^^^^^
10 | })
`----

! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/platform/telemetry/reportError.test.ts:31:5]
30 | beforeEach(() => {
31 | vi.clearAllMocks()
: ^^^^^^^^^^^^^^^^^^
32 | sentryLive(true)
`----

! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/lib/litegraph/src/LGraphNode.test.ts:802:5]
801 | afterEach(() => {
802 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
803 | })
`----

! typescript(no-array-delete): Using the delete operator with an array expression is unsafe.
,-[src/lib/litegraph/src/infrastructure/createMutationView.test.ts:77:5]
76 | expect(() => view.mutateThenThrow()).toThrow('failed mutation')
77 | delete view[1]
: ^^^^^^ ^^|^
: | -- This expression evaluates to an array. 78 | Object.defineProperty(view, '0', { value: 4 }) ----

Found 30 warnings and 0 errors.
Finished in 10.9s on 3471 files with 177 rules using 16 threads.

! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/scripts/changeTracker.test.ts:231:5]
230 | afterEach(() => {
231 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
232 | vi.clearAllTimers()
`----

! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/scripts/api.sessionOverride.test.ts:37:5]
36 | api.serverFeatureFlags.value = {}
37 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
38 | })
`----

! comfy(no-module-scope-vitest-mocks): Install vi.stubGlobal() in beforeEach or a test because automatic Vitest cleanup removes earlier mock installations before assertions run.
,-[src/scripts/ui.storageResilience.test.ts:22:1]
21 | // so the module-scope new ComfyApp() restores against it.
22 | vi.stubGlobal('localStorage', {} as Storage)
: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
23 |
`----

! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/scripts/metadata/readFile.test.ts:10:19]
9 | describe('readFileAsArrayBuffer', () => {
10 | afterEach(() => vi.restoreAllMocks())
: ^^^^^^^^^^^^^^^^^^^^
11 |
`----

! comfy(no-redundant-vitest-cleanup): vi.unstubAllGlobals() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[packages/shared-frontend-utils/src/networkUtil.test.ts:27:3]
26 | afterEach(() => {
27 | vi.unstubAllGlobals()
: ^^^^^^^^^^^^^^^^^^^^^
28 | vi.useRealTimers()
`----

Found 5 warnings and 0 errors.
Finished in 540ms on 4398 files with 2 rules using 16 threads.

/home/user/workspace/repo/src/components/breadcrumb/SubgraphBreadcrumb.vue
142:16 warning Do not inspect the DOM inside a computed. Derive from a store instead. See docs/guidance/state-and-effects.md no-restricted-syntax

/home/user/workspace/repo/src/components/maskeditor/BrushCursor.vue
60:22 warning Do not measure the DOM inside a computed - every recompute becomes a layout read. Derive from a store instead. See docs/guidance/state-and-effects.md no-restricted-syntax
71:22 warning Do not measure the DOM inside a computed - every recompute becomes a layout read. Derive from a store instead. See docs/guidance/state-and-effects.md no-restricted-syntax

/home/user/workspace/repo/src/components/topbar/WorkflowTabs.vue
218:6 warning Do not inspect the DOM inside a computed. Derive from a store instead. See docs/guidance/state-and-effects.md no-restricted-syntax

✖ 4 problems (0 errors, 4 warnings); ; Checking formatting...

All matched files use the correct format.
Finished in 2977ms on 4771 files using 16 threads.; .

Child of #15536.

@coderabbitai

coderabbitai Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3045db5a-f68a-4540-8709-3d84aa2f1137

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actions

github-actions Bot commented Aug 21, 2026

Copy link
Copy Markdown

🎭 Playwright: ❌ 1760 passed, 43 failed · 2 flaky

❌ Failed Tests

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

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 08/21/2026, 08:57:10 AM UTC

Links

📦 Bundle Size

⏳ Size data collection in progress…

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.3 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 64.3 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.3 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 61.7 MB heap
large-graph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.7 MB heap
large-graph-pan: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 4ms TBT · 63.0 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 5ms TBT · 86.6 MB heap
legacy-node-drag: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 14ms TBT · 89.4 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.7 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 63.2 MB heap
subgraph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 57.3 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.2 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 150ms TBT · 100.8 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 86.3 MB heap
vue-large-graph-idle: · 57.1 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 169.3 MB heap
vue-large-graph-pan: · 56.3 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 146ms TBT · 168.5 MB heap
workflow-execution: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.9 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 7ms
canvas-idle: layout count 0
canvas-idle: style recalc count 9
canvas-idle: task duration 484ms
canvas-idle: script duration 8ms
canvas-idle: TBT 0ms
canvas-idle: heap used 54.3 MB
canvas-idle: DOM nodes -280
canvas-idle: event listeners -155
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 43ms
canvas-mouse-sweep: layout count 12
canvas-mouse-sweep: style recalc count 78
canvas-mouse-sweep: task duration 1383ms
canvas-mouse-sweep: script duration 210ms
canvas-mouse-sweep: TBT 0ms
canvas-mouse-sweep: heap used 64.3 MB
canvas-mouse-sweep: DOM nodes -282
canvas-mouse-sweep: event listeners -170
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 16ms
canvas-zoom-sweep: layout count 6
canvas-zoom-sweep: style recalc count 32
canvas-zoom-sweep: task duration 343ms
canvas-zoom-sweep: script duration 11ms
canvas-zoom-sweep: TBT 0ms
canvas-zoom-sweep: heap used 71.3 MB
canvas-zoom-sweep: DOM nodes 76
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 7ms
dom-widget-clipping: layout count 0
dom-widget-clipping: style recalc count 10
dom-widget-clipping: task duration 438ms
dom-widget-clipping: script duration 39ms
dom-widget-clipping: TBT 0ms
dom-widget-clipping: heap used 61.7 MB
dom-widget-clipping: DOM nodes 16
dom-widget-clipping: event listeners 1
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 2ms
large-graph-idle: layout count 0
large-graph-idle: style recalc count 2
large-graph-idle: task duration 544ms
large-graph-idle: script duration 37ms
large-graph-idle: TBT 0ms
large-graph-idle: heap used 69.7 MB
large-graph-idle: DOM nodes -275
large-graph-idle: event listeners -168
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 8ms
large-graph-pan: layout count 0
large-graph-pan: style recalc count 63
large-graph-pan: task duration 3127ms
large-graph-pan: script duration 1238ms
large-graph-pan: TBT 4ms
large-graph-pan: heap used 63.0 MB
large-graph-pan: DOM nodes -276
large-graph-pan: event listeners -164
large-graph-zoom: avg frame time 17ms
large-graph-zoom: p95 frame time 17ms
large-graph-zoom: layout duration 7ms
large-graph-zoom: style recalc duration 11ms
large-graph-zoom: layout count 60
large-graph-zoom: style recalc count 66
large-graph-zoom: task duration 2851ms
large-graph-zoom: script duration 1069ms
large-graph-zoom: TBT 5ms
large-graph-zoom: heap used 86.6 MB
large-graph-zoom: DOM nodes 24
large-graph-zoom: event listeners 12
legacy-node-drag: avg frame time 17ms
legacy-node-drag: p95 frame time 17ms
legacy-node-drag: layout duration 0ms
legacy-node-drag: style recalc duration 5ms
legacy-node-drag: layout count 0
legacy-node-drag: style recalc count 41
legacy-node-drag: task duration 2269ms
legacy-node-drag: script duration 218ms
legacy-node-drag: TBT 14ms
legacy-node-drag: heap used 89.4 MB
legacy-node-drag: DOM nodes 0
legacy-node-drag: event listeners 188
minimap-idle: avg frame time 17ms
minimap-idle: p95 frame time 17ms
minimap-idle: layout duration 0ms
minimap-idle: style recalc duration 2ms
minimap-idle: layout count 0
minimap-idle: style recalc count 2
minimap-idle: task duration 537ms
minimap-idle: script duration 35ms
minimap-idle: TBT 0ms
minimap-idle: heap used 69.7 MB
minimap-idle: DOM nodes -273
minimap-idle: event listeners -153
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 10ms
subgraph-dom-widget-clipping: layout count 0
subgraph-dom-widget-clipping: style recalc count 46
subgraph-dom-widget-clipping: task duration 518ms
subgraph-dom-widget-clipping: script duration 147ms
subgraph-dom-widget-clipping: TBT 0ms
subgraph-dom-widget-clipping: heap used 63.2 MB
subgraph-dom-widget-clipping: DOM nodes 17
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 8ms
subgraph-idle: layout count 0
subgraph-idle: style recalc count 10
subgraph-idle: task duration 471ms
subgraph-idle: script duration 7ms
subgraph-idle: TBT 0ms
subgraph-idle: heap used 57.3 MB
subgraph-idle: DOM nodes -296
subgraph-idle: event listeners -200
subgraph-mouse-sweep: avg frame time 17ms
subgraph-mouse-sweep: p95 frame time 17ms
subgraph-mouse-sweep: layout duration 4ms
subgraph-mouse-sweep: style recalc duration 36ms
subgraph-mouse-sweep: layout count 16
subgraph-mouse-sweep: style recalc count 77
subgraph-mouse-sweep: task duration 1112ms
subgraph-mouse-sweep: script duration 122ms
subgraph-mouse-sweep: TBT 0ms
subgraph-mouse-sweep: heap used 67.2 MB
subgraph-mouse-sweep: DOM nodes -295
subgraph-mouse-sweep: event listeners -217
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 32ms
subgraph-transition-enter: layout count 14
subgraph-transition-enter: style recalc count 19
subgraph-transition-enter: task duration 899ms
subgraph-transition-enter: script duration 37ms
subgraph-transition-enter: TBT 150ms
subgraph-transition-enter: heap used 100.8 MB
subgraph-transition-enter: DOM nodes 13671
subgraph-transition-enter: event listeners 2381
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 34ms
viewport-pan-sweep: layout count 0
viewport-pan-sweep: style recalc count 245
viewport-pan-sweep: task duration 10830ms
viewport-pan-sweep: script duration 4096ms
viewport-pan-sweep: TBT 0ms
viewport-pan-sweep: heap used 86.3 MB
viewport-pan-sweep: DOM nodes -272
viewport-pan-sweep: event listeners -153
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 16562ms
vue-large-graph-idle: script duration 327ms
vue-large-graph-idle: TBT 0ms
vue-large-graph-idle: heap used 169.3 MB
vue-large-graph-idle: DOM nodes -6548
vue-large-graph-idle: event listeners -7472
vue-large-graph-pan: avg frame time 18ms
vue-large-graph-pan: p95 frame time 17ms
vue-large-graph-pan: layout duration 0ms
vue-large-graph-pan: style recalc duration 18ms
vue-large-graph-pan: layout count 0
vue-large-graph-pan: style recalc count 175
vue-large-graph-pan: task duration 20971ms
vue-large-graph-pan: script duration 1011ms
vue-large-graph-pan: TBT 146ms
vue-large-graph-pan: heap used 168.5 MB
vue-large-graph-pan: DOM nodes -6548
vue-large-graph-pan: event listeners -7464
workflow-execution: avg frame time 17ms
workflow-execution: p95 frame time 17ms
workflow-execution: layout duration 1ms
workflow-execution: style recalc duration 25ms
workflow-execution: layout count 4
workflow-execution: style recalc count 19
workflow-execution: task duration 142ms
workflow-execution: script duration 8ms
workflow-execution: TBT 0ms
workflow-execution: heap used 69.9 MB
workflow-execution: DOM nodes 136
workflow-execution: event listeners 98
Raw data
{
  "timestamp": "2026-08-21T09:08:54.847Z",
  "gitSha": "b9cc3058c8b7cebe59b85ef3afbf6b3a3f7d2949",
  "branch": "docs/ecs-component-entity-gap-audit",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2043.7469999999962,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.652000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 488.089,
      "heapDeltaBytes": -15124652,
      "heapUsedBytes": 55532716,
      "domNodes": -279,
      "jsHeapTotalBytes": 5234688,
      "scriptDurationMs": 7.542999999999999,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-idle",
      "durationMs": 2038.157999999953,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 6.829,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 480.02,
      "heapDeltaBytes": -11871368,
      "heapUsedBytes": 58410932,
      "domNodes": -280,
      "jsHeapTotalBytes": 4972544,
      "scriptDurationMs": 7.759,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2388.684000000012,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 42.077000000000005,
      "layouts": 12,
      "layoutDurationMs": 4.013,
      "taskDurationMs": 1498.0430000000001,
      "heapDeltaBytes": 4082556,
      "heapUsedBytes": 74835504,
      "domNodes": -281,
      "jsHeapTotalBytes": 5758976,
      "scriptDurationMs": 230.94500000000002,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2244.034000000056,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 43.12,
      "layouts": 12,
      "layoutDurationMs": 3.327,
      "taskDurationMs": 1268.41,
      "heapDeltaBytes": -9993016,
      "heapUsedBytes": 59928876,
      "domNodes": -282,
      "jsHeapTotalBytes": 6545408,
      "scriptDurationMs": 188.10200000000003,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1739.734999999996,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 16.028000000000002,
      "layouts": 6,
      "layoutDurationMs": 0.605,
      "taskDurationMs": 340.323,
      "heapDeltaBytes": 4258176,
      "heapUsedBytes": 74963208,
      "domNodes": 77,
      "jsHeapTotalBytes": 4980736,
      "scriptDurationMs": 10.197000000000001,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1743.5460000000376,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 15.285,
      "layouts": 6,
      "layoutDurationMs": 0.5099999999999999,
      "taskDurationMs": 345.773,
      "heapDeltaBytes": 3966276,
      "heapUsedBytes": 74586668,
      "domNodes": 75,
      "jsHeapTotalBytes": 5505024,
      "scriptDurationMs": 11.588000000000001,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 706.6950000000247,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 6.156,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 435.046,
      "heapDeltaBytes": -5909228,
      "heapUsedBytes": 64704984,
      "domNodes": 16,
      "jsHeapTotalBytes": 6815744,
      "scriptDurationMs": 38.627,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 720.890000000054,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.219000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 440.82200000000006,
      "heapDeltaBytes": -5739444,
      "heapUsedBytes": 64749832,
      "domNodes": 16,
      "jsHeapTotalBytes": 6553600,
      "scriptDurationMs": 38.644999999999996,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2036.8040000000178,
      "styleRecalcs": 1,
      "styleRecalcDurationMs": 1.007000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 521.6629999999999,
      "heapDeltaBytes": -10335376,
      "heapUsedBytes": 73430576,
      "domNodes": -275,
      "jsHeapTotalBytes": -1908736,
      "scriptDurationMs": 34.25,
      "eventListeners": -183,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2037.9840000000513,
      "styleRecalcs": 3,
      "styleRecalcDurationMs": 3.1319999999999992,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 565.3969999999999,
      "heapDeltaBytes": -12100744,
      "heapUsedBytes": 72752336,
      "domNodes": -275,
      "jsHeapTotalBytes": -1384448,
      "scriptDurationMs": 40.06,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 4240.336999999954,
      "styleRecalcs": 63,
      "styleRecalcDurationMs": 8.741,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3152.605,
      "heapDeltaBytes": -18999668,
      "heapUsedBytes": 66218828,
      "domNodes": -276,
      "jsHeapTotalBytes": 3072000,
      "scriptDurationMs": 1238.875,
      "eventListeners": -179,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 4200.380999999993,
      "styleRecalcs": 62,
      "styleRecalcDurationMs": 8.098999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3101.665,
      "heapDeltaBytes": 1249488,
      "heapUsedBytes": 65945736,
      "domNodes": -275,
      "jsHeapTotalBytes": 4980736,
      "scriptDurationMs": 1237.832,
      "eventListeners": -149,
      "totalBlockingTimeMs": 7,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 4630.583999999999,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 11.130999999999998,
      "layouts": 60,
      "layoutDurationMs": 7.268999999999999,
      "taskDurationMs": 2831.861,
      "heapDeltaBytes": 24534204,
      "heapUsedBytes": 91420088,
      "domNodes": 24,
      "jsHeapTotalBytes": 3407872,
      "scriptDurationMs": 1058.388,
      "eventListeners": 12,
      "totalBlockingTimeMs": 5,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 4720.65299999997,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 11.380999999999998,
      "layouts": 60,
      "layoutDurationMs": 7.454999999999999,
      "taskDurationMs": 2870.08,
      "heapDeltaBytes": 19602308,
      "heapUsedBytes": 90261696,
      "domNodes": 24,
      "jsHeapTotalBytes": 2883584,
      "scriptDurationMs": 1080.349,
      "eventListeners": 12,
      "totalBlockingTimeMs": 4,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 3291.7150000000106,
      "styleRecalcs": 41,
      "styleRecalcDurationMs": 5.368000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2273.7180000000003,
      "heapDeltaBytes": 24919552,
      "heapUsedBytes": 93720640,
      "domNodes": 0,
      "jsHeapTotalBytes": 1634304,
      "scriptDurationMs": 224.559,
      "eventListeners": 188,
      "totalBlockingTimeMs": 15,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 3221.6640000000325,
      "styleRecalcs": 41,
      "styleRecalcDurationMs": 5.149999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2263.68,
      "heapDeltaBytes": 25503492,
      "heapUsedBytes": 93820856,
      "domNodes": 0,
      "jsHeapTotalBytes": 2158592,
      "scriptDurationMs": 211.94100000000003,
      "eventListeners": 188,
      "totalBlockingTimeMs": 13,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "minimap-idle",
      "durationMs": 2051.50500000002,
      "styleRecalcs": 2,
      "styleRecalcDurationMs": 2.1280000000000014,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 545.6679999999999,
      "heapDeltaBytes": -14333524,
      "heapUsedBytes": 73171580,
      "domNodes": -272,
      "jsHeapTotalBytes": -73728,
      "scriptDurationMs": 35.11800000000001,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "minimap-idle",
      "durationMs": 2029.320000000098,
      "styleRecalcs": 2,
      "styleRecalcDurationMs": 1.8849999999999978,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 529.0780000000001,
      "heapDeltaBytes": -14180792,
      "heapUsedBytes": 73032732,
      "domNodes": -274,
      "jsHeapTotalBytes": -335872,
      "scriptDurationMs": 35.87100000000001,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 753.3499999999549,
      "styleRecalcs": 45,
      "styleRecalcDurationMs": 9.684,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 533.9929999999999,
      "heapDeltaBytes": -5854748,
      "heapUsedBytes": 65408808,
      "domNodes": 16,
      "jsHeapTotalBytes": 6291456,
      "scriptDurationMs": 149.945,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 692.9870000000165,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 9.318000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 501.132,
      "heapDeltaBytes": -4967440,
      "heapUsedBytes": 67218232,
      "domNodes": 18,
      "jsHeapTotalBytes": 6029312,
      "scriptDurationMs": 144.21,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2022.1450000000232,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.057,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 473.123,
      "heapDeltaBytes": -9356940,
      "heapUsedBytes": 62441176,
      "domNodes": -296,
      "jsHeapTotalBytes": 6021120,
      "scriptDurationMs": 7.546,
      "eventListeners": -199,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2014.4490000000133,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.832999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 468.082,
      "heapDeltaBytes": -14348048,
      "heapUsedBytes": 57726784,
      "domNodes": -296,
      "jsHeapTotalBytes": 5758976,
      "scriptDurationMs": 6.993999999999999,
      "eventListeners": -201,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1892.9029999999898,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 37.00000000000001,
      "layouts": 16,
      "layoutDurationMs": 3.9450000000000007,
      "taskDurationMs": 1114.036,
      "heapDeltaBytes": -11684436,
      "heapUsedBytes": 60415672,
      "domNodes": -295,
      "jsHeapTotalBytes": 6021120,
      "scriptDurationMs": 121.82,
      "eventListeners": -201,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1842.9869999999937,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 35.824999999999996,
      "layouts": 16,
      "layoutDurationMs": 4.414,
      "taskDurationMs": 1110.5819999999999,
      "heapDeltaBytes": 8510980,
      "heapUsedBytes": 80481896,
      "domNodes": -295,
      "jsHeapTotalBytes": 5758976,
      "scriptDurationMs": 123.15899999999999,
      "eventListeners": -233,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1431.002000000035,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 31.912999999999997,
      "layouts": 14,
      "layoutDurationMs": 14.703,
      "taskDurationMs": 899.1219999999997,
      "heapDeltaBytes": 23575832,
      "heapUsedBytes": 105652264,
      "domNodes": 13671,
      "jsHeapTotalBytes": 10747904,
      "scriptDurationMs": 36.734,
      "eventListeners": 2381,
      "totalBlockingTimeMs": 150,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 14501.187000000073,
      "styleRecalcs": 245,
      "styleRecalcDurationMs": 34.919,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 10885.891,
      "heapDeltaBytes": 6169200,
      "heapUsedBytes": 89740344,
      "domNodes": -271,
      "jsHeapTotalBytes": 3477504,
      "scriptDurationMs": 4128.916,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 14274.844999999914,
      "styleRecalcs": 245,
      "styleRecalcDurationMs": 33.951,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 10775,
      "heapDeltaBytes": 7461612,
      "heapUsedBytes": 91220704,
      "domNodes": -272,
      "jsHeapTotalBytes": 3477504,
      "scriptDurationMs": 4063.9399999999996,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333338,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 17332.41799999996,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16628.094999999998,
      "heapDeltaBytes": -31894896,
      "heapUsedBytes": 178930720,
      "domNodes": -6548,
      "jsHeapTotalBytes": 6516736,
      "scriptDurationMs": 321.998,
      "eventListeners": -7473,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.779999999999927,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 17043.61599999993,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16495.319000000003,
      "heapDeltaBytes": -25727712,
      "heapUsedBytes": 176072000,
      "domNodes": -6548,
      "jsHeapTotalBytes": 3895296,
      "scriptDurationMs": 331.98499999999996,
      "eventListeners": -7471,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.223333333333358,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 21791.639000000032,
      "styleRecalcs": 172,
      "styleRecalcDurationMs": 18.539999999999974,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 21407.806999999997,
      "heapDeltaBytes": -35455984,
      "heapUsedBytes": 169292480,
      "domNodes": -6548,
      "jsHeapTotalBytes": 2322432,
      "scriptDurationMs": 1050.4150000000002,
      "eventListeners": -7465,
      "totalBlockingTimeMs": 248,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 20926.603,
      "styleRecalcs": 178,
      "styleRecalcDurationMs": 16.53299999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 20535.093999999997,
      "heapDeltaBytes": -17359116,
      "heapUsedBytes": 184102052,
      "domNodes": -6548,
      "jsHeapTotalBytes": 7303168,
      "scriptDurationMs": 971.7139999999999,
      "eventListeners": -7463,
      "totalBlockingTimeMs": 44,
      "frameDurationMs": 17.776666666666763,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "workflow-execution",
      "durationMs": 467.91399999995065,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 25.324,
      "layouts": 3,
      "layoutDurationMs": 0.648,
      "taskDurationMs": 133.625,
      "heapDeltaBytes": 5874200,
      "heapUsedBytes": 73203808,
      "domNodes": 126,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 7.399999999999999,
      "eventListeners": 99,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "workflow-execution",
      "durationMs": 523.4540000000152,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 24.301000000000002,
      "layouts": 4,
      "layoutDurationMs": 1.324,
      "taskDurationMs": 150.38400000000001,
      "heapDeltaBytes": 5986992,
      "heapUsedBytes": 73471924,
      "domNodes": 145,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 8.266000000000002,
      "eventListeners": 97,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    }
  ]
}

@github-actions github-actions Bot added the risk:R3 PR risk grade (advisory shadow check; grader-owned) label Aug 21, 2026
@codecov

codecov Bot commented Aug 21, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 92.43697% with 36 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/stores/nodeOutputStore.ts 62.16% 14 Missing ⚠️
src/scripts/app.ts 0.00% 5 Missing ⚠️
src/extensions/core/widgetInputs.ts 0.00% 3 Missing ⚠️
src/renderer/core/canvas/canvasStore.ts 0.00% 3 Missing ⚠️
src/stores/widgetValueStore.ts 91.42% 3 Missing ⚠️
src/lib/litegraph/src/node/NodeOutputSlot.ts 60.00% 2 Missing ⚠️
...er/core/layout/operations/graphLayoutAttachment.ts 97.53% 2 Missing ⚠️
src/core/graph/subgraph/promotionUtils.ts 66.66% 1 Missing ⚠️
src/lib/litegraph/src/node/slotDescriptorView.ts 98.82% 1 Missing ⚠️
src/scripts/ui.ts 0.00% 1 Missing ⚠️
... and 1 more
@@                           Coverage Diff                            @@
##           test/ecs-migration-behavior-coverage   #15544      +/-   ##
========================================================================
+ Coverage                                 82.49%   82.53%   +0.03%     
========================================================================
  Files                                      1904     1911       +7     
  Lines                                    123436   123619     +183     
  Branches                                  39892    39884       -8     
========================================================================
+ Hits                                     101831   102026     +195     
+ Misses                                    21083    21072      -11     
+ Partials                                    522      521       -1     
Flag Coverage Δ
unit 73.78% <92.43%> (+0.11%) ⬆️

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

Files with missing lines Coverage Δ
...ponents/rightSidePanel/subgraph/SubgraphEditor.vue 84.27% <100.00%> (+0.36%) ⬆️
src/composables/maskeditor/useMaskEditorSaver.ts 95.00% <ø> (-0.04%) ⬇️
src/composables/node/usePromotedPreviews.ts 100.00% <100.00%> (ø)
...e/graph/subgraph/migration/proxyWidgetMigration.ts 92.09% <100.00%> (ø)
src/lib/litegraph/src/LGraph.ts 84.66% <ø> (+0.31%) ⬆️
src/lib/litegraph/src/LGraphCanvas.ts 74.25% <ø> (+0.03%) ⬆️
src/lib/litegraph/src/LGraphGroup.ts 87.89% <ø> (-0.15%) ⬇️
src/lib/litegraph/src/LGraphNode.ts 81.65% <ø> (-0.53%) ⬇️
src/lib/litegraph/src/LLink.ts 65.50% <ø> (-0.74%) ⬇️
src/lib/litegraph/src/canvas/LinkConnector.ts 61.09% <ø> (-0.19%) ⬇️
... and 27 more

... and 1 file 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.

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

Labels

risk:R3 PR risk grade (advisory shadow check; grader-owned)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants