A large goal held for prioritisation, then split into deliverable stories when the team is ready to build.
An epic is a large body of work too big to build or estimate in one go, held together by a single coherent goal until it can be split into the smaller stories that actually ship. It stays whole long enough to argue about priority, then dissolves into stories once the team is ready to build.
The word grew out of the same XP practice that produced user storiesUser StoryProduct SpecificationA user's goal and the value they expect, in the "As a… I want… So that…" format. Now also a first-class plannable unit (priority, effort, assignee, due_date) that schedules into a planning_cycle, and it round-trips an external board's column via workflow_state.View reference →. As Mike Cohn puts it, the teams that invented stories used *epic* to mean simply a big user story, one large enough that it had to be broken down before it could be estimated or scheduled. There was no separate ceremony or artefact, just a story you could not yet size.
Cohn paired epic with a second word, theme, for a collection of related stories grouped for planning, and he later argued the practical point: epics, themes, and features are labels we put on backlog items, with no magic size at which one becomes another. Jeff Patton's story mapping gave the idea a spatial home: arrange stories along a user's workflow, and the larger activities that span them surface as the natural epics, which anchors the breakdown to what the user is trying to do.
Scaled frameworks then hardened the label into a tier. In the Scaled Agile Framework an epic is a significant initiativeInitiativeStrategyA large coordinated effort to achieve a strategic goalView reference → requiring portfolioPortfolioPortfolioA grouping of products by strategic axisView reference →-level approval and a business case, sitting above featuresFeatureProduct SpecificationA product capability or featureView reference → and capabilitiesCapabilityStrategyAn ability that enables value deliveryView reference → and typically spanning multiple teams and program increments. That formalisation is the live tension in the field. To Cohn the word stays a flexible label; to SAFe it is a governed level with funding gates. Both are in active use, so the same word carries a loose meaning on a startup board and a strict one in an enterprise portfolio.
Ryan Singer's *Shape Up* takes a third position: reject the epic-and-stories hierarchy altogether. Singer argues that decomposing work into backlogs of stories leaves design questionsDesign QuestionExperience DesignAn open design problem to exploreView reference → unresolved and creates an illusion of control; the real problem is that teams schedule before the work is shaped. His alternative is the **pitch** — work that has already been de-risked and bounded by an *appetite* (a fixed time budget, not an estimate) before it enters a six-week cycle. By that reading, the question an epic is meant to answer — "how big is this?" — is the wrong question; the right one is "how much time is this worth?" and the answer determines scope, not the other way around.
A product team frames an epic: "Self-serve onboarding so a new account reaches first value without sales involvement." It is plainly too big to estimate, and that is the point at this stage. As an epic it competes for priority against three other epics on the roadmapRoadmapProduct SpecificationA strategic plan of features and milestonesView reference →, and the team can discuss the bet without yet committing to a design.
Once it wins a slot, the epic splits along the user's path. Story mapping breaks it into the steps a new user takes: sign up, import existing data, invite a teammate, complete a first taskTaskProduct SpecificationA unit of work within a story or epicView reference →. Each becomes one or more stories, and the team commits to a thin slice across all four steps for the first releaseReleaseProduct SpecificationA shipped version of the productView reference →, deferring the richer variantsVariantGrowthA variant in an A/B testView reference →. The epic stays on the board as the umbrella that tells everyone why these dozen stories belong together, and it closes when the last of its stories ships, having never acquired scope of its own.
In the Unified Product Graph an epic lives in the Product & Delivery region, the work-breakdown spine feature → epic → story → task. It enters from above through Featuredecomposed intoEpichierarchy and exits downward through feature_decomposed_into_epicepic_specified_by_story_statement, which is the structural expression of the rule that an epic exists to be split. Because the region composes the product_spec and program_mgmt domains, the same epic can be governed by a roadmap and a release without changing what it is. That separation lets a graph hold both readings of the word: the loose XP label and the SAFe portfolio tier are the same node type at different scales, distinguished by how many stories hang beneath it and how far up the strategy edges reach.
Worked example: Trellis
The Safe Change general-availability effort is an epic: it breaks into the per-record preview, the plain-language explanation, and the one-click rollback work, each tracked as a user storyUser StoryProduct SpecificationA user's goal and the value they expect, in the "As a… I want… So that…" format. Now also a first-class plannable unit (priority, effort, assignee, due_date) that schedules into a planning_cycle, and it round-trips an external board's column via workflow_state.View reference → or taskTaskProduct SpecificationA unit of work within a story or epicView reference → under the same parent. Framing it as an epic lets the team plan the full feature areaFeature AreaProduct SpecificationA grouping of related featuresView reference → before committing to which slice ships in which releaseReleaseProduct SpecificationA shipped version of the productView reference →.
Urgent Blocking progress or time-critical; must be addressed immediately.
Type-specific fields on BaseNode
estimatestringRough size estimate (e.g. "3 sprints", "L", "13 points")
priorityenumTask-level priority
ownerstringResponsible person or team. Promote to a `node_owned_by_person` edge if ownership must be queryable.
start_datestringISO date work begins
target_datestringISO date work completes
workflow_statestringThe source tool's raw custom workflow state, verbatim and opaque (e.g. "In Review", "QA", "Needs Triage"). Non-canonical and never reasoned over: it exists to round-trip an import losslessly. Map it onto a canonical bucket with `workflow_state_category`; canonical `status` stays the sole reasoning axis.
workflow_state_categorystringCanonical bucket the raw `workflow_state` maps onto for reasoning (a source "In Review" and "QA" might both map to a verification phase). Optional companion to `workflow_state`: it lets a graph reason over an imported custom workflow without promoting the raw label to `status`.
idstringrequiredUnique identifier (UUID)
typeNodeTyperequiredDiscriminator for the entity type
titlestringrequiredDisplay name
descriptionstringOptional detailed description
statusstringLifecycle status
tagsstring[]Freeform tags for filtering
4 phases, initial: todo · template: WORK_ITEM
4 edge types connected to this entity.
feature_decomposed_into_epicepic_specified_by_user_story2 frameworks use this entity type.