
Deliver Acceptance Criteria
- 674 installs
- 518 repo stars
- Updated August 4, 2026
- product-on-purpose/pm-skills
deliver-acceptance-criteria is a pm-skills agent skill that converts user stories or feature slices into testable Given/When/Then acceptance criteria for developers and QA who need unambiguous pass/fail conditions at han
About
deliver-acceptance-criteria is one of six Deliver-phase skills in the product-on-purpose pm-skills collection, which ships 68 skills across the product development lifecycle. Invoke it with /pm-skills:deliver-acceptance-criteria after a user story or PRD section exists to produce QA-ready Given/When/Then scenarios grouped into happy path, edge cases, error states, and non-functional criteria. The workflow separates primary flows from exceptions, forbids implementation details, and includes a quality checklist that rejects subjective statements. Developers and PMs reach for deliver-acceptance-criteria during sprint planning or engineering handoff when a story needs observable, independently testable outcomes—including recovery behavior when APIs fail or validation errors occur.
- deliver-acceptance-criteria
- AI & Agent Building
- AI-coding skill
Deliver Acceptance Criteria by the numbers
- 674 all-time installs (skills.sh)
- +42 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #1,456 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/product-on-purpose/pm-skills --skill deliver-acceptance-criteriaAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 674 |
|---|---|
| repo stars | ★ 518 |
| Last updated | August 4, 2026 |
| Repository | product-on-purpose/pm-skills ↗ |
How do you write testable acceptance criteria from user stories?
Helps with ai & agent building tasks.
Who is it for?
Product managers or tech leads preparing sprint-ready stories who need QA-verifiable Given/When/Then criteria before engineering starts.
Skip if: Teams still defining problem scope or writing the initial PRD—use define-problem-statement or deliver-prd first.
When should I use this skill?
A user story or feature slice is defined and the team needs explicit, testable pass/fail conditions for engineering and QA handoff.
What you get
Grouped Given/When/Then acceptance criteria covering happy path, edge cases, error states, and non-functional requirements formatted per the pm-skills template.
- Given/When/Then acceptance criteria document
- grouped test scenarios
- quality-checklist review
By the numbers
- Belongs to pm-skills, a collection of 68 product lifecycle skills
- One of 6 skills in the Deliver phase alongside deliver-prd and deliver-user-stories
Files
<!-- PM-Skills | https://github.com/product-on-purpose/pm-skills | Apache 2.0 -->
Acceptance Criteria
Acceptance criteria define the observable behavior that must be true for a story or feature to be considered done. This skill turns feature context into concise, testable Given/When/Then scenarios that engineers and QA can verify without guessing intent.
When to Use
- After a user story, PRD section, or feature slice is defined
- When a team needs clear pass/fail conditions for implementation
- When writing QA-ready criteria for sprint planning or handoff
- When a story has edge cases, error paths, or non-functional expectations that should be explicit
When NOT to Use
- You need the user stories themselves -> use
deliver-user-stories; this skill deepens a story that already exists - You need systematic failure coverage across a whole feature -> use
deliver-edge-cases; this skill stays story-scoped - There is no story or slice to bind criteria to yet -> use
deliver-prdordeliver-user-storiesfirst - You are defining success metrics for an experiment, not done-ness for a story -> use
measure-experiment-design
Instructions
When asked to create acceptance criteria, follow these steps:
1. Confirm the story or feature scope Identify the exact slice of work. If the scope is unclear, ask for the user story, PRD section, or feature description before drafting criteria.
2. Separate the happy path from exceptions Start with the primary success flow, then add edge cases and error states that are likely or costly if missed.
3. Write each criterion as an observable scenario Use Given/When/Then language only. Keep each criterion independently testable and avoid implementation details.
4. Cover recovery and failure behavior Describe what the user sees or can do when validation fails, a dependency is unavailable, or a save action cannot complete.
5. Include non-functional expectations Add criteria for performance, accessibility, security, reliability, or auditability when they matter to the story.
6. Avoid duplication and overlap Each criterion should test one outcome. If two criteria describe the same behavior, merge or split them until the intent is clear.
7. Review for testability Ensure a reviewer can pass or fail each criterion without interpretation. If a statement is subjective, rewrite it into a measurable outcome.
Output Contract
Use references/TEMPLATE.md as the output format. A complete response should:
- Restate the feature or story context
- Group criteria into happy path, edge cases, error states, and non-functional criteria
- Use explicit Given/When/Then statements for each criterion
- Note assumptions or open questions when context is incomplete
Quality Checklist
Before finalizing, verify:
- [ ] The criteria map to a specific story or feature slice
- [ ] The happy path is covered first
- [ ] Edge cases are explicit, not implied
- [ ] Error states include user-visible recovery behavior
- [ ] Non-functional criteria are included when relevant
- [ ] Each criterion is testable and has one clear outcome
- [ ] No implementation details leak into the acceptance criteria
Examples
See references/EXAMPLE.md for a completed example based on a realistic e-commerce checkout flow.
Scenario: bulk-invite teammates to a workspace
This is the INPUT brief for an output-quality eval. The skill arm and the control arm each receive everything below (and nothing else about how to do the work) and produce an acceptance-criteria artifact for it. Judges never see this header.
Feature brief
Product: a B2B SaaS team workspace (project-management tool). Workspace admins manage membership.
User story: As a workspace admin, I want to invite several teammates at once by entering or pasting their email addresses, so that I can onboard my team without sending invites one at a time.
How it should work (intended behavior):
- The invite box accepts multiple email addresses separated by commas, spaces, or newlines, or pasted
as a single CSV column.
- Each successfully invited person receives an email with a join link valid for 7 days.
- Invites default to the "Member" role; the admin can set the whole batch to "Admin", "Member", or
"Viewer" before sending.
- After sending, the admin sees a per-address result summary (sent / skipped / failed and why).
Known constraints and concerns the team has raised:
- The workspace has a seat limit tied to its plan; a batch can exceed remaining seats.
- A pasted batch can contain duplicates, addresses that are already members, addresses with a
pending invite, malformed addresses, or addresses on a corporate blocklist.
- An admin may paste up to ~500 addresses at once; the email provider throttles large sends.
- Admins later need an audit trail of who invited whom and when.
- The feature is web-based and must be accessible and responsive for large batches.
Explicitly out of scope: SSO/SCIM auto-provisioning, customizing the invite email, and changing roles after the invite is sent.
{
"schema": 1,
"skill": "deliver-acceptance-criteria",
"runs_per_query": 3,
"trigger_threshold": 0.5,
"queries": [
{
"q": "Write acceptance criteria for the upload story",
"expect": "trigger",
"split": "train"
},
{
"q": "Give me Given/When/Then scenarios for the saved-search slice, including error states",
"expect": "trigger",
"split": "train"
},
{
"q": "I need to make sure QA knows exactly when this story counts as done",
"expect": "trigger",
"split": "train",
"notes": "Intent-only phrasing, no artifact keyword"
},
{
"q": "Turn this PRD section on two-factor login into testable pass/fail conditions for engineering handoff",
"expect": "trigger",
"split": "train"
},
{
"q": "Engineering keeps interpreting the coupon story differently; pin down the observable behavior that means it is complete",
"expect": "trigger",
"split": "train",
"notes": "Intent-only phrasing"
},
{
"q": "Add non-functional criteria for performance and accessibility to the checkout story before sprint handoff",
"expect": "trigger",
"split": "train"
},
{
"q": "What are the verifiable done conditions for the story where users export their billing history?",
"expect": "trigger",
"split": "validation"
},
{
"q": "Draft GWT acceptance criteria covering the happy path plus validation failures for the profile editing slice",
"expect": "trigger",
"split": "validation"
},
{
"q": "Our QA lead wants unambiguous scenarios she can pass or fail for the notification preferences work",
"expect": "trigger",
"split": "validation",
"notes": "Intent-only phrasing"
},
{
"q": "Spell out what done means for this feature slice so the contractor team cannot misread it",
"expect": "trigger",
"split": "validation"
},
{
"q": "Break the loyalty program feature into user stories for sprint planning",
"expect": "no-trigger",
"split": "train",
"near_miss_of": "deliver-user-stories",
"notes": "Writing the stories themselves is the partner's job; this skill deepens an existing story"
},
{
"q": "Catalog all the boundary conditions, error states, and recovery paths across the entire import feature",
"expect": "no-trigger",
"split": "train",
"near_miss_of": "deliver-edge-cases",
"notes": "Feature-wide systematic failure coverage; this skill stays story-scoped"
},
{
"q": "We need a systematic sweep of everything that can go wrong in the payments flow before QA writes the test plan",
"expect": "no-trigger",
"split": "validation",
"near_miss_of": "deliver-edge-cases",
"notes": "Whole-feature failure surface, not story-level GWT checks"
},
{
"q": "Define the success metric, sample size, and duration for our pricing A/B test",
"expect": "no-trigger",
"split": "train",
"near_miss_of": "measure-experiment-design",
"notes": "Experiment success metrics, not done-ness for a story"
},
{
"q": "Write the PRD for the referral program so we know what we are building",
"expect": "no-trigger",
"split": "validation",
"near_miss_of": "deliver-prd",
"notes": "No story or slice exists yet to bind criteria to"
},
{
"q": "Create the pre-launch readiness checklist for the mobile release",
"expect": "no-trigger",
"split": "train",
"near_miss_of": "deliver-launch-checklist"
},
{
"q": "Summarize what changed in this release for our customers",
"expect": "no-trigger",
"split": "train",
"near_miss_of": "deliver-release-notes"
},
{
"q": "Help me center a div with CSS grid",
"expect": "no-trigger",
"split": "train",
"notes": "Unrelated engineering ask"
},
{
"q": "Write a SQL query to find duplicate email addresses in the users table",
"expect": "no-trigger",
"split": "validation",
"notes": "Unrelated"
},
{
"q": "Recommend a strength training plan for a beginner",
"expect": "no-trigger",
"split": "validation",
"notes": "Unrelated"
}
]
}
deliver-acceptance-criteria - Version History
| Version | Date | Release | Effort | Type | Summary |
|---|---|---|---|---|---|
| 1.1.0 | 2026-06-10 | v2.26.0 | F-12-batch-1 | minor | Quality convergence: When NOT to Use section (F-12 Batch 1) |
| 1.0.1 | 2026-06-10 | v2.26.0 | F-12-batch-0 | patch | Description rewrite for trigger accuracy (boundary disambiguation; 2026-06-09 audit, v2.26.0 Batch 0) |
| 1.0.0 | 2026-03-22 | - | - | baseline | Prior published version |
1.1.0 (2026-06-10)
Quality-convergence minor (F-12 Batch 1): added a "When NOT to Use" section with boundary pointers to neighboring skills (the Output Contract already enumerated its groupings). No template or example changes.
1.0.1 (2026-06-10)
Description-only patch (F-12 Batch 0, from the 2026-06-09 repo audit): the trigger-surface description was rewritten to disambiguate collision pairs with an explicit boundary pointer to the sibling skill. No body, template, or behavior changes.
1.0.0 (2026-03-22)
Baseline row for the prior published version; see git history for its changes.
Acceptance Criteria: Guest Checkout
This example describes the acceptance criteria for a guest checkout flow that lets shoppers buy items without creating an account.
Story Context
The checkout experience must let a shopper complete an order as a guest, enter shipping and payment details, and receive a confirmation after payment succeeds. The criteria below focus on the behavior a reviewer can observe in the UI and system responses.
Happy Path
AC-1: Guest Checkout Form Loads
Given I have items in my cart and I am not signed in
When I open the checkout page
Then I can enter shipping information, delivery method, and payment details without being prompted to create an account
AC-2: Order Completes Successfully
Given I have entered valid shipping and payment details
When I submit the order
Then I see an order confirmation page with an order number and estimated delivery date
Edge Cases
AC-3: Promo Code Can Be Applied
Given I am on checkout and my cart qualifies for a discount
When I enter a valid promo code and apply it
Then the order summary updates to show the discount before I submit payment
AC-4: Shipping Address Validation Supports International Formats
Given I enter a shipping address for a supported non-US destination
When I continue to the next step
Then the form accepts the address if it matches the country-specific validation rules
Error States
AC-5: Invalid Card Is Rejected
Given I have entered shipping information but the payment card is invalid
When I attempt to place the order
Then I see a clear inline error message and the order is not created
AC-6: Inventory Changes During Checkout
Given an item in my cart becomes out of stock before I submit payment
When I place the order
Then I am shown which item failed, my cart remains available, and I can remove the item or choose a different variant
Non-Functional Criteria
AC-7: Checkout Responds Within the Performance Budget
Given I submit a valid order during normal operating conditions
When the checkout request is processed
Then the confirmation response is returned within 3 seconds for at least 95 percent of requests
AC-8: Checkout Errors Are Accessible
Given a validation or payment error occurs
When the error message is shown
Then the message is announced by screen readers and the field with the error receives focus when applicable
Notes
- Payment processor and inventory service availability are external dependencies.
- Fraud review and manual review flows are out of scope for this example.
Acceptance Criteria: [Feature or Story Title]
Story Context
<!-- Briefly restate the story, feature slice, or PRD section this criteria set supports. -->
[Describe the user need, scope boundary, and any assumptions that matter for testing.]
Happy Path
<!-- Capture the primary success flow first. Each criterion should be independently testable. -->
AC-1: [Happy Path Title]
Given [initial context or precondition]
When [user action or trigger]
Then [expected observable outcome]
AC-2: [Happy Path Title]
Given [initial context or precondition]
When [user action or trigger]
Then [expected observable outcome]
Edge Cases
<!-- Document boundary conditions and alternate inputs that should still behave correctly. -->
AC-3: [Edge Case Title]
Given [boundary condition or alternate state]
When [user action or trigger]
Then [expected observable outcome]
Error States
<!-- Describe failures, validation issues, and dependency problems with recovery behavior. -->
AC-4: [Error State Title]
Given [failure condition]
When [user action or trigger]
Then [expected observable outcome and recovery path]
Non-Functional Criteria
<!-- Capture performance, accessibility, security, reliability, or audit requirements. -->
AC-5: [Non-Functional Title]
Given [relevant system or user context]
When [measurement or action]
Then [expected measurable constraint or guarantee]
Notes
- [Assumption or dependency]
- [Open question if the source story is incomplete]
Related skills
How it compares
Use deliver-acceptance-criteria after deliver-user-stories when stories exist but need independently testable scenarios beyond high-level requirements.
FAQ
What format does deliver-acceptance-criteria use?
deliver-acceptance-criteria writes each criterion as an observable Given/When/Then scenario, grouped into happy path, edge cases, error states, and non-functional sections. Output follows the pm-skills references/TEMPLATE.md contract for engineering and QA handoff.
When should deliver-acceptance-criteria run in pm-skills?
deliver-acceptance-criteria runs in the Deliver phase after a user story, PRD section, or feature slice is defined—typically during sprint planning when the team needs clear pass/fail conditions engineers and QA can verify without guessing intent.
How does deliver-acceptance-criteria handle failure scenarios?
deliver-acceptance-criteria explicitly covers recovery and failure behavior—what users see when validation fails, dependencies are unavailable, or save actions cannot complete—separate from happy-path criteria so error handling is testable before implementation.