The worker's generate_image() call was only passing basic parameters
(seed, steps, cfg, sampler, scheduler, denoise, attention_mode) but
missing all advanced/model-specific parameters that the local path
passes. This caused workers to produce different images than local runs.
Added missing parameters:
- model_sampling_override (noise schedule for Flux/SD3/AuraFlow)
- model_sampling_shift (shift values for model sampling)
- model_sampling_flux_max_shift / model_sampling_flux_base_shift
- use_advanced_sampling (SamplerCustomAdvanced vs standard KSampler)
- advanced_guider / advanced_scheduler
- flux_guidance_value
- width / height (for Flux2Scheduler computation)
All parameters were already present in the job config dict from
expand_configs() but were never forwarded to generate_image().
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Removed standalone edit button (editor accessible via dropdown menu)
- Dropdown and Clear on their own row, custom WxH inputs on a second row
- Custom resolutions file moved to benchmarks/USCG-custom-resolutions.json
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Removed max-height and overflow-y:auto from all submenu levels so
nested menus can extend freely without being clipped by parent containers.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replaced tiny native <select> with large custom dropdown button
- 3-level nested submenu: Model Type > Orientation (Landscape/Portrait/Square) > Sizes
- Massively expanded built-in presets: SD1.5, SDXL, Illustrious/Pony, Flux, Wan/Video, HiRes/Upscale
- Custom Resolutions Editor modal for creating persistent user-defined resolutions
organized into named categories
- Custom resolutions saved to ComfyUI output/USCG-custom-resolutions.json
- Custom category always appears first in the dropdown menu
- Edit button (pencil emoji) for quick access to the custom editor
- Backend: GET/POST /configbuilder/custom_resolutions endpoints
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Three bugs fixed:
1. Global Prompt data was incorrectly loaded into Custom Prompts when
loading a session. Added _prompt_source flag ("global"/"custom") to
configs so the round-trip loader can distinguish between them and
restore global prompts to the correct section.
2. Checkbox toggle was not visually broken but appeared non-functional
because bug #1 caused global prompts to populate custom prompt fields,
making the state confusing. Now correctly separated.
3. Prompt combination count in the section header was only computed at
render time and never updated when groups changed. Added live update
via updatePromptCountDisplay() in the onChange callback.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Previously, check_if_job_completed() with optional inputs would only
match on sampler/scheduler/steps/cfg/denoise/seed — skipping model,
prompt, and lora checks. This caused false positive matches, skipping
jobs even when the user changed models via optional input nodes.
Now returns -1 (no match) immediately when has_optional_inputs=True,
forcing all jobs to re-generate since upstream changes can't be detected.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The conditioning serialization was only preserving pooled_output, dropping
critical keys like attention_mask that Wan/T5 models need for proper
sampling. This caused KSampler to produce NaN latents on distributed workers.
Includes backwards compatibility with old serialization format.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Worker now clones latent and frees UNet tensors + CUDA cache before
VAE decode, giving Dynamic VRAM clean memory for VAE loading.
decode_latent_with_vae now detects NaN in input/output, logs diagnostic
info, retries with float32, and handles bfloat16->numpy conversion.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Worker threads run outside ComfyUI's execution engine which wraps
everything in torch.inference_mode(). Without it, Dynamic VRAM's lazy
weight loading produces NaN during VAE decode, causing black images.
Matches ComfyUI's execution.py:703 pattern.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds color-coded metadata labels (model, lora, prompt, sampler,
scheduler, cfg, steps, seed, denoise) as image overlays in the
dashboard grid. Settings panel with per-field toggles and unique-only
mode that hides values shared by every card. Per-lora filtering skips
global loras while showing unique ones. Persisted via localStorage,
backwards compatible with older sessions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When mouse wheel zoom fired during a click-drag pan, the zoom function
updated panOffset for the zoom pivot but the next mousemove overwrote
it using stale panStart values, causing a position jump. Now tracks
last mouse position and recalculates panStart after zoom adjustments.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ComfyUI v16.3's Dynamic VRAM uses ModelPatcherDynamic which asserts
force_patch_weights=False. Removed the flag from both CLIP GPU loading
calls to match ComfyUI's own CLIP.load_model() pattern. Backwards
compatible with older ComfyUI versions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds HTML5 drag-and-drop reordering within each list in the Config
Builder UI. Drag the ⠿ handle on any card header to change run order.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix Python 3.10 SyntaxError: extract backslash replace() out of f-string
expression in config_builder_node.py (issue #12)
- Fix dashboard iframe stealing focus from ComfyUI on every live update
by removing viewport.focus() from render/update paths in logic_virtual.js
- Intercept Ctrl+S in dashboard iframe and forward to ComfyUI parent
window so workflow save works instead of triggering browser Save As dialog
- Config Builder VAE settings now override sampler node's remote_vae_endpoint
via config_overrides_vae flag in generation_orchestrator.py flush logic
- Fix Shift+1-9 column hotkeys: use e.code instead of e.key since Shift
produces symbols (!@#$) not digits for e.key on standard keyboards
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add distributed processing features (multi-worker, master text
encoding, model sync, per-worker logging)
- Add comprehensive AI development notes with architecture diagrams,
file dependency graphs, gotchas, and testing instructions
- Update file structure to include all 21 Python modules, distribution
files, and conf-builder-distribution.js
- Add distribution API routes reference
- Add distribution module descriptions and communication patterns
- Update data flow to include distribution pipeline
- Add 8 new critical development gotchas (13-20)
- Add new changelog entry for March 2026
- Bump version to 3.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
config_builder_node.py always wraps configs in {"configs": [...]},
but sampler_node.py only unwrapped the array when _distribution key
was present. Without distribution, the wrapped dict passed through
to expand_configs which iterated over dict keys (strings) instead
of config dicts, causing AttributeError on .get().
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
loadSession() in logic_pipeline.js was called unconditionally on page
load, causing a 404 fetch and alert("Load Error: Session not found")
for new/empty sessions. Guard the call to only run when fullManifest
has items, letting init() in logic_init.js handle empty sessions via
showSessionLandingIfEmpty().
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Root cause: Two issues prevented the landing page from showing.
1. __init__.py get_session_html endpoint returned 404 when session
didn't exist, so the iframe never received any content. Now returns
full template with empty manifest so landing page JS can display
available sessions.
2. web/dashboard.js never auto-loaded on node creation - the iframe
started empty (black box). Now auto-calls forceLoadSession after
node creation so the dashboard immediately shows either the session
grid or the landing page with session cards.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The DistributionManager, config builder, and UI all already used 600 as
the default, but the orchestrator's fallback was still 300. This caused
premature job reclaim when workers loaded models for the first time.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
dashboard_node.py: Generate full template with empty manifest instead of
plain error HTML, so the landing page JS logic can detect empty data and
show session cards.
logic_utils.js: Always call fetchAndShowSessions() so the session picker
dropdown in the cog menu is populated even when a session is loaded.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Distribution Settings section:
- Always visible at top with On/Off toggle
- Settings collapse when toggled off, expand when on
- No longer conditionally rendered
Distribution config output/input removal (clean break):
- Config Builder: RETURN_TYPES reduced from 3 to 2 outputs
- distribution_config embedded in configs_json as _distribution key
- Output format: {"configs": [...], "_distribution": {...}}
- Sampler node: Removed distribution_config optional input
- Sampler extracts _distribution from configs_json automatically
- Backward compatible: plain array configs_json still works
- JSON Preview shows full output including _distribution when enabled
- Session loader handles both old array and new object formats
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Topbar: Changed Load Session to Reload Session with refresh icon
- Settings cog: Added session picker dropdown in SESSION section
- New endpoint: GET /config_tester/list_sessions returns sessions with
metadata (name, item count, first image, modification time)
- Landing page: Shows session cards with thumbnails when no session loaded
- Click any card or use dropdown to load a session
- Landing page auto-hides when session data loads
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Double prompt JSON editor min-height from 80px to 160px
- Sidebar config sub-icons always visible (removed hover-expand)
- Config icons now show cogwheel + number (e.g. ⚙️1)
- Text Encoders icon changed to 🔣, LoRAs to 🔮
- Dashboard: Shift+1-9 sets column count, Shift+0 resets to auto
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Worker downloads missing models from master via HTTP before processing.
Background pre-fetch thread downloads upcoming models during job execution.
Distribution manager scans pending queue for unique model references.
Job claim responses include upcoming_models list when sync enabled.
Master passes sync_models_to_workers flag to workers via start_worker.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
POST /distribution/check_models - bulk check which models exist
POST /distribution/download_model - stream model file to worker
Both endpoints use folder_paths for path resolution.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New toggle in Distribution Settings section. Flag flows through
distribution_config JSON as sync_models_to_workers boolean.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
HTTP-based model file transfer from master to workers with intelligent
pre-fetching. Workers save files permanently, preserving master's
directory structure. Optional checkbox in Distribution Settings.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Task 2: Backend compares fresh CivitAI trainedWords with stored
loras_tags.json on force_refresh. Frontend shows diff banner with
Update/Keep buttons in the LoRA metadata modal.
Task 4: Per-config sidebar navigation — numbered cog icons per config
array with hover-expandable sub-section icons (Models, TE, VAE, LoRAs).
Section IDs added to all sub-sections for scroll targeting.
Task 5: Distribution Settings moved to top of layout. Extra Model &
Sampling Options moved inside Models as sub-section. TE header upgraded
to match section toggle style with brighter color. VAE header lightened
(#444 bg, #cc66ff text). LoRAs header brightened (#4499ff).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When Remote URL type is selected in VAE element, show a presets
dropdown with known HuggingFace VAE endpoints (SD, SDXL, Flux,
HunyuanVideo). Selecting a preset auto-fills the URL input.
Custom option allows manual URL entry.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All four bypass toggle onclick handlers (model, LoRA, TE, VAE) called
node.saveState() but never updatePreview(node), causing the JSON Preview
panel to show stale data when items were toggled off/on. Added the
missing updatePreview(node) call after saveState() in each handler.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replaces the 3-section top row with a compact sticky top bar containing session
name input and settings dropdown (Load Session, Load Config, Save Config, toggles
for Auto-Save, Distribution, Label Mode, Include None/Default, and Refresh Models).
Adds left sidebar with navigation icons (scroll to Global Prompts, Config Arrays,
Distribution, JSON Preview) and quick action buttons (Add Config, Refresh Models).
Sidebar highlights active section via scroll spy.
All section headers now use uniform styling: 16px bold white text on a subtle
gradient bar with colored left accent stripe. Distribution settings render as a
standalone full-width section when enabled.
Improved dark mode contrast: brighter labels (#ccc), brighter input borders (#555),
brighter button text (#e0e0e0), brighter primary buttons (#0077dd).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Each config array can now have its own resolution list displayed as chips with
categorized preset dropdown (SD 1.5/SDXL/Flux × Square/Portrait/Landscape) plus
custom W×H input. Resolutions flow through configs_json, expand in the Cartesian
product, and override the sampler's global resolutions_json on a per-config basis.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>