Building & Shipping PM

UI-description acceptance criteria can pass in a broken build. Behavior contracts cannot.

Building & Shipping Building & ShippingBeginner

Writing User Stories That Survive the Sprint

User story anatomy, acceptance criteria, and the four mistakes that guarantee your story will be reopened mid-sprint, written for Product Owners who own the backlog. The judgment: acceptance criteria that test behavior are harder to write and the only kind worth writing.

A user story is a unit of product intent, not a description of a screen, not a task for a developer, and not a feature request dressed in a template.

The Sprint That Never Ends

A product team in Pune building an enterprise Human Resource Management System spent two quarters watching the same pattern repeat. Stories would clear sprint review. QA would mark them green. Three weeks later, a stakeholder or a downstream integration would surface a failure, and the story would be reopened.

The team assumed the problem was scope creep. It was not. When the engineering lead pulled the reopened tickets, the pattern was clear: nearly every one had acceptance criteria written in the form of UI descriptions. "The button should be disabled." "The field should show a red border." "The modal should close."

None of those criteria were wrong. None of them were sufficient. A feature can satisfy all of them and still fail the user it was built for.

This article is about closing that gap, not with a template, but with a specific shift in how you write the contracts between you and your team.


The Three-Part Structure and What Breaks Without Each Part

The standard user story format exists for a reason. It is not a formality.

As a [actor], The actor is not a persona label. It is the entity whose behavior the system must accommodate. Skipping this turns the story into a feature description with no owner. When implementation questions arise, and they will, there is no anchor for judgment. The team defaults to guessing who benefits and often optimizes for the wrong person.

I want to [action], This is the only part most teams actually write, and they write it as a task for the developer rather than an action for the user. "I want to click the approve button" is not an action for the user, it is an implementation detail disguised as a story. The action should describe what the user is trying to accomplish, not how the interface enables it.

So that [outcome], This is the part that survives the hardest implementation decisions. When a developer hits an edge case at 4 PM on the last day of the sprint, the "So that" clause is the only thing that tells them whether to block, simplify, or ship. Teams that drop this clause are not saving time, they are outsourcing every judgment call to whoever is closest to the keyboard.

Remove any one of these parts and the story becomes ambiguous in a different direction. Together, they create a complete unit of intent that can survive contact with implementation.


What Each Artifact Contains, and Why Conflating Them Destroys Your Backlog

Product backlogs fail in a predictable way: everything gets written at the same altitude. Epics, stories, tasks, and acceptance criteria end up in the same column, treated as interchangeable. They are not.

Artifact What It Contains Who Writes It When It Is Done
Epic A large outcome spanning multiple sprints, the "why" at the initiative level Product Manager or Product Owner When all child stories are shipped and the outcome is validated
User Story One unit of user intent: actor, action, and outcome in three parts Product Owner, with input from the team When acceptance criteria are met in a working build
Task A unit of implementation work, a step a developer or designer takes to complete a story Engineer or Designer When the work item is merged, deployed, or handed off
Acceptance Criterion A testable condition that defines done for the story Product Owner, reviewed by QA Not a deliverable, a contract that governs the story

The most common collapse is between story and task. A story that reads "Add validation to the salary input field" is a task. It describes what the developer does, not what the user achieves. A story reads: "As a payroll administrator, I want the system to prevent non-numeric salary entries so that payroll calculations do not fail on submission."

The difference is not cosmetic. The story version creates a behavioral contract. The task version creates a to-do item. A backlog full of to-do items is not a product plan.


The Acceptance Criteria Problem Nobody Admits

Here is the position most teams will not hear from a consultant who wants repeat business: your acceptance criteria describe what the screen looks like, not what the system does.

This means your QA engineer can mark the story green while the feature is still broken. The screen looks correct. The behavior is wrong. The user fails. And the story gets reopened two weeks after it shipped.

UI-description criteria are easy to write because they are observable at a glance. "The submit button is disabled when the form is empty." You can see that. You can screenshot it. You can check it against a Figma frame.

Behavior-contract criteria are harder to write because they require you to think through what the system must do, not just what it must show. They require you to name the trigger, the system response, and the outcome from the user's perspective.

The Pune HRMS team made this shift deliberately. Over two quarters, they rewrote their acceptance criteria template from UI-first to behavior-first. The reopening rate for sprint stories dropped measurably. The change was not in the stories, it was in the criteria that defined done.


The Behavior-Contract Rewrite

The transformation is specific. Here is what it looks like in practice.

UI-description format (what most teams write):

  • The salary field shows a red border when the input is invalid
  • The submit button is disabled until all required fields are filled
  • An error message appears below the field

Behavior-contract format (what survives QA):

  • When a payroll administrator enters a non-numeric value in the salary field and moves focus away, the system rejects the value, retains the previous valid value, and displays an error message identifying the field and the expected format
  • When any required field is empty, the system prevents form submission and surfaces the first incomplete required field, the user does not need to identify which field failed
  • When the form is submitted successfully, the system confirms the submission with a reference identifier the administrator can use for audit purposes

Read both versions carefully. The first set can pass in a broken build. A developer could stub the visual states without wiring the validation logic. QA sees red borders and disabled buttons, everything checks out. The user submits bad data anyway.

The second set cannot pass in a broken build. Each criterion describes a system action triggered by a user action with a verifiable outcome. If the system does not retain the previous valid value, the criterion fails. If the confirmation does not include a reference identifier, the criterion fails. There is no room for visual substitution.

This is harder to write. It requires you to understand the system behavior, not just the design handoff. That is the cost, and it is worth paying.


The Four Mistakes That Guarantee a Reopened Story

These are not hypothetical. Each one produces a specific failure mode.

Writing for the design, not the behavior. When your source of truth for acceptance criteria is the Figma frame, your criteria will describe what the design shows, not what the system must do. Designs do not capture edge cases. Your criteria must.

Dropping the "So that" clause. Every judgment call a developer makes in implementation will be made without context. They will optimize for what seems reasonable, which may not match what the user needs.

Conflating done with deployed. A story is done when the acceptance criteria are met in a working build, not when the code is merged. If your team treats merge as done, stories will ship with criteria unchecked.

Writing criteria after the sprint starts. Acceptance criteria written during the sprint are written under time pressure, often by whoever is closest to the story. They reflect what was built, not what was intended. Write them before sprint planning, in grooming, when there is still time to push back on scope.


The Judgment Turn

The behavior-contract format is uncomfortable because it transfers accountability. When you write "the button should be disabled," you are describing a design state, and if something breaks downstream, the story technically passed. When you write "the system prevents submission and surfaces the first incomplete field," you are writing a contract. You own whether that contract was specified correctly.

That accountability is exactly why most acceptance criteria stay in UI-description format. It is easier to describe what the screen shows than to specify what the system must do. It is also a predictable source of sprint failures, reopened tickets, and stakeholder trust erosion.

The HRMS team in Pune did not change their estimation process, their sprint length, or their definition of ready. They changed how they wrote the contracts between intent and implementation. The results showed up in reopening rates within two quarters.

The question is not whether behavior-contract criteria are harder to write. They are. The question is whether you would rather carry that cost in grooming, or pay it in the middle of a sprint, after the story has already been marked done.


Key Takeaways

  1. All three parts of a user story, actor, action, outcome, are load-bearing. Removing "So that" eliminates the rationale for every implementation tradeoff the team will make.
  2. Epics, stories, tasks, and acceptance criteria operate at different altitudes. Conflating them produces a backlog that looks full and delivers slowly.
  3. UI-description acceptance criteria can pass in a broken build. Behavior-contract criteria cannot.
  4. The behavior-contract rewrite specifies trigger, system response, and verifiable outcome, not visual state.
  5. Acceptance criteria written during the sprint reflect what was built. Write them in grooming, when there is still time to change what will be built.

Related Articles

Warm-up Reps

Did it land?

0 / 1 CORRECT
Three quick checks on the ideas above. Pick an answer and you will see why it is right or wrong. Consider it the warm-up before the real gym.
Q1
What is the structural difference between a user story and a task?
Stories and tasks operate at different altitudes. Conflating them means your backlog is a to-do list, not a product plan.
AW

Anmoll Wadhwa

Senior PM · writing The PM Code

Field notes on product judgment: essays, teardowns, and reps for PMs who would rather think than template. A sharper take most days on LinkedIn.

More like this. Once a week.

Tactical essays on the calls that actually matter. In your inbox before they are on the feed.

LEARN·BUILD·COLLABORATE