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.
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 pagestyle.css, the constructed palette and pairing as inline:roottokens, 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
- 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. - The draw is external.
scripts/seed.mjshashes 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. - Every existing rule applies. The OKLCH bands in
color.md, the pairing catalogue intypography.md, the ban list inanti-patterns.md, all 58 slop-test gates. A derived run has no waiver a catalog run lacks. - 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.
- 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.