Both badges floated above the right end of the title bar, the spot where
the frontend draws its own node-source badge, so turning them on hid one
behind the other. They sit above the left end now.
Frame Chooser, mostly. A pause did not survive a workflow load: LiteGraph
clears a graph by removing every node, so undo, a tab switch, Clear
Workflow and opening another file all fired the teardown a deleted node
uses to release its pause, and killed a run that was still going. That
now only fires for a real deletion. Answering "keep all" wrote the batch
out as 1,2,...,N into pick_list, so the next run dropped whatever the
enumeration did not reach or failed outright on a shorter clip; it
writes the empty answer it was given. And pick_list is only written back
under "keep last selection" - it pre-answers the node, so filling it in
automatically meant a chooser left at the default paused exactly once.
Refine Mask: smooth applies only the change it made to the jaggy edge
rather than binarizing everything, so an already-soft matte keeps its
alpha (binary masks stay bit-identical), and blur now reaches the
matting solve instead of being thresholded back out of the trimap.
Frame Interpolate's copy path honours batch_size; it gathered every
copied frame at once, which on a long clip at an integer multiple was a
multi-gigabyte allocation on the frames device that no setting bounded.
Subgraph execution ids are resolved by walking the chain instead of
stripping the prefix, which could match an unrelated node with the same
number. Status and runtime badges appear inside subgraphs again, and a
subgraph pause renders on the node that actually paused.
Also: the Custom colour scheme no longer strips every node's colour when
its stored colour is unreadable; Drop Shadow and Pad Image name their
own widget for an unreadable colour instead of blaming Transform; a
non-ASCII token and a non-object JSON body answer 400 rather than
throwing a 500 and stranding the pause; pick_list rejects Unicode
digits, which used to raise during validation or silently read as a
frame nobody typed.
Tooling: validate_nodes parses NODE_MODULES rather than matching it
anywhere in the text, and an unregistered module is an error - it used
to exit 0 printing nothing. It also refuses mapping keys declared
outside nodes/, which is how the registry fixtures came to be advertised
to ComfyUI-Manager as installable nodes; they are .py.txt now. And the
video test no longer leaves ComfyUI on sys.path, which was flipping
every fail-soft seam for whatever ran next.
Nodes can push a status line to their own badge through the new
push_node_status helper, which is a silent no-op without a live
PromptServer so a status update can never fail the run reporting it.
The LaMa inpainter emits "frame i/N" alongside its progress bar,
threading the node id in through a hidden UNIQUE_ID input -- hidden
entries never become widgets, so its visible inputs and saved
widgets_values are unchanged.
The badge rides its own Chrome setting, on by default: unlike the
runtime badge it only exists while a node is running, and it is
retired when the node moves on or the run ends, fails, or is stopped.
Two aboutPageBadges rows on the Chrome extension: the pack version (from
AUSBOSS_JS_VERSION) linking to the GitHub repo, and a Report an issue link.
Field shape verified against the frontend's aboutPanelStore.
AusBoss.Chrome.NodeRuntime (default off - it adds visual noise) times
each node from the api's executing events: execution_start resets the
accumulator and clears stale badges, every node handoff closes out the
previous node's elapsed time, and revisits from batched loops sum. The
elapsed seconds land on the node object and a chained
LGraphNode.onDrawForeground (installed once, via chainCallback) draws a
small rounded badge at the node's top-right, skipped below canvas scale
0.5. The duration formatter (49ms / 1.50s / 1m35s) and the
accumulate-elapsed transition are pure in js/shared/chrome.mjs with
node:test coverage.
New pack-wide chrome feature: while a prompt is executing the tab icon
swaps to a runtime-drawn active variant of the brand teal rounded
square, and the tab title carries a "(N)" queue-depth prefix that
disappears when the queue drains. AusBoss.Chrome.FaviconStatus
(default on) tears everything down through one AbortController and
restores the browser-default icon and title immediately when disabled.
Title composition is pure in js/shared/chrome.mjs with node:test
coverage, including the never-double-prefix guarantee.