A criterion for accepting a user story
An acceptance criterion is a precise, testable condition that defines when a piece of work is done correctly. It converts a goal into a pass-or-fail statement: given some context, when something happens, then a specific result must follow. A criterion written up front means "done" is decided by a shared rule rather than by whoever argues after the work ships.
Acceptance criteria grew out of agile and extreme programming, where the 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 → was deliberately too small to hold full detail. Ron Jeffries' Card, Conversation, Confirmation formulation (2001) named the missing piece: a story is a card, a conversation about it, and a confirmation that it works. That confirmation is the acceptance criterion, the agreed test that closes the story.
The format that dominates today came from behaviour-driven development. Dan North named BDD around 2003 and described it in 2006 as a way to fix the vagueness of test-driven development. Drawing on the ubiquitous language idea from Eric Evans' Domain-Driven Design, North's collaborators developed the "Given, When, Then" template to capture a story's acceptance criteria in a form business and engineering could both read. By 2007 this had become the Gherkin syntax behind Cucumber, where criteria written in plain structured English could execute as automated tests.
That executable turn changed what a criterion is. A criterion that started as a note for humans became, in Gherkin, both the specificationSpecificationFoundationsA canonical open standard or specification that primitives and products conform toView reference → and the test, so the document describing correct behaviour and the check enforcing it stopped being able to drift apart. Teams that did not automate kept criteria as written checklists, and the field accepts both, with the trade-off being how easily the criterion goes stale.
Nagy and Rose, in The BDD Books: Discovery, treat that executable artifact as downstream of the work that actually decides correctness. Most BDD writing, they note, bundles conversation, documentation, and automation together; they instead isolate the discovery phase — the collaborative work of agreeing what to build and why before any scenario is written — and argue that a team can produce syntactically correct Gherkin and still encode the wrong behaviour if that upstream work was skipped. Their preferred mechanism is Example Mapping, the card-based workshop (story, rules, examples, open questions) created by Matt Wynne, of which their book is the first full written treatment: it forces a story into concrete rules and examples, surfacing edge cases — such as the unregistered-email decisionDecisionStrategyA recorded decision with context, rationale, and consequencesView reference → above — that a one-line story conceals. On that view the criterion's correctness is settled in the conversation, and the Gherkin only records it.
A story reads: "As a returning user, I can reset my password by email." On its own that is a wish. The team attaches three criteria. Given a registered email, when the user requests a reset, then a reset link is sent within 60 seconds. Given an unregistered email, when a reset is requested, then the same confirmation message shows and no email is sent (so attackers cannot probe which emails exist). Given an expired link, when it is clicked, then the user is told to request a new one.
The second criterion is the one that earns its keep. It encodes a security decision that the one-line story hid completely, and writing it forced that decision into the open before any code existed. When the work arrives, QA does not interpret intent; they run three checks and the story passes or it does not.
In the Unified Product Graph, Acceptance CriterionProduct SpecificationA condition that must be met for a story to be done is a leaf in the Product and Delivery region. It attaches under the story it closes through acceptance_criterionstory_statement_verified_by_acceptance_criterion, and it reaches across into the Operations and Quality region through Test CasevalidatesAcceptance Criterioncross-domain, which links the human-readable condition to the mechanised test that enforces it. That two-edge structure is the executable-specification idea made concrete: the criterion holds the agreed rule, and the connected test case holds the proof it still holds, so a criterion with no validating test is queryably exposed as a promise nobody is checking.test_case_validates_acceptance_criterion
Worked example: Trellis
The acceptance criterion for Trellis's change-preview story states that the preview must show every affected record and require explicit approval before the change runs, and that any approved change must remain reversible after the fact. Acceptance criteria like this make the featureFeatureProduct SpecificationA product capability or featureView reference →'s 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 → testable and give the team a clear definition of done before a releaseReleaseProduct SpecificationA shipped version of the productView reference → ships.
Type-specific fields on BaseNode
conditionstringRequired condition (Given/When/Then or plain text)
test_typeenumTest mode
pass_statusenumCurrent pass/fail
idstringrequiredUnique identifier (UUID)
typeNodeTyperequiredDiscriminator for the entity type
titlestringrequiredDisplay name
descriptionstringOptional detailed description
statusstringLifecycle status
tagsstring[]Freeform tags for filtering
2 edge types connected to this entity.
user_story_verified_by_acceptance_criteriontest_case_validates_acceptance_criterion