{"id":65,"date":"2026-03-13T22:42:49","date_gmt":"2026-03-13T22:42:49","guid":{"rendered":"https:\/\/harmonic-framework.com\/experience-based-decomposition\/"},"modified":"2026-04-12T00:47:32","modified_gmt":"2026-04-12T05:47:32","slug":"experience-based-decomposition","status":"publish","type":"page","link":"https:\/\/harmonic-framework.com\/es\/whitepapers\/experience-based-decomposition\/","title":{"rendered":"Experience-Based Decomposition (EBD)"},"content":{"rendered":"<h1 id=\"experience-based-decomposition-ebd\">Experience-Based Decomposition (EBD)<\/h1>\n<p><em>Organizing Interface Architecture Around Human Intent: A Framework<\/em><\/p>\n<p><strong>Author:<\/strong> William Christopher Anderson<br \/>\n<strong>Date:<\/strong> April 2026<br \/>\n<strong>Version:<\/strong> 1.0<\/p>\n<hr \/>\n<h2 id=\"executive-summary\">Executive Summary<\/h2>\n<p>The most common complaint about user interfaces in long-lived products is not that individual screens are poorly designed. It is that changing anything requires touching everything. A wizard gains a conditional step; navigation logic scattered across twelve components must be updated. A new user segment arrives; flow assumptions baked into leaf components need untangling. A new locale is added; string literals buried in state machines surface one by one.<\/p>\n<p>The structural cause of this is well understood in backend systems \u2014 responsibilities distributed across the wrong boundaries \u2014 yet the interface layer repeatedly inherits the same problem, dressed differently. Screens are not boundaries. Components are not boundaries. Routes are not boundaries. None of these are units of human purpose, which is the only boundary that remains stable as products evolve.<\/p>\n<p>Experience-Based Decomposition addresses this by establishing human intent as the organizing principle of interface structure. It defines three architectural tiers:<\/p>\n<ul>\n<li><strong>Experiences<\/strong> represent complete user journeys \u2014 composable, stable, and bounded by purpose rather than screen count.<\/li>\n<li><strong>Flows<\/strong> encapsulate the goal-directed sequences within an experience. They own one goal, one set of accumulated state, and one set of exit conditions.<\/li>\n<li><strong>Interactions<\/strong> are atomic. A selection, an input, a confirmation. They cannot be meaningfully subdivided from the user&#8217;s perspective.<\/li>\n<\/ul>\n<p>Shared utility components handle cross-cutting concerns \u2014 locale, theme, validation, alerts \u2014 without acquiring knowledge of any particular user purpose. A small set of core user journeys validates that the architecture supports real human intent without boundary leakage.<\/p>\n<p>When this structure is in place and backed by an event-driven communication model, something more powerful becomes possible: experiences can be defined and composed through configuration rather than code. An organizational configuration, a feature flag, an audience-specific ruleset \u2014 any of these can alter what an experience contains, in what order flows execute, and how the backend responds to their completion events. The interface becomes programmable at the intent level, not just the component level.<\/p>\n<p>EBD applies most directly to long-lived products, systems serving multiple audience types with distinct mental models, and any product that must remain coherent across years of continuous evolution.<\/p>\n<hr \/>\n<h2 id=\"abstract\">Abstract<\/h2>\n<p>Product interfaces operate under continuous revision. Requirements arrive from user research, competitive pressure, regulation, and organizational restructuring, each demanding changes that rarely respect the edges of existing screens or components. Conventional approaches to interface construction organize code around what the system presents rather than what the user intends to accomplish. As the product grows, every meaningful change touches more than it should. The cost of evolution eventually outpaces the value it delivers.<\/p>\n<p>Experience-Based Decomposition is a decomposition framework that treats human intent as the primary structural force in UX design. It introduces a three-tier hierarchy \u2014 Experiences, Flows, and Interactions \u2014 defines explicit roles, responsibilities, and communication rules for each, and validates structural decisions against a small set of core user journeys. It further describes how an event-driven communication model, when combined with external configuration, enables experiences to be composed and routed dynamically \u2014 decoupling UX structure from code in the same way that Volatility-Based Decomposition decouples system behavior from system structure. This paper provides a practitioner-oriented articulation of EBD, covering its structural model, communication discipline, configuration-driven composition, and application across real product contexts.<\/p>\n<hr \/>\n<h2 id=\"1-introduction\">1. Introduction<\/h2>\n<p>Interface design has accumulated considerable practice rigor over the past three decades. Interaction design, information architecture, accessibility standards, and component design systems have each contributed real improvements to how products are conceived, constructed, and maintained. Despite this, the underlying architectural problem \u2014 how to structure the interface layer so that it absorbs change gracefully \u2014 remains largely unsolved in most codebases.<\/p>\n<p>The most expensive interface changes are not redesigns. They are the routine ones: a new field in a form that ripples through five components, a conditional step that requires refactoring a navigation model, a new organizational unit that invalidates assumptions embedded in a dozen places. These changes are expensive not because they are complex in themselves, but because the structure of the codebase offers no natural home for the logic they require. Each modification finds space where it can, distributing responsibility in ways that make the next modification more expensive.<\/p>\n<p>The root cause is misalignment between what the code is organized around and what the user is organized around. Code is organized around screens. Users are organized around purposes.<\/p>\n<p>A user opening a developer onboarding tool is not navigating to a screen. They are pursuing a goal \u2014 getting their environment configured correctly \u2014 and that goal may involve seven screens, four API calls, three conditional branches depending on their organization&#8217;s configuration, and a different set of form fields than their colleague sitting next to them. None of that variation lives in the goal itself. The goal is stable. The implementation of it is what varies.<\/p>\n<p>Experience-Based Decomposition organizes the interface layer around that distinction. Structure follows intent. What varies is isolated from what endures. The principles are the same ones that underpin Volatility-Based Decomposition at the system level \u2014 applied here to the surface that users actually touch.<\/p>\n<hr \/>\n<h2 id=\"2-background\">2. Background<\/h2>\n<h3 id=\"21-screen-centric-organization-and-its-consequences\">2.1 Screen-Centric Organization and Its Consequences<\/h3>\n<p>Frontend frameworks present an implicit model: routes map to pages, pages contain components, components contain logic. This model works well enough when an interface is small and stable. It begins to break down when the product matures and the implementation becomes load-bearing in unexpected places.<\/p>\n<p>The specific failure mode is familiar. State that belongs to a multi-step sequence ends up in a parent component managing all steps. Navigation decisions that depend on user context end up duplicated across components that each independently try to determine what the user should see next. Business logic \u2014 what counts as a valid selection, when a step can be skipped \u2014 migrates into presentation components because there is no structural location for it that is clearly correct.<\/p>\n<p>Once this pattern takes hold, it is self-reinforcing. New code follows existing patterns. The next engineer to add a feature adds it where similar features already live. The structural debt compounds.<\/p>\n<p><em>Figure 1a shows the screen-centric failure mode: logic accumulates everywhere because screens are not boundaries. Figure 1b shows EBD&#8217;s intent-centric structure: each tier has one responsibility.<\/em><\/p>\n<p><strong>Figure 1a \u2014 Screen-Centric Organization<\/strong><\/p>\n<pre><code class=\"\" data-line=\"\">%%{init: {&#039;theme&#039;: &#039;base&#039;, &#039;themeVariables&#039;: {&#039;primaryColor&#039;: &#039;#e0e7ff&#039;, &#039;primaryTextColor&#039;: &#039;#1e293b&#039;, &#039;primaryBorderColor&#039;: &#039;#4338ca&#039;, &#039;lineColor&#039;: &#039;#4338ca&#039;, &#039;secondaryColor&#039;: &#039;#d1fae5&#039;, &#039;tertiaryColor&#039;: &#039;#ede9fe&#039;, &#039;background&#039;: &#039;#ffffff&#039;, &#039;mainBkg&#039;: &#039;#e0e7ff&#039;, &#039;nodeBorder&#039;: &#039;#4338ca&#039;, &#039;clusterBkg&#039;: &#039;#f5f3ff&#039;, &#039;edgeLabelBackground&#039;: &#039;#ffffff&#039;}}}%%\n\nflowchart LR\n    S1[&quot;Screen A&quot;]\n    S2[&quot;Screen B&quot;]\n    S3[&quot;Screen C&quot;]\n    S1 &lt;--&gt;|&quot;navigation + state&quot;| S2\n    S2 &lt;--&gt;|&quot;navigation + state&quot;| S3\n    S1 -.-&gt;|&quot;validation duplicated&quot;| S3\n\n<\/code><\/pre>\n<p><strong>Figure 1b \u2014 Intent-Centric Organization (EBD)<\/strong><\/p>\n<pre><code class=\"\" data-line=\"\">%%{init: {&#039;theme&#039;: &#039;base&#039;, &#039;themeVariables&#039;: {&#039;primaryColor&#039;: &#039;#e0e7ff&#039;, &#039;primaryTextColor&#039;: &#039;#1e293b&#039;, &#039;primaryBorderColor&#039;: &#039;#4338ca&#039;, &#039;lineColor&#039;: &#039;#4338ca&#039;, &#039;secondaryColor&#039;: &#039;#d1fae5&#039;, &#039;tertiaryColor&#039;: &#039;#ede9fe&#039;, &#039;background&#039;: &#039;#ffffff&#039;, &#039;mainBkg&#039;: &#039;#e0e7ff&#039;, &#039;nodeBorder&#039;: &#039;#4338ca&#039;, &#039;clusterBkg&#039;: &#039;#f5f3ff&#039;, &#039;edgeLabelBackground&#039;: &#039;#ffffff&#039;}}}%%\n\nflowchart TD\n    EX[&quot;OnboardingExperience&quot;]\n    FL[&quot;UserInfoFlow&quot;]\n    IN[&quot;FormField \/ DropdownSelect&quot;]\n    UT[&quot;Locale \/ Theme&quot;]\n\n    EX --&gt;|&quot;composes, passes state&quot;| FL\n    FL --&gt;|&quot;renders&quot;| IN\n    IN -.-&gt;|&quot;emits event&quot;| FL\n    FL -.-&gt;|&quot;emits completion&quot;| EX\n    FL --&gt; UT\n    IN --&gt; UT\n\n<\/code><\/pre>\n<h3 id=\"22-component-based-thinking-and-its-limits\">2.2 Component-Based Thinking and Its Limits<\/h3>\n<p>The dominant response to screen-level fragility has been the component library: shared, composable UI primitives that enforce visual consistency and reduce repetition. This approach has genuine value. Reusable components reduce duplication. Design systems create coherence. Neither addresses decomposition.<\/p>\n<p>A component library answers the question: <em>how do we build consistent interface elements?<\/em> It does not answer the question: <em>where does navigation logic live? Who owns multi-step state? What happens when a step should be skipped?<\/em> Those questions require a structural model, not a component model.<\/p>\n<p>Brad Frost&#8217;s Atomic Design methodology made an important contribution to this problem by establishing a vocabulary for hierarchical component composition \u2014 atoms, molecules, organisms, templates, pages. The hierarchy is real and useful at the component level. What it does not provide is a model for the <em>behavioral<\/em> hierarchy: the distinction between an atomic interaction (selecting an item), a goal-directed sequence (choosing a configuration profile), and a complete user journey (onboarding a developer). Atoms and molecules are structural units. Interactions, flows, and experiences are intentional units. Both taxonomies are necessary; neither replaces the other.<\/p>\n<h3 id=\"23-goal-directed-design-as-a-precursor\">2.3 Goal-Directed Design as a Precursor<\/h3>\n<p>Alan Cooper&#8217;s goal-directed design methodology, articulated in <em>About Face<\/em>, established the foundational insight that interfaces should serve user goals rather than reflect system capabilities. Cooper argued that personas and scenarios should drive interaction design decisions \u2014 that the question is not what the system can do but what the user is trying to accomplish.<\/p>\n<p>EBD extends this insight structurally. It is not sufficient to design around user goals at the specification level if the implementation is organized around screens. The goal-directed principle must persist into the codebase structure, or it dissipates at the moment implementation begins.<\/p>\n<hr \/>\n<h2 id=\"3-the-four-axes-of-interface-volatility\">3. The Four Axes of Interface Volatility<\/h2>\n<p>Before defining the structural model, it is useful to characterize where change actually occurs in interface systems \u2014 the same volatility analysis that underpins Volatility-Based Decomposition at the system level, applied here to the interface layer.<\/p>\n<h3 id=\"31-functional-volatility\">3.1 Functional Volatility<\/h3>\n<p>Changes in what the user is asked to do \u2014 new fields, new validation rules, new options, added or removed steps. This is the most frequent category of interface change, driven by product decisions, user research findings, regulatory requirements, and organizational configuration differences. When functional volatility is not isolated, a single new field type forces changes across presentation, validation, state management, and API layer simultaneously.<\/p>\n<h3 id=\"32-non-functional-volatility\">3.2 Non-Functional Volatility<\/h3>\n<p>Changes in how journeys compose \u2014 a new audience type requiring a different path through the same flows, a new entry point, a conditional sub-journey that applies only to a segment of users. Non-functional volatility at the interface layer is less frequent but carries higher impact, because it affects the composition of the interface rather than any individual component.<\/p>\n<h3 id=\"33-cross-cutting-volatility\">3.3 Cross-Cutting Volatility<\/h3>\n<p>Changes to concerns that propagate broadly without belonging to any particular flow: locale strings, visual themes, form validation conventions, error presentation formats, accessibility requirements. These change independently of user goals and should be isolated in shared utilities that flows and interactions consume without embedding.<\/p>\n<h3 id=\"34-environmental-volatility\">3.4 Environmental Volatility<\/h3>\n<p>Changes to the external systems the interface depends on \u2014 backend API shapes, authentication mechanisms, configuration schemas. This is the interface&#8217;s equivalent of the integration volatility that Resource Accessors handle in VBD. It should be contained at a thin boundary layer rather than distributed across flows.<\/p>\n<p><em>Figure 2 maps each volatility axis to the structural tier responsible for containing it.<\/em><\/p>\n<pre><code class=\"\" data-line=\"\">%%{init: {&#039;theme&#039;: &#039;base&#039;, &#039;themeVariables&#039;: {&#039;primaryColor&#039;: &#039;#e0e7ff&#039;, &#039;primaryTextColor&#039;: &#039;#1e293b&#039;, &#039;primaryBorderColor&#039;: &#039;#4338ca&#039;, &#039;lineColor&#039;: &#039;#4338ca&#039;, &#039;secondaryColor&#039;: &#039;#d1fae5&#039;, &#039;tertiaryColor&#039;: &#039;#ede9fe&#039;, &#039;background&#039;: &#039;#ffffff&#039;, &#039;mainBkg&#039;: &#039;#e0e7ff&#039;, &#039;nodeBorder&#039;: &#039;#4338ca&#039;, &#039;clusterBkg&#039;: &#039;#f5f3ff&#039;, &#039;edgeLabelBackground&#039;: &#039;#ffffff&#039;}}}%%\n\ngraph TB\n    subgraph axes[&quot;Four Axes of Interface Volatility&quot;]\n        FV[&quot;Functional&quot;]\n        NF[&quot;Non-Functional&quot;]\n        CV[&quot;Cross-Cutting&quot;]\n        EV[&quot;Environmental&quot;]\n    end\n\n    subgraph tiers[&quot;Containing Tier&quot;]\n        INT[&quot;Interaction&quot;]\n        EXP[&quot;Experience&quot;]\n        UTL[&quot;Utility&quot;]\n    end\n\n    FV --&gt;|isolated by| INT\n    NF --&gt;|isolated by| EXP\n    CV --&gt;|isolated by| UTL\n    EV --&gt;|isolated by| EXP\n\n<\/code><\/pre>\n<hr \/>\n<h2 id=\"4-the-structural-model\">4. The Structural Model<\/h2>\n<p>Experience-Based Decomposition organizes the interface into four structural roles. Each has a defined scope, a bounded set of responsibilities, and explicit rules governing communication with the other roles.<\/p>\n<h3 id=\"41-experiences\">4.1 Experiences<\/h3>\n<p>An experience is a complete user journey bounded by a human intent \u2014 the arc from initiation to fulfillment. It is the answer to the question: <em>what did this user come here to accomplish?<\/em><\/p>\n<p>Experiences are the most durable tier. The intent behind a developer onboarding experience \u2014 understand the organization&#8217;s configuration requirements, provide personal context, complete the setup \u2014 endures across product iterations, new configuration types, new field types, and new platform targets. An experience should be reconsidered only when the underlying human purpose changes, which is rare.<\/p>\n<p>An experience owns the composition of flows that constitute the journey, the complete state accumulated across all of them, the transitions and terminal conditions, and the top-level progress representation. It is also the only tier that communicates with the backend. When the journey reaches a point where accumulated state should be acted on \u2014 a checkpoint, a completion \u2014 the experience emits that state as a single coherent event. It holds everything. It decides what comes next.<\/p>\n<p>This gateway role is not incidental. Because the experience has the full picture across all flows, it is the only component that can make a meaningful decision about when and what to send to the backend. A flow knows only its own scope. The experience knows the journey.<\/p>\n<p>An experience <strong>MUST NOT<\/strong> implement flow-level progression logic.<br \/>\nAn experience <strong>MUST NOT<\/strong> render interaction components directly.<br \/>\nAn experience <strong>MAY<\/strong> compose other experiences as bounded sub-journeys.<br \/>\nAn experience <strong>MAY<\/strong> receive configuration that determines which flows it contains and in what order.<br \/>\nAn experience <strong>MAY<\/strong> call the backend API, passing accumulated journey state as a completion event.<\/p>\n<h3 id=\"42-flows\">4.2 Flows<\/h3>\n<p>A flow is a goal-directed sequence of interactions that accomplishes one discrete outcome within an experience. It is bounded by its goal. One flow, one purpose. The selection of a configuration profile is a flow. The collection of user information is a flow. The confirmation of an installation is a flow. None of these is a screen, though each may render through one.<\/p>\n<p>Flows sit at the most structurally important tier \u2014 the one most commonly absent from interface codebases. Because they have no natural representation in screen-first frameworks, flow logic ends up distributed: navigation conditionals in parent components, validation in leaf components, accumulated state in global stores. When the flow has no home, everything becomes its home.<\/p>\n<p>A flow owns its progression through interactions and the state it accumulates across them. It does not communicate with the backend \u2014 that is the experience&#8217;s concern. When a flow finishes, it emits its accumulated state upward. What happens with that state is not the flow&#8217;s decision.<\/p>\n<p>A flow <strong>MUST NOT<\/strong> coordinate directly with sibling flows.<br \/>\nA flow <strong>MUST NOT<\/strong> make direct API calls.<br \/>\nA flow <strong>MUST NOT<\/strong> render utility components as owned children \u2014 it invokes them.<br \/>\nA flow <strong>MAY<\/strong> emit a completion event carrying accumulated state upward to the experience.<br \/>\nA flow <strong>MAY<\/strong> skip itself entirely if its entry conditions are not met, signaling the experience to advance.<\/p>\n<h3 id=\"43-interactions\">4.3 Interactions<\/h3>\n<p>An interaction is the smallest observable unit of user action \u2014 atomic and indivisible from the user&#8217;s perspective. Selecting from a list, entering text, toggling a checkbox, clicking a button, reading a status message. Interactions are the surface. They are what users actually touch.<\/p>\n<p>Interactions are the most volatile tier. The specific fields a given configuration requires changes between organizations. Labels, placeholders, and help text change with locale. Control types \u2014 a dropdown becoming a searchable select, a checkbox becoming a toggle \u2014 change with design decisions. Because interactions are the most likely to change, they must be the most isolated.<\/p>\n<p>An interaction owns its visual presentation, its internal display state (focused, disabled, errored), and the event it emits when the user acts.<\/p>\n<p>An interaction <strong>MUST NOT<\/strong> contain flow progression logic.<br \/>\nAn interaction <strong>MUST NOT<\/strong> make direct API calls.<br \/>\nAn interaction <strong>MUST NOT<\/strong> be aware of adjacent interactions.<br \/>\nAn interaction <strong>MAY<\/strong> use utility components for locale rendering, validation display, and alert presentation.<\/p>\n<h3 id=\"44-utilities\">4.4 Utilities<\/h3>\n<p>Utilities encapsulate capabilities that cut across all three tiers without belonging to any of them. They are consumed; they do not consume. They have no knowledge of user journeys, specific goals, or the context in which they are invoked.<\/p>\n<p>Locale rendering, visual theme application, progress indication, field validation, and alert presentation are all utility concerns. A locale renderer that knows it is rendering an onboarding string has violated its boundary. The same utility that renders &#8220;Next&#8221; in English should render &#8220;Suivant&#8221; in French without any awareness of which flow requested the translation.<\/p>\n<p>A utility <strong>MUST NOT<\/strong> contain flow progression logic.<br \/>\nA utility <strong>MUST NOT<\/strong> hold domain-specific state.<br \/>\nA utility <strong>MUST NOT<\/strong> coordinate workflows or make decisions on behalf of flows.<\/p>\n<p><em>Figure 3 shows the complete structural model and the communication rules between roles.<\/em><\/p>\n<pre><code class=\"\" data-line=\"\">%%{init: {&#039;theme&#039;: &#039;base&#039;, &#039;themeVariables&#039;: {&#039;primaryColor&#039;: &#039;#e0e7ff&#039;, &#039;primaryTextColor&#039;: &#039;#1e293b&#039;, &#039;primaryBorderColor&#039;: &#039;#4338ca&#039;, &#039;lineColor&#039;: &#039;#4338ca&#039;, &#039;secondaryColor&#039;: &#039;#d1fae5&#039;, &#039;tertiaryColor&#039;: &#039;#ede9fe&#039;, &#039;background&#039;: &#039;#ffffff&#039;, &#039;mainBkg&#039;: &#039;#e0e7ff&#039;, &#039;nodeBorder&#039;: &#039;#4338ca&#039;, &#039;edgeLabelBackground&#039;: &#039;#ffffff&#039;}}}%%\n\nflowchart TD\n    EXP[&quot;Experience&quot;]\n    FLW[&quot;Flow&quot;]\n    INT[&quot;Interaction&quot;]\n    UTL[&quot;Utility&quot;]\n    CFG[&quot;Configuration&quot;]\n\n    CFG --&gt;|&quot;defines flow composition&quot;| EXP\n    EXP --&gt;|&quot;composes, passes state&quot;| FLW\n    EXP --&gt;|&quot;embeds as sub-journey&quot;| EXP\n    FLW --&gt;|&quot;composes, passes props&quot;| INT\n    INT -.-&gt;|&quot;emits event&quot;| FLW\n    FLW -.-&gt;|&quot;emits completion&quot;| EXP\n    INT --&gt; UTL\n    FLW --&gt; UTL\n    EXP --&gt; UTL\n\n<\/code><\/pre>\n<hr \/>\n<h2 id=\"5-communication-rules\">5. Communication Rules<\/h2>\n<p>The structural boundaries described above are only as strong as the discipline applied to communication between roles. A flow that calls another flow directly has already coupled itself to that flow&#8217;s internal state model, regardless of how cleanly each is implemented in isolation.<\/p>\n<p>The governing rule is directional: <strong>state flows downward; results propagate upward as events.<\/strong> An experience passes configuration and shared state to flows. Flows pass props and callbacks to interactions. Interactions emit events \u2014 they do not call flows. Flows emit completion events \u2014 they do not call experiences. No tier reaches sideways. No tier reaches up.<\/p>\n<p>Backend communication is the exclusive domain of the experience. A flow that discovers it needs to call an API has exceeded its scope \u2014 it has taken on a decision that belongs one tier up. The experience holds the complete state of the journey. It is the only component with enough information to know when that state is ready to be sent somewhere, what form it should take, and what should happen next in response. Flows surface their state upward and wait for the experience to advance them.<\/p>\n<p>This containment prevents the most common failure mode: a flow that accumulates awareness of sibling flows and backend responses, gradually becoming a de facto experience manager while remaining architecturally classified as a flow.<\/p>\n<p>The second governing rule addresses cross-tier calls: <strong>nothing calls a utility; everything consumes it.<\/strong> Utilities are invoked inline, not coordinated. A flow does not ask a locale utility to translate a string and then wait for a response. It calls <code class=\"\" data-line=\"\">t(&quot;buttons.next&quot;)<\/code> and receives a string. The distinction matters because a utility that receives callbacks or coordinates timing has begun behaving like a flow.<\/p>\n<p><em>Figure 4 shows the lifecycle of a single flow \u2014 how it receives context from the experience, collects state through interactions, and resolves to a completion event.<\/em><\/p>\n<pre><code class=\"\" data-line=\"\">%%{init: {&#039;theme&#039;: &#039;base&#039;, &#039;themeVariables&#039;: {&#039;primaryColor&#039;: &#039;#e0e7ff&#039;, &#039;primaryTextColor&#039;: &#039;#1e293b&#039;, &#039;primaryBorderColor&#039;: &#039;#4338ca&#039;, &#039;lineColor&#039;: &#039;#4338ca&#039;, &#039;secondaryColor&#039;: &#039;#d1fae5&#039;, &#039;tertiaryColor&#039;: &#039;#ede9fe&#039;, &#039;background&#039;: &#039;#ffffff&#039;, &#039;mainBkg&#039;: &#039;#e0e7ff&#039;, &#039;nodeBorder&#039;: &#039;#4338ca&#039;, &#039;clusterBkg&#039;: &#039;#f5f3ff&#039;, &#039;edgeLabelBackground&#039;: &#039;#ffffff&#039;}}}%%\n\nstateDiagram-v2\n    [*] --&gt; Entering : Experience calls enter(sharedState)\n\n    Entering --&gt; CheckSkip : Evaluate entry conditions\n    CheckSkip --&gt; Skipped : Conditions not met\n    CheckSkip --&gt; Active : Conditions met\n\n    Skipped --&gt; [*] : Emits skip() to Experience\n\n    Active --&gt; CollectingState : Render interactions, wait for events\n\n    CollectingState --&gt; CollectingState : Interaction emits event; flow accumulates state\n\n    CollectingState --&gt; Validating : User requests advancement\n\n    Validating --&gt; CollectingState : Validation errors \u2014 return to interactions\n\n    Validating --&gt; Complete : All valid\n\n    Complete --&gt; [*] : Emits flowComplete(accumulatedState) to Experience\n<\/code><\/pre>\n<hr \/>\n<h2 id=\"6-configuration-driven-experience-composition\">6. Configuration-Driven Experience Composition<\/h2>\n<p>The structural model described in the preceding sections is valuable in its own right. It localizes change, clarifies ownership, and produces codebases where the user&#8217;s intent is legible in the architecture. When combined with an event-driven communication model and external configuration, it enables something more significant: <strong>experience composition as a runtime concern rather than a compile-time one.<\/strong><\/p>\n<p>This is the natural extension of getting the structure right. If an experience is defined as a composition of flows, and that composition is expressed in data rather than code, then the composition itself becomes configurable. An organizational configuration artifact can specify which flows an experience contains, in what order they execute, and what conditions cause any of them to be skipped. Two users with the same interface binary can experience meaningfully different journeys based solely on configuration.<\/p>\n<p>In practice, this requires three things:<\/p>\n<p><strong>A configuration schema that describes experience composition.<\/strong> A schema might specify required flows, optional flows, their execution order, and skip conditions for each. An organization that requires an additional compliance step presents a flow the standard user never sees. An audience segment with a simplified onboarding path skips flows irrelevant to their context. The same interface binary serves both, driven entirely by configuration.<\/p>\n<p><strong>An event-based communication model between the interface and the backend.<\/strong> When a flow emits a completion event, that event carries the accumulated state from the flow \u2014 the selections made, the information provided. A properly structured backend, upon receiving this event, can route the remainder of the transaction differently based on the same configuration that governed the interface. A user who selected the enterprise segment in an OrgProfileFlow may have their provisioning routed through a compliance-validation backend path that the standard user never encounters. The interface does not know about this routing. It emitted an event with a payload. The backend decided what to do.<\/p>\n<p><strong>Backend architecture capable of absorbing this routing.<\/strong> The techniques for achieving this on the backend \u2014 separating orchestration from execution, isolating integration concerns, routing workflow decisions through configurable managers \u2014 are described fully in <em>Volatility-Based Decomposition in Software Architecture<\/em> (Anderson, 2026). The interface-side pattern and the backend-side pattern are designed to compose: the same organizational configuration that drives flow selection in the experience layer drives route selection in the manager layer.<\/p>\n<p><em>Figure 5 illustrates this end-to-end configuration-driven model.<\/em><\/p>\n<pre><code class=\"\" data-line=\"\">%%{init: {&#039;theme&#039;: &#039;base&#039;, &#039;themeVariables&#039;: {&#039;primaryColor&#039;: &#039;#e0e7ff&#039;, &#039;primaryTextColor&#039;: &#039;#1e293b&#039;, &#039;primaryBorderColor&#039;: &#039;#4338ca&#039;, &#039;lineColor&#039;: &#039;#4338ca&#039;, &#039;secondaryColor&#039;: &#039;#d1fae5&#039;, &#039;tertiaryColor&#039;: &#039;#ede9fe&#039;, &#039;background&#039;: &#039;#ffffff&#039;, &#039;mainBkg&#039;: &#039;#e0e7ff&#039;, &#039;nodeBorder&#039;: &#039;#4338ca&#039;, &#039;clusterBkg&#039;: &#039;#f5f3ff&#039;, &#039;edgeLabelBackground&#039;: &#039;#f8fafc&#039;}}}%%\n\nflowchart TD\n    subgraph config[&quot;Organizational Configuration&quot;]\n        PC[&quot;org.config&quot;]\n    end\n\n    subgraph ux[&quot;UX Layer \u2014 EBD&quot;]\n        EXP[&quot;OnboardingExperience&quot;]\n        FLOWS[&quot;Config \u00b7 UserInfo \u00b7 Segment \u00b7 Setup&quot;]\n        EXP --&gt;|&quot;composes&quot;| FLOWS\n    end\n\n    subgraph ev[&quot;Event Boundary&quot;]\n        EV[&quot;Completion Event&quot;]\n    end\n\n    subgraph backend[&quot;Backend Layer \u2014 VBD&quot;]\n        MGR[&quot;OnboardingManager&quot;]\n        ENG[&quot;PolicyEngine \u00b7 SegmentEngine&quot;]\n        ACC[&quot;WorkspaceAccessor \u00b7 IdentityAccessor \u00b7 StorageAccessor&quot;]\n        MGR --&gt;|&quot;invokes&quot;| ENG\n        MGR --&gt;|&quot;invokes&quot;| ACC\n    end\n\n    PC --&gt;|&quot;drives flow composition&quot;| EXP\n    PC --&gt;|&quot;drives routing&quot;| MGR\n    FLOWS -.-&gt;|&quot;emits on complete&quot;| EV\n    EV --&gt;|&quot;received by&quot;| MGR\n\n<\/code><\/pre>\n<p>The consequence of this architecture is worth stating plainly. Once the interface is composed from configuration rather than code, the surface presented to different user segments, organizational units, or deployment contexts can diverge without any code change. A new organizational division that requires an additional configuration flow is accommodated by updating configuration, not by shipping new interface code. Feature flags that progressively surface new experiences to pilot users become a matter of configuration management rather than a deployment. The interface becomes programmable at the level of human purpose.<\/p>\n<p>This is the intended endpoint of applying volatility-first thinking to the interface layer. The structural model localizes change. Configuration-driven composition removes the need for most change to touch code at all.<\/p>\n<hr \/>\n<h2 id=\"7-core-user-journeys-as-architectural-validation\">7. Core User Journeys as Architectural Validation<\/h2>\n<p>The concept of core use cases as architectural validation mechanisms appears in Volatility-Based Decomposition as a check against boundary leakage. The same technique applies here.<\/p>\n<p>Core user journeys are intentionally narrow. Even complex products have a small number of genuinely core journeys \u2014 the high-level human purposes that define what the product is for. Most documented use cases and user stories are variations, edge cases, and exception paths around a much smaller set of essential behaviors.<\/p>\n<p>An interface architecture is structurally sound if each core user journey can be traced cleanly through the Experience \u2192 Flow \u2192 Interaction hierarchy without bypassing structural rules. Specifically:<\/p>\n<ul>\n<li>A change within one flow must not require changes in a sibling flow.<\/li>\n<li>Adding a new interaction to a flow must not require modifying the experience.<\/li>\n<li>Introducing a new locale string must not require modifying any flow or experience.<\/li>\n<li>A new organizational configuration variant must produce a different experience composition without code changes.<\/li>\n<\/ul>\n<p>If any of these conditions fails, the failure points directly to where the architectural boundary has been violated.<\/p>\n<p>A product serving multiple audience types might define three core user journeys \u2014 initial onboarding, profile configuration, and workspace setup \u2014 each exercising the architecture across different volatility profiles. The onboarding journey exposes functional and non-functional volatility, as conditional paths and field sets differ by organizational segment. The configuration journey exercises the Experience&#8217;s environmental boundary directly, translating accumulated user state into a backend API call. The setup journey validates the configuration-driven model, confirming that what the user sees is derived from recorded configuration rather than hardcoded assumptions about their context.<\/p>\n<p><em>Figure 6 traces a multi-segment onboarding journey through the structural hierarchy.<\/em><\/p>\n<pre><code class=\"\" data-line=\"\">%%{init: {&#039;theme&#039;: &#039;base&#039;, &#039;themeVariables&#039;: {&#039;primaryColor&#039;: &#039;#e0e7ff&#039;, &#039;primaryTextColor&#039;: &#039;#1e293b&#039;, &#039;primaryBorderColor&#039;: &#039;#4338ca&#039;, &#039;lineColor&#039;: &#039;#4338ca&#039;, &#039;secondaryColor&#039;: &#039;#d1fae5&#039;, &#039;tertiaryColor&#039;: &#039;#ede9fe&#039;, &#039;background&#039;: &#039;#ffffff&#039;, &#039;actorBkg&#039;: &#039;#e0e7ff&#039;, &#039;actorBorder&#039;: &#039;#4338ca&#039;, &#039;activationBkg&#039;: &#039;#ede9fe&#039;, &#039;activationBorderColor&#039;: &#039;#7c3aed&#039;, &#039;signalColor&#039;: &#039;#4338ca&#039;, &#039;signalTextColor&#039;: &#039;#1e293b&#039;, &#039;noteBkgColor&#039;: &#039;#fef3c7&#039;, &#039;noteBorderColor&#039;: &#039;#d97706&#039;, &#039;noteTextColor&#039;: &#039;#1e293b&#039;}}}%%\n\nsequenceDiagram\n    actor User\n    participant OE as OnboardingExperience\n    participant CSF as ConfigSelectionFlow\n    participant UIF as UserInfoFlow\n    participant OPF as OrgProfileFlow\n    participant SF as SetupFlow\n    participant Util as Utilities\n\n    User-&gt;&gt;OE: Opens onboarding\n    OE-&gt;&gt;Util: t(&quot;steps.config_selection&quot;) \u00b7 applyTheme()\n    OE-&gt;&gt;CSF: enter()\n    CSF-&gt;&gt;User: Renders configuration options\n    User-&gt;&gt;CSF: Selects configuration profile\n    CSF--&gt;&gt;OE: flowComplete({ config })\n\n    OE-&gt;&gt;UIF: enter(config)\n    UIF-&gt;&gt;User: Renders fields from org configuration\n    User-&gt;&gt;UIF: Fills required profile fields\n    UIF--&gt;&gt;OE: flowComplete({ userInfo })\n\n    Note over OE: GET \/api\/config\/segments\n    alt Has optional segments\n        OE-&gt;&gt;OPF: enter(config, segments)\n        OPF-&gt;&gt;User: Renders segment selectors\n        User-&gt;&gt;OPF: Selects organizational segment\n        OPF--&gt;&gt;OE: flowComplete({ segment })\n    else No optional segments\n        OE-&gt;&gt;OE: advance \u2014 OrgProfileFlow skipped\n    end\n\n    OE-&gt;&gt;SF: enter({ config, userInfo, segment })\n    SF-&gt;&gt;User: Renders setup progress UI\n    SF--&gt;&gt;OE: flowComplete()\n    Note over OE: POST \/api\/onboard { config, userInfo, segment }\n    OE-&gt;&gt;User: Renders completion and next steps\n<\/code><\/pre>\n<hr \/>\n<h2 id=\"8-architectural-watchpoints\">8. Architectural Watchpoints<\/h2>\n<h3 id=\"interaction-scope-creep\">Interaction Scope Creep<\/h3>\n<p>Interaction components that begin making API calls or managing flow state have absorbed responsibility that belongs one tier up. This pattern typically emerges when a team adds a feature to the most convenient location rather than the correct one. The correction is to extract the logic into the flow and reduce the interaction to its atomic role.<\/p>\n<h3 id=\"flow-awareness-of-siblings\">Flow Awareness of Siblings<\/h3>\n<p>A flow that checks the state of a sibling flow \u2014 even through a shared store \u2014 has created a hidden coupling that the structural model was designed to prevent. When a flow needs data produced by another flow, that data should be passed downward from the experience as shared state. If this happens repeatedly, it suggests the experience boundary needs reexamination.<\/p>\n<h3 id=\"configuration-complexity-threshold\">Configuration Complexity Threshold<\/h3>\n<p>Configuration-driven composition is powerful, but configuration schemas that grow unconstrained become their own maintenance problem. The same volatility analysis applied to code should be applied to configuration: stable aspects of experience composition belong in code; variable aspects belong in configuration. The boundary between them should be explicit and documented.<\/p>\n<h3 id=\"utility-drift\">Utility Drift<\/h3>\n<p>Utilities that accumulate knowledge of specific flows, user types, or domain rules have crossed from utility into engine territory. A validation utility that behaves differently for enterprise users is no longer a utility. The correction is to move the domain-specific logic into the flow and preserve the utility&#8217;s domain-agnostic contract.<\/p>\n<h3 id=\"experience-depth\">Experience Depth<\/h3>\n<p>Experiences may compose other experiences, but nesting beyond two levels increases coordination cost significantly. Deep experience composition is often a signal that the containing experience has grown into a product rather than a journey, and that the product-level structure needs a separate organizational model.<\/p>\n<hr \/>\n<h2 id=\"9-relationship-to-volatility-based-decomposition\">9. Relationship to Volatility-Based Decomposition<\/h2>\n<p>EBD and VBD share a single foundational premise: boundaries aligned with change produce systems that remain coherent as they grow. Applied at the system level, this insight produces the Manager-Engine-Accessor-Utility taxonomy. Applied at the UX level, it produces the Experience-Flow-Interaction-Utility taxonomy. The structural parallels are deliberate.<\/p>\n<table>\n<thead>\n<tr>\n<th>VBD<\/th>\n<th>EBD<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Manager<\/td>\n<td>Experience<\/td>\n<\/tr>\n<tr>\n<td>Engine<\/td>\n<td>Flow<\/td>\n<\/tr>\n<tr>\n<td>Resource Accessor<\/td>\n<td>Interaction<\/td>\n<\/tr>\n<tr>\n<td>Utility<\/td>\n<td>Utility<\/td>\n<\/tr>\n<tr>\n<td>Core Use Case<\/td>\n<td>Core User Journey<\/td>\n<\/tr>\n<tr>\n<td>Communication rules (MUST\/MUST NOT)<\/td>\n<td>Communication rules (MUST\/MUST NOT)<\/td>\n<\/tr>\n<tr>\n<td>Volatility axis<\/td>\n<td>Interface volatility axis<\/td>\n<\/tr>\n<tr>\n<td>Configuration-driven routing<\/td>\n<td>Configuration-driven experience composition<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The frameworks are designed to compose across the system boundary. When a flow emits a completion event, a VBD manager receives it and routes the subsequent work. Both are responding to the same organizational configuration. Neither knows about the other&#8217;s internal structure. The contract is the event payload and the configuration schema \u2014 nothing more.<\/p>\n<p>This alignment is not merely aesthetic. When both frameworks are applied consistently, changes to organizational configuration propagate through the full stack in a coordinated way: the interface renders different flows, the backend executes different paths, and neither layer required code modification. The configuration is the product. The code is infrastructure.<\/p>\n<hr \/>\n<h2 id=\"10-practitioner-observations\">10. Practitioner Observations<\/h2>\n<p>The following observations emerge from applying Experience-Based Decomposition across multiple interface systems of varying scale, domain, and maturity. They are not specific to any single product or organization. They describe recurring structural patterns \u2014 some beneficial, some pathological \u2014 that practitioners encounter as EBD moves from a design-time concept to a living codebase.<\/p>\n<h3 id=\"101-the-flow-proliferation-pattern\">10.1 The Flow Proliferation Pattern<\/h3>\n<p>Teams new to EBD consistently produce too many Flows in their initial decomposition. The root cause is a confusion between UI screens and behavioral steps. A wizard with five screens does not necessarily contain five Flows. A Flow owns a goal, not a screen. When a user selects a configuration preset and that selection has no independent lifecycle \u2014 no intermediate save, no resumability, no standalone value \u2014 it is likely an Interaction within a broader Flow, not a Flow in its own right. The correction is to ask: does this step have its own completion criteria and accumulated state? If not, it belongs inside a Flow that does. Teams that internalize this distinction typically reduce their initial Flow count by 30\u201350% during their first refactoring pass.<\/p>\n<h3 id=\"102-the-interaction-purity-challenge\">10.2 The Interaction Purity Challenge<\/h3>\n<p>Interactions are defined as atomic \u2014 the smallest unit of user action that cannot be meaningfully subdivided. In practice, Interactions gradually absorb Flow-level responsibilities. A date-picker Interaction begins making API calls to validate availability. A text-input Interaction starts tracking state across multiple steps. A toggle Interaction begins conditionally showing or hiding sibling Interactions based on business rules. The diagnostic is straightforward: if an Interaction imports services, manages state that survives its own unmounting, or references other Interactions by name, it has absorbed Flow logic. The fix is extraction \u2014 move the orchestration concern upward into the owning Flow and reduce the Interaction back to its atomic contract: accept props, render display state, emit events.<\/p>\n<h3 id=\"103-the-experience-scope-question\">10.3 The Experience Scope Question<\/h3>\n<p>A recurring architectural question is whether a journey is large enough to be its own Experience or whether it should remain a Flow within a larger Experience. The diagnostic criterion is lifecycle independence. If the journey can be entered, suspended, resumed, and completed without reference to any enclosing journey, it has its own lifecycle and warrants Experience status. If it only makes sense as a step within a broader sequence \u2014 if suspending it means abandoning the enclosing journey \u2014 it is a Flow. A password-reset journey within a login Experience illustrates the boundary: password reset has its own entry point (a link), its own completion criteria (password changed), and can be abandoned without invalidating the login Experience. It is an Experience, not a Flow. A &#8220;confirm your selections&#8221; step within an onboarding journey has none of these properties. It is a Flow.<\/p>\n<h3 id=\"104-bridging-the-designerdeveloper-vocabulary-gap\">10.4 Bridging the Designer\u2013Developer Vocabulary Gap<\/h3>\n<p>One of the less anticipated effects of EBD is the change it produces in cross-functional communication. Designers naturally think in journeys \u2014 the complete arc of what a user is trying to accomplish. Developers naturally think in components \u2014 the discrete units of rendering and behavior. These vocabularies are not wrong, but they are structurally misaligned, and the misalignment produces translation overhead in every handoff. EBD provides a shared structural vocabulary: designers describe Experiences and Flows, developers implement Flows and Interactions, and both groups use the same terms to refer to the same architectural units. Design reviews become architecture reviews. The question shifts from &#8220;which screens does this feature touch?&#8221; to &#8220;which Flows does this change affect, and does the Experience need to know?&#8221;<\/p>\n<h3 id=\"105-accessibility-as-a-structural-consequence\">10.5 Accessibility as a Structural Consequence<\/h3>\n<p>When Interactions are genuinely atomic \u2014 accepting typed input, rendering a bounded display state, emitting a well-defined event \u2014 they become naturally amenable to accessibility testing. Each Interaction has a clear input contract (what does the user provide?), a clear output contract (what event does it emit?), and a clear display state (what does the user perceive?). These contracts map directly to the concerns that accessibility standards address: labeling, focus management, keyboard operability, screen-reader announcements. Teams practicing EBD consistently report that accessibility compliance becomes easier not because they try harder, but because the structural unit they are testing is small enough to have an unambiguous accessibility contract. The improvement is architectural, not motivational.<\/p>\n<h3 id=\"106-the-state-accumulation-pattern\">10.6 The State Accumulation Pattern<\/h3>\n<p>Experiences that attempt to own the entire user session \u2014 rather than just the journey they represent \u2014 accumulate state that properly belongs elsewhere. An onboarding Experience begins tracking authentication tokens. A checkout Experience begins caching product catalog data. A settings Experience begins holding application-wide preferences. The result is an Experience that cannot be unmounted without losing unrelated application state, which defeats the composability promise of the tier. The correction is to distinguish journey state (which the Experience legitimately owns) from session state and application state (which belong in infrastructure layers outside the EBD hierarchy). An Experience should be mountable and unmountable without side effects beyond its own journey.<\/p>\n<h3 id=\"107-configuration-driven-composition-as-a-white-labeling-gateway\">10.7 Configuration-Driven Composition as a White-Labeling Gateway<\/h3>\n<p>When Experience composition is driven by configuration rather than code, the distance between &#8220;different organizations see different flows&#8221; and &#8220;different organizations see a differently branded product&#8221; shrinks to a configuration delta. The same mechanism that selects which Flows appear in an Experience can select which theme, locale, and branding assets accompany them. Teams that adopt configuration-driven composition for functional reasons \u2014 different user segments need different journeys \u2014 discover that they have inadvertently built the infrastructure for white-label deployment. The product becomes a composition engine; the configuration becomes the product definition. This is not a design goal of EBD per se, but it is a structural consequence that recurs frequently enough to warrant explicit acknowledgment.<\/p>\n<h3 id=\"108-the-refactoring-gradient\">10.8 The Refactoring Gradient<\/h3>\n<p>Teams rarely adopt EBD wholesale. More commonly, they begin by identifying one high-volatility journey in an existing codebase and restructuring it into the Experience-Flow-Interaction hierarchy while leaving the rest of the application untouched. This produces a hybrid codebase where some journeys are EBD-structured and others retain their original organization. The observation is that the hybrid state is stable and productive. The EBD-structured journeys become demonstrably easier to modify, and the contrast motivates incremental adoption. Attempting a full-codebase conversion in a single pass, by contrast, produces a long period of structural instability with no intermediate payoff. The refactoring gradient \u2014 one journey at a time, starting with the most volatile \u2014 consistently outperforms the big-bang approach.<\/p>\n<hr \/>\n<h2 id=\"11-appendix-case-study-developer-onboarding-platform\">11. Appendix: Case Study \u2014 Developer Onboarding Platform<\/h2>\n<p>This appendix presents a realistic application of EBD to a developer onboarding platform \u2014 a system that configures new developers&#8217; environments when they join an organization. The platform installs tools, provisions credentials, clones repositories, and establishes workspace structures. Different organizations require different onboarding sequences, and the platform must accommodate this variation without per-client code changes.<\/p>\n<h3 id=\"111-system-context\">11.1 System Context<\/h3>\n<p>The platform serves multiple organizations. Each organization defines its onboarding requirements through a configuration package specifying which tools to install, which credentials to provision, which repositories to clone, and which workspace structures to create. Some organizations require all developers to complete every step; others make certain steps optional. Regulated industries may require additional compliance steps that do not appear in the standard sequence.<\/p>\n<p>The interface must present the correct sequence of steps for each organization, collect the necessary input from the developer, execute the configuration, and report results \u2014 all without hardcoding any organization-specific logic into the interface layer.<\/p>\n<h3 id=\"112-experience-decomposition\">11.2 Experience Decomposition<\/h3>\n<p>The top-level architectural unit is the <strong>SetupExperience<\/strong> \u2014 the complete onboarding journey from initial landing to a fully configured development environment. This Experience owns the journey lifecycle: it knows when onboarding begins, what the completion criteria are, and what happens when the journey is abandoned or resumed.<\/p>\n<p>The SetupExperience composes four Flows, each owning a discrete goal:<\/p>\n<table>\n<thead>\n<tr>\n<th>Flow<\/th>\n<th>Goal<\/th>\n<th>Completion Criteria<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>EnvironmentSelectionFlow<\/strong><\/td>\n<td>Identify the developer&#8217;s target environment and organizational tier<\/td>\n<td>Environment profile selected and confirmed<\/td>\n<\/tr>\n<tr>\n<td><strong>ToolConfigurationFlow<\/strong><\/td>\n<td>Select and configure the tools to be installed<\/td>\n<td>Tool manifest finalized and validated<\/td>\n<\/tr>\n<tr>\n<td><strong>CredentialSetupFlow<\/strong><\/td>\n<td>Provision or collect authentication credentials (SSH keys, tokens, certificates)<\/td>\n<td>All required credentials present and verified<\/td>\n<\/tr>\n<tr>\n<td><strong>WorkspaceSetupFlow<\/strong><\/td>\n<td>Clone repositories and establish the directory structure<\/td>\n<td>All repositories cloned and workspace structure created<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Each Flow is composed of Interactions:<\/p>\n<table>\n<thead>\n<tr>\n<th>Flow<\/th>\n<th>Interactions<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>EnvironmentSelectionFlow<\/td>\n<td>OrgPickerInteraction, TierSelectorInteraction, EnvironmentSummaryInteraction<\/td>\n<\/tr>\n<tr>\n<td>ToolConfigurationFlow<\/td>\n<td>ToolToggleInteraction, VersionSelectorInteraction, ConflictWarningInteraction<\/td>\n<\/tr>\n<tr>\n<td>CredentialSetupFlow<\/td>\n<td>SSHKeyInputInteraction, TokenEntryInteraction, KeyValidationInteraction<\/td>\n<\/tr>\n<tr>\n<td>WorkspaceSetupFlow<\/td>\n<td>RepoListInteraction, DirectoryPreviewInteraction, ProgressIndicatorInteraction<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"113-core-journey\">11.3 Core Journey<\/h3>\n<p>The following diagram illustrates the standard onboarding journey. The SetupExperience orchestrates the Flow sequence; each Flow manages its own Interactions internally.<\/p>\n<pre><code class=\"\" data-line=\"\">%%{init: {&#039;theme&#039;: &#039;base&#039;, &#039;themeVariables&#039;: {&#039;primaryColor&#039;: &#039;#e0e7ff&#039;, &#039;primaryTextColor&#039;: &#039;#1e293b&#039;, &#039;primaryBorderColor&#039;: &#039;#4338ca&#039;, &#039;lineColor&#039;: &#039;#4338ca&#039;, &#039;secondaryColor&#039;: &#039;#d1fae5&#039;, &#039;tertiaryColor&#039;: &#039;#ede9fe&#039;, &#039;background&#039;: &#039;#ffffff&#039;, &#039;mainBkg&#039;: &#039;#e0e7ff&#039;, &#039;nodeBorder&#039;: &#039;#4338ca&#039;, &#039;clusterBkg&#039;: &#039;#f5f3ff&#039;, &#039;edgeLabelBackground&#039;: &#039;#ffffff&#039;}}}%%\ngraph TD\n    subgraph SetupExperience[&quot;SetupExperience (Journey Lifecycle)&quot;]\n        START([Developer Arrives]) --&gt; ENV\n\n        subgraph ENV[&quot;EnvironmentSelectionFlow&quot;]\n            E1[OrgPickerInteraction] --&gt; E2[TierSelectorInteraction]\n            E2 --&gt; E3[EnvironmentSummaryInteraction]\n        end\n\n        ENV --&gt;|environment.selected| TOOLS\n\n        subgraph TOOLS[&quot;ToolConfigurationFlow&quot;]\n            T1[ToolToggleInteraction] --&gt; T2[VersionSelectorInteraction]\n            T2 --&gt; T3[ConflictWarningInteraction]\n        end\n\n        TOOLS --&gt;|tools.configured| CREDS\n\n        subgraph CREDS[&quot;CredentialSetupFlow&quot;]\n            C1[SSHKeyInputInteraction] --&gt; C2[TokenEntryInteraction]\n            C2 --&gt; C3[KeyValidationInteraction]\n        end\n\n        CREDS --&gt;|credentials.verified| WORKSPACE\n\n        subgraph WORKSPACE[&quot;WorkspaceSetupFlow&quot;]\n            W1[RepoListInteraction] --&gt; W2[DirectoryPreviewInteraction]\n            W2 --&gt; W3[ProgressIndicatorInteraction]\n        end\n\n        WORKSPACE --&gt;|workspace.created| DONE([Environment Ready])\n    end\n<\/code><\/pre>\n<h3 id=\"114-configuration-driven-composition\">11.4 Configuration-Driven Composition<\/h3>\n<p>The SetupExperience does not hardcode the Flow sequence. Instead, it reads the organization&#8217;s configuration to determine which Flows to include, in what order, and with what parameters. A simplified configuration structure:<\/p>\n<pre><code class=\"\" data-line=\"\">onboarding:\n  organization: &quot;Acme Engineering&quot;\n  flows:\n    - id: environment_selection\n      required: true\n      order: 1\n    - id: tool_configuration\n      required: true\n      order: 2\n    - id: credential_setup\n      required: true\n      order: 3\n    - id: workspace_setup\n      required: true\n      order: 4\n<\/code><\/pre>\n<p>The SetupExperience reads this configuration at mount time, instantiates the corresponding Flows, and orchestrates their sequencing through the standard event-based protocol. It does not know what happens inside any Flow. It only knows that each Flow will eventually emit a completion event or an abandonment event, and it responds accordingly.<\/p>\n<h3 id=\"115-adding-a-compliance-flow\">11.5 Adding a Compliance Flow<\/h3>\n<p>A regulated-industry client requires developers to acknowledge security policies, verify their identity through a corporate identity provider, and complete a data-handling certification before any tools are installed. In a screen-organized codebase, this would require modifying navigation logic, inserting conditional steps into existing wizards, and threading new state through the entire onboarding sequence.<\/p>\n<p>In the EBD-structured system, the change is:<\/p>\n<ol>\n<li><strong>Create a new Flow<\/strong>: <code class=\"\" data-line=\"\">ComplianceFlow<\/code>, composed of <code class=\"\" data-line=\"\">PolicyAcknowledgmentInteraction<\/code>, <code class=\"\" data-line=\"\">IdentityVerificationInteraction<\/code>, and <code class=\"\" data-line=\"\">CertificationInteraction<\/code>.<\/li>\n<li><strong>Update the configuration<\/strong> for regulated-industry organizations:<\/li>\n<\/ol>\n<pre><code class=\"\" data-line=\"\">onboarding:\n  organization: &quot;Regulated Corp&quot;\n  flows:\n    - id: environment_selection\n      required: true\n      order: 1\n    - id: compliance\n      required: true\n      order: 2\n    - id: tool_configuration\n      required: true\n      order: 3\n    - id: credential_setup\n      required: true\n      order: 4\n    - id: workspace_setup\n      required: true\n      order: 5\n<\/code><\/pre>\n<p>No existing Flow is modified. The EnvironmentSelectionFlow, ToolConfigurationFlow, CredentialSetupFlow, and WorkspaceSetupFlow are identical to their non-regulated counterparts. The SetupExperience renders the ComplianceFlow between environment selection and tool configuration because the configuration says to \u2014 not because any code was changed.<\/p>\n<pre><code class=\"\" data-line=\"\">%%{init: {&#039;theme&#039;: &#039;base&#039;, &#039;themeVariables&#039;: {&#039;primaryColor&#039;: &#039;#e0e7ff&#039;, &#039;primaryTextColor&#039;: &#039;#1e293b&#039;, &#039;primaryBorderColor&#039;: &#039;#4338ca&#039;, &#039;lineColor&#039;: &#039;#4338ca&#039;, &#039;secondaryColor&#039;: &#039;#d1fae5&#039;, &#039;tertiaryColor&#039;: &#039;#ede9fe&#039;, &#039;background&#039;: &#039;#ffffff&#039;, &#039;mainBkg&#039;: &#039;#e0e7ff&#039;, &#039;nodeBorder&#039;: &#039;#4338ca&#039;, &#039;clusterBkg&#039;: &#039;#f5f3ff&#039;, &#039;edgeLabelBackground&#039;: &#039;#ffffff&#039;}}}%%\ngraph TD\n    subgraph SetupExperience[&quot;SetupExperience (Regulated Industry)&quot;]\n        START([Developer Arrives]) --&gt; ENV\n\n        subgraph ENV[&quot;EnvironmentSelectionFlow&quot;]\n            E1[OrgPickerInteraction] --&gt; E2[TierSelectorInteraction]\n            E2 --&gt; E3[EnvironmentSummaryInteraction]\n        end\n\n        ENV --&gt;|environment.selected| COMPLY\n\n        subgraph COMPLY[&quot;ComplianceFlow (NEW)&quot;]\n            CP1[PolicyAcknowledgmentInteraction] --&gt; CP2[IdentityVerificationInteraction]\n            CP2 --&gt; CP3[CertificationInteraction]\n        end\n\n        COMPLY --&gt;|compliance.verified| TOOLS\n\n        subgraph TOOLS[&quot;ToolConfigurationFlow&quot;]\n            T1[ToolToggleInteraction] --&gt; T2[VersionSelectorInteraction]\n            T2 --&gt; T3[ConflictWarningInteraction]\n        end\n\n        TOOLS --&gt;|tools.configured| CREDS\n\n        subgraph CREDS[&quot;CredentialSetupFlow&quot;]\n            C1[SSHKeyInputInteraction] --&gt; C2[TokenEntryInteraction]\n            C2 --&gt; C3[KeyValidationInteraction]\n        end\n\n        CREDS --&gt;|credentials.verified| WORKSPACE\n\n        subgraph WORKSPACE[&quot;WorkspaceSetupFlow&quot;]\n            W1[RepoListInteraction] --&gt; W2[DirectoryPreviewInteraction]\n            W2 --&gt; W3[ProgressIndicatorInteraction]\n        end\n\n        WORKSPACE --&gt;|workspace.created| DONE([Environment Ready])\n    end\n<\/code><\/pre>\n<h3 id=\"116-structural-observations\">11.6 Structural Observations<\/h3>\n<p>This case study illustrates several properties of EBD in practice:<\/p>\n<ul>\n<li><strong>Additive change model<\/strong>: New organizational requirements produce new Flows and configuration entries, not modifications to existing Flows. The blast radius of a new requirement is bounded by design.<\/li>\n<li><strong>Flow independence<\/strong>: Each Flow is testable in isolation. The ToolConfigurationFlow can be mounted outside the SetupExperience, provided with mock input, and validated against its completion contract without any other Flow present.<\/li>\n<li><strong>Interaction reuse<\/strong>: The ProgressIndicatorInteraction appears in the WorkspaceSetupFlow but could appear in any Flow that needs to report long-running progress. Its contract \u2014 accept a progress payload, render a visual state, emit a cancellation event if requested \u2014 is independent of the Flow that hosts it.<\/li>\n<li><strong>Configuration as product definition<\/strong>: The difference between two organizations&#8217; onboarding experiences is fully expressed in their configuration packages. The codebase is shared infrastructure. The configuration is the product.<\/li>\n<li><strong>Compliance as composition<\/strong>: Regulatory requirements, which in many systems trigger invasive cross-cutting modifications, become compositional in EBD. A compliance step is a Flow. Including it is a configuration decision. Excluding it is a configuration decision. The code does not know whether it is operating in a regulated context or not \u2014 only the configuration does.<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"12-conclusion\">12. Conclusion<\/h2>\n<p>The structural failures most visible in interface codebases \u2014 navigation logic in leaf components, flow state in global stores, cascading changes from localized decisions \u2014 share a common origin. The codebase is organized around what the system presents rather than what the user intends to accomplish. When the organizing unit and the unit of human purpose are misaligned, every structural decision is made in the wrong frame of reference.<\/p>\n<p>Experience-Based Decomposition closes that gap. By establishing experiences, flows, and interactions as distinct structural roles with clear responsibilities and explicit communication rules, it makes user intent legible in the code itself. The developer reading the codebase can trace a user journey from its initiation to its conclusion without reconstructing it from navigation conditionals distributed across dozens of components.<\/p>\n<p>In practice, interfaces organized this way do not eliminate change. Configurations change. Organizational requirements change. Products evolve. What changes is the experience of making those changes: a new field type affects one interaction component. A new conditional flow affects one experience and the configuration schema. A new audience segment produces a different experience composition without touching existing code.<\/p>\n<p>When the communication model is event-based and the composition model is configuration-driven, something further becomes true: the interface layer itself becomes a deployment artifact, not just a code artifact. Experiences can be composed, ordered, and conditioned through configuration managed outside the release cycle. The distance between an organizational decision and its expression in the user&#8217;s experience shrinks to the propagation delay of a configuration update.<\/p>\n<p>That is the intended destination \u2014 not merely an interface that is easier to change, but one where the relevant changes no longer require code.<\/p>\n<hr \/>\n<h2 id=\"appendix-a-glossary\">Appendix A: Glossary<\/h2>\n<p><strong>Environmental Boundary (Experience)<\/strong> \u2014 The Experience tier is the exclusive communicator with the backend API. Environmental volatility \u2014 API contract changes, backend migrations, authentication changes \u2014 is absorbed at this boundary so that Flow and Interaction logic remains unaffected.<\/p>\n<p><strong>Communication Rules<\/strong> \u2014 The directional constraints governing how EBD tiers interact: Experiences invoke Flows, Flows invoke Interactions, and no component may call a peer at its own tier. These rules preserve encapsulation and make change impact predictable.<\/p>\n<p><strong>Configuration-Driven Composition<\/strong> \u2014 The practice of defining which flows an experience contains, and in what order, through external configuration rather than hardcoded structure. Enables organizational decisions to reshape user journeys without code changes.<\/p>\n<p><strong>Core User Journey<\/strong> \u2014 A high-level human purpose defining the primary value of the interface. Used as an architectural validation mechanism to ensure decomposition boundaries align with real user intent.<\/p>\n<p><strong>Cross-Cutting Volatility<\/strong> \u2014 Change that affects capabilities spanning all tiers, such as logging, authentication, theming, or analytics. Isolated into Utilities so that a single cross-cutting change does not require modifications across Experiences, Flows, and Interactions.<\/p>\n<p><strong>Environmental Volatility<\/strong> \u2014 Change originating outside the interface layer, including API contract revisions, backend migrations, and deployment-target differences. Contained by the Experience tier, which is the exclusive communicator with the backend, so that Flow and Interaction logic remains unaffected.<\/p>\n<p><strong>Experience<\/strong> \u2014 A complete, composable user journey bounded by a human intent. The most stable structural tier in EBD. An Experience assembles Flows through configuration and manages journey state across them.<\/p>\n<p><strong>Experience-Based Decomposition<\/strong> \u2014 A volatility-based decomposition approach for user interfaces that organizes code into three structural tiers \u2014 Experience, Flow, and Interaction \u2014 aligned with the axes along which interface change actually occurs. Sibling framework to Volatility-Based Decomposition (VBD).<\/p>\n<p><strong>Flow<\/strong> \u2014 A goal-directed sequence of interactions accomplishing one discrete outcome within an experience. The middle tier. Owns accumulated state and skip conditions; does not make API calls (that responsibility belongs to the Experience).<\/p>\n<p><strong>Flow Composition<\/strong> \u2014 The mechanism by which an Experience assembles its constituent Flows, typically through external configuration that specifies flow identity, ordering, and skip conditions. Decouples journey structure from release cycles.<\/p>\n<p><strong>Functional Volatility<\/strong> \u2014 Change in business logic within Flows, such as new validation rules, altered calculation steps, or revised decision criteria. Contained at the Flow tier so that structural and environmental boundaries remain unaffected.<\/p>\n<p><strong>Interaction<\/strong> \u2014 An atomic, observable user act. The most volatile tier. Owns only its display state and the event it emits upward to its parent Flow.<\/p>\n<p><strong>Interaction Event<\/strong> \u2014 The atomic event an Interaction emits upward to its parent Flow upon completion of a user act. Interaction Events are the sole communication mechanism from the Interaction tier to the Flow tier, preserving directional control.<\/p>\n<p><strong>Interface Volatility Axis<\/strong> \u2014 A dimension along which interface change is expected: functional, non-functional, cross-cutting, or environmental. EBD aligns architectural boundaries with these axes so that a change along one axis does not ripple across others.<\/p>\n<p><strong>Journey State<\/strong> \u2014 The accumulated data that an Experience maintains as the user progresses through its Flows. Each Flow contributes to journey state upon completion; no Flow reads or mutates another Flow&#8217;s internal state directly.<\/p>\n<p><strong>Peer Prohibition<\/strong> \u2014 The rule that components at the same structural tier must not invoke or directly communicate with one another. Flows do not call Flows; Interactions do not call Interactions. This constraint ensures that each component can be added, removed, or reordered without side effects on its siblings.<\/p>\n<p><strong>Skip Condition<\/strong> \u2014 A configuration-driven rule that determines whether a particular Flow is included or bypassed within an Experience. Skip conditions allow the same Experience definition to produce different journey shapes based on organizational context, locale, or feature flags.<\/p>\n<p><strong>Non-Functional Volatility<\/strong> \u2014 Change driven by the reorganization of user journeys, such as reordering steps, adding or removing Flows, or splitting an Experience into variants. Contained at the Experience tier through configuration-driven composition.<\/p>\n<p><strong>Tier<\/strong> \u2014 One of the three structural levels in EBD \u2014 Experience, Flow, or Interaction \u2014 each corresponding to a distinct grain of user intent and a distinct volatility profile. The tier hierarchy defines both the communication direction and the scope of permissible change.<\/p>\n<p><strong>Utility<\/strong> \u2014 A cross-cutting interface capability consumed across all tiers without domain-specific knowledge. Utilities encapsulate concerns like theming, logging, and authentication that would otherwise duplicate across the tier hierarchy.<\/p>\n<hr \/>\n<h2 id=\"appendix-b-applicability-checklist\">Appendix B: Applicability Checklist<\/h2>\n<p>Experience-Based Decomposition is well-suited for interfaces that:<\/p>\n<ul>\n<li>Serve more than one audience type with distinct mental models or organizational contexts<\/li>\n<li>Contain multi-step workflows with conditional paths or configurable step presence<\/li>\n<li>Must support multiple locales, themes, or organizational branding configurations<\/li>\n<li>Are driven by external configuration that determines which features or flows appear<\/li>\n<li>Will be maintained across multiple years and multiple product teams<\/li>\n<li>Depend on backend systems that may route differently based on the same configuration the interface uses<\/li>\n<\/ul>\n<p>It may be disproportionate for:<\/p>\n<ul>\n<li>Single-purpose utility screens with no conditional logic<\/li>\n<li>Short-lived interfaces with a bounded, stable feature set<\/li>\n<li>Systems where the expected rate of structural change does not justify the decomposition overhead<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"references-and-influences\">References and Influences<\/h2>\n<p><strong>William Christopher Anderson<\/strong><br \/>\nAnderson, William Christopher. <em>Volatility-Based Decomposition in Software Architecture.<\/em> February 2026.<\/p>\n<p>Experience-Based Decomposition is a direct sibling framework to VBD. VBD established that architectural boundaries aligned with volatility axes produce systems resilient to change. EBD applies the same organizing principle to the interface layer, extending the Manager-Engine-Accessor-Utility taxonomy into Experience-Flow-Interaction-Utility, and establishing the same communication discipline \u2014 directional, role-constrained, event-based \u2014 at the UI level. The configuration-driven composition model described in Section 6 is explicitly designed to compose with VBD&#8217;s manager-level routing: the same organizational configuration that determines which flows appear in the interface determines which backend paths execute in response to those flows completing.<\/p>\n<p><strong>Alan Cooper, Robert Reimann, David Cronin, Christopher Noessel<\/strong><br \/>\nCooper, Alan et al. <em>About Face: The Essentials of Interaction Design.<\/em> Fourth Edition. Wiley, 2014.<\/p>\n<p>Cooper&#8217;s goal-directed design methodology established the foundational claim that interfaces should serve user goals, not reflect system capabilities. His use of personas and scenarios to drive interaction decisions is a direct precursor to the core user journey validation mechanism in EBD. Cooper also articulated the distinction between implementation models (how systems work) and mental models (how users think systems work), which maps directly to the argument in Section 1 that organizing code around screens misaligns it with the user&#8217;s cognitive frame. EBD can be understood as the architectural expression of Cooper&#8217;s design-level insight.<\/p>\n<p><strong>Brad Frost<\/strong><br \/>\nFrost, Brad. <em>Atomic Design.<\/em> Brad Frost, 2016.<\/p>\n<p>Atomic Design established a hierarchical vocabulary for component composition \u2014 atoms, molecules, organisms, templates, pages \u2014 and demonstrated that interface structure benefits from explicit layering. EBD inherits this hierarchical instinct while operating at a different granularity. Where Atomic Design hierarchizes visual structure, EBD hierarchizes behavioral intent. The two frameworks are complementary: Atomic Design governs the construction of interaction components; EBD governs how those components are assembled into purposive sequences. A ProductCard (interaction, in EBD terms) might itself be composed of atoms and molecules (in Atomic Design terms). Neither taxonomy replaces the other.<\/p>\n<p><strong>Dan Saffer<\/strong><br \/>\nSaffer, Dan. <em>Microinteractions: Designing with Details.<\/em> O&#8217;Reilly Media, 2013.<\/p>\n<p>Saffer&#8217;s analysis of microinteractions \u2014 the small, contained moments that define product character \u2014 provides the conceptual foundation for the Interaction tier in EBD. His four-part structure (trigger, rules, feedback, loops and modes) maps closely to EBD&#8217;s definition of an interaction as an atomic act with its own display state and event output. Saffer&#8217;s central argument, that interactions deserve dedicated design attention rather than being treated as implementation details, reinforces the structural case for isolating them in their own tier rather than embedding them in flow or experience logic.<\/p>\n<p><strong>Jesse James Garrett<\/strong><br \/>\nGarrett, Jesse James. <em>The Elements of User Experience.<\/em> Second Edition. New Riders, 2010.<\/p>\n<p>Garrett&#8217;s five-plane model \u2014 strategy, scope, structure, skeleton, surface \u2014 introduced the idea that user experience design has distinct layers of abstraction, each with its own concerns and each dependent on decisions made in the layers below. EBD is an architectural expression of the same layering intuition, applied specifically to the structure and skeleton planes. Garrett&#8217;s framework is primarily a design process model; EBD converts the same insight into an implementation model, giving the structural layer a home in the codebase rather than just in the design process.<\/p>\n<p><strong>Donald A. Norman<\/strong><br \/>\nNorman, Donald A. <em>The Design of Everyday Things.<\/em> Revised and Expanded Edition. Basic Books, 2013.<\/p>\n<p>Norman&#8217;s articulation of affordances, feedback, and the gulf of evaluation provided the cognitive psychology grounding for interaction design as a discipline. His concept of the gulf between the system image and the user&#8217;s mental model is directly relevant to the argument in Section 2 that screen-organized code produces a codebase whose structure is legible to developers but not to the human intent it serves. EBD attempts to close the same gulf at the architectural level \u2014 making the code&#8217;s structure reflect the user&#8217;s purpose rather than the system&#8217;s structure.<\/p>\n<p><strong>Kim Goodwin<\/strong><br \/>\nGoodwin, Kim. <em>Designing for the Digital Age: How to Create Human-Centered Products and Services.<\/em> Wiley, 2009.<\/p>\n<p>Goodwin&#8217;s comprehensive treatment of goal-directed design in practice \u2014 including scenario development, flow mapping, and design framework construction \u2014 provides the practitioner vocabulary that EBD formalizes architecturally. Her emphasis on designing for people&#8217;s goals across time (not just in a single interaction) reinforces the experience tier&#8217;s role as the durable container of user intent. Her scenario-based validation approach is the design-side analog to EBD&#8217;s core user journey validation mechanism.<\/p>\n<p><strong>Roy Thomas Fielding<\/strong><br \/>\nFielding, Roy Thomas. <em>Architectural Styles and the Design of Network-Based Software Architectures.<\/em> Doctoral dissertation, UC Irvine, 2000.<\/p>\n<p>Fielding&#8217;s REST architectural style demonstrated that well-defined constraints on communication between components \u2014 stateless requests, uniform interface, layered system \u2014 produce distributed systems that evolve gracefully. The communication rules in EBD apply the same discipline to the interface layer: constrained, directional, role-specific communication prevents the coupling that undermines architectural integrity. The event-based communication model in Section 6 draws on the same insight \u2014 decoupling the interface from the backend through a uniform event interface rather than tight procedural coupling.<\/p>\n<p><strong>Gregor Hohpe and Bobby Woolf<\/strong><br \/>\nHohpe, Gregor; Woolf, Bobby. <em>Enterprise Integration Patterns.<\/em> Addison-Wesley, 2003.<\/p>\n<p>Hohpe and Woolf&#8217;s catalog of messaging patterns provides the foundational vocabulary for the event-based communication model described in Section 6. Their treatment of message channels, event-driven routing, and the decoupling of producers from consumers is directly applicable to the mechanism by which flow completion events propagate to both the experience tier above and the backend manager below. The configuration-driven routing described in that section is an application of their correlation and content-based routing patterns to the interface-backend boundary.<\/p>\n<p><strong>Juval L\u00f6wy<\/strong><br \/>\nL\u00f6wy, Juval. <em>Righting Software.<\/em> Addison-Wesley, 2019.<\/p>\n<p>L\u00f6wy&#8217;s IDesign methodology, the source of Volatility-Based Decomposition, provides the structural vocabulary from which EBD draws its parallel taxonomy. The Manager-Engine-Accessor-Utility role taxonomy and the associated communication rules are adapted here into Experience-Flow-Interaction-Utility. L\u00f6wy&#8217;s emphasis on separating orchestration from execution \u2014 and his warning that interwoven orchestration and execution logic creates change coupling \u2014 translates directly to the EBD rule that experience logic (orchestration) must be structurally separated from flow logic (execution of a specific goal).<\/p>\n<hr \/>\n<h2 id=\"authors-note\">Author&#8217;s Note<\/h2>\n<p>Experience-Based Decomposition builds on established practices in interaction design, frontend engineering, and software architecture \u2014 in particular Alan Cooper&#8217;s goal-directed design, Brad Frost&#8217;s Atomic Design, and the volatility-first thinking that underlies Volatility-Based Decomposition. Whether the specific synthesis presented here is genuinely novel, the author cannot say with certainty. What can be said is that the author has not encountered another framework that approaches interface decomposition this way, nor read work that expresses this structural model \u2014 the explicit tier hierarchy, the communication rules, the configuration-driven composition model, and the deliberate isomorphism with the backend component taxonomy. If prior art exists, the author would welcome the reference.<\/p>\n<p>The intent is a reference suitable for design reviews, engineering onboarding, and architectural decision-making in organizations building products intended to serve users well over years rather than quarters.<\/p>\n<hr \/>\n<h2 id=\"distribution-note\">Distribution Note<\/h2>\n<p>This document is provided for informational and educational purposes. It may be shared internally within organizations, used as a reference in product design and engineering discussions, or adapted for non-commercial educational use with appropriate attribution.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Experience-Based Decomposition (EBD) Organizing Interface Architecture Around Human Intent: A Framework Author: William Christopher Anderson Date: April 2026 Version: 1.0 Executive Summary The most common complaint about user interfaces in long-lived products is not that individual screens are poorly designed. It is that changing anything requires touching everything. A wizard gains a conditional step; navigation &#8230; <a title=\"Experience-Based Decomposition (EBD)\" class=\"read-more\" href=\"https:\/\/harmonic-framework.com\/es\/whitepapers\/experience-based-decomposition\/\" aria-label=\"Read more about Experience-Based Decomposition (EBD)\">Read more<\/a><\/p>","protected":false},"author":0,"featured_media":0,"parent":11,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","footnotes":""},"methodology":[],"class_list":["post-65","page","type-page","status-publish"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"trp-custom-language-flag":false,"post-thumbnail":false,"hf-card":false,"hf-hero":false},"uagb_author_info":{"display_name":"","author_link":"https:\/\/harmonic-framework.com\/es\/author\/"},"uagb_comment_info":0,"uagb_excerpt":"Experience-Based Decomposition (EBD) Organizing Interface Architecture Around Human Intent: A Framework Author: William Christopher Anderson Date: April 2026 Version: 1.0 Executive Summary The most common complaint about user interfaces in long-lived products is not that individual screens are poorly designed. It is that changing anything requires touching everything. A wizard gains a conditional step; navigation&hellip;","_links":{"self":[{"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/pages\/65","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/types\/page"}],"replies":[{"embeddable":true,"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/comments?post=65"}],"version-history":[{"count":16,"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/pages\/65\/revisions"}],"predecessor-version":[{"id":692,"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/pages\/65\/revisions\/692"}],"up":[{"embeddable":true,"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/pages\/11"}],"wp:attachment":[{"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/media?parent=65"}],"wp:term":[{"taxonomy":"methodology","embeddable":true,"href":"https:\/\/harmonic-framework.com\/es\/wp-json\/wp\/v2\/methodology?post=65"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}