AI workflow · Prompt design · Team kit · 2026

Prompt to Prototype

AI in the design workflow · a Sportster S dashboard case

One motorcycle dashboard, four AI models and an iteratively refined prompt. This case study documents how we evaluated the models, how we structured prompts for them, and how a single build session became a reusable team toolkit.

Case
Harley-Davidson Sportster S, 4-inch round TFT dashboard (HMI prototype)
Roles
Shared by all three of us across the whole project: research, model comparison, prompt writing, building the Figma prototype with Claude, testing, and the team prompt kit
Team
Julianne Henry, Jingwen Li and Xiaolu Xi
Tools
Claude with the Figma connector, ChatGPT, DeepSeek, Gemini, Figma
Year
2026
The finished Figma prototype. The dashboard on the left, and a live key panel on the right: black keys work on this screen, grey keys do nothing.
Fig. 01The finished Figma prototype. The dashboard on the left, and a live key panel on the right: black keys work on this screen, grey keys do nothing.

Context

A finished design, waiting to be built

The brief was a live demo: an interactive prototype of the Sportster S dashboard that the audience could watch being driven from a keyboard. We had already done the design work. A Figma page held every screen and overlay in the team’s visual style, and seven logic tables described what every handlebar key does, in every state, with rule IDs we could point at.

What we had not done was build it. Wiring a round dashboard with five pages, nested settings, media keys, calls and warnings means hundreds of frames and more than a thousand links. That is exactly the kind of work where AI can help, as long as the design decisions stay ours.

111
Frames in the final prototype
~1,300
Interactions wired
1,488
Link targets, none broken
19
Spec files the AI worked from
Our source: the
Fig. 02Our source: the "visual elements" page in Figma. Every state frame was cloned from these screens, never redrawn.
The logic we handed over: seven Excel tables, Known Unknowns, Thinking Docs and the brief, 19 files in all.
Fig. 03The logic we handed over: seven Excel tables, Known Unknowns, Thinking Docs and the brief, 19 files in all.

AI 没有替我们设计仪表,它把我们的设计决定执行到了每一个画面。

“The AI didn’t design the dashboard. It carried our decisions into every one of 111 screens.”

What we took away from the project

Who did what

What we did, and what the AI did

The team made every design decision. The AI handled the build and much of the verification.

StageWhat we didWhat the AI did
Before the buildDesigned every screen and overlay in Figma in the team’s visual style. Wrote the seven logic tables with rule IDs, Known Unknowns, the Thinking Docs and the brief: 19 files. Designed the D-Pad and Music Control keys and drew the low-fidelity flow.Not involved at this stage.
Setting upChose the tool (Figma) and the scope of the test. Wrote the prompts. Shared the file as “can edit” with the connector account.Read all 19 files and asked what was missing: the team name, which items were required, the reference material.
BuildingSent the reference image, the team’s key design and the motion requirements from review.Cloned our screens into 111 state frames, wired about 1,300 interactions with keyboard triggers and variables, and generated a key panel on every frame from its real interactions.
Checking and fixingTested it from a rider’s perspective. Reported each bug with a screenshot or screen recording, and specified the reference standard: the production motorcycle.Checked all 1,488 link targets, compared the logic with Harley-Davidson service info and the video’s captions, found 7 of the 13 problems itself, and worked around Figma’s limits.
DecidingDecided every conflict between the spec and the bike, what stayed in scope, and when a version was accepted.Listed conflicts and assumptions for us to decide. It did not decide them.
AfterwardsRan the same prompt in four models, corrected the write-up’s scope, and turned it into the prompt archive and the team kit.Drafted the problem-and-fix summary in Chinese and English.

Design and decisions stayed with us

Every screen, rule and key was defined before the session started. When the AI made assumptions about scope or style, we corrected them; decisions on what to test and which rule took precedence remained with the team.

High-volume production was delegated to the AI

111 frames, about 1,300 interactions and 1,488 link targets: the work that is slow by hand and easy to get wrong.

Checking was shared

We evaluated the rider-facing experience; the AI verified what a rider never sees: every link, every rule, every frame.

Scope

Scope comes first

Scope is the most important element of any prompt. Without it, AI readily expands the work: additional screens, additional features, a refined version of something outside the brief. Each expansion looks like progress but does not serve the test.

01Why build a prototype?

To test it. A prototype is not the product; it is the lowest-cost artifact that can be put in front of users.

02Why test it?

To validate the concept before committing to building the real product.

03Why validate the concept?

Because only a sound product creates business value. A test that catches a weak concept early prevents a costlier mistake later.

04So what is in scope?

Only what the test requires. Anything beyond that, however impressive, consumes time without improving the test.

Where the AI went outside our scope

What we askedWhat the AI didWhy it was out of scope
A request for a “perfect” interactive prototype, with no tool specifiedA full HTML prototype with a simulator, an event log and 79 automated testsThe test had to run in Figma, on the team’s own screens. The 22-minute output could not be used.
A request to restyle the keys, with no reference imageInferred a style and removed 10 keysThe AI, rather than the team, determined what the test would show.
Continue fixing against the spec files, no target namedSix fixes against the specThe intended reference was the video; the AI selected its own.
Fix-all request, with no list or priorityEight fixes, chosen by the AIThe fixes were useful, but the AI rather than the team set the priorities.
A request for every issue encountered, with no scope definedStarted with environment and permission problemsThe intended scope was the prototype build only.

In

Define what the test requires: the screens, keys and states a rider will actually use.

Out

State what is out of scope: no web version, no simulator keys on the panel, no changes to the original page.

Done

Define the acceptance criteria: Home works on every frame; volume keys respond to repeated presses.

Before every prompt: what is this prototype testing, and what does it not need?

01 · Which AI

Same prompt, four models

We gave the same task to four models. The prompt was written once, in two versions, and kept as the record of the test. The decisive factor was not general model capability but whether the model had access to the environment where the work lives.

ModelHow it workedWhat came backBest used for
Claude
with the Figma connector
Worked inside our Figma file. Cloned frames from the visual page, wired keyboard triggers and variables, and checked every link.V1: 61 frames in about 5 minutes. V2: 111 frames, about 1,300 interactions, no broken links. Found its own errors against H-D service docs.Building and checking inside the design file
ChatGPTGiven the same materials, rebuilt the screen set on its own page as named state frames.90 state frames in the same 1600-wide layout.A second build to compare against
DeepSeekCould not open Figma. Returned a single HTML file, a self-check table, and a plugin script to run in Figma’s Scripter.Clear key-by-screen logic table and a list of assumptions. The visuals drifted: the dashboard shape and the telltale row changed.Logic review and self-check tables
GeminiCould not open Figma. Returned an HTML prototype with a key panel.The layout and key panel worked, but the dashboard lost its RPM ring, bezel and type. The result resembled a generic media player.Quick layout drafts
DeepSeek: a working HTML prototype with a full key-by-screen table and an assumptions list. Strong on logic, weaker on fidelity.
Fig. 04DeepSeek: a working HTML prototype with a full key-by-screen table and an assumptions list. Strong on logic, weaker on fidelity.
Gemini: the key panel landed, but the round dashboard became a generic dark card.
Fig. 05Gemini: the key panel landed, but the round dashboard became a generic dark card.
Without Figma access, DeepSeek wrote a script for the Scripter plugin instead. It runs, but every visual has to be redrawn in code.
Fig. 06Without Figma access, DeepSeek wrote a script for the Scripter plugin instead. It runs, but every visual has to be redrawn in code.

02 · What each can do

What each AI can and can’t do, what it costs, and where your files go

The test showed which model did best on our task. This part answers the question underneath it: for the work this project actually needed, what can each one do, what can’t it do, what does it cost, and what happens to our files? The rows follow our needs, in the order they mattered.

What we neededClaudeChatGPTDeepSeekGemini
Work inside our Figma fileYes. Its Figma connector reads the file’s data and screens. In our test it built inside the file: cloned our frames, set variables, wired every trigger.Yes. Its Figma connection reads the file’s data and screens. In our test it rebuilt the screens on its own page instead of reusing ours.No. It only sees what we describe in the prompt and the images we upload. Its workaround was a Scripter script, with every visual redrawn in code.No. Same: text descriptions and reference images only. It returned an HTML prototype outside Figma.
Read our 19 files
Excel tables, screenshots, a video
Excel, PDFs and screenshots. It also read our screen recording frame by frame. The YouTube reference needed a link and a timestamp.Excel, PDFs and images. For the video, send stills or a link with the timestamp.Text from documents and tables, and images (Flash model only). No video.The widest range: documents, images, audio and video. The one to hand the video to.
Follow the logic tables and check itselfStrongest here. Checked every link and caught its own mistakes against Harley-Davidson service docs.Kept one consistent layout across 90 frames. We used it as a comparison build, not as a checker.Good at logic. Wrote a clear key-by-screen table, a self-check and a list of assumptions.Got the layout and key panel right, but dropped the RPM ring, bezel and type without flagging it.
Leave something the team can editFigma frames and variables. Anyone on the team can fix them.Figma frames, but separate from our original components.An HTML file and a script. Only someone who reads code can change them.An HTML file. Same as DeepSeek.
What it can’t doWork in a file it can’t edit: share it as “can edit” with the connector’s account first. It is also bound by Figma’s own limits (see the kit).Keep our exact components on its own: in our test it redrew them, so fidelity depended on the redraw.Reach design tools. With no connector, it can only describe or redraw.Reach Figma. Working from descriptions and images, it lets the visual style drift.
Plan for one person
per month
Pro $20
Max from $100
Plus $20
Go $8 · Pro from $100
Free appGoogle AI Pro $20
Ultra from $100
API price
per 1M tokens, input / output
Opus 5.5: $4 / $20
Sonnet 5.5: $2 / $10
GPT-6.1 Sol: $2 / $10
GPT-6 Astra: $10 / $50
V4 Pro: ¥9 / ¥27 (about $1.30 / $3.80)
V4.1 Flash: ¥2 / ¥8 · half price off-peak
Gemini 3.1 Pro: $2 / $12
Gemini 4 Argon: $2 / $10, rising to $4 / $20 on Dec 1

