tailthemes
all-access
notes
7 minupdated 2026-08-21

Five things make agent-built UI look generic. Each takes 30 seconds to check.

6.5atrium6.0foundry6.5grove6.5kiln6.5meridian6.5relay6.5signalseven themesseven critiquesone page
Seven themes, drawn from the same seven critiques. Every interior is identical because that is what the pass found. Only the score changes.

Your agent builds a page and it is fine. Correct spacing, plausible hierarchy, nothing broken, and nothing you would recognise tomorrow. That gap between correct and designed has a fingerprint, and five parts of it are things you can check on your own repo in under a minute.

We know the five because we measured them on ourselves. This catalog is generated by AI and gated by a human-written quality bar, and on 2026-08-13 we put seven shipped themes past a design critic with one instruction: find everything, fix nothing. Six came back at 6.5 out of 10 and one at 6. Independent passes, different categories, effectively one score. The same failures kept coming back, in the same order.

Ranked below by how many of the seven critiques raised them. Every figure is computed in the corpus, not eyeballed.

1. The typeface is not in the build

Six of the seven shipped without a single font file. Five declared the operating system stack outright, first family ui-sans-serif. The sixth declared "InterVariable", "Inter" in its tokens and had no src/fonts/ directory to serve it, so it fell back to the same stack while claiming otherwise. One of them credited a typeface in its own footer that the download did not contain.

This is the loudest tell and it is a supply-chain problem, not a taste problem. Every screenshot promises a face the build cannot keep, so the thing you approved is not the thing that renders.

check your own project

Open your stylesheet and read the first family in --font-sans. If it is ui-sans-serif, system-ui or -apple-system, you are shipping the OS font. Then check that a fonts/ directory actually exists for whatever you declared. Declaring is not shipping.

2. The design idea never made it into a token

One theme's stylesheet says the ground sits one step off white so white cards read as raised records. The measured distance between canvas and card was 0.027 L, roughly an order of magnitude short of the idea, and 68% of the hero was those two surfaces. Another documented ruled ledger paper and a warm paper ground. Both were invisible at ship.

Agents write the rationale and the value separately, and nothing checks that the second funds the first. The comment survives review because it sounds right. The design it describes was never built.

check your own project

Read the comments in your own theme file, out loud. Every one that claims an effect ("subtly raised", "warm ground", "quiet rule") is a testable claim. Take a screenshot, pick the two colours, and see whether the difference is visible at arm's length. If you cannot see it, it is not there.

3. One hue pretending to be two

One theme's --accent was a 5.4 degree rotation of its own --primary. Worse, two different themes that are supposed to be different products landed within 4.1 degrees of hue, 0.001 chroma and 0.004 lightness of each other. The palette file claimed variety the page never had.

A palette needs a second job, not a second swatch. Nudging the primary a few degrees produces a page that reads as one colour and a token file that reads as two.

check your own project

Convert your primary and your accent to OKLCH or HSL and subtract the hues. Under about 20 degrees apart, you have one colour. Then ask what the accent is for: if you cannot name a job it does that the primary does not, delete it.

4. No state ramp, and banned states in its place

Hover, press, disabled and pending get invented per component instead of derived from a ramp. One theme shipped four alpha-based colour states, and its agent contract file endorsed them, so the next agent to touch it would have produced more of the same. A wrong rule in the contract is more expensive than a wrong pixel, because it propagates.

check your own project

Search your components for hover: and count the distinct colour values. More than a handful means there is no ramp, just decisions. Then read your AGENTS.md or CLAUDE.md and check it is not blessing the thing you are about to fix.

5. Everything is one density

One theme's density register measured 1.33 to 1 against a floor of 1.75, with zero oversized moments across four pages. Uniform density is why generated pages scroll like a list of cards regardless of what the cards contain. Nothing is loud, so nothing is quiet, so nothing is composed.

check your own project

Squint at your page, or shrink it to 25%. If every band has the same weight, the layout is a stack, not a composition. Pick one element per page to be genuinely oversized and let the rest go quiet around it.

What the scorecard actually looked like

These are our own products, named, because publishing anonymous scores would be worth nothing. Each row is one read-only pass under the same rubric, with no fixes applied during the pass.

ThemeScoreWhat the critic led with
Atrium6.5Highest craft floor in the catalog, lowest identity ceiling. The money spine reconciles by construction. The time spine contradicts itself in five places, two in the same viewport.
Foundry6.0The best-argued theme we ship, and its central claim is unfunded. Set in the operating system's UI font, and its own footer says so.
Grove6.5Best-written, best-reasoned. Both signature material ideas are documented and both are measurably invisible.
Kiln6.5Reasons rather than asserts, computed contrast table, owned imagery. Fails the contract in nine places.
Meridian6.5A genuinely well-made document and a weak design object. Wears the same blue as Atrium to within a rounding error.
Relay6.5Declares Inter and JetBrains Mono in its tokens. Ships no font files at all.
Signal6.5Best content and best honesty discipline in the catalog, carrying an open audit item that the display face is visibly not the OS UI font.
ops/design/critique-*-2026-08-13.md. A spread of 0.5 across seven independent reviews is not modesty. It is the shape of the problem.

Why it converges on competent

Models sample the high-probability region of what they were trained on, and safe patterns are the ones that appear most. That produces the familiar fingerprint: the indigo gradient, the three-card row, the hero that could belong to ten thousand products. The useful reframe is that this is not a failure of taste. It is a failure of constraint. An agent with no design language invents a new one, badly, on every run.

Which makes the fix boring and mechanical:

  • Tokens, not markup. One @theme file owns the whole design surface. If a colour or a size appears inside a component, the system does not exist yet.
  • A banned list beats a style guide. Naming the bad patterns kills them faster than describing the good ones.
  • Every claim in a comment must be funded by a number. Rationale nothing implements is how a theme scores 6.5.
  • The contract file is code. If it endorses a banned pattern, every future edit inherits it.
  • Check at the artifact, not the prompt. Render it, measure the contrast, open the zip, look for the font.

What we ship instead

Every theme in the catalog now carries its own agent kit: an AGENTS.md stating the invariants, four executable skills (rebrand, add-section, add-page, check-quality), and a token file that owns the entire design surface. An agent installing one of our themes does not reverse-engineer it. It runs the theme's own workflows and verifies with the theme's own checks.

You can read all of it before paying for anything: how agents use the catalog, or take Foundry for free and open its kit.

A note on what this is. These are our own themes and our own scorecard, published with the numbers that make us look worst. The 2026-08-13 pass is what forced the revisions that followed it, and the corpus stays in the repo. We would rather be the marketplace that shows its rejects than the one that claims it has none.

evidence: ops/design/critique-*-2026-08-13.md — seven read-only critic passes