← Aman Khatri · Case study
Case study · Design systems × AI

Our product UI was made with AI. To keep prototyping with AI, it needed a system.

Every screen of AI Next Studio had been prototyped with AI. The UI elements were all there, and they looked right, but nothing was named, nothing was shared and every screen had invented its own values. So every new AI prototype drifted a little further. In eight hours of focused execution, built on prior familiarity with the product, I directed an AI agent inside Figma and gave the product its own design system: every element named, every value a role, every component documented, and a React library mapped back to it. The goal was simple: the same prompt should give the same, on-brand outcome every time.

Role
Product Designer: system architect and art director
Product
AI Next Studio, an enterprise workspace for AI-led process transformation
Time
8 hours of focused execution, built on prior product familiarity. Solo, no engineering support
Tools
Figma, Claude in Cowork with the Figma MCP server, React + TypeScript, Figma Code Connect
The Cover page, with live counts of what the system contains
The Cover page, with live counts of what the system containsDesign system · Cover
21.3% generic names
0.17%
of layers called "Frame", "Vector" or "Group", out of 7,663 before and 9,806 after
6 names for 1 purple
1 role
165 screen-named colour variables became 167 role-named ones
0.2% styled text
85%
of text layers use a named text style (5 of 2,775 before)
2 of 136 documented
210 / 210
components carry a usage description an AI agent can read
38% tokens
100%
of design values an agent receives for the same component are tokens

AI had made the screens. Nobody had made the system.

Before: the whole product library in one 20,916 px frame
Before: the whole product library in one 20,916 px frameSource file · Library

AI Next Studio helps enterprise teams map an As-Is process, reimagine it with AI, then design, specify and build the result. Its UI had been prototyped quickly with AI tools, and the result was a complete library of 136 components in ten sections: tags and pills, messages and composers, panel chrome, tables, flows, workspaces and modals.

The elements were never the problem. The problem was that each screen had been generated on its own, so the library had no shared language. I audited every layer of the file:

  • Colours were named after the screen that created them. Of 165 colour variables in use, 111 were named reimagine/…, feedback/…, discovery/…, catalog/… or flow/…. The brand purple alone had 6 different names, and 26 colours were defined more than once.
  • One in five layers had no real name. 1,629 of 7,663 layers were still "Frame", "Vector", "Ellipse" or "Group".
  • Type and shape were improvised. Only 5 of 2,775 text layers used a text style. There were 17 font sizes, including 10.5, and 19 corner radii, with five different values all meaning "pill" (99, 100, 999, 9999 and 16,777,200). No spacing or radius value was a token.
  • Components were copies, not systems. Only 2 of 136 had a description. The composer existed as three separate components, and 95 icons were typed characters from an icon font.

Why it mattered: an AI agent prototyping the next screen can only reuse what it can read. Here it read status/neutral/surface on a chat bubble and a text-link colour on an avatar, so it guessed, and each guess drifted further from the product. We didn't need more screens. We needed a design system made for this product, so AI prototyping would produce the same outcome every time.

Before: tags, pills and status, drawn one by one with no variants
Before: tags, pills and status, drawn one by one with no variantsSource · 01 Primitives
Before: messages and composers as standalone drawings
Before: messages and composers as standalone drawingsSource · 02 Conversation

Keep our visual language. Borrow Material's rigour. Let AI build, and make me the critic.

The brief had two audiences. People: designers and engineers who need one trustworthy source. Machines: the AI agents that already generate our prototypes, and will only stay on-brand if every element has a name, a role and a rule.

I used Google's Material Design 3 as a benchmark for depth: every component on its own page, full variant matrices, real states, documentation. I was explicit that it was not a style to copy. The product's purple, its type and its density had to survive intact.

P1
Our language, Material's rigour

Every colour, radius and type size comes from the existing UI, deduplicated. Only the completeness bar is borrowed.

P2
Tokens before pixels

Nothing gets a raw hex value. Primitives feed semantic roles, and components only ever see roles.

P3
Names are an API

