A2.05 · Splitting · dive 2
Four seams to cut along
The signal says split; the patterns say where. A large story divides along one of four reliable seams — and each seam leaves every slice a whole story.
The four patterns are by workflow step, by business rule, by happy and sad path, and by operation. Every one is a vertical cut — down through the Portal’s store, domain, and surface — so each resulting slice is a capability a role can use, not a layer. Switch the pattern on the right to read the slices it produces.
Pick a pattern · read the slices it produces
Four reliable seams
A large story does not split anywhere; it splits along a seam — a line already present in the problem, where one story is really several. Four seams recur often enough to name. By workflow step cuts a multi-step flow into one slice per step. By business rule cuts a story that holds several rules into the base rule first, each refinement after. By happy and sad path cuts the success case from each failure case. By operation cuts a “manage” story into the actions it bundles — browse, add, edit, remove.
The four differ in where they cut, but they share one rule: each resulting slice is vertical and valuable — small enough for one rung, and still a whole story a role could be shown. A cut that yields a fragment a role cannot use is the wrong seam, however small the fragment; that direction is the next dive. Read the pattern, then read the slices, and check the last column: every slice says one rung.
- by workflow step
- One slice per step of a flow, each a complete thread. Enrol → confirm → notify becomes three slices, each demoable.
- by business rule
- One slice per rule: the base rule first, each refinement after. Enrol with no cap, then enrol with a seat limit.
- by happy / sad path
- The success case first, then each failure case. Enrol successfully, then block a double enrolment.
- by operation
- The actions a “manage” story bundles, split apart: browse, add, edit, remove a course — each one rung.
A seam is read off the story, not invented: the verb (“manage”) names an operation split, a multi-step sentence names a workflow split, and an “and what if” names a happy-and-sad-path split.
The happy path is one story; each sad path is another
The hero surveys all four seams; this view works one of them to the bottom — by happy and sad path, on the Portal’s enrol story. The happy path is the success case: a learner enrols and is in. Each sad path is a distinct failure the story must handle: enrolling twice, or enrolling in a course already full. The happy path ships first, as its own rung; each sad path is a later rung with its own acceptance, not a clause buried in the first.
Step through the slices the seam produces. Each one is a complete behaviour: it has a role, a trigger, and an outcome a role can be shown. Splitting this way keeps the first rung small and shippable, and turns every “but what about…” into a separate, estimable story rather than scope creep inside one.
Step through the happy and sad paths · one story each
The happy path ships first as its own small rung; every sad path becomes a separate, estimable story rather than scope hidden inside the first.
The patterns on the Portal
On the Portal — the learning platform this course builds — two of the locked stories carry two of the seams. “Manage the whole catalogue” splits by operation into browse, add, edit, and remove a course: four slices, each one rung, each demoable. “Enrol in a course” splits by happy and sad path into enrol successfully versus block a double enrolment: two slices, each a whole behaviour with its own acceptance. The other two seams appear on the same domain — enrol → confirm → notify is a workflow-step split, and enrol-with-no-cap then enrol-with-a-seat-limit is a business-rule split.
Across all four, the slices rest on ids that are already minted: Portal.ID.generate/1
returns a typed id and Portal.ID.decode/1 reads its .type
back, so no slice waits on another to define identifiers. The companion Functional
Programming course teaches those internals; this course cuts the stories.
# Two locked Portal stories, two seams. # "manage the whole catalogue" → BY OPERATION → 4 slices, each one rung: # browse a course · add a course · edit a course · remove a course # "enrol in a course" → BY HAPPY / SAD PATH → the success case, then each failure: # enrol successfully · block a double enrolment id = Portal.ID.generate(:course) # ids are already minted — no slice waits on another for identity assert Portal.ID.decode(id).type == :course
The principle
A large story divides along one of four seams — workflow step, business rule, happy and sad path, or operation — and each seam yields vertical slices that each still deliver value.
On the Portal
“Manage the whole catalogue” cuts by operation into browse, add, edit, remove; “enrol in a course” cuts by happy and sad path into enrol versus block-a-double-enrolment.
Four seams, one rule: cut along a line already in the story so every slice comes out vertical, valuable, and one rung.
Recap — name the seam, read the slices
The signal said the story is too big; the patterns say where it divides. Four seams recur: by operation, which splits a “manage” story into its actions; by happy and sad path, which splits a behaviour into success and each failure; by workflow step, which splits a flow into its steps; and by business rule, which splits a rule-set into the base rule and its refinements. Each seam is chosen so every slice stays vertical and valuable — small enough for one rung, still a story a role can be shown. With the seams in hand, one question remains: which direction must the cut run.
Next in A2.05: A2.05.3 · Vertical, not horizontal — why every slice must stay demoable end to end, and what cutting by horizontal layer (the database, then the API, then the UI) costs.
References
The story-splitting patterns this dive draws on, and where they connect in the course.
Sources
- Cohn, M. — User Stories Applied — patterns for splitting a story along value.
- Adzic, G. — Specification by Example — slices defined by concrete examples of behaviour.
- Beck, K. — Extreme Programming Explained — small, complete stories as the planning unit.
Related in this course
- A2.05 · Splitting stories that are too big — the module hub.
- A2.05.1 · When to split — the signal that precedes the cut.
- A2.05.3 · Vertical, not horizontal — the direction the cut must run.
- A2.01.3 · The vertical slice — the shape each slice keeps.
- A2.03 · INVEST — the test that triggered the split.
- A2 · Decomposition — the chapter.