Jira conventions for the CNTRLPLANE project used by OpenShift teams
/plugin marketplace add openshift-eng/ai-helpers/plugin install jira@ai-helpersThis skill inherits all available tools. When active, it can use any tool Claude has access to.
This skill provides conventions and requirements for creating Jira issues in the CNTRLPLANE project, which is used by various OpenShift teams for feature development, epics, stories, and tasks.
Use this skill when creating Jira items in the CNTRLPLANE project:
This skill is automatically invoked by the /jira:create command when the project_key is "CNTRLPLANE".
Full name: Red Hat OpenShift Control Planes
Key: CNTRLPLANE
Used for: Features, Epics, Stories, Tasks, Spikes
Used by: Multiple OpenShift teams (HyperShift, Cluster Infrastructure, Networking, Storage, etc.)
Note: Universal requirements (Security Level: Red Hat Employee, Labels: ai-generated-jira) are defined in the /jira:create command and automatically applied to all tickets.
Status: OPTIONAL (many issues in CNTRLPLANE have null target version)
Recommendation: Prompt the user for target version if needed, rather than assuming a default.
Prompt: "Which OpenShift version should this target? (e.g., 4.22, openshift 4.22, OCP 4.22) or press Enter to skip"
Users may specify versions in various formats. Normalize all inputs to the Jira format openshift-X.Y:
| User Input | Normalized Output |
|---|---|
4.21 | openshift-4.21 |
4.22.0 | openshift-4.22 |
openshift 4.23 | openshift-4.23 |
openshift-4.21 | openshift-4.21 |
OCP 4.22 | openshift-4.22 |
ocp 4.21 | openshift-4.21 |
OpenShift 4.23 | openshift-4.23 |
Normalization rules:
If target version is set:
First, fetch available versions:
versions = mcp__atlassian__jira_get_project_versions(project_key="CNTRLPLANE")
Find the version ID for the normalized version name (e.g., "openshift-4.22")
Use correct MCP format (array of version objects with ID):
"customfield_12319940": [{"id": "VERSION_ID"}] # e.g., openshift-4.22
IMPORTANT: Do NOT use string format like "openshift-4.22" - this will fail. Must use array with version ID.
Never set:
fixVersions) - This is managed by the release teamWhen user specifies a version (via --version flag or prompt):
openshift-X.Y formatmcp__atlassian__jira_get_project_versions[{"id": "VERSION_ID"}]See: /jira:create command documentation for the complete "Issue Hierarchy and Parent Linking" reference, including field mapping, MCP code examples, and fallback strategies.
CNTRLPLANE uses different fields for different parent relationships:
| Creating | Parent Type | Field to Use | Value Format |
|---|---|---|---|
| Story | Epic | customfield_12311140 (Epic Link) | "CNTRLPLANE-123" (string) |
| Task | Epic | customfield_12311140 (Epic Link) | "CNTRLPLANE-123" (string) |
| Epic | Feature | customfield_12313140 (Parent Link) | "CNTRLPLANE-123" (string) |
⚠️ CRITICAL:
customfield_12311140)customfield_12313140)parent field does NOT work| Field | Custom Field ID | Format |
|---|---|---|
| Epic Link (for stories/tasks) | customfield_12311140 | String: "CNTRLPLANE-123" |
| Parent Link (for epics→features) | customfield_12313140 | String: "CNTRLPLANE-123" |
| Epic Name (required for epics) | customfield_12311141 | String: same as summary |
| Target Version | customfield_12319940 | Array: [{"id": "12448830"}] |
Follow the implementation strategy documented in /jira:create command:
IMPORTANT: Component requirements are team-specific.
Some teams require specific components, while others do not. The CNTRLPLANE skill does NOT enforce component selection.
Team-specific component handling:
hypershift skill for component selectionIf component is not specified:
Note: Issue type templates and best practices are defined in type-specific skills (create-story, create-epic, create-feature, create-task).
--parent flag)customfield_epicname must be set (same value as summary)--parent flag)create-feature skill)--parent flag)Note: Security validation (credential scanning) is defined in the /jira:create command and automatically applied to all tickets.
Basic story (no epic link):
mcp__atlassian__jira_create_issue(
project_key="CNTRLPLANE",
summary="<concise story title>", # NOT full user story format
issue_type="Story",
description="<formatted description with full user story and AC>",
components="<component name>", # if required by team
additional_fields={
"labels": ["ai-generated-jira"],
"security": {"name": "Red Hat Employee"}
}
)
Story linked to epic:
mcp__atlassian__jira_create_issue(
project_key="CNTRLPLANE",
summary="<concise story title>", # NOT full user story format
issue_type="Story",
description="<formatted description with full user story and AC>",
components="<component name>", # if required by team
additional_fields={
"customfield_12311140": "<epic-key>", # Epic Link (e.g., "CNTRLPLANE-456")
"labels": ["ai-generated-jira"],
"security": {"name": "Red Hat Employee"}
}
)
Basic epic (no parent feature):
mcp__atlassian__jira_create_issue(
project_key="CNTRLPLANE",
summary="<concise epic title>",
issue_type="Epic",
description="<epic description with scope and AC>",
components="<component name>", # if required
additional_fields={
"customfield_12311141": "<epic name>", # required, same as summary
"labels": ["ai-generated-jira"],
"security": {"name": "Red Hat Employee"}
}
)
Epic linked to parent feature:
mcp__atlassian__jira_create_issue(
project_key="CNTRLPLANE",
summary="<concise epic title>",
issue_type="Epic",
description="<epic description with scope and AC>",
components="<component name>", # if required
additional_fields={
"customfield_12311141": "<epic name>", # required, same as summary
"customfield_12313140": "CNTRLPLANE-123", # Parent Link - feature key as STRING
"labels": ["ai-generated-jira"],
"security": {"name": "Red Hat Employee"}
}
)
mcp__atlassian__jira_create_issue(
project_key="CNTRLPLANE",
summary="<concise feature title>",
issue_type="Feature",
description="<feature description with market problem and success criteria>",
components="<component name>", # if required
additional_fields={
"labels": ["ai-generated-jira"],
"security": {"name": "Red Hat Employee"}
# Target version is optional - omit unless specifically required
}
)
Task linked to epic (via Epic Link):
mcp__atlassian__jira_create_issue(
project_key="CNTRLPLANE",
summary="<task summary>",
issue_type="Task",
description="<task description with what/why/AC>",
components="<component name>", # if required
additional_fields={
"customfield_12311140": "CNTRLPLANE-456", # Epic Link (if linking to epic)
"labels": ["ai-generated-jira"],
"security": {"name": "Red Hat Employee"}
}
)
Note: If you need to link a task to a parent story, use Epic Link field (customfield_12311140) with the story key.
| Requirement | MCP Parameter | Value | Required? |
|---|---|---|---|
| Project | project_key | "CNTRLPLANE" | Yes |
| Issue Type | issue_type | "Story", "Epic", "Feature", "Task" | Yes |
| Summary | summary | Concise title (5-10 words), NOT full user story | Yes |
| Description | description | Formatted template (contains full user story) | Yes |
| Component | components | Team-specific component name | Varies by team |
| Target Version | additional_fields.customfield_12319940 | Array: [{"id": "12448830"}] Recommend omitting | No |
| Labels | additional_fields.labels | ["ai-generated-jira"] | Yes |
| Security Level | additional_fields.security | {"name": "Red Hat Employee"} | Yes |
| Epic Link (stories→epics) | additional_fields.customfield_12311140 | Epic key as string: "CNTRLPLANE-123" | No |
| Epic Name (epics only) | additional_fields.customfield_epicname | Same as summary | Yes (epics) |
| Parent Link (epics→features) | additional_fields.parent | {"key": "FEATURE-123"} | No |
Note: Detailed prompts for each issue type are defined in type-specific skills (create-story, create-epic, create-feature, create-task).
CNTRLPLANE-specific prompts:
Note: All examples automatically apply universal requirements (Security: Red Hat Employee, Labels: ai-generated-jira) as defined in /jira:create command.
/jira:create story CNTRLPLANE "Enable pod disruption budgets for control plane"
Prompts:
create-story skill for story-specific prompts/jira:create epic CNTRLPLANE "Improve cluster lifecycle management"
CNTRLPLANE-specific requirements:
Prompts:
create-epic skill for epic-specific prompts/jira:create feature CNTRLPLANE "Advanced observability capabilities"
Prompts:
create-feature skill for feature-specific prompts/jira:create task CNTRLPLANE "Refactor cluster controller reconciliation logic"
Prompts:
create-task skill for task-specific promptsScenario: User specifies a version that doesn't exist.
Action:
mcp__atlassian__jira_get_project_versions to fetch available versionsScenario: Team requires component, but user didn't specify.
Action:
Scenario: Credentials or secrets found in description.
Action:
Scenario: User specifies --parent CNTRLPLANE-999 but issue doesn't exist.
Action:
mcp__atlassian__jira_get_issueScenario: MCP tool returns an error.
Action:
Scenario: User tries to create a bug in CNTRLPLANE.
Action:
Note: Jira description formatting (Wiki markup) is defined in the /jira:create command.
Teams using CNTRLPLANE may have additional team-specific requirements defined in separate skills:
hypershift skill for component selection (HyperShift / ARO, HyperShift / ROSA, HyperShift)Team-specific skills are invoked automatically when team keywords are detected in the summary or when specific components are mentioned.
When /jira:create is invoked for CNTRLPLANE:
hypershift)Note: Universal requirements (security, labels), security validation, and issue creation handled by /jira:create command.
--parent flagNote: Universal best practices (security, labels, formatting, credential scanning) are defined in the /jira:create command.
/jira:create - Main command that invokes this skill (includes Issue Hierarchy and Parent Linking documentation)ocpbugs skill - For OCPBUGS bugshypershift) - For team-specific conventions