- append_items never replaces an unreadable manifest with a fresh one (raises, file untouched) and
writes through the retrying atomic helper; the sweep spec write retries PermissionError too
- breaker only pauses while jobs remain; a paused sweep with nothing in flight or pending completes
instead of blocking new sweeps with SweepBusy
- sampler IS_CHANGED returns NaN when configs_json is linked (absent from kwargs), so a re-queued
sweep is never served from ComfyUI's cache
- Start At Job # = N skips N-1 jobs like the orchestrator
- dry_run / api_start expand the sweep in an executor, off the event loop
- Builder sweep section re-reads configArray.workflow on every render (load/remove replaced it)
- favorites export and GENERATE NEW skip workflow-sweep items (no template)
- Pairwise Review excludes all wf_* per-job keys
- test: same-sweep attach waits for the feeder's first enqueue (pre-existing race)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- lazy shell: SAVE never persists __uscg_lazy__ (saveState guard + save_manifest pop); the manifest
fetch route heals files that already carry it
- dashboard node: a Builder session switch does a full reload (session_name from the payload, not
the stale widget) instead of re-fetching the old session
- dashboard node: window message handlers only accept a dashboard iframe as source
- scanned ids are namespaced by session (same relpath in two sessions no longer collides on merge);
rescan merge donates each old id once and only via unambiguous basenames
- deferred upscale resume is keyed on base_fp == config_fp (fixed-seed grids upscale every cell)
- legacy distributed companion ignores the preview pass: master keeps the upscale phase
- connected latent: recompute w/h before gen_w/gen_h so 16x models record real dimensions
- Start on an identical paused sweep resumes it
- outputFromKey keeps subgraph node ids ("57:35") whole
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
html_generator.get_html_template now emits a shell (empty fullManifest flagged
__uscg_lazy__, inline_manifest=True restores the old behaviour). New route
GET /config_tester/manifest?session=<name>: compact JSON, weak ETag, 304 on
If-None-Match, gzip, torn-read retry (logic in run_api.load_manifest_for_fetch).
/config_tester/dashboard gets gzip + content ETag. The SPA boots with one fetch
(no more double load), resync is conditional and non-destructive, and
web/dashboard.js asks the iframe to re-fetch (reload_manifest) instead of
parsing data out of the Generator's executed message. Also fixes the dead
session-name regex in dashboard_node.py.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Matched and one-axis pairing on a sweep session found zero pairs because every item differed in these per-image fields (same class as the wave-2 config_fp bug).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Workers send builtin metrics measured on the decoded tensor; the master scores adapters
(and any missing builtins, from the saved file) in one pass after collection.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Found in the live check on a local ComfyUI: overwriting left 4 orphaned .preview.png files, and the
modal's related-variants reel rendered broken <img> tags for mp4 items.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The master computes the ordered plan, skips and config fingerprints and hands them to the
companion (populate_from_plan, falls back to populate_jobs on an old companion). Items are
tagged dist_worker, which the pairwise review treats as bookkeeping, not a setting.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The distributed post-phase called run_deferred_upscales with the wrong arguments and
raised on every run. Build the queue from this run's manifest items matched to their job
configs, and upscale one model/LoRA/VAE group at a time with a fresh conditioning cache.
HiRes prompt is now encoded when not cached.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The distributed path overwrote meta with a short dict in four places, erasing
rejected_preview_fps and meta.session_settings.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Generated manifest items carry only a /view URL in 'file'; the deferred phase read 'filename', which only
upscaled and scanned items have, so every deferred job was skipped. New pure helper manifest_utils.item_filename
(filename key, else the URL's filename= parameter) is used there; the dashboard upscale path already parsed the URL.
Found by the wave-2 live base-dims check on the 3070.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Swipe left = A, right = B via a node-testable cmpSwipeSide(); pane taps go
through cmpPaneTap so a swipe never also casts a tap vote. Videos get
muted/playsinline set before the source loads and play() only after insertion,
with a tap-to-play fallback. Docs: README + ProjectStructure.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Header buttons (standalone only): share via navigator.share, else clipboard on
secure contexts, else execCommand with the result checked, else a prompt.
The picker button opens the settings panel at the session list; phone CSS gives
the rows touch-sized targets. A background websocket resync no longer closes
the settings panel the user has open.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Preview on top, form below, six-button action bar (Prev, Favorite, Reject,
Compare, Revise, Next) as icon+label spans. Desktop and the fine-pointer node
iframe are untouched. Favorite state is synced via _syncModalFavBtn (also on
open). e2e: new tests/e2e/test_phone_dashboard.py + phone_dashboard fixture.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
tests/test_docs_consistency.py (stdlib only, reads files, no process or network modules):
- README anchor links resolve (GitHub slug rule pinned), code fences balanced
- every README "## " section and the key features are linked from the TOC
- newest changelog entry is the 11/4/26 one
- every route registered with routes.get/post is in ProjectStructure.md (method + path)
- the file map lists every root .py, web/ file, resources/ file, tests/e2e, tests/js,
examples, tests.yml and names no .py that does not exist
- every ultimate_grid.* event sent by the code is in Server Event Types (+ sweep phase payload)
- html_generator.js_files ends with logic_standalone.js and is listed in the docs
- no stale convertStateToConfigs / network_utils.py mentions
- CONTRIBUTING.md names every CI job id and the CI flags
tests.yml: comment-only edit, the "# expect:" counts now match the measured
499 passed / 16 skipped (stub leg).
Note: the docs checks are expected to be red at this commit; the next commit
(docs) makes them green.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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>
- Record the size of the generated image an upscale started from at all
10 sites (deferred, inline Florence2 + sentinel, inline SeedVR2, inline
hires/model, and the dashboard upscale_runner paths via base_dims_of).
- CMP_EXCLUDED_KEYS now ignores per-image fields (config_fp, base_fp, metrics,
preview_of, florence2_*), so matched/one-axis pairing works on current manifests.
- Compare pool skips Florence2 no-detection sentinels (they alias the base file).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Record session_settings + has_optional_inputs in manifest meta (run_meta_extras) so the
Dashboard "Full pass for survivors" can queue POST /config_tester/run headless; the iframe
falls through to it when the parent has no Builder / no queuePrompt.
- Exclude the deliberately omitted "vae" key from _EXPECTED_CONFIG_KEYS; test_examples asserts zero drift.
- minimize_reloads: log VAE switches + a "changed nothing" note, accurate tooltip/README wording.
- examples/README: Klein base-variant note; fix stale LTX stub comment.
- Tests: run_meta_extras, job order, state_to_configs_json, e2e full pass (new file).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Rich dragstart (asset-info JSON, uri-list, plain, DownloadURL; reference not copy), a modal button that
fills the selected/only/new Load Image via the parent bridge, standalone Download image fallback.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
CSS error recovery merged the stray ======= line with the following selector,
so .cmp-setting-row was lost in every browser. A lint test guards resources/.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
add_random_seeds_to_gens now uses config_utils.derive_extra_seeds (base seed 0, like the Generator),
so a re-queue attaches to the running sweep and a resume skips finished jobs.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Load Session restores Workflow Sweep arrays from meta.configs_json (workflowConfigToArray) and
tells the user when an older sweep session has no saved configs. Builder Start shows 'attached'.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Quick Filter / Logic Filter (wf:<key>) / label overlay use item.wf_params. Sweep items get a
JOB button opening a read-only Workflow job panel with download/copy of the job's API prompt.
Standalone progress bar shows paused/cancelled.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Loader nodes now get required-input defaults plus 'prefer' picks instead of
bare kwargs, so LoadAesteticModel no longer fails on its missing model_name.
Adds scale/max_batch/vram_mb registry keys, adapter_status() 'problem', and
signature-copy fake nodes for strimmlarn@42bed3f and ZaneA@5e9936d.
ImageReward ships disabled (not live-tested).
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>
decode_latent_with_vae(vae, samples) returns a PIL image; the step passed
(pipe_latent, vae) and then treated it as a tensor. Also: undefined `meta`
(use create_image_metadata like the Florence2 branch), manifest insert(0) +
upscale_produced (no duplicate base image), and chained re-encode no longer
movedims (VAE.encode takes BHWC).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
metrics_runner computes metrics for an existing session straight to disk; a
generation run's in-memory copy of those items had no metrics and would have
wiped them on its next save. Disk wins for an item's metrics when the memory
item has none (merge_manifest_user_changes, flush_batch_with_vae's disk sync,
the remote VAE worker's disk sync). Fresh in-memory metrics are kept.
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>
PREVIEW badge on cards and a modal note, a Pass filter row (hidden until previews exist),
previews superseded by a full image (config_fp/base_fp match) hidden by default, a preview bar
with 'Full pass for survivors (N)'. The button asks web/dashboard.js (postMessage) to switch
Preview pass off in the matching Config Builder and call app.queuePrompt; a marked stub
covers a future run API; fallback is an instructions toast.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>