Skip to content

fix(widgets): reconcile widget store entry when widget type changes#13774

Merged
AustinMroz merged 1 commit into
fix/widget-store-custom-node-widgetsfrom
fix/widget-store-type-reconcile
Jul 18, 2026
Merged

fix(widgets): reconcile widget store entry when widget type changes#13774
AustinMroz merged 1 commit into
fix/widget-store-custom-node-widgetsfrom
fix/widget-store-type-reconcile

Conversation

@christian-byrne

Copy link
Copy Markdown
Contributor

Summary

On subgraph convert, a widget could render with the wrong type (a multiline text widget appeared as an int widget until a page reload) because the widget value store returned a stale entry keyed by graphId:nodeId:name.

Changes

  • What: registerWidget returned the existing store entry unconditionally (idempotent to preserve edited values across re-render). But when a subgraph convert reuses the same graphId:nodeId:name key for a different widget, the stale entry won — wrong type, wrong value, only corrected by a reload that rehydrates the store from serialized data. Now the idempotent return applies only when existing.type === init.type; on a type mismatch the id belongs to a different widget, so the store overwrites with the live type/value. Same-type re-registration still preserves edited values (unchanged behavior).
  • Breaking: none.

Review Focus

QA source: staging 1.47 — "multiline text widget converts to int inside/outside nested subgraph; refresh fixes it", working on 1.45.21.

@coderabbitai

coderabbitai Bot commented Jul 17, 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: 3cccb763-dfa9-44e3-b3f0-84fbc1098bc8

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/widget-store-type-reconcile

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

@github-actions

github-actions Bot commented Jul 17, 2026

Copy link
Copy Markdown

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

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

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 07/18/2026, 12:05:12 AM UTC

Links

📦 Bundle Size

