# Divergence

> Divergence

- Skill: `stoica-mihai/divergence` (Agent Skill, multi-file: 14 files)
- Install (CLI): `npx skillmds@latest add stoica-mihai/divergence`
- Raw SKILL.md: https://api.skillmd.com/api/skills/stoica-mihai/divergence/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Stoica-Mihai (https://skillmd.com/u/stoica-mihai)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/stoica-mihai/divergence

---


# 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.

```bash
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:

```bash
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

```bash
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:

```bash
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:

```bash
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.

