Skip to content

test: pin the comfyui-promptchain slot-replacement break to the read path - #15595

Merged
DrJKL merged 2 commits into
feature/ecs-migrationfrom
cb__promptchain-slotlinks
Aug 22, 2026
Merged

test: pin the comfyui-promptchain slot-replacement break to the read path#15595
DrJKL merged 2 commits into
feature/ecs-migrationfrom
cb__promptchain-slotlinks

Conversation

@christian-byrne

Copy link
Copy Markdown
Contributor

Summary

comfyui-promptchain does not break through slotLinks.ts:192. Its break is a read divergence: {...slot} cannot carry link because link is a prototype accessor, so the pack's own later reads of slot.link return undefined and it acts on "nothing is connected". This pins that mechanism, and pins the :192 early return separately so the two stop being conflated.

Tests only. No production change.

Changes

  • What: five tests in legacySlotLinkMutations.test.ts, replaying the two functions the pack actually runs — mobcat40/ComfyUI-PromptChain js/lib/order-chain.js:123 (updateInputLabels, the node.inputs[i] = {...slot} site) and js/main.js:507 (trimEmptyAutogrowSlots, a raw inputs.splice gated on input.link != null).

Three pass, two are it.fails asserting the wanted behaviour:

Test Kind Pins
keeps the link store correct when the pack replaces every slot pass The indexed overwrite does not corrupt the store. removeInput after it reindexes correctly.
never rejects the endpoint batch, though a rejection is detectable pass Two arms. Real promptchain sequence: 0 rejections. Forced rejection: 1, and the node keeps its old input layout while removeInput returns normally — #15593's claim, asserted.
reads the live link id back through a spread copy it.fails copy.link should return the live id. Returns undefined.
keeps connected inputs when the pack re-reads slot.link it.fails After the pack's label pass, its own trim reads .link as undefined on every slot, computes keepCount = 1, and splices off 3 of 4 inputs including all 3 connected ones.
keeps every input when the same trim reads live slots pass Control for the row above. Same fixture, same trim, live class slots: removes 0.

The control is the point: 3 slots destroyed vs 0, same function, same fixture, one arm known non-zero.

graph.serialize() after that trim still lists all three links targeting input slots the node no longer has, so this reaches the saved workflow.

Review Focus

The :192 early return is real but is not promptchain's bug. Across every sequence tried — reentrant slot substitution from onConnectionsChange during removeInput, raw inputs.splice followed by removeInput, and reconnecting after both — updateEndpoints returned ok every time and console.error('Failed to replace node inputs') fired 0 times. It stays worth fixing on its own merits; it is not the pack break.

Consequence for the shim. A shim that intercepts the write and routes link/links mutations does not help here, because promptchain never writes link — it reads it. Mutation M1 below simulates a shim that rehydrates the assigned plain object into a NodeInputSlot; that one does fix it.

Mutation verification

Baseline for this file: 8 passed | 6 expected fail (14).

Mutation Result
M1 — rehydrate plain objects into NodeInputSlot on indexed assignment to node.inputs (a shim simulation) 3 failed | 8 passed | 3 expected fail. All three failures are it.fails markers flipping to pass: both new ones plus the pre-existing disconnects through a plain-object input slot. Widened to src/lib/litegraph/src/node/ + linkStore.test.ts + LLink.store.test.ts: 3 failed | 124 passed | 3 expected fail (130) — same three markers, no genuine regression.
M2 — drop the return [] at slotLinks.ts:194 so the rejection falls through 1 failed | 7 passed | 6 expected failnever rejects the endpoint batch, on the layout assertion.
M3 — drop removals from the endpoint batch in replaceNodeInputs 1 failed | 7 passed | 6 expected failkeeps the link store correct.

Each reverted; baseline restored and re-run green after each.

Both it.fails markers were checked by flipping them to it: both fail on AssertionError, never on a TypeError. The first draft of one of them passed on TypeError: source.getOutputLinks is not a function and was rewritten.

Gates

oxfmt --check, oxlint --type-aware (verified non-vacuous against a deliberately bad file: exit 1), knip exit 0, vue-tsc --noEmit at 8GB: 0 errors on any src/lib/litegraph/ path. The 1418 TS2688 plus 68 implicit-any errors it reports are the known symlinked-node_modules artifact, all in unrelated .vue files.

