The unit teams commit to, ship, and announce, distinct from the outcome it serves or the stories composing it.
A feature is a distinct piece of product functionality that a user can recognise and that delivers value on its own. It is the unit teams commit to, ship, and announce. A feature is a means to an end: the customer cares about what it lets them do, while the feature is the thing that appears on the roadmapRoadmapProduct SpecificationA strategic plan of features and milestonesView reference →, the releaseReleaseProduct SpecificationA shipped version of the productView reference → note, and the team's sense of progress.
Feature is older than agile and entered software planning as the obvious answer to "what does the product do?". Its sharpest framing came from outside engineering, in the marketing distinction between a feature and a benefit: a feature is an attribute of the product, a benefit is the change it produces for the person using it. Teams that confuse the two can ship attributes that do not change anything for the user.
Two bodies of practice pushed the definition forward. Marty Cagan, in *Inspired* and then *Empowered*, drew the line between a "feature team" that is handed features to build as output and an empowered product team measured on the customer and business problems it solves. The feature stops being the deliverable and becomes one possible solutionSolutionDiscoveryA proposed approach to address an opportunityView reference →, kept or discarded on the evidenceEvidenceValidationData supporting or refuting a hypothesisView reference →. Ryan Singer's Shape Up attacked the open-ended feature from another angle, with the appetite: the team fixes how much time a piece of functionality is worth, typically a six-week cycle, then shapes the work to fit that budget so an unbounded feature cannot consume whatever it takes.
The field has largely converged on a discipline around the word. The feature remains the natural unit of shippable value, and the surrounding practice exists to keep it tied to an outcomeOutcomeStrategyA desired business or user outcomeView reference →, so the question shifts from "did we ship the feature?" to "did the feature move the thing it was meant to move?".
A team ships a feature: saved filter views in an analytics product. It is distinct, a user can name it, and it delivers value alone. The trap would be to call it done at launch. The empowered framing attaches the feature to the problem it was meant to solve, that analysts rebuild the same query every morning, and to a measurable result, the share of sessions that start from a saved view.
Shaped against a four-week appetite, the team builds the core save-and-recall path and deliberately drops view sharing and scheduled exports, parking them as separate bets. Three weeks after release, forty per cent of returning analysts open a saved view on login and average time-to-first-chart drops by half. That outcome is what justified the feature; the saved view itself was the mechanism.
In the Unified Product Graph the feature is the anchor of the Product & Delivery region, chosen as the entity that answers the narrowest version of "what did we commit to?". It decomposes downward through Featuredecomposed intoEpichierarchy into the work-breakdown spine, and its boundary edges are what keep it honest. feature_decomposed_into_epicFeatureaddressesJobcross-domain ties it to the user needNeedUserA user need, pain, desire, or constraintView reference → it serves, feature_addresses_jobFeaturedrivesKey Resultcross-domain connects it to the outcome it is meant to move, and feature_drives_key_resultOutcomedelivered byFeaturecross-domain lets strategy point back the other way. Because every feature node can be traced to a jobJobUserJob To Be Done: what the user is trying to accomplishView reference → and a result, the graph makes the Cagan critique structural: a feature wired to functionality but to no job and no key resultKey ResultStrategyA measurable result tied to an objectiveView reference → is, by construction, output without evidence of value. 0.35.0 added the rung the spine was missing. outcome_delivered_by_featureFeaturespecified byUser Storyhierarchy lets a feature reach the stories that specify it without passing through an epic, and feature_specified_by_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 → joined the feature's valid children alongside user_storyEpicProduct SpecificationA large body of work that can be broken into storiesView reference →, epicBugProduct SpecificationA defect or unexpected behaviourView reference → and bugTaskProduct SpecificationA unit of work within a story or epicView reference →. The verb pair is cloned from taskEpicspecified byUser Storyhierarchy so the two rungs of the ladder read identically; a contains-style verb would have been the duplicated parent link the architecture forbids. Because the epic level is optional, a feature that skipped it previously had no path to its own stories, which made the decomposition spine look complete while leaving a real gap in it. Per-instance parentage is unchanged: a story still has one epic_specified_by_user_storyparent_id.
Worked example: Trellis
Trellis's flagship feature is Safe Change: when the agent restructures a tool, it previews exactly how every record will be affected, explains why, and requires approval, fully reversible. The feature is the shippable slice of a broader solutionSolutionDiscoveryA proposed approach to address an opportunityView reference →, an agent that builds on a structured, governed system.
Urgent Blocking progress or time-critical; must be addressed immediately.
On track Progressing as planned; no blockers or material risks.
DeliveryOn track to land as planned.
PriorityDrop-everything work.
Type-specific fields on BaseNode
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
healthenumDelivery health
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_categoryenumCanonical bucket the raw `workflow_state` maps onto for reasoning: a source "In Review" and a source "QA" may both map to a verification phase. Optional companion to `workflow_state`; canonical `status` remains the sole reasoning axis.
It exists so a graph can reason over an imported custom workflow WITHOUT promoting the source's raw label to `status`. The raw label keeps its own field and stays verbatim; this one says what that label means in the six-bucket vocabulary every major tracker converges on. NARROWED FROM `string` AT 0.32.0. The field exists to carry exactly the vocabulary, and typing it as an open string meant nothing enforced the one thing it was for; an importer could write any word here and no consumer would know it had. A graph carrying a free string now fails to type-check rather than failing to be understood.
idstringrequiredUnique identifier (UUID)
typeNodeTyperequiredDiscriminator for the entity type
titlestringrequiredDisplay name
descriptionstringOptional detailed description
statusstringLifecycle status
tagsstring[]Freeform tags for filtering
4 phases, initial: proposed
63 edge types connected to this entity.
product_builds_featureoutcome_delivered_by_featurecapability_implemented_by_featurefeature_area_contains_featurerelease_contains_featureroadmap_theme_groups_featureproduct_area_contains_featurefeature_decomposed_into_epicfeature_affected_by_bugfeature_decomposes_into_taskfeature_specified_by_user_storysolution_becomes_featurefeature_rivals_competitor_featurecompetitor_signal_maps_to_featurebug_affects_featureroadmap_item_references_featurejourney_step_realised_by_featurejourney_action_realised_by_featurefeature_occupies_surfacefeature_surfaces_productfeature_uses_design_componentscreen_surfaces_featureservice_powers_featureroot_cause_affects_featurebounded_context_contains_featuretechnical_debt_item_blocks_featureapi_endpoint_serves_featuredesign_component_implements_featureprototype_validates_featurewireframe_specifies_featureuser_flow_requires_featuretest_suite_covers_featureqa_session_targets_featurea11y_audit_covers_featureeval_benchmark_measures_featureagent_skill_extends_featurelaunch_ships_featurecompetitor_feature_inspires_featurepricing_tier_includes_featuretrial_config_unlocks_featurepaywall_gates_featureknowledge_base_article_documents_featureprompt_template_powers_featuredocument_describes_featuretutorial_explains_featuredeliverable_ships_featurecompliance_requirement_constrains_featuremarketplace_listing_extends_featurefeature_addresses_jobfeature_drives_key_resultchangelog_includes_featureconstraint_constrains_featurelearning_informs_featureexperiment_run_tests_featurefeature_tests_hypothesisincident_affects_featurefeature_flag_gates_featurefeature_addresses_needassumption_concerns_featurefeature_request_becomes_featureobjective_defers_featuredeal_blocked_by_featurefeature_communicated_via_messaging12 frameworks use this entity type.