Lowest cost per token is not lowest cost per task

DeepSeek costs a fraction of the others per token, but its prototype had to be redrawn by hand. The relevant cost is a usable result, not token volume.

For a team, the plan matters more than the API

Working in chat, what limits you is the monthly plan and its usage caps. API prices only matter once you automate, for example batch-checking frames.

Split the work by strength

Build with the model that can edit the file. Give the video to Gemini, and the logic review to DeepSeek or a second model.

Memory, other chats and long sessions

A build of this kind runs for several hours and often spans multiple chats. Whether a model remembers earlier work, can look into another chat, and copes with a very long one determines how much context has to be re-supplied.

QuestionClaudeChatGPTDeepSeekGemini
Remembers you across chatsYes. “Memory from chats” saves topics as you talk. On by default for Free, Pro and Max; Team and Enterprise opt in.Yes. Saved memories, plus a memory summary that updates as you chat.No. Every new chat starts blank.Yes. “Your past chats with Gemini” in Personal context, free since February 2026 (Europe later).
Can it read another chat?Yes. Chat search finds and cites past chats (Pro and above). Inside a project it only searches that project, and each project keeps its own memory.Yes. “Reference chat history” draws on past chats. Not yet on Enterprise or Edu.No. Old chats stay in the sidebar, but it can’t use them. Paste in what it needs.Yes. With past chats on, it draws on earlier conversations.
A chat that leaves no memoryIncognito chatTemporary ChatNot needed: chats don’t carry overTemporary chat
When a chat gets very longCompacts itself. On paid plans with code execution on, earlier messages are summarized so the chat keeps going. Early details get less precise.Slows down and starts forgetting early details. At the limit it stops taking messages, and you start a new chat.The oldest turns drop out of what it can see. Restate them or start a new chat.A very large context, but no automatic compaction is documented. Long chats slow down too.

Why long chats slow down

Every new message is read together with everything before it. The longer the chat, the more the model rereads each time, so replies slow down and early details blur.

How to move to a new chat

Ask the old chat for a short summary: decisions, files, open issues. Paste it into a new chat with the spec and the Figma link. Claude does this step itself by compacting.

Memory is not the spec

Memory keeps topics, not your files. In a new chat, attach the spec and the Figma link again, and use an incognito or temporary chat for client work you don’t want remembered.

Privacy: what happens to the project files

Our 19 files were an internal spec, but the same setup would carry a client’s unreleased product. Before any upload, the team needs to know what each AI can access, where the data is stored, and whether it may be used for model training.

QuestionClaudeChatGPTDeepSeekGemini
What it can accessThrough the Figma connector, every file the connected Figma account can open, and edit rights wherever that account can edit. Plus anything we upload.The same through its Figma connection: whatever the connected account can open or edit. Plus anything we upload.Only what we type or upload into the chat.Only what we type or upload into the chat.
Where it’s keptAnthropic’s cloud. Chats stay until you delete them, then are removed within 30 days. If you allow training, data can be kept up to 5 years.OpenAI’s cloud. Chats stay until you delete them, then are removed within 30 days. Temporary chats are kept up to 30 days.Stored in the People’s Republic of China, for as long as the account exists.Google’s cloud. Even with Keep Activity off, chats are kept 72 hours; chats picked for human review are kept up to 3 years.
Used to train the model?Only if you opt in (Free, Pro, Max). Never on Team, Enterprise or the API.Yes by default on Free, Plus and Pro. Off by default on Business and Enterprise.Yes by default.Yes while Keep Activity is on, and some chats are read by human reviewers. Work accounts follow different terms.
How to turn it offSettings → Privacy → turn off model training.Settings → Data controls → turn off “Improve the model for everyone,” or use a temporary chat.Email privacy@deepseek.com. There is no in-app switch; the other option is running the open-weight model locally.Turn off Keep Activity, or use a work or school account.

Other users can’t see your chats, but training carries them further

No one else can open your conversation. Anything used for training becomes part of what the model learns, though, so a detail from a confidential brief could in rare cases resurface in someone else’s answer. Treat “training on” as handing the material to the company.

A connector carries your whole account

It acts with the connected Figma account’s permissions, not just the one file. Connect with an account that only holds the project, and give “can edit” only for the build.

Our policy for project files

Turn training off before uploading. Keep NDAs, personal data and unreleased product details out of DeepSeek and personal Gemini accounts. For client work, use a business plan.

Test results come from the versions we used during the project. Prices, memory features and privacy terms were checked on October 29, 2026. They change often, and several are already scheduled to change.

03 · How to choose

Choose by where the work lives

The test produced five criteria we now apply before selecting a model for design work. The first is usually decisive.

01Can it reach the work?

A model that can edit the Figma file builds on our real components. A model that cannot will redraw them, and the redraw is where fidelity is lost.

02Can it read everything?

Nineteen files, Excel tables, screenshots and a video. Check that the model accepts all of them, not just the text.

03Can it check itself?

Ask for a self-check table and for sources. The best results came when the AI compared its work to the spec and to the real bike.

04Is the output editable?

Frames and variables in Figma can be fixed by anyone on the team. A one-off HTML file has to be fixed by whoever can read the code.

05Who on the team can use it?

Account, plan, file permissions and privacy rules. A tool only one person can access does not become a team workflow.

Our recommendation: build with the model that can work directly in the file, and use a second model to review the logic.

04 · How to prompt

Every rebuild traced back to missing information

The session comprised 34 messages. Afterwards we grouped them by stage and rated each one: ✓ worked first time, △ needed follow-up or rework, ✗ produced nothing. Half the stages required a rebuild, and the cause was consistent: information the team held but had not written into the prompt.

StageTimeMessagesResultWhat was missing
1 · Build the prototype08:16–08:5812△ built twiceWhich tool (Figma, not a web page); edit access to the file
2 · Key panel09:07–09:176△ redone three timesThe team’s key design image; which keys to keep
3 · Check the logic09:25–09:29, 09:464△What to compare against; the video link
4 · Fix bugs found in testing09:31–09:445✓Priority order
5 · Alignment and transitions09:49–09:543✓Which layers animate, and how long
6 · Write-up14:54–15:216△ corrected onceScope: only the prototype build

How long each prompt took

The log has a timestamp on every message, so we can see how long each prompt took, from sending it to sending the next one. The chart covers the build session, 22 prompts in about 95 minutes. These are not model run times: each bar includes the AI working plus our own reading, testing and typing.

✓ worked first time△ needed follow-up✗ produced nothing
08:16Greeting only, no task content✗ Clarifying question only<1 min
08:16The brief, pasted (bold formatting lost)△ Four clarifying questions1 min
08:1719 files + Figma link; “perfect” prototype requested, no tool specified△ A good HTML prototype, in the wrong format22 min
08:39Redirect to Figma + three links, without edit access△ Blocked by file permissions20 min
09:00File shared as “can edit” with the connector account✓ V1: 61 frames5 min
09:07Reference image + goal: show key presses during playback✓ A key panel on every frame6 min
09:13Restyle request, no reference image△ Style inferred2 min
09:15Key grouping by hand, without detail△ Ambiguous instruction1 min
09:16Deletion request, target unspecified✗ Three options returned for confirmation1 min
09:17The team’s key design image✓ Restyled in one pass8 min
09:25Continue fixing against the spec files, no target named△ Six fixes, outside the intended target3 min
09:28Frame-by-frame video check, no video attached✗ Clarifying question only1 min
09:29Instruction to locate the video on YouTube△ Located, with time lost to ads and captions2 min
09:31Screenshot + expected Home-key behaviour✓ Home rule located1 min
09:32Screenshot + volume-key repeat failure✓ Figma limit found and worked around1 min
09:33Fix-all request, with no list or priority✓ Eight fixes in one run8 min
09:41Open-ended polishing request✓ Call states and overlay key rules3 min
09:44Home-key rule restated for all frames✓ Home works on all 111 frames2 min
09:46Message with a typing error✗ Misinterpreted; run interrupted<1 min
09:46“Check every key against the real product”✓ Wrong Trip order found3 min
09:49Screen recording + overlay misalignment report✓ Cause found in six seconds<1 min
09:49Review feedback: pages fade in layers✓ Layered transitions5 min
95 min
Build session, 22 prompts
51 min
Spent on the 7 prompts that needed follow-up
42 min
Lost to two of them: wrong format, no edit access
~1 min
Per bug fix with a screenshot or recording

