A good interaction spec defines the triggers, states, transitions, and constraints a feature must honor — never the pixels, colors, or exact layout that satisfy them. It tells your designer what must be true and lets them decide how it looks. Over-specifying pixels turns a designer into a production assistant instead of a problem-solver.

Quick Answer: Specify behavior (inputs, states, edge cases, success criteria) and constraints (brand, platform, performance, accessibility) — not visual details like exact spacing, color hex codes, or component choice. That split is what lets designers do their best work while still hitting your intent.

Why Pixel-Prescriptive Specs Crowd Out Good Design

Pixel-prescriptive specs crowd designers because they answer questions nobody asked while leaving the actual hard questions unanswered. A PM who writes "button is 44px tall, #2563EB, top-right corner" has spent effort on decisions a designer is better equipped to make, while skipping the state machine that actually determines whether the feature works.

This isn't a stylistic quibble — it's a resourcing problem. Every minute spent debating a spec's mockup-level detail is a minute not spent debating whether the feature handles a slow network, a permissions-denied user, or an empty state. Bill Buxton's sketching research (documented in Sketching User Experiences) draws a hard line between low-fidelity representations meant to provoke exploration and high-fidelity ones that foreclose it — a spec with exact pixel values reads to a designer exactly like a final mockup, and final mockups don't invite pushback.

There's a second cost: pixel specs make PMs the bottleneck. If "correct" means "matches the spec's exact numbers," every design review becomes a compliance check against your taste rather than a test against the user's job. That's a bad trade — you've swapped a designer's expertise for your own guess, and you're now on the hook for defending a guess you weren't qualified to make.

The Diagnostic: Are You Specifying Form or Function?

You're specifying form the moment your spec answers "what does it look like" before it answers "what does it do." A fast check: read your draft and highlight every noun that's a visual property (color, size, position, font) versus every noun that's a behavior (state, trigger, condition, outcome). If the first list is longer, rewrite before you send it.

  • Form language: "blue button," "20px padding," "modal centered on screen," "icon on the left"
  • Function language: "primary action," "sufficient touch target for mobile," "blocks background interaction until resolved," "indicates the action this triggers"

The Mental Shift: Constraints Liberate

Constraints liberate because a designer facing infinite possibility has no faster way to start than one you hand them — the discipline isn't giving less direction, it's giving direction at the right altitude. A blank "design the settings page" brief is paralyzing; a spec that nails intent, inputs, and boundaries gives a designer somewhere to stand while still leaving the form entirely theirs.

This is the same insight behind design tokens and component APIs: you get consistency and speed precisely because the underlying primitives are constrained, while the compositions built from them stay open-ended. If you haven't internalized that relationship, our guide to how design tokens work for PMs walks through why constraining the atoms is what frees up the whole. The same logic that makes a token system liberating for a design org makes a well-bounded spec liberating for a single designer on a single feature.

Think of a spec as a fence, not a floor plan. A floor plan dictates where every wall goes. A fence marks the property line and leaves everything inside it up to the person building on the lot. Good specs behave like fences:

Spec typeWhat it fixesWhat it leaves openResult
Pixel-prescriptiveColors, spacing, exact copy, layoutAlmost nothingDesigner executes, doesn't contribute
Behavior-and-boundaryTriggers, states, edge cases, non-goalsVisual language, layout, component choiceDesigner solves, PM validates intent
No spec at allNothingEverything, including scopeDesigner guesses at requirements too

Notice the third row: the failure mode isn't only over-specifying. Under-specifying — handing a designer a one-line ticket and no state model — is just as damaging, because it forces the designer to invent behavior decisions that should have been a product call. The discipline this article teaches sits deliberately in the middle.

A Bad Spec vs. a Good Spec, Same Feature

The clearest way to see the difference is to hold the two side by side on one feature: a file-upload control inside a form. Below, the bad spec front-loads visual detail and leaves behavior to guesswork; the good spec does the reverse.

The Bad Spec (Pixel-Prescriptive)

"Add an upload button, 160px wide, gray background (#F3F4F6), rounded corners (8px radius), positioned below the description field with 24px margin. On click, open a file picker. Show a green checkmark when done."

