A ComfyUI update can break a node without a line of the pack changing, and
until now nothing looked: CI installs no ComfyUI. A nightly workflow now
installs ComfyUI's newest release and its development head for the CPU and
runs three checks that need no model:
- tests/test_comfy_core_contract.py reads the pack's source for everything
it takes from ComfyUI (modules, functions, ComfyUI's own nodes it calls
and the inputs it passes them) and looks each one up in the real thing.
- scripts/compat_boot.py asks a running ComfyUI which nodes it offers:
every public node of the pack, and every node and required input the
example workflows use.
- scripts/dev/face_smoke.mjs puts every node on a graph in headless
Chrome, in both node views, and fails when a face does not come up or
something throws.
The full Python suite runs there too. A failure on the release opens an
issue; the development head only after two nights in a row.
The wheel did nothing over a preview picture, the text of a Callout or the
padding of a card, and the middle button did not pan there. Those parts of a
panel let the mouse through, so in the classic renderer the pointer lands on
the frontend's .dom-widget wrapper, which takes the mouse and hands nothing
on. The pack looked for its panel between the pointer and the wrapper and
found none. A pointer on the wrapper now counts as over the panel inside it.
scripts/dev/wheel_sweep.mjs turns the wheel at every point of every node and
reports each spot where the graph does not zoom. In the classic renderer 33
of the 41 nodes had such spots; none has one now. Nodes 2.0 had none.
A VALIDATE_INPUTS that takes **kwargs makes ComfyUI skip its own range
and list checks for every input, and a failed check comes back once per
input: Image Crop + Rotate + Pad without a picture showed 20 copies of
"Select or upload a source file first". Each validator now names only
what it reads.
- Image Crop + Rotate + Pad, Load Video and LaMa Inpaint read one input
and report one error, on it. Video Crop + Rotate + Pad (Frame and
Clip) read the three that choose the source. LoRA Loader reads the
stack and on_missing; Save Image reads its two names and output_dir.
- Save Video has no validator any more: ComfyUI's own check holds a
typed fps to 0.01-240.
- Load Video and the Clip node check the trim window, force_rate and
Fixed frames as they run, where a wired bound has its value. They are
async, so ComfyUI starts them ahead of other nodes.
- The sources still skip ComfyUI's list check on purpose, so uploads,
subfolders, MaskEditor saves and a stale video choice in local path
mode keep working. The path checks behind them are unchanged.
- crop_aspect_ratio accepts any whole-number W:H, as the transform
always has, so a workflow made with someone else's presets still runs;
anything else is now refused before the run.
tests/test_validate_inputs.py pins what each validator names (runs in
CI) and, with ComfyUI, drives ComfyUI's own validation.
The PR is public, so its Proof section carries only what anyone can check
from the repo: the claim, the tests and the numbers. Server URLs, workflow
folders and scratch paths go to proof.md and the report to ausboss. The
machine's dev-server rules move to the creator playbook.
Every fix PR and model release now ships a failing-then-passing test,
before/after evidence, and a dev server with ready-to-run PROOF workflows,
so the owner can see a change work before merging or publishing.
Video Crop + Rotate + Pad -> Frame had gained its four resize inputs as
required, so an API prompt saved before them stopped validating. They
are optional now; the widget order is unchanged.
tests/test_node_api.py loads the pack the way ComfyUI does and holds every
node to tests/fixtures/node_api.json: inputs and outputs may only be
appended, never renamed, reordered, removed or newly required. Its rule
tests need only the standard library and run in CI.
Both were point-in-time reports whose status lines had gone stale and
whose evidence lived only in untracked scratch folders. What still holds
moved to AGENTS.md (registry history, example workflow rules) and
SECURITY.md (what the rules do not cover); CHANGELOG.md already records
the changes they described.
AGENTS.md: the lab sync is the maintainer's step, the no-network rule and
the link helper are written down, the node template it pointed to never
existed, validation lists all four checks, publishing follows version
changes only, and the dated registry status becomes durable history. A
new section sets the bar for example workflows. docs/adding_a_node.md
adds the PUBLIC_NODE_IDS step and the documentation a node needs, and
the brand skill matches Save Image's pill and the shared helpers.
The five CDP scripts looked for ComfyUI at http://127.0.0.1:8188/ only;
COMFY_URL now overrides it. cdp_nav_debug.mjs says so when no ComfyUI
tab is open instead of crashing, and cdp_drag.mjs gives up on a request
after 25 s like cdp.mjs rather than waiting forever. The live-testing
notes mention COMFY_URL, give the full path of the screenshot pairs,
and say that only CDP_RELOAD=1 reloads into a fresh tab.
Both nodes now live under the "AB-button AusBoss" category in the node
search, matching how established packs brand their category trees. The
emoji travels to the frontend as JSON and is never printed to the console,
so the ASCII import-output rule is unaffected. Also aligns the stale
Phase 2 naming note in AGENTS.md with the AUSBOSS_NODES_<Purpose> keys.
Project structure modeled on ComfyUI-Pixaroma (MIT) with original code:
fail-soft module loader in __init__.py, one file per node under nodes/,
per-node frontend folders under js/ with shared .mjs utilities, offline
validation script, docs, and a smoke-test workflow.
Phase 1 placeholder nodes: Text Box, Show Text (with JS frontend),
Random Line, Image Dimensions.