Duration reflects task scope, not prompt quality

The long runs, from 5 to 22 minutes, were the prompts that handed over a whole job: build it, restyle it, fix everything. Whether that time was productive depended on whether the prompt specified where and how.

A short response time usually indicates missing information

The 4 prompts that produced no output took under 3 minutes in total. Three underspecified messages in a row (09:13–09:16) returned two assumptions and a clarifying question; a single design image at 09:17 resolved the issue.

Lost time scales with missing information

Duration ≈ the size of the task delegated. Lost time ≈ that duration × the information the prompt omitted. Omit the tool or the access, and the entire run must be repeated.

Rewriting the first prompt

Stage 1 is the clearest example. Across eight messages and forty minutes, the build location was never specified, so the first output was a well-built web prototype in the wrong format. A further twenty minutes were then lost to file permissions.

Original messages (summarised)

1. A greeting with no task content.
2. The brief, pasted as plain text (formatting lost).
3. A request for a “perfect, error-free” interactive prototype from the Page 3 screens, with no tool or file access specified.
4–7. Four follow-up messages clarifying that the build should take place inside Figma.
8. Three file links shared in sequence, none with edit access.

Revised prompt

Task: In Figma, build an interactive prototype of the Harley-Davidson Sportster S 4-inch round TFT dashboard for a live demo.
 
Tool and access:
- Target file: <Figma edit link>, shared as "can edit" with <connector account>.
- Build on a new page in that file. Do not change the original designs on Page 3.
- No web version.
 
Visual source: Home, Navigation1, Media, Vehicle, Settings1, Global Navigation - Home, Screen overlays and D-pad affordance examples on Page 3. Clone every state frame from these.
 
Logic source (19 attached files):
- Key behaviour: Input Routing Matrix, Button Guard Table, List Item Type Overrides.
- States and events: State Transition Table, System Event Table.
- Overlays: Overlay Registry, Overlay Conflict Resolution Rules.
- If they conflict, the Excel tables win. Items still open in Known Unknowns follow the tables as written and are listed.
 
Input: the keyboard stands in for the handlebar controls. Arrows + Enter = D-pad; H / P / T = Home / Page / Trip; Space and , . - = are the media keys.
 
Scope: engine running, stopped and riding. No boot animation, no Bluetooth pairing.
 
Delivery and acceptance:
- Playback starts on the Home frame.
- Every link points to a frame that exists; no broken links.
- When done, list anything that could not be built, and why.

Anatomy of the prompt that worked

For the four-model test we rewrote the brief twice. Version 1 was one dense paragraph. Version 2 split it into four parts (visual style, interaction logic, key panel and transitions, build and acceptance), and the final version added a role, a research step and acceptance tests. These are its parts, in order.

01Role and goal

One line on who the AI is and what “done” means.

02Read first

A Step 0: which pages and files to read, and a short research summary before any building.

03Sources and priority

What wins when sources conflict: the prompt, then the tables, then Figma; the real bike over the tables where we said so.

04Visual spec

Colours, type, sizes and zones as tokens, copied from the design file, not described from memory.

05Logic with IDs

Every rule tagged with its table ID (G11, CR08, E16), so the AI can cite it and we can check it.

06Rules that never break

Four non-negotiables, such as “the telltale zone is never covered.”

07Deliverables

Exact formats, frame names and where to build, plus “output the full code, never ‘same as above’.”

08Acceptance tests

Fourteen tests written as things you can press and watch, not adjectives like “perfect.”

Prompts that worked

What we sentWhy it workedThe pattern
19 spec files + the Figma link, up frontThe tables were detailed enough for the AI to follow rule by rule.Give the full material first, then the request.
Reference image + a statement of the problem (key presses not visible)The image defined the visual target; the text defined the problem.Send a reference with the problem it solves.
The team’s own key designA single image replaced several rounds of verbal description.For style, send the design, not words.
Screenshot + the expected Home-key rule on a specific frameA specific frame, a specific key and the expected rule.“On X, key Y should Z, but it does W.”
Screenshot + reproducible volume-key failureA repeatable step and a visible symptom led straight to a Figma limit.Write what you did, then what happened.
Screen recording + overlay misalignment reportThe AI found the cause frame by frame in six seconds.Record anything that moves.
Review feedback: pages use layered fade transitionsContext the AI had no way to know.Pass on what reviewers and the client said.
“Check every key against the real product”Named the standard, so the AI read H-D service information and found the wrong Trip order.Say what to compare against.

Two prompts we now reuse as-is

Logic check: report first, change later
Task: check only; add nothing new. Verify what every key does on every frame.
 
Compare against, in this order:
1. The real product: YouTube video <link>, especially <timestamp>; and Harley-Davidson service information.
2. Our specs: Input Routing Matrix, Button Guard Table.
 
Scope: D-pad (four directions and OK), Trip, Page, Home and the media keys, on every frame and prompt.
 
Output: one table with the columns Key · Frame · Prototype now · Real bike · Spec · Match? · Source. Show me the table first; change the prototype only after I confirm.
 
Conflicts: where the bike and the spec disagree, list them separately; we decide.
Bug report: expected vs actual, in priority order
We found these problems in testing. Please fix them in order (screenshots attached):
 
Bug 1 (first) Home key
- Where: every frame, especially Home – Odometer and the prompts.
- Expected: Home works on every frame and every prompt and returns to Home (on Home it changes nothing). H shows as active on every key panel.
- Actual: H is inactive on Home and on some prompts.
- Spec to update: Button Guard Table G11.
 
Bug 2 (first) Volume and skip keys
- Steps: on Home, press "+" twice.
- Expected: each press raises the volume by 1 (0–15), updates the number and the bar, and restarts the 1.5 s timer (CR08). Skip keys likewise, and the title changes.
- Actual: only the first press works.
 
Then: check every other key against the Input Routing Matrix, the Button Guard Table and the Overlay Conflict Resolution Rules, and list the changes. When done, regenerate every key panel and check that no link is broken.

05 · Team kit

Turning one session into a team workflow

A productive session has limited value if it stays in one person’s chat history. We converted ours into a toolkit: the components below are kept in a shared folder, and every new AI task starts from them.

01Prompt template

Nine labelled fields (task, access, sources, references, must have, do not, acceptance, context). Complete all fields and send as a single message.

02Bug report line

One sentence: on this frame, this key should do this, but does that. Screenshot or recording attached.

03Specs with rule IDs

Every table row has an ID (G01–G26, CR01–CR14, E01–E22, LI00–LI12), so prompts, fixes and reviews can all point at the same rule.

04Source priority

Written once and reused: the real product, then the brief, then the tables, then Figma. Anything undecided goes in an assumptions list.

05Figma components

One Key component (Size × State) and a key panel generated from each frame’s real interactions, so the panel can’t drift from the logic.

06Workaround library

Documented Figma limitations and their workarounds, so they do not need to be rediscovered.

07Self-check and acceptance

A key-by-screen table and 14 acceptance tests the AI fills in, and we re-run after every change.

08Prompt archive

Every session logged with ✓ △ ✗ and a rewritten version of each weak prompt. The archive is how the kit improves.

The prompt template

Template: complete all fields, send as one message
[Task] Build <deliverable, e.g. a keyboard-driven prototype> in <tool / file link>.
[Access] The file is shared as "can edit" with <connector account>.
[Visual source] Use the designs on <page / frame names>. Do not change the originals.
[Logic source] Follow <spec tables>. If they conflict, <which one> wins.
[References] <screenshots / screen recording / YouTube link + timestamp>
[Must have] <e.g. a key panel on every frame; layered fades between pages>
[Do not] <e.g. no web version; no simulator keys on the panel>
[Acceptance] <e.g. Home works on every frame; volume keys can be pressed repeatedly>
[Context] <what the client or reviewers said>
Bug report
On <frame>, pressing <key> should <expected>, but now it <actual>. (Screenshot or screen recording attached.)
The team’s key component: a D-Pad box for the left hand and a Music Control box for the right. Black means the key works on this screen.
Fig. 07The team’s key component: a D-Pad box for the left hand and a Music Control box for the right. Black means the key works on this screen.
Volume on Home: the big speed moves to the top first, so the overlay never covers it.
Fig. 08Volume on Home: the big speed moves to the top first, so the overlay never covers it.
Incoming call. Only OK (answer), Down (decline), Home and volume stay black. The panel is generated from the frame’s real wiring, so it always reflects the actual behaviour.
Fig. 09Incoming call. Only OK (answer), Down (decline), Home and volume stay black. The panel is generated from the frame’s real wiring, so it always reflects the actual behaviour.

Figma limits, and what we did instead