⏳ Size data collection in progress…

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 45.6 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 51.5 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 72.8 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.4 MB heap
large-graph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 61.6 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 58.9 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 55.7 MB heap
minimap-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 63.2 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 54.9 MB heap
subgraph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 45.5 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 53.0 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 147ms TBT · 93.1 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.4 MB heap
vue-large-graph-idle: · 57.2 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 160.8 MB heap
vue-large-graph-pan: · 57.1 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 14ms TBT · 173.2 MB heap
workflow-execution: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 49.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 10ms
canvas-idle: layout count 0
canvas-idle: style recalc count 11
canvas-idle: task duration 467ms
canvas-idle: script duration 17ms
canvas-idle: TBT 0ms
canvas-idle: heap used 45.6 MB
canvas-idle: DOM nodes -265
canvas-idle: event listeners -133
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 41ms
canvas-mouse-sweep: layout count 12
canvas-mouse-sweep: style recalc count 77
canvas-mouse-sweep: task duration 816ms
canvas-mouse-sweep: script duration 126ms
canvas-mouse-sweep: TBT 0ms
canvas-mouse-sweep: heap used 51.5 MB
canvas-mouse-sweep: DOM nodes -265
canvas-mouse-sweep: event listeners -133
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 17ms
canvas-zoom-sweep: layout count 6
canvas-zoom-sweep: style recalc count 32
canvas-zoom-sweep: task duration 330ms
canvas-zoom-sweep: script duration 21ms
canvas-zoom-sweep: TBT 0ms
canvas-zoom-sweep: heap used 72.8 MB
canvas-zoom-sweep: DOM nodes 79
canvas-zoom-sweep: event listeners 19
dom-widget-clipping: avg frame time 17ms
dom-widget-clipping: p95 frame time 17ms
dom-widget-clipping: layout duration 0ms
dom-widget-clipping: style recalc duration 9ms
dom-widget-clipping: layout count 0
dom-widget-clipping: style recalc count 13
dom-widget-clipping: task duration 336ms
dom-widget-clipping: script duration 57ms
dom-widget-clipping: TBT 0ms
dom-widget-clipping: heap used 54.4 MB
dom-widget-clipping: DOM nodes 21
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 9ms
large-graph-idle: layout count 0
large-graph-idle: style recalc count 9
large-graph-idle: task duration 539ms
large-graph-idle: script duration 91ms
large-graph-idle: TBT 0ms
large-graph-idle: heap used 61.6 MB
large-graph-idle: DOM nodes -265
large-graph-idle: event listeners -129
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 16ms
large-graph-pan: layout count 0
large-graph-pan: style recalc count 70
large-graph-pan: task duration 1121ms
large-graph-pan: script duration 403ms
large-graph-pan: TBT 0ms
large-graph-pan: heap used 58.9 MB
large-graph-pan: DOM nodes -268
large-graph-pan: event listeners -128
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 15ms
large-graph-zoom: layout count 60
large-graph-zoom: style recalc count 65
large-graph-zoom: task duration 1389ms
large-graph-zoom: script duration 514ms
large-graph-zoom: TBT 0ms
large-graph-zoom: heap used 55.7 MB
large-graph-zoom: DOM nodes -273
large-graph-zoom: event listeners -133
minimap-idle: avg frame time 17ms
minimap-idle: p95 frame time 17ms
minimap-idle: layout duration 0ms
minimap-idle: style recalc duration 9ms
minimap-idle: layout count 0
minimap-idle: style recalc count 9
minimap-idle: task duration 560ms
minimap-idle: script duration 94ms
minimap-idle: TBT 0ms
minimap-idle: heap used 63.2 MB
minimap-idle: DOM nodes -267
minimap-idle: event listeners -129
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 47
subgraph-dom-widget-clipping: task duration 371ms
subgraph-dom-widget-clipping: script duration 122ms
subgraph-dom-widget-clipping: TBT 0ms
subgraph-dom-widget-clipping: heap used 54.9 MB
subgraph-dom-widget-clipping: DOM nodes 20
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 10ms
subgraph-idle: layout count 0
subgraph-idle: style recalc count 11
subgraph-idle: task duration 402ms
subgraph-idle: script duration 14ms
subgraph-idle: TBT 0ms
subgraph-idle: heap used 45.5 MB
subgraph-idle: DOM nodes -263
subgraph-idle: event listeners -133
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 37ms
subgraph-mouse-sweep: layout count 16
subgraph-mouse-sweep: style recalc count 76
subgraph-mouse-sweep: task duration 703ms
subgraph-mouse-sweep: script duration 93ms
subgraph-mouse-sweep: TBT 0ms
subgraph-mouse-sweep: heap used 53.0 MB
subgraph-mouse-sweep: DOM nodes -100
subgraph-mouse-sweep: event listeners -65
subgraph-transition-enter: avg frame time 17ms
subgraph-transition-enter: p95 frame time 17ms
subgraph-transition-enter: layout duration 13ms
subgraph-transition-enter: style recalc duration 31ms
subgraph-transition-enter: layout count 14
subgraph-transition-enter: style recalc count 18
subgraph-transition-enter: task duration 771ms
subgraph-transition-enter: script duration 28ms
subgraph-transition-enter: TBT 147ms
subgraph-transition-enter: heap used 93.1 MB
subgraph-transition-enter: DOM nodes 13673
subgraph-transition-enter: event listeners 2369
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 37ms
viewport-pan-sweep: layout count 0
viewport-pan-sweep: style recalc count 250
viewport-pan-sweep: task duration 3787ms
viewport-pan-sweep: script duration 1248ms
viewport-pan-sweep: TBT 0ms
viewport-pan-sweep: heap used 71.4 MB
viewport-pan-sweep: DOM nodes -267
viewport-pan-sweep: event listeners -114
vue-large-graph-idle: avg frame time 17ms
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 12525ms
vue-large-graph-idle: script duration 582ms
vue-large-graph-idle: TBT 0ms
vue-large-graph-idle: heap used 160.8 MB
vue-large-graph-idle: DOM nodes -8311
vue-large-graph-idle: event listeners -16385
vue-large-graph-pan: avg frame time 17ms
vue-large-graph-pan: p95 frame time 17ms
vue-large-graph-pan: layout duration 0ms
vue-large-graph-pan: style recalc duration 13ms
vue-large-graph-pan: layout count 0
vue-large-graph-pan: style recalc count 83
vue-large-graph-pan: task duration 15651ms
vue-large-graph-pan: script duration 871ms
vue-large-graph-pan: TBT 14ms
vue-large-graph-pan: heap used 173.2 MB
vue-large-graph-pan: DOM nodes -8311
vue-large-graph-pan: event listeners -16385
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 17
workflow-execution: task duration 116ms
workflow-execution: script duration 10ms
workflow-execution: TBT 0ms
workflow-execution: heap used 49.8 MB
workflow-execution: DOM nodes 137
workflow-execution: event listeners 66
Raw data
{
  "timestamp": "2026-07-18T00:15:11.867Z",
  "gitSha": "3eccadf0522f678d03e75e0b583d06a335585cfd",
  "branch": "fix/widget-store-type-reconcile",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2111.684999999994,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 11.762,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 534.033,
      "heapDeltaBytes": -19182428,
      "heapUsedBytes": 49601308,
      "domNodes": -264,
      "jsHeapTotalBytes": 19017728,
      "scriptDurationMs": 17.971999999999998,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-idle",
      "durationMs": 2012.584000000004,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 8.681,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 400.2129999999999,
      "heapDeltaBytes": -23019876,
      "heapUsedBytes": 46072856,
      "domNodes": -266,
      "jsHeapTotalBytes": 19279872,
      "scriptDurationMs": 15.745,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1856.6549999999893,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 41.102,
      "layouts": 12,
      "layoutDurationMs": 3.73,
      "taskDurationMs": 814.451,
      "heapDeltaBytes": -15265988,
      "heapUsedBytes": 53692920,
      "domNodes": -265,
      "jsHeapTotalBytes": 20066304,
      "scriptDurationMs": 123.71600000000002,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1858.5919999999874,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 40.574,
      "layouts": 12,
      "layoutDurationMs": 3.697,
      "taskDurationMs": 817.8689999999999,
      "heapDeltaBytes": -14499908,
      "heapUsedBytes": 54386808,
      "domNodes": -265,
      "jsHeapTotalBytes": 19804160,
      "scriptDurationMs": 128.343,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1726.7350000000192,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 17.522999999999996,
      "layouts": 6,
      "layoutDurationMs": 0.626,
      "taskDurationMs": 368.36199999999997,
      "heapDeltaBytes": 7398244,
      "heapUsedBytes": 76131140,
      "domNodes": 78,
      "jsHeapTotalBytes": 19677184,
      "scriptDurationMs": 25.284000000000002,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1739.328999999998,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 15.925000000000002,
      "layouts": 6,
      "layoutDurationMs": 0.6099999999999999,
      "taskDurationMs": 290.877,
      "heapDeltaBytes": 7564364,
      "heapUsedBytes": 76445460,
      "domNodes": 79,
      "jsHeapTotalBytes": 19152896,
      "scriptDurationMs": 16.241,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 545.9010000000148,
      "styleRecalcs": 13,
      "styleRecalcDurationMs": 9.221,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 327.42699999999996,
      "heapDeltaBytes": -11905240,
      "heapUsedBytes": 56882504,
      "domNodes": 22,
      "jsHeapTotalBytes": 19677184,
      "scriptDurationMs": 55.852,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 578.314999999975,
      "styleRecalcs": 12,
      "styleRecalcDurationMs": 8.522000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 344.10400000000004,
      "heapDeltaBytes": -11588516,
      "heapUsedBytes": 57176584,
      "domNodes": 20,
      "jsHeapTotalBytes": 19939328,
      "scriptDurationMs": 57.394,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2033.2629999999767,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 8.602000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 548.081,
      "heapDeltaBytes": 4947972,
      "heapUsedBytes": 64117796,
      "domNodes": -267,
      "jsHeapTotalBytes": 4145152,
      "scriptDurationMs": 91.60499999999999,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2054.3069999999943,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 9.623,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 529.822,
      "heapDeltaBytes": 5827928,
      "heapUsedBytes": 65155920,
      "domNodes": -263,
      "jsHeapTotalBytes": 5455872,
      "scriptDurationMs": 90.33000000000001,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2178.1969999999546,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 16.274,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1106.896,
      "heapDeltaBytes": -76132,
      "heapUsedBytes": 61817108,
      "domNodes": -267,
      "jsHeapTotalBytes": 5398528,
      "scriptDurationMs": 392.69899999999996,
      "eventListeners": -127,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2178.5320000000183,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 15.615,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1134.382,
      "heapDeltaBytes": 1684028,
      "heapUsedBytes": 61749708,
      "domNodes": -269,
      "jsHeapTotalBytes": 5136384,
      "scriptDurationMs": 413.038,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3181.1460000000125,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 15.305000000000003,
      "layouts": 60,
      "layoutDurationMs": 7.323999999999999,
      "taskDurationMs": 1394.406,
      "heapDeltaBytes": -3882252,
      "heapUsedBytes": 57966204,
      "domNodes": -272,
      "jsHeapTotalBytes": 8601600,
      "scriptDurationMs": 517.231,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3177.707000000055,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 15.172999999999998,
      "layouts": 60,
      "layoutDurationMs": 7.302000000000001,
      "taskDurationMs": 1384.429,
      "heapDeltaBytes": -3013616,
      "heapUsedBytes": 58930884,
      "domNodes": -273,
      "jsHeapTotalBytes": 7815168,
      "scriptDurationMs": 510.625,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2026.034999999979,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 9.069999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 597.826,
      "heapDeltaBytes": 5535204,
      "heapUsedBytes": 66584488,
      "domNodes": -267,
      "jsHeapTotalBytes": 4407296,
      "scriptDurationMs": 101.89,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2022.3300000000108,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 8.866000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 521.6859999999999,
      "heapDeltaBytes": 4714628,
      "heapUsedBytes": 65979436,
      "domNodes": -267,
      "jsHeapTotalBytes": 5455872,
      "scriptDurationMs": 87.04899999999999,
      "eventListeners": -129,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 596.7850000000112,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 10.758000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 374.09700000000004,
      "heapDeltaBytes": -11610280,
      "heapUsedBytes": 57567728,
      "domNodes": 18,
      "jsHeapTotalBytes": 21250048,
      "scriptDurationMs": 122.33700000000002,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 559.0180000000373,
      "styleRecalcs": 48,
      "styleRecalcDurationMs": 11.309,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 368.437,
      "heapDeltaBytes": -11449616,
      "heapUsedBytes": 57499364,
      "domNodes": 22,
      "jsHeapTotalBytes": 20987904,
      "scriptDurationMs": 122.057,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2033.7859999999637,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.914000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 399.236,
      "heapDeltaBytes": -20561132,
      "heapUsedBytes": 48395564,
      "domNodes": -263,
      "jsHeapTotalBytes": 19279872,
      "scriptDurationMs": 14.57,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2035.2080000000115,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 9.347,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 404.45700000000005,
      "heapDeltaBytes": -22156132,
      "heapUsedBytes": 46932908,
      "domNodes": -263,
      "jsHeapTotalBytes": 19542016,
      "scriptDurationMs": 13.513,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1696.3170000000218,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 37.301,
      "layouts": 16,
      "layoutDurationMs": 3.823,
      "taskDurationMs": 662.6999999999999,
      "heapDeltaBytes": -5214056,
      "heapUsedBytes": 63779116,
      "domNodes": 64,
      "jsHeapTotalBytes": 19415040,
      "scriptDurationMs": 90.599,
      "eventListeners": 4,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1733.3070000000816,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 36.821,
      "layouts": 16,
      "layoutDurationMs": 4.252000000000001,
      "taskDurationMs": 743.514,
      "heapDeltaBytes": -21613800,
      "heapUsedBytes": 47366136,
      "domNodes": -264,
      "jsHeapTotalBytes": 19017728,
      "scriptDurationMs": 96.374,
      "eventListeners": -133,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 982.8510000000392,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 30.67299999999999,
      "layouts": 14,
      "layoutDurationMs": 13.291999999999998,
      "taskDurationMs": 771.269,
      "heapDeltaBytes": 27492780,
      "heapUsedBytes": 97613076,
      "domNodes": 13673,
      "jsHeapTotalBytes": 16777216,
      "scriptDurationMs": 27.932000000000013,
      "eventListeners": 2369,
      "totalBlockingTimeMs": 147,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8182.201000000021,
      "styleRecalcs": 250,
      "styleRecalcDurationMs": 37.932,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3865.613,
      "heapDeltaBytes": 15942348,
      "heapUsedBytes": 74928484,
      "domNodes": -268,
      "jsHeapTotalBytes": 6447104,
      "scriptDurationMs": 1251.541,
      "eventListeners": -115,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8161.080999999967,
      "styleRecalcs": 249,
      "styleRecalcDurationMs": 36.614000000000004,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 3707.6019999999994,
      "heapDeltaBytes": 15404968,
      "heapUsedBytes": 74757148,
      "domNodes": -266,
      "jsHeapTotalBytes": 6447104,
      "scriptDurationMs": 1244.988,
      "eventListeners": -113,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 12980.31800000001,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12966.051,
      "heapDeltaBytes": -46722668,
      "heapUsedBytes": 167591460,
      "domNodes": -8311,
      "jsHeapTotalBytes": -12521472,
      "scriptDurationMs": 603.185,
      "eventListeners": -16384,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.77333333333336,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 12108.009000000038,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 12084.327,
      "heapDeltaBytes": -40885096,
      "heapUsedBytes": 169589556,
      "domNodes": -8311,
      "jsHeapTotalBytes": -10948608,
      "scriptDurationMs": 561.3459999999999,
      "eventListeners": -16386,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.220000000000073,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 15768.554999999993,
      "styleRecalcs": 83,
      "styleRecalcDurationMs": 13.61000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 15744.434,
      "heapDeltaBytes": -29670308,
      "heapUsedBytes": 179158228,
      "domNodes": -8311,
      "jsHeapTotalBytes": -16539648,
      "scriptDurationMs": 849.905,
      "eventListeners": -16386,
      "totalBlockingTimeMs": 9,
      "frameDurationMs": 17.219999999999953,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 15598.930999999993,
      "styleRecalcs": 82,
      "styleRecalcDurationMs": 12.191000000000008,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 15557.081,
      "heapDeltaBytes": -16967024,
      "heapUsedBytes": 184007176,
      "domNodes": -8311,
      "jsHeapTotalBytes": -13656064,
      "scriptDurationMs": 891.849,
      "eventListeners": -16384,
      "totalBlockingTimeMs": 19,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.80000000000291
    },
    {
      "name": "workflow-execution",
      "durationMs": 490.73800000002166,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 24.366,
      "layouts": 3,
      "layoutDurationMs": 1.4549999999999998,
      "taskDurationMs": 126.221,
      "heapDeltaBytes": -15604532,
      "heapUsedBytes": 52682236,
      "domNodes": 154,
      "jsHeapTotalBytes": 6307840,
      "scriptDurationMs": 11.257000000000001,
      "eventListeners": 67,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 448.4429999999975,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 19.158,
      "layouts": 2,
      "layoutDurationMs": 0.42599999999999993,
      "taskDurationMs": 105.02099999999999,
      "heapDeltaBytes": -16401916,
      "heapUsedBytes": 51706668,
      "domNodes": 119,
      "jsHeapTotalBytes": 7094272,
      "scriptDurationMs": 9.073,
      "eventListeners": 65,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    }
  ]
}

