A bounded planning interval — sprint, quarter, or PI — that schedules stories and scopes objectives.
A planning cycle is a bounded interval of planned work — a sprint, iteration, quarter, or Program Increment — and the cadence axis the rest of the graph runs on. Where a featureFeatureProduct SpecificationA product capability or featureView reference → or epicEpicProduct SpecificationA large body of work that can be broken into storiesView reference → describes what is built, a planning cycle describes when: which stories are committed to this interval, and which objectivesObjectiveStrategyA strategic goal (OKR)View reference → the interval serves. Its defining move is separation. The cycle a story is scheduled into is orthogonal to where the story lives; the story keeps its feature and epic parent, and the cadence is a deliberate link laid across that structure rather than a new home for it.
The planning cycle formalises the time-boxing at the heart of agile delivery. The fixed-length iteration comes from Scrum and Extreme Programming in the 1990s; nesting sprints inside a longer cadence — the Program Increment — comes from the Scaled Agile Framework. Each treats a bounded interval as the unit that work is committed to and reviewed against.
The UPG's contribution is to make that interval a first-class node, orthogonal to the product breakdown and shared across a portfolioPortfolioPortfolioA grouping of products by strategic axisView reference →. Because a planning cycle is portfolio-shared, the same quarter or increment can be reasoned about across several products at once, instead of living implicitly inside one team's project-management tool.
A team creates a planning cycle for each real cadence box and nests finer cycles inside coarser ones: sprints inside a quarter, quarters inside a Program Increment. Stories are scheduled into a cycle with planning_cycle_schedules_user_story, and the objectives the cycle serves are attached with objective_scoped_to_planning_cycle.
Scheduling and scoping are deliberate links, not containment. 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 → scheduled into Sprint 24 still belongs to its feature and epic; the sprint simply carries it for two weeks. This keeps two questions independent — how is this product structured, and what is committed when — so neither distorts the other.
A product runs its planning cycles (product_runs_planning_cycle); cycles nest via planning_cycle_contains_planning_cycle; they schedule user stories and scope objectives and strategic themesStrategic ThemeStrategyA high-level strategic focus area for a planning period. Its own time_horizon is now deprecated: promote the period to a planning_cycle and link the two with strategic_theme_scoped_to_planning_cycle, so themes share one dated, nestable interval instead of a drifting per-theme label.View reference →. Rolling a coarse cycle up through its children answers time-shaped questions — what is committed this quarter, which objectives this increment advances — in a single traversal.
The failure mode is the empty cadence box: a planning cycle that neither schedules a story nor contains a finer sub-cycle. A date range with nothing flowing through it is a sprint nobody planned into, or a coarse period never broken down. Either schedule the work it carries or nest finer cycles inside it — otherwise the interval is not yet a real cadence box.
Type-specific fields on BaseNode
cadence_kindenumMethodology-neutral granularity of this interval. `period` is a coarse container (quarter / PI / OKR-cycle scale); `iteration` is a fine execution box (sprint / cycle); `buffer` is between-box slack (cooldown). Required: it is the discriminator that lets one type stand in for every methodology.
cadence_labelstringThe source methodology term verbatim ("sprint", "cycle", "PI", "quarter", "cooldown"). The dual-band label: `cadence_kind` is the canonical granularity reasoned over; `cadence_label` preserves what the team actually calls it.
starts_onstringISO date the interval opens. A cycle is concretely dated, unlike a coarse `time_horizon` label.
ends_onstringISO date the interval closes.
sequencenumberThe cycle / iteration number (e.g. Sprint 47, PI 3).
goalstringThe interval's goal or focus: what this cadence box is for.
appetitestringShape Up appetite: the fixed time budget a cycle is willing to spend on a bet (e.g. "6 weeks", "2 weeks").
idstringrequiredUnique identifier (UUID)
typeNodeTyperequiredDiscriminator for the entity type
titlestringrequiredDisplay name
descriptionstringOptional detailed description
statusstringLifecycle status
tagsstring[]Freeform tags for filtering
3 phases, initial: planned
6 edge types connected to this entity.
product_runs_planning_cycleplanning_cycle_contains_planning_cycleplanning_cycle_contains_planning_cycleplanning_cycle_schedules_user_storyobjective_scoped_to_planning_cyclestrategic_theme_scoped_to_planning_cycle