SymptomCauseWorkaround
Volume key responded only to the first pressAn overlay can’t reopen itselfTwo copies (A and B) that swap on each press, restarting the 1.5 s timer
Volume number and song title never changedFrames hold fixed textText and bar widths bound to variables
A condition inside a conditionOnly one level of if/elseFlatten into one level joined with AND
Overlays slid off the dashboardOverlays centre on the window; tall frames scrollEvery frame 1600 × 720, so nothing scrolls
No long-press triggerFigma has key down, click and timeout onlyShift+T stands in for holding Trip
Vehicle keys multiplied the frame countEvery cruise and turn state needs its own framesKept in the web version; Figma keeps one riding/stopped variable

06 · Avoid

Practices to avoid

Most of the lost time came from a small set of recurring practices. They persist because each appears efficient at the time.

MistakeWhat happenedInstead
Opening with a greeting and no taskAn entire exchange with no usable information.Send the task, the materials and the requirements together.
Never naming the toolThe AI built a web prototype; the job was in Figma.Name the tool, the file and the page in the first line.
Sharing links before accessTwenty minutes lost to read-only files and the wrong account.Share as “can edit” with the connector’s account before starting.
Adjectives instead of tests“Perfect” and “no logic errors” can’t be checked.Write what you will press and what should happen.
Style requests without a reference imageThe AI inferred a style; the reference design followed four minutes later.Attach the design in the same message.
Underspecified short replies (e.g. grouping keys by hand)Three possible readings.Say which keys go in which group, and where.
Deletion requests without a named targetUnclear target; deleting can’t be undone, so the AI had to stop and ask.Name the object and its location.
Video-based checks without the videoThe AI searched YouTube itself, lost time to ads, and could not confirm it had the right source.Paste the link and the timestamp.
“Fix all the errors”The AI chose the scope, not us.List the bugs and give a priority.
Treating internal specs as the final referenceThe Trip order and the Home key were wrong in the spec itself.Name the real product as the standard, and let the build update the tables.
Marking the key panel by handAny wiring change made it inaccurate.Generate it from the frame’s interactions.
Interrupting a running stepThe interrupted step is lost and sometimes redone.Send a message; the AI adjusts at the next step.

Style problems: send an image. Motion problems: send a recording. Logic problems: state expected vs. actual behaviour.

07 · Fix and check

After the first build: finding and fixing what was wrong

V1 arrived at 09:05 with 61 frames. It appeared complete; a single click-through revealed gaps. Between 09:07 and 09:54 we reviewed it, tested it from a rider’s perspective, reported problems one at a time and checked every fix. This is the record of what was wrong, who found it, why it happened and how it was fixed.

13
Problems found and fixed after V1
5
Found by our review and testing
7
Found by the AI checking its own work
0
Broken links in V2, out of 1,488
ProblemHow it was foundCauseFixTime
No way to see which key was pressedOur review of V1: reference image + requirement to show key pressesThe brief never asked for itA live key panel on every frame09:07
Key panel in the wrong style, with too many keysOur review: the team’s key design imageThe AI inferred the style from a text description13 keys in the team’s D-Pad and Music Control layout; black works here, grey does nothing09:17
Home key didn’t work on every frameOur testing: screenshot + expected Home-key behaviourHome was not wired on Home itself or on several overlaysHome wired on all 111 frames, overlays included09:31 · 09:44
Volume and skip worked once, values never changedOur testing: screenshot + volume-key repeat failureA Figma limit: an open overlay can’t open itself again; the text was fixedTwo copies, A and B, swap on each press and restart the 1.5 s timer; volume (0–15) and titles bound to variables09:32
Overlays covered the big speed on HomeAI self-check against rule NN-2Overlay placed over the speed areaSwitch to the small-speed layout before showing an overlay09:33–09:44
Riding state always 0 mph in NAI self-check during the fix and polishing passesOnly the parked state had been builtA riding variable: 45 mph in gear 409:33–09:44
Map could not zoomAI self-check during the full fix pass↑ / ↓ not wired on the mapZoom levels 1–5, with no effect past either end09:33
Ride Modes only switched on and offAI self-check during the full fix passCustom modes not builtCustom A / B copy the seven settings of another mode09:33
Some Settings links did nothingAI self-check during the full fix passDead linksAll wired; brightness (the screen dims), software update and info pages added09:33
No state after answering a callAI, during the polishing passCall states missing“On call” tag, music pauses, Play hangs up09:41
Trip order wrongAI check against Harley-Davidson service info and the video’s captionsOur own logic table had the wrong orderOdometer → Trip A → Trip B → Range → Temperature, and the table corrected09:46
Overlays misaligned after scrollingOur testing: screen recording + overlay misalignment reportOverlays align to the window centre, and the frames were tall enough to scrollEvery frame resized to 1600 × 720, so nothing scrolls09:49
Instant cuts between pagesReview feedback: pages fade in layersNo transitions setPages fade 0.3 s, overlays 0.2 s; the system zone stays still09:49

The loop we used for every fix

01Test it like a rider

Press the keys in the order a rider would, on every page and overlay, parked and riding. Not only the expected path.

02Report one problem with evidence

One sentence: on this frame, this key should do this, but does that. Add a screenshot, or a screen recording if anything moves.

03Name what it should match

The real bike, the logic table, or the Figma design. Specifying the real product as the reference is what exposed the incorrect Trip order.

04Check the fix and its neighbours

Re-run the same keys, then the frames around them. A fix to one overlay can break the frame that opens it.

05Write the answer back into the spec

When the bike and our table disagreed, we corrected the table, so the next build starts from the right rule.

Evidence shortens diagnosis

Bugs sent with a screenshot were located in about a minute. With a screen recording, the overlay problem was traced in six seconds.

Some errors originated in our own spec

The wrong Trip order came from our own table. The AI found it only because it was instructed to compare against the real product rather than the spec.

Some bugs were Figma’s

Volume, alignment and nested conditions hit limits of Figma itself. The workarounds are listed in the team kit, so they do not need to be rediscovered.

08 · Result

Version 1 to version 2 in under an hour

V1 · 09:05V2 · final
Frames61111
Link targets9251,488
Frame613 × 495, dashboard only1600 × 720, dashboard + key panel
Seeing the keysNot visible; one key cardLive D-Pad and Music Control panel on every frame, clickable
Home keyDead on HomeWorks on all 111 frames, prompts included
Trip orderOdometer → Temperature → Range → Trip A → Trip BThe bike’s order: Odometer → Trip A → Trip B → Range → Temperature
Volume and skipWorked once; values fixedRepeatable; volume 0–15 and titles update live
Overlays on HomeCovered the big speedSwitch to the small-speed layout first
Riding stateAlways 0 mph, N45 mph, gear 4 while riding
TransitionsInstant cutsPages fade 0.3 s, overlays 0.2 s; the system zone stays still

Final test: with AI vs by hand

For the final test we set the AI build against the same job done by hand in Figma. The AI side is measured from the session log. The by-hand side is estimated from the work counts in the finished file, at typical speeds for an experienced Figma user.

~13×
Faster
~10×
Cheaper
95 min
Our whole build session with AI, people included
~21 h
Estimated by hand
With AI (Claude + Figma connector)By hand in Figma
Time~95 min of clock time for the whole build session, from our first message to V2. That is not the model’s run time: it includes the AI working plus our reading, testing in Figma and writing each next prompt. V1 arrived about 5 min after the file was shared.~21 hours, about two and a half working days
PeopleOne designer directing, reviewing and testingOne designer doing every step
Cost~$83: 95 min of designer time at $40/h, plus a $20/month plan~$840: 21 h at $40/h
CheckingEvery link checked automatically; logic compared against Harley-Davidson service docsA manual click-through, where a wrong link among 1,488 is easy to miss
Later changesA new rule is one message; the AI rewires the affected framesEvery affected frame rewired by hand

How we estimated the by-hand time

TaskVolumeRateTime
Build state frames from the visual page111 frames~3 min each~5.5 h
Wire key triggers and variables~1,300 interactions~20 s each~7.2 h
Draw a key panel for each frame111 panels~2 min each~3.7 h
Check link targets against the tables1,488 targets~5 s each~2.1 h
Fix and re-test——~2.0 h
Total~21 h

The 95 minutes are measured from the session log, from the first message (08:16) to V2 (about 09:54), and cover people and AI together. The by-hand figures are an estimate, not a timed run. Designer time is costed at $40 an hour. Neither side counts the design work done before the build (the screens, the logic tables and the 19 files), which is the same either way, or the write-up afterwards.

All state frames on one page, each with its own key panel.
Fig. 10All state frames on one page, each with its own key panel.
The team’s low-fidelity flow prototype. The AI build followed the same map at full fidelity.
Fig. 11The team’s low-fidelity flow prototype. The AI build followed the same map at full fidelity.

Agree on the format first

Saying “Figma, not web” and showing the key panel up front would have saved a full rebuild.

Generate, don’t hand-mark

Anything derived from the logic should be produced from the logic.

Check against the real thing

Two of the most significant defects originated in our own spec, and only the production bike exposed them.

Let the build fix the spec

Six conflicts between our documents surfaced while building. They now flow back into the tables.

Know the tool’s limits early

Long press, reopening overlays, positioning and nested conditions all need a plan before the prompt.

Keep the decisions human

