- Add Wildcard Prompt Composer and Wildcard Character Composer builder nodes (core/builder, web/prompt_builder.js, builders/, vp wildcard lists) - Add browser-based wildcard review tool (tools/wildcard_review) with manifest-based undo - Add wildcard catalog/curation, surreal compiler/lint/scene, profile token budget - README: document all 18 nodes, bump to v2.2.0, fix stale node/platform lists; CHANGELOG 2.2.0 - Rewrite NODE_COMPARISON for 18 nodes; fix QUICKSTART (dead test_setup.py ref, menu path) and QUICK_REFERENCE node list - gitignore review manifests and CLAUDE.md Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
15 KiB
Surreal Guide
Version 2 replaces the surreal preset's list of style words ("dreamlike, ethereal, magical realism") with a
working procedure. This document says why, what the procedure is, and how to use it.
Why a style word fails
Image models regress toward the plausible. Ask for "surreal" and you get the averaged look of everything tagged surreal: purple mist, floating islands, melting clocks. The word names an effect and gives the model nothing to build it from.
The surrealists who lasted did not imagine strange things and then paint them. Each had a repeatable procedure with two halves. A generator supplied something outside conscious control: chance texture (Ernst's rubbings of floorboards), a misperception (Magritte's egg in the birdcage), a stock of unrelated negatives (Uelsmann's contact sheets), a rule. A critic then read, selected and finished with full craft. Most generated material was thrown away. The imitators copied the results and skipped the procedure.
Two findings from the research (Surrealist methods tab of the plan) govern the engine:
- One anomaly, full credibility. A single violation with light, perspective, material and craft all consistent. Varo's machines look as if they work; Ernst's seams are invisible. Several anomalies at once read as a collage of effects and the viewer stops asking why.
- Affinity beats distance. Magritte's own correction of his early work: the shock comes from two things secretly bound together (by shape, function, material, a word), not from two things merely far apart.
Two of the strongest photographic modes depict nothing impossible at all (Atget, Crewdson, solarisation): the strangeness is the hour, the emptiness, the stillness, the process, and a story that is withheld.
The engine
core/strategies/surreal/. Eight generator modes, one shared critic, no ComfyUI dependency.
| Mode | From | What the generator does |
|---|---|---|
| affinity search | Magritte | For an object the idea names, finds partners far in domain yet bound by form (the tag vocabulary of objects.yaml) |
| problem | Magritte | A procedure for the LLM: list the subject's defining properties, find the one substitution that exposes one |
| read the noise | Ernst | Draws unrelated fragments and asks for the one seamless scene they are already part of |
| double reading | Dali | Two things with the same silhouette, one form that is honestly both |
| working machine | Varo | Mechanism + feedstock + product, joined by a causal chain that looks functional |
| archive composite | Uelsmann, Maar | Fragments from YOUR iconography file and prompt database, never from stock |
| found strange | Atget, Crewdson | No anomaly: ONE hour and ONE condition - emptiness, stillness, light or a trace |
| process estrangement | Man Ray, Miller | An ordinary subject and one photographic process |
The operations table from the plan (displacement, scale violation, hybridization, material substitution, behaviour transfer, physics negation, inversion, double image, animation / petrification, absence, metaphysical space, literalized language, multiplication, causal reversal, autonomy, taxonomy error, and for video a temporal one) is the critic's vocabulary for describing a result. The last three come from the transformation atlas in the Surrealism Field Manual: the consequence present without its cause; the shadow, reflection or garment that acts while the thing that casts it does not; and the object left physically untouched but catalogued as a specimen of the wrong kingdom. Autonomy is allowed as a second operation, because a shadow behaving on its own echoes an object-level anomaly rather than competing with it.
A premise is a picture, not an inventory
found_strange originally joined its hour to two independently drawn conditions. Measured over 300 seeds that
gave four and a half unrelated facts per premise — the generator itself producing the prompt soup the method
exists to avoid — and in 33% of draws it paired a daylight hour with a condition that only reads in darkness
("noon with hardly a shadow" and "only one light in the whole scene is on"). Handed two facts that cannot both
be true, the LLM critic would look for the relation joining them and invent one, and nothing downstream could
recover: in the run that exposed this, a telephone receiver became the only light source in a garden at noon.
It now draws ONE hour and ONE condition, and the entries carry a light tag (dark / bright on the hour,
needs_dark on the conditions that are invisible in daylight) so an incompatible pair cannot be drawn at all.
Two hours by three groups also gives the critic six genuinely different candidates where a forced mode used to
yield two near-copies, which matters because the critic's whole job is to reject most of what it is given.
Contradictions measured after the change: none in 300 seeds.
The law
An operation says what is violated. The law says what governs the violation: what may change, what may not,
and how the change behaves. Without one the picture reads as random, and a second anomaly reads as a second idea
instead of an echo - the commonest failure in generated surrealism, and the one the field manual is most
insistent about. Every operation carries its own law, so the law always governs the premise that was actually
chosen; the node's law input overrides it and is never touched. The eight charges carry laws of their own -
grief makes what the missing person touched heavier, desire makes what is wanted larger - but these are offered
to the LLM critic as a suggestion only, because an emotion does not know which anomaly was picked. The law
reaches the instruction block under its own heading, with the standing order to show the rule in effect, never
state it, and remove anything that does not obey it.
The critic exists twice. The code critic is seeded, offline and instant: it filters cliches and explanations
and chooses by score. It cannot check that a second operation obeys the first one's law, and says so in why.
The LLM path is now staged. The first call inventories the ordinary scene: stable entity ids, visible
attributes, ordinary physical properties, relationships, affordances, subject action, setting, light and
viewpoint. It does not invent an anomaly. The LLM critic is the second call. It names the subject, keeps or rejects each
candidate with a reason (an affinity that cannot be said in one short clause is rejected), carries out the
procedure modes, writes the law that fits the premise it chose, and then does the field manual's own critique
step: it scores its draft premise on seven rubric dimensions from 0 to 4 - reality anchor, rupture, psychic
pressure, transformation rule, formal unity, ambiguity, residual power - names the lowest-scoring one, and
rewrites the premise with that one repair applied. The scores, the weakest dimension and the repair are printed
in why, so the judgement can be judged. It also picks one of five named title strategies (sideways
association, false classification, temporal clue, ordinary phrase, poetic friction); "Dream", "Untitled" and
anything containing "surreal" are refused. If its answer is unusable the code critic's choice stands and the
why output says so; a missing or malformed part - no scores, no repair, an over-long or placeholder law - is
dropped rather than guessed at, and the rest of the verdict is still used.
The critic also returns a structured render plan: target, replacement/material/borrowed behaviour, properties to
preserve, positive visual evidence, likely ordinary interpretations to reject, composition, and a
preserved_scene from which replaced entities and properties have already been removed.
An operation-specific compiler turns that plan into the node's text output. It never prepends the untouched
idea: doing that restored replaced objects because the platform rewriter is required to keep every noun the user
named. Removed entity descriptions and their head nouns are hard validation failures. Context clauses that name
one are dropped; if the anomaly itself names one or uses substitution grammar, compilation is refused and the
unchanged idea is returned with an explicit error in why.
The instruction block travels through the wildcard_instructions input every enhancer already has. The block tells the
enhancer's LLM to state the anomaly early as fact, restate it once in other words, keep everything else
rigorously ordinary, render in the chosen register, serve the chosen charge, add no further symbolic objects
(every extra noun competes with the premise, which is how a prompt becomes soup), and never use the ban-list. Its
Concepts heading is the one the Concept Survival Check parses, so whether the anomaly survived the rewrite
can be measured.
Using it
Surreal Premise node (Eric Prompt Enhancers). Connect text to an enhancer's prompt and llm_instructions
to its wildcard_instructions. why shows every candidate, the critic's judgements, the rubric scores and the
reasoning. title, negative_additions and law are extras.
Controls: mode and operation (auto, or force one), count (1 or 2, never more; a second operation is always
atmosphere-level so both read as one event), strangeness (shifts which modes and operations are drawn),
register (deadpan photographic by default: a photograph argues with its own impossibility), charge (the
emotional source the anomaly serves; an anomaly with no stake reads as a gimmick), critic (llm or code),
seed, medium (video adds anomalies in time), an optional embedder (partners far from the idea in meaning
score higher), use_archive, and law (leave blank and the chosen operation's law is used; type one and it is
used verbatim, for instance only patterned fabric can cross the boundary between a body and a wall).
The old surreal preset on the three video nodes and genre_style = surreal on the Text-to-Image node now
route through the engine with the code critic, seeded like the node's wildcards, so each variation gets its own
operation. If the engine produces nothing the old text is used.
Your iconography. Copy wildcards/iconography.yaml to ComfyUI/models/wildcards/iconography.yaml and fill
it with your own recurring objects, places and motifs. The engine draws from it first, and the archive-composite
mode needs it. Magritte's bowler hat, apple and curtain were a small private vocabulary recombined for decades;
that is what makes a body of work recognisable instead of averaging toward everyone's.
Lists in wildcards/surreal/ (physics, absences, idioms, processes, temporal, autonomy, reversals,
found_strange, machines, motifs) are
ordinary wildcards too: __surreal/physics__. Entries are conditions laid on the user's own scene and say
THE SUBJECT for its main subject.
What a live run showed (2026-09-21, qwen3-4b-2507)
Five ideas, five platforms (Krea 2, FLUX.2, SDXL tags, MiniMax H3 fields), the LLM critic, then the rewriter, then the survival check with the LLM judge: every premise survived its rewrite, in every format. The critic rejected candidates for the right reasons ("no affinity with the subject", "too many impossible elements"). What a 4B model gets wrong: it imports things the scene does not have (a chair at a bus stop, since fixed by making placements relative to the subject), it sometimes rewrites rather than keeps and then reports the wrong candidate number (now detected), and its own premises can contradict themselves. A 24B or larger model is the one to use for the critic.
Phase 1: writing for the image model (2026-10-01)
The 2026-09-21 run showed the idea surviving the rewrite and the picture still coming back ordinary. Three causes,
and what changed (spec: dev/SURREAL_RENDER_SPEC.md):
- Substitution grammar. "Where the teacup should be there are boots instead" gives a text encoder a teacup AND
boots; it keeps nouns and loses the counterfactual. Every candidate now carries a
render- the result as the camera sees it - and the replaced object goes on asuppresslist the rewriter is told never to name.core/strategies/surreal/lint.pyrejects should be / would be / instead of the / in place of / as if / treats it as, and attitudes with no pixels (nobody notices, unnoticed, remains unaware or unfazed), in generator output and in the critic'srender. On the Platform Rewriter's output, attitude clauses are removed and substitution grammar or a named suppressed object is reported as a warning. - The anomaly was outvoted. The block now puts the anomaly FIRST, large in the frame, gives it at least a third of the words, asks for a second visible consequence instead of a paraphrase, and drops camera boilerplate unless the register needs it.
- Conceptual but invisible. The rubric gains
visibility(unmistakable in a thumbnail at a glance), and the critic is told that deadpan is not the same as small.
Two-stage. The node has two new outputs, scene_prompt and edit_instruction, and a staging widget (all
appended at the end). Generate the ordinary picture from scene_prompt, then apply edit_instruction with an
edit model (Qwen-Image-Edit, Flux 2 edit, Kontext, Qwen-Image 2.1 i2i). The edit is filled whenever the
operation can be done as one edit (displacement, scale, hybridization, material, inversion, petrification,
multiplication; the LLM critic also writes edits for others when it can). two_stage restricts the automatic
choice to those operations.
Structured compiler stages (2026-10-18)
- Ordinary inventory. Record the scene before intervention; no surreal invention is allowed.
- Generator and critic. Choose one operation and produce a transformation law plus a structured render plan.
- Operation compiler. Compile only the final transformed scene, anomaly first, with required physical proof and no removed entity. Displacement, material substitution, scale violation and behaviour transfer have dedicated compilers; the other operations use the shared positive-fact compiler until their own grammar is refined from live results.
- Platform verbalizer. The existing enhancer receives the compiled scene and the structured plan. It may express that plan in the target model's dialect but may not reinterpret it.
behavior_transfer covers cases such as an ocean that remains seawater but forms a stable lifted fold like heavy
fabric. The critic must preserve evidence of the original identity, add evidence of the borrowed behaviour, keep
the surface connected to its scene, and reject the likely normal readings (a handful of water, a splash, or a
literal textile prop).
Two live runs with Mistral Small 3.2 24B as critic and rewriter (dev/logs/try_surreal_live_p1*.log): in the first,
8 of 9 premises led with a visible physical fact (the ninth fell back to the code critic) and 7 of 9 came with an
edit instruction; in the second, after fixing the survival check, 9 of 9 survived the rewrite. The survival check
had keyed the judge's verdicts on the exact concept text and lost them whenever the judge echoed a concept slightly
differently, reporting '[none]' for anomalies that were plainly in the prompt.
The test protocol for the two-operation limit
In the plan doc: ten subjects, one platform, counts 1, 2 and an uncapped control, four seeds each, scored blind
on legibility, credibility and hold, plus anomaly survival per operation. The Krea2 sweep nodes can run the grid;
the three scores need a human eye. count is capped at 2 until that run says otherwise.