Skip to content

test: pin LLink spread-copy topology loss as it.fails - #15597

Merged
DrJKL merged 3 commits into
feature/ecs-migrationfrom
cb__llink-spread-test
Aug 22, 2026
Merged

test: pin LLink spread-copy topology loss as it.fails#15597
DrJKL merged 3 commits into
feature/ecs-migrationfrom
cb__llink-spread-test

Conversation

@christian-byrne

Copy link
Copy Markdown
Contributor

Summary

{ ...graph.links[id] } loses every topology field on this branch, and there was no test for it. This adds the LLink half of the failure class node/legacySlotLinkMutations.test.ts already pins for slots.

Changes

  • What: src/lib/litegraph/src/LLink.spreadCopy.test.ts — two it.fails cases asserting the behaviour we want, so they flip green when a fix lands.
    1. A spread copy of a link carries id, type, origin_id, origin_slot, target_id, target_slot.
    2. The realistic consequence: snapshot outgoing links as spread copies, disconnectOutput, reconnect the far ends from the copies, and the downstream nodes are still wired.

LLink went from 16 own-field declarations at merge-base 6532665db9 to 12 at head, with the six topology fields becoming prototype accessors over _state and zero defineProperty calls. Prototype accessors are not own properties, so spread copies nothing.

Case 2 is the shape ComfyUI-Custom-Scripts uses in "Add Clip Skip" and "Add LoRA" (web/js/quickNodes.js:132, :156-157): the user's downstream wiring is disconnected and never restored. Filed as #15594.

Only case 1 proves the mechanism. Case 2 is what a user reports.

Review Focus

Mutation numbers. Scratch edit defining the six fields as own enumerable accessors in the LLink constructor, then reverted:

run test files tests
baseline 85 passed 1261 passed, 6 expected fail
mutated 1 failed, 84 passed 2 failed, 1261 passed, 4 expected fail
reverted 85 passed 1261 passed, 6 expected fail

The 2 failures are exactly the 2 new cases, failing with Expect test to fail. Nothing else moved.

Corpus: 1 of 29 local packs, 3 call sites — all in ComfyUI-Custom-Scripts. Measured over 157 frontend pack files, control /registerExtension/ → 84 files. Widened to Object.assign({}, link), structuredClone, and JSON.parse(JSON.stringify(...)) on link-named identifiers: 0 additional. This bounds #15594 rather than broadening it — the idiom is rare, but the one pack using it is widely installed.

vue-tsc already knows. The first draft typed the copies as the spread's inferred type and produced 8 TS2339 errors — TypeScript models the accessors as dropped. The committed version uses Partial<LLink>, which is what a JS caller actually holds. Typecheck at 8GB: 0 errors in the new file (1494 → 1486 total, the 8 removed are mine).

The file carries // oxlint-disable no-misused-spread — that rule fires on exactly the pattern under test.

Refs #15594

