Scanned items get ids from blake2b(scan:<relpath>) in [2^52, 2^53) (JS-safe,
disjoint from generated ids), collisions resolved deterministically by salt.
A re-scan of an existing session reuses old ids (legacy random ids included)
and carries favorited/rejected/note/notes/metrics, top-level comparisons and
meta.rejected_preview_fps, written under _manifest_lock. Fixes the route
dropping the dashboard's 'note' field.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Identity = session + ordered job fingerprints + start_at_job + overwrite_existing; anything
else gets a clear 409. GET /config_tester/sweep/job_prompt returns one job's API prompt.
Sweep manifests now save their workflow configs in meta.configs_json.
pause/resume emit a progress event.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
workflow_sweep_runner feeds jobs through ComfyUI's own queue (windowed feeder that
mirrors server.py post_prompt in-process via ComfyBridge), tracks them in history,
pauses on interrupt/queue-clear/3 errors and resumes by fingerprint. USCGSweepCollect
saves each job's image into the USCG session and appends manifest items. Routes
/config_tester/sweep/{parse,dry_run,start,status,pause,resume,cancel}; the Generator
node starts a sweep for workflow configs and returns the dashboard without waiting.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- run_generation_loop walks a flat job plan (config_utils.build_job_plan) instead of the
nested resolution x config loops; job_order=minimize_reloads reorders it to cut model
and LoRA reloads. as_written reproduces the old order exactly.
- Preview pass (fewer steps, smaller snapped latent, no upscales); items carry config_fp,
preview_of, full_* keys. A full run skips cells whose preview was rejected (tombstoned
in meta.rejected_preview_fps by delete_rejected); a preview run skips cells that already
have a full image.
- check_if_job_completed gets a keyword-only preview flag (positional API unchanged).
- Distributed mode is untouched apart from an 'ignored' warning.
fix: a per-config resolution no longer leaks its w/h/batch_idx into later configs of the
same pass (the old loop set them once per input job; the pre-flight scan already did this
correctly, so pre-flight and the main loop disagreed).
fix: the async look-ahead picked the next config via job_idx*len(expanded)+conf_idx, which
was wrong whenever per-config-resolution configs were skipped after the first pass; it now
reads the next plan entry.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Adds GET /config_tester/dashboard (SPA as a top-level page, optional
?session=), POST /config_tester/run (builds the Generator -> Dashboard prompt
and enqueues it in-process exactly like PromptServer.post_prompt; force
defaults to true) and GET /config_tester/run_status. Pure helpers live in
run_api.py (no server imports) with unit tests.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Pairwise-review votes live in manifest["comparisons"]. Locked read-modify-write
helper, disk-wins preservation in every manifest writer, two new routes, tests.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Deletes the `from . import distribution_routes` import. The /distribution/*
HTTP routes now register from the companion plugin (ComfyUI-USCG-Distributed)
at /uscg-distribution/*.
- Adds `sys.modules["comfyui_uscg_main"] = sys.modules[__name__]` so the
Distributed companion's worker can lazy-import main USCG modules via
`from comfyui_uscg_main.<module> import ...` without depending on the
hyphenated folder name (not a valid Python identifier).
This mirrors the Phase 1 pattern of registering 'comfyui_uscg_remote_vae'
in the Remote VAE companion's __init__.py.
Adds a 'Delete All Rejected Items' button in the cog menu next to the
existing 'Delete All Non Favorited Items' button. Adds the matching
/config_tester/delete_rejected backend endpoint that removes rejected
item files and updates the manifest.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
_create_image_links() had a hardcoded IMAGE_EXTENSIONS set that only
linked .png/.jpg/.jpeg/.webp/.bmp files into the external_images/ symlink
directory. Videos discovered by the scanner were added to the manifest
but never linked, causing ComfyUI's /view endpoint to return 404 for
every video.
Now imports MEDIA_EXTENSIONS from directory_scanner.py so images and
videos share the same allowlist — single source of truth.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- load_checkpoint() needs target_model_name, ckpt_name, use_remote_vae
positional args — was being called with just model_name
- Preset save endpoints now validate for empty request body before
JSON parsing to avoid "Expecting value" errors
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New preset system for config arrays: save/load all samplers,
schedulers, steps, CFG, models, LoRAs, VAEs, prompts, and all
other settings as reusable presets. Stored in USCG-config-section-presets.json.
Preset dropdown with Load/Save/Delete in the Config Arrays header bar.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Async upscale API: POST starts a background job, GET polls status,
POST cancels. Supports single image and all-favorited modes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Stored at output/benchmarks/USCG-upscale-presets.json following the
custom resolutions pattern. Shared between Builder UI and Dashboard.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New nodes now show the session landing page instead of auto-loading
"my_session". Uses _configured_from_workflow flag to distinguish fresh
nodes from saved workflows. Also fixes session cards Y-axis overflow.
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>
- 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>
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>
- 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>