2026-07-24

Pausing Sprint 9 for a UX Brainstorm — and Why That's the Agile Move, Not a Detour

Two groomed sprints were sitting ready to build: a completed My Beers screen, and the push-notification infrastructure it would eventually depend on. Then a session of just using the app surfaced two things at once — a real bug, and a much bigger question about whether the core flow was actually the fast, frictionless thing the product needs to be. The honest response wasn't "fix the bug and keep going." It was to stop building anything until the bigger question got answered.

A trivial bug that wasn't safe to fix yet

The bug itself was small: after logging in, the app never redirects away from the login screen. It fires the event that updates the nav, but nothing sends the user anywhere — so the login form just sits there under a tab bar that's already appeared around it. The fix is a one-line redirect call, and the exact line was already identified.

It stayed unfixed anyway. A redirect has to go somewhere, and where a customer should land after logging in was exactly the thing in question. The app's tab structure had been built around a progress-first home screen; the feedback from actually using it pointed somewhere else entirely. Patching the redirect to the old target would have meant writing it twice — once now, wrong, and once again after the real direction was settled. Leaving a known bug unfixed for a session is uncomfortable, but shipping a fix aimed at a target that's about to move is worse: it looks like progress while quietly creating rework.

Structuring an open-ended question instead of just discussing it

"Make the confirm flow feel effortless" is the kind of requirement that sounds clear until you try to build against it. So instead of a free-form conversation, the actual discovery took the shape of twenty concrete questions grouped into five themes: when a customer actually opens the app, how they find the beer they're drinking, the exact physical PIN handoff between customer and bartender, what belongs on screen versus buried a tap away, and what happens when something goes wrong at a real, busy bar. Each question came with prompts aimed at a specific memory of an actual bar visit, not an abstract description of how things "should" work.

That structure mattered more than any individual answer. A vague direction like "make it fast" resists being turned into a ticket. A specific answer like "a customer should be able to queue several beers and confirm the whole round with one PIN entry" turns directly into an API shape and a UI component. The discovery session's real output wasn't a document — it was twenty answers concrete enough that a backlog could be built on top of them without guessing.

What came out of it wasn't cosmetic

The answers reshaped more than the login redirect. Serving format — draft, can, or bottle — turned out to matter enough that the same beer in three formats should earn three separate credits toward the 200, not one. Confirming needed to move from one PIN entry per beer to a queue that a bartender confirms all at once. A beer missing from the catalog needed a path for a customer to add it themselves and get credit the same night, not wait on an admin. And the four-tab navigation shipped a few sprints back needed to collapse to two.

Every one of those is a real schema or architecture change, not a coat of paint. The confirmation table's uniqueness constraint moves from "one row per customer per beer" to "one row per customer, per beer, per format" — which touches every downstream feature that counts confirmations, including the mug-earned milestone and the ratings feature that was about to be built on top of the old assumption.

Re-grooming instead of quietly rewriting history

That last point was the real test of whether the process holds up under pressure. Two sprints were already scoped, ticketed, and sitting in GitHub milestones, built against the old one-beer-per-confirmation model. The tempting shortcut would have been to just edit those tickets in place and pretend the old shape never existed. Instead, a new sprint got inserted ahead of both of them — the schema change, the batch-confirm endpoint, the redesigned queue-and-PIN screen, the two-tab nav — because the already-scoped My Beers sprint reads that confirmation data directly and can't be built correctly on the old assumption. The My Beers sprint didn't get silently rewritten; it got renumbered to make room, and every one of its own tickets got an explicit note describing exactly what changed underneath it and why. Anyone reading the backlog later can see that the shape changed, not just that it's different now.

The PM angle

This is the part of Agile that's easy to say and harder to actually do: responding to new information should change the plan, not get absorbed into it as scope creep or ignored to protect a sprint that's already scoped. The instinct to protect sprint velocity — just ship what's already ticketed, patch the small bug, deal with the bigger question later — would have meant building a ratings screen against a confirmation model that was already known to be wrong. Stopping cost a session. Building on the wrong foundation would have cost the session it took to notice, the session it took to unwind, and the trust that the backlog reflects reality. A groomed sprint is a snapshot of what was true when it was groomed, not a commitment that survives new information showing up — and the discipline is in admitting that out loud, in the tracking docs, rather than either freezing in place or pretending nothing changed.

Where the project stands

The discovery session resolved into a full decision log, folded into the project's planning docs. A new sprint — the confirmation-format schema change, the batch-confirm endpoint, the redesigned queue-and-PIN-pad flow, and the two-tab nav — is scoped and ready to build first. The My Beers sprint is still scoped, just renumbered and annotated to build on the new foundation instead of the old one. The push-notification sprint behind it is untouched, since nothing about it depended on the assumption that changed. Nothing shipped this session — but the backlog now matches what's actually true, which is the thing that was worth pausing for.

Comments

Loading comments...