Skip to content

test: validate native LoRA stack assets and execution - #20307

Draft
jaeone94 wants to merge 4 commits into
jaeone94/dynamic-asset-widgetsfrom
jaeone94/native-lora-stack-e2e
Draft

jaeone94 wants to merge 4 commits into
jaeone94/dynamic-asset-widgetsfrom
jaeone94/native-lora-stack-e2e

Conversation

@jaeone94

@jaeone94 jaeone94 commented Oct 6, 2026 •

Copy link
Copy Markdown
Collaborator

ELI5

Choosing a LoRA in a repeated row should still choose the right file after editing, copying, saving, or nesting the node. These browser tests follow those operations through the real native loaders and check the resulting model weights on CPU. They also exercise creating nodes, opening asset pickers, previewing a selected model, and dragging models onto the canvas or an existing node.

Motivation

The generic DynamicGroup tests use a node that echoes values. The native loaders also need coverage for asset selection, filenames passed to the backend, and actual LoRA patch application before rollout. Browser coverage of model dragging complements the parent PR's unit tests by exercising the real preview, node constructor, and drop targets together.

Summary

  • Stack this test-only PR on feat: support dynamic asset widgets for native LoRA stacks #20305 — feat: support dynamic asset widgets for native LoRA stacks.
  • Adapt the previous 19 DynamicGroup scenarios to the native model loader, add a native text-encoder execution case, and add five asset UI and drag scenarios (25 total).
  • Cover row editing, save/reopen, draft reload at root and inside subgraphs, copy isolation, Undo/Redo, one- and two-level promotion, sparse API import, and over-limit import/backend rejection.
  • Mock Cloud asset/auth responses with the existing fixtures. Read real object_info, submit real prompts, load tiny generated safetensors through the native nodes, and assert their patched CPU output. The asset fixtures include the current core loader_path field.
  • Run a dedicated single-worker CI job and retain videos/reports. Only this job pins Comfy-Org/ComfyUI#16309 — feat: add native LoRA stack loader nodes at 0e5d418af303606f1e9f76089b5c21aba275fdc5; standard shards keep their existing backend.

Added asset UI coverage

  • Create each native node through search, open its first and newly added row's asset popovers, select different files, and verify their independent stored paths (two cases).
  • Choose a model through the asset browser's Use button, verify its filename in the ghost preview before any graph node exists, then place the default LoraLoader with the full loader path.
  • Drag a model from the model-library tree onto empty canvas and verify the created default loader's path.
  • Drop a model over the second row of a populated native stack and expect only the first matching filename widget to change, preserving all other prompt inputs before checking execution. This deliberately follows the current node-level binding contract; it does not introduce hovered-row targeting or multi-file distribution. This case currently fails at the filename assertion, before execution.

Current failures / merge dependencies

The latest local run has 22 passed and 3 failed. Four of the five added cases pass. The failures remain enabled, without skips or expected-failure annotations:

  1. Two existing cases reproduce stale top-level promotion after deleting or renumbering an inner row. fix: propagate DynamicGroup row changes through nested promotions #20181 — fix: propagate DynamicGroup row changes through nested promotions is now merged, but this stacked branch does not yet contain it. Earlier local verification with that PR's two production-file changes made both cases pass; those changes were removed before committing this test-only branch.
  2. The new existing-node drop case leaves the first filename unchanged. A separate local control reproduced the same failure on the ordinary, string-mapped LoraLoader, while dragging onto empty canvas successfully created and populated that loader. The code points to a shared Vue drop-target gap: the model-tree drop handler is registered on the canvas element, whereas the Vue node is a separate DOM surface. This is not limited to the new regular-expression mapping. This PR records the failing native scenario and does not include a production fix.

The previous dedicated CI job ran the earlier 20 cases against the current parent selector refactor: 18 passed and the two nested-promotion cases failed. CI for the five added cases is pending.

Remove the backend override once the default CI backend includes the native nodes and recheck the suite before merging. These CPU tests do not verify Cloud model preparation or full image generation; those remain release QA.

Test plan

Run DISTRIBUTION=cloud pnpm exec playwright test --config=playwright.native-lora.config.ts against the pinned backend with the fixture LoRAs and CPU source/output nodes installed. Inspect playwright-report-native-lora for the report and videos.

Provenance

  • Authored by: interactive session
  • Verified: pnpm build:cloud passed. DISTRIBUTION=cloud pnpm exec playwright test --config=playwright.native-lora.config.ts against the pinned CPU backend: 22 passed, 3 failed as described above. Pre-commit formatting, type-aware lint, and pnpm typecheck:browser passed. Pre-push Knip and Fallow passed. The previous CI-gate unit-test run passed all 41 cases. The new scenarios reuse existing fixtures and were reviewed against the repository's Playwright and test-design guidance.
  • Deviations: The nested-promotion cases require incorporating the merged fix, and the new existing-node drop case exposes an additional shared Vue drop-target issue. Real Cloud model preparation and full image generation are outside this local CPU suite.

@coderabbitai

coderabbitai Bot commented Oct 6, 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: Repository: Comfy-Org/ComfyUI_frontend/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 501b1264-d55b-4afb-8dfe-7a9e9c236cf0

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
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

🌾 Fallow: ✅ Passed

Fallow audits the diff for duplication, complexity and dead code. It gates on new findings only, so when the audit completes, a red is something this PR introduced or moved — never inherited backlog. A red can also mean the audit itself did not finish; the details below say which happened.

No new findings in the changed files.

Reproduce locally
# the base the gate compared against
npx fallow audit --root . --quiet --format json \
  --changed-since e52eeb8ce1a5290fb9721c9bdc38605f407a9b67

Full docs: ADR-DEVEX-LINT-0015

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

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

📦 Bundle Size

⏳ Size data collection in progress…

⚡ Performance Report

canvas-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 72.9 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.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.4 MB heap
dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 60.2 MB heap
dom-widget-order-dense-n200-w200-i120: · 29.6 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 522ms TBT · 87.4 MB heap
dom-widget-order-sparse-n1000-w20-i120: · 40.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 217ms TBT · 86.4 MB heap
extension-clean-combined-draw: · 30.8 avg FPS · 17.1 P5 FPS ❌ (target: ≥52) · 975ms TBT · 87.2 MB heap
extension-rgthree-prototype-draw: · 31.6 avg FPS · 20.0 P5 FPS ❌ (target: ≥52) · 901ms TBT · 75.9 MB heap
large-graph-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 77.4 MB heap
large-graph-pan: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 76.5 MB heap
large-graph-zoom: · 60.0 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.5 MB heap
legacy-node-drag: · 59.3 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 0ms TBT · 83.4 MB heap
minimap-idle: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 78.4 MB heap
subgraph-dom-widget-clipping: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 58.4 MB heap
subgraph-idle: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 70.0 MB heap
subgraph-mouse-sweep: · 60.0 avg FPS · 59.9 P5 FPS ✅ (target: ≥52) · 0ms TBT · 72.5 MB heap
subgraph-transition-enter: · 51.6 avg FPS · 59.5 P5 FPS ✅ (target: ≥52) · 128ms TBT · 102.6 MB heap
viewport-pan-sweep: · 59.9 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 65.5 MB heap
vue-large-graph-idle: · 32.0 avg FPS · 15.0 P5 FPS ❌ (target: ≥52) · 0ms TBT · 173.5 MB heap
vue-large-graph-pan: · 23.7 avg FPS · 12.0 P5 FPS ❌ (target: ≥52) · 15ms TBT · 179.2 MB heap
vue-node-resize-workload: · 26.7 avg FPS · 13.3 P5 FPS ❌ (target: ≥52) · 0ms TBT · 206.2 MB heap
vue-zoom-out-idle: · 31.4 avg FPS · 15.0 P5 FPS ❌ (target: ≥52) · 0ms TBT · 174.0 MB heap
workflow-execution: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 68.4 MB heap
agent-composer-empty-conversation-typing: · 60.0 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 70.6 MB heap
agent-composer-long-conversation-typing: · 58.5 avg FPS · 59.7 P5 FPS ✅ (target: ≥52) · 0ms TBT · 108.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 4ms
canvas-idle: layout count 0
canvas-idle: style recalc count 10
canvas-idle: task duration 431ms
canvas-idle: script duration 9ms
canvas-idle: TBT 0ms
canvas-idle: heap used 72.9 MB
canvas-idle: DOM nodes 0
canvas-idle: event listeners 0
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 14ms
canvas-mouse-sweep: layout count 12
canvas-mouse-sweep: style recalc count 73
canvas-mouse-sweep: task duration 789ms
canvas-mouse-sweep: script duration 154ms
canvas-mouse-sweep: TBT 0ms
canvas-mouse-sweep: heap used 69.2 MB
canvas-mouse-sweep: DOM nodes 0
canvas-mouse-sweep: event listeners 0
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 6ms
canvas-zoom-sweep: layout count 3
canvas-zoom-sweep: style recalc count 19
canvas-zoom-sweep: task duration 329ms
canvas-zoom-sweep: script duration 10ms
canvas-zoom-sweep: TBT 0ms
canvas-zoom-sweep: heap used 68.4 MB
canvas-zoom-sweep: DOM nodes 45
canvas-zoom-sweep: event listeners 39
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 3ms
dom-widget-clipping: layout count 0
dom-widget-clipping: style recalc count 15
dom-widget-clipping: task duration 443ms
dom-widget-clipping: script duration 162ms
dom-widget-clipping: TBT 0ms
dom-widget-clipping: heap used 60.2 MB
dom-widget-clipping: DOM nodes 0
dom-widget-clipping: event listeners 0
dom-widget-order-dense-n200-w200-i120: avg frame time 34ms
dom-widget-order-dense-n200-w200-i120: p95 frame time 17ms
dom-widget-order-dense-n200-w200-i120: layout duration 0ms
dom-widget-order-dense-n200-w200-i120: style recalc duration 0ms
dom-widget-order-dense-n200-w200-i120: layout count 0
dom-widget-order-dense-n200-w200-i120: style recalc count 0
dom-widget-order-dense-n200-w200-i120: task duration 807ms
dom-widget-order-dense-n200-w200-i120: script duration 69ms
dom-widget-order-dense-n200-w200-i120: TBT 522ms
dom-widget-order-dense-n200-w200-i120: heap used 87.4 MB
dom-widget-order-dense-n200-w200-i120: DOM nodes 0
dom-widget-order-dense-n200-w200-i120: event listeners 0
dom-widget-order-sparse-n1000-w20-i120: avg frame time 25ms
dom-widget-order-sparse-n1000-w20-i120: p95 frame time 17ms
dom-widget-order-sparse-n1000-w20-i120: layout duration 0ms
dom-widget-order-sparse-n1000-w20-i120: style recalc duration 0ms
dom-widget-order-sparse-n1000-w20-i120: layout count 0
dom-widget-order-sparse-n1000-w20-i120: style recalc count 0
dom-widget-order-sparse-n1000-w20-i120: task duration 470ms
dom-widget-order-sparse-n1000-w20-i120: script duration 163ms
dom-widget-order-sparse-n1000-w20-i120: TBT 217ms
dom-widget-order-sparse-n1000-w20-i120: heap used 86.4 MB
dom-widget-order-sparse-n1000-w20-i120: DOM nodes 0
dom-widget-order-sparse-n1000-w20-i120: event listeners 0
extension-clean-combined-draw: avg frame time 32ms
extension-clean-combined-draw: p95 frame time 58ms
extension-clean-combined-draw: layout duration 0ms
extension-clean-combined-draw: style recalc duration 0ms
extension-clean-combined-draw: layout count 0
extension-clean-combined-draw: style recalc count 1
extension-clean-combined-draw: task duration 8917ms
extension-clean-combined-draw: script duration 7505ms
extension-clean-combined-draw: TBT 975ms
extension-clean-combined-draw: heap used 87.2 MB
extension-clean-combined-draw: DOM nodes -141
extension-clean-combined-draw: event listeners -67
extension-rgthree-prototype-draw: avg frame time 32ms
extension-rgthree-prototype-draw: p95 frame time 50ms
extension-rgthree-prototype-draw: layout duration 0ms
extension-rgthree-prototype-draw: style recalc duration 0ms
extension-rgthree-prototype-draw: layout count 0
extension-rgthree-prototype-draw: style recalc count 1
extension-rgthree-prototype-draw: task duration 9150ms
extension-rgthree-prototype-draw: script duration 7565ms
extension-rgthree-prototype-draw: TBT 901ms
extension-rgthree-prototype-draw: heap used 75.9 MB
extension-rgthree-prototype-draw: DOM nodes -71
extension-rgthree-prototype-draw: event listeners -35
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 4ms
large-graph-idle: layout count 0
large-graph-idle: style recalc count 10
large-graph-idle: task duration 506ms
large-graph-idle: script duration 33ms
large-graph-idle: TBT 0ms
large-graph-idle: heap used 77.4 MB
large-graph-idle: DOM nodes 0
large-graph-idle: event listeners 0
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 7ms
large-graph-pan: layout count 0
large-graph-pan: style recalc count 70
large-graph-pan: task duration 1577ms
large-graph-pan: script duration 830ms
large-graph-pan: TBT 0ms
large-graph-pan: heap used 76.5 MB
large-graph-pan: DOM nodes 0
large-graph-pan: event listeners 0
large-graph-zoom: avg frame time 17ms
large-graph-zoom: p95 frame time 17ms
large-graph-zoom: layout duration 15ms
large-graph-zoom: style recalc duration 8ms
large-graph-zoom: layout count 60
large-graph-zoom: style recalc count 70
large-graph-zoom: task duration 1638ms
large-graph-zoom: script duration 772ms
large-graph-zoom: TBT 0ms
large-graph-zoom: heap used 68.5 MB
large-graph-zoom: DOM nodes 24
large-graph-zoom: event listeners 0
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 47
legacy-node-drag: task duration 1871ms
legacy-node-drag: script duration 981ms
legacy-node-drag: TBT 0ms
legacy-node-drag: heap used 83.4 MB
legacy-node-drag: DOM nodes 0
legacy-node-drag: event listeners 180
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 9
minimap-idle: task duration 508ms
minimap-idle: script duration 32ms
minimap-idle: TBT 0ms
minimap-idle: heap used 78.4 MB
minimap-idle: DOM nodes 0
minimap-idle: event listeners 0
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 5ms
subgraph-dom-widget-clipping: layout count 0
subgraph-dom-widget-clipping: style recalc count 48
subgraph-dom-widget-clipping: task duration 392ms
subgraph-dom-widget-clipping: script duration 144ms
subgraph-dom-widget-clipping: TBT 0ms
subgraph-dom-widget-clipping: heap used 58.4 MB
subgraph-dom-widget-clipping: DOM nodes 0
subgraph-dom-widget-clipping: event listeners 6
subgraph-idle: avg frame time 17ms
subgraph-idle: p95 frame time 17ms
subgraph-idle: layout duration 0ms
subgraph-idle: style recalc duration 4ms
subgraph-idle: layout count 0
subgraph-idle: style recalc count 11
subgraph-idle: task duration 435ms
subgraph-idle: script duration 8ms
subgraph-idle: TBT 0ms
subgraph-idle: heap used 70.0 MB
subgraph-idle: DOM nodes 0
subgraph-idle: event listeners 0
subgraph-mouse-sweep: avg frame time 17ms
subgraph-mouse-sweep: p95 frame time 17ms
subgraph-mouse-sweep: layout duration 6ms
subgraph-mouse-sweep: style recalc duration 16ms
subgraph-mouse-sweep: layout count 16
subgraph-mouse-sweep: style recalc count 77
subgraph-mouse-sweep: task duration 750ms
subgraph-mouse-sweep: script duration 105ms
subgraph-mouse-sweep: TBT 0ms
subgraph-mouse-sweep: heap used 72.5 MB
subgraph-mouse-sweep: DOM nodes -124
subgraph-mouse-sweep: event listeners -95
subgraph-transition-enter: avg frame time 19ms
subgraph-transition-enter: p95 frame time 17ms
subgraph-transition-enter: layout duration 15ms
subgraph-transition-enter: style recalc duration 28ms
subgraph-transition-enter: layout count 5
subgraph-transition-enter: style recalc count 17
subgraph-transition-enter: task duration 944ms
subgraph-transition-enter: script duration 31ms
subgraph-transition-enter: TBT 128ms
subgraph-transition-enter: heap used 102.6 MB
subgraph-transition-enter: DOM nodes 14570
subgraph-transition-enter: event listeners 2458
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 19ms
viewport-pan-sweep: layout count 0
viewport-pan-sweep: style recalc count 251
viewport-pan-sweep: task duration 5512ms
viewport-pan-sweep: script duration 2677ms
viewport-pan-sweep: TBT 0ms
viewport-pan-sweep: heap used 65.5 MB
viewport-pan-sweep: DOM nodes -154
viewport-pan-sweep: event listeners -74
vue-large-graph-idle: avg frame time 31ms
vue-large-graph-idle: p95 frame time 67ms
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 17426ms
vue-large-graph-idle: script duration 275ms
vue-large-graph-idle: TBT 0ms
vue-large-graph-idle: heap used 173.5 MB
vue-large-graph-idle: DOM nodes -3046
vue-large-graph-idle: event listeners -14915
vue-large-graph-pan: avg frame time 42ms
vue-large-graph-pan: p95 frame time 83ms
vue-large-graph-pan: layout duration 0ms
vue-large-graph-pan: style recalc duration 15ms
vue-large-graph-pan: layout count 0
vue-large-graph-pan: style recalc count 182
vue-large-graph-pan: task duration 22568ms
vue-large-graph-pan: script duration 905ms
vue-large-graph-pan: TBT 15ms
vue-large-graph-pan: heap used 179.2 MB
vue-large-graph-pan: DOM nodes -3046
vue-large-graph-pan: event listeners -14915
vue-node-resize-workload: avg frame time 37ms
vue-node-resize-workload: p95 frame time 75ms
vue-node-resize-workload: layout duration 24ms
vue-node-resize-workload: style recalc duration 74ms
vue-node-resize-workload: layout count 20
vue-node-resize-workload: style recalc count 20
vue-node-resize-workload: task duration 6414ms
vue-node-resize-workload: script duration 108ms
vue-node-resize-workload: TBT 0ms
vue-node-resize-workload: heap used 206.2 MB
vue-node-resize-workload: DOM nodes 0
vue-node-resize-workload: event listeners 0
vue-zoom-out-idle: avg frame time 32ms
vue-zoom-out-idle: p95 frame time 67ms
vue-zoom-out-idle: layout duration 0ms
vue-zoom-out-idle: style recalc duration 0ms
vue-zoom-out-idle: layout count 0
vue-zoom-out-idle: style recalc count 0
vue-zoom-out-idle: task duration 8987ms
vue-zoom-out-idle: script duration 138ms
vue-zoom-out-idle: TBT 0ms
vue-zoom-out-idle: heap used 174.0 MB
vue-zoom-out-idle: DOM nodes -3076
vue-zoom-out-idle: event listeners -14915
workflow-execution: avg frame time 17ms
workflow-execution: p95 frame time 17ms
workflow-execution: layout duration 1ms
workflow-execution: style recalc duration 12ms
workflow-execution: layout count 3
workflow-execution: style recalc count 14
workflow-execution: task duration 108ms
workflow-execution: script duration 11ms
workflow-execution: TBT 0ms
workflow-execution: heap used 68.4 MB
workflow-execution: DOM nodes 126
workflow-execution: event listeners 49
agent-composer-empty-conversation-typing: avg frame time 17ms
agent-composer-empty-conversation-typing: p95 frame time 17ms
agent-composer-empty-conversation-typing: layout duration 24ms
agent-composer-empty-conversation-typing: style recalc duration 82ms
agent-composer-empty-conversation-typing: layout count 76
agent-composer-empty-conversation-typing: style recalc count 78
agent-composer-empty-conversation-typing: task duration 748ms
agent-composer-empty-conversation-typing: script duration 311ms
agent-composer-empty-conversation-typing: TBT 0ms
agent-composer-empty-conversation-typing: heap used 70.6 MB
agent-composer-empty-conversation-typing: DOM nodes 76
agent-composer-empty-conversation-typing: event listeners 876
agent-composer-long-conversation-typing: avg frame time 17ms
agent-composer-long-conversation-typing: p95 frame time 17ms
agent-composer-long-conversation-typing: layout duration 28ms
agent-composer-long-conversation-typing: style recalc duration 243ms
agent-composer-long-conversation-typing: layout count 76
agent-composer-long-conversation-typing: style recalc count 78
agent-composer-long-conversation-typing: task duration 1306ms
agent-composer-long-conversation-typing: script duration 456ms
agent-composer-long-conversation-typing: TBT 0ms
agent-composer-long-conversation-typing: heap used 108.3 MB
agent-composer-long-conversation-typing: DOM nodes 76
agent-composer-long-conversation-typing: event listeners 876
Raw data
{
  "timestamp": "2026-10-06T16:14:04.144Z",
  "gitSha": "18279a2f000a8b04733bb104be7ae0174236c39f",
  "branch": "jaeone94/native-lora-stack-e2e",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2020.196999999996,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 3.6070000000000007,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 435.87199999999996,
      "heapDeltaBytes": 7430928,
      "heapUsedBytes": 77017264,
      "domNodes": 0,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 9.136999999999992,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666115702479342,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-idle",
      "durationMs": 2020.3970000000027,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 3.882999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 425.731,
      "heapDeltaBytes": 7449992,
      "heapUsedBytes": 75837816,
      "domNodes": 0,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 8.523999999999997,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.665289256198346,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1724.896000000001,
      "styleRecalcs": 73,
      "styleRecalcDurationMs": 15.066999999999998,
      "layouts": 12,
      "layoutDurationMs": 4.268,
      "taskDurationMs": 786.265,
      "heapDeltaBytes": 3678112,
      "heapUsedBytes": 72365324,
      "domNodes": 0,
      "jsHeapTotalBytes": 524288,
      "scriptDurationMs": 155.50599999999997,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66601941747573,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1720.3100000000404,
      "styleRecalcs": 72,
      "styleRecalcDurationMs": 13.929,
      "layouts": 12,
      "layoutDurationMs": 4.11,
      "taskDurationMs": 792.183,
      "heapDeltaBytes": 3211360,
      "heapUsedBytes": 72815048,
      "domNodes": 0,
      "jsHeapTotalBytes": 524288,
      "scriptDurationMs": 152.758,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66601941747573,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1703.2759999999598,
      "styleRecalcs": 20,
      "styleRecalcDurationMs": 5.975000000000001,
      "layouts": 3,
      "layoutDurationMs": 0.853,
      "taskDurationMs": 332.91999999999996,
      "heapDeltaBytes": 5025768,
      "heapUsedBytes": 65386160,
      "domNodes": 45,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 9.659,
      "eventListeners": 39,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66568627450981,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "canvas-zoom-sweep",
      "durationMs": 1692.8020000000288,
      "styleRecalcs": 18,
      "styleRecalcDurationMs": 5.302000000000001,
      "layouts": 3,
      "layoutDurationMs": 0.8989999999999998,
      "taskDurationMs": 324.49899999999997,
      "heapDeltaBytes": 9737820,
      "heapUsedBytes": 78127440,
      "domNodes": 45,
      "jsHeapTotalBytes": 524288,
      "scriptDurationMs": 9.603,
      "eventListeners": 39,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66568627450981,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 627.6039999999625,
      "styleRecalcs": 15,
      "styleRecalcDurationMs": 3.5200000000000005,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 447.1069999999999,
      "heapDeltaBytes": -5735556,
      "heapUsedBytes": 62683076,
      "domNodes": 0,
      "jsHeapTotalBytes": 524288,
      "scriptDurationMs": 163.75400000000002,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.665789473684214,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 625.4020000000082,
      "styleRecalcs": 14,
      "styleRecalcDurationMs": 3.0900000000000007,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 439.452,
      "heapDeltaBytes": -4949844,
      "heapUsedBytes": 63616288,
      "domNodes": 0,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 159.42499999999998,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.664864864864875,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-order-dense-n200-w200-i120",
      "durationMs": 1142.5219999999854,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 805.686,
      "heapDeltaBytes": 17271236,
      "heapUsedBytes": 87706328,
      "domNodes": 0,
      "jsHeapTotalBytes": 2785280,
      "scriptDurationMs": 67.38,
      "eventListeners": 0,
      "totalBlockingTimeMs": 522,
      "frameDurationMs": 33.82058823529413,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "dom-widget-order-dense-n200-w200-i120",
      "durationMs": 1147.8419999999687,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 809.2649999999999,
      "heapDeltaBytes": 12954644,
      "heapUsedBytes": 95657472,
      "domNodes": 0,
      "jsHeapTotalBytes": 3047424,
      "scriptDurationMs": 69.66499999999999,
      "eventListeners": 0,
      "totalBlockingTimeMs": 521,
      "frameDurationMs": 33.82058823529411,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "dom-widget-order-sparse-n1000-w20-i120",
      "durationMs": 843.4489999999641,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 464.3330000000003,
      "heapDeltaBytes": 19019080,
      "heapUsedBytes": 100981304,
      "domNodes": 0,
      "jsHeapTotalBytes": 266240,
      "scriptDurationMs": 158.95399999999998,
      "eventListeners": 0,
      "totalBlockingTimeMs": 218,
      "frameDurationMs": 24.997058823529454,
      "p95FrameDurationMs": 16.80000000000109
    },
    {
      "name": "dom-widget-order-sparse-n1000-w20-i120",
      "durationMs": 847.0029999999724,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 476.658,
      "heapDeltaBytes": -6900852,
      "heapUsedBytes": 80276604,
      "domNodes": 0,
      "jsHeapTotalBytes": 266240,
      "scriptDurationMs": 166.28899999999996,
      "eventListeners": 0,
      "totalBlockingTimeMs": 216,
      "frameDurationMs": 25.0029411764706,
      "p95FrameDurationMs": 16.80000000000109
    },
    {
      "name": "extension-clean-combined-draw",
      "durationMs": 9696.504000000004,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 8734.484,
      "heapDeltaBytes": 24722176,
      "heapUsedBytes": 94701152,
      "domNodes": -141,
      "jsHeapTotalBytes": -5378048,
      "scriptDurationMs": 7484.4400000000005,
      "eventListeners": -65,
      "totalBlockingTimeMs": 1021,
      "frameDurationMs": 33.3319587628866,
      "p95FrameDurationMs": 66.69999999999891
    },
    {
      "name": "extension-clean-combined-draw",
      "durationMs": 9889.308999999912,
      "styleRecalcs": 2,
      "styleRecalcDurationMs": 0.451,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 9099.441,
      "heapDeltaBytes": 2677268,
      "heapUsedBytes": 88081508,
      "domNodes": -141,
      "jsHeapTotalBytes": -4067328,
      "scriptDurationMs": 7524.985,
      "eventListeners": -69,
      "totalBlockingTimeMs": 928,
      "frameDurationMs": 31.527388535031847,
      "p95FrameDurationMs": 50.100000000000364
    },
    {
      "name": "extension-rgthree-prototype-draw",
      "durationMs": 9516.132999999969,
      "styleRecalcs": 2,
      "styleRecalcDurationMs": 0.48300000000000076,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 8705.031,
      "heapDeltaBytes": -12125128,
      "heapUsedBytes": 73139644,
      "domNodes": -141,
      "jsHeapTotalBytes": -10096640,
      "scriptDurationMs": 7155.406,
      "eventListeners": -69,
      "totalBlockingTimeMs": 670,
      "frameDurationMs": 32.041414141414144,
      "p95FrameDurationMs": 50.100000000000364
    },
    {
      "name": "extension-rgthree-prototype-draw",
      "durationMs": 10427.870999999981,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 9594.069999999998,
      "heapDeltaBytes": 4682808,
      "heapUsedBytes": 85969100,
      "domNodes": 0,
      "jsHeapTotalBytes": -7602176,
      "scriptDurationMs": 7974.509999999999,
      "eventListeners": 0,
      "totalBlockingTimeMs": 1131,
      "frameDurationMs": 31.18622754491018,
      "p95FrameDurationMs": 50.100000000000364
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2012.9499999999894,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 3.986999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 502.0830000000001,
      "heapDeltaBytes": -2813696,
      "heapUsedBytes": 87061872,
      "domNodes": 0,
      "jsHeapTotalBytes": -225280,
      "scriptDurationMs": 32.361999999999995,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.665289256198346,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-idle",
      "durationMs": 2023.458000000005,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 3.497,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 510.69300000000004,
      "heapDeltaBytes": -4923944,
      "heapUsedBytes": 75167676,
      "domNodes": 0,
      "jsHeapTotalBytes": 36864,
      "scriptDurationMs": 33.841,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666115702479342,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2293.1280000000243,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 7.055000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1590.2950000000003,
      "heapDeltaBytes": -9742648,
      "heapUsedBytes": 80198448,
      "domNodes": 0,
      "jsHeapTotalBytes": 1310720,
      "scriptDurationMs": 831.446,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66521739130435,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-pan",
      "durationMs": 2228.4200000000283,
      "styleRecalcs": 70,
      "styleRecalcDurationMs": 7.069000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1564.12,
      "heapDeltaBytes": -9700668,
      "heapUsedBytes": 80317284,
      "domNodes": 0,
      "jsHeapTotalBytes": 786432,
      "scriptDurationMs": 827.659,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.665413533834588,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3496.3149999999814,
      "styleRecalcs": 71,
      "styleRecalcDurationMs": 8.122999999999998,
      "layouts": 60,
      "layoutDurationMs": 15.520999999999999,
      "taskDurationMs": 1643.5420000000001,
      "heapDeltaBytes": 5323000,
      "heapUsedBytes": 74323340,
      "domNodes": 24,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 778.9639999999999,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666028708133975,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "large-graph-zoom",
      "durationMs": 3539.965000000052,
      "styleRecalcs": 69,
      "styleRecalcDurationMs": 6.945000000000001,
      "layouts": 60,
      "layoutDurationMs": 15.414000000000001,
      "taskDurationMs": 1633.0099999999998,
      "heapDeltaBytes": 4166264,
      "heapUsedBytes": 69276544,
      "domNodes": 24,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 765.461,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66603773584906,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 3012.7499999999827,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 5.476999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1892.4270000000001,
      "heapDeltaBytes": 17983436,
      "heapUsedBytes": 87564640,
      "domNodes": 0,
      "jsHeapTotalBytes": 1466368,
      "scriptDurationMs": 993.4680000000001,
      "eventListeners": 180,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.851955307262575,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "legacy-node-drag",
      "durationMs": 2910.441999999989,
      "styleRecalcs": 47,
      "styleRecalcDurationMs": 5.6960000000000015,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 1850.4550000000002,
      "heapDeltaBytes": 17259568,
      "heapUsedBytes": 87426472,
      "domNodes": 0,
      "jsHeapTotalBytes": 1204224,
      "scriptDurationMs": 968.363,
      "eventListeners": 180,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.86046511627907,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "minimap-idle",
      "durationMs": 2009.0829999999755,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 4.043,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 519.281,
      "heapDeltaBytes": 19996684,
      "heapUsedBytes": 88799448,
      "domNodes": 0,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 32.72499999999999,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666115702479335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "minimap-idle",
      "durationMs": 2013.1559999999808,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 2.8970000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 496.53399999999993,
      "heapDeltaBytes": -5020592,
      "heapUsedBytes": 75704120,
      "domNodes": 0,
      "jsHeapTotalBytes": -225280,
      "scriptDurationMs": 30.401999999999997,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666115702479335,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 578.8739999999848,
      "styleRecalcs": 46,
      "styleRecalcDurationMs": 4.765000000000001,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 397.079,
      "heapDeltaBytes": -9957704,
      "heapUsedBytes": 60821224,
      "domNodes": 0,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 148.894,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.66571428571429,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 565.2810000000272,
      "styleRecalcs": 49,
      "styleRecalcDurationMs": 5.769,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 387.81000000000006,
      "heapDeltaBytes": -9129640,
      "heapUsedBytes": 61560124,
      "domNodes": 0,
      "jsHeapTotalBytes": 786432,
      "scriptDurationMs": 138.685,
      "eventListeners": 6,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.667647058823523,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2006.7379999999844,
      "styleRecalcs": 11,
      "styleRecalcDurationMs": 3.7790000000000012,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 434.52399999999994,
      "heapDeltaBytes": 3856600,
      "heapUsedBytes": 68372148,
      "domNodes": 0,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 7.854,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666115702479342,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2023.22300000003,
      "styleRecalcs": 10,
      "styleRecalcDurationMs": 4.288,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 434.7099999999999,
      "heapDeltaBytes": 7745064,
      "heapUsedBytes": 78521012,
      "domNodes": 0,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 8.959000000000001,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.666115702479335,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1715.849999999989,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 18.075,
      "layouts": 16,
      "layoutDurationMs": 6.607,
      "taskDurationMs": 776.125,
      "heapDeltaBytes": -34666704,
      "heapUsedBytes": 75679452,
      "domNodes": -248,
      "jsHeapTotalBytes": -2621440,
      "scriptDurationMs": 106.283,
      "eventListeners": -190,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.6656862745098,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1699.897999999962,
      "styleRecalcs": 76,
      "styleRecalcDurationMs": 14.611,
      "layouts": 16,
      "layoutDurationMs": 6.047000000000001,
      "taskDurationMs": 724.405,
      "heapDeltaBytes": 21200624,
      "heapUsedBytes": 76306488,
      "domNodes": 0,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 102.99600000000001,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.6656862745098,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "subgraph-transition-enter",
      "durationMs": 1418.43300000005,
      "styleRecalcs": 17,
      "styleRecalcDurationMs": 27.788000000000007,
      "layouts": 5,
      "layoutDurationMs": 14.591,
      "taskDurationMs": 944.404,
      "heapDeltaBytes": 32206940,
      "heapUsedBytes": 107623760,
      "domNodes": 14570,
      "jsHeapTotalBytes": 3145728,
      "scriptDurationMs": 30.887999999999998,
      "eventListeners": 2458,
      "totalBlockingTimeMs": 128,
      "frameDurationMs": 19.368918918918908,
      "p95FrameDurationMs": 16.80000000000109
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8339.60300000001,
      "styleRecalcs": 250,
      "styleRecalcDurationMs": 19.055000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 5428.626,
      "heapDeltaBytes": -65042616,
      "heapUsedBytes": 65090836,
      "domNodes": -308,
      "jsHeapTotalBytes": -2719744,
      "scriptDurationMs": 2597.8219999999997,
      "eventListeners": -148,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.665868263473055,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "viewport-pan-sweep",
      "durationMs": 8405.748000000018,
      "styleRecalcs": 251,
      "styleRecalcDurationMs": 19.768,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 5595.409,
      "heapDeltaBytes": -17809236,
      "heapUsedBytes": 72224856,
      "domNodes": 0,
      "jsHeapTotalBytes": 561152,
      "scriptDurationMs": 2756.0480000000002,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.69920477137177,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 18376.27500000002,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 17487.963,
      "heapDeltaBytes": -17669068,
      "heapUsedBytes": 182823724,
      "domNodes": -3046,
      "jsHeapTotalBytes": 8146944,
      "scriptDurationMs": 277.995,
      "eventListeners": -14915,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 31.287904599659285,
      "p95FrameDurationMs": 66.60000000000036
    },
    {
      "name": "vue-large-graph-idle",
      "durationMs": 18393.87199999999,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 17363.63,
      "heapDeltaBytes": -34132996,
      "heapUsedBytes": 181104968,
      "domNodes": -3046,
      "jsHeapTotalBytes": 5816320,
      "scriptDurationMs": 272.856,
      "eventListeners": -14915,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 31.209847198641768,
      "p95FrameDurationMs": 66.59999999999854
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 23316.68099999996,
      "styleRecalcs": 182,
      "styleRecalcDurationMs": 15.517000000000003,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 22935.101000000002,
      "heapDeltaBytes": -23413796,
      "heapUsedBytes": 187933748,
      "domNodes": -3046,
      "jsHeapTotalBytes": 6574080,
      "scriptDurationMs": 880.2710000000001,
      "eventListeners": -14915,
      "totalBlockingTimeMs": 23,
      "frameDurationMs": 42.62468007312614,
      "p95FrameDurationMs": 83.40000000000146
    },
    {
      "name": "vue-large-graph-pan",
      "durationMs": 22656.61799999998,
      "styleRecalcs": 182,
      "styleRecalcDurationMs": 15.114000000000017,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 22200.025999999998,
      "heapDeltaBytes": -22853376,
      "heapUsedBytes": 187799952,
      "domNodes": -3046,
      "jsHeapTotalBytes": 7622656,
      "scriptDurationMs": 929.9929999999998,
      "eventListeners": -14915,
      "totalBlockingTimeMs": 6,
      "frameDurationMs": 41.81881918819188,
      "p95FrameDurationMs": 83.39999999999964
    },
    {
      "name": "vue-node-resize-workload",
      "durationMs": 6497.838000000002,
      "styleRecalcs": 20,
      "styleRecalcDurationMs": 72.60100000000003,
      "layouts": 20,
      "layoutDurationMs": 23.823999999999998,
      "taskDurationMs": 6370.913,
      "heapDeltaBytes": 5263312,
      "heapUsedBytes": 216174408,
      "domNodes": 0,
      "jsHeapTotalBytes": 524288,
      "scriptDurationMs": 107.077,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 37.789534883720926,
      "p95FrameDurationMs": 83.29999999999927
    },
    {
      "name": "vue-node-resize-workload",
      "durationMs": 6579.576999999972,
      "styleRecalcs": 20,
      "styleRecalcDurationMs": 75.65899999999998,
      "layouts": 20,
      "layoutDurationMs": 24.59499999999999,
      "taskDurationMs": 6456.333,
      "heapDeltaBytes": 1261548,
      "heapUsedBytes": 216177008,
      "domNodes": 0,
      "jsHeapTotalBytes": 786432,
      "scriptDurationMs": 107.98,
      "eventListeners": 0,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 37.19265536723163,
      "p95FrameDurationMs": 66.80000000000109
    },
    {
      "name": "vue-zoom-out-idle",
      "durationMs": 9375.540999999997,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 8938.824000000002,
      "heapDeltaBytes": -32950224,
      "heapUsedBytes": 182692520,
      "domNodes": -3076,
      "jsHeapTotalBytes": 7622656,
      "scriptDurationMs": 136.29400000000004,
      "eventListeners": -14915,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 31.592255892255896,
      "p95FrameDurationMs": 66.59999999999854
    },
    {
      "name": "vue-zoom-out-idle",
      "durationMs": 9505.52700000003,
      "styleRecalcs": 0,
      "styleRecalcDurationMs": 0,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 9034.346999999998,
      "heapDeltaBytes": -29502396,
      "heapUsedBytes": 182276764,
      "domNodes": -3076,
      "jsHeapTotalBytes": 4390912,
      "scriptDurationMs": 138.73500000000004,
      "eventListeners": -14915,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 32.20203389830509,
      "p95FrameDurationMs": 66.60000000000218
    },
    {
      "name": "workflow-execution",
      "durationMs": 480.1660000000538,
      "styleRecalcs": 20,
      "styleRecalcDurationMs": 13.938,
      "layouts": 3,
      "layoutDurationMs": 1.3929999999999998,
      "taskDurationMs": 137.923,
      "heapDeltaBytes": 6486436,
      "heapUsedBytes": 73250008,
      "domNodes": 135,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 15.321999999999996,
      "eventListeners": 81,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.665517241379284,
      "p95FrameDurationMs": 16.800000000000182
    },
    {
      "name": "workflow-execution",
      "durationMs": 108.21999999996024,
      "styleRecalcs": 8,
      "styleRecalcDurationMs": 9.387999999999998,
      "layouts": 2,
      "layoutDurationMs": 1.3279999999999998,
      "taskDurationMs": 78.398,
      "heapDeltaBytes": 3871112,
      "heapUsedBytes": 70177416,
      "domNodes": 117,
      "jsHeapTotalBytes": 0,
      "scriptDurationMs": 6.783000000000001,
      "eventListeners": 17,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.671428571428546,
      "p95FrameDurationMs": 16.699999999999818
    },
    {
      "name": "agent-composer-empty-conversation-typing",
      "durationMs": 733.5199999999986,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 80.591,
      "layouts": 76,
      "layoutDurationMs": 23.413,
      "taskDurationMs": 702.573,
      "heapDeltaBytes": 16654772,
      "heapUsedBytes": 84669176,
      "domNodes": 76,
      "jsHeapTotalBytes": 262144,
      "scriptDurationMs": 288.76199999999994,
      "eventListeners": 876,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.665909090909075,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "agent-composer-empty-conversation-typing",
      "durationMs": 821.4290000000801,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 84.04,
      "layouts": 76,
      "layoutDurationMs": 24.035999999999998,
      "taskDurationMs": 793.6650000000001,
      "heapDeltaBytes": -12684736,
      "heapUsedBytes": 63484432,
      "domNodes": 76,
      "jsHeapTotalBytes": 17039360,
      "scriptDurationMs": 333.05999999999995,
      "eventListeners": 876,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.665306122448985,
      "p95FrameDurationMs": 16.799999999999272
    },
    {
      "name": "agent-composer-long-conversation-typing",
      "durationMs": 1247.2080000000005,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 238.1,
      "layouts": 76,
      "layoutDurationMs": 26.341,
      "taskDurationMs": 1232.632,
      "heapDeltaBytes": -19616932,
      "heapUsedBytes": 112996268,
      "domNodes": 76,
      "jsHeapTotalBytes": 786432,
      "scriptDurationMs": 430.816,
      "eventListeners": 876,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 16.665789473684203,
      "p95FrameDurationMs": 16.700000000000728
    },
    {
      "name": "agent-composer-long-conversation-typing",
      "durationMs": 1401.8119999999499,
      "styleRecalcs": 78,
      "styleRecalcDurationMs": 248.512,
      "layouts": 76,
      "layoutDurationMs": 28.71,
      "taskDurationMs": 1378.512,
      "heapDeltaBytes": -18799384,
      "heapUsedBytes": 114206396,
      "domNodes": 76,
      "jsHeapTotalBytes": 1048576,
      "scriptDurationMs": 481.351,
      "eventListeners": 876,
      "totalBlockingTimeMs": 0,
      "frameDurationMs": 17.498749999999994,
      "p95FrameDurationMs": 16.80000000000109
    }
  ]
}

🔬 E2E Coverage

Metric Covered Total Pct
Lines 54418 83984 64.8% 🟡
Functions 0 0 — —
Branches 0 0 — —
Top 10 files by uncovered lines
File Coverage Missed
src/LGraphCanvas.ts 66.8% 1167
src/LGraphNode.ts 70.6% 387
src/platform/workspace/stores/billingOperationStore.ts 7.8% 366
src/renderer/extensions/layerEditor/composables/useLayerEditorSession.ts 40.1% 332
src/core/billing/operationLifecycle.ts 1.3% 303
src/LGraph.ts 79.0% 272
src/platform/workspace/stores/teamWorkspaceStore.ts 39.3% 258
src/scripts/app.ts 73.0% 255
src/core/webSessionIdentity.ts 3.3% 231
src/scripts/pnginfo.ts 20.7% 222

🧩 Custom Nodes Ecosystem Matrix: ✅ Passed

Executes the frontend JS of every registry pack that ships any, against this change, in both renderers. The eight ecosystem-matrix shard checks are a harness self-test; the pack verdict is matrix-verdict.

Stage Result What a failure here means
pin-status success Informational. It never fails the build; it warns when the corpus snapshot is over 30 days old.
corpus success Infrastructure: the pack mirror could not be fetched, validated or cached. Not your diff.
shards success Harness integrity, not pack breakage. A shard only checks that every built spec wrote its row; vitest's own exit code is deliberately ignored because pack code leaks unhandled rejections.
verdicts success The population verdict per renderer. This is the stage that judges packs. Exit 1 is FAIL; exit 2 is withheld — rows were missing, so nothing was measured, which is not the same as your change breaking packs.
detection-proofs success The instrument self-test: the matrix must FAIL on a deliberately poisoned corpus. A failure here means the gate cannot be trusted this run, in either direction.

On a pin-bump PR, a red gate means the ecosystem moved — not that your diff broke something. That is what the bump PR is for. Outside a pin bump or a cold rebuild of the unpinned tail, a red means the diff.

Note the corpus size and the executed count are different numbers, and the verdict is against the executed count: roughly 3,100 of ~5,100 packs ship no extension-shaped JS and are skipped.

Reproduce locally
# build one shard's fixture, then run it
python3 scripts/registry-census/build_matrix.py --shard 1/4
MATRIX_RENDERER=vue MATRIX_VUE=1 \
  npx vitest run --config vitest.matrix.config.mts

Full docs: scripts/registry-census/README.md

@github-actions github-actions Bot added the risk:xhigh PR risk grade (advisory shadow check; grader-owned) label Oct 6, 2026
@codecov

codecov Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@                       Coverage Diff                       @@
##           jaeone94/dynamic-asset-widgets   #20307   +/-   ##
===============================================================
  Coverage                           86.25%   86.26%           
===============================================================
  Files                                2483     2483           
  Lines                              141109   141109           
  Branches                            38341    38348    +7     
===============================================================
+ Hits                               121716   121723    +7     
+ Misses                              19012    19005    -7     
  Partials                              381      381           
Flag Coverage Δ
e2e 64.79% <ø> (+<0.01%) ⬆️
unit 83.57% <ø> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.
see 9 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:xhigh PR risk grade (advisory shadow check; grader-owned)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant