Learn

/

Story vs Braindump

Story vs Braindump

7 patterns

The difference between a note to self and a contract between product, design, and engineering. Titles that read as implementation, ACs tangled with technical notes, and the kind of ticket a new joiner has no chance with.

Avoid
Story
AUTH-482
3 pts
Refactor useAuthController to support new session structure

Prefer
Story
AUTH-482
3 pts
Users stay signed in across tab reloads
Why avoid

A title that names the implementation tells you what the engineer plans to do, not what users will get. A new joiner reads it and learns nothing about the product. Save implementation language for the subtasks or the PR description.

Why prefer

The title names a user-visible outcome a designer, PM, or new engineer can reason about cold. Same work underneath, but the framing answers what changes for whoever is on the other end.

Agile Alliance: User Story Template
Avoid
Story
AUTH-482
3 pts
Users stay signed in across tab reloads
Acceptance criteria
Sessions survive reload
impl
Refactor getSession() to use the new cookie helper
impl
Delete the old legacyAuth module

Prefer
Story
AUTH-482
3 pts
Users stay signed in across tab reloads
Acceptance criteria
Givena signed-in user
Whenthey reload the page
Thenthey remain signed in
Givena signed-in user
Whenthey open the app in a new tab
Thenthey are signed in in that tab
Givena user whose session has expired
Whenthey reload
Thenthey see the sign-in screen
Subtasks
Adopt the new cookie helper from DEV-1234
Delete the legacyAuth module
Why avoid

Refactoring a helper is not an acceptance criterion, it is engineering work. Mixed lists make QA's job impossible: half the items are not testable from the outside, half look like work that already happened.

Why prefer

Acceptance criteria describe outcomes. Implementation steps live in subtasks where they belong. QA can verify each AC by clicking, without asking the engineer what the cookie helper does.

Bill Wake: INVEST in Good Stories
Avoid
Story
RPT-91
5 pts
Improve report exports
Description

Needs updates in exporter.ts and reportTable. @priya knows the context. See thread in #squad-reports from last Tuesday.


Prefer
Story
RPT-91
5 pts
Analysts export filtered reports without opening them
User story
As aanalyst
I wantto export the report I am filtering directly from the list view
so thatI do not have to open every report to grab the same CSV I just configured
Context

Analysts run the same filter across 30 reports a week. Today they have to open each report to export, which costs them roughly an afternoon.

Why avoid

Pointing at a Slack thread and a person's name puts the why entirely in two places that will disappear: the thread will scroll out of search, and the person will rotate off the team.

Why prefer

The right side names the actor, the outcome, and the cost they pay today. Six months from now, when the team has rotated, the ticket still answers 'why did we do this?' on its own.

Agile Alliance: User Story Template
Avoid
Story
CHK-218
3 pts
Customers see the new tax line on the invoice
User story
As acustomer in the EU
I wantthe invoice to show the tax line as a separate row
so thatI can reconcile against my accounting software
Context

Depends on the tax service being live. Mark says it should be ready next sprint.

Out of scope:Country-specific tax labels, Mark will scope those later.

Prefer
Story
CHK-218
3 pts
Customers see the new tax line on the invoice
User story
As acustomer in the EU
I wantthe invoice to show the tax line as a separate row
so thatI can reconcile against my accounting software
Context

Blocked by TAX-117 (tax service /v1/quote). Once that is shipped, this story unblocks.

Out of scope:Country-specific tax labels (Mehrwertsteuer, IVA) ship in CHK-219.
Why avoid

Mentioning a name and a service in prose is not a link. Nothing in the planning board updates when the dependency moves, and 'next sprint' has the half-life of one slipped commitment.

Why prefer

The dependency is a linked ticket key, not a hallway conversation. When TAX-117 moves the planning board can see the unblock automatically and the next refinement can pull this story without hunting for context.

Bill Wake: INVEST in Good Stories
Avoid
Story
EDIT-218
3 pts
Editors see autosave confirmation while drafting
Description

Add a debounced effect on draftStore that calls /api/drafts/autosave every 5s. Wire the response into useToast. Watch out for the SSR hydration mismatch we hit in EDIT-201.

Acceptance criteria
impl
draftStore has a 5s debounced autosave effect
impl
Autosave response is piped through useToast
impl
SSR hydration mismatch from EDIT-201 does not regress

Prefer
Story
EDIT-218
3 pts
Editors see autosave confirmation while drafting
User story
As aeditor
I wanta visible signal that my draft has saved
so thatI am not anxious about losing work during long writing sessions
Acceptance criteria
Givena draft with unsaved changes
When5 seconds pass
Thena "Saved" indicator appears
Givena save failure
Whenthe editor types
Thena retry banner is shown above the editor
Subtasks
Debounce the autosave call to 5s
Wire response into the existing toast helper
Cover the SSR hydration edge case from EDIT-201
Why avoid

A description full of file names, hooks, and edge-case warnings is a note to self in disguise. Anyone reading cold has to pattern-match through the codebase to figure out what the user gets.

Why prefer

Outcome on the front, mechanism in the subtasks. Product can demo what changed, engineering still has the implementation breadcrumbs, and the SSR caveat is captured where it will be read by whoever picks up the work.

Agile Alliance: User Story Template
Avoid
Story
ONB-12
5 pts
Fix the onboarding bug from last quarter
Description

See the Q3 retro doc. We agreed Tomas would own this. The 8-step page in the wizard should "do what we said in the meeting."


Prefer
Story
ONB-12
5 pts
New users finish onboarding without losing progress on a refresh
User story
As anew user
I wantthe wizard to remember which step I was on if my browser reloads
so thatI can pick up where I left off instead of restarting the 8-step flow
Context

The wizard currently stores progress only in memory. Funnel data shows ~12% of users drop off between steps 4 and 5, correlating with refresh events.

Why avoid

Cross-referencing a retro doc, a name, and a meeting outcome makes the ticket only readable by people who were there. Six months later, none of those references will resolve.

Why prefer

A new joiner reads three lines and is oriented: who suffers, what changes, why it matters, and roughly the size of the problem. The funnel datum makes the priority defensible without needing to find the meeting it came from.

Atlassian Team Playbook: User Stories
Avoid
Story
PLAT-201
5 pts
Switch from useEffect to useSyncExternalStore in CartContext
Description

The current implementation re-renders on every browser tab focus. New API gives us tearing-free reads.

Acceptance criteria
impl
CartContext reads go through useSyncExternalStore
impl
useEffect-based subscription is removed
impl
No tearing on tab focus events

Prefer
Story
CART-87
5 pts
Cart contents stay in sync across multiple browser tabs
User story
As ashopper with the store open in two tabs
I wantitems I add in one tab to appear in the other
so thatI do not think the app dropped my items when I switch back to the first tab
Acceptance criteria
Givena cart with two items in tab A
Whenthe user adds a third item in tab B
Thentab A shows three items without a manual reload
Why avoid

A title that begins with 'Switch from X to Y' is a refactor in disguise. It might be the right refactor, but it is not a story until someone outside engineering can describe what changes for the user.

Why prefer

The right ticket describes what shoppers experience and why it matters. The implementation choice (useSyncExternalStore, store wiring) lives in the code review, not the title. The same engineer can do the same work, but everyone else can read along.

Agile Alliance: User Story Template