agentleFS
Happy-Technologies-LLCHappy-Technologies-LLC/happy-platform-skills/skills/spm/acceptance-criteria/SKILL.md

acceptance-criteria

Skill41 starsChanged 20 days agoApache-2.0View on GitHub

Generate comprehensive acceptance criteria for user stories and features using Given/When/Then format covering functional requirements, edge cases, and testable conditions

18 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

9 rules. 0 are common, 6 are distinctive, and 3 are very specific to this project.

  • 0

    Common

    Most of the 14 edited versions we read keep these.

  • 6

    Distinctive

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    When to use: When product owners or scrum masters need to define clear, testable acceptance criteria before sprint planning or story …

    line 39
  2. Very specific:

    Access: Read/write access to rm_story, rm_epic tables

    line 45
  3. Distinctive:

    If you only have the story number, search first:

    line 63
  4. Distinctive:

    Write the finalized acceptance criteria back to the story.

    line 191
  5. Distinctive:

    Start with the Happy Path: Always define the primary success scenario first, then add error and edge cases

    line 294
  6. Distinctive:

    Include Negative Tests: Always define what happens with invalid input, unauthorized access, and system errors

    line 298
  7. Distinctive:

    Cover Boundary Conditions: Test limits such as empty inputs, maximum lengths, zero quantities, and date boundaries

    line 299
  8. Very specific:

    Solution: Verify your role includes write access to rm_story.acceptance_criteria.

    line 318
  9. Very specific:

    Solution: Check the field length in the dictionary (sys_dictionary).

    line 323

“Common” is measured: kept by at least 6 in 10 of the 14 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Acceptance Criteria Generation

Overview

This skill provides a structured approach to generating comprehensive acceptance criteria for user stories and features in ServiceNow's Agile Development 2.0 module. It covers:

  • Writing acceptance criteria in Given/When/Then (Gherkin) format
  • Covering happy path, alternative flows, and edge cases
  • Addressing functional requirements, validation rules, and error handling
  • Defining performance thresholds and security constraints
  • Linking criteria to testable conditions for QA readiness
  • Updating story records with well-formed acceptance criteria

When to use: When product owners or scrum masters need to define clear, testable acceptance criteria before sprint planning or story refinement sessions in ServiceNow SPM.

Prerequisites

  • Plugins: com.snc.sdlc.agile.2.0 (Agile Development 2.0)
  • Roles: scrum_user, scrum_master, or scrum_admin
  • Access: Read/write access to rm_story, rm_epic tables
  • Knowledge: Understanding of the story's functional requirements and user personas

Procedure

Step 1: Retrieve the User Story

Fetch the story record to understand the requirement before writing acceptance criteria.

Using MCP (Claude Code/Desktop):

Tool: SN-Get-Record
Parameters:
  table_name: rm_story
  sys_id: [story_sys_id]
  fields: sys_id,number,short_description,description,acceptance_criteria,story_points,epic,sprint,state,priority,classification,product,assigned_to

If you only have the story number, search first:

Using MCP:

Tool: SN-Query-Table
Parameters:
  table_name: rm_story
  query: number=STY0010001
  fields: sys_id,number,short_description,description,acceptance_criteria,story_points,epic,sprint,state,priority,classification
  limit: 1

Using REST API:

GET /api/now/table/rm_story?sysparm_query=number=STY0010001&sysparm_fields=sys_id,number,short_description,description,acceptance_criteria,story_points,epic,sprint,state,priority,classification&sysparm_limit=1&sysparm_display_value=true

Step 2: Gather Context from the Parent Epic

Understanding the broader feature context helps write more complete acceptance criteria.

Using MCP:

Tool: SN-Query-Table
Parameters:
  table_name: rm_epic
  query: sys_id=[epic_sys_id]
  fields: sys_id,number,short_description,description,state,priority,acceptance_criteria
  limit: 1

Using REST API:

