{"id":4515,"date":"2026-08-05T13:46:10","date_gmt":"2026-08-05T17:46:10","guid":{"rendered":"https:\/\/blog.mozilla.org\/ux\/?p=4515"},"modified":"2026-08-05T14:07:57","modified_gmt":"2026-08-05T18:07:57","slug":"let-your-designs-fail-for-the-right-reasons","status":"publish","type":"post","link":"https:\/\/blog.mozilla.org\/ux\/2026\/08\/let-your-designs-fail-for-the-right-reasons\/","title":{"rendered":"Let your designs fail for the right reasons"},"content":{"rendered":"<h3>How AI-assisted native prototypes changed what usability testing could show me.<\/h3>\n<p>&nbsp;<\/p>\n<p>If you&#8217;ve ever simplified an interaction just to make a prototype manageable, you&#8217;ve probably felt the tension between what you designed and what the prototype could actually support. The risk is that when a design fails in usability testing, you can&#8217;t always tell why. Was the experience itself the problem, or was it really the prototype getting in the way: a missing connection, a laggy transition, a path you didn&#8217;t build?<\/p>\n<p>I ran into this while working on Report Broken Site for Firefox Android, and it led me to a different way of prototyping: building directly inside the real app with AI (Claude), so the test reflects native fidelity rather than a simulation of it. That&#8217;s when I started worrying just about the design failing, and not the prototype.<\/p>\n<div id=\"attachment_4500\" style=\"width: 950px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-4500\" decoding=\"async\" loading=\"lazy\" class=\" wp-image-4500\" src=\"https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image1-300x178.png\" alt=\"Four-step screenshot sequence of the Report Broken Site feature: choosing an issue type, adding details, previewing the report data, and confirming the report was sent.\" width=\"940\" height=\"558\" srcset=\"https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image1-300x178.png 300w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image1-600x356.png 600w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image1-768x455.png 768w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image1-1536x911.png 1536w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image1-1000x593.png 1000w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image1.png 1999w\" sizes=\"(max-width: 940px) 100vw, 940px\" \/><p id=\"caption-attachment-4500\" class=\"wp-caption-text\">Feature: Report Broken Site<\/p><\/div>\n<p>&nbsp;<\/p>\n<h2>Reaching limits of walled prototypes<\/h2>\n<p>In tools like Figma, prototyping requires anticipating every possible interaction and defining it explicitly. For the user to feel the true experience, each path needs to be connected, each transition set, and each variation accounted for. As complexity grows, it tends to increase the cost of maintaining it: screens multiply, connections become fragile, and animations become tedious to maintain.<\/p>\n<p>At some point, you\u2019re no longer designing the experience. <b>You\u2019re managing the prototype.\u00a0<\/b><\/p>\n<div id=\"attachment_4512\" style=\"width: 3034px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-4512\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-4512 size-full\" src=\"https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/Choosing-animation_1.5x.gif\" alt=\"Animated GIF of a Figma prototype canvas with multiple Report Broken Site screens connected by numerous crisscrossing arrows, illustrating how manually wired prototype logic becomes tangled as complexity grows.&quot;\" width=\"3024\" height=\"1512\" \/><p id=\"caption-attachment-4512\" class=\"wp-caption-text\">E.g. Changing the animation for one node, requires updating it everywhere manually.<\/p><\/div>\n<p>To cope, we simplify the prototype. We reduce the number of paths, guide users through predefined flows, and limit what they can do on the prototype. The result is what I\u2019ve started thinking of as a <b>walled prototype<\/b> \u2014 like a walled garden: a bounded space where users can move, but only within the paths we\u2019ve pre-defined.<\/p>\n<p>Some designers might argue that Figma\u2019s recent additions of variables and advanced logic solve this problem. However, even with these tools, the designer is still building and managing the prototype. Figma prototypes simulate a system; it is not the system itself or a part of it. These prototypes have been useful, but they have also shaped the participant testing experience in ways that haven\u2019t always been obvious.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_4501\" style=\"width: 1048px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-4501\" decoding=\"async\" loading=\"lazy\" class=\" wp-image-4501\" src=\"https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image2-300x239.png\" alt=\"Zoomed-out Figma canvas showing a large grid of connected mobile screens for the Report Broken Site prototype, linked by a dense tangle of blue connector lines.\" width=\"1038\" height=\"827\" srcset=\"https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image2-300x239.png 300w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image2-600x478.png 600w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image2-768x612.png 768w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image2-1536x1224.png 1536w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image2-1000x797.png 1000w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image2.png 1999w\" sizes=\"(max-width: 1038px) 100vw, 1038px\" \/><p id=\"caption-attachment-4501\" class=\"wp-caption-text\">When the logic of a feature is handled by manual connections, the canvas quickly turns into spaghetti of fragile dependencies.<\/p><\/div>\n<h3><b>Prototypes shape participant behavior<\/b><\/h3>\n<p>This becomes especially noticeable in usability testing. Test participants tend to recognize when they are interacting with a prototype, and that awareness can change how they behave. They may hesitate to explore, follow the perceived intent of the task, or tap around when they get stuck.<\/p>\n<p>For example, to keep a prototype manageable, I might only make a few issue types selectable. But then participants are doing two things at once: deciding what they want to do and guessing what the prototype will allow. Their feedback can become shaped by the prototype\u2019s limits, not just the design \u2014\u00a0 like a visitor to the walled garden checking which paths are actually open to them.<\/p>\n<p>That constraint can be useful in early concept testing, where a narrower path helps focus the conversation. It becomes more limiting when we are trying to understand how the full experience behaves.<\/p>\n<p>Research and practice have long acknowledged that <a href=\"https:\/\/www.nngroup.com\/articles\/ux-prototype-hi-lo-fidelity\/\">prototype fidelity<\/a> and <a href=\"https:\/\/uxdesign.cc\/how-high-fidelity-prototypes-can-enhance-user-testing-30245ad0c4d1\">testing setup<\/a> can influence participant behavior. But in practice, many workflows still rely on constrained, screen-to-screen simulations.<\/p>\n<p>I\u2019ve often wondered:<\/p>\n<blockquote><p><b><i>How a user\u2019s perceived experience might change if they weren\u2019t encountering the feature in the isolation of a walled prototype?<\/i><\/b><\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<h2>From walled to native fidelity prototypes<\/h2>\n<p>Designing and prototyping is often described in terms of fidelity \u2014 from low-fidelity sketches to high-fidelity designs ready for dev handoff. That framing focuses on how closely we represent the product, but not necessarily how the experience itself behaves.<\/p>\n<p>As building realistic interactions becomes easier using AI, it may now be possible to move beyond simulating flows in Figma and towards observing how people actually behave. So, alongside designing it in Figma, I built the feature directly into a local version of the Firefox Android app using Claude. It wasn\u2019t straightforward at first, but even the friction of getting it working revealed things I wouldn\u2019t have seen in a Figma prototype.<\/p>\n<p>When I did this, I noticed there were no predefined paths to manage or fragile connections to maintain. The experience felt more continuous, allowing users to move more freely, not just within the feature, but within the app itself. I started thinking of these as prototypes with <b>native fidelity<\/b> \u2014 native to the app, native to the device, and aligned with how users expect interactions to behave.<\/p>\n<h3><b>When prototypes need to handle dynamic behavior<\/b><\/h3>\n<p>The difference between the two types of prototypes is not just theoretical; it starts to change what the experience can support. In walled prototypes, content is often fixed, and interactions move users between predefined screens. While this works for simple flows, it becomes harder to represent how interfaces behave when content needs to update dynamically based on user interaction.<\/p>\n<p>In the <b>Report Broken Site<\/b> feature, this was important. A walled prototype struggles with:<\/p>\n<ul>\n<li aria-level=\"1\"><b>Capturing website data:<\/b> Depending on the browsing tab, metadata like the URL, screenshot, browser info, and tracking data needs to be captured and reflected back to the user.<\/li>\n<li aria-level=\"1\"><b>URL editing:<\/b> Simulating real text entry, cursor movement, and auto-correct behavior.<\/li>\n<li aria-level=\"1\"><b>Branching logic:<\/b> If a user selects \u201cSite doesn\u2019t load\u201d as issue type, the details are optional, but if they choose \u201cSomething else,\u201d details become required.<\/li>\n<li aria-level=\"1\"><b>Error handling:<\/b> For \u201cSomething else,\u201d the system must validate input length in the description box and show an error if it\u2019s insufficient.<\/li>\n<\/ul>\n<p><b>Have you ever run into interactions like these and found yourself simplifying them, just to make the prototype manageable?<\/b><\/p>\n<p>When I built it directly using Claude, the native fidelity prototype was able to handle metadata capture, text input, and branching logic more naturally.<\/p>\n<div id=\"attachment_4502\" style=\"width: 1290px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-4502\" decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-4502\" src=\"https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image3.gif\" alt=\"Screen recording on a real Android device of the Report Broken Site feature, showing the URL field and list of selectable issue types.\" width=\"1280\" height=\"1128\" \/><p id=\"caption-attachment-4502\" class=\"wp-caption-text\">The native fidelity prototype inherits native behaviors like metadata capture, keyboard interactions, and dynamic state changes.<\/p><\/div>\n<h3><b>The environment is part of the experience<\/b><\/h3>\n<p>Another challenge is the environment in which the prototype is experienced. In walled prototypes, layouts are often fixed, and responsiveness is limited. Differences in device size, orientation, or performance can introduce inconsistencies that don\u2019t reflect the intended final experience.<\/p>\n<p>In practice, this can show up as:<\/p>\n<ul>\n<li aria-level=\"1\"><b>Oversized UI elements<\/b> on larger devices as the prototype was created for an average phone size.<\/li>\n<li aria-level=\"1\"><b>Laggy interactions<\/b> on slower networks as Figma prototypes fail to be responsive sometimes.<\/li>\n<li aria-level=\"1\"><b>Layouts that don\u2019t adapt<\/b> as expected because of the constraints of the prototyping environment.<\/li>\n<\/ul>\n<p>When the interaction is built directly in the app, the experience inherits the <b>native environment of the device.<\/b> Layouts respond to screen size, interactions feel more consistent, and the overall experience is closer to what users would encounter in the final product. This could reduce the likelihood of testing interfaces being mistaken for design issues.<\/p>\n<p>&nbsp;<\/p>\n<h2>Tradeoffs and new realities<\/h2>\n<p>This approach introduces its own challenges. First time setup for a designer is complex, and navigating the codebase and working through unfamiliar tools takes effort.<\/p>\n<div id=\"attachment_4504\" style=\"width: 1008px\" class=\"wp-caption aligncenter\"><img aria-describedby=\"caption-attachment-4504\" decoding=\"async\" loading=\"lazy\" class=\" wp-image-4504\" src=\"https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image5-300x195.png\" alt=\"Screenshot of Android Studio showing Claude assisting with a build error alongside the Firefox for Android codebase and a live device preview of the Report Broken Site feature.\" width=\"998\" height=\"649\" srcset=\"https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image5-300x195.png 300w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image5-600x390.png 600w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image5-768x499.png 768w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image5-1536x998.png 1536w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image5-1000x650.png 1000w, https:\/\/blog.mozilla.org\/ux\/files\/2026\/08\/image5.png 1999w\" sizes=\"(max-width: 998px) 100vw, 998px\" \/><p id=\"caption-attachment-4504\" class=\"wp-caption-text\">Using Claude on the Firefox for Android codebase in Android Studio to build the prototype.<\/p><\/div>\n<p>Adopting this approach requires a shift in the UX designer\u2019s toolkit. It raises the barrier to entry by requiring baseline comfort with the terminal, build environments, and IDEs. But it also allows designers to move beyond \u201cfaking the experience\u201d in Figma prototypes and start building directly in the app.<\/p>\n<p><b>Building the prototype this way also changes how the work evolves. <\/b>Instead of worrying about defining everything upfront, requirements tend to emerge through interaction \u2014i.e. edge cases, missing states, and unclear behaviors as the experience is built. In Figma, many of these details are easy to overlook; when you create a prototype by building directly, they become easier to find.<\/p>\n<p>Of course, this realism has its limits. While the experience feels like a continuous system rather than a sequence of steps, I haven\u2019t yet connected it to a backend, pulled in APIs, or tested cross-device capabilities across mobile, tablet, and desktop. I\u2019m still at the start of this exploration. What I want to understand next is how native fidelity prototypes change the testing environment itself: whether participants explore differently, whether failures are easier to interpret, and what new friction this approach introduces for designers and teams.<\/p>\n<p>&nbsp;<\/p>\n<h2>Start failing for the right reasons<\/h2>\n<p>To put it simply: <b>if prototypes constrain user behavior, they may also shape the insights we get from usability testing.<\/b><\/p>\n<p>For Report Broken Site, the value of the native prototype was not just that it handled more states. It gave me a more honest way to sit with the experience before putting it in front of participants. I could edit the URL, switch issue types, trigger validation, and move around the app as the feature would exist in context. Because this was a mobile experience, that context mattered: I could test it on a real device, with real navigation patterns, real input behavior, and the surrounding app experience intact. Those details helped me look past whether the prototype was working and focus more directly on whether the experience was working.<\/p>\n<p>That is what I mean by letting the design fail for the right reasons: understanding whether an experience fails because of the design itself, not because of a missing screen-to-screen connection, bad transition, or laggy Figma prototype. The next step is to test whether this translates into different participant behavior and more useful usability insights.<\/p>\n<p>&nbsp;<\/p>\n<p>Originally published on<a class=\"_ymio1r31 _ypr0glyw _zcxs1o36 _mizu1v1w _1ah3dkaa _ra3xnqa1 _128mdkaa _1cvmnqa1 _4davt94y _4bfu1r31 _1hms8stv _ajmmnqa1 _vchhusvi _kqswh2mm _ect4ttxp _2rkolb4i _syaz13af _1a3b1r31 _4fpr8stv _5goinqa1 _f8pj13af _9oik1r31 _1bnxglyw _jf4cnqa1 _30l313af _1nrm1r31 _c2waglyw _1iohnqa1 _9h8h12zz _10531ra0 _1ien1ra0 _n0fx1ra0 _1vhv17z1\" title=\"https:\/\/medium.com\/firefox-ux\/how-do-people-decide-whether-or-not-to-get-a-browser-extension-334c66ab4484\" href=\"https:\/\/medium.com\/@aarjavpandya\/let-your-designs-fail-for-the-right-reasons-4843c2fa453a\" data-renderer-mark=\"true\" data-is-router-link=\"false\" data-testid=\"link-with-safety\"> medium.com<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>How AI-assisted native prototypes changed what usability testing could show me. &nbsp; If you&#8217;ve ever simplified an interaction just to make a prototype manageable, you&#8217;ve probably felt the tension between &hellip; <a class=\"go\" href=\"https:\/\/blog.mozilla.org\/ux\/2026\/08\/let-your-designs-fail-for-the-right-reasons\/\">Read more<\/a><\/p>\n","protected":false},"author":2076,"featured_media":4520,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4498,9578],"tags":[440725,440727,440726,440691,440724],"coauthors":[440723],"_links":{"self":[{"href":"https:\/\/blog.mozilla.org\/ux\/wp-json\/wp\/v2\/posts\/4515"}],"collection":[{"href":"https:\/\/blog.mozilla.org\/ux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mozilla.org\/ux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/ux\/wp-json\/wp\/v2\/users\/2076"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/ux\/wp-json\/wp\/v2\/comments?post=4515"}],"version-history":[{"count":0,"href":"https:\/\/blog.mozilla.org\/ux\/wp-json\/wp\/v2\/posts\/4515\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/ux\/wp-json\/wp\/v2\/media\/4520"}],"wp:attachment":[{"href":"https:\/\/blog.mozilla.org\/ux\/wp-json\/wp\/v2\/media?parent=4515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mozilla.org\/ux\/wp-json\/wp\/v2\/categories?post=4515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mozilla.org\/ux\/wp-json\/wp\/v2\/tags?post=4515"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mozilla.org\/ux\/wp-json\/wp\/v2\/coauthors?post=4515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}