Acceptance criteria and Definition of Ready β
The two artifacts that decide a feature's quality before a single line of code is written. As a QA, they're my main shift-left tool: the better we define, the less we second-guess β and the fewer bugs get born.
Acceptance criteria (AC) β
The conditions the software must meet to be accepted by the user, the client or other systems. Unique per story, and written from the end user's perspective.
The non-negotiable properties β
- Pass/fail: they're either met or they're not. Never "halfway".
- Clear, concise and testable. If it can't be verified, it's not an acceptance criterion.
- They describe the what, never the how of the solution.
- They're written before development starts and finalized during refinement. ACs written after the code aren't criteria: they're minutes of what happened.
What they're for (besides testing) β
- Delimiting scope β when the story is complete.
- Describing the negative scenarios β how the system reacts to invalid input. The happy path defines itself; ACs are worth gold for the sad paths.
- Syncing client β team: devs know what to build, stakeholders know what to expect.
- Enabling acceptance testing β each criterion independently testable.
- Allowing the story to be estimated and split.
Two valid formats β
Given/When/Then (a BDD inheritance) β my favorite when the behavior has clear states and actions:
Scenario: A viewer tries to edit a countermeasure
Given a user with the viewer role on the "Payments" project
When they try to change a countermeasure's status to "applied"
Then the change is not saved
And the insufficient-permissions warning is shownExtra advantage: if the team uses a BDD framework, the format is already familiar β dev-QA alignment for free.
Rule-oriented β a simple list of behavior rules, from which the scenarios are later derived. Better for features with many rules and few interactions.
The non-negotiable part isn't the format: it's that what's expected is made clear.
Distinctions that prevent arguments β
| What it is | |
|---|---|
| AC | The what that must be met (per issue) |
| Testing steps | The how to check it's met |
| DoD | Checklist common to all issues (green pipeline, docs, mergedβ¦) |
| DoR | What's needed to start (see below) |
And a small, brilliant rule: analysis/spike tickets don't carry ACs β they carry the questions the analysis must answer.
Making it happen (enforcement) β
Guidelines that depend on goodwill last two sprints. What works:
- AC template/checklist auto-included by issue type in the ticket manager.
- Validator on the workflow transition: you can't move to "Delivered" with unchecked AC items.
- Linking each criterion to the tests that verify it β evidence, not promise.
- AI to draft them? As a draft for the team to refine, never as the final result β and never feeding it sensitive information.
Definition of Ready (DoR) β
The DoR answers: is this task ready to be started? It's the mirror image of the DoD. It's defined on the parent tasks (epics, stories), not on the subtasks β single source of truth.
The checklist, with its owner β
| Item | Who answers | What it guarantees |
|---|---|---|
| Value proposition | Product manager | Who the stakeholder is, what problem is solved, what's out of scope, priority, release notes?, demo?, UX review? |
| ACs defined and agreed | QA | The benchmark for considering the task complete. QA guarantees the ACs exist (even if they're written as a team). |
| UX design and specs | Design | Changes detailed and linked, clear for engineering. |
| Reviewed by backend | Backend | Doubts resolved, technical notes: permissions, auditing, architecture/security review?, affected components. |
| Reviewed by frontend | Frontend | Same as above. |
| Stakeholders notified | Team lead | DevOps? Support, sales? Other teams? |
The anti-waterfall warning β
The DoR exists to avoid blockers during development, not to turn refinement into a six-week requirements phase. Sometimes it's fine to start with uncertainty and learn along the way; not every item applies to every ticket. The content matters; the format doesn't.
QA's role in all this
If a ticket reaches refinement without ACs, raising your hand is QA's job. It's the cheapest bug you'll ever catch: it doesn't exist yet.