GET /api/now/table/rm_epic/[epic_sys_id]?sysparm_fields=sys_id,number,short_description,description,state,priority,acceptance_criteria&sysparm_display_value=true

Step 3: Review Related Stories for Consistency

Query sibling stories under the same epic to ensure criteria are consistent and avoid duplication.

Using MCP:

Tool: SN-Query-Table
Parameters:
  table_name: rm_story
  query: epic=[epic_sys_id]^sys_id!=[story_sys_id]^ORDERBYpriority
  fields: number,short_description,acceptance_criteria,state,story_points
  limit: 20

Using REST API:

GET /api/now/table/rm_story?sysparm_query=epic=[epic_sys_id]^sys_id!=[story_sys_id]^ORDERBYpriority&sysparm_fields=number,short_description,acceptance_criteria,state,story_points&sysparm_limit=20&sysparm_display_value=true

Step 4: Generate Acceptance Criteria

Structure the acceptance criteria using these categories:

Category 1: Happy Path (Required) The primary success scenario that the story describes.

Scenario: Successful [action]
  Given [precondition describing the initial state]
  And [additional precondition if needed]
  When [action the user performs]
  And [additional action if needed]
  Then [expected observable outcome]
  And [additional outcome or side effect]

Category 2: Alternative Flows (Required) Valid but non-default paths through the feature.

Scenario: [Action] with [variation]
  Given [precondition with variation]
  When [action with different input or context]
  Then [expected outcome for this variation]

Category 3: Error Handling (Required) How the system responds to invalid input or failure conditions.

Scenario: [Action] with invalid [input/state]
  Given [precondition]
  When [action with invalid data]
  Then [error message or validation feedback]
  And [system state remains unchanged]

Category 4: Edge Cases (Recommended) Boundary conditions, empty states, and extremes.

Scenario: [Action] at boundary condition
  Given [boundary precondition]
  When [action at limit]
  Then [expected behavior at boundary]

Category 5: Performance and Security (As Applicable) Non-functional requirements that must be testable.

Scenario: [Action] performance requirement
  Given [load or data volume condition]
  When [action is performed]
  Then [response time or throughput requirement is met]

Step 5: Validate Criteria Quality

Review each criterion against the quality checklist:

Quality CheckDescriptionPass Criteria
TestableCan be verified with a clear pass/failNo ambiguous terms like "quickly" or "user-friendly"
IndependentEach scenario stands on its ownNo dependencies between scenarios
SpecificContains concrete valuesUses exact numbers, messages, states
CompleteCovers all requirement aspectsHappy path + errors + edge cases
ConciseNo redundant scenariosEach scenario tests a unique condition
ConsistentMatches story scopeDoes not exceed or fall short of the story

Step 6: Update the Story Record

Write the finalized acceptance criteria back to the story.

Using MCP:

Tool: SN-Update-Record
Parameters:
  table_name: rm_story
  sys_id: [story_sys_id]
  fields:
    acceptance_criteria: |
      Scenario: Successful customer search by phone number
        Given I am logged in as a customer service representative
        And I am on the customer search screen
        When I enter a complete phone number "555-0123" in the search field
        And I click the Search button
        Then matching customer records are displayed within 2 seconds
        And results show customer name, account number, and account status
        And results are sorted by relevance with exact matches first

      Scenario: Partial phone number search
        Given I am logged in as a customer service representative
        When I enter a partial phone number "555" in the search field
        And I click the Search button
        Then all customers with phone numbers containing "555" are displayed
        And a maximum of 50 results are shown with pagination

      Scenario: No matching results
        Given I am logged in as a customer service representative
        When I enter a phone number with no matching records
        And I click the Search button
        Then a message "No customers found matching the provided phone number" is displayed
        And the search field retains the entered value

      Scenario: Invalid phone number format
        Given I am logged in as a customer service representative
        When I enter non-numeric characters "abc-defg" in the phone search field
        And I click the Search button
        Then a validation message "Please enter a valid phone number" is displayed
        And no search query is executed

      Scenario: Empty search field submission
        Given I am logged in as a customer service representative
        When I click the Search button without entering a phone number
        Then a validation message "Phone number is required" is displayed

      Scenario: Search performance under load
        Given the customer database contains over 1 million records
        When I search for a phone number
        Then results are returned within 3 seconds

