Divergence
Why this exists
Asking a model for something unconventional does not escape its distribution. Every framing has a mode of its own: "unconventional" has a mode, "risky" has a mode, and "propose four distinct directions" returns the canonical four-way partition of the space. Asking for the tail retrieves a learned picture of the tail. Asking for more of them multiplies inside the mode instead of leaving it.
Sampling parameters used to supply the randomness, and on current models they
are gone — temperature, top_p, and top_k are rejected outright. So the
only remaining source of novelty is information that did not come from the
model at request time. That is what this skill provides, and it is the whole of
what it provides: selection driven by os.urandom, over decks that are fixed
before the request arrives, optionally extended by a corpus the user supplies.
Worth being straight about the weakest link. The decks shipped here were written
for this skill rather than sampled from a model at request time, so a draw is not
a fresh trip through the distribution — but they are a fixed set someone chose,
not a neutral sample of the world, and their contents carry that. What makes a
draw hard to predict is the combinatorics over them plus the OS entropy doing the
picking. The genuinely external source is --words-from, so prefer it whenever
the user has material of their own.
Two consequences worth holding onto:
The conjunction does the work, not any single draw. One random noun has a mode. A noun plus a borrowed organising structure plus two hard constraints plus fixed quantities, all holding at once, is a combination with no precedent to retrieve. Rarity lives in the intersection.
The role inverts. Originating an off-centre idea is the part a model does badly. Developing one, stress-testing it, and executing it with craft is the part it does well. So the seed supplies the strangeness and the work here is construction, not invention.
Draw the seed before generating anything
Run this first, before forming any view of what the output should be. A seed drawn after an idea exists gets fitted to that idea, and the idea came from the mode.
python3 "${CLAUDE_PLUGIN_ROOT}/skills/divergence/scripts/seed.py" --domain visual
--domain is one of visual, prose, code, product, music, naming,
general. It selects which constraint deck is used, and adds a palette for
visual work or meter and pitch for music. --n 3 draws several independent
seeds when the user wants options to choose between — the draws are checked
against each other so they do not collide.
--words-from FILE adds a corpus of the user's own to the anchor pool, and this
is the strongest entropy available for the reason given above: the bundled decks
are fixed and finite, while a file the user chose — their notes, a book, a column
of data, a wordlist — is outside both the decks and the model. Offer this
whenever they have material lying around.
Every draw is written to ~/.claude/divergence/ledger.jsonl as it happens, and
later draws avoid what recent ones used. This is why repeat rejection works
without anyone having to remember a second command. --no-ledger opts out for a
throwaway.
For a body of work that must not converge on itself — a set of client pages, a series of names, episodes — point the ledger at the project instead:
python3 "${CLAUDE_PLUGIN_ROOT}/skills/divergence/scripts/seed.py" \
--domain visual --ledger ./divergence-ledger.jsonl
Checked into that repo, it scopes the memory to the work rather than the machine, and it travels with the project. The default user-level file is the right choice for one-off draws, and the wrong one for a series, since unrelated work dilutes what the series is trying to avoid.
Bind the seed, do not mention it
This is where the method fails when it fails. A seed can be acknowledged in a sentence while the output stays exactly as modal as it would have been — "inspired by tide tables" written above a conventional layout, an anchor named in a comment, a constraint listed and then quietly not applied.
The test:
Strip every seed element out of the output. If what remains still stands up as a finished piece, the seed was decoration and the run failed.
A bound seed cannot be removed without the work collapsing, because the work was built out of it. Some specifics:
- Anchors are material to recombine. Take structure, behaviour, or logic from them. Naming them in the output is usually a sign they were not used.
- The transposition is an organising principle to borrow. The question is "what if this were arranged the way that is arranged" — not "add a reference to it". This draw moves an output further than any of the others, and it is the easiest one to fake.
- Constraints all hold at once, and they hold in the artifact rather than in a note about the artifact. They are meant to be uncomfortable: a constraint the default answer already satisfies is doing nothing.
- Quantities are real counts, ratios, or limits somewhere load-bearing.
When a drawn constraint genuinely conflicts with a hard requirement — an accessibility floor, a legal obligation, the actual thing the user needs — redraw that one constraint rather than dropping it silently, and say which one you swapped and why. Discomfort is the working condition. Incompatibility is not.
Execute with whatever skill owns the craft
This skill supplies the seed and stops. It holds no opinions about typography, prose rhythm, or architecture, and it should not acquire any.
For web and interface work, hand the bound seed to frontend-design, which
carries the craft guidance for type, motion, and spatial composition. Where its
instructions and a drawn constraint disagree, the constraint wins — it is the
part carrying the entropy. Other domains: use whatever skill or knowledge
normally applies, with the seed already binding.
Record what came out
python3 "${CLAUDE_PLUGIN_ROOT}/skills/divergence/scripts/seed.py" \
--record "vertical right-hand nav, cut corners, ochre dominant" \
--brief "pricing page for a metering product" --domain visual
One line naming the shape of what was produced, in enough detail that a future
run can recognise the same territory. Later draws in the same domain print
these back as places not to land again — they are domain-scoped because a
signature describes an output in that domain's own vocabulary, so a prose one
would be noise during a visual draw. Pass the same --ledger you drew with. This is the one form of mode-avoidance that holds up, because it
rests on observed evidence of past outputs rather than on the model's account of
its own tendencies — and it is the part of the skill that gets stronger the more
it is used.
Check that it worked
The claim is falsifiable, so it is worth falsifying. Run the same brief several times, keep the outputs, and compare:
python3 "${CLAUDE_PLUGIN_ROOT}/skills/divergence/scripts/divergence_check.py" --dir runs/ --glob '*.md'
It prints mean pairwise similarity and, more usefully, the convergence fingerprint — the tokens present in every run. Words from the brief belong there. A typeface, a hex value, or a structural choice appearing in all of them is the default reasserting itself, and that is the signal to act on. Read the fingerprint before the score, since the score's absolute value depends on how much boilerplate the format carries.
To isolate a failure, check the drawer separately:
python3 "${CLAUDE_PLUGIN_ROOT}/skills/divergence/scripts/divergence_check.py" --seed-check 6 --domain visual
If the drawer varies but the outputs do not, the seed is being drawn and then ignored — go back to the binding test above. If the drawer itself is not varying, nothing downstream matters until that is fixed.
Growing the decks
decks/ is data, and it is meant to accrete. Add a line whenever a constraint
produces something worth keeping, or whenever an object or a system turns out to
be good material. A constraint earns its place by being specific, arbitrary, and
awkward for the default answer to satisfy — vague preferences and general
encouragement do nothing here. One line each, comments start with #, and order
is never relied on.
When this is the wrong tool
An off-centre result is a cost as well as a benefit. Skip this when the user wants something conventional, when a house style or brand is being matched, when an existing pattern in the codebase should be followed, or when the task has one correct answer. Reaching for entropy there just produces work that has to be redone.