Skip to content

fix(litegraph): clear widget and preview stores for the incoming graph id on configure - #15613

Open
christian-byrne wants to merge 2 commits into
feature/ecs-migrationfrom
cb__configure-store-clear
Open

fix(litegraph): clear widget and preview stores for the incoming graph id on configure#15613
christian-byrne wants to merge 2 commits into
feature/ecs-migrationfrom
cb__configure-store-clear

Conversation

@christian-byrne

@christian-byrne christian-byrne commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

LGraph.configure leaves graph-scoped store state alive for the graph id it is about to adopt, so a reloaded node can re-adopt the live entry instead of reading the payload.

resetAfterClear() clears under this.id — the id held before configure (LGraph.ts:575). _configureBase() then assigns this.id = data.id (LGraph.ts:2566). configure already re-clears linkStore, rerouteStore and nodeDataStore for the incoming id right after _configureBase; widgetValueStore and previewExposureStore were missing from that block. Widget state is keyed graphId:nodeId:name and registerWidget returns the existing entry for a key, so widget.label — whose only home after reload is the store — survives a reload that should have re-read it from JSON.

This is the open question left on #15604 and deliberately not taken in #15603.

Why this is safe

Production has exactly one new LGraph() (src/scripts/app.ts:938), the singleton root graph. Every production configure runs on that instance, where clear() has already dropped the same id, so the added clears are a no-op unless the incoming payload carries a different id — in which case anything still held for it belongs to a previously-open workflow and is stale by construction. Two live root LGraphs sharing an id only happens in tests.

Numbers

