Method

I built this system for my own work first, then packaged the same pieces so anyone can run them on their own brand. Six layers, each one a file you can open. Swap the vocabulary, keep the machinery.

01Tokens are the palette you commit to

A design system starts by refusing most colors. Here that is one ink at a time: Prussian blue on cream, phosphor green on black, or black plus one small red. The tokens file is the contract; everything downstream reads from it.

File: kit/tokens.json (with provenance in every $description) and kit/tokens.css (drop-in custom properties). Rule: R1.

02Banks are vocabulary

Prompts are assembled from banks, not written one at a time: 433 subjects, 131 influences, 22 palettes, 7 print processes, 10 capture modes, 10 artifact formats, 14 textures, and a small weighted lexicon. A bank is a list in a text file. Replacing the lexicon and palette banks with your own words is the whole "bring your own brand" step.

Live: edgelesslab.com/lab/prompt-engine, the same engine with a bring-your-own-taste config. The engine's source of truth is blender.py in the Edgeless monorepo; the dashboard is exported from it.

03Recipes cross banks

A recipe names which banks to cross and in what sentence shape. Seven are in use: influence, poster, spectral, oldschool, ephemera, collision, photo. Oldschool is subject times print process times wordmark. Spectral is capture mode times subject times HUD label. The recipe is where the aesthetic lives; the banks only supply nouns.

oldschool:  {subject}, {process}, wordmark "{lexicon}"
spectral:   {mode} of {subject}, {mode_look}, monospace HUD label "{lexicon}"
ephemera:   {format} of {subject}, {palette}, engraved "{lexicon}"

Every prompt in the Rulebook came out of one of these shapes; the tag id under each prompt points to its line in docs/prompts/exploration-log.txt.

04Coverage and dedupe stop repeats

Random sampling from banks repeats the same twenty subjects within a hundred prompts, and that waste is visible at scale. Two guards fix it: a coverage-guaranteed picker that walks a persisted permutation of each bank across rounds, so nothing repeats until the whole bank has been used once; and a dedupe check against every prompt ever submitted (exact and near-duplicate) before a batch is fired.

Evidence: rounds 26 and 27 in the log are 500 prompts each with 412 and 411 distinct subjects; round 30 is 64 prompts with 64 distinct subjects.

05Rules are what survived

After thirty rounds, the recipe settles into a handful of sentences that keep being true. Those are the rules, numbered so they can be cited, each with three real prompts as evidence. A rule without a prompt is an opinion.

File: rules.json, rendered by scripts/build_rules.py, which refuses to build if any prompt is not verbatim from the log.

06Keepers are proof

Images enter the system one at a time, when a draft is worth promoting. At that moment the prompt is copied off the job page into the keeper record, and the image attaches to a rule as proof. One keeper, one row, one build, one push. The Rulebook is complete at zero keepers and only gets more convincing.

Schema: keepers.csv carries prompt_tag and prompt; a proof row is rejected unless the prompt is verbatim for its tag. Archive of pre-rulebook frames with recovered prompts: rules.html#archive.

07Run it on your brand

Copy tokens.css and replace the values. Write your lexicon (the five to ten words your brand actually uses) and your palette bank (three to five named inks). Keep the recipes and the two guards. Roll a hundred prompts, keep the sentences that stay true, and number them. That is the system. The rest is taste.

Start: kit/README.md.