Skip to content
Open
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
256 commits
Select commit Hold shift + click to select a range
68ba0aa
test: add pnpm scripts for the custom-node suite
CodeJuggernaut Jul 2, 2026
d17a387
test: name each custom-node check as a pnpm script and document the s…
CodeJuggernaut Jul 2, 2026
4fb282f
docs: link custom-node suite README from browser_tests README
CodeJuggernaut Jul 2, 2026
8f567e8
[automated] Apply ESLint and Oxfmt fixes
actions-user Jul 2, 2026
8b81a4f
test: add connectivity tier proving the slot/type contract
CodeJuggernaut Jul 2, 2026
dc83cc4
test: prove the connectivity executor can reject, and drag every pack
CodeJuggernaut Jul 2, 2026
d02e665
test: address review feedback on the custom-node suite
CodeJuggernaut Jul 2, 2026
d80427d
test: assert breadth-sweep console errors and tighten manifest shape …
CodeJuggernaut Jul 2, 2026
0f94da8
[automated] Apply ESLint and Oxfmt fixes
actions-user Jul 2, 2026
2d2b318
test: drop exports from internal-only custom-node types
CodeJuggernaut Jul 2, 2026
df67647
test: make the custom-node suite work on multi-user backends
CodeJuggernaut Jul 2, 2026
0991905
test: exclude COMBO literals from connectivity auto-pairing
CodeJuggernaut Jul 2, 2026
4a91fa4
test: name connectivity tests in plain language
CodeJuggernaut Jul 2, 2026
9ed51f1
ci: run the custom-node suite against a backend with the packs installed
CodeJuggernaut Jul 2, 2026
07c4b23
ci: make the custom-node job gating - fail on pack-install error or a…
CodeJuggernaut Jul 2, 2026
068191e
test: harden custom-node CI and manifest per review
CodeJuggernaut Jul 2, 2026
f63b7d8
ci: gate custom-node job with changes-filter, not trigger paths
CodeJuggernaut Jul 2, 2026
ee83d67
test: single tier source of truth; fix skip diagnostic to find nested…
CodeJuggernaut Jul 2, 2026
1248c46
test: onboard 5 packs (rgthree, essentials, KJNodes, Custom-Scripts, …
CodeJuggernaut Jul 3, 2026
065bc0c
test: fail manifest load when a run tier has no workflow
CodeJuggernaut Jul 3, 2026
efb0365
test: make connectivity instance-aware; slot drags survive pack page …
CodeJuggernaut Jul 3, 2026
14666b0
docs: fold 5-pack onboarding lessons into ADDING_PACKS
CodeJuggernaut Jul 3, 2026
61d1cbf
docs: fix ADDING_PACKS extensions probe and misattributed CI triage
CodeJuggernaut Jul 3, 2026
1d5514c
docs: rename ADDING_PACKS to ADDING_CUSTOM_NODES
CodeJuggernaut Jul 6, 2026
1e36107
test: every-node coverage - mount, save/reload, connect, and auto-run…
CodeJuggernaut Jul 6, 2026
7adfaa9
test: stabilize every-node auto-run across environments; document the…
CodeJuggernaut Jul 6, 2026
9825047
ci: pin every manifest pack to its verified commit
CodeJuggernaut Jul 6, 2026
0723702
test: serialize CI workers, prune comment noise, clearer naming
CodeJuggernaut Jul 7, 2026
6d5bcb9
test: suppress deferred-await false positives in turnstile timer tests
CodeJuggernaut Jul 7, 2026
b99100d
test: un-export AutoRunClass (knip: consumers use AutoRunVerdict)
CodeJuggernaut Jul 7, 2026
650abec
test: fix browser typecheck errors; recalibrate exclusions for CI env…
CodeJuggernaut Jul 7, 2026
de23856
test: exclude runtime model-downloaders and content-variable nodes fr…
CodeJuggernaut Jul 7, 2026
9bb0587
Merge remote-tracking branch 'origin/main' into nathaniel/custom-node…
CodeJuggernaut Jul 7, 2026
c5de8d4
test: fix ImageGrabPIL pack attribution; exclude WAS ffmpeg path node
CodeJuggernaut Jul 7, 2026
5ce4146
test(custom-nodes): chain-run NEEDS_WIRES nodes, assert outputs, moun…
CodeJuggernaut Jul 7, 2026
e6ed612
test(custom-nodes): assert def-vs-instance mount fidelity under both …
CodeJuggernaut Jul 7, 2026
a22acc4
test(custom-nodes): save/reload under both renderers; classify client…
CodeJuggernaut Jul 7, 2026
70233bb
test(custom-nodes): combo vocabulary is a set, not a sequence; never …
CodeJuggernaut Jul 7, 2026
e7681be
test(custom-nodes): shape-census audit - classify V2-form combos, for…
CodeJuggernaut Jul 7, 2026
f9a94d0
docs(custom-nodes): ARCHITECTURE.md - system design, data flow, and t…
CodeJuggernaut Jul 7, 2026
95ced4c
docs(custom-nodes): ARCHITECTURE.md - C4-style views, design decision…
CodeJuggernaut Jul 7, 2026
34faaa1
docs(custom-nodes): redraw D2/D3 for single-flow readability
CodeJuggernaut Jul 8, 2026
3cef258
docs(custom-nodes): wide diagram boxes - strip forced line breaks fro…
CodeJuggernaut Jul 8, 2026
9eb035e
docs(custom-nodes): drop the redundant D-diagram labels; de-jargon th…
CodeJuggernaut Jul 8, 2026
cec09da
docs(custom-nodes): close the observation loop in the context view
CodeJuggernaut Jul 8, 2026
497dd6e
docs(custom-nodes): building-blocks view horizontal, raise label wrap…
CodeJuggernaut Jul 8, 2026
cbceaf5
docs(custom-nodes): context + execution + persistence diagrams restru…
CodeJuggernaut Jul 8, 2026
3bc40bb
docs(custom-nodes): legend reads in ascending section order per depth…
CodeJuggernaut Jul 8, 2026
e46487f
docs(custom-nodes): regression-suite title, tier gating truth, verifi…
CodeJuggernaut Jul 8, 2026
24659c2
test(custom-nodes): implement 8 external-review hardenings with discr…
CodeJuggernaut Jul 8, 2026
72ad08d
test(custom-nodes): shared console ledger, drift guards, and a doc tr…
CodeJuggernaut Jul 8, 2026
58e0fe7
docs(custom-nodes): section 6 shows the census feeding three parsers;…
CodeJuggernaut Jul 8, 2026
6be7c18
test(custom-nodes): sharpen three detection surfaces the break-suite …
CodeJuggernaut Jul 8, 2026
349d82b
docs(custom-nodes): add Detection Proof plan (falsify every guard, co…
CodeJuggernaut Jul 8, 2026
10d7769
docs(custom-nodes): neutral phrasing in Detection Proof (drop first-p…
CodeJuggernaut Jul 8, 2026
08106db
test(custom-nodes): make the local full run idempotent (drain, foreig…
CodeJuggernaut Jul 8, 2026
d65d853
test(custom-nodes): per-test backend isolation via an afterEach drain…
CodeJuggernaut Jul 9, 2026
0cc2104
docs(custom-nodes): correct Detection Proof citations after a halluci…
CodeJuggernaut Jul 9, 2026
baa2e04
docs(custom-nodes): Detection Proof accuracy pass
CodeJuggernaut Jul 9, 2026
7203fdb
docs(detection-proof): sync rows 8-10 to CI-step delivery (not forks)…
CodeJuggernaut Jul 9, 2026
424e85e
docs(detection-proof): final falsification-pass sync - executed matri…
CodeJuggernaut Jul 9, 2026
f9dbb6b
Merge remote-tracking branch 'origin/main' into nathaniel/custom-node…
CodeJuggernaut Jul 9, 2026
7164b84
ci(custom-nodes): pin backend to ComfyUI v0.26.2 for a deterministic …
CodeJuggernaut Jul 10, 2026
03f2b6b
fix(custom-nodes): boot on newer ComfyUI backends
CodeJuggernaut Jul 10, 2026
4962589
ci(custom-nodes): unpin backend, auto-take latest ComfyUI master
CodeJuggernaut Jul 10, 2026
6783d5a
Merge branch 'main' into nathaniel/custom-node-e2e-suite
CodeJuggernaut Jul 10, 2026
d258e9b
test(custom-nodes): extension-loaded assert + dynamic-input autogrow …
CodeJuggernaut Jul 15, 2026
2a6397e
Merge branch 'main' into nathaniel/custom-node-e2e-suite
CodeJuggernaut Jul 15, 2026
fabf390
test: address custom-node suite review feedback
CodeJuggernaut Jul 16, 2026
7e0188b
ci: drop the inert comfyui_ref input from setup-comfyui-server
CodeJuggernaut Jul 16, 2026
569891c
test: fail the all-nodes tier when a pack's registered node count drifts
CodeJuggernaut Jul 16, 2026
d070982
[automated] Apply ESLint and Oxfmt fixes
actions-user Jul 16, 2026
c8175dc
test: complete the preValidate removal and keep failure traces in the…
CodeJuggernaut Jul 18, 2026
309563e
test: address reviewer feedback on classifier unions, sleeps, and scr…
CodeJuggernaut Jul 18, 2026
58860eb
test: ledger the KJNodes SplineEditor creation crash in the wiring sweep
CodeJuggernaut Jul 18, 2026
c43a62d
test: ledger the KJNodes editor crash by mechanism, not class name
CodeJuggernaut Jul 18, 2026
f48b327
test: allowlist the TimerNodeKJ sweep throw, stale-guarded
CodeJuggernaut Jul 18, 2026
24ed32e
ci: pin core in the PR gate and add the nightly core-drift canary
CodeJuggernaut Jul 20, 2026
aa561fd
ci: temporary push trigger to live-test the canary from the PR branch
CodeJuggernaut Jul 20, 2026
f6b3176
ci: canary red files a deduped tracking issue
CodeJuggernaut Jul 20, 2026
1d74b01
test: filter-guard the racy TimerNodeKJ allowlist, per ARCH section 10
CodeJuggernaut Jul 20, 2026
ee4b49d
ci: drop the canary's temporary test trigger
CodeJuggernaut Jul 20, 2026
e4b9c80
ci: add the pack-drift canary job (Job B)
CodeJuggernaut Jul 21, 2026
7572240
ci: apply the review panel's findings to the two-tier CI split
CodeJuggernaut Jul 21, 2026
15f9886
ci: widen canary job ceilings and correct drift-issue wording
CodeJuggernaut Jul 21, 2026
120241e
docs: document the two-tier CI split and scrub the last stale pin com…
CodeJuggernaut Jul 21, 2026
1ff443e
docs: fix panel pass-4 findings - stale spec comment, required-check …
CodeJuggernaut Jul 21, 2026
8e810f4
ci: drop the canary's temporary branch push trigger
CodeJuggernaut Jul 21, 2026
5bf4aa9
test: S14 geometry regression tier - capture, baselines, temp record job
CodeJuggernaut Jul 21, 2026
8365304
test: commit S14 geometry baselines recorded on CI
CodeJuggernaut Jul 21, 2026
dfa9c8e
test: ledger the two editor_base nodes as geometry-unstable
CodeJuggernaut Jul 21, 2026
2a5729c
docs: document the layout geometry tier; drop the temp record workflow
CodeJuggernaut Jul 21, 2026
833da0c
test: apply the S14 panel findings - CI-scoped compare, pure spec, pe…
CodeJuggernaut Jul 21, 2026
fe3fb2c
test: close the S14 pass-2 minors
CodeJuggernaut Jul 21, 2026
65a8697
ci: rename custom-nodes gate job id to custom-nodes-e2e-core
CodeJuggernaut Jul 23, 2026
a0fa63f
test: split custom-node manifest schema for core and cloud backends
CodeJuggernaut Jul 23, 2026
3b1c91e
test: add cloud-manifest generator with vendored supported_nodes.yaml
CodeJuggernaut Jul 23, 2026
d695f74
Merge remote-tracking branch 'origin/main' into nathaniel/custom-node…
CodeJuggernaut Jul 23, 2026
5cb5056
fix: harden cloud manifest loading and generation edge cases
CodeJuggernaut Jul 24, 2026
4c86251
test: add cloud env foundations for the custom-node suite
CodeJuggernaut Jul 24, 2026
5d31936
test: seed a real smoke-user session for cloud custom-node runs
CodeJuggernaut Jul 24, 2026
b0bf887
test: cloud-e2e serve mode and VHS cloud run variant
CodeJuggernaut Jul 24, 2026
6c7a439
fix: seed the smoke session under the token-minting Firebase project
CodeJuggernaut Jul 24, 2026
7caed9c
test: bound the smoke sign-in and close review coverage notes
CodeJuggernaut Jul 24, 2026
c231a8b
ci: add the cloud custom-nodes gate and cloud geometry record
CodeJuggernaut Jul 24, 2026
6dbdd1b
docs: describe the two-backend CI deployment of the custom-node suite
CodeJuggernaut Jul 24, 2026
77182ff
fix: build the cloud dist as the cloud distribution in cloud CI
CodeJuggernaut Jul 24, 2026
61d3f20
docs: name the cloud-distribution build as a deliberate second axis
CodeJuggernaut Jul 24, 2026
7094758
fix: close the cloud run-tier round-trip and activation gaps
CodeJuggernaut Jul 24, 2026
2085f11
test: pin the run-enrollment and workflow-when-run invariants
CodeJuggernaut Jul 24, 2026
20c24ce
test: enroll the mutated cloud fixture in the run tier
CodeJuggernaut Jul 24, 2026
83e389f
test: drop rgthree-comfy from the custom-node regression suite
CodeJuggernaut Jul 24, 2026
130d0b1
ci: guard the forbid-skips step against a missing results file
CodeJuggernaut Jul 24, 2026
04376b7
test: compare geometry within a 0.01px tolerance, ledger a content-va…
CodeJuggernaut Jul 24, 2026
d351d9e
docs: trim churned comments from cloud-prong files
CodeJuggernaut Jul 24, 2026
2cc96e9
fix: point cloud custom-node suite at the real repo secrets
CodeJuggernaut Jul 24, 2026
d161812
test: match cloud smoke tool's Firebase sign-in payload exactly
CodeJuggernaut Jul 24, 2026
27b1339
test: use the smoke user for cloud auth
CodeJuggernaut Jul 24, 2026
5a1ab12
fix: stop cloud auth tokens reaching CI artifacts, close two fail-ope…
CodeJuggernaut Jul 25, 2026
4283d41
test: guard the cloud trace kill switch, correct four doc claims
CodeJuggernaut Jul 25, 2026
93e22d4
fix: refuse to seed a cloud session into a traced project
CodeJuggernaut Jul 25, 2026
14d7c0e
fix: read the resolved trace option in the cloud seeding guard
CodeJuggernaut Jul 25, 2026
163af5d
test: cover the non-numeric compare in diffGeometry
CodeJuggernaut Jul 27, 2026
01052a5
docs: record the cloud trace kill switch as a cloud-vs-core difference
CodeJuggernaut Jul 27, 2026
f8a2261
docs: the cloud gate step reads two credentials, not four
CodeJuggernaut Jul 27, 2026
e4e6afd
docs: the custom-nodes repro needs 6 packs, not 7
CodeJuggernaut Jul 27, 2026
085901e
docs: falsify the extension-load (S11) and autogrow (S12) tiers
CodeJuggernaut Jul 27, 2026
c342c56
feat: generate the cloud manifest from Cloud's checked-in object_info
CodeJuggernaut Jul 27, 2026
6ee6055
test: red when a pack registers with no manifest row
CodeJuggernaut Jul 27, 2026
7f1494c
feat: calibrate cloud expectedExtensions from the JS Cloud serves
CodeJuggernaut Jul 27, 2026
e17da78
chore: skip the pre-push knip run on branch deletions
CodeJuggernaut Jul 27, 2026
a5fafdd
fix: validate unjoinedYamlPacks in the cloud manifest shape check
CodeJuggernaut Jul 27, 2026
564ea72
docs: disclose that row 13's red is not reproducible from this PR
CodeJuggernaut Jul 27, 2026
65800c9
docs: record where cloud expectedExtensions come from, and their caveat
CodeJuggernaut Jul 27, 2026
e53b2c9
fix: stop cloud fixture init dying on unauthenticated harness calls
CodeJuggernaut Jul 27, 2026
5ca032c
feat: one-command local runs for the custom-node suite
CodeJuggernaut Jul 27, 2026
14f3d1f
Merge remote-tracking branch 'origin/main' into nathaniel/custom-node…
CodeJuggernaut Jul 27, 2026
d5e1d2e
refactor: compose the local suite runners from start-server-and-test
CodeJuggernaut Jul 27, 2026
f9b2485
feat: S15 output-regression tier - pixel hashes for curated runs
CodeJuggernaut Jul 28, 2026
fe6fb6d
ci: let the record workflow run from a record/* ref push
CodeJuggernaut Jul 28, 2026
f652e60
fix: S15 record mode survives per-failure worker restarts
CodeJuggernaut Jul 28, 2026
4ff89eb
fix: S15 hashes the sink payloads, not just image files
CodeJuggernaut Jul 28, 2026
2e28b60
fix: S15 messages say output, not pixel - value sinks are not images
CodeJuggernaut Jul 28, 2026
9a49e05
test: commit the CI-recorded S15 output hashes
CodeJuggernaut Jul 28, 2026
4fa4ab9
ci: give cloud calibration dispatches their own concurrency group
CodeJuggernaut Jul 28, 2026
501e955
docs: module header describes payload hashing, not the retired pixel-…
CodeJuggernaut Jul 28, 2026
a37be48
fix: apply the CORE panel's findings to the S15 tier
CodeJuggernaut Jul 28, 2026
3743d7f
test: re-record S15 hashes under the reviewed canonicalization
CodeJuggernaut Jul 28, 2026
129d1b2
docs: record the cloud calibration result - unsharded cannot pass
CodeJuggernaut Jul 28, 2026
ec8a726
fix: loud off-CI S15 skip, fixture schema guard, Step 5c scoped to CI
CodeJuggernaut Jul 28, 2026
5780b9f
feat: S13 interaction-profile tier - lock every node's interaction de…
CodeJuggernaut Jul 28, 2026
ece3d94
ci: record S13 cloud interaction profiles on the cloud record boot
CodeJuggernaut Jul 28, 2026
0678041
test: commit the CI-recorded S13 interaction baselines
CodeJuggernaut Jul 28, 2026
7fa7d97
ci: let the cloud record workflow run from a record ref push
CodeJuggernaut Jul 28, 2026
22b1bc2
ci: raise the cloud gate timeout to GitHub's 360-minute wall
CodeJuggernaut Jul 28, 2026
6840d65
perf: one app boot per pack - merge the three every-node tiers
CodeJuggernaut Jul 28, 2026
9d0f147
docs: add the custom-node suite Technical Design Doc
CodeJuggernaut Jul 29, 2026
c408ebc
fix: cloud custom-nodes tests get a 60s base timeout
CodeJuggernaut Jul 29, 2026
550faf5
docs: the Technical Design Doc's source of truth moves to Notion
CodeJuggernaut Jul 29, 2026
e242a12
ci: add the cloud drift leg (canary-cloud-drift) to the nightly canary
CodeJuggernaut Jul 29, 2026
ba9653b
ci: reground cloud concurrency comments on the account queue
CodeJuggernaut Jul 29, 2026
c42b2c3
ci: reground the cloud sharding comment on the measured cost
CodeJuggernaut Jul 29, 2026
8a56815
test: cancel only our own prompts when draining the backend
CodeJuggernaut Jul 29, 2026
2bb932c
ci: raise the cloud record ceiling above what cloud actually costs
CodeJuggernaut Jul 29, 2026
4ec9c4d
test: enroll S15 on cloud by downloading outputs in-page
CodeJuggernaut Jul 29, 2026
7177d68
test: stop cloud from retrying an unrecoverable hook, and time it
CodeJuggernaut Jul 29, 2026
2bdc727
test: make an unready app say why, permanently
CodeJuggernaut Jul 29, 2026
ba922f9
test: remove the cloud per-test cap; ceilings are the only fuse
CodeJuggernaut Jul 29, 2026
59f7760
test: bound the app-ready wait so a hang explains itself
CodeJuggernaut Jul 29, 2026
d9df7b7
test: satisfy cloud's onboarding gate before waiting for the app
CodeJuggernaut Jul 29, 2026
efeec0b
test: answer cloud's onboarding gate so the graph view can load
CodeJuggernaut Jul 29, 2026
d8c2d77
test: drop the over-explained comment on the survey bypass
CodeJuggernaut Jul 29, 2026
b3c823a
test: trace every cloud page event so a hang names its cause
CodeJuggernaut Jul 29, 2026
62d3c35
test: seed the cloud session where the app actually reads it
CodeJuggernaut Jul 29, 2026
de0ecdc
test: fail loudly if the cloud session does not persist
CodeJuggernaut Jul 29, 2026
35abe84
fix: restore working cloud seeding auth, drop the form-login churn
CodeJuggernaut Aug 3, 2026
d249de8
test: tolerate testcloud's unserved global_subgraphs, calibrate Impac…
CodeJuggernaut Aug 3, 2026
226b0b2
test: calibrate the cloud auto-run baseline, defer S13/S14 until reco…
CodeJuggernaut Aug 3, 2026
152dd18
fix: anchor telemetry blocking to third-party hosts, not URL substrings
CodeJuggernaut Aug 4, 2026
476e036
fix: fulfill telemetry blocks with 204 instead of aborting
CodeJuggernaut Aug 4, 2026
2a3c07a
fix: answer blocked telemetry with 200 {} so SDK json parsing stays q…
CodeJuggernaut Aug 4, 2026
80204d5
test: instrument cloud auth seams to attribute the boot 403s
CodeJuggernaut Aug 4, 2026
2290c85
test: keep the cloud fail-fast out of the settings-write 403
CodeJuggernaut Aug 4, 2026
b91e56b
fix: seed a real workspace JWT - testcloud no longer accepts Firebase…
CodeJuggernaut Aug 4, 2026
56d7714
fix: classify inputs declaring options.widgetType as widgets in auto-run
CodeJuggernaut Aug 4, 2026
0cd2aa0
fix: keep /api/features anonymous in the cloud smoke auth rewrite
CodeJuggernaut Aug 4, 2026
736c996
test: defer S15 output hashes on cloud until baselines are recorded
CodeJuggernaut Aug 4, 2026
cb26844
test: recalibrate the cloud auto-run baseline, counts, and run sentinels
CodeJuggernaut Aug 4, 2026
e2cb69d
test: stop the stale-ledger guards firing on env-absent nodes
CodeJuggernaut Aug 4, 2026
dda1137
test: defer the execution-error self-check instead of skipping it
CodeJuggernaut Aug 4, 2026
269d47c
fix: ledger the cloud console noise and match pack keys case-insensit…
CodeJuggernaut Aug 4, 2026
64e2574
fix: count cache-served nodes as executed in the run classifier
CodeJuggernaut Aug 5, 2026
a909286
fix: stop an unset image-upload combo requesting filename=undefined
CodeJuggernaut Aug 5, 2026
5521a2e
fix: apply the console-error ledger to the curated load tier
CodeJuggernaut Aug 5, 2026
5c20163
test: bind the cloud run tier to the path the upload actually stored
CodeJuggernaut Aug 5, 2026
ca5746c
test: chunk the connectivity sweep and budget it per pair
CodeJuggernaut Aug 5, 2026
b517d61
Merge remote-tracking branch 'origin/main' into tmp/cn-inline-merge
CodeJuggernaut Aug 5, 2026
54f5cda
test: disconnect swept nodes and rank the pair gate first
CodeJuggernaut Aug 5, 2026
7697e53
test: give the load-widget fixture a real missing video to fail on
CodeJuggernaut Aug 5, 2026
85e38ee
fix(custom-nodes): resolve ledger pack keys case-folded; make tier re…
IAMtheIAM Aug 5, 2026
f5082d9
fix: case-fold ledger pack keys and make tier reds readable
CodeJuggernaut Aug 5, 2026
069838b
test: re-derive the cloud cannotRunAlone baseline with cache accounting
CodeJuggernaut Aug 5, 2026
ac60028
fix(custom-nodes): restore core sweep and cloud session auth
CodeJuggernaut Aug 5, 2026
5339bae
revert: restore plain graph.clear teardown in the connectivity sweep
CodeJuggernaut Aug 5, 2026
4a71dce
merge: keep verified custom-node harness fixes
CodeJuggernaut Aug 5, 2026
7e83eaf
fix: count only widgets the Vue renderer actually draws in S2
CodeJuggernaut Aug 5, 2026
23aa042
test: correct cloud S2 and S9 expectations
CodeJuggernaut Aug 5, 2026
4f8d757
test: classify verified cloud custom-node findings
CodeJuggernaut Aug 6, 2026
7b27bfc
test: tighten cloud custom-node failure evidence
CodeJuggernaut Aug 6, 2026
4740168
test: correct final core and cloud custom-node reds
CodeJuggernaut Aug 6, 2026
4507ca7
ci: remove custom-node core timeout
CodeJuggernaut Aug 6, 2026
a9b6fa1
test: scope custom-node startup settings by environment
CodeJuggernaut Aug 6, 2026
1dd9510
test: seed blank custom-node workflow before first boot
CodeJuggernaut Aug 6, 2026
fcec620
test: keep boot guard cleanup private
CodeJuggernaut Aug 6, 2026
f38f251
test: reconcile remaining cloud custom-node failures
CodeJuggernaut Aug 7, 2026
683ae49
test: classify state-variable cloud outcomes
CodeJuggernaut Aug 7, 2026
07e3834
test: settle exact custom-node runtime mechanisms
CodeJuggernaut Aug 7, 2026
22c91be
test: gate exact custom-node runtime variance
CodeJuggernaut Aug 7, 2026
e636aa1
Merge origin/main into custom node E2E suite
CodeJuggernaut Aug 7, 2026
937f0db
Merge latest origin/main into custom node E2E suite
CodeJuggernaut Aug 7, 2026
d46f7fc
Merge origin/main and harden custom node E2E proof
CodeJuggernaut Aug 9, 2026
2cd2c34
Merge latest origin/main into custom node E2E suite
CodeJuggernaut Aug 9, 2026
f134a3f
test: align LTXVideo Cloud node count
CodeJuggernaut Aug 10, 2026
9637805
test: keep Cloud evidence key constant local
CodeJuggernaut Aug 10, 2026
d58cbae
test: make Cloud 502 tracing observational
CodeJuggernaut Aug 10, 2026
fc3675d
test: ledger VHS preview geometry instability
CodeJuggernaut Aug 10, 2026
b19924e
test: baseline FlashVSR Cloud auto-run failures
CodeJuggernaut Aug 10, 2026
abfe4b0
test: baseline GIMM Cloud model loader
CodeJuggernaut Aug 10, 2026
6bf3943
test: surface required prompt rejections
CodeJuggernaut Aug 10, 2026
96bd9e0
test: stream custom-node failure summaries
CodeJuggernaut Aug 10, 2026
90b206f
test: fail fast on required Cloud boot 5xx
CodeJuggernaut Aug 10, 2026
21b86b2
test: wait for WhatDreams widget initialization
CodeJuggernaut Aug 10, 2026
6217d84
test: clarify custom-node CI labels
CodeJuggernaut Aug 10, 2026
96c6809
test: a 5xx prompt rejection is an environment fault, not a pack verd…
benjcooley Aug 11, 2026
db21287
Merge remote-tracking branch 'origin/main' into nathaniel/custom-node…
CodeJuggernaut Aug 11, 2026
a062fe0
test: skip coverage teardown on a page the test legitimately closed (…
benjcooley Aug 11, 2026
03b11ef
test: route the incident 5xx mock through the path production takes (…
benjcooley Aug 11, 2026
2d6578e
ci: dispatch inputs and a results table for the core custom-node gate…
benjcooley Aug 12, 2026
498a99a
test: ledger the WAS vue-height flip and the MathExpression sweep cra…
benjcooley Aug 12, 2026
f82454a
ci: serialize every cloud-gate run and stop the per-PR stampede (#15060)
benjcooley Aug 12, 2026
191f9f7
test: exclude the impact-add-queue emitters and ledger their victim (…
benjcooley Aug 12, 2026
e3ff0d7
ci: cache the core gate's setup - pip wheels and pinned pack trees (#…
benjcooley Aug 12, 2026
d02f676
test: fail error surfaces with their visible text, not a bare count (…
benjcooley Aug 12, 2026
5592728
test(custom-nodes): AudioConcatenate cannot run alone on Cloud (#15162)
benjcooley Aug 12, 2026
c6531c8
Merge origin/main into nathaniel/custom-node-e2e-suite
benjcooley Aug 12, 2026
6cad289
chore: mark recorded custom-node fixture data as generated
benjcooley Aug 13, 2026
8ad9a47
test: single-source the public Firebase web key in cloud fixtures
benjcooley Aug 13, 2026
56ea1d1
fix: keep Firebase fixture independent of Vite config
CodeJuggernaut Aug 13, 2026
b4494ec
test: isolate custom-node E2E tier results (#15155)
CodeJuggernaut Aug 13, 2026
7e9867d
test: defer custom-node geometry tier
CodeJuggernaut Aug 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,7 @@ packages/registry-types/src/comfyRegistryTypes.ts linguist-generated=true
packages/ingest-types/src/types.gen.ts linguist-generated=true
packages/ingest-types/src/zod.gen.ts linguist-generated=true
src/workbench/extensions/manager/types/generatedManagerTypes.ts linguist-generated=true
browser_tests/fixtures/customNode/geometry/*.json linguist-generated=true
browser_tests/fixtures/customNode/geometry/cloud/*.json linguist-generated=true
browser_tests/fixtures/customNode/interactionProfiles/*.json linguist-generated=true
browser_tests/fixtures/data/customNodeManifest.cloud.json linguist-generated=true
5 changes: 5 additions & 0 deletions .github/actions/setup-comfyui-server/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ inputs:
description: 'Whether to launch the server after setup'
required: false
default: 'false'
comfyui_ref:
description: 'ComfyUI git ref to check out (tag/branch/SHA). Empty = default branch (master).'
required: false
default: ''
runs:
using: 'composite'
steps:
Expand All @@ -19,6 +23,7 @@ runs:
uses: actions/checkout@v7
with:
repository: 'comfyanonymous/ComfyUI'
ref: ${{ inputs.comfyui_ref }}
path: 'ComfyUI'

- name: Install ComfyUI_devtools from frontend repo
Expand Down
542 changes: 542 additions & 0 deletions .github/workflows/ci-nightly-custom-nodes-canary.yaml

Large diffs are not rendered by default.

296 changes: 296 additions & 0 deletions .github/workflows/ci-tests-custom-nodes-cloud.yaml

Large diffs are not rendered by default.

355 changes: 355 additions & 0 deletions .github/workflows/ci-tests-custom-nodes.yaml

Large diffs are not rendered by default.

203 changes: 203 additions & 0 deletions .github/workflows/record-custom-nodes-geometry-cloud.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
# Records the CLOUD custom-node geometry baselines
# (browser_tests/fixtures/customNode/geometry/cloud/<pack>.json) and uploads
# them as an artifact to commit. The cloud sibling of
# record-custom-nodes-geometry.yaml: same record mechanism (mount sweep in
# CN_GEOMETRY=record mode, which throws after writing each pack's file so a
# record can never look like a green test run), with the backend swapped for
# Cloud. Kept as a SEPARATE file rather than a suite_env input on the core
# record workflow so the core record path stays byte-for-byte unchanged and
# neither file has to thread conditionals through every step - the same
# core/cloud split the two gate workflows already use.
#
# Cloud swaps out the whole local-backend half: no ComfyUI checkout, no pack
# install, no torch constraints, no `python main.py`. The dist is served by
# `vite preview` with /api proxied to Cloud (preview:cloud-e2e), and the mount
# sweep runs under CUSTOM_NODES_ENV=cloud so geometry.ts records into
# geometry/cloud/.
#
# SECRETS ARE REQUIRED here (unlike the always-on cloud gate, which no-ops when
# they are absent). A record run is a deliberate operator dispatch, so missing
# secrets are an operator error, not an expected pre-calibration state - the
# job FAILS LOUD rather than silently recording nothing.
#
# Runs for real only once the smoke user credentials AND the generated
# customNodeManifest.cloud.json exist (without the manifest the mount sweep
# throws at collection under cloud env). Dispatch it during Phase 5
# calibration, after the manifest lands, on the branch carrying it.
name: 'Record Custom Nodes Geometry (Cloud)'

on:
workflow_dispatch:
# workflow_dispatch cannot see a workflow that has never been on the
# default branch; pushing a record/custom-nodes-cloud-* ref runs this
# file from that ref (the core record workflow's escape hatch). Delete
# the ref after collecting the artifact.
push:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blocking — secret-bearing workflow executes branch-controlled code.

A collaborator can push record/custom-nodes-cloud-*; this workflow then checks out that ref and runs its local actions, package scripts, Vite build, and Playwright code with SMOKE_ACCOUNT_EMAIL and SMOKE_ACCOUNT_PASSWORD available. Repository write access does not imply permission to read shared account credentials.

Hypothetical: a branch modifies setup-frontend or build:cloud-e2e to POST environment values elsewhere. The run still looks like a recording run, and the exfiltration may leave no useful failure signal. Reviewers cannot differentiate a legitimate branch implementation from credential-stealing code after the fact.

Remove the push escape hatch. Keep the workflow implementation on the trusted default branch and accept only inert inputs/artifacts, or use an environment with required approval and no arbitrary ref checkout. See GitHub's secure use reference.

branches: ['record/custom-nodes-cloud-*']

concurrency:
# Shared literal group with ci-tests-custom-nodes-cloud.yaml. The reason
# is queue-scoped, not instance-topology (the earlier "one shared Cloud
# instance" wording here was unsourced and is retracted): both workflows
# sign in as the ONE smoke account (smokeAuth.ts memoizes a single
# SMOKE_ACCOUNT_EMAIL identity), so they share one ComfyUI queue. Per-test
# cleanup is now scoped to each page's own prompt ids, but the shared
# queue still makes a record run and a gate run interfere: waitForQueueQuiet
# (customNodeSuite.ts) waits on the whole queue and cannot tell whose work
# it is. Retire this group when the smoke-account pool lands (see the
# gate's concurrency comment for the full semantics). Every gate event -
# including workflow_dispatch - now shares this group, so a record run and
# a gate run can no longer overlap.
group: custom-nodes-cloud-instance
cancel-in-progress: false

jobs:
record-geometry-cloud:
if: github.repository == 'Comfy-Org/ComfyUI_frontend'
runs-on: ubuntu-latest
# 60 was inherited from the core record job and is far too small for
# cloud: run 30445909728 was killed at exactly 60.25 minutes, mid
# geometry record, and a job-level timeout CANCELS - which reads as a
# queue eviction and sent four attempts chasing the wrong cause. Cloud
# pays per-test app load over the network (the cloud gate needs 287+
# minutes for the same corpus), so this sits just under GitHub's 360
# hard wall. The two record steps carry their own lower ceilings so an
# overrun FAILS the step - keeping the upload steps reachable - instead
# of cancelling the job and losing the partial artifact.
timeout-minutes: 350
permissions:
contents: read
steps:
# Fail loud if the operator dispatched without the cloud secrets: a record
# that silently produced no baselines would look like a crashed run.
- name: Require smoke user credentials
env:
SMOKE_ACCOUNT_EMAIL: ${{ secrets.SMOKE_ACCOUNT_EMAIL }}
SMOKE_ACCOUNT_PASSWORD: ${{ secrets.SMOKE_ACCOUNT_PASSWORD }}
shell: bash
run: |
set -euo pipefail
missing=()
[ -n "${SMOKE_ACCOUNT_EMAIL:-}" ] || missing+=(SMOKE_ACCOUNT_EMAIL)
[ -n "${SMOKE_ACCOUNT_PASSWORD:-}" ] || missing+=(SMOKE_ACCOUNT_PASSWORD)
if [ ${#missing[@]} -gt 0 ]; then
echo "::error::cloud geometry record needs these repo secrets: ${missing[*]}"
exit 1
fi

- name: Checkout repository
uses: actions/checkout@v7

- name: Setup frontend
uses: ./.github/actions/setup-frontend
with:
include_build_step: false

# DISTRIBUTION is a build-time constant: the recorded baselines must come
# from the cloud dist, not a localhost build (see the gate's build step).
- name: Build cloud dist
shell: bash
run: pnpm build:cloud-e2e

- name: Setup Playwright
uses: ./.github/actions/setup-playwright

# Same served-dist-against-Cloud mechanism as the cloud gate.
- name: Start cloud preview server
shell: bash
run: |
set -euo pipefail
pnpm preview:cloud-e2e --port 4173 &
for _ in $(seq 1 60); do
if curl -sf -o /dev/null http://localhost:4173/; then
echo "cloud preview server ready on :4173"
exit 0
fi
sleep 2
done
echo "::error::cloud preview server did not become ready on :4173"
exit 1

# The checkout brings any committed cloud baselines along; delete them so
# the uploaded artifact is provably a product of THIS run and the
# if-no-files-found guard can fire on a crashed record instead of shipping
# stale bytes. `rm -f` no-ops cleanly the first time (no cloud/ dir yet).
- name: Clear committed cloud baselines
shell: bash
run: rm -f browser_tests/fixtures/customNode/geometry/cloud/*.json

# CUSTOM_NODES_ENV=cloud routes geometry.ts's record writes into
# geometry/cloud/. Record mode throws by design after writing each file,
# so continue-on-error and retries=0 - the artifact is the product, not a
# green run. No CN_GEOMETRY_CORE: cloud has no pinned core SHA, so
# provenance stamps 'unrecorded' (allNodes.spec.ts); the row's deployRef
# is recorded as the pin.
- name: Record cloud geometry baselines
continue-on-error: true

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Record artifacts can be partial or stale while looking complete.

The geometry destination is cleared, but interaction profiles are not. All three producers use continue-on-error, and upload checks only for some file(s). A crash after one pack can publish a partial geometry set; failed interaction packs can be silently supplied by committed checkout files.

Clear every destination first, write into a fresh run-specific directory, and validate the exact manifest pack set, schema, provenance, and node counts before upload. Also note that the three step ceilings total 380 minutes before setup while the job ceiling is 350, so the job can be cancelled before uploads despite comments promising reachability.

timeout-minutes: 160
env:
CUSTOM_NODES_ENV: cloud
CN_GEOMETRY: record
PLAYWRIGHT_TEST_URL: http://localhost:4173
SMOKE_ACCOUNT_EMAIL: ${{ secrets.SMOKE_ACCOUNT_EMAIL }}
SMOKE_ACCOUNT_PASSWORD: ${{ secrets.SMOKE_ACCOUNT_PASSWORD }}
run: |
pnpm exec playwright test browser_tests/tests/customNodes/allNodes.spec.ts \
--project=custom-nodes --reporter=list --workers=1 --retries=0 \
--grep "all nodes:"

# S13 cloud profiles: same probes, same session; CUSTOM_NODES_ENV=cloud
# routes writes into interactionProfiles/cloud/.
- name: Record cloud interaction profiles (S13)
continue-on-error: true
timeout-minutes: 160
env:
CUSTOM_NODES_ENV: cloud
CN_INTERACTION: record
PLAYWRIGHT_TEST_URL: http://localhost:4173
SMOKE_ACCOUNT_EMAIL: ${{ secrets.SMOKE_ACCOUNT_EMAIL }}
SMOKE_ACCOUNT_PASSWORD: ${{ secrets.SMOKE_ACCOUNT_PASSWORD }}
run: |
pnpm exec playwright test browser_tests/tests/customNodes/interactionProfiles.spec.ts \
--project=custom-nodes --reporter=list --workers=1 --retries=0

# S15 cloud hashes: the download now runs in-page so it carries the
# signed-in session, which is what kept this tier core-only. Writes
# test-results/curatedOutputHashes.recorded.json; commit it as
# browser_tests/fixtures/data/curatedOutputHashes.cloud.json.
- name: Record cloud output hashes (S15)
continue-on-error: true
timeout-minutes: 60
env:
CUSTOM_NODES_ENV: cloud
RECORD_OUTPUT_HASHES: '1'
PLAYWRIGHT_TEST_URL: http://localhost:4173
SMOKE_ACCOUNT_EMAIL: ${{ secrets.SMOKE_ACCOUNT_EMAIL }}
SMOKE_ACCOUNT_PASSWORD: ${{ secrets.SMOKE_ACCOUNT_PASSWORD }}
run: |
pnpm exec playwright test browser_tests/tests/customNodes/customNode.regression.spec.ts \
--project=custom-nodes --reporter=list --workers=1 --retries=0

- name: Upload recorded cloud output hashes
uses: actions/upload-artifact@v6
with:
name: custom-nodes-output-hashes-cloud
path: test-results/curatedOutputHashes.recorded.json
retention-days: 7
if-no-files-found: warn

- name: Upload recorded cloud interaction profiles
uses: actions/upload-artifact@v6
with:
name: custom-nodes-interaction-profiles-cloud
path: browser_tests/fixtures/customNode/interactionProfiles/cloud/
retention-days: 7
if-no-files-found: error

- name: Upload recorded cloud baselines
uses: actions/upload-artifact@v6
with:
name: custom-nodes-geometry-baselines-cloud
path: browser_tests/fixtures/customNode/geometry/cloud/
retention-days: 7
if-no-files-found: error
164 changes: 164 additions & 0 deletions .github/workflows/record-custom-nodes-geometry.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
# Records the custom-node geometry baselines
# (browser_tests/fixtures/customNode/geometry/<pack>.json) in the CI
# environment and uploads them as an artifact to commit. Recording MUST
# happen here, not on a dev machine: font metrics differ across platforms
# by whole pixels, and the baselines also encode pack-JS-built layout, so
# only this environment produces the numbers the gate compares against.
# Run it (manual dispatch) whenever a deliberate pin/core bump or an
# intended restyle legitimately moves layout, then commit the artifact in
# the same PR as the change that moved it. Procedure:
# docs/custom-node-regression-suite.md Step 5b.
name: 'Record Custom Nodes Geometry'

on:
workflow_dispatch:
# workflow_dispatch cannot see a workflow that has never been on the
# default branch; pushing a record/custom-nodes-* ref runs this file
# from that ref instead. Delete the ref after collecting the artifact.
push:
branches: ['record/custom-nodes-*']

concurrency:
group: ${{ github.workflow }}
cancel-in-progress: false

jobs:
record-geometry:
if: github.repository == 'Comfy-Org/ComfyUI_frontend'
runs-on: ubuntu-latest
timeout-minutes: 60
permissions:
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v7

- name: Setup frontend
uses: ./.github/actions/setup-frontend
with:
include_build_step: true

- name: Setup Playwright
uses: ./.github/actions/setup-playwright

# Same pinned core as the gate: baselines must describe the exact
# world the gate tests. Bump this SHA together with the gate's
# comfyui_ref (ci-tests-custom-nodes.yaml) and the canary Job B copy.
- name: Setup ComfyUI server
uses: ./.github/actions/setup-comfyui-server
with:
launch_server: 'false'
comfyui_ref: 'b08e6cf35fac50d3ca8470dffb3f9a1fbb7187d2'

# Identical pinned-pack install to the gate.
- name: Install manifest custom nodes
shell: bash
run: |
set -euo pipefail
pip freeze | grep -iE '^(torch|torchvision|torchaudio)==' \
> /tmp/torch-constraints.txt || true
manifest=browser_tests/fixtures/data/customNodeManifest.core.json
mapfile -t entries < <(jq -c '.[]' "$manifest")
for entry in "${entries[@]}"; do
repo=$(jq -r '.repo' <<<"$entry")
pin=$(jq -r '.pin' <<<"$entry")
pack=$(jq -r '.pack' <<<"$entry")
if ! [[ "$pack" =~ ^[A-Za-z0-9][A-Za-z0-9._-]*$ ]]; then
echo "::error::unsafe pack name: '$pack'"; exit 1
fi
if ! [[ "$pin" =~ ^[0-9a-f]{40}$ ]]; then
echo "::error::$pack: pin must be a full commit SHA (got '$pin')"; exit 1
fi
dir="ComfyUI/custom_nodes/$pack"
echo "::group::install $pack"
git clone --depth 1 "$repo" "$dir"
git -C "$dir" fetch --depth 1 origin "$pin"
git -C "$dir" checkout "$pin"
if [ -f "$dir/requirements.txt" ]; then
pip install -r "$dir/requirements.txt" -c /tmp/torch-constraints.txt
fi
echo "::endgroup::"
done

- name: Stage run-tier assets
shell: bash
run: cp browser_tests/assets/plain_video.mp4 ComfyUI/input/plain_video.mp4

- name: Start ComfyUI server
shell: bash
working-directory: ComfyUI
run: |
python main.py --cpu --multi-user --cache-none --front-end-root ../dist &
wait-for-it --service 127.0.0.1:8188 -t 600

# The checkout brings the committed baselines along; delete them so
# the uploaded artifact is provably a product of THIS run and the
# if-no-files-found guard below can actually fire on a crashed
# record instead of shipping stale bytes as a fresh recording.
- name: Clear committed baselines
shell: bash
run: rm -f browser_tests/fixtures/customNode/geometry/*.json

# Record mode throws by design after writing each pack's file (a
# record must never look like a green test run), so the step is
# expected to exit nonzero; the artifact is the product. Retries are
# pointless against a deliberate throw, so they are off.
# CN_GEOMETRY_CORE stamps provenance into each baseline file and
# must match the comfyui_ref above.
- name: Record geometry baselines
continue-on-error: true
env:
CN_GEOMETRY: record
CN_GEOMETRY_CORE: b08e6cf35fac50d3ca8470dffb3f9a1fbb7187d2
run: |
pnpm exec playwright test browser_tests/tests/customNodes/allNodes.spec.ts \
--project=custom-nodes --reporter=list --workers=1 --retries=0 \
--grep "all nodes:"

# S15 output hashes ride the same backend boot: curated workflows in
# record mode write test-results/curatedOutputHashes.recorded.json and
# deliberately fail each recording test (a record is not a pass).
- name: Record output hashes (S15)
continue-on-error: true
env:
RECORD_OUTPUT_HASHES: '1'
# Stamped into the fixture's recordedAt.core; must match comfyui_ref.
CN_OUTPUT_HASHES_CORE: b08e6cf35fac50d3ca8470dffb3f9a1fbb7187d2
run: |
pnpm exec playwright test browser_tests/tests/customNodes/customNode.regression.spec.ts \
--project=custom-nodes --reporter=list --workers=1 --retries=0 \
--grep "Curated workflow execution: completes without error"

- name: Upload recorded baselines
uses: actions/upload-artifact@v6
with:
name: custom-nodes-geometry-baselines
path: browser_tests/fixtures/customNode/geometry/
retention-days: 7
if-no-files-found: error

- name: Upload recorded output hashes
uses: actions/upload-artifact@v6
with:
name: custom-nodes-output-hashes
path: test-results/curatedOutputHashes.recorded.json
retention-days: 7
if-no-files-found: error
# S13 interaction profiles ride the same boot: record mode writes the
# per-pack fixture files and deliberately fails each test.
- name: Record interaction profiles (S13)
continue-on-error: true
env:
CN_INTERACTION: record
CN_INTERACTION_CORE: b08e6cf35fac50d3ca8470dffb3f9a1fbb7187d2
run: |
pnpm exec playwright test browser_tests/tests/customNodes/interactionProfiles.spec.ts \
--project=custom-nodes --reporter=list --workers=1 --retries=0

- name: Upload recorded interaction profiles
uses: actions/upload-artifact@v6
with:
name: custom-nodes-interaction-profiles
path: browser_tests/fixtures/customNode/interactionProfiles/
retention-days: 7
if-no-files-found: error
Loading
Loading