Denominator: 3842 passing tests across 237 files, enumerated 2026-08-22 as src/lib/litegraph + src/stores + src/core/graph + src/renderer/extensions/vueNodes/widgets + the 36 further src/**/*.test.ts matching .configure(|loadGraphData|widgetValueStore|previewExposureStore. Not the full suite.

run result
baseline, no change 3842 passed / 237 files
with this change 3842 passed / 237 files
with this change + 2 new tests 3845 passed / 238 files

Behaviour-preserving: 0 of 3842 killed.

It closes the vacuity class

LGraphNode.widgetLabelRename.regression.test.ts was repaired test-side in #15603 by routing its reloads through reloadSerializedGraph, which clears the payload id's stores by hand. Rewriting those three reloads the naive way — plain new LGraph().configure(graph.serialize()), no helper — and re-running the audit's mutations:

mutation naive tests, before this change naive tests, after
M12 — renameWidget stops writing input.label (#13861's exact root cause) 2 / 5 killed 5 / 5
M9 — serialize() drops label + localized_name from every input 1 / 5 killed 4 / 5

Control: naive tests, no mutation, no change — 5 / 5 pass. So the kills are the mutations, not the rewrite.

The point is not the two extra kills. It is that after this change a round-trip test written the obvious way is a real detector, instead of needing a helper nobody is obliged to call.

Tests

LGraph.configureStoreScope.test.ts, two tests, each pinning one added line:

removed line failing test
useWidgetValueStore().clearGraph(this.id) a reloaded widget label is read from the payload, never inherited from the live store
usePreviewExposureStore().clearGraph(this.id) preview exposures held for the incoming id do not survive the reload

Reverting both: 2 / 2 fail. The label test drops the label from one node's payload and keeps it on a second node, so a build where labels never restore at all cannot pass it by asserting undefined.

Gates

Worktrees run no git hooks (core.hooksPath points at a .husky/_ that a worktree never has), so
every gate below was run by hand at head 3ad1c7df79, from a worktree with its own
pnpm install --frozen-lockfile rather than a borrowed node_modules. Command, then exit code:

Gate Command Exit Output
typecheck vue-tsc --noEmit 0 0 errors, 0 TS2688
eslint eslint src 0 4 pre-existing no-restricted-syntax warnings, none in this diff
oxlint oxlint src browser_tests tools/oxlint-plugins --type-aware 0 0 bytes
oxlint audit oxlint --config tools/oxlint-plugins/vitestCleanup.config.json . 0 0 bytes
stylelint stylelint '{apps,packages,src}/**/*.{css,vue}' 0 0 bytes
format oxfmt --check 0 all files correctly formatted
knip knip --cache 0 0 bytes
tests vitest run src/lib/litegraph/src/LGraph.configureStoreScope.test.ts 0 2 passed

NODE_OPTIONS=--max-old-space-size=8192 on both vue-tsc and eslint: at Node's 2 GB default
eslint src aborts with exit 134 and a core dump, and vue-tsc does the same. Neither prints
anything a grep for error would catch.

Two earlier claims in this description were wrong, and are retracted

  • "eslint reports nothing on src/lib/litegraph/ paths." False. That came from probing with
    debugger, and no-debugger is [0] — disabled repo-wide. Re-probed with no-var, confirmed at
    error level via eslint --print-config: injecting var __probe = 1 into
    src/lib/litegraph/src/LLink.ts gives error no-var, exit 1. eslint lints that tree normally and
    the result above is real evidence, not a vacuous one.
  • "knip — exit 1, pre-existing." That exit 1 was an artefact of running against a borrowed
    node_modules, which leaves apps/website/node_modules absent and pins the exit code. With a real
    install in the checkout, knip --cache exits 0 with no output.

oxlint's 0 exit is reported alongside its output byte count on purpose: most of this repo's oxlint
rules run at warning severity, where a finding prints and still exits 0. 0 bytes of output is the
claim; the exit code alone would not be.

Follow-ups, not taken here

  • layoutStore is cleared by resetAfterClear but not for the incoming id. Same shape, not measured, deliberately out of scope.
  • SubgraphNode._hydratePreviewExposures's legacy branch reads exposures back out of the store. That read happens during node creation, after this clear, so it is unaffected — but it is a second place where store state crosses a configure boundary.

@dosubot dosubot Bot added the size:XS This PR changes 0-9 lines, ignoring generated files. label Aug 22, 2026
@coderabbitai

coderabbitai Bot commented Aug 22, 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: c5b15a68-9866-43f8-b2ed-ea9dd2ad3b37

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 22, 2026

Copy link
Copy Markdown

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 08/22/2026, 07:59:35 AM UTC

Links

🎭 Playwright: ✅ 1985 passed, 0 failed · 3 flaky

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

📦 Bundle Size

⏳ Size data collection in progress…

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 64.5 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 58.3 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 70.0 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 59.1 MB heap
large-graph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.0 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 20ms TBT · 68.5 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 1ms TBT · 77.1 MB heap
legacy-node-drag: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 1ms TBT · 65.6 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.7 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 83.7 MB heap
subgraph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 65.7 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 73.2 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 131ms TBT · 89.4 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 30ms TBT · 79.9 MB heap
vue-large-graph-idle: · 56.3 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 168.4 MB heap
vue-large-graph-pan: · 56.3 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 91ms TBT · 164.4 MB heap
workflow-execution: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 66.8 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 7
canvas-idle: task duration 550ms
canvas-idle: script duration 10ms
canvas-idle: TBT 0ms
canvas-idle: heap used 64.5 MB
canvas-idle: DOM nodes -281
canvas-idle: event listeners -156
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 44ms
canvas-mouse-sweep: layout count 12
canvas-mouse-sweep: style recalc count 78
canvas-mouse-sweep: task duration 1242ms
canvas-mouse-sweep: script duration 164ms
canvas-mouse-sweep: TBT 0ms
canvas-mouse-sweep: heap used 58.3 MB
canvas-mouse-sweep: DOM nodes -283
canvas-mouse-sweep: event listeners -185
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 347ms
canvas-zoom-sweep: script duration 11ms
canvas-zoom-sweep: TBT 0ms
canvas-zoom-sweep: heap used 70.0 MB
canvas-zoom-sweep: DOM nodes 75
canvas-zoom-sweep: event listeners 20
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 8ms
dom-widget-clipping: layout count 0
dom-widget-clipping: style recalc count 11
dom-widget-clipping: task duration 446ms
dom-widget-clipping: script duration 33ms
dom-widget-clipping: TBT 0ms
dom-widget-clipping: heap used 59.1 MB
dom-widget-clipping: DOM nodes 18
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 4ms
large-graph-idle: layout count 0
large-graph-idle: style recalc count 5
large-graph-idle: task duration 562ms
large-graph-idle: script duration 37ms
large-graph-idle: TBT 0ms
large-graph-idle: heap used 67.0 MB
large-graph-idle: DOM nodes -278
large-graph-idle: event listeners -154
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 10ms
large-graph-pan: layout count 0
large-graph-pan: style recalc count 65
large-graph-pan: task duration 2669ms
large-graph-pan: script duration 976ms
large-graph-pan: TBT 20ms
large-graph-pan: heap used 68.5 MB
large-graph-pan: DOM nodes -284
large-graph-pan: event listeners -181
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 12ms
large-graph-zoom: layout count 60
large-graph-zoom: style recalc count 67
large-graph-zoom: task duration 2628ms
large-graph-zoom: script duration 904ms
large-graph-zoom: TBT 1ms
large-graph-zoom: heap used 77.1 MB
large-graph-zoom: DOM nodes -104
large-graph-zoom: event listeners -84
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 6ms
legacy-node-drag: layout count 0
legacy-node-drag: style recalc count 42
legacy-node-drag: task duration 2173ms
legacy-node-drag: script duration 220ms
legacy-node-drag: TBT 1ms
legacy-node-drag: heap used 65.6 MB
legacy-node-drag: DOM nodes -286
legacy-node-drag: event listeners -1
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 3
minimap-idle: task duration 534ms
minimap-idle: script duration 37ms
minimap-idle: TBT 0ms
minimap-idle: heap used 67.7 MB
minimap-idle: DOM nodes -280
minimap-idle: event listeners -170
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 11ms
subgraph-dom-widget-clipping: layout count 0
subgraph-dom-widget-clipping: style recalc count 46
subgraph-dom-widget-clipping: task duration 507ms
subgraph-dom-widget-clipping: script duration 137ms
subgraph-dom-widget-clipping: TBT 0ms
subgraph-dom-widget-clipping: heap used 83.7 MB
subgraph-dom-widget-clipping: DOM nodes 17
subgraph-dom-widget-clipping: event listeners 8
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 9
subgraph-idle: task duration 478ms
subgraph-idle: script duration 7ms
subgraph-idle: TBT 0ms
subgraph-idle: heap used 65.7 MB
subgraph-idle: DOM nodes -297
subgraph-idle: event listeners -231
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 39ms
subgraph-mouse-sweep: layout count 16
subgraph-mouse-sweep: style recalc count 78
subgraph-mouse-sweep: task duration 1120ms
subgraph-mouse-sweep: script duration 119ms
subgraph-mouse-sweep: TBT 0ms
subgraph-mouse-sweep: heap used 73.2 MB
subgraph-mouse-sweep: DOM nodes -296
subgraph-mouse-sweep: event listeners -231
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 33ms
subgraph-transition-enter: layout count 14
subgraph-transition-enter: style recalc count 19
subgraph-transition-enter: task duration 946ms
subgraph-transition-enter: script duration 31ms
subgraph-transition-enter: TBT 131ms
subgraph-transition-enter: heap used 89.4 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 35ms
viewport-pan-sweep: layout count 0
viewport-pan-sweep: style recalc count 246
viewport-pan-sweep: task duration 9735ms
viewport-pan-sweep: script duration 3475ms
viewport-pan-sweep: TBT 30ms
viewport-pan-sweep: heap used 79.9 MB
viewport-pan-sweep: DOM nodes -278
viewport-pan-sweep: event listeners -142
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 16956ms
vue-large-graph-idle: script duration 337ms
vue-large-graph-idle: TBT 0ms
vue-large-graph-idle: heap used 168.4 MB
vue-large-graph-idle: DOM nodes -6550
vue-large-graph-idle: event listeners -7473
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 19ms
vue-large-graph-pan: layout count 0
vue-large-graph-pan: style recalc count 173
vue-large-graph-pan: task duration 21056ms
vue-large-graph-pan: script duration 948ms
vue-large-graph-pan: TBT 91ms
vue-large-graph-pan: heap used 164.4 MB
vue-large-graph-pan: DOM nodes -6548
vue-large-graph-pan: event listeners -7469
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 3
workflow-execution: style recalc count 15
workflow-execution: task duration 130ms
workflow-execution: script duration 8ms
workflow-execution: TBT 0ms
workflow-execution: heap used 66.8 MB
workflow-execution: DOM nodes 135
workflow-execution: event listeners 98
Raw data
{
  "timestamp": "2026-08-22T08:11:30.137Z",
  "gitSha": "cbe040a9745d0a72a135e123405eccecf3223116",
  "branch": "cb__configure-store-clear",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2048.890999999998,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 6.298,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 549.8609999999999,
      "heapDeltaBytes": -10279308,
      "heapUsedBytes": 59231040,
      "domNodes": -279,
      "jsHeapTotalBytes": 4710400,
      "scriptDurationMs": 8.619,
      "eventListeners": -157,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-idle",
      "durationMs": 2054.397999999992,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 7.511,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 549.902,
      "heapDeltaBytes": 6804128,
      "heapUsedBytes": 75968860,
      "domNodes": -282,
      "jsHeapTotalBytes": 5496832,
      "scriptDurationMs": 10.476999999999999,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2185.744999999997,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 40.480000000000004,
      "layouts": 12,
      "layoutDurationMs": 3.5669999999999997,
      "taskDurationMs": 1212.266,
      "heapDeltaBytes": -8502232,
      "heapUsedBytes": 60622188,
      "domNodes": -284,
      "jsHeapTotalBytes": 6021120,
      "scriptDurationMs": 160.559,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2260.4410000000144,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 46.742000000000004,
      "layouts": 12,
      "layoutDurationMs": 3.897,
      "taskDurationMs": 1270.921,
      "heapDeltaBytes": -7641952,
      "heapUsedBytes": 61591952,
      "domNodes": -282,
      "jsHeapTotalBytes": 6283264,
      "scriptDurationMs": 166.67000000000002,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1721.087999999952,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 15.658000000000001,
      "layouts": 6,
      "layoutDurationMs": 0.5770000000000001,
      "taskDurationMs": 349.57500000000005,
      "heapDeltaBytes": 3765968,
      "heapUsedBytes": 73598000,
      "domNodes": 77,
      "jsHeapTotalBytes": 5767168,
      "scriptDurationMs": 10.373999999999999,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1730.4189999999835,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 15.623,
      "layouts": 6,
      "layoutDurationMs": 0.748,
      "taskDurationMs": 345.41099999999994,
      "heapDeltaBytes": 3741252,
      "heapUsedBytes": 73292740,
      "domNodes": 72,
      "jsHeapTotalBytes": 5242880,
      "scriptDurationMs": 10.976999999999999,
      "eventListeners": 21,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 737.562999999966,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.671000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 434.481,
      "heapDeltaBytes": -6910192,
      "heapUsedBytes": 62025432,
      "domNodes": 18,
      "jsHeapTotalBytes": 6291456,
      "scriptDurationMs": 31.079000000000004,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 723.6769999999524,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 7.766000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 458.326,
      "heapDeltaBytes": -7025824,
      "heapUsedBytes": 61993256,
      "domNodes": 18,
      "jsHeapTotalBytes": 5505024,
      "scriptDurationMs": 33.941,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2053.843000000029,
      "styleRecalcs": 5,
      "styleRecalcDurationMs": 4.683999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 577.7239999999999,
      "heapDeltaBytes": -22088860,
      "heapUsedBytes": 68511308,
      "domNodes": -282,
      "jsHeapTotalBytes": 4452352,
      "scriptDurationMs": 39.377,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2043.8060000000178,
      "styleRecalcs": 4,
      "styleRecalcDurationMs": 3.5140000000000016,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 545.791,
      "heapDeltaBytes": -18665632,
      "heapUsedBytes": 71926276,
      "domNodes": -274,
      "jsHeapTotalBytes": -1576960,
      "scriptDurationMs": 34.081,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 3306.840999999963,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 10.501,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2671.94,
      "heapDeltaBytes": -18252708,
      "heapUsedBytes": 66017272,
      "domNodes": -283,
      "jsHeapTotalBytes": 4939776,
      "scriptDurationMs": 977.869,
      "eventListeners": -181,
      "totalBlockingTimeMs": 20,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 3234.147000000007,
      "styleRecalcs": 64,
      "styleRecalcDurationMs": 9.428000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2666.847,
      "heapDeltaBytes": -13855068,
      "heapUsedBytes": 77594360,
      "domNodes": -285,
      "jsHeapTotalBytes": 4677632,
      "scriptDurationMs": 974.434,
      "eventListeners": -181,
      "totalBlockingTimeMs": 19,
      "frameDurationMs": 16.666666666666696,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 4474.64100000002,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 11.557000000000002,
      "layouts": 60,
      "layoutDurationMs": 7.821,
      "taskDurationMs": 2709.0899999999997,
      "heapDeltaBytes": -4868964,
      "heapUsedBytes": 67467140,
      "domNodes": -234,
      "jsHeapTotalBytes": -1351680,
      "scriptDurationMs": 921.339,
      "eventListeners": -177,
      "totalBlockingTimeMs": 2,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.80000000000109
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 4397.770000000037,
      "styleRecalcs": 67,
      "styleRecalcDurationMs": 12.23,
      "layouts": 60,
      "layoutDurationMs": 7.755999999999999,
      "taskDurationMs": 2546.9089999999997,
      "heapDeltaBytes": 5948304,
      "heapUsedBytes": 94209544,
      "domNodes": 26,
      "jsHeapTotalBytes": 5767168,
      "scriptDurationMs": 886.1049999999999,
      "eventListeners": 10,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 3214.339999999993,
      "styleRecalcs": 42,
      "styleRecalcDurationMs": 6.462000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2111.9399999999996,
      "heapDeltaBytes": -1424280,
      "heapUsedBytes": 70004972,
      "domNodes": -284,
      "jsHeapTotalBytes": 221184,
      "scriptDurationMs": 207.394,
      "eventListeners": -1,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666636,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 3333.0780000000004,
      "styleRecalcs": 41,
      "styleRecalcDurationMs": 4.936999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2233.6459999999997,
      "heapDeltaBytes": -4877328,
      "heapUsedBytes": 67581924,
      "domNodes": -288,
      "jsHeapTotalBytes": -40960,
      "scriptDurationMs": 232.30200000000002,
      "eventListeners": -1,
      "totalBlockingTimeMs": 1,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2030.9269999999628,
      "styleRecalcs": 3,
      "styleRecalcDurationMs": 2.5399999999999987,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 556.3659999999999,
      "heapDeltaBytes": -22716128,
      "heapUsedBytes": 68456604,
      "domNodes": -284,
      "jsHeapTotalBytes": 4190208,
      "scriptDurationMs": 37.461000000000006,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "minimap-idle",
      "durationMs": 2026.80799999996,
      "styleRecalcs": 2,
      "styleRecalcDurationMs": 1.3179999999999996,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 512.349,
      "heapDeltaBytes": -18974152,
      "heapUsedBytes": 73493632,
      "domNodes": -276,
      "jsHeapTotalBytes": -2363392,
      "scriptDurationMs": 37.337999999999994,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 743.7289999999734,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 13.042,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 515.6129999999998,
      "heapDeltaBytes": 17750316,
      "heapUsedBytes": 87567528,
      "domNodes": 18,
      "jsHeapTotalBytes": 5242880,
      "scriptDurationMs": 137.933,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 691.5280000000621,
      "styleRecalcs": 45,
      "styleRecalcDurationMs": 8.464,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 498.0040000000001,
      "heapDeltaBytes": 18048676,
      "heapUsedBytes": 87932860,
      "domNodes": 16,
      "jsHeapTotalBytes": 5505024,
      "scriptDurationMs": 135.103,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2022.3609999999894,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.9670000000000005,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 464.34400000000005,
      "heapDeltaBytes": 2087124,
      "heapUsedBytes": 71620976,
      "domNodes": -296,
      "jsHeapTotalBytes": 5496832,
      "scriptDurationMs": 6.918999999999998,
      "eventListeners": -231,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2011.3079999999854,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 8.446999999999997,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 491.688,
      "heapDeltaBytes": -3301292,
      "heapUsedBytes": 66208424,
      "domNodes": -297,
      "jsHeapTotalBytes": 4710400,
      "scriptDurationMs": 8.036,
      "eventListeners": -231,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1925.8879999999863,
      "styleRecalcs": 80,
      "styleRecalcDurationMs": 41.607000000000006,
      "layouts": 16,
      "layoutDurationMs": 4.345,
      "taskDurationMs": 1127.308,
      "heapDeltaBytes": 7619544,
      "heapUsedBytes": 77430896,
      "domNodes": -295,
      "jsHeapTotalBytes": 6021120,
      "scriptDurationMs": 117.91399999999999,
      "eventListeners": -231,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1851.2000000000626,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 35.40500000000001,
      "layouts": 16,
      "layoutDurationMs": 4.469,
      "taskDurationMs": 1113.0019999999997,
      "heapDeltaBytes": 12649364,
      "heapUsedBytes": 76168312,
      "domNodes": -297,
      "jsHeapTotalBytes": 5496832,
      "scriptDurationMs": 119.64699999999999,
      "eventListeners": -231,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1384.0979999999945,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 32.709,
      "layouts": 14,
      "layoutDurationMs": 14.643000000000002,
      "taskDurationMs": 945.9370000000002,
      "heapDeltaBytes": -1850800,
      "heapUsedBytes": 93747640,
      "domNodes": 13671,
      "jsHeapTotalBytes": 10747904,
      "scriptDurationMs": 30.552000000000003,
      "eventListeners": 2381,
      "totalBlockingTimeMs": 131,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 12966.532000000028,
      "styleRecalcs": 245,
      "styleRecalcDurationMs": 33.687000000000005,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 9998.96,
      "heapDeltaBytes": 18099204,
      "heapUsedBytes": 100815904,
      "domNodes": -282,
      "jsHeapTotalBytes": 8540160,
      "scriptDurationMs": 3635.1069999999995,
      "eventListeners": -157,
      "totalBlockingTimeMs": 28,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 12516.160000000014,
      "styleRecalcs": 247,
      "styleRecalcDurationMs": 36.352999999999994,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 9470.184000000001,
      "heapDeltaBytes": -24013416,
      "heapUsedBytes": 66780976,
      "domNodes": -273,
      "jsHeapTotalBytes": 3928064,
      "scriptDurationMs": 3315.2219999999998,
      "eventListeners": -127,
      "totalBlockingTimeMs": 31,
      "frameDurationMs": 16.66333333333338,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 17658.007999999994,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16936.998,
      "heapDeltaBytes": -41927516,
      "heapUsedBytes": 176249832,
      "domNodes": -6548,
      "jsHeapTotalBytes": -5890048,
      "scriptDurationMs": 337.755,
      "eventListeners": -7475,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.77333333333336,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 17673.9,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16975.886000000002,
      "heapDeltaBytes": -35144916,
      "heapUsedBytes": 176986360,
      "domNodes": -6552,
      "jsHeapTotalBytes": -3321856,
      "scriptDurationMs": 335.946,
      "eventListeners": -7471,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.77333333333336,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 21612.464999999986,
      "styleRecalcs": 173,
      "styleRecalcDurationMs": 20.24500000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 21297.134,
      "heapDeltaBytes": -26726228,
      "heapUsedBytes": 177317248,
      "domNodes": -6548,
      "jsHeapTotalBytes": 774144,
      "scriptDurationMs": 949.257,
      "eventListeners": -7469,
      "totalBlockingTimeMs": 24,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 21124.911999999997,
      "styleRecalcs": 173,
      "styleRecalcDurationMs": 18.44499999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 20814.495000000003,
      "heapDeltaBytes": -51795320,
      "heapUsedBytes": 167359152,
      "domNodes": -6548,
      "jsHeapTotalBytes": -4329472,
      "scriptDurationMs": 946.1560000000001,
      "eventListeners": -7469,
      "totalBlockingTimeMs": 157,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 467.928000000029,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 23.476999999999997,
      "layouts": 3,
      "layoutDurationMs": 1.149,
      "taskDurationMs": 127.51400000000001,
      "heapDeltaBytes": 5574384,
      "heapUsedBytes": 68044128,
      "domNodes": 148,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 8.099,
      "eventListeners": 99,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 479.3610000000399,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 20.713,
      "layouts": 3,
      "layoutDurationMs": 0.7879999999999998,
      "taskDurationMs": 132.608,
      "heapDeltaBytes": 5433588,
      "heapUsedBytes": 71949884,
      "domNodes": 121,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 7.574000000000001,
      "eventListeners": 97,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    }
  ]
}

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

