design-graph
Generated at build time from
skills/design-graph/SKILL.md. Do not edit this page directly.
Design Graph turns required product behavior into an interface a person can actually navigate and operate.
Job + Product Behavior ↓ Interface Graph ↓ Surface<C, V, N> │ ├─ C = primary content and actions ├─ V = meaningful rendered variants └─ N = prerequisites to enter/use the surface
Environment→ viewport→ input modality→ connectivity→ reduced motion→ platform capability
Interaction semantics→ focus→ keyboard→ pointer→ announcement→ pending/optimistic/conflict behavior§1 Surfaces addressable interface places and units§2 Moves user/system transitions between states/surfaces§3 C primary content and actions§4 V meaningful rendered variants§5 N prerequisites for entering/using a surface§6 Input early interface feedback without confusing trust boundaries§7 Interaction focus, keyboard, pointer, announcements, async transitions§8 Environment responsive/platform projection without changing product intent§9 Attention focus-owning surfaces vs notification surfaces§10 Proof product behavior remains completable under relevant contexts§11 Build implementation exposes modeled states/moves explicitlyRead the product behavior first. Then model how that behavior is exposed through the interface.
Do not reopen product scope unless the interface reveals a contradiction that makes the product behavior impossible or ambiguous.
1. Start from the product contract
Section titled “1. Start from the product contract”Preferred input:
product-design ↓JobBehavior graphConstraintsProof ↓design-graphDesign Graph owns:
surfacesmovesrendered statesinteraction boundariesresponsive/environment projectionaccessibility-relevant interaction semanticsProduct Design owns:
what the user must be able to accomplishwhat behavior the product guaranteeswhat is in/out of scopeDo not silently invent a new feature, workflow, requirement, or success condition while designing the interface.
If no formal product contract exists, infer only the minimum behavior clearly established by the task and mark uncertainty instead of expanding scope.
2. Name surfaces and moves
Section titled “2. Name surfaces and moves”Before styling, identify what the person can actually encounter and do.
Surfaces
Section titled “Surfaces”Examples:
screenroutepanedialogdrawermenuformlistdetailtoolbarrowfieldcontrolstatus regionA surface is meaningful when it owns some combination of:
contentinteractionstatenavigationattentionDo not split every visual group into a surface.
Units are repeated or locally meaningful pieces inside a surface:
rowfieldmetriccardtabcontrol groupRepeated appearance is evidence for reuse, not proof that a shared component should exist.
A shared component boundary is stronger when there is:
stable responsibility+stable interaction contract+meaningful reuseDo not abstract merely because two things look similar.
Moves are user/system transitions:
openselecteditsubmitsavecanceldismissexpandnavigateretryundorefreshsyncEach important edge should answer:
What triggers it?What changes?What becomes reachable next?3. Model C: primary content and actions
Section titled “3. Model C: primary content and actions”Map the successful interface path first.
Surface A ↓ moveSurface B ↓ moveSurface C ↓Job completeFor each surface define only the primary content/actions needed for the product behavior.
Example:
Task list ↓ selectTask detail ↓ editEdit state ↓ saveUpdated detailDo not add a screen because navigation convention suggests one.
A node with one trivial incoming edge and one trivial outgoing edge may not need to be a separate surface.
But do not collapse a step merely to reduce screen count if it owns distinct state, attention, or interaction semantics.
4. Model cardinality without inventing scale
Section titled “4. Model cardinality without inventing scale”Cardinality affects interface shape, but scale requirements must come from evidence.
Useful categories:
one itemmany itemsincrementally/live-updating itemsA detail surface may emphasize:
identityimportant attributescurrent stateprimary actionsDo not assume every detail view needs one primary CTA or a specific layout.
Design for:
0 items1 itemrepresentative normal volumeknown upper-bound / stress case when evidence requires itDo not invent arbitrary requirements such as:
must support 10,000 rowsunless product/system constraints establish that scale.
Live / changing data
Section titled “Live / changing data”For data that changes while being read, decide:
Can updates change spatial position?Would that interrupt the current interaction?Does immediacy matter more than spatial stability?Possible strategies:
update in placebatch updatesshow "new items"re-sort immediatelyfreeze while interactingmanual refreshChoose from product semantics, not a universal rule.
5. Model V: meaningful rendered variants
Section titled “5. Model V: meaningful rendered variants”V means rendered variants, not merely void/absence.
Model only states that materially change what the person:
seesunderstandscan doneeds to do nextPossible variants include:
emptyloadingpartialerrordenied
editingdirtysubmittingpendingoptimisticsavedstaleconflictsyncing
selectedexpandeddisabledread-onlyDo not require every surface to implement every variant.
Example:
Edit form ├─ clean ├─ dirty ├─ submitting ├─ save error ├─ saved └─ conflictA variant is worth modeling when it changes behavior, affordance, interpretation, or recovery.
Do not create decorative state taxonomies that never affect interaction.
6. Model N: prerequisites separately from environment
Section titled “6. Model N: prerequisites separately from environment”N contains conditions required to enter or use a surface/move.
Examples:
selected recordauthenticated actorrequired permissioncompleted prior stepavailable datasupported capabilityModel:
Move ↓ requiresN ↓ satisfied? ├─ yes → target surface/action └─ no → unavailable / alternate pathDo not put viewport, reduced motion, or network quality in the same category as authorization/data prerequisites.
Those are environment/context dimensions, handled separately.
Permission affordances
Section titled “Permission affordances”Do not use a universal “always hide” or “always disable” rule.
Prefer:
unauthorized or irrelevant action→ usually hide
temporarily unavailable but still meaningful→ disabled + reason when that improves understanding/recoveryExamples:
normal user→ admin delete action→ hide
Publish→ disabled→ "Complete required fields first"
Export→ disabled→ "Available on Pro plan"Security authorization must still be enforced by the trusted system boundary. UI visibility is never the security control.
7. Separate interface feedback from system trust
Section titled “7. Separate interface feedback from system trust”The interface should give feedback as early as useful.
Example:
user input ↓field-level feedback ↓submit ↓server/system boundary ↓authoritative validation ↓domain operationGood interface behavior:
show format errors close to the fieldexplain missing required input before unnecessary round tripspreserve user input after recoverable failureBut:
client validation ≠ trust boundaryClient-controlled data remains untrusted when it crosses into the backend/system.
Design Graph owns:
when/how the interface communicates input problemsDesign Thinking / system implementation owns:
authoritative decode/validation at trusted boundariesDo not describe browser validation as making data “trusted.”
8. Model interaction semantics as part of the graph
Section titled “8. Model interaction semantics as part of the graph”Some behavior is presentation-only:
decorative motionhover stylingvisual polishOther behavior determines whether an edge is reachable at all:
focuskeyboard interactionpointer interactionscreen-reader semanticsannouncementsEscape behaviorasync pending stateoptimistic updatesconflict recoveryTreat the second category as graph semantics.
Reachability invariant
Section titled “Reachability invariant”For each meaningful move ask:
Can the person discover it?Can they reach it?Can they operate it?Can they perceive the resulting state change?Keyboard and focus
Section titled “Keyboard and focus”For interactive surfaces ask only what the flow requires:
Can keyboard users reach the control?Is the control's purpose identifiable?Does focus move to a valid place after the transition?Can the user exit the interaction?Example:
Open dialog ↓focus enters dialog ↓operate dialog ↓close / cancel ↓focus returns to a valid originState changes and announcements
Section titled “State changes and announcements”When important state changes without navigation, decide whether it must be perceivable through:
visible statusfocus movementlive announcementchanged label/stateDo not add announcements for purely decorative changes.
Async actions
Section titled “Async actions”For asynchronous operations decide the actual interaction semantics:
Can the action be repeated while pending?Is the previous state still visible?Is optimistic state allowed?Can the server reject after optimistic update?What happens on conflict?Can the person retry?Model only states the product can actually reach.
9. Project the graph under environment constraints
Section titled “9. Project the graph under environment constraints”The same product behavior can be expressed through different interface graphs under different environments.
Environment dimensions may include:
viewportinput modalityreduced motionconnectivityplatform capabilitydevice constraintsExample:
same Detail behavior
desktop→ list + detail visible together
mobile→ list → detail routeDo not hardcode universal solutions such as:
small screen → drawerThe correct projection depends on interaction and content needs.
Environment may legitimately alter:
surface compositionnavigation edgessimultaneous visibilityinteraction mechanismThe invariant is not “same interface graph.”
The invariant is:
same required product behaviormust remain completableunder relevant supported contextsDo not design for hypothetical platforms or modes not in scope.
10. Distinguish focus-owning and notification surfaces
Section titled “10. Distinguish focus-owning and notification surfaces”Do not treat every overlay/message as acquiring attention in the same way.
Focus-owning surfaces
Section titled “Focus-owning surfaces”Examples:
modal dialogmenusome drawerspopover with interactive contentThey may require:
intentional focus entrycontained/restricted interaction when appropriatedefined close/escape pathvalid focus restorationModel:
trigger ↓focus-owning surface ↓interaction ↓close ↓focus returnsNotification surfaces
Section titled “Notification surfaces”Examples:
toaststatus messagelive announcementnon-interactive bannerUsually:
inform→ do not steal focusIf a notification contains required actions, it may become an interactive surface and must be modeled accordingly.
Do not classify by visual shape alone; classify by interaction semantics.
11. Prove the interface under relevant contexts
Section titled “11. Prove the interface under relevant contexts”Do not prove the design by requiring one identical graph under every context.
Instead ask whether required product behavior remains completable.
Challenge only relevant contexts:
empty datapartial/error stateleast-permitted rolerepresentative data densitysupported small/large viewportkeyboard-only interactionreduced motion when motion existsslow/offline connectivity when supportedstale/conflicting data when product behavior allows itFor each context:
Can the person still understand the state?Can they still reach the allowed action?Can they recover when recovery is part of the behavior?Can they still complete the required product job?Do not invent:
year-three scale40,000 recordsoffline supporttouch-only useunless those are actual constraints.
A context may legitimately produce a different interface graph.
What must remain stable is the required product behavior, not the visual topology.
12. Build with explicit states and transitions
Section titled “12. Build with explicit states and transitions”Do not impose:
component tree = Cvariant system = Vas an implementation invariant.
Frameworks may represent interface state through:
conditional renderingstate machinesreducerscomponent compositionroute statevariant utilitiesasync resource primitivesThe requirement is:
modeled states are explicittransitions are understandablerendering matches the modeled statemeaningful moves remain reachableNo consequential rendered state should exist only as an accidental conditional that the design cannot explain.
No consequential user move should appear in implementation without a corresponding interaction path.
Component boundaries
Section titled “Component boundaries”Componentization is an implementation decision informed by the interface graph, not mechanically derived from it.
Repeated surface appearance may suggest reuse.
Extract a shared component when responsibility, interaction contract, and reuse are stable enough that the abstraction reduces complexity rather than merely moving it.
13. Relationship to other skills
Section titled “13. Relationship to other skills”product-design
Section titled “product-design”product-design→ what the product must enable
design-graph→ how that behavior is expressed through interfaceDo not reopen product scope during interface modeling.
If interface work reveals contradictory product behavior, return the contradiction to product-design.
design-thinking
Section titled “design-thinking”design-thinking→ computational/runtime implementation graph
design-graph→ interaction/interface graphBoth may use:
nodesedgesstaterequirementsalternate pathsproofThey do not need isomorphic sections or one-to-one mappings.
Do not mirror:
Effect/Stream ↔ detail/list/liveE ↔ VR ↔ Npipe ↔ motiongen/pipe ↔ tree/variantsThose analogies are not reliable enough to be canonical rules.
engineering-design
Section titled “engineering-design”Engineering Design owns system boundaries, state ownership, contracts, and guarantees.
Design Graph should not infer backend architecture from UI layout.
security-review
Section titled “security-review”UI permission visibility is not authorization.
When interface changes touch sensitive authority or exposure:
design-graph→ interaction/affordance
security-review→ verify actual trust/authority propertytest-engineering
Section titled “test-engineering”Use test-engineering only when verifying the interaction requires non-trivial test design.
Obvious interaction behavior can be verified directly at the appropriate level.
14. Proportionality
Section titled “14. Proportionality”Do not run the full method for every visual change.
tiny visual/style change→ inspect local surface → update → targeted check
simple local interaction→ surface + move + relevant variants
form / async interaction / permissions→ add prerequisites + interaction semantics + failure/recovery states
multi-surface workflow / responsive navigation / complex state→ model the affected interface graph explicitlyDepth follows interaction risk, not number of components.
Do not create a large UX specification when one local state transition is enough.
The Pipeline
Section titled “The Pipeline”PRODUCT CONTRACT / KNOWN BEHAVIOR ↓"What must the person accomplish?" → preserve the product job
↓"What surfaces expose that behavior?" → identify meaningful surfaces/units
↓"What moves connect them?" → model user/system transitions
↓"What primary content/actions exist?" → define C
↓"What meaningful rendered variants can occur?" → define V
↓"What prerequisites make each move/surface valid?" → define N
↓"What interaction semantics make edges reachable?" → focus / keyboard / pointer / announcements / async states
↓"How does environment change the projection?" → viewport / modality / connectivity / platform constraints
↓"Can required product behavior still complete under relevant contexts?" → proof
↓"Does implementation expose all consequential states and moves explicitly?" → verify build projection
↓INTERFACEEvery consequential rendered state and user move should trace to the interface graph. If implementation exposes a meaningful state or move the graph cannot explain, either the graph or the implementation is incomplete.