fix(litegraph): clear widget and preview stores for the incoming graph id on configure - #15613
fix(litegraph): clear widget and preview stores for the incoming graph id on configure#15613christian-byrne wants to merge 2 commits into
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
🎨 Storybook: ✅ Built — View Storybook🎭 Playwright: ✅ 1985 passed, 0 failed · 3 flaky📊 Browser Reports
📦 Bundle Size
⚡ Performance Report
Absolute values
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
}
]
} |
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
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 7 files with indirect coverage changes 🚀 New features to boost your workflow:
|
…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.
3ad1c7d to
70604e6
Compare
LGraph.configureleaves 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 underthis.id— the id held before configure (LGraph.ts:575)._configureBase()then assignsthis.id = data.id(LGraph.ts:2566).configurealready re-clearslinkStore,rerouteStoreandnodeDataStorefor the incoming id right after_configureBase;widgetValueStoreandpreviewExposureStorewere missing from that block. Widget state is keyedgraphId:nodeId:nameandregisterWidgetreturns the existing entry for a key, sowidget.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 productionconfigureruns on that instance, whereclear()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 rootLGraphs 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 furthersrc/**/*.test.tsmatching.configure(|loadGraphData|widgetValueStore|previewExposureStore. Not the full suite.Behaviour-preserving: 0 of 3842 killed.
It closes the vacuity class
LGraphNode.widgetLabelRename.regression.test.tswas repaired test-side in #15603 by routing its reloads throughreloadSerializedGraph, which clears the payload id's stores by hand. Rewriting those three reloads the naive way — plainnew LGraph().configure(graph.serialize()), no helper — and re-running the audit's mutations:renameWidgetstops writinginput.label(#13861's exact root cause)serialize()dropslabel+localized_namefrom every inputControl: 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:useWidgetValueStore().clearGraph(this.id)a reloaded widget label is read from the payload, never inherited from the live storeusePreviewExposureStore().clearGraph(this.id)preview exposures held for the incoming id do not survive the reloadReverting 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.hooksPathpoints at a.husky/_that a worktree never has), soevery gate below was run by hand at head
3ad1c7df79, from a worktree with its ownpnpm install --frozen-lockfilerather than a borrowednode_modules. Command, then exit code:vue-tsc --noEmitTS2688eslint srcno-restricted-syntaxwarnings, none in this diffoxlint src browser_tests tools/oxlint-plugins --type-awareoxlint --config tools/oxlint-plugins/vitestCleanup.config.json .stylelint '{apps,packages,src}/**/*.{css,vue}'oxfmt --checkknip --cachevitest run src/lib/litegraph/src/LGraph.configureStoreScope.test.tsNODE_OPTIONS=--max-old-space-size=8192on bothvue-tscandeslint: at Node's 2 GB defaulteslint srcaborts with exit 134 and a core dump, andvue-tscdoes the same. Neither printsanything a grep for
errorwould catch.Two earlier claims in this description were wrong, and are retracted
src/lib/litegraph/paths." False. That came from probing withdebugger, andno-debuggeris[0]— disabled repo-wide. Re-probed withno-var, confirmed aterror level via
eslint --print-config: injectingvar __probe = 1intosrc/lib/litegraph/src/LLink.tsgiveserror no-var, exit 1. eslint lints that tree normally andthe result above is real evidence, not a vacuous one.
knip— exit 1, pre-existing." That exit 1 was an artefact of running against a borrowednode_modules, which leavesapps/website/node_modulesabsent and pins the exit code. With a realinstall in the checkout,
knip --cacheexits 0 with no output.oxlint's 0 exit is reported alongside its output byte count on purpose: most of this repo's oxlintrules 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
layoutStoreis cleared byresetAfterClearbut 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.