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

61 lines
2.5 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Coelho Studio — product design for early-stage Lisbon companies</title>
<meta name="description" content="A small product-design studio in Lisbon. Three people, six current projects, mostly working with early-stage companies." />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;1,9..144,400;1,9..144,500&family=Geist:wght@400;500&display=swap" />
<link rel="stylesheet" href="output.css" />
</head>
<body>
<main class="page">
<header class="masthead">
<h1 class="masthead__brand">Coelho<span class="masthead__brand-em">,</span></h1>
<p class="masthead__sub">Product design · Lisbon · est. 2024 · three of us · six projects this year</p>
</header>
<ol class="works">
<li class="work">
<h2 class="work__name">Tide</h2>
<p class="work__desc">Indie-podcast hosting platform · brand &amp; product design · 2024 — present</p>
</li>
<li class="work work--active">
<h2 class="work__name">Maple Street Bread</h2>
<p class="work__desc">A small artisan bakery's identity, signage, and packaging · 2025 · active</p>
</li>
<li class="work">
<h2 class="work__name">Foundry</h2>
<p class="work__desc">SOC 2 / ISO 27001 compliance SaaS · brand, marketing site, in-app patterns · 2025</p>
</li>
<li class="work">
<h2 class="work__name">Meridian</h2>
<p class="work__desc">Environmental-products studio · manifesto site · 2025</p>
</li>
<li class="work">
<h2 class="work__name">Cohort</h2>
<p class="work__desc">Cohort-based courses platform · brand &amp; product · 20242025</p>
</li>
<li class="work">
<h2 class="work__name">Tracejam</h2>
<p class="work__desc">Distributed-tracing SaaS · brand, landing page, in-app dashboard · 2024</p>
</li>
</ol>
<footer class="colophon">
<span class="colophon__brand">Coelho</span>
<span>Lisbon · 2026</span>
<span><a href="mailto:hello@coelho.studio">hello@coelho.studio</a></span>
<span><a href="#">cv</a> · <a href="#">notes</a> · <a href="#">case studies</a></span>
</footer>
</main>
</body>
</html>