Size = Extra small, never XS. If a property reads clearly to a person, it maps cleanly to code and to a model.

P4
Compose, never redraw

Patterns are built from components, and templates from patterns. Change a button once and every modal updates.

P5
Machine-readable by default

Every component carries a usage description, and every value is bound to a variable an agent can resolve.

P6
Trust, then stress-test

AI output looks finished before it is. Automated tests check every variant; my eyes check intent.

A file you can navigate like a product.

I organised the file the way people look for things: start here, learn the rules, find the part, see it in context. Each layer only uses the layers above it, so the structure itself teaches how the system works.

Start
Orientation and live system stats
  • Cover
  • Getting started
Foundations
The rules everything else obeys
  • Color
  • Typography
  • Spacing
  • Radius
  • Elevation
  • Iconography
Components · 17 pages
Atomic parts with full variant matrices
  • Avatar
  • Badge
  • Button
  • Checkbox
  • Chip
  • Composer
  • Divider
  • Hint
  • Icon button
  • Input field
  • Link
  • Menu item
  • Section header
  • Segmented control
  • Status pill
  • Tabs
  • Tag
Patterns · 7 pages
Product-specific building blocks made of components
  • Cards
  • Messages
  • Panel chrome
  • Tables
  • Navigation & toolbars
  • Flow & process
  • Discovery
Templates · 3 pages
Real screens, fully assembled from instances
  • Conversation
  • Modals
  • Workspaces

Token architecture

Three layers keep decisions where they belong. Primitives are hidden from designers so nobody picks "purple 600" by accident; they only pick a role such as action/primary/bg, which can change underneath without touching a single component.

Primitives · hidden
103

The raw palette extracted from the product: 128 unique values from 165 variables, near-duplicates merged.

→
Semantic roles
226

167 colour roles (text/, surface/, border/, icon/, action/<style>/<state>, status/<tone>/<role>, interaction/) plus 21 spacing, 13 radius, 3 border-width and 22 typography variables.

→
Components
158

Fills, strokes, spacing and type bound to roles. 532 variants; 99% of colours, 92% of radii and 86% of gaps are tokens.

Naming that reads the same to people, code and models

LayerConventionExample
VariablesGroup / role / stateaction/secondary/bg-hover · status/warning/text
Text stylesRole / Size WeightBody/12 Semibold · Paragraph/12 Regular · Overline/12 Bold
VariantsFull words, Title caseStyle = Secondary · Size = Extra small · State = Focused
Booleans + slots"Show X" + "X icon"Show leading icon + Leading icon (instance swap)
LayersWhat it is, not what it wasTitle row, Status pill slot, never Frame 123
Getting started: how the file is organised and how to use it
Getting started: how the file is organised and how to use itDesign system · Getting started
Color foundations: primitives feed semantic roles
Color foundations: primitives feed semantic rolesFoundations · Color
Typography: a Role / Size Weight scale bound to type variables
Typography: a Role / Size Weight scale bound to type variablesFoundations · Typography

I stopped pushing pixels and started directing.

I worked with Claude in Cowork, connected to Figma through the Figma MCP server. It could read the source file, write Plugin API scripts and build directly in our design-system file. My job was the brief, the structure, the taste and the review.

Why eight hours was enough. The hours were execution, not discovery. I already knew the product, its users and its screens from working on it; the UI elements already existed; and the agent did the repetitive building while I made the decisions. The thinking behind the system took far longer than the eight hours it took to build.

MeBriefGoal, principles, what "done" means, what not to copy.
AIExtractSerialise the source, pull every colour, size and font into tokens.
AIBuildVariables, styles, components, patterns, templates, docs.
MeCritiqueReview in Figma, write feedback in plain language.
AI + meCodifyTurn each fix into a rule or test so it never regresses.
Audit and extraction

Read the whole source frame, catalogued 147 components, and pulled every hex value, font size, radius and spacing value into a deduplicated palette.

A wrong turn: it built Material Design Course-corrected

My brief said "M3-level". The agent read that as "make it look like M3" and produced a polished Material clone with Material colours. I caught it on review, clarified that M3 was a benchmark for depth only, and we deleted every M3 page, collection and style. The lesson about precise briefs shaped everything after.

Foundations

Built our own tokens: 103 primitives, 167 semantic colour roles including interaction states the product never defined (hover, pressed, focus), plus spacing, radius, border and typography variables and 57 text styles.

Components

Every primitive in the product became a component with real variant matrices. Button alone is 10 styles × 4 sizes × 5 states = 200 variants, each documented.

Patterns and templates

Cards, tables, panel chrome, flow diagrams, discovery panels, conversations, modals and workspaces, rebuilt from component instances instead of drawn shapes.

My review round Biggest quality jump

Six pieces of critique, each traced to a root cause and fixed system-wide. Details below.

AI-readiness, code and Code Connect

Tested design-to-code on real components, generated a dashboard from a one-line prompt, then built a 26-component React library and wrote Code Connect mappings back to Figma.

The components

Each component page follows the same template: what it is, when to use it, anatomy, the full variant specimen and usage examples. Consistency is what lets a new designer, or an agent, learn one page and understand all of them.

Button: 10 styles × 4 sizes × 5 states, with usage guidance
Button: 10 styles × 4 sizes × 5 states, with usage guidanceComponents · Button
Status pill: six tones and three sizes for tables, products and counts
Status pill: six tones and three sizes for tables, products and countsComponents · Status pill
Composer: chat, context and compact styles in four states
Composer: chat, context and compact styles in four statesComponents · Composer
Iconography: 52 icon components, colour bound to icon tokens
Iconography: 52 icon components, colour bound to icon tokensFoundations · Iconography

Every screen is now an arrangement of the system, not a drawing of it.

This was the real test of the architecture. The workspace, the conversation panel and the modals below contain no hand-drawn buttons, tags or icons; every one is a live instance. Change the Button component, and every screen in the product follows.

Reimagine workspace, assembled entirely from component instances
Reimagine workspace, assembled entirely from component instancesTemplates · Workspace / Reimagine
Agent detail modal: capability chips, meta tags and a three-button footer
Agent detail modal: capability chips, meta tags and a three-button footerTemplates · Modal / Agent Detail Expanded
Conversation panel for the Reimagine phase
Conversation panel for the Reimagine phaseTemplates · Conversation Panel
Agent catalog search with filters and agent cards
Agent catalog search with filters and agent cardsTemplates · Modal / Search Catalog
Cards: recommendation, metric, system and agent cards
Cards: recommendation, metric, system and agent cardsPatterns · Cards
Flow and process: step nodes that show what is manual, AI-enhanced or automated
Flow and process: step nodes that show what is manual, AI-enhanced or automatedPatterns · Flow & process
Design workspace: flow canvas, tabs, legend and hint, all live components
Design workspace: flow canvas, tabs, legend and hint, all live componentsTemplates · Workspace / Design Flow

The review that mattered: six notes, six root causes.

The first pass looked finished. Then I started using it the way a designer would: clicking into variants, typing long labels, swapping icons. That is where the real work was.

"A few components break when you touch them."
Cause
Variants had been generated by copying each other, so their property wiring drifted. A label worked in Primary, then vanished when you switched to Tonal.
Fix
Re-synced property bindings across every variant (120 fixes in Button alone), rebuilt fragile layouts with auto layout, and made text wrap instead of overflow.
"Property names use MD, LG… they should be full names."
Cause
Generated shorthand. Fine for an engineer, unclear for a designer, ambiguous for a model.
Fix
Renamed 337 variant values to full words, then later cleaned 252 descriptions so docs and properties say the same thing.
"Collapse buttons have a grey outline; the product has purple."
Cause
The neutral Outline style was reused for a brand control.
Fix
Added a Secondary icon-button style with a brand outline and, after checking the source, a brand icon too.
"Some icon tiles show an icon where the source is blank."
Cause
An over-eager default filled an empty slot.
Fix
A Show tile icon switch, off by default, so the template matches the product exactly.
"Check that modals and templates use real components."
Cause
Some buttons, tags, tabs and close icons inside templates were drawn, not instanced.
Fix
Swapped them for real instances in place, keeping position, layout and every existing text override.
"Icons in chips and badges can't be changed."
Cause
Icons were characters from an icon font, which Figma can't swap.
Fix
10 new icon components, 47 glyphs converted, and a leading-icon switch and picker on every chip, badge, tag, pill and tab.