Using REST API:

PATCH /api/now/table/rm_story/[story_sys_id]
Content-Type: application/json

{
  "acceptance_criteria": "Scenario: Successful customer search by phone number\n  Given I am logged in as a customer service representative\n  And I am on the customer search screen\n  When I enter a complete phone number \"555-0123\" in the search field\n  And I click the Search button\n  Then matching customer records are displayed within 2 seconds\n  And results show customer name, account number, and account status\n\nScenario: No matching results\n  Given I am logged in as a customer service representative\n  When I enter a phone number with no matching records\n  Then a message \"No customers found\" is displayed"
}

Step 7: Bulk Update Stories Missing Acceptance Criteria

Find stories in the backlog that lack acceptance criteria and need refinement.

Using MCP:

Tool: SN-Query-Table
Parameters:
  table_name: rm_story
  query: epic=[epic_sys_id]^acceptance_criteriaISEMPTY^state=-6
  fields: sys_id,number,short_description,description,story_points,priority
  limit: 25

Using REST API:

GET /api/now/table/rm_story?sysparm_query=epic=[epic_sys_id]^acceptance_criteriaISEMPTY^state=-6&sysparm_fields=sys_id,number,short_description,description,story_points,priority&sysparm_limit=25&sysparm_display_value=true

Tool Usage

MCP Tools Reference

ToolWhen to Use
SN-Get-RecordRetrieve a single story or epic by sys_id
SN-Query-TableQuery stories, epics, and related records
SN-Update-RecordWrite acceptance criteria back to the story
SN-Natural-Language-SearchNatural language search for stories needing criteria

REST API Reference

EndpointMethodPurpose
/api/now/table/rm_storyGETQuery stories and retrieve acceptance criteria
/api/now/table/rm_story/{sys_id}GETRead a specific story record
/api/now/table/rm_story/{sys_id}PATCHUpdate acceptance criteria on a story
/api/now/table/rm_epicGETGet epic context for writing criteria
/api/now/table/rm_epic/{sys_id}GETRead specific epic details

Best Practices

  • Start with the Happy Path: Always define the primary success scenario first, then add error and edge cases
  • Use Concrete Values: Replace vague terms with specific numbers, messages, and states (e.g., "within 2 seconds" not "quickly")
  • One Behavior Per Scenario: Each Given/When/Then block should test exactly one behavior or condition
  • Avoid Implementation Details: Criteria describe what the system does, not how it is built internally
  • Include Negative Tests: Always define what happens with invalid input, unauthorized access, and system errors
  • Cover Boundary Conditions: Test limits such as empty inputs, maximum lengths, zero quantities, and date boundaries
  • Match Story Scope: Criteria should not exceed the story's boundary; if they do, the story may need splitting
  • Review with the Team: Acceptance criteria should be agreed upon by the product owner, developer, and tester

Troubleshooting

"Acceptance criteria too vague for testing"

Cause: Using subjective language like "user-friendly," "fast," or "intuitive" Solution: Replace with measurable terms: "loads within 2 seconds," "displays validation message," "shows 10 results per page"

"Story has acceptance criteria but keeps failing QA"

Cause: Criteria may be missing edge cases or error handling scenarios Solution: Review criteria against the five categories (happy path, alternatives, errors, edge cases, performance) and add missing scenarios

"Cannot update acceptance_criteria field"

Cause: Field-level ACL restriction or the story is in a locked state (e.g., Closed) Solution: Verify your role includes write access to rm_story.acceptance_criteria. Stories in Closed state (state=7) cannot be edited without reopening.

