You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
READ THIS FILE at the start of every session.
Update STATUS and COMPLETED fields after finishing each item.
Last updated: 2026-05-14
How to use this file
Each feature has:
STATUS: [ ] = not started · [~] = in progress · [x] = done
Phase: order to implement
Files: which files to create or edit
Notes: gotchas, design decisions, dependencies
Phase 1 — "What does this node do?" Tooltip ← CURRENT
User story: Hover a node title for 800 ms → floating card explains the node in plain English. LLM backend: Cloud API → Qwen3.5-2B-Q4_K_M GGUF (auto-download) → deterministic fallback.
User story: Intercept red error toasts → rewrite "CUDA out of memory" → friendly plain-English with suggested fix. Relation to existing code:error_assistant.py already does server-side explanation. This is a JS-side toast interceptor that calls /mec/explain_error and replaces the toast text.
Item
STATUS
js/mec_error_toast.js — MutationObserver on .p-toast-message-error + /mec/translate_error
[x]
nodes/error_translator.py — POST /mec/translate_error bridges to error_assistant.explain()
[x]
__init__.py — register routes
[x]
Notes
ComfyUI toast selector: .p-toast .p-toast-message-text or via app.extensionManager.toast
Must NOT modify ComfyUI core; use MutationObserver on toast container
Show "original" message on hover over the friendly message (tooltip-in-tooltip)
Phase 3 — Execution Flame Graph
User story: After a run completes, show a horizontal bar chart of per-node execution time. Relation to existing code:insight.py already collects per-node timing (elapsed_ms). The mec_diagnostics_sidebar.js has a statistics tab. Extend it with a new "Flame" tab.
Sort by elapsed_ms descending so bottlenecks are at top
Only show last completed prompt run (filter by prompt_id)
Phase 4 — Live Tensor Inspector
User story: Click any LATENT/IMAGE/MASK wire mid-graph → side panel shows shape, dtype, min/max/mean. Relation to existing code:VAELatentInspectorMEC node already exists (executes in graph). This is a real-time wired-link inspector triggered by clicking a link on the canvas.
Item
STATUS
js/mec_tensor_inspector.js — right-click node menu "🔬 Inspect tensor outputs"
[x]
nodes/tensor_inspector.py — wraps execution.get_output_data, stats ring buffer, routes
[x]
__init__.py — register routes
[x]
Notes
LiteGraph link click: override LGraphCanvas.prototype.processLinkClick
Tensor stats arrive via insight hook's node_done event — map output slot to tensor
Phase 5 — Complexity Meter HUD
User story: Small floating HUD showing node count, estimated VRAM, and Easy/Medium/Advanced rating.
Item
STATUS
js/mec_complexity_hud.js — floating chip with Easy/Medium/Advanced tier
[x]
VRAM estimate: deferred to Phase 13 (Render Cost Estimator)
Default sweep: current seed to current+7 (8 images grid)
Queue via app.queuePrompt(0, 1) after updating seed value in node
Show progress indicator: "Sweep 3/8 running"
Phase 8 — "What's Wired" Mini Map Legend
User story: Floating legend showing active model name, sampler, and resolution in plain text.
Item
STATUS
js/mec_whats_wired.js — scan graph for CheckpointLoaderSimple, KSampler, VAEDecode
[x]
Notes
Scan app.graph._nodes for known node types on each graph-changed
Extract widget values by name: node.widgets.find(w => w.name === "ckpt_name")
Show: "Model: v1-5 · Sampler: euler · 512×512"
Position: top-right overlay on canvas
Phase 9 — LoRA Weight Scrubber
User story: Inline micro-slider on LoRA loader nodes — live re-queues on mouseup. Relation to existing code:ParameterHistoryMEC already tracks parameter changes.
Item
STATUS
js/mec_lora_scrubber.js — inject inline slider on LoraLoader* node widgets
[x]
Notes
Hook beforeRegisterNodeDef for nodes whose type is COMBO and category includes "loaders"
Range: 0.0 to 2.0, step 0.05
Debounce mouseup → app.queuePrompt()
Phase 10 — Prompt Token Counter
User story: Live count of CLIP tokens used in text encoder nodes, with 75/150 boundary warnings.
Item
STATUS
js/mec_token_counter.js — hook STRING widgets on CLIPTextEncode nodes
mec_colorspace_badges.js (heuristic OCIO badge on IMAGE-typed nodes)
2026-05-14
Polish
FolderIncrementer suffix widget (basename suffix, e.g. _Inpaint); progress HUD rewrite with rolling-window ETA + rate (it/s) + smoothing + animated header bar + "⏳ NN%" title prefix; tqdm bar_format now includes n/total and rate_fmt
2026-05-14
v1.28.1
Integrity chip redesigned: ⛨ INT 24 pill (28px, Catppuccin red/yellow/green, soft pulse halo, blue "SCAN" state while first scan runs). Error translator now learns: new POST /mec/teach_error route writes user-taught patterns to patterns/user/learned.json and hot-reloads them; matching toasts gain a 📚 Teach me button that opens an inline dialog (auto-suggests a forgiving regex from the raw error text). New GET /mec/learned_patterns lists the user pack. Verified end-to-end: taught pattern matches a digit-variant of the original message on first try.
2026-05-14
v1.29.0
Brand:(MEC) → (C2C) display-name + category rebrand for every node except the two flagship masking nodes MaskEditMEC and MaskOpsMEC, which keep (MEC) and category MaskEditControl/*. Categories MaskEditControl/* and MEC/* renamed to C2C/* on all other nodes. Class names unchanged → zero workflow breakage. Touched 63 files in ComfyUI-CustomNodePacks + 8 files in ComfyUI-NukeMaxNodes. Verified live: 2 (MEC) names remain (the two flagships), 45 (C2C) names registered. Full visual stress sweep 154/154 PASS (trailing 12 canvas-pollution FAIL_ADDs all recover on isolated retry, same pattern as v1.28.1).
2026-05-14
v1.30.0
C2C Launcher sidebar (js/c2c_launcher.js): single pi pi-th-large sidebar tab consolidates the 8 right-rail floating action buttons (🧙 Wizard, 📚 Group Presets, 🎨 Mood, 🎰 Surprise Me, ⚖ A/B, 💰 Cost, ⏱ Flame, ↶ Undo) into a 2-column Catppuccin grid. Non-invasive bridge — each module still mounts its floating button on document.body, the launcher injects a display:none !important hide-style and .click()-delegates from sidebar tiles. Setting c2c.launcher.consolidate (default ON) toggles the hide-rule; OFF restores legacy right-rail. Diagnostics sidebar user-visible labels renamed MEC Diagnostics → C2C Diagnostics (registration id="mec.diagnostics" left as-is to preserve user-saved active-tab state). Cross-platform audit: every sys.platform=="win32" branch in integrity_guard.py + folder_incrementer.py is properly guarded; no hard-coded drive letters; path-filter fragments include both \\…\\ and /…/ forms. Live browser verified: launcher tab registers (id=c2c.launcher), all 8 floats display:none, click delegation confirmed (Surprise Me tile → underlying _surprise ran and queued).
2026-05-14
v1.30.1
C2C Diagnostics header banner (js/mec_diagnostics_sidebar.js): 32 px gradient C2C logo + "Diagnostics / Code2Collapse" wordmark + two live status pills at the top of the sidebar — INT N (subscribes to window.__MEC_INTEGRITY__, click opens the integrity dialog, colors red/yellow/green by error/warn/ok counts) and N evt (polls /mec/diagnostics/recent every 6 s, shows total + error count). Empty state gets a ◌ glyph for visual interest. Sidebar tab tooltip rebranded MaskEditControl diagnostics… → Code2Collapse — diagnostics, statistics, clipboard history, integrity & error patterns. Live browser verified: header mounts, INT pill picked up 1 event from the integrity bus, tooltip correct.