Then I made the checks automatic. Every component was instanced, switched through every variant with custom text and swapped icons, and stretched with long labels. The test ran until it found zero failures, so "it looks right" became "it is right in every state".

Can an AI read this system and build accurately from it? I tested it.

"AI-friendly" isn't a style. It's whether an agent reading the file gets the same answer a senior designer would. Five properties make that possible, and each one is checkable.

✓
210 of 210 components documentedEach description says what it is and when to use it. Agents receive the text alongside the structure.
✓
Every value bound to a variableA fill reads as surface/brand, not #6E30F2, so generated code inherits the token, not a guess.
✓
Readable, consistent propertiesFull-word variants and identical wiring across variants mean one variant teaches the whole set.
✓
Real instances, real slotsScreens are built from instances with swappable icons, so an agent sees a Button, not a purple rectangle.
✓
Semantic layer namesTitle row, Status pill slot, Focus ring: the layer tree explains itself.
✓
Code Connect mappingsThe last step: an agent asking about a component gets our React code, not a reconstruction.

Accuracy came from structure, not from better prompts.

The real test of the system is what an AI agent receives when it reads a design. Same component, same tool, before and after.

AI output accuracy: the same component, read by an agent

I asked the Figma MCP server for the design context of the AI Message component in the original file and in the design system. This is what an agent gets to build from (trimmed; brand names removed).

Before · original AI-built file
// layer "Frame" › "g" › "AiAvatar" › "Container" › "Image"
avatar   bg: var(--colour-tokens/text-colors/color-text-link)
         radius: 16777200px
title    font-['Inter:Semi_Bold'] text-[11px]  // hard-coded text, no prop
time     text-[10px]
row      gap: 8px      stack gap: 6px
bubble   bg: var(--status/neutral/surface)
         padding: 12px  radius: 8px
message  text-[12px] leading-[1.4]
// description: none
After · design system
// layer "Title row" › "Avatar slot" › Avatar(Type=AI)
avatar   bg: var(--surface/brand)
         radius: var(--radius/full)
title    Label/11 Semibold · prop title
time     Label/10 Regular · prop timestamp
row      gap: var(--space/8)  stack gap: var(--space/6)
bubble   bg: var(--surface/muted)
         padding: var(--space/12)  radius: var(--radius/lg)
message  Paragraph/12 Regular · prop message
// description: "Message from Studio AI: avatar, author,
//   timestamp and message bubble (surface/muted)."
What the agent receivesBeforeAfter
Design values that are tokens5 of 13 (38%)13 of 13 (100%)
Tokens used for their intended purpose3 of 513 of 13
Text with a named style0 of 33 of 3
Usage descriptionNoneYes, for the component and its avatar

Counted from the raw Figma MCP responses for node 1:430 (original) and 146:129 (design system). One component is a small sample; the file-wide audit in section 01 shows the same pattern at scale.

Then I tried prompting

With the system in place I ran two prototyping experiments. In both, the prompt was short; the fidelity came from what the agent could read.

Experiment 1 · Figma to code, one component at a time

My promptCan Claude read the whole design system and give me accurate design and code? Do it.

The agent read the AI Message and Composer components, pulled their variables, and generated React. Left is the Figma render; right is the code it produced, rendered live on this page from the component library.

Figma source of truth
AI Message
AI MessageMessages · 146:129
Composer · Style=Chat, State=Default
Composer · Style=Chat, State=DefaultComposer · 139:12
React generated, rendered live

What it got right: every colour, spacing value, radius and font size matched the Figma variable it was bound to, and the component descriptions came through as code comments. What needed me: the first preview rendered blank because it relied on a CDN, and icons were first redrawn as stand-ins because the sandbox couldn't download them. Exporting the SVGs straight from Figma fixed it.

Experiment 2 · a dashboard from one sentence

My promptCreate one basic dashboard using the design system.

The agent asked two questions (format and subject), read the relevant patterns (AI Summary Card, Metric Card, Build Row, Filter Bar, Workspace Action Bar), exported the real icons, and produced the page below. An automated check confirmed it uses no colour that isn't a design-system variable and no undefined token.

Live render, scaled to fit. The filter chips work. Sample data is illustrative.

One vocabulary from canvas to codebase.

Generated code that matches the design is good. Generated code that uses our components is better. So we started the codebase from the system itself.

The library is React and TypeScript with CSS Modules. Tokens are generated from the Figma variables with one command, so a colour change in Figma is one re-export away from production. Component props mirror Figma properties word for word: tone, size="extra-small", leadingIcon, selected. Hover, pressed, focused and disabled are real CSS states, just as they are variants in Figma.

Rendered live from the React library on this page. Every value comes from the generated token file.

Generated code, mapped to real components

To show the whole chain, I took part of the Share Feedback modal and generated it from the design system. Every element of the generated JSX is one of our components, chosen from its Figma counterpart, and rendered live below.

Share feedback modal: chips, section headers, buttons, all live
Share feedback modal: chips, section headers, buttons, all liveTemplates · Modal / Share Feedback
// Generated from Modal / Share Feedback, using our component library
<TabList variant="pill">
  <PillTab selected>All</PillTab>
  <PillTab>Landing Page</PillTab> …
</TabList>
<Select label="What is this feedback about?">…</Select>
<SectionHeader tone="positive">What worked well</SectionHeader>
<SectionHeader tone="improve">What can be improved</SectionHeader>
<Button size="small" disabled>Submit Feedback</Button>
<Button size="small" variant="ghost">Cancel</Button>
Rendered live from the library
Figma componentReact componentCode Connect mapping
Pill tab · Selected = true<PillTab selected>figma/layout.figma.tsx
Select · Show label<Select label=…>figma/inputs.figma.tsx
Section header · Tone = Positive / Improve<SectionHeader tone=…>figma/layout.figma.tsx
Button · Style = Primary, State = Disabled<Button disabled>figma/actions.figma.tsx
Button · Style = Ghost<Button variant="ghost">figma/actions.figma.tsx

The feedback chips in this modal aren't in the first 26 coded components yet, so they're left out of the generated code rather than faked. Dev Mode will show these snippets once the mappings are published.

Code Connect: closing the loop

Code Connect tells Figma which code component each design component is. I wrote mappings for all 26 components and all 52 icons, so Dev Mode, and any AI agent reading a design, gets our real component with the right props instead of reconstructed markup.

What it changed in practice: writing the mappings forced a one-to-one vocabulary, and that audit surfaced two inconsistencies in Figma: a Secondary icon button whose icon was grey although its documentation said purple (the source confirmed purple), and descriptions still using the old size shorthand. Both are fixed.

Honest status: the mappings are written and type-checked. Publishing them needs the repository on GitHub, which is in progress.

// figma/actions.figma.tsx
figma.connect(Button, FILE + "130-1123", {
  props: {
    label: figma.string("Label"),
    variant: figma.enum("Style", { Primary: "primary", … }),
    size: figma.enum("Size", { "Extra small": "extra-small", … }),
    leadingIcon: figma.boolean("Show leading icon",
      { true: figma.instance("Leading icon") }),
  },
  example: ({ label, variant, size, leadingIcon }) =>
    <Button variant={variant} size={size}
            leadingIcon={leadingIcon}>{label}</Button>,
});

// What a developer (or an agent) now gets from the design:
<Button variant="secondary" size="small"
        leadingIcon={<Icon name="plus" />}>Decide for me</Button>

Measured before and after, and checked by the team.

I ran every test on matching pairs: the same component or screen in the original AI-built file and in the design system. The counts come straight from the Figma files.

Did it work? Four direct answers

Yes · measured
Did prototype inconsistencies drop?

Yes. Across the same four screens, the off-system values an AI prototype needed fixing fell from 256 to 25 (−90%), and a fresh one-sentence prototype came out with zero colours outside the system.

Yes · measured
How much time was saved?

In AI prototyping, correction work per set of screens fell from about 4.3 hours to 25 minutes. In build effort, the six screens below need 59 fewer hand-built elements today (about 2 hours less) and 399 fewer once the patterns are coded (about 13 hours less).

Implementation-ready
Did engineering use it?

Engineering hasn't consumed the system in production yet, but the system successfully generated React + TypeScript components and Code Connect mappings from Figma. That validated that the naming, token architecture and component structure were implementation-ready, and could be translated into code with minimal manual interpretation.

Faster iteration
Did delivery get faster?

End-to-end delivery metrics haven't been measured yet, but design iteration speed improved immediately. Component, token and documentation changes are applied once and propagate across every screen, eliminating repetitive updates and reducing maintenance effort.

Production adoption is still in progress, but the system already generates implementation-ready React components and Code Connect mappings, demonstrating engineering readiness. More importantly, it turned screens from isolated designs into reusable system compositions, reducing maintenance overhead, improving consistency and creating a scalable foundation for AI-assisted design and development.

AI prototyping: fixes needed to make the output on-brand

A fix is any value an agent receives that isn't a system token (a raw colour, size, radius or gap), or a token named after another screen, such as feedback/text-subtle on a workspace. Each one has to be corrected by hand before the prototype matches the product.

Screen or componentTokens · beforeTokens · afterFixes · beforeFixes · after
AI Message5 of 1313 of 1380
Composer4 of 66 of 620
Build table row10 of 2224 of 24170
Share Feedback modal102 of 255261 of 28622925
Total121 of 296 (41%)304 of 329 (92%)25625

Time converts the fix count at one minute per fix: 256 minutes before, 25 after. The 25 remaining fixes are raw values inside the feedback modal's content area, the next cleanup target.

Engineering effort: elements a developer writes by hand

Before, there was no code library, so every visible layer had to be built as markup. With the library, each coded component is a single element. The 26 core components already cut the work; coding the patterns is where the big drop is.

ScreenBefore · no libraryToday · 26 core componentsNext · patterns coded
AI Message911
Composer611
Build table row16101
Share Feedback modal94805
Agent detail modal64583
Reimagine workspace2232032
Total412353 (−14%)13 (−97%)

At two minutes per hand-built element, these six screens take about 14 hours to build without the library, under 12 hours with today's 26 components, and under 30 minutes once the patterns are coded.

Adoption and what the team said

Templates
Built from the system, not drawn

Share of every template layer that comes from a design-system component instance: Conversation 95.9%, Workspaces 96.8%, Modals 88.3%.

Reuse
Components doing the work

The Workspaces templates use 82 different components, Modals 47 and Conversation 35. Change a Button once and all three follow.

Code
Design and code share one vocabulary

26 components and 52 icons are coded and mapped back to Figma with Code Connect, with props named exactly like the Figma properties.

Developer feedback
“The design system's semantic naming, token architecture, and documented components made code generation predictable and easier to review. Generated React closely matched intended behavior, reducing translation effort and implementation ambiguity.”
Developer · Engineering team
Designer validation
“The system demonstrates strong design-systems thinking through scalable foundations, component governance, and clear information architecture. Naming, documentation, and tokenization significantly improve consistency, maintainability, collaboration, and future AI-readiness across products.”
Product designer · Peer review

What exists now that didn't before.

BeforeAfter
Structure1 page, 1 frame, 10 sections of AI-generated UI36 pages: start, foundations, 17 component pages, 7 patterns, 3 templates
Tokens165 colour variables named by screen, 26 duplicated values; no spacing, radius or type tokens329 role-based variables in 6 collections, 57 text styles, 5 elevation styles and a focus ring
Components136, mostly copies; the composer existed three times158 components, 532 variants, stress-tested in every state
IconsFont glyphs, not swappable52 icon components, swappable in every slot
Naming21.3% of layers generic ("Frame", "Vector")0.17% generic; full-word properties everywhere
Documentation2 of 136 components described210 of 210 components described; a page template for every component
ScreensDrawnAssembled from live instances
CodeNoneReact + TypeScript library: 26 components, generated tokens, 52 icons
Design ↔ codeHand-off by eyeCode Connect mappings for 26 components and 52 icons, ready to publish
Engineering readinessEvery screen re-interpreted into code by handImplementation-ready: React + TypeScript generated from Figma with minimal manual interpretation, confirmed by a developer
Design iterationThe same change repeated screen by screenChanged once in a component, token or doc, and propagated to every screen
AI prototyping256 off-system values to fix across four screens25, with new prototypes coming out on-brand

What worked, what didn't.

What worked really well

  • Direction through critique. Plain-language notes ("this breaks when you touch it") were enough for the agent to find root causes, as long as I named the symptom precisely.
  • Tokens first. Building primitives and roles before any component made every later step faster and every fix global.
  • Automated QA. Stress tests across every variant caught breakage no visual review would have.
  • Reading and writing Figma directly. The agent built in the real file, so there was no export, import or translation step to lose fidelity.
  • Validated from both sides. A developer found code generation predictable and easy to review; a designer called out the foundations, governance and information architecture.
  • Code as a design audit. Writing the code and Code Connect mappings exposed inconsistencies the Figma review missed.

What didn't, and why

  • An ambiguous brief cost a full rebuild. "M3-level" was read as "M3-looking". Benchmarks need to say what is being benchmarked.
  • Finished-looking isn't finished. Copy-generated variants looked right and broke on use. AI output needs testing, not just viewing.
  • Environment limits. The agent's sandbox couldn't install packages or download assets, so the code still needs its first real run on a developer machine.
  • Figma has its own limits. Swapping an icon instance resets its colour, so the purple collapse icon has to be reapplied after a swap.
  • A few values have no token yet. About 1% of colour uses and a handful of radii and gaps are still raw values, including one gradient stop.
  • Production adoption is still ahead. Engineering hasn't shipped on the library yet, so delivery-time gains are still to be measured.
  • Patterns aren't coded yet. The 26 core components cut hand-built elements by 14%; the 97% drop only arrives once cards, modal parts and workspace sections are coded too.

What I learned

The brief is the design.

With an agent doing the making, the quality ceiling is set by how precisely I describe intent, constraints and what "done" means.

Naming is interface design.

Property and token names are the interface for designers, developers and models at once. Clear names gave the biggest accuracy gains of the whole project.

AI-made UI still needs a designed system.

AI can generate convincing screens quickly. It can't, on its own, give them a shared language. That part was design work: deciding what each thing is called, what each value means, and what the rules are.

AI needs structure, not screenshots.

Prompt quality barely mattered in the prototyping experiments. Descriptions, variables and real instances did.

My role moved up a level.

I spent the execution time on architecture, critique and judgement rather than drawing. The taste calls, such as purple versus grey or blank versus filled, were still mine to make.

Readiness is a result.

Before any production use, generating working code and mappings from Figma proved the system was implementation-ready. It gave engineering a reason to adopt it, not just a request to.

Verification is a design skill.

Deciding what to test, and turning every critique into a rule, is what made the system trustworthy rather than merely impressive.

My experience

The speed was the least interesting part. What surprised me was how quickly my job turned into the parts I value most: deciding how the system should be organised, noticing when something was subtly off, and explaining why. The agent was tireless and fast, but it was also confidently wrong at times, and the work only became good once I treated it like a talented junior designer who needs a clear brief and honest, specific feedback.

The moment that changed my mind was the dashboard. One sentence produced a page that used our colours, our spacing and our components, and that wasn't luck: it was the structure underneath. That's the case I'd make to any team: invest in making your system legible, and AI becomes a multiplier instead of a source of drift.

From implementation-ready to adopted.

The system is validated and implementation-ready. The next phase turns readiness into production use, and the measured gains into delivery numbers.