Order confirmed
Arrives Thursday. We'll write to you when it ships.
2026 · Design with AI
How I take design decisions back from AI models: a contract, checks written as code, and a person who signs. Tested on a real deliverable, measured in a benchmark, and told in part on stage at WUDRome 2026.
01 · The diagnosis
This isn't a page about what AI can do. It's about the question I ask every time a model designs something for me: who decided this?
Models have abilities they use better than we do, like moving through huge amounts of data, and they have limits. Knowing what to delegate to a model and what to handle yourself is now one of the founding skills of anyone who designs. This project is how I take back the decisions I shouldn't delegate. Before you can ask whether a system is ethical, you have to ask whether there is a decision inside it to contest, and who signs it.
A part of it became a thirty-minute talk at WUDRome 2026, Rome's World Usability Day, whose theme that year was Ethical AI is a lie. This page follows the talk step by step, with everything I had to leave out for time. The slides are at the end.
A simple question, the same, to two models: how many people die in Manzoni's The Betrothed?
Se dobbiamo dare un numero preciso basato esclusivamente sui personaggi dotati di nome e cognome (o pseudonimo chiaro) che muoiono direttamente nel corso della narrazione o di cui viene esplicitamente annunciata la morte, il totale è 10 personaggi.
Direi circa 100.000 morti, considerando le vittime della peste a Milano nel 1630, come raccontato nei Promessi Sposi.
Neither threw at random. One counted the named characters, the other the victims of the plague: each decided on its own what counts as a death. It's a default, and nobody asked for it. Where a model doesn't know, it fills the gaps.
Both got the same two questions; the second was «sì, ma se dovessi darmi un numero?», yes, but if you had to give me a number? At first, ChatGPT said an official count doesn't exist. The experiment is Luciano Floridi's, with Shakespeare. I redid it with Manzoni.
The same happens in our trade. I asked three models, in chat, for the membership form of a neighbourhood sports club in Rome, made up for the test. The prompt doesn't say a word about style:
Progetta il modulo di iscrizione online per Palestra Popolare Ostiense, un'associazione sportiva
no-profit di quartiere a Roma. Il modulo serve a iscrivere un nuovo socio per la stagione 2026-27.
Mi aspetto una pagina html
Green and lime. Black and orange. Black, cream and red. Three tastes. As with Manzoni: where you don't say what you want, the model fills the gaps, and each one fills them its own way. One run per model: a clue, not a law. Try it at home.
The model fills the gaps. So let's fill them ourselves. Today it's called context engineering: not writing the perfect prompt, but designing everything the model has in front of it when it answers. The instructions, the examples, the documents, the rules, the conversation so far. For people in our trade, it means designing the context.
Better context, not more context. It isn't how much you give, it's which: context is designed, not piled up. And with good context you get far. How far?
With good context, the dice is very good. In a few minutes it gets to 70% of what I had in mind: the structure, the hierarchy, an identity that stands up. The three forms above are all fine for a first meeting with a client. You show them, and the meeting goes well.
Then the client says: the green a bit darker, sign-up in two steps, the real logo. That's where the trouble starts, when it's time to refine the last 30%.
Addy Osmani, an engineer at Google, calls it the 70% problem. He was talking about code; in design it's identical. The 30% that's left is where the time goes: the details, the edge cases, the decisions that make an interface yours and not just any. And there's no guarantee you get there. To see where it jams, you have to look at how context works, and where it breaks.
Remember the sports club? Same prompt, same three models. But this time inside Figma Make.
Paper background. Orange, terracotta, brick. Bold headings. One of them even drew the Gazometro, Ostiense's old gasholder; another put it in the form's address. Four words explain it.
Palette ispirata all'architettura industriale di Ostiense e alla stampa tipografica sociale romana: carta non sbiancata, intonaco caldo, inchiostro asfalto, terracotta romana e ocra mutualista.
A palette inspired by Ostiense's industrial architecture and Roman social letterpress: unbleached paper, warm plaster, asphalt ink, Roman terracotta, mutualist ochre.A caveat, because it's a reading and not a measurement. I can't see Figma's layer, I infer it: outside, the three diverge; inside, they converge. RLHF is there outside too, so it explains where they converge; the tool explains why.
Nobody asked for paper. When you don't decide, whoever built the tool does. That's who decided the default.
The last way context breaks is in how a model reads, and it explains why that 30% is so tiring. In 2023 a group of researchers hid the right answer at different points of a long text. At the start, the model finds it. At the end, fairly well. In the middle, it loses it: it does worse than with no document at all.
Context isn't memory: it's a text, and the middle of a text reads badly. Now think about how we work. I fix a button, then the grid, then a colour. Every fix makes the conversation longer, and the decisions from ten messages ago slide right there, into the middle. Fix it here, break it there.
So the temptation is to write rules. A list: use this colour, don't use that font, the button always on the right. But a rule in the context isn't a rule followed. It's a piece of text like the others: if it lands in the middle, the model may not read it, and if it reads it, it may not follow it. The more rules you add, the fewer it follows. A 2025 test, IFScale, gave models up to five hundred instructions at once: the best followed 68%. A longer list isn't a guarantee. It's more text in the middle.
The problem isn't fixing better. It's that nobody decided first, and the model fills the gaps.
If nobody decided, nobody answers for it.
02 · Delegation and description
So far, the problem. From here, how I took the decisions back. I realised afterwards that what I was doing already has a name: Rick Dakan and Joseph Feller call it AI Fluency, and split it into four Ds. Here they are in the order I did them.
I decide the default, before the model does.
I give it to the model in a form it can use.
Every mistake I spot becomes a check.
A person answers for the result.
I tested them on a real deliverable, with a deadline and an audience: the deck of the talk itself. A deck about taking decisions back from AI had to be built that way, or it would be a lie of its own. The first version had 18 slides and a technical promise; I rebuilt it around the four Ds in parallel, without touching the original, and reviewed every step by looking at it. The final talk has 16 slides and runs 28 minutes 30.
The first D is the one everybody skips: deciding before you open the chat. The advice I give everyone: as soon as a style is approved, consolidate the decisions in a design system.
A design system is, in the end, documentation, with two parts that matter. The tokens are the decisions that have a value: colours, sizes, durations. They pack into formats a model reads and respects without effort. The contract is the hard part. It's the rules: how a component is built, when to use it, when never to.
--obsidian-800, 1 px border, radius --r-lg
MotionEnters from below; with reduced motion it stays still
Anti-patternNever a gradient as background
Arrives Thursday. We'll write to you when it ships.
And so the question becomes: in what form do I give them to the model?
This one I measured, on my own design system, Amaca. One question: if I give a model the same system in different forms, which one makes it work best, and at what price? Seven tasks, from a button to a dashboard. Four models. Seven ways of handing over the system, from nothing at all to a server the model can query. 599 runs, each scored automatically out of 100 on how far the code respects the system.
Without a file, the model invents colours, sizes, durations. With the tokens the values are right, but the short files name the components and don't say how each one is made: the model invents the parts, and stops between 76 and 79. The full specification, DESIGN.md, gets almost to the top, 89 to 93, but it reads 85,000 tokens on every run. The MCP server gets higher, 94, with half the tokens. I don't give it a book to read: I give it the piece it needs, when it needs it.
But it doesn't win everywhere. Faced with a component the system doesn't have, agents with files stopped and asked; the agent with only the server built it from the pieces it had. So the form of the context matters as much as its content. And not even the best form decides for me what to do when the rule isn't there. One test, one design system, October 2026: a clue, not a law. «No file» doesn't mean a blank model either: it knew the system existed, it just had nothing to read.
Diamond and graphite are the same atom: carbon. One is the hardest material we know, the other crumbles on a sheet of paper. Only the way the atoms are bonded changes.
Design systems work the same way. The tokens are the atoms, the alphabet. The contract is the bonds, the grammar. And every design system is a language of its own. I looked at fourteen of the most mature public ones: the values are all there. The rules, when to use something and when never to, live in pages of prose. Look at one rule, a single primary button, in three of the most used.
button.primary.bg→ color.brand.500
A piece of data. The model uses it as it is.
Three sentences for the same rule. How often is «rarely»?
The value is data. The rule is advice. And how does a model execute «rarely»? It reads the values; the prose, as we've seen, gets lost in the middle.
Back to the sports club. Of the three proposals from the chat, the client chose one: the black one, with the red stripes. I did what I advise: I consolidated that choice in a design system. Tokens, components, rules. No text, no page described. Where it talks about headings, it states a rule:
Il titolo di pagina usa display-xl, su righe strette; la sua parte più importante
(un numero, una data, una parola chiave) può essere in primary.
First, the page the client had already seen: the membership form, the same prompt as at the start, plus one line: follow the attached DESIGN.md.
Then the real test: a page the file had never seen, the courses and the timetable. It's the hard case. The topic is almost the same, the same club, the same season, the same audience, and that's exactly where a model is tempted to redraw the page it already knows, or to drift away from it. Holding a system together across pages is where coherence usually breaks.
Different titles, different texts, different content. The same system. Not on somebody else's orange paper: on my client's decision. Where the contract is silent, they still interpret: the format of the year, a menu nobody asked for.
Here an awkward question came up, and I said it out loud while building the deck: we're doing all this to show the strength of harnesses and skills, and then we show that one markdown file gets the job done? Yes: to start, a file is enough. The 70%, done well, on the first try.
But look at what this contract is. Apart from the tokens, it's prose: sentences. No format makes rules deterministic. The model reads them, and it may not follow them. And a file remembers nothing. It doesn't know what went wrong yesterday, and it doesn't notice what goes wrong today.
A file is enough to start. It isn't enough to stay.
03 · Discernment
So how do you keep a decision over time? With a harness. In English it's also the straps that hold you in. I picture it as the giant robots of Japanese cartoons: a huge machine that multiplies what you can do, but that doesn't take a step on its own. There's always someone inside, piloting it. Mine has four pieces.
The decisions, written first: the contract we just saw.
The way of working, better at every round.
Code that checks, before anything is delivered.
A person who signs.
The machine amplifies. But someone pilots it.
The skill is the way of working, written down. The first time, I do a process myself, and take it apart as I go. The second time, the model does it and I hold its hand. The third time, it goes almost on its own. Every mistake I see becomes a line in the skill.
But rules are prose. Anthropic says so in its own documentation for Claude Code: instruction files over about 200 lines reduce adherence, because they are context, not configuration. And nothing makes them respected.
The smallest example is my favourite. I had Claude build me a board to sort some content: cards that open with a click. Simple. But an open card could end up underneath another one, and its text became unreadable.
To me it was embarrassingly obvious. To the model it wasn't. So I started a file of common sense rules: a short list every design must pass before it reaches me. Common sense, if you don't write it down, isn't there.
So I did what is done with code: the checking isn't left to the model that did the work. Before a design reaches me, it goes through two checks. Python scripts, deterministic, for everything that can be measured: colours, sizes, contrast, what happens on a phone. And a subagent that starts cold, another model that hasn't seen the work, for what has to be read. It's what continuous integration does for code, applied to design.
If it's red, I triage: what's certain gets fixed, what's doubtful is mine to decide. Either way the mistake becomes a new rule and a new check. Then it runs again. When it's green, it reaches me.
An example. In my first test with a contract, built on Gemini's proposal (dark, with an industrial orange), Gemini's form on a phone put the send button before the fields, and its summary bar covered the name. The contract was respected; the form was wrong.
I wrote a script that loads each page at phone size, scrolls it, and fails if any fixed or sticky element covers a form field.
At 390 × 844 the summary bar is sticky and takes a quarter of the screen: the name field slides under it as you scroll. The script found it on the first screen, and again on the tax code field further down.
verify_mobile_panels.py · FAIL · div.summary-bar over “nome”It fails on Gemini's first form. It passes on all six pages of the final contract, two pages times three models. A mistake I saw once became a rule, and the rule became a check.
The deck animates every slide following amaca.design's motion grammar: reading entrances, numbers that count up, bars that grow. Animation is the first thing to drift, so I checked it the same way. The end state of every animation must match, pixel for pixel, the same slide with reduced motion turned on. All sixteen slides.
The bugs were instructive. Two generic class names collided with existing ones: one collapsed the header, the other erased the token labels on slide 09. New rule: every motion class gets its own prefix. Counting numbers made the layout jitter as their width changed, so each number now gets a fixed box, measured when it starts.
04 · Diligence
One piece is missing. A check that only flags is a well-documented opinion. That's the state of every ethical principle written in a manifesto.
The gate is the point where the system has the power to stop. And the gate has a key: whoever opens it, signs. Even when everything is green. That's where «decided by whom?» stops being a rhetorical question. It has a name and a date.
I wanted the slide about it to show the idea, not explain it: a field of nodes, pulses travelling towards a gate, and a target deliverable that only exists once the gate opens. It took many rounds, all visual, steered by rules simpler than any spec. If the nodes are off, the lines between them are off. If the gate isn't passed, there is no target. Each rule exposed a bug: a straight line crossing the closed gate, wires reaching dead nodes, a target that stayed lit for pulses already in flight. I checked the fixes by sampling 64 frames, not by eye.
Floridi puts it this way: it doesn't matter who wrote it, it matters who answers for it. And he has an image I can't shake off: whoever made the climb with a backpack has a critical sense. AI is the descent.
Checks verify that a rule exists and is respected. Not that the result is good for a person. Checks remember the mistakes I've already seen. New ones, only a person sees.
More than once, the AI that helped me proved the method right. A case study about human sign-off that hid it would make the same mistake it warns against.
The moral is almost too neat. You need a human gate even when the AI is helping you write about the human gate.
The robot only moves if someone is inside. Southleft has a phrase that sums it all up: machine-readable, not machine-governed.
None of this makes a system ethical. It makes its decisions inspectable, and attributable to someone. It's the minimum needed for the question «at whose expense?» to have an answer you can check.
Next time a model hands you 70% in five minutes, before you fix it, ask: who decided the default? And if the answer is nobody, decide it yourself.
This piece opens a series: a closer look at the MCP server behind the benchmark, one on harnesses and verify loops, one on moving fast to experiment. The benchmark report is public. The deck of the talk is right below, with every source clickable and a PDF to download.
The excerpt I brought on stage at MAM, Rome, on 12 November 2026. The slides are online in Italian.
Everything cited here and in the deck, in the order it appears.
NoteAn excerpt of this work became the talk «Chi ha deciso il default?» (Who decided the default?), given at WUDRome 2026 on 12 November 2026, at MAM Media Art Museum in Rome. Quotes from design systems are paraphrased; the benchmark figures come from the public report.