"Acceptance criteria is truncated after save"

Cause: The acceptance_criteria field may have a character limit Solution: Check the field length in the dictionary (sys_dictionary). The default is 4000 characters. For longer criteria, use the description field or attach a document.

Examples

Example 1: Login Feature Acceptance Criteria

Story: "As a registered user, I want to log in with my email and password so that I can access my dashboard"

Generated Acceptance Criteria:

Scenario: Successful login with valid credentials
  Given I am on the login page
  And I have a registered account with email "user@example.com"
  When I enter my email "user@example.com" and correct password
  And I click the "Sign In" button
  Then I am redirected to my dashboard
  And my display name appears in the top navigation
  And my last login timestamp is updated

Scenario: Login with incorrect password
  Given I am on the login page
  When I enter my email "user@example.com" and an incorrect password
  And I click the "Sign In" button
  Then an error message "Invalid email or password" is displayed
  And no indication is given whether the email or password was wrong
  And the failed attempt is logged for security auditing

Scenario: Login with unregistered email
  Given I am on the login page
  When I enter an unregistered email "unknown@example.com"
  And I click the "Sign In" button
  Then an error message "Invalid email or password" is displayed

Scenario: Account locked after failed attempts
  Given I have failed login 5 times consecutively
  When I attempt to log in a 6th time
  Then my account is temporarily locked for 30 minutes
  And a message "Account locked. Try again in 30 minutes." is displayed
  And a security notification email is sent to my registered address

Scenario: Login with empty fields
  Given I am on the login page
  When I click "Sign In" without entering email or password
  Then validation messages appear for both required fields
  And no authentication request is sent

Scenario: Session timeout after inactivity
  Given I am logged in
  When I am inactive for 30 minutes
  Then my session expires
  And I am redirected to the login page with message "Session expired"

Example 2: Bulk Criteria Generation for Sprint Backlog

Scenario: Generate acceptance criteria for all stories in an upcoming sprint that lack them.

Step 1 - Find stories without criteria:

Tool: SN-Query-Table
Parameters:
  table_name: rm_story
  query: sprint=[sprint_sys_id]^acceptance_criteriaISEMPTY
  fields: sys_id,number,short_description,description,story_points
  limit: 30

Step 2 - For each story, generate and update:

Tool: SN-Update-Record
Parameters:
  table_name: rm_story
  sys_id: [story_sys_id]
  fields:
    acceptance_criteria: |
      Scenario: [Primary success scenario]
        Given [precondition]
        When [user action]
        Then [expected result]

      Scenario: [Error handling scenario]
        Given [precondition]
        When [invalid action]
        Then [error feedback]

Output Summary:

ACCEPTANCE CRITERIA GENERATION REPORT
Sprint: Sprint 2026-04-A
Stories Updated: 8 of 8

STY0010101 - Add to cart (3 scenarios: happy path, out of stock, max quantity)
STY0010102 - Remove from cart (3 scenarios: single item, last item, undo)
STY0010103 - Update quantity (4 scenarios: increase, decrease, zero, max)
STY0010104 - Apply coupon code (4 scenarios: valid, expired, invalid, stacking)
STY0010105 - View cart total (3 scenarios: with tax, empty cart, multi-currency)
STY0010106 - Save cart for later (3 scenarios: save, restore, expiration)
STY0010107 - Share cart via link (3 scenarios: generate link, access, expired link)
STY0010108 - Cart item availability check (3 scenarios: in stock, limited, unavailable)

Total Scenarios: 26
Stories Ready for Sprint Planning: 8/8

Related Skills

  • spm/agile-story-generation - Generate user stories from requirements
  • spm/project-insights - Track project health and velocity metrics
  • spm/planning-summarization - Summarize sprint and release planning
  • development/automated-testing - Generate automated test cases from acceptance criteria
  • development/business-rules - Implement validation rules referenced in criteria

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.