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

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
AI 没有替我们设计仪表,它把我们的设计决定执行到了每一个画面。
“The AI didn’t design the dashboard. It carried our decisions into every one of 111 screens.”
What we took away from the projectWho 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.
| Stage | What we did | What the AI did |
|---|---|---|
| Before the build | Designed 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 up | Chose 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. |
| Building | Sent 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 fixing | Tested 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. |
| Deciding | Decided 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. |
| Afterwards | Ran 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.
To test it. A prototype is not the product; it is the lowest-cost artifact that can be put in front of users.
To validate the concept before committing to building the real product.
Because only a sound product creates business value. A test that catches a weak concept early prevents a costlier mistake later.
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 asked | What the AI did | Why it was out of scope |
|---|---|---|
| A request for a “perfect” interactive prototype, with no tool specified | A full HTML prototype with a simulator, an event log and 79 automated tests | The 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 image | Inferred a style and removed 10 keys | The AI, rather than the team, determined what the test would show. |
| Continue fixing against the spec files, no target named | Six fixes against the spec | The intended reference was the video; the AI selected its own. |
| Fix-all request, with no list or priority | Eight fixes, chosen by the AI | The fixes were useful, but the AI rather than the team set the priorities. |
| A request for every issue encountered, with no scope defined | Started with environment and permission problems | The 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.
| Model | How it worked | What came back | Best 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 |
| ChatGPT | Given 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 |
| DeepSeek | Could 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 |
| Gemini | Could 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 |



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 needed | Claude | ChatGPT | DeepSeek | Gemini |
|---|---|---|---|---|
| Work inside our Figma file | Yes. 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 itself | Strongest 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 edit | Figma 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 do | Work 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 app | Google 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.
| Question | Claude | ChatGPT | DeepSeek | Gemini |
|---|---|---|---|---|
| Remembers you across chats | Yes. “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 memory | Incognito chat | Temporary Chat | Not needed: chats don’t carry over | Temporary chat |
| When a chat gets very long | Compacts 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.
| Question | Claude | ChatGPT | DeepSeek | Gemini |
|---|---|---|---|---|
| What it can access | Through 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 kept | Anthropic’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 off | Settings → 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.
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.
Nineteen files, Excel tables, screenshots and a video. Check that the model accepts all of them, not just the text.
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.
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.
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.
| Stage | Time | Messages | Result | What was missing |
|---|---|---|---|---|
| 1 · Build the prototype | 08:16–08:58 | 12 | △ built twice | Which tool (Figma, not a web page); edit access to the file |
| 2 · Key panel | 09:07–09:17 | 6 | △ redone three times | The team’s key design image; which keys to keep |
| 3 · Check the logic | 09:25–09:29, 09:46 | 4 | △ | What to compare against; the video link |
| 4 · Fix bugs found in testing | 09:31–09:44 | 5 | ✓ | Priority order |
| 5 · Alignment and transitions | 09:49–09:54 | 3 | ✓ | Which layers animate, and how long |
| 6 · Write-up | 14:54–15:21 | 6 | △ corrected once | Scope: 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.
- 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)
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
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.
One line on who the AI is and what “done” means.
A Step 0: which pages and files to read, and a short research summary before any building.
What wins when sources conflict: the prompt, then the tables, then Figma; the real bike over the tables where we said so.
Colours, type, sizes and zones as tokens, copied from the design file, not described from memory.
Every rule tagged with its table ID (G11, CR08, E16), so the AI can cite it and we can check it.
Four non-negotiables, such as “the telltale zone is never covered.”
Exact formats, frame names and where to build, plus “output the full code, never ‘same as above’.”
Fourteen tests written as things you can press and watch, not adjectives like “perfect.”
Prompts that worked
| What we sent | Why it worked | The pattern |
|---|---|---|
| 19 spec files + the Figma link, up front | The 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 design | A single image replaced several rounds of verbal description. | For style, send the design, not words. |
| Screenshot + the expected Home-key rule on a specific frame | A specific frame, a specific key and the expected rule. | “On X, key Y should Z, but it does W.” |
| Screenshot + reproducible volume-key failure | A repeatable step and a visible symptom led straight to a Figma limit. | Write what you did, then what happened. |
| Screen recording + overlay misalignment report | The AI found the cause frame by frame in six seconds. | Record anything that moves. |
| Review feedback: pages use layered fade transitions | Context 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
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 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.
Nine labelled fields (task, access, sources, references, must have, do not, acceptance, context). Complete all fields and send as a single message.
One sentence: on this frame, this key should do this, but does that. Screenshot or recording attached.
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.
Written once and reused: the real product, then the brief, then the tables, then Figma. Anything undecided goes in an assumptions list.
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.
Documented Figma limitations and their workarounds, so they do not need to be rediscovered.
A key-by-screen table and 14 acceptance tests the AI fills in, and we re-run after every change.
Every session logged with ✓ △ ✗ and a rewritten version of each weak prompt. The archive is how the kit improves.
The prompt template
[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>



Figma limits, and what we did instead
| Symptom | Cause | Workaround |
|---|---|---|
| Volume key responded only to the first press | An overlay can’t reopen itself | Two copies (A and B) that swap on each press, restarting the 1.5 s timer |
| Volume number and song title never changed | Frames hold fixed text | Text and bar widths bound to variables |
| A condition inside a condition | Only one level of if/else | Flatten into one level joined with AND |
| Overlays slid off the dashboard | Overlays centre on the window; tall frames scroll | Every frame 1600 × 720, so nothing scrolls |
| No long-press trigger | Figma has key down, click and timeout only | Shift+T stands in for holding Trip |
| Vehicle keys multiplied the frame count | Every cruise and turn state needs its own frames | Kept 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.
| Mistake | What happened | Instead |
|---|---|---|
| Opening with a greeting and no task | An entire exchange with no usable information. | Send the task, the materials and the requirements together. |
| Never naming the tool | The 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 access | Twenty 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 image | The 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 target | Unclear 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 video | The 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 reference | The 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 hand | Any wiring change made it inaccurate. | Generate it from the frame’s interactions. |
| Interrupting a running step | The 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
| Problem | How it was found | Cause | Fix | Time |
|---|---|---|---|---|
| No way to see which key was pressed | Our review of V1: reference image + requirement to show key presses | The brief never asked for it | A live key panel on every frame | 09:07 |
| Key panel in the wrong style, with too many keys | Our review: the team’s key design image | The AI inferred the style from a text description | 13 keys in the team’s D-Pad and Music Control layout; black works here, grey does nothing | 09:17 |
| Home key didn’t work on every frame | Our testing: screenshot + expected Home-key behaviour | Home was not wired on Home itself or on several overlays | Home wired on all 111 frames, overlays included | 09:31 · 09:44 |
| Volume and skip worked once, values never changed | Our testing: screenshot + volume-key repeat failure | A Figma limit: an open overlay can’t open itself again; the text was fixed | Two copies, A and B, swap on each press and restart the 1.5 s timer; volume (0–15) and titles bound to variables | 09:32 |
| Overlays covered the big speed on Home | AI self-check against rule NN-2 | Overlay placed over the speed area | Switch to the small-speed layout before showing an overlay | 09:33–09:44 |
| Riding state always 0 mph in N | AI self-check during the fix and polishing passes | Only the parked state had been built | A riding variable: 45 mph in gear 4 | 09:33–09:44 |
| Map could not zoom | AI self-check during the full fix pass | ↑ / ↓ not wired on the map | Zoom levels 1–5, with no effect past either end | 09:33 |
| Ride Modes only switched on and off | AI self-check during the full fix pass | Custom modes not built | Custom A / B copy the seven settings of another mode | 09:33 |
| Some Settings links did nothing | AI self-check during the full fix pass | Dead links | All wired; brightness (the screen dims), software update and info pages added | 09:33 |
| No state after answering a call | AI, during the polishing pass | Call states missing | “On call” tag, music pauses, Play hangs up | 09:41 |
| Trip order wrong | AI check against Harley-Davidson service info and the video’s captions | Our own logic table had the wrong order | Odometer → Trip A → Trip B → Range → Temperature, and the table corrected | 09:46 |
| Overlays misaligned after scrolling | Our testing: screen recording + overlay misalignment report | Overlays align to the window centre, and the frames were tall enough to scroll | Every frame resized to 1600 × 720, so nothing scrolls | 09:49 |
| Instant cuts between pages | Review feedback: pages fade in layers | No transitions set | Pages fade 0.3 s, overlays 0.2 s; the system zone stays still | 09:49 |
The loop we used for every fix
Press the keys in the order a rider would, on every page and overlay, parked and riding. Not only the expected path.
One sentence: on this frame, this key should do this, but does that. Add a screenshot, or a screen recording if anything moves.
The real bike, the logic table, or the Figma design. Specifying the real product as the reference is what exposed the incorrect Trip order.
Re-run the same keys, then the frames around them. A fix to one overlay can break the frame that opens it.
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:05 | V2 · final | |
|---|---|---|
| Frames | 61 | 111 |
| Link targets | 925 | 1,488 |
| Frame | 613 × 495, dashboard only | 1600 × 720, dashboard + key panel |
| Seeing the keys | Not visible; one key card | Live D-Pad and Music Control panel on every frame, clickable |
| Home key | Dead on Home | Works on all 111 frames, prompts included |
| Trip order | Odometer → Temperature → Range → Trip A → Trip B | The bike’s order: Odometer → Trip A → Trip B → Range → Temperature |
| Volume and skip | Worked once; values fixed | Repeatable; volume 0–15 and titles update live |
| Overlays on Home | Covered the big speed | Switch to the small-speed layout first |
| Riding state | Always 0 mph, N | 45 mph, gear 4 while riding |
| Transitions | Instant cuts | Pages 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 |
| People | One designer directing, reviewing and testing | One 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 |
| Checking | Every link checked automatically; logic compared against Harley-Davidson service docs | A manual click-through, where a wrong link among 1,488 is easy to miss |
| Later changes | A new rule is one message; the AI rewires the affected frames | Every affected frame rewired by hand |
How we estimated the by-hand time
| Task | Volume | Rate | Time |
|---|---|---|---|
| Build state frames from the visual page | 111 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 frame | 111 panels | ~2 min each | ~3.7 h |
| Check link targets against the tables | 1,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.


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.
| Version | When | Where | What it is |
|---|---|---|---|
| V0 | Oct 27, 2026 · ~08:39 | An HTML file in the chat | A web prototype with a simulator and 79 tests. Not used: the test had to run in Figma. |
| V1 | Oct 27, 2026 · 09:05 | Our Figma file, “HMI Prototype” page | 61 frames, 925 link targets |
| V2 | Oct 27, 2026 · ~09:54 | The same page, updated in place | 111 frames, 1,488 link targets, key panels and layered transitions |
Each time a version is accepted, save it under the name above, so any earlier state can be restored.
Version number, date and time, who built it, and what changed since the last one.
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 fix | Step by step, confirming each step | |
|---|---|---|
| How it works | One 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 project | V1 in about 5 minutes, then 13 problems fixed over the next ~50 minutes | Our next test |
| Good for | Seeing the whole thing fast, and finding gaps in the brief early | Complex logic, where one early mistake would be copied into every frame |
| Risk | A mistake spreads to every frame before anyone checks (Home, volume, Trip order) | Slower to a first full version, and more messages |
| What we’ll measure | Time to a passing build, number of fixes, broken links | The 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.
| Check | What it checks | Who does it | Passes when |
|---|---|---|---|
| 1 · Accuracy | Every key on every frame, against the logic tables and the real bike, in a key-by-screen table | The building AI fills the table in; a person spot-checks it | Every row matches, or the mismatch is listed and we decide |
| 2 · AI score | The whole build, scored against a fixed rubric by a model that didn’t build it | A second AI, e.g. DeepSeek for logic or Gemini for the video | Every item scores 4 of 5 or higher; anything lower comes with a reason |
| 3 · Checklist | The fixed checklist below, item by item, on every frame | The AI: we hand it the list and it checks the build against each item | Every 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 item | Scores 5 when |
|---|---|
| Logic | Every key does what the tables and the real bike say |
| Visual fidelity | Screens match our Figma design: RPM ring, bezel, type, telltales |
| Coverage | Every page and overlay, parked and riding |
| Links | No broken links and no dead ends |
| Readable for engineers | Key panel, transition captions and source links on every frame |
☐ 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
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.
The five sections, the main menu, and what every physical input does in every context. Labels and placeholder values only.
Every element at its real position and size, with real content and real string lengths, still in greyscale.
Media feedback, interactive prompts, volume and map zoom, and the rules for when they compete for the screen.
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.
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.
- 00 Known unknownsWhat can we not observe?→
- 01 ContextWho rides, and what is on the dash?→
- 02 Data mapWhat matters most?→
- 03 States & routingWhat happens on every input?→
- 04 Spec → ChecklistBuild it, then prove it
| Stage | Question it answers | Output | Used by |
|---|---|---|---|
| 00 Known unknowns | Which behaviours can we not observe, and must decide later? | A running list of open questions, 16 by the end, each with an ID | Every later stage: closed, or carried forward by ID |
| 01 Context | Who 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 scope | Data map, routing tables, checklist |
| 02 Data map | What does the rider need to see, and how urgently? | 80 information items ranked P0–P2, each with its evidence | Screen zones, protected area, overlay priority |
| 03 States & routing | When a button is pressed or the system reports something, what happens? | 7 linked tables and shared notes, 178 rows | The spec the AI builds from |
| 04 Spec | How is the behaviour built and logged? | Spec with rule IDs, the coded prototype and its AI audit | Checklist, verification |
| Checklist | Does the build behave as specified? | 109 tests traced to 111 requirements | Team 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
| Rule | What it means for the build |
|---|---|
| Protected information | Speed, gear, ride mode and cruise status stay visible. No page, menu or notification may cover them. |
| One modal at a time | A second modal cannot stack on the first. Simultaneous events follow a defined priority rule. |
| Safety first | Safety warnings outrank modal prompts, which outrank temporary feedback. Feedback closes on its own. |
| Moving vs. stopped | While moving, riding information outranks interaction, and tasks that need sustained attention are held back. |
| Consistent D-pad | Focus 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
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.
- 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

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.
| Table | What it answers | Rows | Real programme: from → to |
|---|---|---|---|
| Input routing matrix | What each input does in each context | 29 | Switchgear, UX → cluster software, test |
| Button guard table | When a working input must be ignored | 26 | Functional safety, control units → interlocks, negative tests |
| State transition table | Every state change, its trigger and guard | 65 | UX, system engineering → state machine, coverage tests |
| System event table | What happens without a button press | 23 | Control units, phone, navigation → event handlers |
| Overlay registry | Every overlay’s zone, priority, layer and timeout | 8 | UX, homologation → graphics layers |
| Overlay conflict rules | Who wins when two overlays compete | 14 | UX, safety, product owner → overlay manager |
| List item type overrides | D-pad behaviour per type of list item | 13 | Design system → list component |
How we worked with AI
- 1 · ThinkWhat, why, who uses it→
- 2 · StructureColumns, IDs, naming→
- 3 · PromptOne shared context, one prompt per table→
- 4 · CheckFour layers of review→
- 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
| Layer | How it works |
|---|---|
| 1 · Traceability | Every row names its source. Anything without one is marked Proposed, so a team decision is never mistaken for a fact. |
| 2 · Source check | The 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 checks | 21 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-throughs | We “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 version | Fix |
|---|---|
| Incoming call and system warning both had priority 1, with no tie rule | Rule CR14: the visible one stays, the newer one is queued |
| Full-screen media feedback hid the page, yet the D-pad still acted on it | Rule CR13: an HMI press first dismisses the feedback, then is routed |
| Pressing Set while cruise was suspended was undefined | New transition: Set while suspended stores the current speed |
| The rider could switch off the ride mode in use | New guard G26 |
| Entering Settings while already moving had no row | New 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

The documents




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.
| Spec | What it pins down |
|---|---|
| Input routing matrix | What 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 transitions | How the main menu opens, how focus moves, how it closes and when it times out; how the secondary content on Home cycles. |
| Button guards | Inputs that change with riding state, such as Settings being locked while the bike is moving. |
| Known unknowns | Anything 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.
| Rule | Why 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 systems | Every 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 first | The allowed error in pixels is written down before checking, not after. |
| Nothing clipped | A round display cuts off anything near its edge, so “nothing clipped by the circle” is its own check. |
| Measured, not eyeballed | A 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.
| Case | What the spec decides |
|---|---|
| Two prompts at once | Which one shows and which one waits. The state readout shows both, live. |
| Feedback replaces feedback | A new media confirmation replaces the one showing, and each disappears by itself. |
| Prompt, feedback and menu together | Layer order, and which overlay receives the D-pad in every combination. |
| A value at its limit | Volume 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
| Round | Method and result |
|---|---|
| Round 1 | Run 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 2 | The 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. |
| Open | 2 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.
| ID | Area | What is checked | Expected result | AI run | Team run |
|---|---|---|---|---|---|
| G-01 | Pages & menu | Page opens the menu on the next page | The round menu appears with the Navigation (map pin) button in the middle. The big Home speed shrinks to the top band. | ✓ Pass | ✓ Pass |
| G-02 | Pages & menu | Page steps through all five pages in order and wraps | Navigation → Media → Bike status (motorcycle) → Settings (gear) → Home (house). | ✓ Pass | ✓ Pass |
| G-03 | Pages & menu | Right moves to the next page in the menu | Middle button changes from Navigation to Media. | ✓ Pass | ✓ Pass |
| G-04 | Pages & menu | Left moves to the previous page and wraps from Home to Settings | First Left: Home. Second Left: Settings. | ✓ Pass | ✓ Pass |
| G-05 | Pages & menu | OK closes the menu and stays on that page | Menu disappears immediately. The page title at the bottom reads “Media”. | ✓ Pass | ✓ Pass |
| G-06 | Pages & menu | Menu closes by itself after about 3 s | Menu still there at about 2 s, gone by about 3.5 s. The page behind shows “Bike status”. | ✓ Pass | ✓ Pass |
| G-07 | Pages & menu | Each Page / Right press restarts the 3 s countdown | Menu stays about 3 s after the SECOND press (about 5 s in total), not 3 s after the first. | ✓ Pass | ✓ Pass |
| G-08 | Pages & menu | Up / Down in the menu do nothing and do not extend the countdown | The middle button stays Navigation. Menu still closes about 3 s after Page (Up/Down did not keep it open). | ✓ Pass | ✓ Pass |
| G-09 | Pages & menu | Home with the menu open goes to Home | Menu closes and the Home screen (big speed + Odometer window) is shown. | ✓ Pass | ✓ Pass |
| G-10 | Pages & menu | Home from another page goes to Home | Home screen shown, no menu. | ✓ Pass | ✓ Pass |
| G-11 | Pages & menu | Home on the Home screen does nothing | Nothing changes on the dash. | ✓ Pass | ✓ Pass |
| G-12 | Pages & menu | Each page shows its own placeholder page | Titles: Navigation, Media, Bike status, Settings. (Page contents are placeholders: out of scope.) | ✓ Pass | ✓ Pass |
| G-13 | Pages & menu | Settings while moving shows the riding message | “Settings are hidden while riding” appears at once. Speed shows 35, gear 3. | ✓ Pass | ✓ Pass |
| G-14 | Pages & menu | The riding message has no timeout | The message is still shown. | ✓ Pass | ✓ Pass |
| G-15 | Pages & menu | Stopping removes the riding message | The message disappears immediately. Speed 0, gear N. | ✓ Pass | ✓ Pass |
| G-16 | Pages & menu | The riding message only applies to Settings | No “Settings are hidden” message on any of them. | ✓ Pass | ✓ Pass |
| G-17 | Theme | Dark theme by default | Dark theme (black background). | ✓ Pass | ✓ Pass |
| G-18 | Theme | Holding Home 5 s switches to the light theme without leaving the page | Dash turns light. You stay on Navigation (no jump to Home). | ✓ Pass | ✓ Pass |
| G-19 | Theme | The theme changes at 5 s, while Home is still held | The theme changes when the bar fills (about 5 s), before you let go. | ✓ Pass | ✓ Pass |
| G-20 | Theme | Holding Home again switches back to dark | Dark theme again. | ✓ Pass | ✓ Pass |
| G-21 | Theme | A Home hold shorter than 5 s is a normal Home press | Theme does NOT change. On release you go to Home. | ✓ Pass | ✓ Pass |
| G-22 | Theme | The theme hold works while a prompt is shown; the prompt stays | Theme changes. The call prompt is still there. | ✓ Pass | ✓ Pass |
| G-23 | Theme | The theme hold works with the menu open | Theme changes (the menu may close on its own 3 s timer meanwhile; that is expected). | ✓ Pass | ✓ Pass |
| G-24 | Theme | The telltale strip stays dark in the light theme | The strip is still black; only the rest of the dash is light. | ✓ Pass | ✓ Pass |
| G-25 | Trip window | Home shows Odometer first | “Odometer 001236 mi”. | ✓ Pass | ✓ Pass |
| G-26 | Trip window | Trip steps through the five items in order | Range → Temperature → Trip A → Trip B → Odometer. | ✓ Pass | ✓ Pass |
| G-27 | Trip window | Down on Home shows the next item | Range. | ✓ Pass | ✓ Pass |
| G-28 | Trip window | Up on Home shows the previous item (wraps) | Trip B. | ✓ Pass | ✓ Pass |
| G-29 | Trip window | Holding Trip 1 s resets Trip A | Trip A becomes 0.0 at about 1 s, while still holding. | ✓ Pass | ✓ Pass |
| G-30 | Trip window | Holding Trip 1 s resets Trip B | Trip B becomes 0.0. | ✓ Pass | ✓ Pass |
| G-31 | Trip window | Releasing after a reset does not also move to the next item | Window still shows Trip A (0.0). | ✓ Pass | ✓ Pass |
| G-32 | Trip window | Holding Trip on Odometer or Range changes nothing | Odometer and Range values unchanged; the item does not move on release. | ✓ Pass | ✓ Pass |
| G-33 | Trip window | A quick Trip press (under 1 s) moves to the next item | Range. | ✓ Pass | ✓ Pass |
| G-34 | Trip window | Trip does nothing while the menu is open | Window still shows Odometer. | ✓ Pass | ✓ Pass |
| G-35 | Trip window | Trip does nothing on other pages | Window still shows Odometer. | ✓ Pass | ✓ Pass |
| G-36 | Trip window | The trip item is remembered after leaving Home | Window shows Temperature. | ✓ Pass | ✓ Pass |
| G-37 | Trip window | Left, Right and OK on Home do nothing | Nothing changes. | ✓ Pass | ✓ Pass |
| G-38 | Trip window | Trip still works while a prompt is shown | Window shows Range. | ✓ Pass | ✓ Pass |
| G-39 | Trip window | Up/Down go to the prompt, not the trip window | Window still shows Odometer. | ✓ Pass | ✓ Pass |
| G-40 | Buttons & routing | A short press acts when you release it | Nothing while held; the menu opens on release. | ✓ Pass | ✓ Pass |
| G-41 | Buttons & routing | Holding a button does not repeat (Page) | Menu moved only one step (Navigation). | ✓ Pass | ✓ Pass |
| G-42 | Buttons & routing | Holding Right in the menu moves only once | Media (one step), not further. | ✓ Pass | ✓ Pass |
| G-43 | Buttons & routing | While Home is held, Page is ignored | No menu opens. | ✓ Pass | ✓ Pass |
| G-44 | Buttons & routing | Media buttons still work while Home is held | Volume feedback “13” appears. | ✓ Pass | ✓ Pass |
| G-45 | Buttons & routing | A prompt takes the D-pad before the menu | Right: menu does not move. Up: fuel prompt closes; the menu (Navigation) is still there. | ✓ Pass | ✓ Pass |
| G-46 | Buttons & routing | D-pad does nothing on Media, Bike status, Settings | Nothing changes. | ✓ Pass | ✓ Pass |
| G-47 | Buttons & routing | Left, Right, OK do nothing on Navigation | Nothing changes. | ✓ Pass | ✓ Pass |
| G-48 | Buttons & routing | Voice changes nothing on screen | Nothing changes. | ✓ Pass | ✓ Pass |
| G-48b | Buttons & routing | Switching 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-49 | Volume & zoom | Vol + raises volume by 1 and shows the number | Speaker panel with 13 (the value, not “Volume up”). | ✓ Pass | ✓ Pass |
| G-50 | Volume & zoom | Vol − lowers volume by 1 | Speaker panel with 11. | ✓ Pass | ✓ Pass |
| G-51 | Volume & zoom | Volume stops at 30 | Shows 30 and stays 30; the panel is still shown and lasts about 3 s from the last press. | ✓ Pass | ✓ Pass |
| G-52 | Volume & zoom | Volume stops at 0 | Shows 0 and stays 0. | ✓ Pass | ✓ Pass |
| G-53 | Volume & zoom | Up on Navigation zooms in by 1 | Panel “Zoom 6”; the small map label reads “Zoom 6”. | ✓ Pass | ✓ Pass |
| G-54 | Volume & zoom | Down on Navigation zooms out by 1 | Panel “Zoom 4”. | ✓ Pass | ✓ Pass |
| G-55 | Volume & zoom | Zoom stops at 10 | Shows 10 and stays 10 (panel still shown). | ✓ Pass | ✓ Pass |
| G-56 | Volume & zoom | Zoom stops at 1 | Shows 1 and stays 1. | ✓ Pass | ✓ Pass |
| G-57 | Volume & zoom | No zoom on other pages | No panel on Media; map label still “Zoom 5”. | ✓ Pass | ✓ Pass |
| G-58 | Volume & zoom | Zoom level is remembered | Map label “Zoom 7”. | ✓ Pass | ✓ Pass |
| G-59 | Volume & zoom | The map grid grows with zoom; the D-pad hint shows zoom in/out | Grid squares are bigger. D-pad hint: zoom-in on Up, zoom-out on Down. | ✓ Pass | ✓ Pass |
| G-60 | Volume & zoom | No zoom while the menu is open | No zoom panel; label still “Zoom 5”. | ✓ Pass | ✓ Pass |
| G-61 | Volume & zoom | No zoom while a prompt is shown | No zoom panel; label still “Zoom 5”. | ✓ Pass | ✓ Pass |
| G-62 | Feedback | Play/Pause shows Play, then Pause | Play icon, then Pause icon. | ✓ Pass | ✓ Pass |
| G-63 | Feedback | Skip forward shows Next | Next (⏭) icon. | ✓ Pass | ✓ Pass |
| G-64 | Feedback | Skip back shows Previous | Previous (⏮) icon. | ✓ Pass | ✓ Pass |
| G-65 | Feedback | Feedback disappears by itself after about 3 s | Shown at 2 s, gone by about 3.5 s. | ✓ Pass | ✓ Pass |
| G-66 | Feedback | A new feedback replaces the old one | Only the volume panel (13) is shown; no Next icon behind it. | ✓ Pass | ✓ Pass |
| G-67 | Feedback | Repeated presses restart the 3 s countdown | Panel (14) lasts about 3 s after the second press. | ✓ Pass | ✓ Pass |
| G-68 | Feedback | Feedback does not block the D-pad | Trip window shows Range. | ✓ Pass | ✓ Pass |
| G-69 | Feedback | Media presses do not keep the menu open | The menu is gone (it closed at 3 s under the panel). | ✓ Pass | ✓ Pass |
| G-70 | Feedback | Feedback covers the menu; the menu comes back when the feedback goes | Volume panel on top of the menu; when it disappears the menu (Navigation) is visible again. | ✓ Pass | ✓ Pass |
| G-71 | Feedback | Feedback and a prompt together: prompt on top, still answerable | Call prompt drawn above the volume panel. Down declines the call. | ✓ Pass | ✓ Pass |
| G-72 | Feedback | Zoom and volume share one panel | Zoom 6 → Volume 11 → Zoom 5; only one panel at a time. | ✓ Pass | ✓ Pass |
| G-73 | Feedback | Media feedback works on every page | Next icon on every page. | ✓ Pass | ✓ Pass |
| G-74 | Prompts | Incoming call shows; OK answers | Prompt “Incoming call – Mom”, ✓ on OK and ✕ on Down. After OK it closes; inspector callState = ACTIVE. | ✓ Pass | ✓ Pass |
| G-75 | Prompts | Down declines the call | Prompt closes; callState = IDLE. | ✓ Pass | ✓ Pass |
| G-76 | Prompts | Other keys do nothing while the call prompt is up | Prompt stays; nothing else changes (trip window still Odometer after declining). | ✓ Pass | ✓ Pass |
| G-77 | Prompts | A prompt stays until handled (no timeout) | Still shown. | ✓ Pass | ✓ Pass |
| G-78 | Prompts | Low 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-79 | Prompts | Low oil pressure: OK acknowledges; light stays on | Prompt closes; oil light stays lit. | ✓ Pass | ✓ Pass |
| G-80 | Prompts | Low tire pressure: OK acknowledges; light stays on | Prompt closes; tire-pressure light stays lit. | ✓ Pass | ✓ Pass |
| G-81 | Prompts | Incoming text: OK dismisses | Prompt closes. | ✓ Pass | ✓ Pass |
| G-82 | Prompts | A more important prompt replaces the current one, which is dropped | Call replaces fuel. After declining, NO fuel prompt comes back. | ✓ Pass | ✓ Pass |
| G-83 | Prompts | A call replaced by a more important prompt counts as missed | Oil prompt shown; callState = IDLE. | ✓ Pass | ✓ Pass |
| G-84 | Prompts | A less important prompt waits and shows “+1” | “+1” on the call prompt; after Down the text prompt appears. | ✓ Pass | ✓ Pass |
| G-85 | Prompts | Waiting prompts come back most important first | After oil: Low tire, then the text. | ✓ Pass | ✓ Pass |
| G-86 | Prompts | Only one prompt is ever visible | One prompt (Low oil) with “+4”. | ✓ Pass | ✓ Pass |
| G-87 | Prompts | The same prompt twice is ignored | Low oil with “+1” (not +2). | ✓ Pass | ✓ Pass |
| G-88 | Prompts | A second call is ignored while on a call | No new prompt. | ✓ Pass | ✓ Pass |
| G-89 | Prompts | Caller hanging up removes the call prompt | Prompt gone. | ✓ Pass | ✓ Pass |
| G-90 | Prompts | Caller hanging up removes a waiting call too | “+1” disappears; after OK nothing follows. | ✓ Pass | ✓ Pass |
| G-91 | Prompts | Active call ends | callState = IDLE; nothing on the dash. | ✓ Pass | ✓ Pass |
| G-92 | Prompts | Refuel removes the low-fuel prompt and light | Prompt and light gone; then the “+1” disappears. | ✓ Pass | ✓ Pass |
| G-93 | Prompts | A prompt arriving while the menu is open takes the D-pad; the menu still times out | Right does nothing to the menu. Menu closes about 3 s after Page; text prompt stays. | ✓ Pass | ✓ Pass |
| G-94 | Prompts | When the prompt closes, the D-pad goes back to the open menu | Menu moves to Media. | ✓ Pass | ✓ Pass |
| G-95 | Prompts | Home during a prompt goes Home underneath; prompt stays | Prompt stays after Home; after Up the Home screen is shown. | ✓ Pass | ✓ Pass |
| G-96 | Prompts | Page during a prompt opens the menu underneath | Menu appears under the prompt; Right does not move it. | ✓ Pass | ✓ Pass |
| G-97 | Prompts | Key hints on each prompt | Oil / Tire: ✓ on OK. Call: ✓ OK, ✕ Down. Fuel: ✕ Up. Text: ✕ OK. | ✓ Pass | ✓ Pass |
| G-98 | Prompts | On Navigation only the prompt's key hint is visible | Only the prompt hint (✕ on Up); the map's zoom hint is not visible. | ✓ Pass | ✓ Pass |
| G-99 | Display | Warning lights are never covered | Every warning icon in the bottom strip is lit and fully visible above the menu, panel and prompt. | ✓ Pass | ✓ Pass |
| G-100 | Display | Speed, gear, ride mode visible with the menu open | 35, MPH, gear 3 and the ride-mode icon visible on top. | ✓ Pass | ✓ Pass |
| G-101 | Display | Speed, gear, ride mode visible with feedback | Speed, gear, ride mode visible above the panel. | ✓ Pass | ✓ Pass |
| G-102 | Display | Speed, gear, ride mode visible with a prompt | Speed, gear, ride mode visible above the prompt. | ✓ Pass | ✓ Pass |
| G-103 | Display | Speed, gear, ride mode visible with the Settings message | Speed, gear, ride mode visible; message does not cover them. | ✓ Pass | ✓ Pass |
| G-104 | Display | Speed and gear do not move between pages and overlays | Speed and gear stay in exactly the same place in all of these. | ✓ Pass | ✓ Pass |
| G-105 | Display | Big Home speed only on Home with no overlay | Big → small → big → small → big. | ✓ Pass | ✓ Pass |
| G-106 | Display | Moving / stopped values | 0 N → 35 3 → 0 N. | ✓ Pass | ✓ Pass |
| G-107 | Display | Telltale buttons light their icons | Five icons light up; check engine goes grey again. | ✓ Pass | ✓ Pass |
| G-108 | Display | Matches the reference design file | Same 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
- SpecEvery rule has an ID→
- AI audit111 requirements checked by the AI (AUDIT.md)→
- CoverageEach requirement lists the tests that prove it→
- Group checklist109 tests run by people→
- SummaryCounts update as boxes are ticked
Design choices, and why they work
| Choice | What it does | Why it works |
|---|---|---|
| Same starting point | Every 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 actions | Keys 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 result | The 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 row | Pass, 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 IDs | Each 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 sheet | Every 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 default | All 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
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

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.
| Limit | What happened | What took over |
|---|---|---|
| Tool limit | The 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 system | One 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 source | One 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.
Loading the prototype…
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
AI 工作流 · 提示词设计 · 团队工具包 · 2026
从提示词到原型
AI 如何融入设计工作流 · 以 Sportster S 仪表界面为例
以一个摩托车仪表为案例,对比四个 AI 模型,并对提示词进行迭代优化。本项目记录了我们如何评估与选择模型、如何为 AI 结构化地编写需求,以及如何将一次完整的搭建过程沉淀为团队可复用的工具包。
- 案例
- Harley-Davidson Sportster S 4 英寸圆形 TFT 仪表(HMI 交互原型)
- 分工
- 三人共同完成全程:研究、模型对比、提示词撰写、用 Claude 搭建 Figma 原型、测试,以及团队提示词工具包
- 团队
- Julianne Henry、Jingwen Li、Xiaolu Xi
- 工具
- Claude(Figma 连接器)、ChatGPT、DeepSeek、Gemini、Figma
- 年份
- 2026

背景
设计已完成,有待搭建实现
任务是一次现场演示:做一个 Sportster S 仪表的可交互原型,用键盘操作,观众要能看懂每一步。设计工作我们已经做完了。Figma 里有按团队视觉风格画好的所有画面和悬浮层,七张逻辑表写清了每个车把按键在每种状态下的行为,每条规则都有编号。
尚未完成的是搭建。一个有五个页面、多层设置、媒体键、来电和警告的圆形仪表,要几百个画面、上千条连线。这正是 AI 能发挥作用的环节,前提是设计决策始终由团队掌握。
- 111
- 最终原型的画面数
- ~1,300
- 交互连线
- 1,488
- 跳转目标,零断链
- 19
- AI 依据的规格文件
AI 没有替我们设计仪表,它把我们的设计决定执行到了每一个画面。
“The AI didn’t design the dashboard. It carried our decisions into every one of 111 screens.”
这个项目留给我们的结论分工
我们做了什么,AI 做了什么
所有设计与决策由团队完成;搭建和大部分核查工作交由 AI。
| 阶段 | 我们做了什么 | AI 做了什么 |
|---|---|---|
| 搭建之前 | 在 Figma 里按团队视觉风格设计了所有画面和弹窗;写了带规则编号的七张逻辑表、Known Unknowns、思考文档和任务说明,共 19 个文件;设计了 D-Pad 和 Music Control 按键,画了低保真流程图。 | 此阶段尚未参与。 |
| 准备 | 选定工具(Figma)和测试范围;写提示词;把文件以 can edit 分享给连接器账号。 | 读完 19 个文件,并追问缺的信息:队名、哪些是必须项、参考资料。 |
| 搭建 | 提供参考图、团队的按键设计,以及评审对动效的要求。 | 把我们的画面复制成 111 个状态画面,用键盘触发和变量连好约 1,300 条交互,并按每个画面的实际交互生成按键面板。 |
| 检查和修复 | 从骑手视角进行测试;每个 bug 均附截图或录屏;明确对照标准:量产实车。 | 检查全部 1,488 个跳转目标;对照 Harley-Davidson 官方资料和视频字幕核对逻辑;13 个问题里有 7 个是它自己发现的;绕开 Figma 的限制。 |
| 做决定 | 规格和实车冲突时以谁为准、什么在范围内、哪个版本算通过,全部由我们决定。 | 把冲突和假设列出来交给我们决定,自己不做决定。 |
| 之后 | 用同一段提示词测试了四个模型;纠正了总结的范围,并整理成提示词档案和团队工具包。 | 起草了中英双语的问题与解决办法总结。 |
设计和决定留在我们手里
每一个画面、每一条规则、每一个按键,在对话开始之前均已由团队定义。AI 对范围或样式做出假设时,由我们纠正;测试内容与规则优先级,始终由团队决定。
大量重复的工作交给 AI
111 个画面、约 1,300 条交互、1,488 个跳转目标:这些手工做很慢、又容易出错。
检查是分工合作的
我们评估骑手可感知的体验;AI 核查骑手看不到的部分:每一条连线、每一条规则、每一个画面。
范围
范围是第一位的
范围是提示词中最关键的要素。范围不明确时,AI 容易扩展工作内容:增加画面、增加功能、精修需求之外的内容。这些扩展看似是进展,实际并不服务于测试。
为了测试。原型不是产品,而是能交给用户检验的最低成本载体。
为了在投入开发真正的产品之前,验证概念是否成立。
因为只有可靠的产品才能创造商业价值。尽早通过测试发现不成立的概念,可以避免后续代价更高的商业失误。
只做测试所需的内容。超出范围的部分,无论看起来多出色,都会消耗时间而无助于测试。
这次 AI 在哪些地方越出了范围
| 我们的指令 | AI 做的 | 为什么超出了范围 |
|---|---|---|
| 要求“完美”的可交互原型,未指定工具 | 一个完整的 HTML 原型,带模拟器、事件日志和 79 项自动测试 | 测试必须在 Figma 里、用团队自己的画面进行。22 分钟的产出无法使用。 |
| 要求修改按键样式,未附参考图 | 自行推测样式,并删除了 10 个键 | 测试要展示的内容由 AI 而非团队决定。 |
| 依据规格文件继续纠错,未指明对象 | 对照规格修了 6 项 | 预期的对照对象是视频,AI 自行选择了其他标准。 |
| 要求修复全部错误,未列清单与优先级 | 修复 8 项,由 AI 自行选择 | 修复结果有效,但优先级由 AI 而非团队决定。 |
| 要求列出全部问题,未限定范围 | 先写了环境和权限问题 | 预期范围仅限原型搭建过程中的问题。 |
做什么
明确测试所需内容:骑手真正会按到的画面、按键和状态。
不做什么
明确范围之外的内容:不做网页版、面板上不加模拟键、不修改原始页面。
做到什么算完成
明确验收标准:Home 键在每个画面均可用;音量键支持连续按压。
每写一条提示词之前先问:这个原型要测试什么?哪些是它不需要的?
01 · 选哪个 AI
同一段提示词,四个模型
我们把同一个任务交给了四个模型。提示词写了两版,留作这次测试的记录。决定结果差异的不是模型的通用能力,而是模型能否直接进入工作所在的环境。
| 模型 | 工作方式 | 交回了什么 | 适合做什么 |
|---|---|---|---|
| Claude 通过 Figma 连接器 | 直接在我们的 Figma 文件里工作:从视觉页复制画面、绑定键盘触发和变量、检查每一条连线。 | V1:约 5 分钟 61 个画面。V2:111 个画面、约 1,300 条交互、零断链。能对照 H-D 官方资料自己找出错误。 | 在设计文件里搭建和校验 |
| ChatGPT | 用同样的材料,在自己的页面上重建了一套命名好的状态画面。 | 90 个状态画面,同样的 1600 宽布局。 | 做第二个版本对照 |
| DeepSeek | 无法打开 Figma。交回一个 HTML 文件、一张自查表,以及一段在 Figma Scripter 插件里运行的脚本。 | 按键 × 画面的逻辑表很清楚,也列了假设。但视觉走样:仪表外形和警示灯一栏都变了。 | 逻辑复核、自查表 |
| Gemini | 无法打开 Figma。交回一个带按键面板的 HTML 原型。 | 布局和按键面板可用,但仪表丢了转速圈、表圈和字体,整体效果接近通用媒体播放器。 | 快速出布局草稿 |

02 · 能力边界
每个 AI 能做什么、做不到什么、花多少钱、文件去了哪里
测试回答的是“谁在我们的任务上做得最好”。这一部分回答它背后的问题:就这个项目真正需要的工作而言,每个模型能做什么、做不到什么、要花多少钱、我们的文件会怎样?表格的行按我们的需求排列,越靠前越重要。
| 我们需要的 | Claude | ChatGPT | DeepSeek | Gemini |
|---|---|---|---|---|
| 在我们的 Figma 文件里工作 | 能。Figma 连接器能读取文件里的数据和界面设计图。测试中它直接在文件里搭建:复制画面、设置变量、连好每一个触发。 | 能。通过 Figma 连接读取文件里的数据和界面设计图。测试中它在自己的页面上重画了一套,没有复用我们的画面。 | 不能。只能靠提示词里的视觉描述和上传的图片。替代办法是一段 Scripter 脚本,所有视觉都要用代码重画。 | 不能。同样只能靠文字描述和参考图片,交回的是 Figma 之外的 HTML 原型。 |
| 读完我们的 19 个文件 Excel 表、截图、一段视频 | Excel、PDF、截图都能读,录屏也能逐帧看。YouTube 参考视频需要给链接和时间点。 | Excel、PDF、图片都能读。视频要给截图,或链接加时间点。 | 能读文档和表格里的文字,以及图片(仅 Flash 模型)。不能读视频。 | 能读的类型最多:文档、图片、音频和视频。视频交给它最合适。 |
| 照逻辑表搭建并自查 | 这方面最强。逐条检查连线,还能对照 Harley-Davidson 官方资料找出自己的错误。 | 90 个画面布局一致。我们拿它做对照版本,而不是校验。 | 逻辑强。给出清楚的按键 × 画面表、自查表和假设清单。 | 布局和按键面板做对了,但丢了转速圈、表圈和字体,而且没有提示。 |
| 留下团队能改的成果 | Figma 画面和变量,组里谁都能改。 | Figma 画面,但和我们原来的组件是分开的。 | 一个 HTML 文件加一段脚本,只有看得懂代码的人能改。 | 一个 HTML 文件,和 DeepSeek 一样。 |
| 做不到什么 | 没有编辑权限的文件进不去:要先以 can edit 分享给连接器账号。也受 Figma 本身的限制(见工具包)。 | 自动保留我们原来的组件:测试中它是重画的,还原度取决于重画得好不好。 | 接入设计工具。没有连接器,只能描述或重画。 | 进入 Figma。只靠描述和图片,视觉风格容易走样。 |
| 个人套餐 每月 | Pro $20 Max $100 起 | Plus $20 Go $8 · Pro $100 起 | App 免费 | Google AI Pro $20 Ultra $100 起 |
| API 价格 每百万 tokens,输入 / 输出 | 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(高峰) V4.1 Flash:¥2 / ¥8 · 空闲时段半价 | Gemini 3.1 Pro:$2 / $12 Gemini 4 Argon:$2 / $10,12 月 1 日起 $4 / $20 |
单位 token 成本最低,不等于任务总成本最低
DeepSeek 每个 token 的价格只有别人的几分之一,但它的原型要手工重画。真正的成本衡量标准是可用的结果,而不是 token 数量。
对团队来说,套餐比 API 更重要
在对话里工作时,真正的限制是月度套餐和用量上限。只有做自动化(比如批量检查画面)时,API 价格才重要。
按长处分工
用能编辑文件的模型搭建;视频交给 Gemini;逻辑复核交给 DeepSeek 或另一个模型。
记忆、跨窗口与长对话
此类搭建通常持续数小时,并常常跨越多个对话。模型记不记得之前的工作、能不能读取另一个窗口的内容、对话很长时会怎样,决定了需要重复提供多少上下文。
| 问题 | Claude | ChatGPT | DeepSeek | Gemini |
|---|---|---|---|---|
| 跨对话记住你 | 会。「Memory from chats」会在对话中保存主题。Free、Pro、Max 默认开启;Team 和 Enterprise 需要主动开启。 | 会。保存的记忆,加上一份随对话自动更新的记忆摘要。 | 不会。每个新对话都从零开始。 | 会。「个人背景」里的「你和 Gemini 的过往对话」,2026 年 2 月起免费用户也能用(欧洲稍后)。 |
| 能不能读取另一个窗口的内容 | 能。对话搜索可以找到并引用过去的对话(Pro 及以上)。在项目里只搜这个项目的对话,每个项目也有自己独立的记忆。 | 能。「参考聊天记录」会用到过去的对话。Enterprise 和 Edu 暂不支持。 | 不能。旧对话留在侧边栏里,但它用不上,需要的内容得自己粘贴进去。 | 能。开启过往对话后,会参考之前的对话。 |
| 不留记忆的对话 | 无痕对话(Incognito) | 临时对话(Temporary Chat) | 不需要:对话之间本来就不互通 | 临时对话 |
| 对话变得很长时 | 自动压缩。付费套餐开启代码执行时,会把前面的内容自动总结,对话可以继续下去;早期的细节会变得不那么精确。 | 会变慢,开始忘记前面的细节;到上限后不能再发消息,只能开新对话。 | 最早的内容会从它能看到的范围里掉出去,需要重新说明,或者开新对话。 | 上下文很大,但没有公开的自动压缩功能,对话太长同样会变慢。 |
为什么对话越长越慢
每发一条新消息,模型都要连同前面所有的内容一起读。对话越长,每次要重读的就越多,回复变慢,早期的细节也会变模糊。
怎么换到新窗口
先让旧对话写一份简短的总结:做了哪些决定、用了哪些文件、还有哪些问题没解决。把总结连同规格文件和 Figma 链接一起发到新对话里。Claude 会通过自动压缩自己完成这一步。
记忆不等于规格
记忆保存的是主题,不是你的文件。在新对话里要重新附上规格和 Figma 链接;不希望被记住的客户项目,用无痕或临时对话。
隐私:项目文件进去之后会怎样
我们这 19 个文件是内部规格,但同样的流程,换成客户还没发布的产品也一样会用。上传之前,团队需要明确:每个 AI 能看到什么、数据存在哪里、会不会进到模型里。
| 问题 | Claude | ChatGPT | DeepSeek | Gemini |
|---|---|---|---|---|
| 能看到什么 | 通过 Figma 连接器,能打开已连接 Figma 账号能打开的所有文件,并在该账号有编辑权限的地方编辑。再加上我们上传的内容。 | 通过 Figma 连接同样如此:已连接账号能打开、能编辑的都能。再加上我们上传的内容。 | 只有我们在对话里输入或上传的内容。 | 只有我们在对话里输入或上传的内容。 |
| 数据存在哪里、存多久 | Anthropic 云端。对话保留到你删除为止,删除后 30 天内清除;如果允许用于训练,数据最长保存 5 年。 | OpenAI 云端。对话保留到你删除为止,删除后 30 天内清除;临时对话最多保留 30 天。 | 存储在中华人民共和国境内,账号存在期间一直保留。 | Google 云端。即使关闭 Keep Activity,对话也会保留 72 小时;被抽中人工审核的对话最多保留 3 年。 |
| 会不会被拿去训练 | 只有你主动同意才会(Free、Pro、Max)。Team、Enterprise 和 API 一律不会。 | Free、Plus、Pro 默认会。Business 和 Enterprise 默认不会。 | 默认会。 | Keep Activity 开着就会,部分对话还会由人工审核员阅读。工作账号适用另一套条款。 |
| 怎么关掉 | 设置 → 隐私 → 关闭模型训练。 | 设置 → 数据控制 → 关闭“为所有人改进模型”,或使用临时对话。 | 发邮件到 privacy@deepseek.com 申请,App 里没有开关;另一个办法是在本地运行开源模型。 | 关闭 Keep Activity,或使用工作 / 学校账号。 |
别人看不到你的对话,但训练会让它走得更远
其他用户打不开你的对话。但被用于训练的内容会成为模型学到的一部分,保密资料里的细节在极少数情况下可能出现在别人的回答里。“允许训练”就等于把材料交给了这家公司。
连接器带着的是整个账号
它用的是已连接 Figma 账号的权限,不只是这一个文件。最好用只放了这个项目的账号连接,并且只在搭建期间给 can edit。
项目文件处理规范
上传前先关掉训练。保密协议内容、个人信息和未发布的产品细节,不放进 DeepSeek 和个人 Gemini 账号。客户项目用企业版套餐。
测试结果来自项目期间使用的版本。价格、记忆功能和隐私条款均于 2026 年 10 月 29 日核对,变化很快,其中几项已经公布了调价日期。
03 · 怎么选
按“工作在哪里”来选模型
基于测试,我们总结出为设计工作选择模型时的五项评估标准。其中第一项通常起决定性作用。
能编辑 Figma 文件的模型,用的是我们真实的组件;不能的,只能重画,还原度就是在重画时丢掉的。
19 个文件、Excel 表、截图和一段视频。要确认模型全都能读,而不只是文字。
要求它给出自查表和依据来源。效果最好的时候,都是 AI 把成果和规格、和实车逐条对照。
Figma 里的画面和变量,团队谁都能改;一次性的 HTML 文件,只有看得懂代码的人能改。
账号、套餐、文件权限和隐私规定。只有一个人能用的工具,成不了团队流程。
我们的建议:使用能直接在文件中工作的模型进行搭建,再由另一个模型复核逻辑。
04 · 怎么写提示词
每一次返工,都源于提示词中缺失的信息
整个过程共发送 34 条消息。事后我们按阶段归类,并逐条评级:✓ 一次到位,△ 需要追问或返工,✗ 没有产出。一半的阶段需要返工,原因始终一致:团队掌握的信息没有写进提示词。
| 阶段 | 时间 | 消息数 | 效果 | 最关键的缺失信息 |
|---|---|---|---|---|
| 1 · 搭建原型 | 08:16–08:58 | 12 | △ 做了两遍 | 交付工具(Figma,不是网页);文件编辑权限 |
| 2 · 按键面板 | 09:07–09:17 | 6 | △ 改了三次 | 团队的按键设计图;保留哪些键 |
| 3 · 逻辑校验 | 09:25–09:29、09:46 | 4 | △ | 对照标准;视频链接 |
| 4 · 修复测试发现的 bug | 09:31–09:44 | 5 | ✓ | 修复优先级 |
| 5 · 对齐与切换效果 | 09:49–09:54 | 3 | ✓ | 哪些层参与动画、时长多少 |
| 6 · 文档整理 | 14:54–15:21 | 6 | △ 纠偏一次 | 范围:只算搭原型的部分 |
每段提示词用了多久
对话记录里每条消息都有时间戳,所以能算出每段提示词从发出到我们发下一条之间用了多久。下图是搭建阶段的 22 条提示词,共约 95 分钟。这不是模型的运行时间:每一段都包括 AI 工作,也包括我们自己看结果、测试和打字的时间。
- 95 分钟
- 搭建阶段,22 条提示词
- 51 分钟
- 花在 7 条需要追问的提示词上
- 42 分钟
- 其中两条就占了:形式不对、没有编辑权限
- 约 1 分钟
- 附截图或录屏时,每修一个 bug 的时间
用时取决于任务规模,而非提示词质量
耗时较长的(5 到 22 分钟)都是委派完整任务的提示词:搭建、换样式、全面修复。这些时间是否有效,取决于提示词是否明确了工作位置与方法。
响应过快,通常意味着信息缺失
没有产出的 4 条提示词合计不到 3 分钟。09:13–09:16 连续三条表述不明确的消息,只得到推测和澄清问题;09:17 提供设计图后即得到解决。
损失的时间与缺失的信息成正比
用时 ≈ 委派任务的规模;损失时间 ≈ 该用时 × 提示词遗漏的信息。若缺少工具或权限信息,整段任务需要重新运行。
重写第一条提示词
阶段 1 是最典型的例子:八条消息、四十分钟,始终未说明搭建位置,导致第一个成果是交付形式不符的网页原型;随后又因文件权限问题耽误了二十分钟。
原始消息(摘要)
2. 粘贴任务说明,格式丢失。
3. 要求依据 Page 3 的界面搭建“完美、无逻辑错误”的可交互原型,未说明工具与文件权限。
4–7. 四条追加消息,说明应直接在 Figma 中搭建。
8. 依次发送三个文件链接,均未开放编辑权限。
优化后的提示词
工具与权限:
- 目标文件:<Figma 编辑链接>,已以 can edit 权限分享给 <连接器账号邮箱>。
- 在该文件中新建一个页面完成原型,不要修改 Page 3 的原始设计。
- 不需要网页版本。
视觉依据:Page 3 中的 Home、Navigation1、Media、Vehicle、Settings1、Global Navigation - Home、Screen overlays、D-pad affordance examples。所有状态画面从这些画面复制生成。
逻辑依据(附件 19 个文件):
- 按键行为:Input Routing Matrix、Button Guard Table、List Item Type Overrides。
- 状态与事件:State Transition Table、System Event Table。
- 悬浮层:Overlay Registry、Overlay Conflict Resolution Rules。
- 冲突时以 Excel 表格为准;Known Unknowns 中仍未决定的项目,按表格的当前写法处理并列出。
交互方式:键盘模拟车把按键。方向键 + Enter = D-pad,H / P / T = Home / Page / Trip,空格和 , . - = = 媒体键。
范围:发动机运转的停车和行驶两种状态;不含开机动画、蓝牙配对。
交付与验收:
- 从 Home 画面开始播放。
- 每一个跳转都指向存在的画面,没有断链。
- 完成后列出做不到的功能及原因。
一段好用的提示词由什么组成
为了四模型测试,我们把任务说明重写了两次。第一版是一整段密密麻麻的文字;第二版拆成四部分(视觉风格、交互逻辑、按键面板与切换、搭建与验收);最终版又加上了角色、调研步骤和验收测试。下面是它的组成,按顺序排列。
一句话说清 AI 的身份,以及“完成”是什么样。
加一个 Step 0:要读哪些页面和文件,动手前先输出一份简短的研究摘要。
冲突时谁说了算:提示词 > 表格 > Figma;我们注明的地方,实车 > 表格。
颜色、字体、尺寸、分区写成 token,从设计文件里抄,不凭记忆描述。
每条规则都标上表格编号(G11、CR08、E16),AI 能引用,我们能核对。
四条底线,比如“底部警示灯区永远不被遮挡”。
明确格式、画面命名和搭建位置,并写上“输出完整代码,不要写‘同上’”。
14 条可以按、可以看的测试,而不是“完美”这样的形容词。
有效的提示词
| 我们提供的 | 为什么有效 | 可以学的写法 |
|---|---|---|
| 一次给齐 19 个规格文件 + Figma 链接 | 规格表写得细,AI 能逐条照做。 | 先给完整材料,再提要求。 |
| 参考图 + 问题说明(看不到按键操作) | 图片定义视觉目标,文字定义待解决的问题。 | 参考图和问题一起发。 |
| 团队自己的按键设计图 | 一张设计图代替了多轮文字描述,一次修改到位。 | 样式问题直接发设计图。 |
| 截图 + 指定画面上 Home 键的预期规则 | 具体画面、具体按键,加上期望的规则。 | 「在 X 画面,Y 键应该 Z,但现在是 W」。 |
| 截图 + 可复现的音量键失效问题 | 可复现的步骤和看得见的异常,直接定位到 Figma 的限制。 | 先写做了什么,再写发生了什么。 |
| 录屏 + 悬浮层错位问题 | AI 逐帧看,6 秒找到原因。 | 会动的问题一律录屏。 |
| 评审反馈:页面采用分层渐变切换 | AI 无从知道的评审背景。 | 评审和客户提过的要求,主动告诉 AI。 |
| 要求逐一检查按键逻辑,并与量产实车保持一致 | 指定了对照标准,AI 去查 H-D 官方资料,发现 Trip 顺序错了。 | 说清对照的是什么。 |
现在原样复用的两段提示词
对照标准(按优先级):
1. 真实产品:YouTube 视频 <链接>,重点看 <时间点>;以及 Harley-Davidson 官方维修资料。
2. 团队规格:Input Routing Matrix、Button Guard Table。
检查范围:D-pad(上下左右和 OK)、Trip、Page、Home、媒体键,覆盖所有画面和弹窗。
输出格式:一张表格,列为「按键 · 画面 · 原型当前行为 · 实车行为 · 规格行为 · 是否一致 · 依据来源」。先给我看表格,确认后再修改原型。
冲突处理:实车与规格不一致时,单独列出,由我们决定。
Bug 1(优先)Home 键
- 位置:所有画面,特别是 Home – Odometer 和各个弹窗。
- 期望:Home 键在任何画面、任何弹窗下都可用,按下后回到 Home(在 Home 页则保持不变)。按键面板上 H 在所有画面都显示为可用。
- 实际:Home 页和部分弹窗上 H 为不可用。
- 需同步修改规格:Button Guard Table G11。
Bug 2(优先)音量键与切歌键
- 步骤:在 Home 连续按两次「+」。
- 期望:每次按下音量 +1(0–15),反馈中的数字和音量条更新,并重新计时 1.5 秒(CR08)。切歌键同理,歌名需变化。
- 实际:只有第一次生效。
之后:对照 Input Routing Matrix、Button Guard Table 和 Overlay Conflict Resolution Rules,逐一检查其余按键,把修改列成清单。完成后重新生成所有按键面板,并检查所有跳转没有断链。
05 · 团队工具包
把一次对话变成团队习惯
一次高效的对话如果只保留在个人聊天记录中,价值有限。我们将其整理为工具包,存放于共享文件夹,此后每个新的 AI 任务都以此为起点。
九个带标签的字段(任务、权限、依据、参考、必须有、不要做、验收、背景)。填写完整后作为一条消息发送。
一句话:在这个画面按这个键,应该这样,现在却那样。附截图或录屏。
每一行规则都有编号(G01–G26、CR01–CR14、E01–E22、LI00–LI12),提示词、修复和复核都能指向同一条规则。
写一次、反复用:真实产品 > 任务说明 > 表格 > Figma。没定的事项进假设清单。
一个 Key 组件(Size × State),按键面板由每个画面的实际交互自动生成,不会和逻辑脱节。
记录遇到的 Figma 限制及解决方案,避免重复排查。
AI 填写的按键 × 画面表和 14 条验收测试,每次修改后重跑。
每次对话都用 ✓ △ ✗ 记录,并附上弱提示词的重写版。工具包靠这份档案越用越好。
提示词模板
【权限】文件已以 can edit 分享给 <连接器账号邮箱>。
【视觉依据】用 <页面/画面名称> 的设计,原稿不要改。
【逻辑依据】以 <规格表名称> 为准;两者冲突时以 <哪个> 为准。
【参考】<截图 / 录屏 / YouTube 链接 + 时间点>
【必须有】<例如:每个画面显示按键面板;页面渐变切换>
【不要做】<例如:不要网页版;不要模拟键>
【验收标准】<例如:Home 键在所有画面可用;音量键可连按>
【背景】<客户或评审提过的要求>



Figma 的限制,以及我们的替代做法
| 现象 | 原因 | 替代做法 |
|---|---|---|
| 音量键按一次之后就没反应 | 悬浮层不能再打开它自己 | A、B 两份反馈互换(SWAP),每按一次重新计时 1.5 秒 |
| 音量数字、歌名一直不变 | 画面里只能放固定文字 | 文字和音量条长度绑定变量 |
| 条件里面不能再套条件 | Figma 只支持一层 if/else | 展平成一层,用 AND 组合 |
| 悬浮层和仪表错位 | 悬浮层对齐窗口中心;画面太高会滚动 | 所有画面改成 1600 × 720,不再滚动 |
| 没有长按触发 | Figma 只有按下、点击、超时 | 用 Shift+T 代替长按 Trip |
| 车辆按键让画面数爆炸 | 每种巡航、转向状态都要一套画面 | 只在网页版里做;Figma 只保留行驶/停车一个变量 |
06 · 常见误区
应避免的做法
大部分时间损失来自几种反复出现的做法。它们之所以持续存在,是因为在当下看起来都很高效。
| 错误 | 发生了什么 | 更好的做法 |
|---|---|---|
| 以问候开场,不含任务内容 | 增加了一轮没有有效信息的往返。 | 任务、材料和要求一起发。 |
| 始终没说用什么工具 | AI 做成了网页原型,而任务要在 Figma 里做。 | 第一句就写明工具、文件和页面。 |
| 先发链接,后给权限 | 因只读文件和错误账号耽误了二十分钟。 | 开始前先以 can edit 分享给连接器账号。 |
| 用形容词代替验收标准 | “完美”“无逻辑错误”没法检查。 | 写清要按什么、应该看到什么。 |
| 样式修改请求未附参考图 | AI 只能推测样式,参考设计在四分钟后才提供。 | 同一条消息里附上设计图。 |
| 过于简短的回复(如按左右手分组) | 有三种理解。 | 写清哪些键分在哪一组、放在哪里。 |
| 删除请求,未指明对象 | 对象不明,而删除无法撤销,AI 只能停下来问。 | 写明对象和位置。 |
| 要求对照视频检查,却未附视频 | AI 需自行在 YouTube 搜索,耗时于广告,且无法确认来源正确。 | 贴上链接和时间点。 |
| 要求修复全部错误,未列清单与优先级 | 修复范围由 AI 而非团队决定。 | 列出 bug,标上优先级。 |
| 将内部规格视为最终标准 | Trip 顺序和 Home 键的错误,就出在我们自己的规格里。 | 把真实产品定为标准,让搭建结果反过来更新表格。 |
| 手动标注按键面板 | 连线一改,面板就和真实行为不一致。 | 从画面的交互自动生成。 |
| 中途打断正在运行的步骤 | 被打断的那一步会丢失,有时要重做。 | 直接发消息说明,AI 会在下一步调整。 |
样式问题附图,动效问题附录屏,逻辑问题写明“预期”与“实际”。
07 · 修改纠错
原型生成之后:找错、修错、验证
V1 在 09:05 交付,61 个画面。表面上已经完成,但一次完整的点击测试即暴露出缺口。09:07 至 09:54 之间,我们逐项检查、从骑手视角测试、逐一提交问题,并验证每一次修复。下面记录了哪里错了、谁发现的、为什么会错、怎么修好的。
- 13
- V1 之后发现并修好的问题
- 5
- 由我们检查和测试发现
- 7
- 由 AI 自查发现
- 0
- V2 的断链数(共 1,488 条)
| 问题 | 怎么发现的 | 原因 | 修复 | 时间 |
|---|---|---|---|---|
| 看不到按了哪个键 | 我们检查 V1:参考图 + 显示按键操作的需求 | 任务说明里没提这个需求 | 每个画面加上实时按键面板 | 09:07 |
| 按键面板样式不对,键太多 | 我们检查:发出团队的按键设计图 | AI 只能根据文字推测样式 | 按团队的 D-Pad 和 Music Control 布局保留 13 个键;黑色可按,灰色无效 | 09:17 |
| Home 键不是每个画面都能用 | 我们测试:截图 + Home 键的预期行为 | Home 页本身和几个弹窗没有连 Home | 111 个画面全部连上 Home,包括弹窗 | 09:31 · 09:44 |
| 音量、切歌只能按一次,数字不变 | 我们测试:截图 + 音量键无法连按的问题 | Figma 的限制:已打开的悬浮层不能再打开自己;文字是固定的 | A、B 两份互换,每按一次重新计时 1.5 秒;音量(0–15)和歌名绑定变量 | 09:32 |
| Home 页弹窗盖住大号车速 | AI 对照规则 NN-2 自查 | 弹窗放在了车速区域上 | 先切到小车速布局,再显示弹窗 | 09:33–09:44 |
| 行驶状态下车速始终 0、挡位 N | AI 在全面修复与打磨阶段自查发现 | 只做了停车状态 | 加上行驶变量:45 mph、4 挡 | 09:33–09:44 |
| 地图不能缩放 | AI 在全面修复阶段自查发现 | 地图上没有连 ↑ / ↓ | 缩放 1–5 级,到头再按无效 | 09:33 |
| Ride Modes 只能开关 | AI 在全面修复阶段自查发现 | 自定义模式没有做 | Custom A / B 复制另一模式的 7 项参数 | 09:33 |
| 部分 Settings 链接按了没反应 | AI 在全面修复阶段自查发现 | 死链 | 全部连通;加上亮度(整屏变暗)、软件更新和信息页 | 09:33 |
| 接听电话后没有通话状态 | AI 在打磨阶段发现 | 缺通话状态 | “On call” 标记、自动暂停音乐、Play 挂断 | 09:41 |
| Trip 顺序错了 | AI 对照 Harley-Davidson 官方资料和视频字幕 | 我们自己的逻辑表写错了顺序 | 改成 Odometer → Trip A → Trip B → Range → Temperature,并修正表格 | 09:46 |
| 画面滚动后弹窗错位 | 我们测试:录屏 + 悬浮层错位问题 | 悬浮层按窗口居中对齐,而画面高到会滚动 | 所有画面改成 1600 × 720,不再滚动 | 09:49 |
| 页面之间是瞬间跳转 | 评审意见:page 是分层渐变的 | 没有设置切换效果 | 页面渐变 0.3 秒,弹窗 0.2 秒,系统区保持不动 | 09:49 |
每一次修复都走同样的流程
按骑手真实的操作顺序按键,覆盖每个页面和弹窗、停车和行驶两种状态,而不仅限于预期路径。
一句话:在这个画面按这个键,应该这样,现在却那样。附截图;会动的问题附录屏。
实车、逻辑表还是 Figma 设计。正是“以量产实车为对照标准”这一要求,暴露了 Trip 顺序错误。
重按同样的键,再看相邻的画面。改了一个弹窗,可能会影响打开它的那个画面。
实车和我们的表格不一致时,我们改了表格,下一次搭建就从正确的规则开始。
证据能缩短定位时间
附截图的 bug 大约 1 分钟就定位到原因;附录屏的弹窗错位,6 秒就找到了。
部分错误源自我们自己的规格
Trip 顺序错误源自我们自己的表格。AI 之所以能发现,是因为我们指定以实车而非规格为对照标准。
部分问题源自 Figma 的限制
音量、对齐、嵌套条件,都是 Figma 本身的限制。替代方案已写入团队工具包,避免重复排查。
08 · 结果
不到一小时,从第一版到第二版
| V1 · 09:05 | V2 · 最终版 | |
|---|---|---|
| 画面数 | 61 | 111 |
| 跳转目标 | 925 | 1,488 |
| 画面尺寸 | 613 × 495,只有仪表 | 1600 × 720,仪表 + 按键面板 |
| 按键可见性 | 看不到按了什么,只有一张说明卡 | 每个画面都有实时的 D-Pad 和 Music Control 面板,可以点击 |
| Home 键 | 在 Home 页无效 | 111 个画面全部可用,包括弹窗 |
| Trip 顺序 | Odometer → Temperature → Range → Trip A → Trip B | 实车顺序:Odometer → Trip A → Trip B → Range → Temperature |
| 音量、切歌 | 只能按一次,数字不变 | 可连按,音量 0–15 和歌名实时变化 |
| Home 页悬浮层 | 盖住大号车速 | 先切到上方小车速布局 |
| 行驶状态 | 车速始终 0、挡位 N | 行驶时 45 mph、挡位 4 |
| 切换效果 | 瞬间跳转 | 页面渐变 0.3 秒,悬浮层 0.2 秒,系统区不动 |
最终测试:用 AI 与纯人工对比
最终测试中,我们把 AI 搭建和在 Figma 里纯手工完成同一件事做了对比。AI 一侧的数据来自对话记录;人工一侧按成品文件里的工作量,以熟练 Figma 用户的一般速度估算。
- 约 13 倍
- 更快
- 约 1/10
- 的成本
- 95 分钟
- 用 AI 的整段搭建时间,含人工
- 约 21 小时
- 纯人工估算
| 用 AI(Claude + Figma 连接器) | 在 Figma 里纯手工 | |
|---|---|---|
| 时间 | 整个搭建阶段约 95 分钟,从我们发出第一条消息到 V2 完成的实际时间。这不是模型的运行时间:里面包括 AI 工作,也包括我们看结果、在 Figma 里测试、写下一条提示词的时间。文件分享后约 5 分钟就交付了 V1。 | 约 21 小时,大约两天半的工作量 |
| 人力 | 一名设计师负责指挥、审核和测试 | 一名设计师完成全部步骤 |
| 成本 | 约 $83:设计师 95 分钟,按 $40/小时计,加上 $20/月的套餐 | 约 $840:21 小时,按 $40/小时计 |
| 校验 | 每一条连线自动检查;逻辑对照 Harley-Davidson 官方资料 | 人工逐个点击检查,1,488 条连线里漏掉一条很容易 |
| 后续修改 | 加一条新规则只要一条消息,AI 重新连好受影响的画面 | 每个受影响的画面都要手工重连 |
人工时间是怎么估算的
| 任务 | 工作量 | 速度 | 时间 |
|---|---|---|---|
| 从视觉页做出所有状态画面 | 111 个画面 | 每个约 3 分钟 | ~5.5 小时 |
| 连接按键触发和变量 | 约 1,300 条交互 | 每条约 20 秒 | ~7.2 小时 |
| 为每个画面画按键面板 | 111 个面板 | 每个约 2 分钟 | ~3.7 小时 |
| 对照规格表检查跳转目标 | 1,488 个目标 | 每个约 5 秒 | ~2.1 小时 |
| 修改并重新测试 | — | — | ~2.0 小时 |
| 合计 | 约 21 小时 |
95 分钟来自对话记录,从第一条消息(08:16)到 V2 完成(约 09:54),人和 AI 的时间都算在内。人工数据是估算,不是实测。设计师时间按每小时 $40 计。两边都不包括搭建之前的设计工作(画面、逻辑表和 19 个文件),这部分无论哪种方式都一样,也不包括之后整理文档的时间。
先定交付形式
一开始就说清“Figma,不是网页”并给出按键面板样式,能省掉一整轮重做。
自动生成,不要手标
凡是从逻辑推出来的东西,都应该由逻辑生成。
对照真实产品
最严重的两个错误源自我们自己的规格,只有对照实车才能发现。
让搭建反过来修正规格
搭建时发现了 6 处文档冲突,现在都回写进表格。
提前了解工具的限制
长按、重复打开悬浮层、定位、嵌套条件,写提示词之前就要想好替代方案。
决定留给人来做
当每个设计决定都已经做好并写下来,AI 的速度最快。
09 · 下一步
版本、两个想法、两种搭建方式和质量控制
原型已可正常运行。以下补充将使下一次搭建更易交接,下一次测试更严谨。
每个版本都有时间、地点和版本号
这次的各个版本只存在于对话里。下面是我们当时有的版本,以及以后每个版本的保存方式。
| 版本 | 时间 | 地点 | 内容 |
|---|---|---|---|
| V0 | 2026-10-27 · 约 08:39 | 对话里的一个 HTML 文件 | 带模拟器和 79 项测试的网页原型。没有使用:测试必须在 Figma 里进行。 |
| V1 | 2026-10-27 · 09:05 | 我们的 Figma 文件,「HMI Prototype」页 | 61 个画面,925 个跳转目标 |
| V2 | 2026-10-27 · 约 09:54 | 同一页,在原处更新 | 111 个画面,1,488 个跳转目标,按键面板和分层切换效果 |
每确认一个版本,就按上面的格式命名保存,任何之前的状态都能恢复。
写上版本号、日期时间、谁搭建的、和上一版相比改了什么。
每个版本在共享文件夹里记一行,并链接到生成它的那条提示词。
下一次搭建的两个想法
每次切换都浮现效果说明
原型切换页面时,角落里出现一行小字:「Page → Media · 渐变 0.3 秒 · 系统区不动」。工程师可在观看时同步读取动效规格,无需从动画中推断。
每个画面都链接到它依据的材料
每个画面带一条备注,列出它的来源:从哪个 Figma 画面复制来的、遵循哪些规则编号(G11、CR08),每一项都是链接。评审对某个行为有疑问时,点一下就能看到依据。
两种搭建方式的对比
这一次我们是一次生成整个原型,之后再修复。下一次会用一步一步的方式做同一个原型,每一步确认正确再继续,然后对比两种方式。
| 一次生成,然后修复 | 一步步生成,每步确认 | |
|---|---|---|
| 怎么做 | 一条提示词生成所有画面,之后再测试、再修复。 | 先做一部分(比如 Home 和它的按键),确认正确后再做下一部分。 |
| 这次项目 | V1 约 5 分钟生成,之后约 50 分钟修好了 13 个问题 | 下一次测试 |
| 适合 | 很快看到整体,也能尽早发现任务说明里的漏洞 | 逻辑复杂的情况:前面错一处,会被复制到每一个画面 |
| 风险 | 还没人检查,错误就已经扩散到所有画面(Home 键、音量、Trip 顺序) | 做出第一个完整版本更慢,消息也更多 |
| 我们要比较的 | 做出合格版本的时间、修复次数、断链数 | 同样三项,这样两种方式才能公平比较 |
质量控制:版本确认前的三道检查
质量控制只问一个问题:原型在每一个画面上,是不是都按规格和实车说的那样运作?仅凭视觉判断并不充分,所以我们把它拆成三道检查,每一道的结果都是通过或不通过。检查由 AI 来跑,我们复核它标出来的问题。
| 检查 | 检查什么 | 谁来做 | 怎样算通过 |
|---|---|---|---|
| 1 · 准确性 | 每个画面的每个按键,对照逻辑表和实车,填成一张「按键 × 画面」表 | 搭建的 AI 填表,人来抽查 | 每一行都一致;不一致的单独列出,由我们决定 |
| 2 · AI 评分 | 整个原型,由没参与搭建的模型按固定评分标准打分 | 另一个 AI,比如逻辑交给 DeepSeek、视频交给 Gemini | 每一项都在 4 分以上(满分 5);低于 4 分要写原因 |
| 3 · 检查清单 | 下面这份固定的清单,逐项、逐个画面检查 | AI:我们把清单交给它,由它对照原型逐项检查 | 每一项都标「通过」并写明检查了哪些画面;标「不通过」的由我们复核 |
AI 评分每次都用同一套五分制标准,这样不同版本之间可以比较:
| 评分项 | 5 分的标准 |
|---|---|
| 逻辑 | 每个按键的行为都和规格表、实车一致 |
| 视觉还原 | 画面和我们的 Figma 设计一致:转速圈、表圈、字体、警示灯 |
| 覆盖范围 | 所有页面和弹窗,停车和行驶两种状态 |
| 连线 | 没有断链,也没有走不出去的画面 |
| 工程师看得懂 | 每个画面都有按键面板、切换效果说明和依据链接 |
☐ 音量和切歌支持连续按压,数值和歌名实时更新
☐ Trip 顺序和实车一致:Odometer → Trip A → Trip B → Range → Temperature
☐ 没有弹窗盖住车速(NN-2)
☐ 停车(0 mph、N)和行驶(45 mph、4 挡)两种状态都有
☐ 弹窗和仪表对齐,没有画面会滚动
☐ 页面渐变 0.3 秒,弹窗 0.2 秒,系统区不动
☐ 每个按键面板都和画面的实际交互一致
☐ 零断链
☐ 版本卡已填写,更新日志已记录
AI 的评分和检查都是提醒,不是结论。它们告诉我们该看哪里,通不通过由人来决定。
10 · 第二部分
从 Figma 演示到代码原型,一层一层地搭
Figma 版本验证了画面和连线,但验证不了行为:我们用过的设计工具都表现不了两个提示同时争夺屏幕、数值超出上限,或者三个弹层同时出现时方向键归谁。所以我们把仪表重新做成了代码原型,这次按上面计划的方式来:分步构建,每次构建之前先写好检查清单。
五个页面、主菜单,以及每个实体按键在每种情况下的作用。只有标签和占位值。
每个元素放在真实的位置和尺寸上,使用真实内容和真实字符长度,仍然只用灰度。
媒体反馈、交互提示、音量和地图缩放,以及它们争夺屏幕时的规则。
颜色、字体、图标和表盘按设定的误差范围对照参考还原。进行中。
每一层都先写规格,再由 AI 构建并验证,通过后才加下一层;每个新版本都会把之前所有的检查重新跑一遍。布局变好了却把菜单弄坏,算作倒退。
打开原型 ↗
11 · 流程
从一页课题要求到可构建的规格,中间是六份文档
写任何代码之前,团队先把一页课题要求变成一份行为规格,让 AI 能照着构建而不需要猜。我们把工作拆成六个阶段:每个阶段回答一个问题,并把明确的产出交给下一个阶段。顺序很重要:AI 会把留给它的每一个空白都填上,所以在它开始之前,每个空白都要先解决,或者先写下来。
- 00 已知的未知哪些行为我们观察不到?→
- 01 背景谁在骑?仪表上有什么?→
- 02 数据地图什么信息最重要?→
- 03 状态与输入路由每个输入会发生什么?→
- 04 规格 → 检查清单先构建,再证明
| 阶段 | 回答的问题 | 产出 | 交给谁用 |
|---|---|---|---|
| 00 已知的未知 | 哪些行为无法观察、需要之后再决定? | 持续更新的问题清单,最终 16 条,每条有编号 | 之后每个阶段:解决,或按编号带到下一步 |
| 01 背景 | 骑手是谁,仪表上有什么,什么绝对不能出错? | 用户画像;5 个页面、4 类浮层、27 个实体按键的清单;不可妥协项;范围外 | 数据地图、路由表、检查清单 |
| 02 数据地图 | 骑手需要看到什么,有多紧急? | 80 项信息按 P0–P2 分级,每项附证据 | 屏幕分区、保护区、浮层优先级 |
| 03 状态与输入路由 | 按下按键或系统上报事件时,屏幕上会发生什么? | 7 张互相关联的表和共享说明,共 178 行 | AI 构建所依据的规格 |
| 04 规格 | 行为如何构建并记录? | 带规则编号的规格、代码原型和 AI 审查 | 检查清单、验证 |
| 检查清单 | 构建结果是否符合规格? | 109 项测试,追溯到 111 条需求 | 团队验收 |
12 · 00–01 定义
先写下我们不知道的,再确定为谁设计
第一份文档是一串问题,而不是答案:同时能显示几个浮层?更高优先级的浮层出现时会怎样?Home 键能否关闭正在显示的提示?长按十字键会不会连续滚动?媒体反馈要停留多久?这份清单在每个阶段都保持开放。到最后共有 16 条,每条都有编号供后面的表格引用,这样任何还没决定的事都不会被当作事实。
- 16
- 条已知的未知,按编号追踪
- 5
- 个循环页面
- 27
- 个实体按键
- 4
- 类浮层
为谁设计
Carson,27 岁,每天在纽约通勤,周末骑车出城。他大部分骑行都会用导航和音乐,希望一眼就能看到车速、挡位、骑行模式、导航方向和警告。之后每一个优先级判断,都用同一个问题来检验:这能不能帮 Carson 把视线留在路上?
不可妥协项
| 规则 | 对构建意味着什么 |
|---|---|
| 保护信息 | 车速、挡位、骑行模式和定速巡航状态始终可见,任何页面、菜单或通知都不能遮挡。 |
| 一次只有一个模态 | 第二个模态不能叠在第一个之上;同时发生的事件按既定优先级处理。 |
| 安全优先 | 安全警告高于模态提示,模态提示高于临时反馈;临时反馈自动消失。 |
| 行驶与停车 | 行驶时,骑行信息优先于交互;需要持续注意力的任务暂不出现。 |
| 十字键一致 | 焦点始终清晰可见,同一个方向在每个区域含义相同。 |
有意划出的范围外
只构建两种车辆状态:发动机运转且静止、发动机运转且行驶。开机、熄火、附件模式、关机、维修界面、蓝牙配对和完整的设置树都有意排除,让构建和测试的精力集中在真正骑行的场景上。
文档
13 · 02 数据地图
80 项信息,按紧急程度排序
14 · 03 状态与输入路由
七张表,回答同一个问题
“骑手按下一个按键,或者系统上报一个事件时,屏幕上会发生什么?”我们把这个问题拆成七张表和一份共享说明。在给 AI 写任何提示词之前,每张表都先手写回答四个问题:它是什么、收集什么信息、为什么需要它,以及在真实项目中由谁提供、给谁使用。
| 表格 | 回答什么 | 行数 | 真实项目:谁提供 → 谁使用 |
|---|---|---|---|
| 输入路由矩阵 | 每个输入在每个情境下做什么 | 29 | 开关/电气工程、UX → 仪表软件、测试 |
| 按键屏蔽表 | 什么条件下正常的输入要被忽略 | 26 | 功能安全、控制单元 → 联锁逻辑、反向测试 |
| 状态转换表 | 每一次状态变化、触发和条件 | 65 | UX、系统工程 → 状态机、覆盖测试 |
| 系统事件表 | 不按键时会发生什么 | 23 | 控制单元、手机、导航 → 事件处理 |
| 浮层登记表 | 每个浮层的区域、优先级、层级和超时 | 8 | UX、认证 → 图形层 |
| 浮层冲突规则 | 两个浮层争夺屏幕时谁优先 | 14 | UX、安全、产品负责人 → 浮层管理 |
| 列表项类型规则 | 每类列表项的十字键行为 | 13 | 设计系统 → 列表组件 |
我们如何与 AI 协作
- 1 · 思考是什么、为什么、谁用→
- 2 · 结构列、编号、命名→
- 3 · 提示词一份共享背景,每表一条提示→
- 4 · 检查四层审查→
- 5 · 定稿每张表一个文件
三条规则保证了产出可信。AI 只能使用三个来源:教授的模板、Figma 文件“HMI Analysis V2026.1”和课题要求。每一行都标注依据:模板、Figma 画板、课题要求,或“提议”。不确定的数值写作 TBD 并加入“已知的未知”,而不是去猜。
四层检查
| 层级 | 做法 |
|---|---|
| 1 · 可追溯 | 每一行都写明来源;没有来源的标为“提议”,团队的决定不会被误当成事实。 |
| 2 · 对照来源 | 把 AI 对 Figma 的描述与文件本身对照:屏幕分区、浮层、十字键示意,以及线框流程中每个箭头上的按键图标。 |
| 3 · 自动检查 | 21 项脚本检查,例如:所有交叉引用都能找到、27 个按键都有路由、路由矩阵没有空格、每个浮层都有打开和关闭的方式。 |
| 4 · 场景走查 | 我们按情境“骑”一遍并跟着表格走:菜单打开时来电;提示显示时按音量;在设置里开始行驶。 |
- 11
- 个问题,在 AI 第一版中发现
- 11
- 个已修复
- 21 / 21
- 项自动检查通过
- 178
- 行,分布在七张表
| AI 版本中的问题 | 修复 |
|---|---|
| 来电和系统警告都是优先级 1,没有平局规则 | 规则 CR14:当前显示的保留,新来的排队 |
| 全屏媒体反馈遮住了页面,十字键却仍在操作被遮住的页面 | 规则 CR13:按键先关闭反馈,再进行路由 |
| 定速巡航暂停时按 Set 没有定义 | 新增状态转换:暂停时按 Set 记录当前车速 |
| 骑手可以关闭正在使用的骑行模式 | 新增屏蔽规则 G26 |
| 已经在行驶时进入设置没有对应的行 | 新增状态转换:显示“行驶中设置已隐藏”提示 |
作为“已知的未知”带到下一步的:Figma 中主菜单遮住了车速区,与不可妥协项冲突(KU02);Figma 中没有通话进行中的界面(KU04);除菜单的 2 秒外,其他超时时间都没有规定(KU07)。
最难的是在一个不熟悉的技术领域里判断 AI 的产出对不对。有效的做法是从用途出发,而不是从内容出发:这张表是干什么的?谁把信息交给我们?谁依赖这个结果?
各表如何连接

文档




15 · 结构
每个按键、每种情况,都有答案
在 AI 参与之前,我们先手工搭了一个灰盒可点击流程,记录我们自己的理解。然后把逻辑全部写下来,不给 AI 留下任何需要自己编的行为。
| 规格 | 它规定了什么 |
|---|---|
| 输入路由矩阵 | Home、Page、Trip 和方向键五个方向在每种情况下的作用,包括长按。每个格子都有答案,“无操作”也是一种答案。 |
| 状态转换 | 主菜单怎么打开、焦点怎么移动、怎么关闭、何时超时;首页的次要信息如何轮换。 |
| 按键限制 | 随行驶状态变化的输入,例如行驶中锁定设置页。 |
| 已知未知 | 参考资料无法确认的内容,连同我们提出的规则一起记录,AI 不需要猜。 |
规格表里的每一个空格,都是 AI 替你做的决定,而且它不会告诉你。
16 · 布局
AI 负责测量,人负责定义含义
AI 从矢量参考中提取了每个元素的位置、尺寸和内容。但没有任何工具能从文件里读出每个元素显示的是什么、什么时候会变,这部分由我们来写:每一行对应哪个数值,以及哪些事件会改变它。
| 规则 | 为什么重要 |
|---|---|
| 真实内容、真实长度 | 写“124.6 mi”,而不是“value”。放得下占位符的框,换成真实数字可能就溢出了。 |
| 两套单位 | 每个数字字段都用统一记法写出英制和公制格式,直到最长可能的字符串和无数据时的显示。按“mpg”设计的框,换成“L/100 km”就会溢出。 |
| 先定误差 | 允许的像素误差在检查之前写下来,而不是检查之后。 |
| 不被裁切 | 圆形屏幕会裁掉边缘的内容,所以“没有内容被圆形裁掉”单独作为一项检查。 |
| 测量,而不是目测 | 用一段控制台脚本读取每个元素的边框,与布局表逐项对比,同时把原型以 50% 透明度叠在参考上比对。 |
17 · 弹层
方向键归谁?
弹层是逻辑最复杂的地方。提示、媒体反馈和主菜单可能同时出现在屏幕上,但按键只能交给其中一个。这种行为只存在于代码原型里。
| 情况 | 规格如何决定 |
|---|---|
| 两个提示同时出现 | 哪个显示、哪个排队等待,状态读数实时显示两者。 |
| 反馈替换反馈 | 新的媒体反馈替换正在显示的那个,每个反馈都会自动消失。 |
| 提示、反馈和菜单同时出现 | 图层顺序,以及在每种组合下由哪个弹层接收方向键。 |
| 数值到达上限 | 音量已是最大时再按音量加。反馈显示数值(“Volume 7”),而不是动作(“Volume up”)。 |
每个弹层都在登记表中有一条记录(图层、优先级、是否接管方向键、是否自动消失、超时时间),并配有明确的冲突规则。
18 · 验证
109 项检查,0 项失败,2 项待测已注明原因
每个 AI 构建的版本都是一个单独的文件,内置测试接口:状态读数、事件日志和状态检查器。每条记录的事件都带有规则编号,可以追溯回规格,出错时能直接定位到违反的是哪条规则。
- 109
- 项检查
- 107
- 项通过
- 0
- 项失败
- 2
- 项待测,已注明原因
| 轮次 | 方法与结果 |
|---|---|
| 第一轮 | 在在线原型中用真实的点击和按键执行,每条结果都对照截图、事件日志时间戳和状态检查器确认。90 项,全部通过。 |
| 第二轮 | 浏览器插件无法执行的长按用例,改在脚本控制的 Chrome(Playwright)中用设定时长的真实按住操作执行,其中验证了 56 次自动连发的按键事件。17 项,全部通过。 |
| 待测 | 2 项,每项都记录了无法执行的原因和所需条件。 |
团队也在同一版本上自己跑了这份检查清单。凡是双方都执行过的检查,结论完全一致:107 项中 107 项相同。AI 没能执行的 G-108,由团队对照设计文件补完。
| 编号 | 范围 | 检查内容 | 预期结果 | AI 执行 | 团队执行 |
|---|---|---|---|---|---|
| G-01 | Pages & menu | Page opens the menu on the next page | The round menu appears with the Navigation (map pin) button in the middle. The big Home speed shrinks to the top band. | ✓ 通过 | ✓ 通过 |
| G-02 | Pages & menu | Page steps through all five pages in order and wraps | Navigation → Media → Bike status (motorcycle) → Settings (gear) → Home (house). | ✓ 通过 | ✓ 通过 |
| G-03 | Pages & menu | Right moves to the next page in the menu | Middle button changes from Navigation to Media. | ✓ 通过 | ✓ 通过 |
| G-04 | Pages & menu | Left moves to the previous page and wraps from Home to Settings | First Left: Home. Second Left: Settings. | ✓ 通过 | ✓ 通过 |
| G-05 | Pages & menu | OK closes the menu and stays on that page | Menu disappears immediately. The page title at the bottom reads “Media”. | ✓ 通过 | ✓ 通过 |
| G-06 | Pages & menu | Menu closes by itself after about 3 s | Menu still there at about 2 s, gone by about 3.5 s. The page behind shows “Bike status”. | ✓ 通过 | ✓ 通过 |
| G-07 | Pages & menu | Each Page / Right press restarts the 3 s countdown | Menu stays about 3 s after the SECOND press (about 5 s in total), not 3 s after the first. | ✓ 通过 | ✓ 通过 |
| G-08 | Pages & menu | Up / Down in the menu do nothing and do not extend the countdown | The middle button stays Navigation. Menu still closes about 3 s after Page (Up/Down did not keep it open). | ✓ 通过 | ✓ 通过 |
| G-09 | Pages & menu | Home with the menu open goes to Home | Menu closes and the Home screen (big speed + Odometer window) is shown. | ✓ 通过 | ✓ 通过 |
| G-10 | Pages & menu | Home from another page goes to Home | Home screen shown, no menu. | ✓ 通过 | ✓ 通过 |
| G-11 | Pages & menu | Home on the Home screen does nothing | Nothing changes on the dash. | ✓ 通过 | ✓ 通过 |
| G-12 | Pages & menu | Each page shows its own placeholder page | Titles: Navigation, Media, Bike status, Settings. (Page contents are placeholders: out of scope.) | ✓ 通过 | ✓ 通过 |
| G-13 | Pages & menu | Settings while moving shows the riding message | “Settings are hidden while riding” appears at once. Speed shows 35, gear 3. | ✓ 通过 | ✓ 通过 |
| G-14 | Pages & menu | The riding message has no timeout | The message is still shown. | ✓ 通过 | ✓ 通过 |
| G-15 | Pages & menu | Stopping removes the riding message | The message disappears immediately. Speed 0, gear N. | ✓ 通过 | ✓ 通过 |
| G-16 | Pages & menu | The riding message only applies to Settings | No “Settings are hidden” message on any of them. | ✓ 通过 | ✓ 通过 |
| G-17 | Theme | Dark theme by default | Dark theme (black background). | ✓ 通过 | ✓ 通过 |
| G-18 | Theme | Holding Home 5 s switches to the light theme without leaving the page | Dash turns light. You stay on Navigation (no jump to Home). | ✓ 通过 | ✓ 通过 |
| G-19 | Theme | The theme changes at 5 s, while Home is still held | The theme changes when the bar fills (about 5 s), before you let go. | ✓ 通过 | ✓ 通过 |
| G-20 | Theme | Holding Home again switches back to dark | Dark theme again. | ✓ 通过 | ✓ 通过 |
| G-21 | Theme | A Home hold shorter than 5 s is a normal Home press | Theme does NOT change. On release you go to Home. | ✓ 通过 | ✓ 通过 |
| G-22 | Theme | The theme hold works while a prompt is shown; the prompt stays | Theme changes. The call prompt is still there. | ✓ 通过 | ✓ 通过 |
| G-23 | Theme | The theme hold works with the menu open | Theme changes (the menu may close on its own 3 s timer meanwhile; that is expected). | ✓ 通过 | ✓ 通过 |
| G-24 | Theme | The telltale strip stays dark in the light theme | The strip is still black; only the rest of the dash is light. | ✓ 通过 | ✓ 通过 |
| G-25 | Trip window | Home shows Odometer first | “Odometer 001236 mi”. | ✓ 通过 | ✓ 通过 |
| G-26 | Trip window | Trip steps through the five items in order | Range → Temperature → Trip A → Trip B → Odometer. | ✓ 通过 | ✓ 通过 |
| G-27 | Trip window | Down on Home shows the next item | Range. | ✓ 通过 | ✓ 通过 |
| G-28 | Trip window | Up on Home shows the previous item (wraps) | Trip B. | ✓ 通过 | ✓ 通过 |
| G-29 | Trip window | Holding Trip 1 s resets Trip A | Trip A becomes 0.0 at about 1 s, while still holding. | ✓ 通过 | ✓ 通过 |
| G-30 | Trip window | Holding Trip 1 s resets Trip B | Trip B becomes 0.0. | ✓ 通过 | ✓ 通过 |
| G-31 | Trip window | Releasing after a reset does not also move to the next item | Window still shows Trip A (0.0). | ✓ 通过 | ✓ 通过 |
| G-32 | Trip window | Holding Trip on Odometer or Range changes nothing | Odometer and Range values unchanged; the item does not move on release. | ✓ 通过 | ✓ 通过 |
| G-33 | Trip window | A quick Trip press (under 1 s) moves to the next item | Range. | ✓ 通过 | ✓ 通过 |
| G-34 | Trip window | Trip does nothing while the menu is open | Window still shows Odometer. | ✓ 通过 | ✓ 通过 |
| G-35 | Trip window | Trip does nothing on other pages | Window still shows Odometer. | ✓ 通过 | ✓ 通过 |
| G-36 | Trip window | The trip item is remembered after leaving Home | Window shows Temperature. | ✓ 通过 | ✓ 通过 |
| G-37 | Trip window | Left, Right and OK on Home do nothing | Nothing changes. | ✓ 通过 | ✓ 通过 |
| G-38 | Trip window | Trip still works while a prompt is shown | Window shows Range. | ✓ 通过 | ✓ 通过 |
| G-39 | Trip window | Up/Down go to the prompt, not the trip window | Window still shows Odometer. | ✓ 通过 | ✓ 通过 |
| G-40 | Buttons & routing | A short press acts when you release it | Nothing while held; the menu opens on release. | ✓ 通过 | ✓ 通过 |
| G-41 | Buttons & routing | Holding a button does not repeat (Page) | Menu moved only one step (Navigation). | ✓ 通过 | ✓ 通过 |
| G-42 | Buttons & routing | Holding Right in the menu moves only once | Media (one step), not further. | ✓ 通过 | ✓ 通过 |
| G-43 | Buttons & routing | While Home is held, Page is ignored | No menu opens. | ✓ 通过 | ✓ 通过 |
| G-44 | Buttons & routing | Media buttons still work while Home is held | Volume feedback “13” appears. | ✓ 通过 | ✓ 通过 |
| G-45 | Buttons & routing | A prompt takes the D-pad before the menu | Right: menu does not move. Up: fuel prompt closes; the menu (Navigation) is still there. | ✓ 通过 | ✓ 通过 |
| G-46 | Buttons & routing | D-pad does nothing on Media, Bike status, Settings | Nothing changes. | ✓ 通过 | ✓ 通过 |
| G-47 | Buttons & routing | Left, Right, OK do nothing on Navigation | Nothing changes. | ✓ 通过 | ✓ 通过 |
| G-48 | Buttons & routing | Voice changes nothing on screen | Nothing changes. | ✓ 通过 | ✓ 通过 |
| G-48b | Buttons & routing | Switching 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. | ○ 未执行 | – 未标记 |
| G-49 | Volume & zoom | Vol + raises volume by 1 and shows the number | Speaker panel with 13 (the value, not “Volume up”). | ✓ 通过 | ✓ 通过 |
| G-50 | Volume & zoom | Vol − lowers volume by 1 | Speaker panel with 11. | ✓ 通过 | ✓ 通过 |
| G-51 | Volume & zoom | Volume stops at 30 | Shows 30 and stays 30; the panel is still shown and lasts about 3 s from the last press. | ✓ 通过 | ✓ 通过 |
| G-52 | Volume & zoom | Volume stops at 0 | Shows 0 and stays 0. | ✓ 通过 | ✓ 通过 |
| G-53 | Volume & zoom | Up on Navigation zooms in by 1 | Panel “Zoom 6”; the small map label reads “Zoom 6”. | ✓ 通过 | ✓ 通过 |
| G-54 | Volume & zoom | Down on Navigation zooms out by 1 | Panel “Zoom 4”. | ✓ 通过 | ✓ 通过 |
| G-55 | Volume & zoom | Zoom stops at 10 | Shows 10 and stays 10 (panel still shown). | ✓ 通过 | ✓ 通过 |
| G-56 | Volume & zoom | Zoom stops at 1 | Shows 1 and stays 1. | ✓ 通过 | ✓ 通过 |
| G-57 | Volume & zoom | No zoom on other pages | No panel on Media; map label still “Zoom 5”. | ✓ 通过 | ✓ 通过 |
| G-58 | Volume & zoom | Zoom level is remembered | Map label “Zoom 7”. | ✓ 通过 | ✓ 通过 |
| G-59 | Volume & zoom | The map grid grows with zoom; the D-pad hint shows zoom in/out | Grid squares are bigger. D-pad hint: zoom-in on Up, zoom-out on Down. | ✓ 通过 | ✓ 通过 |
| G-60 | Volume & zoom | No zoom while the menu is open | No zoom panel; label still “Zoom 5”. | ✓ 通过 | ✓ 通过 |
| G-61 | Volume & zoom | No zoom while a prompt is shown | No zoom panel; label still “Zoom 5”. | ✓ 通过 | ✓ 通过 |
| G-62 | Feedback | Play/Pause shows Play, then Pause | Play icon, then Pause icon. | ✓ 通过 | ✓ 通过 |
| G-63 | Feedback | Skip forward shows Next | Next (⏭) icon. | ✓ 通过 | ✓ 通过 |
| G-64 | Feedback | Skip back shows Previous | Previous (⏮) icon. | ✓ 通过 | ✓ 通过 |
| G-65 | Feedback | Feedback disappears by itself after about 3 s | Shown at 2 s, gone by about 3.5 s. | ✓ 通过 | ✓ 通过 |
| G-66 | Feedback | A new feedback replaces the old one | Only the volume panel (13) is shown; no Next icon behind it. | ✓ 通过 | ✓ 通过 |
| G-67 | Feedback | Repeated presses restart the 3 s countdown | Panel (14) lasts about 3 s after the second press. | ✓ 通过 | ✓ 通过 |
| G-68 | Feedback | Feedback does not block the D-pad | Trip window shows Range. | ✓ 通过 | ✓ 通过 |
| G-69 | Feedback | Media presses do not keep the menu open | The menu is gone (it closed at 3 s under the panel). | ✓ 通过 | ✓ 通过 |
| G-70 | Feedback | Feedback covers the menu; the menu comes back when the feedback goes | Volume panel on top of the menu; when it disappears the menu (Navigation) is visible again. | ✓ 通过 | ✓ 通过 |
| G-71 | Feedback | Feedback and a prompt together: prompt on top, still answerable | Call prompt drawn above the volume panel. Down declines the call. | ✓ 通过 | ✓ 通过 |
| G-72 | Feedback | Zoom and volume share one panel | Zoom 6 → Volume 11 → Zoom 5; only one panel at a time. | ✓ 通过 | ✓ 通过 |
| G-73 | Feedback | Media feedback works on every page | Next icon on every page. | ✓ 通过 | ✓ 通过 |
| G-74 | Prompts | Incoming call shows; OK answers | Prompt “Incoming call – Mom”, ✓ on OK and ✕ on Down. After OK it closes; inspector callState = ACTIVE. | ✓ 通过 | ✓ 通过 |
| G-75 | Prompts | Down declines the call | Prompt closes; callState = IDLE. | ✓ 通过 | ✓ 通过 |
| G-76 | Prompts | Other keys do nothing while the call prompt is up | Prompt stays; nothing else changes (trip window still Odometer after declining). | ✓ 通过 | ✓ 通过 |
| G-77 | Prompts | A prompt stays until handled (no timeout) | Still shown. | ✓ 通过 | ✓ 通过 |
| G-78 | Prompts | Low fuel: Up dismisses; warning light and gauge stay low | ✕ shown on Up. Prompt closes; low-fuel light stays lit; fuel gauge nearly empty. | ✓ 通过 | ✓ 通过 |
| G-79 | Prompts | Low oil pressure: OK acknowledges; light stays on | Prompt closes; oil light stays lit. | ✓ 通过 | ✓ 通过 |
| G-80 | Prompts | Low tire pressure: OK acknowledges; light stays on | Prompt closes; tire-pressure light stays lit. | ✓ 通过 | ✓ 通过 |
| G-81 | Prompts | Incoming text: OK dismisses | Prompt closes. | ✓ 通过 | ✓ 通过 |
| G-82 | Prompts | A more important prompt replaces the current one, which is dropped | Call replaces fuel. After declining, NO fuel prompt comes back. | ✓ 通过 | ✓ 通过 |
| G-83 | Prompts | A call replaced by a more important prompt counts as missed | Oil prompt shown; callState = IDLE. | ✓ 通过 | ✓ 通过 |
| G-84 | Prompts | A less important prompt waits and shows “+1” | “+1” on the call prompt; after Down the text prompt appears. | ✓ 通过 | ✓ 通过 |
| G-85 | Prompts | Waiting prompts come back most important first | After oil: Low tire, then the text. | ✓ 通过 | ✓ 通过 |
| G-86 | Prompts | Only one prompt is ever visible | One prompt (Low oil) with “+4”. | ✓ 通过 | ✓ 通过 |
| G-87 | Prompts | The same prompt twice is ignored | Low oil with “+1” (not +2). | ✓ 通过 | ✓ 通过 |
| G-88 | Prompts | A second call is ignored while on a call | No new prompt. | ✓ 通过 | ✓ 通过 |
| G-89 | Prompts | Caller hanging up removes the call prompt | Prompt gone. | ✓ 通过 | ✓ 通过 |
| G-90 | Prompts | Caller hanging up removes a waiting call too | “+1” disappears; after OK nothing follows. | ✓ 通过 | ✓ 通过 |
| G-91 | Prompts | Active call ends | callState = IDLE; nothing on the dash. | ✓ 通过 | ✓ 通过 |
| G-92 | Prompts | Refuel removes the low-fuel prompt and light | Prompt and light gone; then the “+1” disappears. | ✓ 通过 | ✓ 通过 |
| G-93 | Prompts | A prompt arriving while the menu is open takes the D-pad; the menu still times out | Right does nothing to the menu. Menu closes about 3 s after Page; text prompt stays. | ✓ 通过 | ✓ 通过 |
| G-94 | Prompts | When the prompt closes, the D-pad goes back to the open menu | Menu moves to Media. | ✓ 通过 | ✓ 通过 |
| G-95 | Prompts | Home during a prompt goes Home underneath; prompt stays | Prompt stays after Home; after Up the Home screen is shown. | ✓ 通过 | ✓ 通过 |
| G-96 | Prompts | Page during a prompt opens the menu underneath | Menu appears under the prompt; Right does not move it. | ✓ 通过 | ✓ 通过 |
| G-97 | Prompts | Key hints on each prompt | Oil / Tire: ✓ on OK. Call: ✓ OK, ✕ Down. Fuel: ✕ Up. Text: ✕ OK. | ✓ 通过 | ✓ 通过 |
| G-98 | Prompts | On Navigation only the prompt's key hint is visible | Only the prompt hint (✕ on Up); the map's zoom hint is not visible. | ✓ 通过 | ✓ 通过 |
| G-99 | Display | Warning lights are never covered | Every warning icon in the bottom strip is lit and fully visible above the menu, panel and prompt. | ✓ 通过 | ✓ 通过 |
| G-100 | Display | Speed, gear, ride mode visible with the menu open | 35, MPH, gear 3 and the ride-mode icon visible on top. | ✓ 通过 | ✓ 通过 |
| G-101 | Display | Speed, gear, ride mode visible with feedback | Speed, gear, ride mode visible above the panel. | ✓ 通过 | ✓ 通过 |
| G-102 | Display | Speed, gear, ride mode visible with a prompt | Speed, gear, ride mode visible above the prompt. | ✓ 通过 | ✓ 通过 |
| G-103 | Display | Speed, gear, ride mode visible with the Settings message | Speed, gear, ride mode visible; message does not cover them. | ✓ 通过 | ✓ 通过 |
| G-104 | Display | Speed and gear do not move between pages and overlays | Speed and gear stay in exactly the same place in all of these. | ✓ 通过 | ✓ 通过 |
| G-105 | Display | Big Home speed only on Home with no overlay | Big → small → big → small → big. | ✓ 通过 | ✓ 通过 |
| G-106 | Display | Moving / stopped values | 0 N → 35 3 → 0 N. | ✓ 通过 | ✓ 通过 |
| G-107 | Display | Telltale buttons light their icons | Five icons light up; check engine goes grey again. | ✓ 通过 | ✓ 通过 |
| G-108 | Display | Matches the reference design file | Same placement, sizes and icons; differences only as listed in the spec. | ○ 未执行 | ✓ 通过 |
19 · 检查清单设计
一行一个行为,一项一个勾选,每条规则都有覆盖
检查清单是验证工作中由团队负责的那一半。我们的目标是:组里任何人拿到它,不用先读规格,就能对着原型跑一遍,并且和下一个人得到同样的结果。构建第 3 版用了 15 分钟,完整跑完检查清单用了 5 分钟。
- 15 分钟
- 构建第 3 版
- 5 分钟
- 跑完检查清单
- 109
- 项测试,108 通过,0 失败
- 0
- 条需求没有对应测试
在最新一轮团队测试中(第 3 版,审查修复 PR-24 之后),109 项测试通过 108 项,失败 0 项。剩下 1 项未标记:G-48b,检查按住按键时切走窗口不会让按键卡住,这只适用于浏览器模拟环境。
各部分如何连接
- 规格每条规则都有编号→
- AI 审查AI 逐条核对 111 条需求(AUDIT.md)→
- 覆盖表每条需求列出证明它的测试→
- 小组检查清单由人执行 109 项测试→
- 汇总勾选后自动更新计数
设计选择,以及为什么有效
| 设计选择 | 具体做法 | 为什么有效 |
|---|---|---|
| 统一起点 | 每项测试的“准备”一栏都写着“点击 Reset prototype”。 | 结果不受测试顺序影响,也不受上一位测试者留下的状态影响。 |
| 精确的操作 | 按键和时间都写清楚:“3 秒内快速按 5 次 Page”“长按 H 5 秒”,数“一千零一”。 | 两个人做的是同一件事,结果不同就说明构建有问题。 |
| 一个可见的结果 | 预期结果描述屏幕上会出现什么,用屏幕上的原话。 | 通过与否变成对照,而不是主观判断。 |
| 每行只勾一项 | 从下拉中选“通过”“失败”或“未测”;选失败要写下看到了什么。 | 汇总表会统计勾了不止一项的行,必须为 0,出错立刻能看到。 |
| 关联审查编号 | 每项测试都标明它证明的需求(PG-、TH-、TR-、IN-、VR-、FB-、PR-、DS-)。 | 测试失败时,能直接定位到违反的规则。 |
| 覆盖表 | 每条需求列出对应测试,并用公式统计测试数和勾选数。 | “没有小组测试的需求”必须为 0,没有规则会漏测;范围外的项目是有意标注的。 |
| 默认留空 | 所有勾选框一开始都是空的,即使 AI 审查已经通过。 | 表格记录的是人看到的结果,而不是 AI 的报告,构成第二道独立检查。 |
109 项测试,覆盖八个方面
111 条需求有四个来源,覆盖表逐条标注:36 条导师要求,18 条来自导师的转述,19 条团队共同决定,31 条设计假设;另有 7 条有意标为范围外。标注来源,可以看清哪些结果在回应课题要求,哪些在检验我们自己的假设。
测试工作簿

20 · 边界
AI 测试在哪里停下,由谁接手
没测成的检查和通过的检查一样有价值:它们准确地说明了 AI 测试在什么地方需要换工具、换成真实设备,或者交给人。
| 边界 | 发生了什么 | 由谁接手 |
|---|---|---|
| 工具限制 | 浏览器插件只能发出瞬时的按下和松开,长按类输入无法测试。 | 换工具:用脚本控制的 Chrome 执行真实按住。已解决。 |
| 真实操作系统 | 有一项检查需要在切换到其他窗口时让页面失去焦点。在云端浏览器里,失焦事件始终没有触发。 | 人,在真实电脑上:手动按 Cmd+Tab 测试。 |
| 缺少源文件 | 有一项检查需要把原型和设计文件、书面规格对照,而测试方没有这两个文件。 | 团队:提供文件,或人工完成对照。 |
先决定,再交给 AI
规格和检查清单都在构建之前完成。AI 按定义构建很快,自己编定义却不可靠。
数字交给 AI,含义由人定义
提取能给出位置和尺寸。每个元素的用途、什么时候变化,必须由理解产品的人来写。
没跑过清单,就不算完成
每个版本都跑完整的检查清单,包括之前的所有项,并且每项都注明是怎么验证的。
第二部分的下一步
按设定误差完成视觉还原,并重跑所有检查,因为真实字体会改变字符串的宽度;每个版本都由 AI 和人分别检查,按检查类型统计两者的一致程度;补完两项待测检查。
21 · 试一试
跑过检查清单的那一版原型
这是代码原型的第 3 版,直接嵌在页面里,可以完整操作。请先点一下框内。可以点屏幕上的按钮,也可以用键盘:方向键是十字键,Enter 是 OK,P 是 Page,H 是 Home,T 是 Trip,空格是播放/暂停,[ 和 ] 切歌,− 和 = 调音量。“System events”面板可以模拟来电、警告和“开始行驶”,点 Reset prototype 重新开始。
原型加载中…
署名
- 项目
- Sportster S HMI 原型,Julianne Henry、Jingwen Li、Xiaolu Xi
- 设计与规格
- 团队:视觉系统、HMI 分区、实体按键映射和七张逻辑表
- AI 工作流
- 三人共同完成:研究、模型对比、提示词、用 Claude 搭建 Figma 原型、测试、提示词档案与团队工具包
- 参考资料
- Harley-Davidson 官方维修资料与车主手册;Sportster S 信息娱乐系统教程视频
- 年份
- 2026