@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: b2fb9184-cf4a-44b6-8a68-4f3e6be32777

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, 05:26:30 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.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 63.8 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.2 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.4 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 59.0 MB heap
large-graph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.0 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 8ms TBT · 87.5 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 76.7 MB heap
legacy-node-drag: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.8 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.6 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 83.4 MB heap
subgraph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.0 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 75.2 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 117ms TBT · 78.7 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 2ms TBT · 87.9 MB heap
vue-large-graph-idle: · 56.2 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 161.2 MB heap
vue-large-graph-pan: · 56.3 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 70ms TBT · 158.0 MB heap
workflow-execution: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 67.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 6ms
canvas-idle: layout count 0
canvas-idle: style recalc count 8
canvas-idle: task duration 495ms
canvas-idle: script duration 9ms
canvas-idle: TBT 0ms
canvas-idle: heap used 63.8 MB
canvas-idle: DOM nodes -282
canvas-idle: event listeners -155
canvas-mouse-sweep: avg frame time 17ms
canvas-mouse-sweep: p95 frame time 17ms
canvas-mouse-sweep: layout duration 4ms
canvas-mouse-sweep: style recalc duration 40ms
canvas-mouse-sweep: layout count 12
canvas-mouse-sweep: style recalc count 79
canvas-mouse-sweep: task duration 1279ms
canvas-mouse-sweep: script duration 164ms
canvas-mouse-sweep: TBT 0ms
canvas-mouse-sweep: heap used 69.2 MB
canvas-mouse-sweep: DOM nodes -281
canvas-mouse-sweep: event listeners -156
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 14ms
canvas-zoom-sweep: layout count 6
canvas-zoom-sweep: style recalc count 31
canvas-zoom-sweep: task duration 333ms
canvas-zoom-sweep: script duration 10ms
canvas-zoom-sweep: TBT 0ms
canvas-zoom-sweep: heap used 69.4 MB
canvas-zoom-sweep: DOM nodes 74
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 6ms
dom-widget-clipping: layout count 0
dom-widget-clipping: style recalc count 10
dom-widget-clipping: task duration 413ms
dom-widget-clipping: script duration 34ms
dom-widget-clipping: TBT 0ms
dom-widget-clipping: heap used 59.0 MB
dom-widget-clipping: DOM nodes 16
dom-widget-clipping: event listeners 1
large-graph-idle: avg frame time 17ms
large-graph-idle: p95 frame time 17ms
large-graph-idle: layout duration 0ms
large-graph-idle: style recalc duration 5ms
large-graph-idle: layout count 0
large-graph-idle: style recalc count 6
large-graph-idle: task duration 572ms
large-graph-idle: script duration 36ms
large-graph-idle: TBT 0ms
large-graph-idle: heap used 67.0 MB
large-graph-idle: DOM nodes -275
large-graph-idle: event listeners -155
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 11ms
large-graph-pan: layout count 0
large-graph-pan: style recalc count 65
large-graph-pan: task duration 2497ms
large-graph-pan: script duration 896ms
large-graph-pan: TBT 8ms
large-graph-pan: heap used 87.5 MB
large-graph-pan: DOM nodes -279
large-graph-pan: event listeners -166
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 66
large-graph-zoom: task duration 2507ms
large-graph-zoom: script duration 852ms
large-graph-zoom: TBT 0ms
large-graph-zoom: heap used 76.7 MB
large-graph-zoom: DOM nodes -250
large-graph-zoom: event listeners -163
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 41
legacy-node-drag: task duration 2038ms
legacy-node-drag: script duration 208ms
legacy-node-drag: TBT 0ms
legacy-node-drag: heap used 71.8 MB
legacy-node-drag: DOM nodes -145
legacy-node-drag: event listeners 109
minimap-idle: avg frame time 17ms
minimap-idle: p95 frame time 17ms
minimap-idle: layout duration 0ms
minimap-idle: style recalc duration 3ms
minimap-idle: layout count 0
minimap-idle: style recalc count 3
minimap-idle: task duration 478ms
minimap-idle: script duration 36ms
minimap-idle: TBT 0ms
minimap-idle: heap used 67.6 MB
minimap-idle: DOM nodes -275
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 10ms
subgraph-dom-widget-clipping: layout count 0
subgraph-dom-widget-clipping: style recalc count 47
subgraph-dom-widget-clipping: task duration 496ms
subgraph-dom-widget-clipping: script duration 133ms
subgraph-dom-widget-clipping: TBT 0ms
subgraph-dom-widget-clipping: heap used 83.4 MB
subgraph-dom-widget-clipping: DOM nodes 20
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 7ms
subgraph-idle: layout count 0
subgraph-idle: style recalc count 9
subgraph-idle: task duration 471ms
subgraph-idle: script duration 7ms
subgraph-idle: TBT 0ms
subgraph-idle: heap used 69.0 MB
subgraph-idle: DOM nodes -294
subgraph-idle: event listeners -216
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 34ms
subgraph-mouse-sweep: layout count 16
subgraph-mouse-sweep: style recalc count 78
subgraph-mouse-sweep: task duration 1081ms
subgraph-mouse-sweep: script duration 106ms
subgraph-mouse-sweep: TBT 0ms
subgraph-mouse-sweep: heap used 75.2 MB
subgraph-mouse-sweep: DOM nodes -297
subgraph-mouse-sweep: event listeners -233
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 30ms
subgraph-transition-enter: layout count 14
subgraph-transition-enter: style recalc count 19
subgraph-transition-enter: task duration 895ms
subgraph-transition-enter: script duration 26ms
subgraph-transition-enter: TBT 117ms
subgraph-transition-enter: heap used 78.7 MB
subgraph-transition-enter: DOM nodes 13671
subgraph-transition-enter: event listeners 2383
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 38ms
viewport-pan-sweep: layout count 0
viewport-pan-sweep: style recalc count 247
viewport-pan-sweep: task duration 8781ms
viewport-pan-sweep: script duration 3038ms
viewport-pan-sweep: TBT 2ms
viewport-pan-sweep: heap used 87.9 MB
viewport-pan-sweep: DOM nodes -281
viewport-pan-sweep: event listeners -144
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 16722ms
vue-large-graph-idle: script duration 347ms
vue-large-graph-idle: TBT 0ms
vue-large-graph-idle: heap used 161.2 MB
vue-large-graph-idle: DOM nodes -6548
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 177
vue-large-graph-pan: task duration 21073ms
vue-large-graph-pan: script duration 892ms
vue-large-graph-pan: TBT 70ms
vue-large-graph-pan: heap used 158.0 MB
vue-large-graph-pan: DOM nodes -6548
vue-large-graph-pan: event listeners -7470
workflow-execution: avg frame time 17ms
workflow-execution: p95 frame time 17ms
workflow-execution: layout duration 1ms
workflow-execution: style recalc duration 19ms
workflow-execution: layout count 6
workflow-execution: style recalc count 14
workflow-execution: task duration 106ms
workflow-execution: script duration 6ms
workflow-execution: TBT 0ms
workflow-execution: heap used 67.8 MB
workflow-execution: DOM nodes 128
workflow-execution: event listeners 74
Raw data
{
  "timestamp": "2026-08-22T04:41:07.148Z",
  "gitSha": "85a51797790d84cbc6f8008c249be1bb42e1d60e",
  "branch": "cb__llink-spread-test",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2051.3229999999967,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 5.390000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 478.233,
      "heapDeltaBytes": -13828240,
      "heapUsedBytes": 55150320,
      "domNodes": -282,
      "jsHeapTotalBytes": 4972544,
      "scriptDurationMs": 7.83,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "canvas-idle",
      "durationMs": 2072.749999999928,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 6.161000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 511.44100000000003,
      "heapDeltaBytes": 9447396,
      "heapUsedBytes": 78742008,
      "domNodes": -281,
      "jsHeapTotalBytes": 5234688,
      "scriptDurationMs": 11.135,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2353.827999999993,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 41.535999999999994,
      "layouts": 12,
      "layoutDurationMs": 3.8420000000000005,
      "taskDurationMs": 1381.802,
      "heapDeltaBytes": 3073232,
      "heapUsedBytes": 71824916,
      "domNodes": -283,
      "jsHeapTotalBytes": 5758976,
      "scriptDurationMs": 185.659,
      "eventListeners": -157,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2158.0490000000054,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 38.528000000000006,
      "layouts": 12,
      "layoutDurationMs": 3.797,
      "taskDurationMs": 1175.927,
      "heapDeltaBytes": 4177352,
      "heapUsedBytes": 73322724,
      "domNodes": -279,
      "jsHeapTotalBytes": 6545408,
      "scriptDurationMs": 141.88299999999998,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1711.232999999993,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 13.306999999999999,
      "layouts": 6,
      "layoutDurationMs": 0.6309999999999999,
      "taskDurationMs": 328.577,
      "heapDeltaBytes": 3621476,
      "heapUsedBytes": 72754424,
      "domNodes": 73,
      "jsHeapTotalBytes": 5242880,
      "scriptDurationMs": 10.222,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1717.9439999999886,
      "styleRecalcs": 30,
      "styleRecalcDurationMs": 14.427999999999997,
      "layouts": 6,
      "layoutDurationMs": 0.631,
      "taskDurationMs": 337.11499999999995,
      "heapDeltaBytes": 3800784,
      "heapUsedBytes": 72730140,
      "domNodes": 74,
      "jsHeapTotalBytes": 5242880,
      "scriptDurationMs": 9.928999999999998,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 704.589999999996,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 6.5150000000000015,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 405.13000000000005,
      "heapDeltaBytes": -7057056,
      "heapUsedBytes": 61936616,
      "domNodes": 16,
      "jsHeapTotalBytes": 5242880,
      "scriptDurationMs": 31.387999999999998,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 737.2169999999869,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 6.292000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 419.993,
      "heapDeltaBytes": -6866636,
      "heapUsedBytes": 61894124,
      "domNodes": 16,
      "jsHeapTotalBytes": 5767168,
      "scriptDurationMs": 36.849,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2089.711999999963,
      "styleRecalcs": 5,
      "styleRecalcDurationMs": 4.397,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 585.5620000000001,
      "heapDeltaBytes": -19121712,
      "heapUsedBytes": 71391548,
      "domNodes": -273,
      "jsHeapTotalBytes": -528384,
      "scriptDurationMs": 37.660000000000004,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2054.363999999964,
      "styleRecalcs": 6,
      "styleRecalcDurationMs": 5.193,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 558.899,
      "heapDeltaBytes": -21082540,
      "heapUsedBytes": 69210228,
      "domNodes": -277,
      "jsHeapTotalBytes": -528384,
      "scriptDurationMs": 34.042,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-pan",
      "durationMs": 3236.344000000031,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 10.96,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2489.438,
      "heapDeltaBytes": -5365148,
      "heapUsedBytes": 85448216,
      "domNodes": -273,
      "jsHeapTotalBytes": 1007616,
      "scriptDurationMs": 886.241,
      "eventListeners": -151,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 3263.9090000000124,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 10.727999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2505.333,
      "heapDeltaBytes": 13487820,
      "heapUsedBytes": 97980336,
      "domNodes": -284,
      "jsHeapTotalBytes": 4640768,
      "scriptDurationMs": 905.172,
      "eventListeners": -181,
      "totalBlockingTimeMs": 16,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 4312.301999999989,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 11.76,
      "layouts": 60,
      "layoutDurationMs": 7.698,
      "taskDurationMs": 2504.432,
      "heapDeltaBytes": 595540,
      "heapUsedBytes": 72778240,
      "domNodes": -263,
      "jsHeapTotalBytes": -1351680,
      "scriptDurationMs": 852.9590000000001,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 4367.896000000087,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 11.883999999999999,
      "layouts": 60,
      "layoutDurationMs": 7.823,
      "taskDurationMs": 2509.264,
      "heapDeltaBytes": 15817808,
      "heapUsedBytes": 88171492,
      "domNodes": -236,
      "jsHeapTotalBytes": -565248,
      "scriptDurationMs": 851.9879999999999,
      "eventListeners": -179,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 3254.6140000000037,
      "styleRecalcs": 41,
      "styleRecalcDurationMs": 5.7769999999999975,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2045.1819999999996,
      "heapDeltaBytes": -1590964,
      "heapUsedBytes": 69987928,
      "domNodes": -289,
      "jsHeapTotalBytes": -565248,
      "scriptDurationMs": 217.302,
      "eventListeners": 29,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 3159.856999999988,
      "styleRecalcs": 41,
      "styleRecalcDurationMs": 5.747000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2030.164,
      "heapDeltaBytes": 13124608,
      "heapUsedBytes": 80510344,
      "domNodes": 0,
      "jsHeapTotalBytes": 1990656,
      "scriptDurationMs": 198.052,
      "eventListeners": 188,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2027.7550000000133,
      "styleRecalcs": 3,
      "styleRecalcDurationMs": 2.349,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 514.77,
      "heapDeltaBytes": -19819136,
      "heapUsedBytes": 72893520,
      "domNodes": -272,
      "jsHeapTotalBytes": -2363392,
      "scriptDurationMs": 36.185,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 2031.5970000000334,
      "styleRecalcs": 3,
      "styleRecalcDurationMs": 2.9680000000000017,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 440.83399999999995,
      "heapDeltaBytes": -22453344,
      "heapUsedBytes": 68895532,
      "domNodes": -278,
      "jsHeapTotalBytes": 2617344,
      "scriptDurationMs": 36.324000000000005,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 698.8789999999767,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 9.471,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 493.66900000000004,
      "heapDeltaBytes": 17893244,
      "heapUsedBytes": 87401804,
      "domNodes": 20,
      "jsHeapTotalBytes": 5767168,
      "scriptDurationMs": 133.094,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 707.6799999999821,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 9.871999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 498.68500000000006,
      "heapDeltaBytes": 17843180,
      "heapUsedBytes": 87504444,
      "domNodes": 20,
      "jsHeapTotalBytes": 5242880,
      "scriptDurationMs": 133.404,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2019.7630000000117,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 5.9190000000000005,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 473.159,
      "heapDeltaBytes": 4040600,
      "heapUsedBytes": 66725428,
      "domNodes": -295,
      "jsHeapTotalBytes": 4448256,
      "scriptDurationMs": 6.994999999999999,
      "eventListeners": -231,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2018.0239999999685,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.223999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 468.96000000000004,
      "heapDeltaBytes": 8311400,
      "heapUsedBytes": 78048140,
      "domNodes": -293,
      "jsHeapTotalBytes": 4448256,
      "scriptDurationMs": 6.544000000000001,
      "eventListeners": -201,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1888.6099999999715,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 33.617000000000004,
      "layouts": 16,
      "layoutDurationMs": 4.339,
      "taskDurationMs": 1085.397,
      "heapDeltaBytes": 7641592,
      "heapUsedBytes": 77486164,
      "domNodes": -296,
      "jsHeapTotalBytes": 6545408,
      "scriptDurationMs": 106.445,
      "eventListeners": -233,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1847.454999999968,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 34.603,
      "layouts": 16,
      "layoutDurationMs": 4.342,
      "taskDurationMs": 1075.8799999999999,
      "heapDeltaBytes": 10346248,
      "heapUsedBytes": 80237568,
      "domNodes": -297,
      "jsHeapTotalBytes": 5496832,
      "scriptDurationMs": 106.116,
      "eventListeners": -233,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1391.183999999953,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 29.863000000000007,
      "layouts": 14,
      "layoutDurationMs": 13.030000000000001,
      "taskDurationMs": 895.0920000000002,
      "heapDeltaBytes": -7428784,
      "heapUsedBytes": 82572296,
      "domNodes": 13671,
      "jsHeapTotalBytes": 10747904,
      "scriptDurationMs": 26.490999999999993,
      "eventListeners": 2383,
      "totalBlockingTimeMs": 117,
      "frameDurationMs": 16.666666666666696,
      "p95FrameDurationMs": 16.80000000000109
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 12315.49799999999,
      "styleRecalcs": 247,
      "styleRecalcDurationMs": 38.454,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 8862.928,
      "heapDeltaBytes": 673184,
      "heapUsedBytes": 91419788,
      "domNodes": -282,
      "jsHeapTotalBytes": 4644864,
      "scriptDurationMs": 3050.554,
      "eventListeners": -129,
      "totalBlockingTimeMs": 4,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 12293.847000000027,
      "styleRecalcs": 247,
      "styleRecalcDurationMs": 37.57000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 8698.268,
      "heapDeltaBytes": 9418872,
      "heapUsedBytes": 92915340,
      "domNodes": -280,
      "jsHeapTotalBytes": 5394432,
      "scriptDurationMs": 3024.5829999999996,
      "eventListeners": -159,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 17406.724,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16793.424000000003,
      "heapDeltaBytes": -55260100,
      "heapUsedBytes": 162333864,
      "domNodes": -6548,
      "jsHeapTotalBytes": -2863104,
      "scriptDurationMs": 329.94900000000007,
      "eventListeners": -7473,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 17212.274999999976,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 16650.464,
      "heapDeltaBytes": -35946236,
      "heapUsedBytes": 175636352,
      "domNodes": -6548,
      "jsHeapTotalBytes": -3788800,
      "scriptDurationMs": 363.508,
      "eventListeners": -7473,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.780000000000047,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 21236.218000000008,
      "styleRecalcs": 173,
      "styleRecalcDurationMs": 18.66599999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 20932.619,
      "heapDeltaBytes": -43046444,
      "heapUsedBytes": 162358176,
      "domNodes": -6548,
      "jsHeapTotalBytes": 512000,
      "scriptDurationMs": 877.7810000000001,
      "eventListeners": -7471,
      "totalBlockingTimeMs": 48,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 21599.220999999943,
      "styleRecalcs": 180,
      "styleRecalcDurationMs": 19.910999999999984,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 21212.807999999997,
      "heapDeltaBytes": -44520792,
      "heapUsedBytes": 169001584,
      "domNodes": -6548,
      "jsHeapTotalBytes": -2891776,
      "scriptDurationMs": 906.572,
      "eventListeners": -7469,
      "totalBlockingTimeMs": 91,
      "frameDurationMs": 17.773333333333238,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 111.66199999991022,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 14.918999999999999,
      "layouts": 2,
      "layoutDurationMs": 0.591,
      "taskDurationMs": 78.41799999999999,
      "heapDeltaBytes": 3430760,
      "heapUsedBytes": 69969272,
      "domNodes": 111,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 4.303999999999999,
      "eventListeners": 49,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66666666666665,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "workflow-execution",
      "durationMs": 490.42099999996935,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 22.744,
      "layouts": 9,
      "layoutDurationMs": 2.124,
      "taskDurationMs": 133.397,
      "heapDeltaBytes": 5755736,
      "heapUsedBytes": 72247600,
      "domNodes": 145,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 8.067,
      "eventListeners": 99,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.800000000000182
    }
  ]
}

@github-actions github-actions Bot added the risk:R2 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   #15597   +/-   ##
========================================================
  Coverage                         ?   82.29%           
========================================================
  Files                            ?     1900           
  Lines                            ?   107659           
  Branches                         ?    33595           
========================================================
  Hits                             ?    88594           
  Misses                           ?    18730           
  Partials                         ?      335           
Flag Coverage Δ
e2e 67.97% <ø> (?)
unit 73.90% <ø> (?)

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

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

LLink's topology fields are prototype accessors over _state, so a spread
copy of a link carries none of them. Covers the LLink half of the failure
class that node/legacySlotLinkMutations.test.ts already pins for slots.

Refs #15594
@DrJKL
DrJKL force-pushed the cb__llink-spread-test branch from e46442b to eef0a47 Compare August 22, 2026 04:28
@DrJKL
DrJKL merged commit fb3b2da into feature/ecs-migration Aug 22, 2026
68 checks passed
@DrJKL
DrJKL deleted the cb__llink-spread-test branch August 22, 2026 05:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:R2 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.

3 participants