The AI was fastest when every design choice was already made and written down.

09 · Next

Versions, two ideas, two ways to build, and quality control

The prototype is functional. The following additions will make the next build easier to hand over and the next test more rigorous.

Every version gets a time, a place and a number

During the session the versions only lived in the chat. This is what we had, and how each version will be saved from now on.

VersionWhenWhereWhat it is
V0Oct 27, 2026 · ~08:39An HTML file in the chatA web prototype with a simulator and 79 tests. Not used: the test had to run in Figma.
V1Oct 27, 2026 · 09:05Our Figma file, “HMI Prototype” page61 frames, 925 link targets
V2Oct 27, 2026 · ~09:54The same page, updated in place111 frames, 1,488 link targets, key panels and layered transitions
Version name: number · date and time · place · how it was built · size
V2 · 2026-10-27 09:54 · HMI Prototype page · built with Claude · 111 frames
01Save it in Figma’s version history

Each time a version is accepted, save it under the name above, so any earlier state can be restored.

02Put a version card on the first frame

Version number, date and time, who built it, and what changed since the last one.

03Keep a one-line change log

One line per version in the shared folder, linked to the prompt that produced it.

Two ideas for the next build

Show each transition’s effect on screen

When the prototype changes page, a small caption appears in the corner: “Page → Media · fade 0.3 s · system zone stays still.” Engineers read the motion spec while they watch, instead of inferring it from the animation.

Link every frame to what it was based on

Each frame carries a note with its sources: the Figma screen it was cloned from and the rule IDs it follows (G11, CR08), each as a link. When a reviewer questions a behaviour, the answer is one click away.

Two ways to build, side by side

This time we generated the whole prototype at once and fixed it afterwards. Next time we will build the same thing step by step, confirming each step before moving on, and compare the two.

All at once, then fixStep by step, confirming each step
How it worksOne prompt builds every screen. Testing and fixes come after.Build one part (say, Home and its keys), check it, then move on to the next.
This projectV1 in about 5 minutes, then 13 problems fixed over the next ~50 minutesOur next test
Good forSeeing the whole thing fast, and finding gaps in the brief earlyComplex logic, where one early mistake would be copied into every frame
RiskA mistake spreads to every frame before anyone checks (Home, volume, Trip order)Slower to a first full version, and more messages
What we’ll measureTime to a passing build, number of fixes, broken linksThe same three, so the two can be compared fairly

Quality control: three checks before a version is accepted

Quality control asks one question: does the prototype do what the spec and the real bike say, on every frame? Visual impression alone is not sufficient, so we split it into three checks that each end in a pass or a fail. The AI runs the checks; we review what it flags.

CheckWhat it checksWho does itPasses when
1 · AccuracyEvery key on every frame, against the logic tables and the real bike, in a key-by-screen tableThe building AI fills the table in; a person spot-checks itEvery row matches, or the mismatch is listed and we decide
2 · AI scoreThe whole build, scored against a fixed rubric by a model that didn’t build itA second AI, e.g. DeepSeek for logic or Gemini for the videoEvery item scores 4 of 5 or higher; anything lower comes with a reason
3 · ChecklistThe fixed checklist below, item by item, on every frameThe AI: we hand it the list and it checks the build against each itemEvery item marked Pass, with the frames it checked; we review every Fail

The AI score uses the same five-point rubric every time, so versions can be compared:

Rubric itemScores 5 when
LogicEvery key does what the tables and the real bike say
Visual fidelityScreens match our Figma design: RPM ring, bezel, type, telltales
CoverageEvery page and overlay, parked and riding
LinksNo broken links and no dead ends
Readable for engineersKey panel, transition captions and source links on every frame
Checklist we give the AI, built from what went wrong this time
☐ Home works on every frame, overlays included
☐ Volume and skip respond to repeated presses; values and titles update
☐ Trip order matches the bike: Odometer → Trip A → Trip B → Range → Temperature
☐ No overlay covers the speed (NN-2)
☐ Parked (0 mph, N) and riding (45 mph, 4) states both exist
☐ Overlays line up with the dashboard; no frame scrolls
☐ Pages fade 0.3 s, overlays 0.2 s; the system zone stays still
☐ Every key panel matches its frame’s real interactions
☐ Zero broken links
☐ Version card filled in; change log updated
Prompt we send with the checklist
Check the prototype against this checklist. For each item, answer Pass or Fail, list the frames you checked, and give the evidence: the frame name, or the link that fails. Report first; don’t fix anything until we confirm.

AI scores and AI checks are flags, not verdicts. They tell us where to look; a person decides whether the version passes.

10 · Part two

From a Figma demo to a coded prototype, one layer at a time

The Figma build proved the screens and the wiring. It could not prove the behaviour: no design tool we used can show two prompts competing for the screen, a value pushed past its limit, or which overlay owns the D-pad when three are showing. So we rebuilt the dashboard as a coded prototype, and this time we did what we planned above: step by step, with a checklist written before each build.

01Structure and input logic

The five sections, the main menu, and what every physical input does in every context. Labels and placeholder values only.

02Layout

Every element at its real position and size, with real content and real string lengths, still in greyscale.

03Overlays and variables

Media feedback, interactive prompts, volume and map zoom, and the rules for when they compete for the screen.

04Visual fidelity

Colour, type, icons and gauges matched to the reference within a stated tolerance. In progress.

Each layer is specified, built by AI and checked before the next one is added, and every earlier check runs again on every new version. A better layout that breaks the menu counts as a step backwards.

Live prototype · keyboard or click
The coded prototype runs in the browser, with its test interface open: state readout, event log and state inspector.
Open the prototype ↗

11 · Process

Six documents between a brief and a build

Before any code, the team turned a one-page brief into a behaviour specification that an AI could build from without guessing. We split the work into six stages. Each stage answers one question and hands a defined output to the next. The order matters: an AI fills every gap it is given, so each gap had to be closed, or written down, before it started.

  1. 00 Known unknownsWhat can we not observe?→
  2. 01 ContextWho rides, and what is on the dash?→
  3. 02 Data mapWhat matters most?→
  4. 03 States & routingWhat happens on every input?→
  5. 04 Spec → ChecklistBuild it, then prove it
StageQuestion it answersOutputUsed by
00 Known unknownsWhich behaviours can we not observe, and must decide later?A running list of open questions, 16 by the end, each with an IDEvery later stage: closed, or carried forward by ID
01 ContextWho is the rider, what is on the dash, and what must never break?Persona; inventories of 5 pages, 4 overlay classes and 27 controls; non-negotiables; out of scopeData map, routing tables, checklist
02 Data mapWhat does the rider need to see, and how urgently?80 information items ranked P0–P2, each with its evidenceScreen zones, protected area, overlay priority
03 States & routingWhen a button is pressed or the system reports something, what happens?7 linked tables and shared notes, 178 rowsThe spec the AI builds from
04 SpecHow is the behaviour built and logged?Spec with rule IDs, the coded prototype and its AI auditChecklist, verification
ChecklistDoes the build behave as specified?109 tests traced to 111 requirementsTeam sign-off

12 · 00–01 Define

Write down what we don’t know, then who we design for

The first document was a list of questions, not answers: how many overlays can show at once, what happens when a higher-priority one arrives, whether Home dismisses an active prompt, whether holding the D-pad scrolls, how long media feedback stays. We kept it open through every stage. By the end it held 16 items, each with an ID that later tables could cite, so nothing undecided was presented as fact.

16
Known unknowns, tracked by ID
5
Pages in the loop
27
Physical controls
4
Overlay classes

Who we design for

Carson, 27, commutes through New York every day and rides out of the city at weekends. He uses navigation and music on most rides and wants speed, gear, ride mode, directions and warnings at a glance. Every priority call later in the process was checked against one question: does this help Carson keep his eyes on the road?

Non-negotiables

RuleWhat it means for the build
Protected informationSpeed, gear, ride mode and cruise status stay visible. No page, menu or notification may cover them.
One modal at a timeA second modal cannot stack on the first. Simultaneous events follow a defined priority rule.
Safety firstSafety warnings outrank modal prompts, which outrank temporary feedback. Feedback closes on its own.
Moving vs. stoppedWhile moving, riding information outranks interaction, and tasks that need sustained attention are held back.
Consistent D-padFocus is always visible, and the same direction means the same thing in every section.

Out of scope, on purpose

Only two vehicle states are built: engine running while stationary, and engine running while moving. Boot, engine-off, accessory mode, shutdown, service screens, Bluetooth pairing and the full Settings tree are excluded, so the build and test effort goes where riding happens.

The documents

00 Known unknowns
00 Known unknowns. The open questions we started from, kept open through every stage.
01 Context
01 Context. Persona, section inventory and, further down, controls, overlays and non-negotiables.

13 · 02 Data map

80 pieces of information, ranked by urgency

We listed every piece of information the screen can show and gave each a relative importance, a display area and its evidence. P0 is critical riding information or an immediate warning; P1 is feedback on an active task; P2 is supporting information or configuration. The ranking decides what goes into the protected zone and which overlay wins a conflict.

P0 · critical14
P1 · active task26
P2 · supporting40
80
Information items
68
Documented by the OEM
12
To confirm with OEM / firmware
21
Sections and sub-sections

Evidence is labelled on every row. 68 items are documented in Harley-Davidson’s own material (the 2022 infotainment manual and 2021 product information); 12 come from reference images and are flagged for confirmation. The Source column uses the same names as the System Event Table, so design and engineering refer to the same signal.

The document

02 Data map
02 Data map. Each item with its section, function, signal, importance, display area and evidence.

14 · 03 States & routing

Seven tables that answer one question

“When the rider presses a button, or the system reports something, what happens on the screen?” We split that question into seven tables and a shared notes file. Before prompting any AI, each table got four answers written by hand: what it is, what it collects, why it is needed, and who would provide and use it in a real programme.

TableWhat it answersRowsReal programme: from → to
Input routing matrixWhat each input does in each context29Switchgear, UX → cluster software, test
Button guard tableWhen a working input must be ignored26Functional safety, control units → interlocks, negative tests
State transition tableEvery state change, its trigger and guard65UX, system engineering → state machine, coverage tests
System event tableWhat happens without a button press23Control units, phone, navigation → event handlers
Overlay registryEvery overlay’s zone, priority, layer and timeout8UX, homologation → graphics layers
Overlay conflict rulesWho wins when two overlays compete14UX, safety, product owner → overlay manager
List item type overridesD-pad behaviour per type of list item13Design system → list component

How we worked with AI

  1. 1 · ThinkWhat, why, who uses it→
  2. 2 · StructureColumns, IDs, naming→
  3. 3 · PromptOne shared context, one prompt per table→
  4. 4 · CheckFour layers of review→
  5. 5 · FinaliseOne file per table

Three rules kept the output honest. The AI could use only three sources: the professor’s templates, the Figma file “HMI Analysis V2026.1” and the brief. Every row carries a Basis: Template, a Figma frame, Assignment, or Proposed. And an unknown value is written as TBD and added to the known unknowns instead of being guessed.

Four layers of checking

LayerHow it works
1 · TraceabilityEvery row names its source. Anything without one is marked Proposed, so a team decision is never mistaken for a fact.
2 · Source checkThe AI’s Figma claims were compared with the file: screen zones, overlays, D-pad affordances and the button icon on every wireflow arrow.
3 · Automated checks21 scripted checks, for example: every cross-reference resolves, all 27 controls are routed, no routing cell is empty, every overlay is opened and closed somewhere.
4 · Scenario walk-throughsWe “rode” through cases and followed the rows: the phone rings with the menu open; Volume during a prompt; starting to move inside Settings.
11
Problems found in the first AI version
11
Fixed
21 / 21
Automated checks pass
178
Rows across seven tables
Problem in the AI versionFix
Incoming call and system warning both had priority 1, with no tie ruleRule CR14: the visible one stays, the newer one is queued
Full-screen media feedback hid the page, yet the D-pad still acted on itRule CR13: an HMI press first dismisses the feedback, then is routed
Pressing Set while cruise was suspended was undefinedNew transition: Set while suspended stores the current speed
The rider could switch off the ride mode in useNew guard G26
Entering Settings while already moving had no rowNew transition: show the “hidden while riding” pill

Carried forward as known unknowns: the main menu covers the speed band in Figma, which conflicts with a non-negotiable (KU02); there is no Figma screen for an active call (KU04); timeouts other than the menu’s 2 s are not specified (KU07).

The hardest part was judging AI output in an unfamiliar technical domain. What worked was starting from purpose rather than content: what is this table for, who hands us the information, and who relies on the result?

How the tables connect

Five inputs feed the seven tables; 04 Specs and the AI coding tool read them, and gaps flow back to 00 Known unknowns
Five inputs feed the seven tables; 04 Specs and the AI coding tool read them, and gaps flow back to 00 Known unknowns.

The documents

Thinking-process document
Thinking-process document. Scope, the three sources the AI was allowed to use, then the reasoning for each table.
Input routing matrix
Input routing matrix. Every input and gesture against every context, with guard references such as G09.
Button guard table
Button guard table. Each condition under which a working input is ignored, with its reason and basis.
State transition table
State transition table. Trigger, guard, the property that changes, from and to values, and side effects.
Overlay registry
Overlay registry. Type, modal or not, screen zone, how it opens and closes.
Overlay conflict rules
Overlay conflict rules. CR13 and CR14 were added after the review found gaps.

15 · Structure

Every button, every context, an answer

Before any AI was involved, we hand-built a grey-box clickable flow to record our own understanding. Then we wrote the logic down, so that nothing about the behaviour was left for the AI to invent.

SpecWhat it pins down
Input routing matrixWhat Home, Page, Trip and the five D-pad directions do in every context, including long presses. Every cell has an answer, and “no action” counts as one.
State transitionsHow the main menu opens, how focus moves, how it closes and when it times out; how the secondary content on Home cycles.
Button guardsInputs that change with riding state, such as Settings being locked while the bike is moving.
Known unknownsAnything the reference could not confirm, recorded with the rule we proposed, so the AI never has to guess.

Every empty cell in a spec is a decision AI makes for you, and it won’t tell you.

16 · Layout

AI measures. People define the meaning.

AI extracted the position, size and content of every element from the vector reference. What no tool can read off a file is what each element shows and when it changes, so that part was ours: for every row, the value it is linked to and the events that change it.

RuleWhy it matters
Real content, real lengths“124.6 mi”, not “value”. A box that fits a placeholder can still overflow with a real number.
Both unit systemsEvery number field is specified in imperial and metric with a shared notation, down to its longest possible string and its no-data text. A field sized for “mpg” overflows in “L/100 km”.
Tolerance firstThe allowed error in pixels is written down before checking, not after.
Nothing clippedA round display cuts off anything near its edge, so “nothing clipped by the circle” is its own check.
Measured, not eyeballedA short console script reads every element’s box and compares it with the layout table, alongside a 50% overlay on the reference.

17 · Overlays

Who owns the D-pad?

Overlays are where the logic gets hard. A prompt, a media confirmation and the main menu can all be on screen at once, and only one of them can take the buttons. This behaviour exists only in the coded prototype.

CaseWhat the spec decides
Two prompts at onceWhich one shows and which one waits. The state readout shows both, live.
Feedback replaces feedbackA new media confirmation replaces the one showing, and each disappears by itself.
Prompt, feedback and menu togetherLayer order, and which overlay receives the D-pad in every combination.
A value at its limitVolume at maximum, volume up pressed. Feedback shows the value (“Volume 7”), not the action (“Volume up”).

Each overlay has an entry in a registry (layer, priority, whether it takes the D-pad, whether it dismisses itself, its timeout), backed by explicit conflict rules.

18 · Verification

109 checks, 0 failures, 2 open with their cause

Every AI-built version is a single file with a built-in test interface: a state readout, an event log and a state inspector. Each logged event carries a rule ID that points back to the spec, so a failure can be traced to the rule it breaks.

109
Checks
107
Passed
0
Failed
2
Open, cause recorded
RoundMethod and result
Round 1Run in the live prototype with real clicks and key presses, each result checked against a screenshot, the event log timestamps and the state inspector. 90 checks, all passed.
Round 2The press-and-hold cases a browser extension cannot perform, run in a scripted Chrome session (Playwright) with genuine holds of a set duration, including 56 verified auto-repeat key events. 17 checks, all passed.
Open2 checks, each documented with why it could not be run and what it needs.

The team ran the same checklist themselves, on the same version. Wherever both ran a check, they reached the same result: 107 of 107. The team closed one of the AI’s open checks (G-108) by comparing the build against the design file, which the AI did not have.

Checklist · 109 checks · AI and team resultsRead-only copy of the test workbook, Nov 10, 2026
IDAreaWhat is checkedExpected resultAI runTeam run
G-01Pages & menuPage opens the menu on the next pageThe round menu appears with the Navigation (map pin) button in the middle. The big Home speed shrinks to the top band.✓ Pass✓ Pass
G-02Pages & menuPage steps through all five pages in order and wrapsNavigation → Media → Bike status (motorcycle) → Settings (gear) → Home (house).✓ Pass✓ Pass
G-03Pages & menuRight moves to the next page in the menuMiddle button changes from Navigation to Media.✓ Pass✓ Pass
G-04Pages & menuLeft moves to the previous page and wraps from Home to SettingsFirst Left: Home. Second Left: Settings.✓ Pass✓ Pass
G-05Pages & menuOK closes the menu and stays on that pageMenu disappears immediately. The page title at the bottom reads “Media”.✓ Pass✓ Pass
G-06Pages & menuMenu closes by itself after about 3 sMenu still there at about 2 s, gone by about 3.5 s. The page behind shows “Bike status”.✓ Pass✓ Pass
G-07Pages & menuEach Page / Right press restarts the 3 s countdownMenu stays about 3 s after the SECOND press (about 5 s in total), not 3 s after the first.✓ Pass✓ Pass
G-08Pages & menuUp / Down in the menu do nothing and do not extend the countdownThe middle button stays Navigation. Menu still closes about 3 s after Page (Up/Down did not keep it open).✓ Pass✓ Pass
G-09Pages & menuHome with the menu open goes to HomeMenu closes and the Home screen (big speed + Odometer window) is shown.✓ Pass✓ Pass
G-10Pages & menuHome from another page goes to HomeHome screen shown, no menu.✓ Pass✓ Pass
G-11Pages & menuHome on the Home screen does nothingNothing changes on the dash.✓ Pass✓ Pass
G-12Pages & menuEach page shows its own placeholder pageTitles: Navigation, Media, Bike status, Settings. (Page contents are placeholders: out of scope.)✓ Pass✓ Pass
G-13Pages & menuSettings while moving shows the riding message“Settings are hidden while riding” appears at once. Speed shows 35, gear 3.✓ Pass✓ Pass
G-14Pages & menuThe riding message has no timeoutThe message is still shown.✓ Pass✓ Pass
G-15Pages & menuStopping removes the riding messageThe message disappears immediately. Speed 0, gear N.✓ Pass✓ Pass
G-16Pages & menuThe riding message only applies to SettingsNo “Settings are hidden” message on any of them.✓ Pass✓ Pass
G-17ThemeDark theme by defaultDark theme (black background).✓ Pass✓ Pass
G-18ThemeHolding Home 5 s switches to the light theme without leaving the pageDash turns light. You stay on Navigation (no jump to Home).✓ Pass✓ Pass
G-19ThemeThe theme changes at 5 s, while Home is still heldThe theme changes when the bar fills (about 5 s), before you let go.✓ Pass✓ Pass
G-20ThemeHolding Home again switches back to darkDark theme again.✓ Pass✓ Pass
G-21ThemeA Home hold shorter than 5 s is a normal Home pressTheme does NOT change. On release you go to Home.✓ Pass✓ Pass
G-22ThemeThe theme hold works while a prompt is shown; the prompt staysTheme changes. The call prompt is still there.✓ Pass✓ Pass
G-23ThemeThe theme hold works with the menu openTheme changes (the menu may close on its own 3 s timer meanwhile; that is expected).✓ Pass✓ Pass
G-24ThemeThe telltale strip stays dark in the light themeThe strip is still black; only the rest of the dash is light.✓ Pass✓ Pass
G-25Trip windowHome shows Odometer first“Odometer 001236 mi”.✓ Pass✓ Pass
G-26Trip windowTrip steps through the five items in orderRange → Temperature → Trip A → Trip B → Odometer.✓ Pass✓ Pass
G-27Trip windowDown on Home shows the next itemRange.✓ Pass✓ Pass
G-28Trip windowUp on Home shows the previous item (wraps)Trip B.✓ Pass✓ Pass
G-29Trip windowHolding Trip 1 s resets Trip ATrip A becomes 0.0 at about 1 s, while still holding.✓ Pass✓ Pass
G-30Trip windowHolding Trip 1 s resets Trip BTrip B becomes 0.0.✓ Pass✓ Pass
G-31Trip windowReleasing after a reset does not also move to the next itemWindow still shows Trip A (0.0).✓ Pass✓ Pass
G-32Trip windowHolding Trip on Odometer or Range changes nothingOdometer and Range values unchanged; the item does not move on release.✓ Pass✓ Pass
G-33Trip windowA quick Trip press (under 1 s) moves to the next itemRange.✓ Pass✓ Pass
G-34Trip windowTrip does nothing while the menu is openWindow still shows Odometer.✓ Pass✓ Pass
G-35Trip windowTrip does nothing on other pagesWindow still shows Odometer.✓ Pass✓ Pass
G-36Trip windowThe trip item is remembered after leaving HomeWindow shows Temperature.✓ Pass✓ Pass
G-37Trip windowLeft, Right and OK on Home do nothingNothing changes.✓ Pass✓ Pass
G-38Trip windowTrip still works while a prompt is shownWindow shows Range.✓ Pass✓ Pass
G-39Trip windowUp/Down go to the prompt, not the trip windowWindow still shows Odometer.✓ Pass✓ Pass
G-40Buttons & routingA short press acts when you release itNothing while held; the menu opens on release.✓ Pass✓ Pass
G-41Buttons & routingHolding a button does not repeat (Page)Menu moved only one step (Navigation).✓ Pass✓ Pass
G-42Buttons & routingHolding Right in the menu moves only onceMedia (one step), not further.✓ Pass✓ Pass
G-43Buttons & routingWhile Home is held, Page is ignoredNo menu opens.✓ Pass✓ Pass
G-44Buttons & routingMedia buttons still work while Home is heldVolume feedback “13” appears.✓ Pass✓ Pass
G-45Buttons & routingA prompt takes the D-pad before the menuRight: menu does not move. Up: fuel prompt closes; the menu (Navigation) is still there.✓ Pass✓ Pass
G-46Buttons & routingD-pad does nothing on Media, Bike status, SettingsNothing changes.✓ Pass✓ Pass
G-47Buttons & routingLeft, Right, OK do nothing on NavigationNothing changes.✓ Pass✓ Pass
G-48Buttons & routingVoice changes nothing on screenNothing changes.✓ Pass✓ Pass
G-48bButtons & routingSwitching away while holding a key does not leave it stuck (simulator only)No menu appears from the lost press; the next P opens the menu normally.○ Not run– Not marked
G-49Volume & zoomVol + raises volume by 1 and shows the numberSpeaker panel with 13 (the value, not “Volume up”).✓ Pass✓ Pass
G-50Volume & zoomVol − lowers volume by 1Speaker panel with 11.✓ Pass✓ Pass
G-51Volume & zoomVolume stops at 30Shows 30 and stays 30; the panel is still shown and lasts about 3 s from the last press.✓ Pass✓ Pass
G-52Volume & zoomVolume stops at 0Shows 0 and stays 0.✓ Pass✓ Pass
G-53Volume & zoomUp on Navigation zooms in by 1Panel “Zoom 6”; the small map label reads “Zoom 6”.✓ Pass✓ Pass
G-54Volume & zoomDown on Navigation zooms out by 1Panel “Zoom 4”.✓ Pass✓ Pass
G-55Volume & zoomZoom stops at 10Shows 10 and stays 10 (panel still shown).✓ Pass✓ Pass
G-56Volume & zoomZoom stops at 1Shows 1 and stays 1.✓ Pass✓ Pass
G-57Volume & zoomNo zoom on other pagesNo panel on Media; map label still “Zoom 5”.✓ Pass✓ Pass
G-58Volume & zoomZoom level is rememberedMap label “Zoom 7”.✓ Pass✓ Pass
G-59Volume & zoomThe map grid grows with zoom; the D-pad hint shows zoom in/outGrid squares are bigger. D-pad hint: zoom-in on Up, zoom-out on Down.✓ Pass✓ Pass
G-60Volume & zoomNo zoom while the menu is openNo zoom panel; label still “Zoom 5”.✓ Pass✓ Pass
G-61Volume & zoomNo zoom while a prompt is shownNo zoom panel; label still “Zoom 5”.✓ Pass✓ Pass
G-62FeedbackPlay/Pause shows Play, then PausePlay icon, then Pause icon.✓ Pass✓ Pass
G-63FeedbackSkip forward shows NextNext (⏭) icon.✓ Pass✓ Pass
G-64FeedbackSkip back shows PreviousPrevious (⏮) icon.✓ Pass✓ Pass
G-65FeedbackFeedback disappears by itself after about 3 sShown at 2 s, gone by about 3.5 s.✓ Pass✓ Pass
G-66FeedbackA new feedback replaces the old oneOnly the volume panel (13) is shown; no Next icon behind it.✓ Pass✓ Pass
G-67FeedbackRepeated presses restart the 3 s countdownPanel (14) lasts about 3 s after the second press.✓ Pass✓ Pass
G-68FeedbackFeedback does not block the D-padTrip window shows Range.✓ Pass✓ Pass
G-69FeedbackMedia presses do not keep the menu openThe menu is gone (it closed at 3 s under the panel).✓ Pass✓ Pass
G-70FeedbackFeedback covers the menu; the menu comes back when the feedback goesVolume panel on top of the menu; when it disappears the menu (Navigation) is visible again.✓ Pass✓ Pass
G-71FeedbackFeedback and a prompt together: prompt on top, still answerableCall prompt drawn above the volume panel. Down declines the call.✓ Pass✓ Pass
G-72FeedbackZoom and volume share one panelZoom 6 → Volume 11 → Zoom 5; only one panel at a time.✓ Pass✓ Pass
G-73FeedbackMedia feedback works on every pageNext icon on every page.✓ Pass✓ Pass
G-74PromptsIncoming call shows; OK answersPrompt “Incoming call – Mom”, ✓ on OK and ✕ on Down. After OK it closes; inspector callState = ACTIVE.✓ Pass✓ Pass
G-75PromptsDown declines the callPrompt closes; callState = IDLE.✓ Pass✓ Pass
G-76PromptsOther keys do nothing while the call prompt is upPrompt stays; nothing else changes (trip window still Odometer after declining).✓ Pass✓ Pass
G-77PromptsA prompt stays until handled (no timeout)Still shown.✓ Pass✓ Pass
G-78PromptsLow fuel: Up dismisses; warning light and gauge stay low✕ shown on Up. Prompt closes; low-fuel light stays lit; fuel gauge nearly empty.✓ Pass✓ Pass
G-79PromptsLow oil pressure: OK acknowledges; light stays onPrompt closes; oil light stays lit.✓ Pass✓ Pass
G-80PromptsLow tire pressure: OK acknowledges; light stays onPrompt closes; tire-pressure light stays lit.✓ Pass✓ Pass
G-81PromptsIncoming text: OK dismissesPrompt closes.✓ Pass✓ Pass
G-82PromptsA more important prompt replaces the current one, which is droppedCall replaces fuel. After declining, NO fuel prompt comes back.✓ Pass✓ Pass
G-83PromptsA call replaced by a more important prompt counts as missedOil prompt shown; callState = IDLE.✓ Pass✓ Pass
G-84PromptsA less important prompt waits and shows “+1”“+1” on the call prompt; after Down the text prompt appears.✓ Pass✓ Pass
G-85PromptsWaiting prompts come back most important firstAfter oil: Low tire, then the text.✓ Pass✓ Pass
G-86PromptsOnly one prompt is ever visibleOne prompt (Low oil) with “+4”.✓ Pass✓ Pass
G-87PromptsThe same prompt twice is ignoredLow oil with “+1” (not +2).✓ Pass✓ Pass
G-88PromptsA second call is ignored while on a callNo new prompt.✓ Pass✓ Pass
G-89PromptsCaller hanging up removes the call promptPrompt gone.✓ Pass✓ Pass
G-90PromptsCaller hanging up removes a waiting call too“+1” disappears; after OK nothing follows.✓ Pass✓ Pass
G-91PromptsActive call endscallState = IDLE; nothing on the dash.✓ Pass✓ Pass
G-92PromptsRefuel removes the low-fuel prompt and lightPrompt and light gone; then the “+1” disappears.✓ Pass✓ Pass
G-93PromptsA prompt arriving while the menu is open takes the D-pad; the menu still times outRight does nothing to the menu. Menu closes about 3 s after Page; text prompt stays.✓ Pass✓ Pass
G-94PromptsWhen the prompt closes, the D-pad goes back to the open menuMenu moves to Media.✓ Pass✓ Pass
G-95PromptsHome during a prompt goes Home underneath; prompt staysPrompt stays after Home; after Up the Home screen is shown.✓ Pass✓ Pass
G-96PromptsPage during a prompt opens the menu underneathMenu appears under the prompt; Right does not move it.✓ Pass✓ Pass
G-97PromptsKey hints on each promptOil / Tire: ✓ on OK. Call: ✓ OK, ✕ Down. Fuel: ✕ Up. Text: ✕ OK.✓ Pass✓ Pass
G-98PromptsOn Navigation only the prompt's key hint is visibleOnly the prompt hint (✕ on Up); the map's zoom hint is not visible.✓ Pass✓ Pass
G-99DisplayWarning lights are never coveredEvery warning icon in the bottom strip is lit and fully visible above the menu, panel and prompt.✓ Pass✓ Pass
G-100DisplaySpeed, gear, ride mode visible with the menu open35, MPH, gear 3 and the ride-mode icon visible on top.✓ Pass✓ Pass
G-101DisplaySpeed, gear, ride mode visible with feedbackSpeed, gear, ride mode visible above the panel.✓ Pass✓ Pass
G-102DisplaySpeed, gear, ride mode visible with a promptSpeed, gear, ride mode visible above the prompt.✓ Pass✓ Pass
G-103DisplaySpeed, gear, ride mode visible with the Settings messageSpeed, gear, ride mode visible; message does not cover them.✓ Pass✓ Pass
G-104DisplaySpeed and gear do not move between pages and overlaysSpeed and gear stay in exactly the same place in all of these.✓ Pass✓ Pass
G-105DisplayBig Home speed only on Home with no overlayBig → small → big → small → big.✓ Pass✓ Pass
G-106DisplayMoving / stopped values0 N → 35 3 → 0 N.✓ Pass✓ Pass
G-107DisplayTelltale buttons light their iconsFive icons light up; check engine goes grey again.✓ Pass✓ Pass
G-108DisplayMatches the reference design fileSame placement, sizes and icons; differences only as listed in the spec.○ Not run✓ Pass

19 · Checklist design

One behaviour per row, one box per test, every rule covered

The checklist is the team’s half of the verification. We wrote it so that anyone in the group could open it, run it against the prototype and reach the same result as the next person, without reading the spec first. Building version 3 took 15 minutes; running the full checklist on it took 5.

15 min
To build version 3
5 min
To run the checklist
109
Tests, 108 passed, 0 failed
0
Requirements without a test

In the latest team run, on version 3 after audit fix PR-24, 108 of 109 tests passed and none failed. One was left unmarked: G-48b, which checks that switching away while holding a key does not leave it stuck, a case that only applies to the browser simulator.

How it is connected

  1. SpecEvery rule has an ID→
  2. AI audit111 requirements checked by the AI (AUDIT.md)→
  3. CoverageEach requirement lists the tests that prove it→
  4. Group checklist109 tests run by people→
  5. SummaryCounts update as boxes are ticked

Design choices, and why they work

ChoiceWhat it doesWhy it works
Same starting pointEvery test begins with “Click Reset prototype.” in its own Setup column.Results do not depend on test order or on what the previous tester left behind.
Exact actionsKeys and timings are written out: “Press Page 5 times quickly (less than 3 s apart)”, “hold H for 5 s”, count “one-thousand-one”.Two people do the same thing, so a difference in result means a difference in the build.
One visible resultThe expected result describes what is on screen, in the words the screen uses.Pass or fail becomes a comparison, not an opinion.
One box per rowPass, Fail or Not tested, chosen from a dropdown. A failure needs a note on what was seen.The Summary counts rows with more than one tick; it must stay at 0, so slips show up at once.
Linked audit IDsEach test names the requirement it proves (PG-, TH-, TR-, IN-, VR-, FB-, PR-, DS-).A failed test points straight at the rule it breaks.
Coverage sheetEvery requirement lists its tests, with a formula count of tests and ticks.“Requirements with no group test” must be 0, so no rule is left untested. Out-of-scope items are marked on purpose.
Blank by defaultAll boxes start empty, even where the AI audit already passed.The sheet records what people saw, not what the AI reported: a second, independent check.

109 tests across eight areas

Prompts25
Pages & menu16
Trip window15
Volume & zoom13
Feedback12
Buttons & routing10
Display10
Theme8

The 111 requirements come from four sources, and the Coverage sheet labels each one: 36 instructor requirements, 18 from second-hand instructor sources, 19 decisions the team agreed on, and 31 design assumptions. Seven more are marked out of scope on purpose. Labelling the source shows which results answer the brief and which ones test our own assumptions.

The workbook

Checklist sheet
Checklist sheet. Setup, actions and the expected result for each test, with one box per row.
Coverage sheet
Coverage sheet. Each requirement with its source, AI audit status and the group tests that cover it.
Summary sheet
Summary sheet. Counts update as testers tick; the two guard rows must stay at 0.

20 · Limits

Where AI testing stopped, and what took over

The open checks are as useful as the passed ones: they show exactly where an AI tester needs another tool, a real machine or a person.

LimitWhat happenedWhat took over
Tool limitThe browser extension can only send an instant press and release, so hold-to-act inputs could not be tested.A different tool: scripted Chrome with real holds. Resolved.
Real operating systemOne check needs the page to lose focus when another window is activated. In the cloud browser, the blur event never fired.A person, on a real computer: a manual Cmd+Tab test.
Missing sourceOne check compares the prototype with the design file and the written spec, which the tester did not have.The team: supply the files or run the comparison by hand.

Decide before you delegate

The spec and the checklist come before the build. AI is fast at building to a definition and unreliable at inventing one.

Numbers from AI, meaning from people

Extraction gives positions and sizes. What each element is for, and when it changes, has to be written by someone who understands the product.

Never accept “done” without a run

Every version runs the full checklist, old items included, and every check names how it was verified.

Next for part two

Finish visual fidelity within a stated tolerance and re-run every check, since real typefaces change how wide strings are; check each version both by AI and by a person and count where they agree, by type of check; and close the two open checks.

21 · Try it

The prototype the checklist was run on

Version 3 of the coded prototype, embedded and fully working. Click inside the frame first. Use the on-screen buttons or the keyboard: arrow keys for the D-pad, Enter for OK, P for Page, H for Home, T for Trip, Space for Play/Pause, [ and ] to skip, − and = for volume. The System events panel sends calls, warnings and “start moving”; Reset prototype starts again.

Credits

Project
Sportster S HMI prototype by Julianne Henry, Jingwen Li and Xiaolu Xi
Design and specs
The team: visual system, HMI zoning, physical-control mapping and the seven logic tables
AI workflow
All three of us, together: research, model comparison, prompts, Figma build with Claude, testing, prompt archive and team kit
References
Harley-Davidson service information and owner’s manual; Sportster S infotainment tutorial video
Year
2026