Commit Graph
96 Commits
Author SHA1 Message Date
Jason Hoku c231303179 Merge branch 'feat/sweep-video' into int/wave3 2026-11-04 03:10:14 -08:00
Jason HokuandClaude Fable 5.1 db90661d0d fix(sweep): overwrite deletes a video's poster too; related-variants reel shows the poster for videos
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>
2026-11-04 03:09:35 -08:00
Jason HokuandClaude Fable 5.1 e1e268213f test(sweep): video sources, fingerprints (golden image hashes), collector node, output keys
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 03:04:55 -08:00
Jason HokuandClaude Fable 5.1 0501686340 fix(latent-input): connected latent size = cells x the model's latent ratio, not x 8
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 03:03:01 -08:00
Jason HokuandClaude Fable 5.1 3a27bba9d1 fix(distribution): master post-phase upscales this run's images per model group
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>
2026-11-04 03:02:58 -08:00
Jason HokuandClaude Fable 5.1 6b601632f6 fix(upscale): deferred upscales (run_upscales_at_end) no longer skip every image with 'no filename in manifest'
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>
2026-11-04 01:29:46 -08:00
Jason Hoku 9296006317 Merge branch 'feat/pairwise-polish' into int/wave2 2026-11-04 01:21:37 -08:00
Jason HokuandClaude Fable 5.1 097c3648f7 feat(compare): phone compare with swipe-to-vote and reliable muted video autoplay
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>
2026-11-04 01:20:18 -08:00
Jason HokuandClaude Fable 5.1 aa7950d958 docs: no outbound HTTP rule replaces the urllib advice; scan_directory route documented as it is; companion facades in the file tree; superseded_previews JS test moved under tests/js so CI runs it
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 01:17:42 -08:00
Jason Hoku e88d769815 Merge branch 'feat/drag-drop' into int/wave2 2026-11-04 01:10:41 -08:00
Jason HokuandClaude Fable 5.1 4174791916 feat(standalone): share-link button and session picker button for phones
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>
2026-11-04 01:09:45 -08:00
Jason Hoku 2a19e1ca99 Merge branch 'feat/docs-pass' into int/wave2 2026-11-04 01:07:49 -08:00
Jason HokuandClaude Fable 5.1 40ef4fb4e8 feat(dashboard): stacked phone lightbox with a Compare action
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>
2026-11-04 01:05:42 -08:00
Jason HokuandClaude Fable 5.1 e7eacd4bd5 test(dashboard): e2e for modal drag carriers, send button bridge and standalone download; docs (#22)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 01:05:41 -08:00
Jason HokuandClaude Fable 5.1 ecf28d45aa test(docs): consistency checks between the docs and the code, refresh stale CI count comments
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>
2026-11-04 01:05:17 -08:00
Jason Hoku cff2144ae5 Merge branch 'feat/metrics-adapter' into int/wave2 2026-11-04 01:05:06 -08:00
Jason HokuandClaude Fable 5.1 3d6b14d82a feat(scan): stable item ids so a re-scan keeps votes, favorites, notes and metrics
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>
2026-11-04 01:01:56 -08:00
Jason Hoku 637fac3cf8 Merge branch 'feat/builder-polish' into int/wave2 2026-11-04 01:00:33 -08:00
Jason HokuandClaude Fable 5.1 2dbd42d35b feat(upscale): exact base_width/base_height on every upscaled item; fix matched-mode ctx keys and no-detection pairing
- 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>
2026-11-04 00:59:54 -08:00
Jason HokuandClaude Fable 5.1 8ce4398c4d feat(builder-polish): run-API full pass, vae drift fix, honest minimize_reloads wording
- 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>
2026-11-04 00:59:45 -08:00
Jason Hoku f746ed4a61 Merge branch 'feat/sweep-polish' into int/wave2 2026-11-04 00:59:05 -08:00
Jason HokuandClaude Fable 5.1 e88b18a549 fix(dashboard): drag the Revise image onto Load Image / canvas, plus a Send to Load Image button (#22)
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>
2026-11-04 00:58:31 -08:00
Jason HokuandClaude Fable 5.1 b45fde0410 fix(dashboard): remove leftover merge marker that dropped the first pairwise CSS rule
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>
2026-11-04 00:58:30 -08:00
Jason HokuandClaude Fable 5.1 9b8eed833b fix(sweep): deterministic extra seeds
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>
2026-11-04 00:56:59 -08:00
Jason HokuandClaude Fable 5.1 3eae054c11 feat(builder): load workflow sweep sessions
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>
2026-11-04 00:56:03 -08:00
Jason HokuandClaude Fable 5.1 13422104f4 feat(dashboard): wf_params facets, labels, workflow job panel
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>
2026-11-04 00:55:11 -08:00
Jason HokuandClaude Fable 5.1 a931488f2a feat(metrics): verified aesthetic adapter (loader defaults, prefer, scale, CPU handoff, VRAM release, timing)
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>
2026-11-04 00:52:57 -08:00
Jason HokuandClaude Fable 5.1 968b0dfdfc feat(sweep): attach to a running identical sweep, job_prompt route, configs in sweep meta
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>
2026-11-04 00:52:56 -08:00
Jason HokuandClaude Fable 5.1 2b70bb1da3 test(seedvr2): helper extraction stops at the next top-level def, decorator or comment
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 00:48:02 -08:00
Jason HokuandClaude Fable 5.1 85378c4e78 fix(upscale): inline SeedVR2 step after a latent step decoded with swapped args and mishandled the PIL result
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>
2026-11-04 00:46:45 -08:00
Jason Hoku d1714a2b8b Merge branch 'feat/workflow-sweep' into integration
# Conflicts:
#	README.md
#	__init__.py
#	sampler_node.py
2026-11-04 00:21:39 -08:00
Jason HokuandClaude Fable 5.1 e1936bfdad fix(manifest): keep per-item metrics written to disk when a generation run saves
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>
2026-11-04 00:17:52 -08:00
Jason Hoku add7fbb2cb Merge branch 'feat/metrics' into integration
# Conflicts:
#	resources/logic_pipeline.js
#	resources/logic_state.js
#	resources/logic_ui.js
#	web/conf_builder/conf-builder-config-management.js
#	web/conf_builder/conf-builder-main.js
2026-11-04 00:16:58 -08:00
Jason Hoku 3c3fd7a49d Merge branch 'feat/preview-pass-ordering' into integration
# Conflicts:
#	tests/test_state_to_configs_json.py
#	web/conf_builder/conf-builder-main.js
2026-11-04 00:15:02 -08:00
Jason HokuandClaude Fable 5.1 9ef138bf72 feat(workflow-sweep): sweep runner, USCGSweepCollect node and routes
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>
2026-11-04 00:14:23 -08:00
Jason HokuandClaude Fable 5.1 a6146c0cc9 feat(metrics): compute metrics for an existing session (background job)
metrics_runner follows the upscale_runner job pattern: CPU-only PIL->numpy,
manifest writes under the lock (reload, set by id, atomic replace), progress
event + polling endpoints, cancel. Dashboard cog-panel button.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 00:13:05 -08:00
Jason HokuandClaude Fable 5.1 49aece7af6 test(e2e): derive the sort-option count from sortOptionsList instead of hardcoding 12
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 00:11:49 -08:00
Jason Hoku 58bd73fb64 Merge branch 'feat/pairwise-review' into integration
# Conflicts:
#	ProjectStructure.md
#	resources/report.css
2026-11-04 00:10:09 -08:00
Jason Hoku ecf01d62b8 Merge branch 'feat/batched-te' into integration
# Conflicts:
#	web/conf_builder/conf-builder-main.js
2026-11-04 00:09:39 -08:00
Jason HokuandClaude Fable 5.1 148922ee2f feat(dashboard): preview badge, Pass filter, superseded previews, full-pass button
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>
2026-11-04 00:09:26 -08:00
Jason HokuandClaude Fable 5.1 acee4fd545 feat(metrics): Builder Run Settings control, session-settings emission and metrics_info route
Session-level setting (not a per-config key). state_to_configs_json emits
_session_settings.metrics only when enabled and non-empty; GET
/configbuilder/metrics_info reports built-ins and scorer-pack install status.
Faster numpy fallback; README and ProjectStructure updated.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 00:09:19 -08:00
Jason HokuandClaude Fable 5.1 e5312812d9 feat(workflow-sweep): template parsing, binding expansion and prompt substitution
Pure-Python core of Workflow Sweep: parse an API-format workflow, suggest bindings,
expand them into jobs (cache-friendly axis order, resume fingerprints), substitute
into the template and append the collector node. Builder state emits kind=workflow
arrays, config_utils.expand_configs dispatches model_type=workflow, and
manifest_utils.append_items adds disk-fresh manifest appends.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 00:08:16 -08:00
Jason Hoku fd7f39cc33 Merge branch 'feat/dashboard-url-api' into integration 2026-11-04 00:06:41 -08:00
Jason Hoku 9af6bf5cbc Merge branch 'feat/pr21-examples' into integration 2026-11-04 00:06:41 -08:00
Jason HokuandClaude Fable 5.1 cb0aa2be61 feat(metrics): wire metrics into decode/flush, remote VAE, upscale paths and run context
Hooks: decode_latent_with_vae metrics_sink, flush_batch_with_vae, remote VAE
worker, orchestrator upscale/Florence2/SeedVR2 inserts, dashboard upscale
thread (explicit spec, never inherits), florence2 builders drop metrics.
sampler_node wraps the run in a token-based begin_run/end_run context.
Adapters mechanism is tested with fake nodes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 00:06:37 -08:00
Jason HokuandClaude Fable 5.1 ffb352fb92 feat(builder): job order and preview pass run settings
State keys job_order, preview_pass{enabled,steps,scale,cfg_override}, skip_rejected_previews,
only_favorited_previews: new-state defaults + migration, Run Settings controls, emission with
coercion in state_to_configs_json, tests, README/ProjectStructure.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 00:06:08 -08:00
Jason HokuandClaude Fable 5.1 98fcf0861c feat(encode): te_batch_size Run Setting wires text-encoder batching into pre-encode
batch_encode_with_cache/batch_encode_prompts take te_batch_size (default 1 =
off, DEFAULT_TE_BATCH_SIZE) and a hidden te_batch_verify; batched prompts are
cached, leftovers take the unchanged per-prompt loop, and the summary line
reports batched prompts/forwards. Builder state default + migration, Run
Settings control, state_to_configs_json emission, orchestrator read, README.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 00:05:57 -08:00
Jason HokuandClaude Fable 5.1 bc11dfbdcb test(e2e): Playwright smoke test for the Dashboard SPA
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 00:05:06 -08:00
Jason HokuandClaude Fable 5.1 602bde44fb feat(orchestrator): flat job plan, job order, preview pass and preview promotion
- 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>
2026-11-04 00:04:13 -08:00
Jason HokuandClaude Fable 5.1 108d196167 fix(examples): MOSS example uses the template's flux2-vae.safetensors
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 00:03:57 -08:00