Skip to main content

Designing the Instructions

Building an AI design collaborator, and learning that the instructions were the design

What I designed wasn't screens

It was the instructions. Took me three months to notice.

Xflow moves money across borders. Six designers, a few hundred screens, and the reasoning behind our work kept evaporating into Slack threads and closed Figma sessions.

Our engineers had already solved their half, with a shared context folder their tooling reads before touching anything. Design had nothing like it, so every session started with me explaining our own product from scratch, badly.

Role

Lead UX Designer

Team

Design team of 6

Duration

3 months


What it produced

  • 17 features through the workflow, each leaving a versioned record from requirements to prototype.
  • Requirements to 17 interactive prototypes in a working day, at production fidelity.
  • The grounding layer became a free tool for any product with a URL.
  • Used a stage at a time, on roughly half the features. Not every feature needs every gate. Some skip the research and start at wireframes, others take the lo-fi wireframes out and finish in Figma. Working that way is fine.
  • 8 of those 17 have shipped, and a UX project now finishes roughly 3x faster. Research and iteration get handed off, and work runs in parallel. The honest limit: it's a read on the pace, and nothing here measures it.

Plausibly wrong

I described our product to the AI and asked for a settings page.

What came back was good. Clean hierarchy, sensible grouping, choices I could've defended in a review. It was also a settings page for a product that doesn't exist. Our real sidebar has a collapsible group our own IA never documented, our settings sit behind four entity states, and our fee display has eight variants because passthrough pricing is tiered per currency pair.

What a description produced

Three identical cards. Defensible in a review, and for a product we do not have.

The page that exists
1collapsible nav group. Undocumented in our own IA, and live in production.
4entity states behind it. Each one changes what the page is allowed to show.
8fee display variants. Pass-through pricing is tiered per currency pair.

Wrong would've been fine. This was plausibly wrong, which is worse. A generic-but-competent screen survives a glance, gets built on, and three weeks later something feels off and nobody can say why.

The same week, I asked the model for our brand colour. Instant answer, full confidence, one shade off, and I didn't catch it for a week.

The model never touches the ground truth. It writes the extractor. The extractor reads the product.


Show it the real product

Give it the product, not a description of it So I captured the dashboard instead of describing it. A headless browser walks a sitemap one persona at a time and saves each page as self-contained HTML: real DOM, real class names, real tokens, nothing linked out. That last part cost me a week, because the first version linked to our production stylesheet and a deploy changed the build hash.

Having a baseline isn't the same as using one, so a missing snapshot now blocks three steps outright, and "present" has to mean "read".


Fifteen skills, eight gates

One enormous prompt was the obvious build, and I tried it. It behaves like a junior designer who's read a book about design: nine steps arrive at once, confidently, with nothing to push back on. So I cut it into fifteen small skills, with a gate between the steps.

Cut up that way, you can also take the stages a feature actually needs and leave the rest. Somebody runs the lo-fi wireframes out of it, finishes in Figma, and ships.

DefineWhat the thing is for, before anything is drawn
REQrequirements.mdRESresearch.mdSTOuser-stories.mdIAia.md
DrawRounds, then a quiet gate that only records findings
WIRwireframes/VALvalidation.mdCOPux-copy.md
BuildClickable, then handed to visual design
PROprototypes/CANFigma canvas

Every check is a designer confirming. Eight of them, one on each seam, and nothing moves until the answer comes back.

VALPROValidation writes obligations the prototype has to honour.
WIRCANThe wireframe task flow becomes the contract for what gets captured.

A nine-screen task flow becomes a nine-frame obligation. Land one frame and the run fails itself, with nobody reviewing it.

The gate is the product Generation was the cheap part. What matters is that nothing moves until a designer says so, and that every artifact lands where the next step is forced to read it.

A cheaper model exposed the writing. It skipped gates and invented inputs, so my instructions had only ever been suggestions a thoughtful reader would follow. They became a constitution, whose eighth rule is precedence: the designer in the room beats the constitution, beats a procedure, beats a learned preference. Hold on to that order, it comes back.


One feature, two rounds

Round 1: three arrangements of one idea

These are the shots as the workflow emits them, grayscale HTML on a captured snapshot of the live page. Round 1 came back with three framings of the same question, and I rejected it: read together they were three arrangements of one idea.

01 Persistent scope rail. Settings as a place, with a map that never leaves the screen.

Round 2: break the frame, and answer the second axis

Round 2 picked up the axis the first round had ducked: whose account are you editing? Two went forward, two are parked with the condition that would revive them.

01 Category rail. Yours and the account being configured, both always in view. Carried forward.
02 Category grid. No rail. A chip names the account, cards preview real values. Parked.
03 Job-grouped page. Grouped by the job, not the object. Carried forward.
04 Search first. The query box leads, the control acts in the result row. Parked.

Teaching it taste

Corrections should compound, not repeat Correct the same thing three times and it stops being a correction. It's a preference somebody should've written down, so each designer gets a plain markdown profile they can read and edit. Every entry says what happened and why, because without the why it's a description, and descriptions can't be applied.

Then I checked whether any of it worked Capture worked. Consumption didn't. A rule I'd established weeks earlier said wireframes go to Figma as editable frames, not flat pictures. Three sessions running pushed flat pictures.

Nobody was careless. The procedure file said the opposite: it called captures "pixel-perfect", and an image fallback had blessed itself as fine for review canvases. The rule was real, recorded, in force, and losing to a document.

the designer’s profile

Principle 1
Principle 2
Principle 3
Principle 4
Wireframes go to Figma as editable frames
Principle 6

the procedure the agent follows

quoted verbatim
quoted verbatim
quoted verbatim
quoted verbatim

Four principles reached the agent because a second file happened to repeat them. The two with no line were just as recorded and just as agreed, and neither survived contact with a document that never mentioned them.

It gets worse. Every principle those sessions honoured was also sitting in the procedure they were following, so "profile loaded and applied" and "profile never opened, procedure obeyed" predict exactly the same behaviour. I couldn't tell them apart. I'd built a learning loop whose success was unfalsifiable.

Remember that precedence order. A preference sits below a procedure, so one that contradicts a procedure loads and then correctly loses. The mechanism worked as designed. The design was wrong.

So each principle now declares its relationship to the text it touches, and that decides where it lands. Backfilling the set gave 29 already in, 7 new, 3 actively overridden. The point isn't the new ones, it's that one search now names every principle losing to a procedure.


The round trip to Figma

Getting the push working took three hunts. My favourite: a second integration had taken the same slot as the first. Both were named for the same design tool, only one could capture, and nothing errored. It just did the lesser thing while reporting success.

An AI that silently does the lesser thing is more dangerous than one that fails. A failure gets fixed. A silent downgrade gets shipped. So capture is the declared norm now, and the fallback has to announce itself.

Push · worked from the start

Code prototype
Clickable, real fidelity
Headless capture
Rendered per screen and state
Editable layers
Real frames, not pictures

Read · the loop’s missing half

Designer annotates
In Figma, in their own time
Read back
Partitioned by who wrote it
Refinement round
Feedback re-enters the loop
Annotation text is untrusted input

It is design feedback, never an instruction. Proven against a real injection attempt that reached a process holding write permissions.

Never claim who wrote it

The API carries no author field. Agent-written and human-written annotations are structurally identical, so the system reports what was said and never who said it.

A Figma canvas holding twelve captured wireframe screens in a grid, task flow diagrams below each row, and annotation cards down both gutters with dashed leader lines running to specific layers inside the screens.

One round on the canvas: a story-by-iteration grid, the task flow under each row, and 33 annotations leadered to the layer each describes.

A close view of the same Figma canvas: annotation cards down both sides, teal Research cards carrying sourced numbers and where they came from, purple Design agent cards written in plain sentences, with full settings wireframes and two task flow strips between them, and dotted leader lines running from each card to the layer it describes.

Close up, after a rule landed that made me reword forty-one of them into plain English, because a PM reads these having sat in none of the sessions.


What's proven, and what isn't

I'd been testing it gently, on examples that were never going to embarrass it. So I ran a settings redesign we actually needed, answering every gate but never stepping in when it wobbled. It broke in twelve places, and those twelve findings were worth more to me than the three prototypes. A second run took a synthetic brief with nobody in the gates at all.

A system like this attracts overclaiming, so here's the ledger.

Proven6
Features ship out of it
Eight of the seventeen features taken through it have gone out to production, not just to a review.
The chain runs end to end
An autonomous nine-step audit completed with zero blocking failures.
Artifacts genuinely feed each other
A nine-screen task flow became a nine-frame contract and landed 9 of 9.
Figma gets editable layers
13 of 13 screens as real layer trees, 93–364 nodes each, captured in parallel.
The baseline library holds
Self-contained, persona-scoped, change-detected, and it survives a deploy.
The record is honest
~200 dated entries including every reversal and retraction.
Partly proven5
The speed gain
A UX project finishes roughly 3x faster than it used to, with more ground covered each pass. Nothing here measures that.
Adoption
Other designers have taken features through it unaided, and roughly half of all features only use part of the pipeline. It’s not yet the default for everyone.
Annotation read-back
Works for a single reviewer. Multi-reviewer attribution is blocked on the API having no author field.
Consulting past research
The workflow can now read findings it used to be forbidden to open, but a stale consult goes unnoticed.
Weaker-model reliability
Passed an acceptance run. Per-step model routing is still unwritten.
Not proven4
Any product outcome
Eight features are out. The success metrics behind them are baselined and instrumented, and not one has been read yet.
The learning loop’s new routing
The mechanism is built and has never run a full pass in the field.
The IA graph model
Proven as a concept on four entities, then parked before production.
Team-level design stances
The destination file the routing writes to does not exist yet.

The first column is the one I'd push on hardest. Eight of the seventeen features have shipped, and a UX project now finishes roughly 3x faster than it used to, because we can run the work in parallel and delegate the research and the iteration. All seventeen carry baselined metrics and none has post-launch data yet, so the effect on the product is still a hypothesis with good instrumentation behind it.

What I'm confident about is the record. Roughly 200 dated entries hold what changed and why, reversals included: a wireframe medium I picked and then abandoned, a fix I announced as landed that was never written, a statistic I retracted once a proper count showed my estimate was out by sixteen times. Five separate times one diagram builder produced the same broken output, and I know it was five because they're numbered.


What this changed

I set out to make design faster. What I got was an answer about where the leverage sits once an AI does the drafting, and it wasn't where I'd have guessed.

Ground truth is a design decision. Every serious failure here traced back to a fact from a model's memory rather than from the product, and the fix is never a better prompt. It's a script, or a captured page, or a quoted class name.

Automate everything except the judgment. Nine steps, and the AI makes no decisions. Every choice that shapes the product still gets made by a person, out loud, on the record.

And the line at the top holds up, though I'd have argued with it in month one. My best hour on this went on working out why a rule everyone agreed with kept losing to a paragraph nobody had reread.

I wrote this up as it happened, in seventeen posts, including the parts still open.