codecov Bot commented Aug 22, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@                    Coverage Diff                    @@
##           feature/ecs-migration   #15613      +/-   ##
=========================================================
+ Coverage                  82.30%   82.31%   +0.01%     
=========================================================
  Files                       1900     1900              
  Lines                     107652   107654       +2     
  Branches                   34116    34061      -55     
=========================================================
+ Hits                       88605    88618      +13     
+ Misses                     18711    18700      -11     
  Partials                     336      336              
Flag Coverage Δ
e2e 67.98% <100.00%> (+0.03%) ⬆️
unit 73.92% <ø> (ø)

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

Files with missing lines Coverage Δ
src/lib/litegraph/src/LGraph.ts 78.74% <100.00%> (+0.03%) ⬆️

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

…h id on configure

resetAfterClear() drops graph-scoped store entries under the id the graph
held before configure, then _configureBase() adopts the payload's id. Any
entry still held for the incoming id therefore outlives the reload, and a
node re-adopts it instead of reading the payload.

configure() already re-clears link, reroute and node-data state for the
incoming id; widgetValueStore and previewExposureStore were missing from
that block.
@DrJKL
DrJKL force-pushed the cb__configure-store-clear branch from 3ad1c7d to 70604e6 Compare August 22, 2026 07:57
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) size:XS This PR changes 0-9 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants