Files
Youssef ea271b7db5 Derivation becomes the default, and nine themes get faces the model would not have reached for
Every build now derives its own visual world. Silence used to route to the
catalog; it routes to the ritual instead, and the 24 themes become a fast path
you ask for by name, by --fast, by an existing design.md, or by component scope.
custom-theme.md is promoted and renamed to direction.md, trimmed from 336 lines
to 258, and the draw runs on every build rather than on a branch that almost
never fired.

Nine themes prescribed a display face that is a training-data default, one of
them (Source Serif, on Field) already on our own ban list. All nine are re-faced:
Specimen to Bodoni Moda, Studio to Erode, Atelier to Sentient, Newsprint to Zilla
Slab over Spectral, Sport to Saira Condensed, Editorial to Bricolage Grotesque
over EB Garamond, Cobalt to Familjen Grotesk, Hum to Chillax, Field to Literata.
Atelier moving off a Didone also settles the Specimen collision the rejection
table had been arbitrating by hand. The catalog keeps the saturated faces but
now says plainly that they are the first answer, and treats them the way R.2
treats any spent default.

Repairs the flip exposed. Gate 57 tested for the presence of a catalog name, so
a derived build stamped theme: custom and sailed past the exact failure the gate
exists to catch; it now tests the absence of studied-DNA. macrostructures.md
still ordered you to pick a shape before writing code. Colour posture was scoped
to custom builds only. Two gate exceptions in the playful genre were scoped to a
theme name that a derived build cannot claim, and are now scoped to the declared
property.

The tier map had a worse bug than any of those. Thirteen gates carry a Floor
clause and a Reflex clause under one number, and the linter held one tier per
number, so six Floor clauses were quietly waivable and seven Reflex clauses were
quietly unwaivable. tierOf() now resolves the exact clause first, and gates 7,
24, 38a, 47 and 55 emit the clause they actually found. Gate 47 was also
reporting WARN for a Floor violation that reads "fail, always".

That surfaced real defects in the corpus: seven italic emphasis words inside
roman headlines, the top AI tell, sitting in our own showcase pages. They are
now roman accent spans. Two improvised absolutes in the contact sheet use the
token that was already declared beside them. The study verb's output page had
six hand-written numerals above headings, missed by the eyebrow sweep; the list
is a real ol with a counter now.

Corpus: 56 findings down to 41, zero gate 54, Floor enforced honestly.
Read-set cost of the flip: +303 lines a run (+19.3%), down from +400 (+25.4%).
That is short of the +200 target and I am not closing the gap by gutting the
palette construction or the font guidance, which is where the remaining weight
sits and what makes a derived run worth taking.
2026-08-06 11:12:28 +01:00
..

Derived worked examples

Three landing pages produced by the derivation route: the path every build takes by default. Derivation constructs a palette, a font pairing and a direction contract from the brief's own culture, instead of picking a destination from the 24-theme catalog. The catalog is the fast path, reached four ways only (the user names a theme, --fast, an existing design.md or brand, or component scope).

These three were the worked examples that used to live in the ritual file's § G. They were cut from the reference (three fake brands are copy-paste bait inside a file the model reads at build time) and kept here, rendered as actual HTML, so a constructed palette and pairing can still be inspected visually.

# Brand Vibe Anchor Macrostructure Axes
01 Coffeebox, small-batch coffee subscription "archival warmth, hand-set, no varnish" terracotta Long Document light / italic-serif / chromatic-terracotta
02 Loop, payment-rail observability for fintechs "industrial precision, cool, technical" sea-blue Workbench dark / mono / cool
03 Mossroot, herbal apothecary in Porto "moss, lichen, soft pink, herbal" (skipped, derived) Catalogue light / roman-serif / chromatic-other (dusty-pink)

Each folder holds:

  • index.html, the rendered page
  • style.css, the constructed palette and pairing as inline :root tokens, with the stamp at the top

What derivation unlocks

Twenty-four fixed destinations cannot carry every brand, and reaching for the nearest one is how three different briefs converge on one look. Coffeebox is closest to Atelier but warmer and more terracotta-led; Loop is closest to Midnight but mono-everywhere and sea-blue rather than phosphor-cyan; Mossroot has no catalog match at all (moss-tinted paper with a dusty-pink accent is not in the catalogue). On the catalog path all three would have compromised on the brand voice. Derived, each gets a system tuned to its own scene, and every rule carries forward unchanged: OKLCH bands, accent footprint, the font ban list, all 58 slop-test gates at their usual tiers. The freedom is the combination, not the rules.

What keeps a derived run from inventing freely

  1. The catalog is a rejection table, not a menu. A derived triple that lands within tolerance of any of the 24 coordinates is a failed reflex check, not a coincidence. See references/theme-axes.md § The rejection reading.
  2. The draw is external. scripts/seed.mjs hashes slug, date and run index to pick which of the seven slate entries gets built, because a model's own ranking is deterministic and returns the same favourite every time.
  3. Every existing rule applies. The OKLCH bands in color.md, the pairing catalogue in typography.md, the ban list in anti-patterns.md, all 58 slop-test gates. A derived run has no waiver a catalog run lacks.
  4. The Step 5 Picks block surfaces everything before code. The user sees the slate, the draw, the OKLCH values, the pairing and the direction contract in plain text, and can redirect early.
  5. Rotation is route-blind. Each run records its axes triple in .hallmark/log.json, and the next run rotates against it whether it was derived or picked.

See references/direction.md for the full ritual.