What people are actually doing
The pattern showing up in agent-skill catalogues is to take Apple's Human Interface Guidelines — or Material, or a platform's accessibility guidance — and repackage it as something an agent loads before building UI. One published set breaks the HIG into fourteen skills covering platforms, foundations and components: layout, controls, dialogs, menus, search. Others ship it as a single design skill that promises native components, proper typography and semantic colours.
This is a good instinct. A coding agent asked for an iOS settings screen with no guidance will produce something that works and feels subtly wrong: a modal where a push was conventional, a control that exists on the web and not on the platform, touch targets sized for a mouse. Loading the platform's rules fixes a real class of error, and it fixes it cheaply.
It also does something people do not expect, which is worth being precise about.
What survives translation, and what doesn't
| Example | What the agent does with it | |
|---|---|---|
| Prescriptive rules | Minimum touch target, which control for which job, when a sheet beats a push, contrast minimums | Applies them reliably. These are checkable, so a wrong answer is visibly wrong |
| Principles | "Clarity", "deference", "depth" | Agrees with them, then does what it was already going to do |
That second row is the whole problem, and it is not specific to Apple. An unfalsifiable instruction cannot change behaviour, because the model can satisfy it with whatever it already believes the word means. Ask for clarity and you get the model's median idea of clarity, which is also every other model's, which is why so much agent-built UI converges on the same near-black surfaces, the same one-accent-and-grey palette, the same evenly rounded cards.
An agent can follow a rule. It can only agree with a principle.
We measured the same failure in the wild. Across 299 public DESIGN.md files — the documents developers write specifically so an agent will follow them — 54% contain at least one unmeasurable adjective, most often "clean" (39%) or "modern" (36%), and 44% never state a single concrete size value. Those files read like design direction and function as agreement.
The thing a platform guideline is not trying to give you
Here is the part that surprises people who install a HIG skill expecting their app to start looking good: platform guidelines are deliberately shared. Every app on the platform follows them. That is the entire point — a user should be able to open an app they have never seen and know how it works. Conformance is the goal, and identity is explicitly not.
So a HIG skill can make your interface *correct* — right components, right navigation, right target sizes, right contrast — and correct is not the same as distinctive. If two teams load the same guideline and no other design context, they should produce interchangeable interfaces. They usually do.
This is a feature until it isn't
For a utility, a plugin, or anything embedded in someone else's environment, blending in is the right answer and the guideline is the whole brief. The mismatch only appears when the thing being built is a product that has to be recognisable — and that is usually discovered somewhere around the fifth screen.
The two-layer setup
Once you see it as two separate jobs, the fix is obvious and the layers stop fighting each other.
| Platform layer | Identity layer | |
|---|---|---|
| Answers | How should this behave here? | What should this look like, everywhere? |
| Source | The platform's guidelines, as a skill or rules file | Your token set and written rules, in the repo |
| Changes when | The platform changes | Your brand changes |
| Failure if missing | Correct-looking UI that feels foreign on the platform | Platform-perfect UI indistinguishable from every other app |
Keep them in separate files. It is tempting to fold your brand into the HIG skill so there is one thing to load, and it goes wrong on the first platform update or the first rebrand, because you now have to unpick which sentences belonged to whom.
Token specimen · real values
Ambient Sage
Live renderAmbient Sage's actual tokens — the same values its exports use.
Color tokens
Ambient Sage
Core
background
H 72 · C0, 0, 2, 4
foreground
H 84 · C7, 0, 18, 89
card
H 70 · C0, 0, 3, 10
muted
H 80 · C1, 0, 3, 7
border
H 69 · C0, 0, 3, 15
Brand
primary
H 53 · C0, 8, 68, 0
primary-fg
H 84 · C7, 0, 18, 89
secondary
H 70 · C0, 0, 3, 10
accent
H 52 · C0, 8, 60, 3
ring
H 53 · C0, 8, 68, 0
Semantic
destructive
H 6 · C0, 70, 78, 25
destructive-fg
H 0 · C0, 0, 0, 0
success
H 130 · C61, 0, 51, 55
warning
H 35 · C0, 38, 91, 21
muted-fg
H 84 · C2, 0, 6, 66
Charts
chart-1
H 53 · C0, 8, 68, 0
chart-2
H 210 · C65, 33, 0, 17
chart-3
H 142 · C44, 0, 28, 25
chart-4
H 340 · C0, 48, 32, 12
chart-5
H 33 · C0, 30, 68, 9
Typography
Ambient Sage
Scale: compact-product
Density: balanced
Heading · Plus Jakarta Sans · 1.875rem
Sample headline
Subheading · Plus Jakarta Sans · 1.375rem
A warm-sage neutral-surface mobile kit with a single vivid yellow accent, flat tonal cards, and oversized display numerals.
Body · Plus Jakarta Sans · 1rem
Ambient Sage uses a near-white warm-sage canvas (#f3f4ef) with card panels distinguished only by a tonal shift to #e5e6e0, never by shadows or borders. A single vivid yellow (#fee951) is the only saturated color and appears sparingly at component scale as orbs, button fills, and focus rings. Primary data values render as oversized bold hero numerals with a small superscript unit. Typography is a friendly rounded geometric (Plus Jakarta Sans) with no uppercase and no tight tracking, while JetBrains Mono is reserved for hex codes and technical strings. Generous rounding and luminance-only contrast give the whole system a calm, minimal feel.
Mono · JetBrains Mono · 0.8125rem
npx shadcn add ambientsage.json
Aa
Plus Jakarta Sans · Heading
Aa
Plus Jakarta Sans · Body
ABCDEFGHIJKLM NOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 & @ # % →
Tokens
Ambient Sage primitives
Radius scale
Component radius
Elevation
Spacing · base 4px
Writing a rule an agent can check
The test is simple: could someone look at the output and say, without argument, whether the rule was followed? If two reasonable people could disagree, the agent will too, and it will resolve the disagreement in favour of its defaults.
| Agreed with | Followed | |
|---|---|---|
| Colour | Use a clean, modern palette | Use only the semantic tokens. Never a raw hex in a component. One accent per screen |
| Type | Typography should feel refined | Two families: display and body. Scale steps at 1.25×. Never a third weight in body copy |
| Surfaces | Keep surfaces light and airy | Cards are flat. No shadow on a flat surface. Border 1px, border token |
| Dark mode | Support dark mode | Every colour role defined in both modes. Never ship a light change without its dark counterpart |
Note how many of the right-hand entries are prohibitions. That is not a stylistic choice: a preference adds one option, while a prohibition removes all the others. "Use our green" leaves every generic default still legal; "never introduce a colour that is not a token" does not. In our corpus 76% of files listed only preferences, which is a precise description of why they stop working.
When the guideline and your brand disagree
This happens less often than people fear, because the two layers mostly address different questions. When it does happen, it is usually one of three cases, and only one of them is a real conflict.
- Accessibility minimums versus a brand colour. Not a conflict. The minimum wins, and your accent needs adjusting for that surface. An agent told this explicitly will do it; an agent left to choose will usually keep the brand colour, because that is the instruction that sounded more specific.
- Platform convention versus a house pattern. A real trade-off. Decide once, write down which wins and why, and put it in the identity layer so it is not re-litigated per screen.
- Platform default styling versus your tokens. Not a conflict, though it looks like one. Guidelines specify which control to use; they rarely specify its exact colour. Use the platform's component, painted with your tokens.
Say which layer wins, in the file
An agent holding two documents with no stated precedence will pick per turn, and it will not tell you which it picked. One line — "where these conflict, accessibility minimums win, then platform conventions, then house style" — removes a whole category of inconsistency that is otherwise almost impossible to diagnose from the output.
Practical setup
- 1
Load the platform layer as a skill or rules file
Whatever your agent supports — a skill,
.cursor/rules,.devin/rules, a section in CLAUDE.md. Keep it as close to the source guideline as you can, so it can be replaced wholesale when the platform updates. - 2
Put the identity layer in the repo
A token file plus a DESIGN.md with your rules and prohibitions. It has to be in the repository rather than a prompt, because the agent needs to re-read it on every task and so does the next person.
- 3
State the precedence once
One sentence at the top of the identity file naming what wins in a conflict.
- 4
Test on the screen nobody designed
Ask for something plausible that neither layer anticipated — an empty state, a permissions error, a pagination control. Whatever the agent invents is what every uncovered case will look like, and that is your real coverage measurement.
The last step is the one worth repeating. Both layers cover the cases someone thought about. In an agent-built product most screens are cases nobody thought about, which is why the identity layer has to state general rules and refusals rather than enumerate components. More on what belongs in that file: what a DESIGN.md is.
The identity layer, as one installable file
Every Identity Forge kit serialises to a full DESIGN.md — semantic tokens in light and dark, a real font pairing, motifs and explicit prohibitions — alongside the token file. It sits next to whatever platform guidance you load, and never argues with it.
FAQ
Can an AI agent follow Apple's Human Interface Guidelines?
The prescriptive parts, yes — control choice, navigation patterns, minimum touch targets, contrast minimums. These are checkable, so the agent applies them reliably. The principled parts — clarity, deference, depth — cannot change behaviour, because an agent satisfies an unfalsifiable instruction with whatever it already believes the word means.
Will a HIG skill make my app look good?
It will make it correct, which is different. Platform guidelines are deliberately shared by every app on the platform so users can transfer knowledge between them. Two teams loading the same guideline and nothing else should produce interchangeable interfaces. Distinctiveness comes from a second layer: your own tokens and rules.
Should platform guidelines and my design system live in one file?
No. They change on different schedules — one when the platform updates, one when your brand does — and merging them means unpicking which sentences belong to whom later. Keep two files and state which wins in a conflict.
What do I do when a brand colour fails an accessibility minimum?
The minimum wins and the accent needs adjusting for that surface. State this explicitly in your rules: an agent left to choose usually keeps the brand colour, because that instruction sounded more specific than a general accessibility note.
How do I know if a rule is written well enough for an agent?
Ask whether a reviewer could look at the output and say, without argument, that the rule was followed. "Use a clean palette" fails that test. "Use only the semantic tokens, never a raw hex, one accent per screen" passes it.