Read that again and count the open behavioral questions: What file types are accepted? What happens above the size limit? Can a user cancel mid-upload? What if the upload fails on a bad connection? Is there a limit on file count? None of this is answered — the spec spent its entire budget on things a component library probably already handles.

The Good Spec (Behavior-and-Boundary)

Goal: Let a user attach one supporting document to their request without leaving the form.

  • Trigger: User selects a file via native picker or drag-and-drop onto the designated zone.
  • Accepted inputs: PDF, PNG, JPG; max 10MB. Reject and message otherwise (see error state).
  • States: empty → uploading (with progress and cancel) → success (filename + remove option) → error (reason + retry).
  • Edge cases: connection drop mid-upload retries once automatically, then surfaces error; duplicate filename appends a counter, doesn't block; user can replace an uploaded file without re-triggering the whole form's validation.
  • Success criteria: a file attached in success state is retrievable by support staff within the same request record.
  • Non-goals: multi-file upload, in-app preview, and drag-reordering are explicitly out of scope for this release.

The second version never mentions color or pixel width, yet it's dramatically more useful. A designer reading it knows exactly what the feature must survive — and has full authority over how the drop zone looks, whether it's a button or a dashed region, and how the progress state animates.

The Behavior-Driven Spec Checklist

A behavior-driven spec is complete when five categories are answered, regardless of how the feature ends up looking: triggers, states, edge cases, success criteria, and explicit non-goals. Missing any one of these is what forces a designer to guess — and a guess made under deadline pressure usually guesses wrong.

  1. Triggers — What user action, system event, or condition initiates this behavior? Include all entry points, not just the happy-path one (e.g., keyboard shortcut and menu item, not just the button).
  2. States — What are the distinct states the feature can be in (empty, loading, populated, error, disabled, success)? Draw the transitions between them, even as a simple list, not just the states themselves.
  3. Edge cases — What happens at zero, at the maximum, on failure, on permission denial, on slow network, on concurrent edits? Name the ones you know matter; flag the ones you're unsure about as open questions rather than silently omitting them.
  4. Success criteria — How will you and the designer know the behavior is correct once built? Tie this to an observable outcome, not a subjective impression.
  5. Non-goals — What is this feature explicitly not trying to do this release? This is the most-skipped category and the one that prevents scope creep disguised as "thoroughness."

What to Deliberately Leave Out

Leave out anything that's a form decision rather than a function decision: exact colors, spacing values, font choices, icon selection, animation curves, and component type (is it a modal or a drawer — usually that's a design call, not a product one). If you catch yourself specifying a hex code, ask whether a designer with the behavior spec above would actually make a worse call without it. Usually, no.

  • Don't specify layout unless layout is the constraint (e.g., "must fit in a 320px-wide mobile viewport" is a constraint; "logo top-left" is a preference).
  • Don't specify copy verbatim unless legal, compliance, or precision requires exact wording — otherwise give intent ("communicate that this action can't be undone") and let a designer or writer draft it.
  • Don't specify a component by name unless your design system mandates it — reference the design system's shared component library instead and trust it to supply the right primitive.

Constraints You Should Still State Explicitly

Not everything visual is out of bounds — some constraints are load-bearing and belong in every spec regardless of how minimal you otherwise keep it. The rule is: state a constraint when violating it breaks something (brand, accessibility, platform, legal, performance); omit it when it's merely a preference.

Constraint typeExampleWhy it belongs in the spec
AccessibilityMust meet WCAG AA contrast and be operable by keyboardNon-negotiable regardless of visual direction chosen
PlatformMust work at 320px width and with no hover state (touch)Design decisions made without this fail on real devices
PerformancePerceived response within 200ms or show a loading stateBehavior obligation, not a look-and-feel one
Brand/systemMust use existing design tokens, not new colorsKeeps output composable with the rest of the product
Legal/complianceConsent copy must appear before data is submittedA business risk if silently designed around

This is where component-API thinking helps: the best way to think about a UI constraint is the same way you'd think about a function signature — define the inputs and outputs precisely, and don't dictate the implementation inside. If that framing is new to you, our piece on component-API thinking for PMs goes deeper on treating UI surfaces like contracts rather than layouts.

Grounding the Spec in the Job, Not Just the Screen

A behavior spec grounded in a customer's actual job-to-be-done stays honest about what the feature must accomplish, independent of any particular screen design. If you write the trigger, states, and edge cases directly from a JTBD statement, you avoid the trap of specifying a screen because it's familiar rather than because it's necessary.

Clayton Christensen's jobs-to-be-done framework and Tony Ulwick's outcome-driven innovation both push toward the same discipline: describe the outcome the customer is "hiring" the feature to produce, not the mechanism. Our complete guide to jobs-to-be-done covers how to derive those outcome statements — they translate almost directly into the success-criteria line of your spec. Pairing that with a customer-journey view also surfaces edge cases you'd otherwise miss, like what state the feature should be in immediately after a frustrating prior step.

This is also where a product trio setup earns its keep: a PM who drafts behavior-and-boundary specs solo is guessing at feasibility and desirability constraints a designer or engineer would catch immediately in the room. The product trio operating model is built around exactly this — writing the spec together so the boundary lines get drawn by the people who'll actually hit them.

Where Prodinja Fits This Discipline

Spec Studio's design and UX sections in Prodinja are built to hold behavioral intent and constraints — triggers, states, edge cases, non-goals — alongside the product goals they serve, so a PM can capture the "what" in the same living document without drifting into dictating the "how." Because Spec Studio is designed around PR-style diffs and readiness gates, a spec that stays behavior-first is also easier to review for completeness: a reviewer can check "are states and edge cases defined" as a gate criterion, the same way they'd check for a missing acceptance test, rather than debating a color choice that was never the spec's job to make.

That's the practical payoff of the discipline this article teaches: a spec format that structurally keeps you in the behavior lane makes it easier to hand off cleanly, because there's no visual prescription for a designer to push back on in the first place.

Key Takeaways

  • Specify behavior, not pixels: triggers, states, transitions, and constraints define a feature; colors, spacing, and layout are a designer's craft.
  • Constraints liberate: a well-bounded spec gives a designer somewhere to start, the same way design tokens free up higher-level composition.
  • Use the five-part checklist: triggers, states, edge cases, success criteria, and non-goals — missing any one forces the designer to guess.
  • State load-bearing constraints explicitly: accessibility, platform, performance, brand, and legal requirements are behavior obligations, not style preferences.
  • Ground specs in the job-to-be-done, not the screen, so success criteria describe outcomes rather than mechanisms.
  • Write specs with your trio, not solo — a designer or engineer in the room catches feasibility and desirability constraints before they become rework.
  • Non-goals prevent scope creep disguised as thoroughness — they're the most commonly skipped, and the most valuable, section of any spec.

Frequently Asked Questions

What is the difference between a UX spec and a design spec?

A UX spec typically defines behavior — triggers, states, flows, and constraints — that a feature must satisfy, while a design spec (or visual spec) defines the resulting look: layout, color, typography, and spacing. The discipline in this article is about PMs writing the former and trusting designers with the latter.

How detailed should a PM's interaction spec be?

Detailed enough that every state, trigger, and edge case is named, but not so detailed that visual decisions like color or exact spacing are dictated. A good test: if a designer could implement the feature correctly without ever seeing a mockup, the spec has enough behavioral detail; if they'd need to guess at what happens on failure, add more.

Isn't it faster to just show the designer a mockup instead of writing a spec?

A rough sketch alongside a written behavior spec is often faster than either alone, but a polished mockup used instead of a spec tends to backfire — high-fidelity visuals read as final decisions, so designers push back less even when the underlying behavior is unclear or wrong. Keep any visual reference explicitly labeled as illustrative, not prescriptive.

How do I stop myself from over-specifying visual details out of habit?

Read your draft and flag every noun that describes appearance (color, size, position, font) versus behavior (state, trigger, condition, outcome); if the appearance list is longer, you're specifying form instead of function. Writing specs jointly with a designer, rather than solo, also catches this quickly — they'll tell you which lines they didn't need.

What belongs in the "non-goals" section of a spec?

Anything a reasonable reader might assume is in scope but isn't — adjacent features, edge cases you're consciously deferring, and visual patterns you're not asking for this release. Listing non-goals explicitly prevents scope creep that shows up disguised as "just being thorough" during design or engineering review.