| name | Create Jira Story |
| description | Implementation guide for creating well-formed Jira user stories with acceptance criteria in SRVKP project |
Create Jira Story
This skill provides implementation guidance for creating well-structured Jira user stories following agile best practices, including proper user story format and comprehensive acceptance criteria for the SRVKP project.
When to Use This Skill
This skill is automatically invoked by the /jira:create story command to guide the story creation process.
Prerequisites
- MCP Jira server configured and accessible, or
acli installed and authenticated
- User has permissions to create issues in SRVKP project
- Understanding of the user story and acceptance criteria to be created
Shared conventions (safety rules, component table, confirmation flow, MCPโCLI fallback):
โ Read and follow ../_common.md before proceeding.
CLI reference: ../reference/cli-fallback.md
Project: SRVKP Only
This skill is exclusively for SRVKP (OpenShift Pipelines project).
Component auto-suggestion keywords and the full component list are in ../_common.md.
PHASE 0A: DUPLICATE DETECTION
Before collecting story details, search for similar existing stories to prevent duplicates.
Keyword Extraction
Extract significant keywords from story summary (ignores common words like "the", "and", "in", "for", "to", "add", "create", "enable").
Example:
Input: "Sign all Image Manifests in Image Index recursively"
Keywords: ["sign", "image", "manifest", "index", "recursive"]
Search SRVKP for Similar Stories
Use JQL to search for stories containing keywords:
acli jira workitem search \
--jql 'project = SRVKP AND issuetype = Story AND (summary ~ keyword1 OR ...)' \
--fields "key,summary,status"
Duplicate Threshold
Flag as potential duplicate if 3 or more keywords match.
User Prompt
Found similar stories in SRVKP:
1. SRVKP-11302: Avoid signing PipelineRun/TaskRun running in Spoke
Matched: signing, chains (2/5 keywords)
Status: To Do
2. SRVKP-9408: Chains - Improve code coverage for storage package
Matched: chains, storage (2/5 keywords)
Status: Closed
Options:
- Type '1' or '2': View that story and stop creation
- Type 'none': Proceed with creating new story
If user views existing story, do NOT create new one.
PHASE 0B: PARENT EPIC DISCOVERY
Search for appropriate parent Epic using keywords.
Search for Related Epics
acli jira workitem search \
--jql 'project = SRVKP AND issuetype = Epic AND (summary ~ chains OR ...)' \
--fields "key,summary,status"
User Prompt
Searching for parent Epics for this story...
Found potential parent Epics:
1. SRVKP-11633: Recursive Image Manifest signing in Tekton Chains
Status: New
2. SRVKP-11142: Promote SLSAv1.0 offering of Chains format to beta
Status: New
Link this story to a parent Epic?
- Type '1' or '2': Select this Epic as parent
- Type 'none': Create standalone story (no parent)
Important: Stories can be created without a parent Epic. The 'none' option is always valid.
โ ๏ธ Summary vs Description: CRITICAL DISTINCTION
This is the #1 mistake when creating stories. The summary field and description field serve different purposes:
Summary Field (Issue Title)
- SHORT, concise title (5-10 words maximum)
- Action-oriented, describes WHAT will be done
- Does NOT contain the full "As a... I want... So that..." format
- Think of it as a newspaper headline
Good summary examples:
- โ
"Enable ImageTagMirrorSet configuration in HostedCluster CRs"
- โ
"Add automatic node pool scaling for ROSA HCP"
- โ
"Implement webhook validation for HostedCluster resources"
Bad summary examples:
- โ "As a cluster admin, I want to configure ImageTagMirrorSet in HostedCluster CRs so that I can enable tag-based image proxying" (Full user story - belongs in description!)
- โ "As a developer, I want to view metrics so that I can debug issues" (User story format - belongs in description!)
Description Field (Issue Body)
- Contains the FULL user story format: "As a... I want... So that..."
- Includes acceptance criteria
- Includes additional context
- Can be lengthy and detailed
Correct usage:
Summary: "Enable ImageTagMirrorSet configuration in HostedCluster CRs"
Description:
As a cluster admin, I want to configure ImageTagMirrorSet in HostedCluster CRs,
so that I can enable tag-based image proxying for my workloads.
Acceptance Criteria:
- Test that ImageTagMirrorSet can be specified...
When Collecting Story Information
- First collect the full user story (As a... I want... So that...)
- Then extract/generate a concise summary title from that story
- Present both to user for confirmation
- Summary goes in
summary parameter, full story goes in description
User Story Best Practices
What is a User Story?
A user story:
- Describes product functionality from a customer's perspective
- Is a collaboration tool - a reminder to have a conversation
- Shifts focus from writing documentation to talking with stakeholders
- Describes concrete business scenarios in shared language
- Is the right size for planning - level of detail based on implementation horizon
The 3 Cs of User Stories
Every user story should have three components:
- Card - The story itself (As a... I want... So that...)
- Conversation - Discussion between team and stakeholders about implementation
- Confirmation - Acceptance criteria that define "done"
User Story Template
Standard Format
As a <User/Who>, I want to <Action/What>, so that <Purpose/Why>.
Components:
-
Who (User/Role): The person, device, or system that will benefit from or use the output
- Examples: "cluster admin", "developer", "end user", "monitoring system", "CI pipeline"
-
What (Action): What they can do with the system
- Examples: "configure automatic scaling", "view cluster metrics", "deploy applications"
-
Why (Purpose): Why they want to do the activity, the value they gain
- Examples: "to handle traffic spikes", "to identify performance issues", "to reduce deployment time"
Good Examples
As a cluster admin, I want to configure automatic node pool scaling based on CPU utilization, so that I can handle traffic spikes without manual intervention.
As a developer, I want to view real-time cluster metrics in the web console, so that I can quickly identify performance issues before they impact users.
As an SRE, I want to set up alerting rules for control plane health, so that I can be notified immediately when issues occur.
Bad Examples (and why)
โ "Add scaling feature"
- Why bad: No user, no value statement, too vague
โ "As a user, I want better performance"
- Why bad: Not actionable, no specific action, unclear benefit
โ "Implement autoscaling API"
- Why bad: Technical task, not user-facing value
โ
Convert to: "As a cluster admin, I want to configure autoscaling policies via the API, so that I can automate cluster capacity management"
Acceptance Criteria
Acceptance criteria:
- Express conditions that need to be satisfied for the customer
- Provide context and details for the team
- Help the team know when they are done
- Provide testing point of view
- Are written by Product Owner or dev team members
- Are refined during backlog grooming and iteration planning
Formats for Acceptance Criteria
Choose the format that best fits the story:
Format 1: Test-Based
- Test that <criteria>
Example:
- Test that node pools scale up when CPU exceeds 80%
- Test that node pools scale down when CPU drops below 30%
- Test that scaling respects configured min/max node limits
Format 2: Demonstration-Based
- Demonstrate that <this happens>
Example:
- Demonstrate that scaling policies can be configured via CLI
- Demonstrate that scaling events appear in the audit log
- Demonstrate that users receive notifications when scaling occurs
Format 3: Verification-Based
- Verify that when <a role> does <some action> they get <this result>
Example:
- Verify that when a cluster admin sets max nodes to 10, the node pool never exceeds 10 nodes
- Verify that when scaling is disabled, node count remains constant regardless of load
Format 4: Given-When-Then (BDD)
- Given <a context> when <this event occurs> then <this happens>
Example:
- Given CPU utilization is at 85%, when the scaling policy is active, then a new node is provisioned within 2 minutes
- Given the node pool is at maximum capacity, when scaling is triggered, then an alert is raised and no nodes are added
How Much Acceptance Criteria is Enough?
You have enough AC when:
- โ
You have enough to size/estimate the story
- โ
The testing approach is clear but not convoluted
- โ
You've made 2-3 revisions of the criteria
- โ
The story is independently testable
If you need more AC:
- Consider splitting the story into multiple smaller stories
- Each story should be completable in one sprint
If AC is too detailed:
- Move implementation details to subtasks or technical design docs
- Keep AC focused on user-observable behavior
Interactive Story Collection Workflow
When creating a story, guide the user through the process:
1. Collect User Story Statement
Prompt: "Let's create the user story. I can help you format it properly."
Ask three questions:
-
Who benefits?
Who is the user or role that will benefit from this feature?
Examples: cluster admin, developer, SRE, end user, system administrator
-
What action?
What do they want to be able to do?
Examples: configure autoscaling, view metrics, set up alerts
-
What value/why?
Why do they want this? What value does it provide?
Examples: to handle traffic spikes, to improve visibility, to reduce downtime
Construct the story:
As a <answer1>, I want to <answer2>, so that <answer3>.
Present to user and ask for confirmation:
Here's the user story:
As a cluster admin, I want to configure automatic node pool scaling, so that I can handle traffic spikes without manual intervention.
Does this look correct? (yes/no/modify)
2. Collect Acceptance Criteria
Prompt: "Now let's define the acceptance criteria. These help the team know when the story is complete."
Approach 1: Guided Questions
Ask probing questions:
1. What are the key behaviors that must work?
2. What are the edge cases or boundaries?
3. How will this be tested?
4. What shouldn't happen?
Approach 2: Template Assistance
Offer format templates:
Which format would you like to use for acceptance criteria?
1. Test that... (test-based)
2. Verify that when... they get... (verification-based)
3. Given... when... then... (BDD)
4. I'll write them in my own format
Approach 3: Free-Form
Please provide the acceptance criteria (one per line, or I can help you structure them):
Validate AC:
- At least 2-3 criteria provided
- Criteria are specific and testable
- Criteria cover happy path and edge cases
- Criteria are user-observable (not implementation details)
3. Collect Additional Context (Optional)
Prompt: "Any additional context for the team? (Optional)"
Helpful additions:
- Background: Why is this needed now?
- Dependencies: What must exist before this can be done?
- Constraints: Any technical or business constraints?
- Out of scope: What is explicitly not included?
- References: Links to designs, docs, related issues
Example:
Additional Context:
- This builds on the existing monitoring infrastructure introduced in PROJ-100
- Must integrate with Prometheus metrics
- Out of scope: Custom metrics (will be separate story)
- Design doc: https://docs.example.com/autoscaling-design
Story Sizing and Splitting
Right-Sized Stories
A well-sized story:
- Can be completed in one sprint (typically 1-2 weeks)
- Can be demonstrated as working software
- Delivers incremental value
- Has clear acceptance criteria
When to Split Stories
Split a story if:
- It would take more than one sprint
- It has too many acceptance criteria (>7-8)
- It contains multiple distinct features
- It has hard dependencies that could be separate
- Testing becomes too complex
Splitting Techniques
By workflow steps:
Original: As a user, I want to manage my account settings
Split:
- As a user, I want to view my account settings
- As a user, I want to update my account settings
- As a user, I want to delete my account
By acceptance criteria:
Original: Complex story with 10 AC
Split:
- Story 1: AC 1-4 (core functionality)
- Story 2: AC 5-7 (edge cases)
- Story 3: AC 8-10 (advanced features)
By platform/component:
Original: Add feature to all platforms
Split:
- Add feature to web interface
- Add feature to CLI
- Add feature to API
Field Validation
Before submitting the story, validate:
Required Fields
- โ
Summary is concise title (5-10 words), NOT full user story (see "Summary vs Description" section above)
- โ
Description contains full user story in "As a... I want... So that..." format
- โ
Acceptance criteria are present (at least 2)
- โ
Component is specified (if required by project)
- โ
Target version is set (if required by project)
Story Quality
- โ
Story describes user-facing value (not implementation)
- โ
Acceptance criteria are testable
- โ
Acceptance criteria are specific (not vague)
- โ
Story is sized appropriately (can fit in one sprint)
Security
- โ
No credentials, API keys, or secrets in any field
- โ
No sensitive customer data in examples
Creation Strategy: MCP First, CLI Fallback
Follow the MCP โ CLI Fallback Decision Tree in ../_common.md.
CLI Story Creation
Basic story creation:
acli jira workitem create \
--project "SRVKP" \
--type "Story" \
--summary "Enable task result caching" \
--description "$(cat <<'EOF'
As a pipeline developer, I want to cache task results, so that I can reduce build time.
h2. Acceptance Criteria
* Test that tasks can opt-in to caching
* Test that cache key is computed correctly
* Verify that cached results are restored
EOF
)" \
--label "ai-generated-jira" \
--json
Story with parent epic:
acli jira workitem create \
--project "SRVKP" \
--type "Story" \
--summary "Enable task result caching" \
--description "$(cat <<'EOF'
As a pipeline developer, I want to cache task results, so that I can reduce build time.
h2. Acceptance Criteria
* Test that tasks can opt-in to caching
* Test that cache key is computed correctly
EOF
)" \
--parent "SRVKP-11633" \
--label "ai-generated-jira" \
--json
Note: Use $(cat <<'EOF' ... EOF) for inline multi-line descriptions. No temp files needed.
SRVKP Story with Parent Epic
Full example:
acli jira workitem create \
--project "SRVKP" \
--type "Story" \
--summary "Enable task result caching for faster pipeline execution" \
--description "$(cat <<'EOF'
As a pipeline developer, I want to cache task results based on input parameters and source code changes, so that I can skip re-executing tasks when inputs haven't changed, reducing build time and costs.
h2. Acceptance Criteria
* Tasks can opt-in to caching by adding cache annotations
* Cache key is computed from task inputs, parameters, and workspace content hashes
* Cached results are restored when cache key matches
* Cache hit shows "Skipped (cache hit)" in TaskRun status
* Users can configure cache retention policy (default 7 days)
* Cache works across different PipelineRuns
* Cache misses fall back to normal task execution
h2. Additional Context
This builds on the Tekton Cache component. Must integrate with existing workspace mechanisms. Target: Pipelines 1.16
Out of scope: Workspace content caching (will be separate story)
EOF
)" \
--parent "SRVKP-9000" \
--label "ai-generated-jira" \
--json
With Parent Epic Link
When linking a story to a parent epic, use the --parent flag:
acli jira workitem create \
--project "SRVKP" \
--type "Story" \
--summary "Add cache metrics to pipeline results API" \
--description "$(cat <<'EOF'
As a DevOps engineer, I want to view cache hit/miss metrics in the pipeline results, so that I can optimize caching strategies.
h2. Acceptance Criteria
* Cache metrics appear in TaskRun status
* Metrics show hit rate percentage
* Historical cache data is queryable
EOF
)" \
--parent "SRVKP-11633" \
--label "ai-generated-jira" \
--json
Important:
- Use
--parent flag with the parent Epic key (e.g., "SRVKP-11633")
- Do NOT use custom fields like
customfield_12311140 for epic linking
- Stories can be created without a parent (omit
--parent flag)
- Use
$(cat <<'EOF' ... EOF) for inline descriptions (no temp files)
Jira Description Formatting
Use Jira's native formatting (Wiki markup):
Story Template Format
As a <user>, I want to <action>, so that <value>.
h2. Acceptance Criteria
* Test that <criteria 1>
* Verify that <criteria 2>
* Given <context> when <event> then <outcome>
h2. Additional Context
<optional context>
h3. Dependencies
* [PROJ-123] - Parent epic or related story
h3. Out of Scope
* Feature X (will be separate story)
* Platform Y support (future release)
Use Jira wiki markup in descriptions (for example h2. headings and * lists) as needed.
Error Handling
Invalid Story Format
Scenario: User provides a story that doesn't follow the template.
Action:
- Identify the issue (missing "Who", "What", or "Why")
- Explain the user story format
- Ask questions to extract missing components
- Reconstruct the story properly
Example:
The story "Add autoscaling" doesn't follow the user story format.
Let me help you structure it:
- Who will use this feature? (e.g., cluster admin, developer)
- What do they want to do? (e.g., configure autoscaling)
- Why do they want it? (e.g., to handle traffic spikes)
Missing Acceptance Criteria
Scenario: User doesn't provide acceptance criteria.
Action:
- Explain importance of AC
- Offer to help create them
- Ask probing questions about expected behavior
- Suggest format that fits the story
Example:
Acceptance criteria help define when this story is complete. Let's add some.
What are the key behaviors that must work for this story?
For example:
- What actions should users be able to perform?
- What should happen in edge cases?
- How will you know the feature works correctly?
Story Too Large
Scenario: Story has too many acceptance criteria or sounds too complex.
Action:
- Suggest the story might be too large for one sprint
- Identify potential split points
- Offer to create multiple stories
- Create parent epic if multiple related stories
Example:
This story has 12 acceptance criteria, which suggests it might be too large for one sprint.
I can help split this into smaller stories:
1. Core functionality (AC 1-4)
2. Advanced features (AC 5-8)
3. Edge cases and validation (AC 9-12)
Would you like me to create these as separate stories under an epic?
Vague Acceptance Criteria
Scenario: AC is too vague or not testable.
Action:
- Identify vague criteria
- Ask for specifics
- Suggest more concrete phrasing
Example:
This acceptance criteria is a bit vague: "Test that it works well"
Can you be more specific? For example:
- What does "works well" mean? (fast response time? handles errors?)
- How would you test this? (what specific behavior would you verify?)
Suggested revision: "Verify that API response time is under 100ms for 95% of requests"
Security Validation Failure
Scenario: Sensitive data detected in story content.
Action:
- STOP submission
- Inform user what type of data was detected
- Ask for redaction or placeholder values
Example:
I detected what appears to be API credentials in the acceptance criteria.
Please use placeholder values like "YOUR_API_KEY" instead of real credentials.
MCP Tool Error
Scenario: MCP tool returns an error when creating the story.
Action:
- Parse error message
- Provide user-friendly explanation
- Suggest corrective action
- Offer to retry
Common errors:
- "Field 'parent' does not exist" โ Remove parent link or verify epic exists
- "Invalid issue type" โ Verify project supports "Story" issue type
- "Component not found" โ List available components, ask user to select
Examples
Example 1: Interactive Story Creation
Input:
/jira:create story "Add pipeline execution dashboard to Tekton UI"
Conversation:
Let's create the user story. I'll ask a few questions:
Who is the user or role that will benefit from this feature?
> Pipeline operators and developers
What do they want to be able to do?
> View a dashboard showing active pipeline executions with real-time status updates
Why do they want this? What value does it provide?
> To quickly monitor running pipelines and identify failures without checking individual PipelineRun resources
Great! Here's the user story:
As a pipeline operator, I want to view a dashboard showing active pipeline executions with real-time status updates, so that I can quickly monitor running pipelines and identify failures without checking individual PipelineRun resources.
Does this look correct?
> Yes
Now let's define acceptance criteria. What are the key behaviors that must work?
> 1. Dashboard shows all running PipelineRuns
> 2. Real-time updates when status changes
> 3. Color-coded status indicators (running, succeeded, failed)
> 4. Users can filter by namespace and pipeline name
Excellent. I'll format these as test-based criteria:
* Test that dashboard displays all running PipelineRuns across namespaces
* Test that dashboard updates in real-time when PipelineRun status changes
* Verify that status is shown with color-coded indicators (green/yellow/red)
* Verify that users can filter PipelineRuns by namespace and pipeline name
Any additional context?
> This builds on the existing Tekton UI. Must integrate with Results API for historical data.
Perfect! Creating the story now...
Result:
Created: SRVKP-12345
Title: Add pipeline execution dashboard to Tekton UI
Component: UI
URL: https://issues.redhat.com/browse/SRVKP-12345
Example 2: Story with Auto-Detection
Input:
/jira:create story "Enable webhook retry logic for failed trigger events"
Auto-applied:
- Project: SRVKP
- Component: Tekton Triggers (detected from "webhook", "trigger")
- Labels: ai-generated-jira
Interactive prompts:
- User story format (Who/What/Why)
- Acceptance criteria
Result:
- Full story created with SRVKP conventions
Example 3: Story with Parent Epic
Input:
/jira:create story "Add cache metrics to Results API" --parent SRVKP-9000
Implementation:
- Pre-validate that SRVKP-9000 exists and is an Epic
- Create story with Epic Link field:
additional_fields={
"customfield_12311140": "SRVKP-9000",
"labels": ["ai-generated-jira"]
}
- If creation fails, use fallback: create without link, then update to add link
Result:
- Story created in SRVKP
- Linked to epic SRVKP-9000 via Epic Link field
- All standard fields applied
See: /jira:create command documentation for complete parent linking implementation strategy
Example 4: SRVKP Project Story
Input:
/jira:create story "Enable task result caching for faster pipeline execution"
Interactive prompts:
Who is the user or role that will benefit from this feature?
> Pipeline developers and CI/CD engineers
What do they want to be able to do?
> Cache task results to avoid re-executing unchanged tasks in subsequent pipeline runs
Why do they want this? What value does it provide?
> To significantly reduce pipeline execution time and resource consumption for incremental builds
Here's the user story:
As a pipeline developer, I want to cache task results based on input parameters and source code changes, so that I can skip re-executing tasks when inputs haven't changed, reducing build time and costs.
Does this look correct?
> Yes
Now let's define acceptance criteria:
> - Tasks can opt-in to caching by adding cache annotations
> - Cache key is computed from task inputs, parameters, and workspace content hashes
> - Cached results are restored when cache key matches
> - Cache hit shows "Skipped (cache hit)" in TaskRun status
> - Users can configure cache retention policy (default 7 days)
> - Cache works across different PipelineRuns and clusters
> - Cache misses fall back to normal task execution
Any additional context?
> This builds on the new Tekton Cache component. Must integrate with existing workspace mechanisms. Target: OpenShift Pipelines 1.15 / Tekton v0.60.
Component Suggestion:
- Detected keywords: "task", "cache", "pipeline"
- Suggested component: Tekton Cache
Result:
- Story created in SRVKP project
- Component: Tekton Cache
- Complete with acceptance criteria
- Labels: ai-generated-jira
- Summary: "Enable task result caching for faster pipeline execution"
Best Practices Summary
- User-focused: Always describe value from user perspective
- Specific actions: Clear what the user can do
- Clear value: Explicit why (benefit to user)
- Testable AC: Specific, observable criteria
- Right-sized: Can complete in one sprint
- Conversational: Story prompts discussion, not full spec
- Independent: Story can be implemented standalone
- Valuable: Delivers user value when complete
Anti-Patterns to Avoid
โ Technical tasks disguised as stories
As a developer, I want to refactor the database layer
โ
Use a Task instead, or reframe with user value
โ Too many stories in one
As a user, I want to create, edit, delete, and share documents
โ
Split into 4 separate stories
โ Vague acceptance criteria
- Test that it works correctly
- Verify good performance
โ
Be specific: "Response time under 200ms", "Handles 1000 concurrent users"
โ Implementation details in AC
- Test that the function uses Redis cache
- Verify that the API calls the UserService.get() method
โ
Focus on user-observable behavior, not implementation
Confirmation Flow and Workflow Summary
Follow the Mandatory Confirmation Flow and MCP โ CLI Fallback Decision Tree defined
in ../_common.md. The preview label for this type is PREVIEW: SRVKP User Story.
- โ
ENFORCE SRVKP-only - reject other projects
- ๐ PHASE 0A: Duplicate Detection - search for similar stories (3+ keyword match)
- ๐ PHASE 0B: Parent Epic Discovery - search for related Epics (offer 'none' option)
- ๐ Suggest component from summary keywords
- ๐ฌ Interactively collect user story (Who/What/Why)
- ๐ฌ Interactively collect acceptance criteria
- ๐ฌ Optionally collect additional context
- ๐ Format description with SRVKP template
- ๐ Scan for sensitive data
- โ
Validate story quality and completeness
- ๐ SHOW COMPLETE PREVIEW (including parent epic if selected)
- โ GET USER CONFIRMATION (yes/no)
- โ
Create the story (only if confirmed) โ MCP first; same payload via
acli on fallback (use --parent when linking to an epic)
- ๐ค Return issue key and URL
See Also
/jira:create - Main command that invokes this skill (includes Issue Hierarchy and Parent Linking documentation)
- SRVKP project conventions and best practices
create-epic skill - For creating parent epics
- Agile Alliance: User Story resources
- Mike Cohn: User Stories Applied