@github-actions

Copy link
Copy Markdown

🎨 Storybook: 🚧 Building...

@codecov

codecov Bot commented Jul 17, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@                          Coverage Diff                           @@
##           fix/widget-store-custom-node-widgets   #13774    +/-   ##
======================================================================
  Coverage                                 78.29%   78.29%            
======================================================================
  Files                                      1683     1683            
  Lines                                     98527    98514    -13     
  Branches                                  35479    34808   -671     
======================================================================
- Hits                                      77141    77134     -7     
+ Misses                                    20921    20915     -6     
  Partials                                    465      465            
Flag Coverage Δ
unit 67.24% <100.00%> (-0.01%) ⬇️

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

Files with missing lines Coverage Δ
src/stores/widgetValueStore.ts 100.00% <100.00%> (ø)

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

registerWidget returned the existing store entry unconditionally, so when a
subgraph convert reused a graphId:nodeId:name key for a different widget, the
stale entry won and the widget rendered with the wrong type (a multiline text
widget showed as an int widget until a page reload rehydrated the store).

Keep the idempotent return only when the existing entry's type matches; on a
type mismatch the id now belongs to a different widget, so overwrite with the
live type and value. Same-type re-registration still preserves edited values.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@christian-byrne
christian-byrne force-pushed the fix/widget-store-type-reconcile branch from 3488996 to dc3e229 Compare July 18, 2026 00:03

@AustinMroz AustinMroz left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I recall arguing against having registrations that don't actually perform registration, but I allowed it through.

This fix is objectively safer and has my approval.

@AustinMroz AustinMroz added needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch core/1.47 Backport PRs for core 1.47 cloud/1.47 Backport PRs for cloud 1.47 labels Jul 18, 2026
@AustinMroz
AustinMroz marked this pull request as ready for review July 18, 2026 01:56
@dosubot dosubot Bot added the size:XS This PR changes 0-9 lines, ignoring generated files. label Jul 18, 2026
@AustinMroz
AustinMroz merged commit 1b5e292 into fix/widget-store-custom-node-widgets Jul 18, 2026
82 of 84 checks passed
@AustinMroz
AustinMroz deleted the fix/widget-store-type-reconcile branch July 18, 2026 01:56
@github-actions github-actions Bot locked and limited conversation to collaborators Jul 18, 2026
@AustinMroz AustinMroz removed needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch core/1.47 Backport PRs for core 1.47 cloud/1.47 Backport PRs for cloud 1.47 labels Jul 18, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

size:XS This PR changes 0-9 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants