- Clicking a duplicate-stack badge could freeze ComfyUI: displayAssets,
the per-card ref callback (syncRenderedDuplicateCards) and the live
upsert dedupe each rewrote _mjrDupStack/_mjrDupMembers on reactive
assets read by the grid template, with a new array every pass and
conflicting representatives. The ref callback ran on every render, so
each write scheduled another render (no recursion limit in prod Vue).
- Compute duplicate stacks only in buildDisplayAssets with change-guarded
writes and stable member arrays; keep one ref callback per card; stop
the other passes from touching duplicate fields.
- A duplicate is now the same name in the same source/root/subfolder:
files sharing a name in different folders are no longer stacked,
hidden from the grid or given another file's generation time.
- The duplicates view lists every copy using cycle-free member copies.
- Add regression tests (render-loop idempotence, folder scoping).