Skip to content

test: reproduce #15577 and #15581 on the ECS branch - #15592

Merged
DrJKL merged 6 commits into
feature/ecs-migrationfrom
cb__repro-15577-15581
Aug 22, 2026
Merged

test: reproduce #15577 and #15581 on the ECS branch#15592
DrJKL merged 6 commits into
feature/ecs-migrationfrom
cb__repro-15577-15581

Conversation

@christian-byrne

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

Copy link
Copy Markdown
Contributor

Both #15577 and #15581 reproduce on this branch, and #15577 is reachable through files today's shipping frontend already saves. Seven it.fails assertions state the wanted behaviour; ten controls keep them from passing for the wrong reason.

#15577 — reachable, and it re-wires the node

normalizeConfiguredTopology keys duplicates on target_id:target_slot and keeps data.links[first] rather than the link input.link names. With two links into one input from different origins, the node comes up fed by a different upstream node than the file names, and nothing is logged.

Reachability, measured rather than argued. Driving rgthree link_fixer's mirror-only creation idiom (output.links.push(id) + input.link = id, no connect()) on main at 32d0b6e202 and serializing produces:

"links":[[1,1,0,3,0,"number"],[2,2,0,3,0,"number"]]
"inputs":[{"name":"input_0","type":"number","link":2}]

That is conflictingOriginLinksRoot byte for byte. The shape is not hypothetical and it persists across every save on main.

Same fixture, both branches:

main 32d0b6e202 this branch 9f6ab9adda
getInputLink(0).origin_id 2, the origin input.link names 1
links at 3:0 2 1

Dropping to one link is correct, the store enforces one link per input. Which one survives is the regression.

This branch closes the producer: the input.link setter ignores id assignment and the output.links view discards additions, so the same idiom now serializes one link. Pinned by discards a link written only through the legacy slot mirrors. Forward-safe, but files saved before the branch ships still load wrong.

Mutation: preferring the input.link-referenced survivor and warning on the drop flips both it.fails to pass, controls unchanged.

The negative control test-cases.md specified does not exist. Re-narrowing the key to the 4-tuple was predicted to leave two links registered and fail the degeneracy control. It does not: the store rejects the second link downstream and the terminal graph state is identical, link count and all. The 4-tuple key and the 2-tuple key are indistinguishable by any assertion on the resulting graph for this fixture. The control that remains proves the fixture is non-degenerate, which is what it is for.

#15581 — reproduces, and the issue's suggested fallback does not fix it

A serialized input whose name has no live counterpart is skipped, keeps its stale target_slot, and the resulting occupied-target rejection breaks the loop, abandoning every remaining move for that node.

Three cases in LGraph.inputSlotRealign.test.ts: configure drops an input, configure renames one, and realignInputLinkSlots called directly on a pre-seeded incumbent. Net effect in cases 1 and 2 is that in_a reports in_c's link and in_b reports in_a's. No has_errors, console.error only.

Two mutations, and they disagree:

Mutation it.fails flipped Controls
Per-link retry after a rejected batch, the issue's fallback 1 of 4 8 green
Blocking incumbents passed to updateEndpoints's removals 4 of 4 8 green

The per-link fallback fails because the collision cascades: link 3 squats slot 0, so link 1 cannot move off slot 1, so link 2 cannot move onto it. Retrying one at a time hits the same wall. Only evicting the stale incumbent clears it. Worth deciding before anyone implements the issue's first suggestion.

Counts

17 tests across the two files: 10 pass, 7 expected fail. The eight pre-existing #3348 tests stay green under both mutations, which is the negative control that the fix does not break what #3348 was filed for.

oxfmt and oxlint --type-aware clean. vue-tsc --noEmit clean for the three files in this diff; the repo-wide count is not meaningful from this worktree, see below.

On typecheck, because it will bite the next person working in a worktree with a borrowed node_modules. The first two pushes carried 10 real type errors that vitest, oxfmt and oxlint --type-aware all passed: nine branded-id mismatches (TS2339, TS2322 on LinkId) and one wrong import path (TS2459). Fixed in 4651215809 and 20039d9e42.

They got through because my local typecheck was lying, in two different ways:

  1. vue-tsc OOMs at the 2GB default heapFATAL ERROR: Ineffective mark-compacts near heap limit, exit 134, after 18 lines. Filtered for errors that reads as zero. Silence from a dead process is indistinguishable from a pass.
  2. The phantom errors are not only TS2688. With NODE_OPTIONS=--max-old-space-size=8192 the run completes at exit 2 with 1418 TS2688 plus 68 TS7006/TS7031/TS7053 implicit-any errors in .vue and .stories.ts — downstream fallout of the broken type roots, not real.

