← All articles

Working with agents · · 4 min

How to teach a coding agent your design taste

Agents do not lack skill — they lack a source of truth about what you find beautiful. Here is how to write one down.


A coding agent starts every project with no taste at all. It has seen millions of interfaces and, absent any instruction, it will produce the statistical middle of all of them: a gradient hero, a violet accent, cards with 16px radius, copy addressed to nobody in particular.

This is not a skill problem. The same model that produces that page will, given four sentences of direction, produce something specific and defensible. The missing input is not capability. It is a source of truth about what you find beautiful.

Why describing it in the prompt stops working

The usual fix is to describe your taste in the prompt. That works exactly once.

The next session you word it differently. You remember three of the five things that mattered and forget the two that were load-bearing. A month later you start a second repo and the description drifts again — and now the two projects disagree in ways neither of you decided. Add a collaborator and the drift compounds: they describe the same product in their words, which are not your words. This is the mechanism behind why every vibe-coded app looks the same — not a model ceiling, but the absence of any stable input.

There is a deeper problem. A prompt is a message, not a record. You cannot diff it, review it, or ask why a decision was made six weeks ago. When the output looks wrong you have nothing to fix except the next prompt, so you fix the symptom and the cause survives.

Treat taste as an artefact, not an instruction

The durable fix is to write the decisions down once, in a place the agent reads before it works — the same way it reads the codebase rather than being told what the codebase says.

What belongs in that record:

That last category is the one people skip and the one that changes output most. "No gradient heroes, no violet, no emoji in UI copy" removes three of the model's highest-probability moves in a single line.

Two details that decide whether it works

Note the reason next to the choice. #E8511E is a hex code. "#E8511E — primary action, never text" is a rule, and a rule generalises to situations you did not anticipate. An agent asked to build a pricing table has never seen your pricing table; it can only reason from the principle. Recording intent rather than output is the same instinct behind a good commit message, and it pays off for the same reason.

Keep it small. Ten decisions an agent honours beat forty it averages out. A long document gets summarised, and summarisation is exactly the lossy step you were trying to eliminate. If the record does not fit in an agent's working context alongside the actual task, it will be compressed by something that does not know which parts you cared about.

Paul Graham's Taste for Makers is a useful companion here: good design is not a mood, it is a set of properties you can name. Anything you can name, you can write down. Anything you can write down, an agent can honour.

Making it readable by the agent

A document only helps if the agent reaches it without being asked. That is what the Model Context Protocol is for: a small standard that lets an agent call a named capability and get structured data back, the same way it calls a file-read tool. MCP for designers covers the mechanics.

In practice that means connecting once per repository rather than re-explaining per prompt. moodspec's setup guides cover Claude Code, Cursor, Codex, Lovable and Replit; the docs are a single block of config. After that the agent pulls the current canvas whenever a request touches type, colour, copy or brand — including the requests where you forgot it mattered.

The test

Ask your agent, in a fresh session with no preamble: what typefaces should this project use, and why?

If it answers with your faces and your reasons, the record is working. If it hedges, or offers a sensible general answer, then your taste is still living in your head and in the chat logs — and it will keep drifting until it lives somewhere both of you can read.

Further reading

Keep reading