@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: 43e85858-987f-4652-9c95-d66643e7840b

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: ✅ 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)

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 08/22/2026, 05:18:34 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 · 64.0 MB heap
canvas-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.8 MB heap
canvas-zoom-sweep: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 69.3 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 59.7 MB heap
large-graph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 76.0 MB heap
large-graph-pan: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 14ms TBT · 80.4 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 77.7 MB heap
legacy-node-drag: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 71.5 MB heap
minimap-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 65.7 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 84.0 MB heap
subgraph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 56.4 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 70.7 MB heap
subgraph-transition-enter: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 131ms TBT · 80.8 MB heap
viewport-pan-sweep: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 5ms TBT · 82.2 MB heap
vue-large-graph-idle: · 56.3 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 1ms TBT · 176.6 MB heap
vue-large-graph-pan: · 56.3 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 164ms TBT · 173.4 MB heap
workflow-execution: · 60.0 avg FPS · 59.7 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 7ms
canvas-idle: layout count 0
canvas-idle: style recalc count 7
canvas-idle: task duration 575ms
canvas-idle: script duration 11ms
canvas-idle: TBT 0ms
canvas-idle: heap used 64.0 MB
canvas-idle: DOM nodes -284
canvas-idle: event listeners -186
canvas-mouse-sweep: avg frame time 17ms
canvas-mouse-sweep: p95 frame time 17ms
canvas-mouse-sweep: layout duration 5ms
canvas-mouse-sweep: style recalc duration 46ms
canvas-mouse-sweep: layout count 12
canvas-mouse-sweep: style recalc count 78
canvas-mouse-sweep: task duration 1373ms
canvas-mouse-sweep: script duration 167ms
canvas-mouse-sweep: TBT 0ms
canvas-mouse-sweep: heap used 71.8 MB
canvas-mouse-sweep: DOM nodes -281
canvas-mouse-sweep: event listeners -155
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 19ms
canvas-zoom-sweep: layout count 6
canvas-zoom-sweep: style recalc count 31
canvas-zoom-sweep: task duration 415ms
canvas-zoom-sweep: script duration 14ms
canvas-zoom-sweep: TBT 0ms
canvas-zoom-sweep: heap used 69.3 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 10
dom-widget-clipping: task duration 444ms
dom-widget-clipping: script duration 33ms
dom-widget-clipping: TBT 0ms
dom-widget-clipping: heap used 59.7 MB
dom-widget-clipping: DOM nodes 16
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 3ms
large-graph-idle: layout count 0
large-graph-idle: style recalc count 4
large-graph-idle: task duration 656ms
large-graph-idle: script duration 41ms
large-graph-idle: TBT 0ms
large-graph-idle: heap used 76.0 MB
large-graph-idle: DOM nodes -278
large-graph-idle: event listeners -169
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 64
large-graph-pan: task duration 2725ms
large-graph-pan: script duration 949ms
large-graph-pan: TBT 14ms
large-graph-pan: heap used 80.4 MB
large-graph-pan: DOM nodes -141
large-graph-pan: event listeners -87
large-graph-zoom: avg frame time 17ms
large-graph-zoom: p95 frame time 17ms
large-graph-zoom: layout duration 9ms
large-graph-zoom: style recalc duration 13ms
large-graph-zoom: layout count 60
large-graph-zoom: style recalc count 66
large-graph-zoom: task duration 2748ms
large-graph-zoom: script duration 924ms
large-graph-zoom: TBT 0ms
large-graph-zoom: heap used 77.7 MB
large-graph-zoom: DOM nodes -106
large-graph-zoom: event listeners -68
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 2255ms
legacy-node-drag: script duration 224ms
legacy-node-drag: TBT 0ms
legacy-node-drag: heap used 71.5 MB
legacy-node-drag: DOM nodes -144
legacy-node-drag: event listeners 94
minimap-idle: avg frame time 17ms
minimap-idle: p95 frame time 17ms
minimap-idle: layout duration 0ms
minimap-idle: style recalc duration 4ms
minimap-idle: layout count 0
minimap-idle: style recalc count 4
minimap-idle: task duration 699ms
minimap-idle: script duration 47ms
minimap-idle: TBT 0ms
minimap-idle: heap used 65.7 MB
minimap-idle: DOM nodes -280
minimap-idle: event listeners -185
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 45
subgraph-dom-widget-clipping: task duration 561ms
subgraph-dom-widget-clipping: script duration 147ms
subgraph-dom-widget-clipping: TBT 0ms
subgraph-dom-widget-clipping: heap used 84.0 MB
subgraph-dom-widget-clipping: DOM nodes 16
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 8
subgraph-idle: task duration 559ms
subgraph-idle: script duration 10ms
subgraph-idle: TBT 0ms
subgraph-idle: heap used 56.4 MB
subgraph-idle: DOM nodes -296
subgraph-idle: event listeners -201
subgraph-mouse-sweep: avg frame time 17ms
subgraph-mouse-sweep: p95 frame time 17ms
subgraph-mouse-sweep: layout duration 5ms
subgraph-mouse-sweep: style recalc duration 40ms
subgraph-mouse-sweep: layout count 16
subgraph-mouse-sweep: style recalc count 77
subgraph-mouse-sweep: task duration 1140ms
subgraph-mouse-sweep: script duration 116ms
subgraph-mouse-sweep: TBT 0ms
subgraph-mouse-sweep: heap used 70.7 MB
subgraph-mouse-sweep: DOM nodes -296
subgraph-mouse-sweep: event listeners -215
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 34ms
subgraph-transition-enter: layout count 15
subgraph-transition-enter: style recalc count 20
subgraph-transition-enter: task duration 988ms
subgraph-transition-enter: script duration 31ms
subgraph-transition-enter: TBT 131ms
subgraph-transition-enter: heap used 80.8 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 41ms
viewport-pan-sweep: layout count 0
viewport-pan-sweep: style recalc count 246
viewport-pan-sweep: task duration 9646ms
viewport-pan-sweep: script duration 3232ms
viewport-pan-sweep: TBT 5ms
viewport-pan-sweep: heap used 82.2 MB
viewport-pan-sweep: DOM nodes -283
viewport-pan-sweep: event listeners -159
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 17997ms
vue-large-graph-idle: script duration 361ms
vue-large-graph-idle: TBT 1ms
vue-large-graph-idle: heap used 176.6 MB
vue-large-graph-idle: DOM nodes -6550
vue-large-graph-idle: event listeners -7473
vue-large-graph-pan: avg frame time 18ms
vue-large-graph-pan: p95 frame time 17ms
vue-large-graph-pan: layout duration 0ms
vue-large-graph-pan: style recalc duration 25ms
vue-large-graph-pan: layout count 0
vue-large-graph-pan: style recalc count 171
vue-large-graph-pan: task duration 22606ms
vue-large-graph-pan: script duration 962ms
vue-large-graph-pan: TBT 164ms
vue-large-graph-pan: heap used 173.4 MB
vue-large-graph-pan: DOM nodes -6548
vue-large-graph-pan: event listeners -7469
workflow-execution: avg frame time 17ms
workflow-execution: p95 frame time 17ms
workflow-execution: layout duration 1ms
workflow-execution: style recalc duration 22ms
workflow-execution: layout count 3
workflow-execution: style recalc count 13
workflow-execution: task duration 125ms
workflow-execution: script duration 8ms
workflow-execution: TBT 0ms
workflow-execution: heap used 67.8 MB
workflow-execution: DOM nodes 139
workflow-execution: event listeners 62
Raw data
{
  "timestamp": "2026-08-22T05:30:26.476Z",
  "gitSha": "06414436a7fe4eb81bfaa7e864a71498a797d3a0",
  "branch": "cb__promptchain-slotlinks",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2073.999000000015,
      "styleRecalcs": 6,
      "styleRecalcDurationMs": 6.112000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 576.434,
      "heapDeltaBytes": 2808012,
      "heapUsedBytes": 65176316,
      "domNodes": -286,
      "jsHeapTotalBytes": 3923968,
      "scriptDurationMs": 11.176999999999998,
      "eventListeners": -187,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "canvas-idle",
      "durationMs": 2037.776000000008,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 7.700000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 572.7679999999999,
      "heapDeltaBytes": 160456,
      "heapUsedBytes": 69050188,
      "domNodes": -281,
      "jsHeapTotalBytes": 4710400,
      "scriptDurationMs": 11.114,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2407.731999999953,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 46.237,
      "layouts": 12,
      "layoutDurationMs": 6.9510000000000005,
      "taskDurationMs": 1454.174,
      "heapDeltaBytes": 6890948,
      "heapUsedBytes": 75952588,
      "domNodes": -281,
      "jsHeapTotalBytes": 6021120,
      "scriptDurationMs": 174.84900000000002,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2285.88400000001,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 46.102,
      "layouts": 12,
      "layoutDurationMs": 4.038,
      "taskDurationMs": 1291.4399999999998,
      "heapDeltaBytes": 5435888,
      "heapUsedBytes": 74623260,
      "domNodes": -281,
      "jsHeapTotalBytes": 6021120,
      "scriptDurationMs": 159.20999999999998,
      "eventListeners": -155,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1738.9590000000226,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 18.538000000000004,
      "layouts": 6,
      "layoutDurationMs": 0.6380000000000001,
      "taskDurationMs": 407.25,
      "heapDeltaBytes": 3747140,
      "heapUsedBytes": 72797844,
      "domNodes": 76,
      "jsHeapTotalBytes": 5242880,
      "scriptDurationMs": 13.559999999999999,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1728.144000000043,
      "styleRecalcs": 31,
      "styleRecalcDurationMs": 19.856,
      "layouts": 6,
      "layoutDurationMs": 0.7079999999999999,
      "taskDurationMs": 423.57,
      "heapDeltaBytes": 3651212,
      "heapUsedBytes": 72545512,
      "domNodes": 75,
      "jsHeapTotalBytes": 4980736,
      "scriptDurationMs": 14.406,
      "eventListeners": 19,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 743.7199999999962,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 7.089000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 439.10099999999994,
      "heapDeltaBytes": -7228136,
      "heapUsedBytes": 61538444,
      "domNodes": 16,
      "jsHeapTotalBytes": 6029312,
      "scriptDurationMs": 32.947,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 729.5950000000175,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 6.591999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 448.42400000000004,
      "heapDeltaBytes": -6041448,
      "heapUsedBytes": 63589352,
      "domNodes": 16,
      "jsHeapTotalBytes": 6029312,
      "scriptDurationMs": 33.624,
      "eventListeners": 2,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2049.544000000026,
      "styleRecalcs": 4,
      "styleRecalcDurationMs": 3.995000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 643.68,
      "heapDeltaBytes": 3498912,
      "heapUsedBytes": 86653972,
      "domNodes": -280,
      "jsHeapTotalBytes": 3104768,
      "scriptDurationMs": 40.609,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2052.739000000088,
      "styleRecalcs": 3,
      "styleRecalcDurationMs": 2.8269999999999995,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 668.5199999999999,
      "heapDeltaBytes": -18170492,
      "heapUsedBytes": 72751196,
      "domNodes": -276,
      "jsHeapTotalBytes": -1576960,
      "scriptDurationMs": 42.112,
      "eventListeners": -153,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 3236.434000000031,
      "styleRecalcs": 62,
      "styleRecalcDurationMs": 9.322999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2662.751,
      "heapDeltaBytes": 25957948,
      "heapUsedBytes": 90846356,
      "domNodes": 0,
      "jsHeapTotalBytes": 1273856,
      "scriptDurationMs": 924.1930000000001,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "large-graph-pan",
      "durationMs": 3441.6400000000067,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 12.58,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2787.372,
      "heapDeltaBytes": -12386728,
      "heapUsedBytes": 77732484,
      "domNodes": -281,
      "jsHeapTotalBytes": 4415488,
      "scriptDurationMs": 973.401,
      "eventListeners": -181,
      "totalBlockingTimeMs": 28,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 4516.298000000006,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 12.955000000000002,
      "layouts": 60,
      "layoutDurationMs": 8.549000000000001,
      "taskDurationMs": 2738.362,
      "heapDeltaBytes": 16482896,
      "heapUsedBytes": 88363720,
      "domNodes": -235,
      "jsHeapTotalBytes": -827392,
      "scriptDurationMs": 909.8159999999999,
      "eventListeners": -147,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 4574.540999999954,
      "styleRecalcs": 66,
      "styleRecalcDurationMs": 12.652,
      "layouts": 60,
      "layoutDurationMs": 8.527,
      "taskDurationMs": 2757.661,
      "heapDeltaBytes": 8419668,
      "heapUsedBytes": 74674152,
      "domNodes": 24,
      "jsHeapTotalBytes": 2359296,
      "scriptDurationMs": 937.826,
      "eventListeners": 12,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 3388.318999999967,
      "styleRecalcs": 41,
      "styleRecalcDurationMs": 5.4879999999999995,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2279.4120000000003,
      "heapDeltaBytes": -2298288,
      "heapUsedBytes": 70583544,
      "domNodes": -287,
      "jsHeapTotalBytes": -1613824,
      "scriptDurationMs": 229.35300000000004,
      "eventListeners": -1,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 3178.884000000039,
      "styleRecalcs": 41,
      "styleRecalcDurationMs": 5.3950000000000005,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 2229.972,
      "heapDeltaBytes": 13185800,
      "heapUsedBytes": 79408088,
      "domNodes": 0,
      "jsHeapTotalBytes": 417792,
      "scriptDurationMs": 219.03799999999998,
      "eventListeners": 188,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "minimap-idle",
      "durationMs": 2045.8939999999757,
      "styleRecalcs": 4,
      "styleRecalcDurationMs": 3.7289999999999996,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 681.7710000000001,
      "heapDeltaBytes": -22559928,
      "heapUsedBytes": 68931304,
      "domNodes": -279,
      "jsHeapTotalBytes": 3665920,
      "scriptDurationMs": 46.23,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2043.3960000000297,
      "styleRecalcs": 4,
      "styleRecalcDurationMs": 4.328000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 716.434,
      "heapDeltaBytes": -22419020,
      "heapUsedBytes": 68796736,
      "domNodes": -281,
      "jsHeapTotalBytes": 4190208,
      "scriptDurationMs": 48.04299999999999,
      "eventListeners": -185,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 782.0720000000279,
      "styleRecalcs": 45,
      "styleRecalcDurationMs": 9.819999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 562.764,
      "heapDeltaBytes": 17828196,
      "heapUsedBytes": 88160128,
      "domNodes": 16,
      "jsHeapTotalBytes": 5767168,
      "scriptDurationMs": 147.96,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 784.3900000000303,
      "styleRecalcs": 45,
      "styleRecalcDurationMs": 9.929,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 558.346,
      "heapDeltaBytes": 17929792,
      "heapUsedBytes": 88085932,
      "domNodes": 16,
      "jsHeapTotalBytes": 5767168,
      "scriptDurationMs": 145.98899999999998,
      "eventListeners": 8,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2022.5689999999759,
      "styleRecalcs": 7,
      "styleRecalcDurationMs": 6.12,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 557.959,
      "heapDeltaBytes": -8017796,
      "heapUsedBytes": 61954780,
      "domNodes": -297,
      "jsHeapTotalBytes": 5496832,
      "scriptDurationMs": 10.107999999999999,
      "eventListeners": -201,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2037.4049999999215,
      "styleRecalcs": 9,
      "styleRecalcDurationMs": 8.182,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 559.624,
      "heapDeltaBytes": -13408812,
      "heapUsedBytes": 56351264,
      "domNodes": -295,
      "jsHeapTotalBytes": 5234688,
      "scriptDurationMs": 9.591000000000003,
      "eventListeners": -201,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1857.6069999999731,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 38.092,
      "layouts": 16,
      "layoutDurationMs": 4.802,
      "taskDurationMs": 1126.4530000000002,
      "heapDeltaBytes": 10338516,
      "heapUsedBytes": 80465300,
      "domNodes": -295,
      "jsHeapTotalBytes": 5234688,
      "scriptDurationMs": 114.569,
      "eventListeners": -231,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1910.209000000009,
      "styleRecalcs": 77,
      "styleRecalcDurationMs": 42.074,
      "layouts": 16,
      "layoutDurationMs": 4.832,
      "taskDurationMs": 1154.457,
      "heapDeltaBytes": -2753304,
      "heapUsedBytes": 67729036,
      "domNodes": -297,
      "jsHeapTotalBytes": 6021120,
      "scriptDurationMs": 117.02799999999999,
      "eventListeners": -199,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1384.492000000023,
      "styleRecalcs": 20,
      "styleRecalcDurationMs": 33.67000000000001,
      "layouts": 15,
      "layoutDurationMs": 13.506,
      "taskDurationMs": 988.363,
      "heapDeltaBytes": -7464392,
      "heapUsedBytes": 84739096,
      "domNodes": 13671,
      "jsHeapTotalBytes": 10747904,
      "scriptDurationMs": 31.424999999999994,
      "eventListeners": 2381,
      "totalBlockingTimeMs": 131,
      "frameDurationMs": 16.66333333333332,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 12421.677999999985,
      "styleRecalcs": 246,
      "styleRecalcDurationMs": 40.244,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 9568.480000000001,
      "heapDeltaBytes": 8651296,
      "heapUsedBytes": 91971192,
      "domNodes": -281,
      "jsHeapTotalBytes": 5132288,
      "scriptDurationMs": 3230.7619999999997,
      "eventListeners": -159,
      "totalBlockingTimeMs": 10,
      "frameDurationMs": 16.66333333333326,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 12596.80800000001,
      "styleRecalcs": 246,
      "styleRecalcDurationMs": 40.899,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 9724.01,
      "heapDeltaBytes": -2715328,
      "heapUsedBytes": 80509788,
      "domNodes": -284,
      "jsHeapTotalBytes": 5394432,
      "scriptDurationMs": 3233.708,
      "eventListeners": -159,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 18510.113999999987,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 17984.918999999998,
      "heapDeltaBytes": -22244072,
      "heapUsedBytes": 187974984,
      "domNodes": -6552,
      "jsHeapTotalBytes": 1499136,
      "scriptDurationMs": 360.45899999999995,
      "eventListeners": -7473,
      "totalBlockingTimeMs": 1,
      "frameDurationMs": 17.773333333333238,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 18393.02799999996,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 18008.417999999998,
      "heapDeltaBytes": -23211428,
      "heapUsedBytes": 182296800,
      "domNodes": -6548,
      "jsHeapTotalBytes": -1224704,
      "scriptDurationMs": 361.05300000000005,
      "eventListeners": -7473,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 22561.847999999998,
      "styleRecalcs": 170,
      "styleRecalcDurationMs": 23.647999999999975,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 22280.709000000003,
      "heapDeltaBytes": -31624244,
      "heapUsedBytes": 183313992,
      "domNodes": -6548,
      "jsHeapTotalBytes": -1708032,
      "scriptDurationMs": 960.6740000000001,
      "eventListeners": -7469,
      "totalBlockingTimeMs": 186,
      "frameDurationMs": 17.776666666666642,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 23158.303000000047,
      "styleRecalcs": 171,
      "styleRecalcDurationMs": 26.222000000000023,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 22931.148,
      "heapDeltaBytes": -31543444,
      "heapUsedBytes": 180334064,
      "domNodes": -6548,
      "jsHeapTotalBytes": -7516160,
      "scriptDurationMs": 963.1160000000001,
      "eventListeners": -7469,
      "totalBlockingTimeMs": 141,
      "frameDurationMs": 17.776666666666763,
      "p95FrameDurationMs": 16.700000000004366
    },
    {
      "name": "workflow-execution",
      "durationMs": 499.60699999996905,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 26.275000000000002,
      "layouts": 3,
      "layoutDurationMs": 1.3059999999999998,
      "taskDurationMs": 151.947,
      "heapDeltaBytes": 5820268,
      "heapUsedBytes": 72319464,
      "domNodes": 148,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 11.276,
      "eventListeners": 99,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "workflow-execution",
      "durationMs": 124.56600000007256,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 17.147000000000002,
      "layouts": 3,
      "layoutDurationMs": 1.418,
      "taskDurationMs": 98.87099999999998,
      "heapDeltaBytes": 3276068,
      "heapUsedBytes": 69779644,
      "domNodes": 130,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 4.749999999999999,
      "eventListeners": 25,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666666666666668,
      "p95FrameDurationMs": 16.800000000000182
    }
  ]
}

@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   #15595   +/-   ##
========================================================
  Coverage                         ?   82.29%           
========================================================
  Files                            ?     1900           
  Lines                            ?   107660           
  Branches                         ?    33595           
========================================================
  Hits                             ?    88599           
  Misses                           ?    18732           
  Partials                         ?      329           
Flag Coverage Δ
e2e 67.96% <ø> (?)
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.

…path

Replays the two functions the one confirmed-broken pack actually runs
(mobcat40/ComfyUI-PromptChain order-chain.js:123 and main.js:507) against the
ECS branch. The break is a read divergence, not a rejected write:
replaceNodeInputs never rejects on any promptchain sequence.

Adds a forced-rejection arm that pins the slotLinks.ts:192 early return, so
the claim that a rejected batch abandons the node layout is asserted rather
than read off the source.
@DrJKL
DrJKL force-pushed the cb__promptchain-slotlinks branch from ce0005c to e42b301 Compare August 22, 2026 04:28
@DrJKL
DrJKL merged commit 04e7f9e into feature/ecs-migration Aug 22, 2026
78 checks passed
@DrJKL
DrJKL deleted the cb__promptchain-slotlinks branch August 22, 2026 05:36
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