Working recipe: larger heap, confirm exit 2 rather than 134, then grep for your own changed files. Zero for all three files here.

Wider class, filed separately

All three updateEndpoints call sites on this branch swallow rejection into console.error and degrade silently, none marks has_errors, none uses the repo's unified reportError. slotLinks.ts:192 is the worst of them: on rejection it returns [] before node.inputs.splice, so the node keeps its old input layout and the empty return is indistinguishable from "nothing to replace". Follow-ups tracked in the workspace todo.

@dosubot dosubot Bot added the size:M This PR changes 30-99 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: c4fa14ed-7f6c-497c-8d84-6ff26ede07e2

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

🎭 Playwright: 🕵🏻 0 passed, 0 failed

📊 Browser Reports
  • chromium: ❌ Deployment failed
  • chromium-2x: ❌ Deployment failed
  • chromium-0.5x: ❌ Deployment failed
  • mobile-chrome: ❌ Deployment failed

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 08/22/2026, 05:48:29 AM UTC

Links

📦 Bundle Size

⏳ Size data collection in progress…

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 64.8 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 58.7 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.8 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 60.1 MB heap
large-graph-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 65.3 MB heap
large-graph-pan: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 15ms TBT · 77.9 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.2 MB heap
legacy-node-drag: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 77.0 MB heap
minimap-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.7 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 80.0 MB heap
subgraph-idle: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 61.5 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.5 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 129ms TBT · 81.4 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 16ms TBT · 95.7 MB heap
vue-large-graph-idle: · 56.2 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 168.7 MB heap
vue-large-graph-pan: · 56.3 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 52ms TBT · 172.8 MB heap
workflow-execution: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 66.3 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 8
canvas-idle: task duration 479ms
canvas-idle: script duration 8ms
canvas-idle: TBT 0ms
canvas-idle: heap used 64.8 MB
canvas-idle: DOM nodes -283
canvas-idle: event listeners -185
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 80
canvas-mouse-sweep: task duration 1282ms
canvas-mouse-sweep: script duration 169ms
canvas-mouse-sweep: TBT 0ms
canvas-mouse-sweep: heap used 58.7 MB
canvas-mouse-sweep: DOM nodes -281
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 339ms
canvas-zoom-sweep: script duration 10ms
canvas-zoom-sweep: TBT 0ms
canvas-zoom-sweep: heap used 69.8 MB
canvas-zoom-sweep: DOM nodes 76
canvas-zoom-sweep: event listeners 19
dom-widget-clipping: avg frame time 17ms
dom-widget-clipping: p95 frame time 17ms
dom-widget-clipping: layout duration 0ms
dom-widget-clipping: style recalc duration 7ms
dom-widget-clipping: layout count 0
dom-widget-clipping: style recalc count 11
dom-widget-clipping: task duration 425ms
dom-widget-clipping: script duration 32ms
dom-widget-clipping: TBT 0ms
dom-widget-clipping: heap used 60.1 MB
dom-widget-clipping: DOM nodes 17
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 5ms
large-graph-idle: layout count 0
large-graph-idle: style recalc count 6
large-graph-idle: task duration 558ms
large-graph-idle: script duration 34ms
large-graph-idle: TBT 0ms
large-graph-idle: heap used 65.3 MB
large-graph-idle: DOM nodes -279
large-graph-idle: event listeners -184
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 66
large-graph-pan: task duration 2626ms
large-graph-pan: script duration 960ms
large-graph-pan: TBT 15ms
large-graph-pan: heap used 77.9 MB
large-graph-pan: DOM nodes -277
large-graph-pan: event listeners -151
large-graph-zoom: avg frame time 17ms
large-graph-zoom: p95 frame time 17ms
large-graph-zoom: layout duration 7ms
large-graph-zoom: style recalc duration 11ms
large-graph-zoom: layout count 60
large-graph-zoom: style recalc count 66
large-graph-zoom: task duration 2546ms
large-graph-zoom: script duration 902ms
large-graph-zoom: TBT 0ms
large-graph-zoom: heap used 71.2 MB
large-graph-zoom: DOM nodes -105
large-graph-zoom: event listeners -69
legacy-node-drag: avg frame time 17ms
legacy-node-drag: p95 frame time 17ms
legacy-node-drag: layout duration 0ms
legacy-node-drag: style recalc duration 5ms
legacy-node-drag: layout count 0
legacy-node-drag: style recalc count 41
legacy-node-drag: task duration 2025ms
legacy-node-drag: script duration 206ms
legacy-node-drag: TBT 0ms
legacy-node-drag: heap used 77.0 MB
legacy-node-drag: DOM nodes 0
legacy-node-drag: event listeners 188
minimap-idle: avg frame time 17ms
minimap-idle: p95 frame time 17ms
minimap-idle: layout duration 0ms
minimap-idle: style recalc duration 6ms
minimap-idle: layout count 0
minimap-idle: style recalc count 4
minimap-idle: task duration 542ms
minimap-idle: script duration 34ms
minimap-idle: TBT 0ms
minimap-idle: heap used 68.7 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 9ms
subgraph-dom-widget-clipping: layout count 0
subgraph-dom-widget-clipping: style recalc count 45
subgraph-dom-widget-clipping: task duration 494ms
subgraph-dom-widget-clipping: script duration 133ms
subgraph-dom-widget-clipping: TBT 0ms
subgraph-dom-widget-clipping: heap used 80.0 MB
subgraph-dom-widget-clipping: DOM nodes 16
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 7ms
subgraph-idle: layout count 0
subgraph-idle: style recalc count 9
subgraph-idle: task duration 465ms
subgraph-idle: script duration 7ms
subgraph-idle: TBT 0ms
subgraph-idle: heap used 61.5 MB
subgraph-idle: DOM nodes -297
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 35ms
subgraph-mouse-sweep: layout count 16
subgraph-mouse-sweep: style recalc count 75
subgraph-mouse-sweep: task duration 1091ms
subgraph-mouse-sweep: script duration 114ms
subgraph-mouse-sweep: TBT 0ms
subgraph-mouse-sweep: heap used 68.5 MB
subgraph-mouse-sweep: DOM nodes -298
subgraph-mouse-sweep: event listeners -217
subgraph-transition-enter: avg frame time 17ms
subgraph-transition-enter: p95 frame time 17ms
subgraph-transition-enter: layout duration 14ms
subgraph-transition-enter: style recalc duration 31ms
subgraph-transition-enter: layout count 14
subgraph-transition-enter: style recalc count 19
subgraph-transition-enter: task duration 899ms
subgraph-transition-enter: script duration 29ms
subgraph-transition-enter: TBT 129ms
subgraph-transition-enter: heap used 81.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 34ms
viewport-pan-sweep: layout count 0
viewport-pan-sweep: style recalc count 246
viewport-pan-sweep: task duration 9056ms
viewport-pan-sweep: script duration 3201ms
viewport-pan-sweep: TBT 16ms
viewport-pan-sweep: heap used 95.7 MB
viewport-pan-sweep: DOM nodes -279
viewport-pan-sweep: event listeners -129
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 15822ms
vue-large-graph-idle: script duration 303ms
vue-large-graph-idle: TBT 0ms
vue-large-graph-idle: heap used 168.7 MB
vue-large-graph-idle: DOM nodes -6548
vue-large-graph-idle: event listeners -7474
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 17ms
vue-large-graph-pan: layout count 0
vue-large-graph-pan: style recalc count 175
vue-large-graph-pan: task duration 20248ms
vue-large-graph-pan: script duration 892ms
vue-large-graph-pan: TBT 52ms
vue-large-graph-pan: heap used 172.8 MB
vue-large-graph-pan: DOM nodes -6548
vue-large-graph-pan: event listeners -7471
workflow-execution: avg frame time 17ms
workflow-execution: p95 frame time 17ms
workflow-execution: layout duration 1ms
workflow-execution: style recalc duration 21ms
workflow-execution: layout count 3
workflow-execution: style recalc count 15
workflow-execution: task duration 120ms
workflow-execution: script duration 7ms
workflow-execution: TBT 0ms
workflow-execution: heap used 66.3 MB
workflow-execution: DOM nodes 141
workflow-execution: event listeners 73
Raw data
{
  "timestamp": "2026-08-22T05:42:52.423Z",
  "gitSha": "423ca41768cf58b930cdc829565ce7ff25f74abc",
  "branch": "cb__repro-15577-15581",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2036.8299999999806,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 6.984000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 478.87499999999994,
      "heapDeltaBytes": -2113960,
      "heapUsedBytes": 67050132,
      "domNodes": -281,
      "jsHeapTotalBytes": 4972544,
      "scriptDurationMs": 7.610000000000002,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-idle",
      "durationMs": 2051.315999999929,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.212,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 478.279,
      "heapDeltaBytes": -353852,
      "heapUsedBytes": 68808352,
      "domNodes": -284,
      "jsHeapTotalBytes": 4972544,
      "scriptDurationMs": 8.504000000000001,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2318.4699999999907,
      "styleRecalcs": 80,
      "styleRecalcDurationMs": 42.617000000000004,
      "layouts": 12,
      "layoutDurationMs": 3.821,
      "taskDurationMs": 1390.587,
      "heapDeltaBytes": -7342988,
      "heapUsedBytes": 62462124,
      "domNodes": -281,
      "jsHeapTotalBytes": 6545408,
      "scriptDurationMs": 181.517,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2158.02599999995,
      "styleRecalcs": 79,
      "styleRecalcDurationMs": 40.163000000000004,
      "layouts": 12,
      "layoutDurationMs": 3.4259999999999997,
      "taskDurationMs": 1173.2600000000002,
      "heapDeltaBytes": -8597928,
      "heapUsedBytes": 60641424,
      "domNodes": -280,
      "jsHeapTotalBytes": 5496832,
      "scriptDurationMs": 155.79999999999998,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1737.6760000000218,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 16.275,
      "layouts": 6,
      "layoutDurationMs": 0.616,
      "taskDurationMs": 337.06399999999996,
      "heapDeltaBytes": 3750736,
      "heapUsedBytes": 72729600,
      "domNodes": 76,
      "jsHeapTotalBytes": 5505024,
      "scriptDurationMs": 9.914000000000001,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1722.264999999993,
      "styleRecalcs": 32,
      "styleRecalcDurationMs": 15.135,
      "layouts": 6,
      "layoutDurationMs": 0.528,
      "taskDurationMs": 340.034,
      "heapDeltaBytes": 4060240,
      "heapUsedBytes": 73673056,
      "domNodes": 76,
      "jsHeapTotalBytes": 4980736,
      "scriptDurationMs": 10.245,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 745.900000000006,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.018,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 427.859,
      "heapDeltaBytes": -5842824,
      "heapUsedBytes": 63752664,
      "domNodes": 16,
      "jsHeapTotalBytes": 5505024,
      "scriptDurationMs": 32.336999999999996,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 703.9380000001074,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 7.341,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 422.30799999999994,
      "heapDeltaBytes": -6859288,
      "heapUsedBytes": 62337220,
      "domNodes": 18,
      "jsHeapTotalBytes": 5505024,
      "scriptDurationMs": 32.179,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2055.282000000034,
      "styleRecalcs": 6,
      "styleRecalcDurationMs": 5.497,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 555.182,
      "heapDeltaBytes": -21993480,
      "heapUsedBytes": 68546728,
      "domNodes": -275,
      "jsHeapTotalBytes": 3665920,
      "scriptDurationMs": 32.409000000000006,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2073.1969999999365,
      "styleRecalcs": 6,
      "styleRecalcDurationMs": 5.489000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 560.6510000000001,
      "heapDeltaBytes": -21611672,
      "heapUsedBytes": 68496088,
      "domNodes": -282,
      "jsHeapTotalBytes": 3928064,
      "scriptDurationMs": 36.457,
      "eventListeners": -183,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 3295.5269999999928,
      "styleRecalcs": 65,
      "styleRecalcDurationMs": 10.225000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2598.5719999999997,
      "heapDeltaBytes": -5399056,
      "heapUsedBytes": 86032128,
      "domNodes": -274,
      "jsHeapTotalBytes": -40960,
      "scriptDurationMs": 933.09,
      "eventListeners": -151,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.670000000000012,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 3292.3920000000635,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 10.623000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2654.2180000000003,
      "heapDeltaBytes": -13651472,
      "heapUsedBytes": 77429304,
      "domNodes": -280,
      "jsHeapTotalBytes": 1007616,
      "scriptDurationMs": 987.6229999999999,
      "eventListeners": -151,
      "totalBlockingTimeMs": 29,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 4384.21599999998,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 10.652999999999999,
      "layouts": 60,
      "layoutDurationMs": 7.295000000000001,
      "taskDurationMs": 2563.671,
      "heapDeltaBytes": 11465860,
      "heapUsedBytes": 80919744,
      "domNodes": 24,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 918.726,
      "eventListeners": 12,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.80000000000109
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 4390.350000000012,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 10.461000000000002,
      "layouts": 60,
      "layoutDurationMs": 6.745,
      "taskDurationMs": 2528.5800000000004,
      "heapDeltaBytes": -27555832,
      "heapUsedBytes": 68381704,
      "domNodes": -234,
      "jsHeapTotalBytes": 2355200,
      "scriptDurationMs": 884.7429999999999,
      "eventListeners": -149,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 3155.1419999999553,
      "styleRecalcs": 41,
      "styleRecalcDurationMs": 5.19,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2023.679,
      "heapDeltaBytes": 13542568,
      "heapUsedBytes": 80418180,
      "domNodes": 0,
      "jsHeapTotalBytes": 679936,
      "scriptDurationMs": 202.84400000000002,
      "eventListeners": 188,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 3160.109000000034,
      "styleRecalcs": 41,
      "styleRecalcDurationMs": 5.115999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2027.234,
      "heapDeltaBytes": 13641960,
      "heapUsedBytes": 80968332,
      "domNodes": 0,
      "jsHeapTotalBytes": 1204224,
      "scriptDurationMs": 209.61899999999997,
      "eventListeners": 188,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2032.594999999958,
      "styleRecalcs": 4,
      "styleRecalcDurationMs": 3.842999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 528.0339999999999,
      "heapDeltaBytes": -19257424,
      "heapUsedBytes": 73189560,
      "domNodes": -272,
      "jsHeapTotalBytes": -1576960,
      "scriptDurationMs": 34.57900000000001,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2029.9289999999246,
      "styleRecalcs": 3,
      "styleRecalcDurationMs": 8.474000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 555.395,
      "heapDeltaBytes": -21893644,
      "heapUsedBytes": 70811468,
      "domNodes": -277,
      "jsHeapTotalBytes": 3141632,
      "scriptDurationMs": 33.452000000000005,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 699.0749999999935,
      "styleRecalcs": 45,
      "styleRecalcDurationMs": 8.443,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 490.95,
      "heapDeltaBytes": 17582084,
      "heapUsedBytes": 87725700,
      "domNodes": 16,
      "jsHeapTotalBytes": 5505024,
      "scriptDurationMs": 132.287,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 692.5260000000435,
      "styleRecalcs": 45,
      "styleRecalcDurationMs": 9.14,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 496.27500000000003,
      "heapDeltaBytes": 17202888,
      "heapUsedBytes": 80042100,
      "domNodes": 16,
      "jsHeapTotalBytes": 4980736,
      "scriptDurationMs": 133.98,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1990.4599999999846,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 7.247000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 465.973,
      "heapDeltaBytes": -13426312,
      "heapUsedBytes": 56352192,
      "domNodes": -296,
      "jsHeapTotalBytes": 5496832,
      "scriptDurationMs": 6.517,
      "eventListeners": -201,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2017.4630000000207,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 6.983999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 463.494,
      "heapDeltaBytes": 9672324,
      "heapUsedBytes": 72535384,
      "domNodes": -297,
      "jsHeapTotalBytes": 4710400,
      "scriptDurationMs": 6.803,
      "eventListeners": -231,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1823.6190000000079,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 34.166999999999994,
      "layouts": 16,
      "layoutDurationMs": 4.108,
      "taskDurationMs": 1097.9130000000002,
      "heapDeltaBytes": -3380940,
      "heapUsedBytes": 66981508,
      "domNodes": -298,
      "jsHeapTotalBytes": 6545408,
      "scriptDurationMs": 114.48700000000001,
      "eventListeners": -201,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66999999999998,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1824.4320000000016,
      "styleRecalcs": 75,
      "styleRecalcDurationMs": 35.589,
      "layouts": 16,
      "layoutDurationMs": 4.056000000000001,
      "taskDurationMs": 1084.13,
      "heapDeltaBytes": 12769340,
      "heapUsedBytes": 76634580,
      "domNodes": -297,
      "jsHeapTotalBytes": 4972544,
      "scriptDurationMs": 114.454,
      "eventListeners": -233,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1406.466000000023,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 31.251,
      "layouts": 14,
      "layoutDurationMs": 14.355999999999998,
      "taskDurationMs": 899.093,
      "heapDeltaBytes": -7393952,
      "heapUsedBytes": 85350088,
      "domNodes": 13671,
      "jsHeapTotalBytes": 11010048,
      "scriptDurationMs": 28.869000000000007,
      "eventListeners": 2381,
      "totalBlockingTimeMs": 129,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 12349.46100000002,
      "styleRecalcs": 246,
      "styleRecalcDurationMs": 34.433,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 9099.823,
      "heapDeltaBytes": 10778964,
      "heapUsedBytes": 101753048,
      "domNodes": -276,
      "jsHeapTotalBytes": 3334144,
      "scriptDurationMs": 3187.147,
      "eventListeners": -129,
      "totalBlockingTimeMs": 12,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 12416.345999999976,
      "styleRecalcs": 246,
      "styleRecalcDurationMs": 33.065000000000005,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 9013.043,
      "heapDeltaBytes": 8188932,
      "heapUsedBytes": 98845972,
      "domNodes": -282,
      "jsHeapTotalBytes": 4382720,
      "scriptDurationMs": 3215.5,
      "eventListeners": -129,
      "totalBlockingTimeMs": 19,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 16677.279,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 15872.428,
      "heapDeltaBytes": -34534632,
      "heapUsedBytes": 177257436,
      "domNodes": -6548,
      "jsHeapTotalBytes": -4657152,
      "scriptDurationMs": 300.716,
      "eventListeners": -7475,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.780000000000047,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 16587.821000000076,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 15771.782000000001,
      "heapDeltaBytes": -35379972,
      "heapUsedBytes": 176461964,
      "domNodes": -6548,
      "jsHeapTotalBytes": 1560576,
      "scriptDurationMs": 306.077,
      "eventListeners": -7473,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.779999999999927,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 20805.406000000006,
      "styleRecalcs": 176,
      "styleRecalcDurationMs": 16.451000000000022,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 20335.411,
      "heapDeltaBytes": -26959520,
      "heapUsedBytes": 177212092,
      "domNodes": -6548,
      "jsHeapTotalBytes": 2871296,
      "scriptDurationMs": 888.064,
      "eventListeners": -7471,
      "totalBlockingTimeMs": 65,
      "frameDurationMs": 17.776666666666763,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 20584.369999999923,
      "styleRecalcs": 173,
      "styleRecalcDurationMs": 17.018000000000004,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 20160.957,
      "heapDeltaBytes": -21352432,
      "heapUsedBytes": 185205404,
      "domNodes": -6548,
      "jsHeapTotalBytes": -1343488,
      "scriptDurationMs": 895.3130000000001,
      "eventListeners": -7471,
      "totalBlockingTimeMs": 39,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "workflow-execution",
      "durationMs": 140.21900000000187,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 18.256,
      "layouts": 3,
      "layoutDurationMs": 1.525,
      "taskDurationMs": 104.868,
      "heapDeltaBytes": 3830888,
      "heapUsedBytes": 70454024,
      "domNodes": 137,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 6.459000000000001,
      "eventListeners": 49,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 502.7109999999766,
      "styleRecalcs": 19,
      "styleRecalcDurationMs": 22.772000000000002,
      "layouts": 3,
      "layoutDurationMs": 1.078,
      "taskDurationMs": 135.879,
      "heapDeltaBytes": 5741928,
      "heapUsedBytes": 68631068,
      "domNodes": 145,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 8.103,
      "eventListeners": 97,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    }
  ]
}

@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   #15592   +/-   ##
========================================================
  Coverage                         ?   82.29%           
========================================================
  Files                            ?     1900           
  Lines                            ?   107660           
  Branches                         ?    34065           
========================================================
  Hits                             ?    88600           
  Misses                           ?    18722           
  Partials                         ?      338           
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.

Seven it.fails assertions covering both configure-time link defects, plus
controls that keep them honest.

#15577: normalizeConfiguredTopology keys duplicates on target_id:target_slot
and keeps data.links[first] rather than the link input.link names, so a
workflow with two links into one input comes up wired to the wrong upstream
node. conflictingOriginLinksRoot is byte-for-byte what main serializes after a
pack creates a link through the legacy slot mirrors alone.

#15581: a serialized input whose name has no live counterpart keeps its stale
target_slot, the resulting occupied-target rejection breaks the loop, and every
remaining move for that node is abandoned. Covers the dropped-input, renamed-
input and directly-rejected-batch cases.
@DrJKL
DrJKL force-pushed the cb__repro-15577-15581 branch from 20039d9 to 14bb542 Compare August 22, 2026 04:28
@DrJKL
DrJKL merged commit 6a1213f into feature/ecs-migration Aug 22, 2026
39 of 44 checks passed
@DrJKL
DrJKL deleted the cb__repro-15577-15581 branch August 22, 2026 05:47
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:M This PR changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants