<essential_principles>
RHDH JiraFoundational skill for interacting with RHDH's Jira instance via the Atlassian CLI (acli). Covers all four active projects, issue types, workflows, custom fields, and JQL patterns.
- API order: acli → GraphQL (bulk reads) → REST (writes/fallback). Prefer the lightest tool that fits.
- Customer identity: Prefer support case key in summary/description; apply
RHDH-Customeras a Jira label; put names only in restricted-visibility comments. Never put customer names in unprotected fields — seereferences/fields.md. - Create paths hard-require grilling: Before
to-feature/to-epic/to-issue, loadreferences/grill.md→ Grilling prerequisite. Invoke the installedgrillingskill once for Fill Gaps + Challenge; do not re-implement cadence here. - Mutations need
--yes; formatted descriptions need ADF. Interactive prompts hang without--yes. Wiki markup in description files renders as literals — convert viascripts/jira-wiki-to-adf.py. - "Feature Exploration" ≠ "Feature Refinement." The meeting/process is Feature Exploration; the Jira status is Refinement.
</essential_principles>
What would you like to do?
- assign — Recommend and assign team members (expertise, capacity, context proximity)
- refine — Check issues against exit criteria, duplicates, missing fields, readiness
- plan — Sprint planning prep: carryover, velocity, capacity, ready queue, fill suggestions
- sprint-report — Sprint review summary: committed vs completed, demo checklist
- release — Release readiness: feature matrix, PI funnel, blockers, risk
- to-feature — Create a RHDHPLAN Feature (grill + duplicate check + optional Epic decomposition)
- to-epic — Create an RHIDP Epic (grill + duplicate check + optional Story/Task decomposition)
- to-issue — Create a Story, Task, Bug, or Spike (type inference + grill)
- update-jira-status — Session progress comment, transition, upward cascade
| Command | Reference |
|---|---|
assign [issue key(s) or JQL] |
references/assign.md |
refine [issue key(s), JQL, or 'sprint'] |
references/refine.md |
plan [team] |
references/plan.md |
sprint-report [team] |
references/sprint-report.md |
release [version] |
references/release.md |
to-feature [description] |
references/to-feature.md |
to-epic [description] |
references/to-epic.md |
to-issue [description] |
references/to-issue.md |
update-jira-status [key] |
references/update-jira-status.md |
Single source of truth for command descriptions: scripts/command-metadata.json
Wait for response before proceeding.
Routing rules
- No argument: Show the numbered menu above. Ask what to do.
- First word matches a command: Load its reference file and follow it.
- Natural-language create phrases (any position): map to the create refs so the grilling gate loads:
- "create a feature" / "create feature" →
references/to-feature.md - "create an epic" / "create epic" →
references/to-epic.md - "create a story" / "create story" / "create a task" / "create task" / "create a bug" / "create bug" / "create a spike" / "create spike" →
references/to-issue.md
- "create a feature" / "create feature" →
- First word doesn't match: General Jira invocation using the full argument as context — use the reference files table below to decide what to load.
Prerequisites
Run scripts/setup.py to verify everything is configured:
python scripts/setup.py
The script checks:
aclibinary on PATH- Jira API token auth configured (
~/.config/acli/jira_config.yaml) .jira-tokenfile next toacliexecutable (for REST API fallback)- Smoke test against
redhat.atlassian.net - Matt Pocock's
grillingskill (grilling/SKILL.md) — reported in full mode; hard-gated via--grilling-onlyfor create paths
If acli is not installed, download from Atlassian CLI and follow the Getting Started guide for installation and authentication setup. Use API token authentication, not OAuth — OAuth sessions expire and acli auth status gives false negatives with token auth (see Gotchas).
Grilling skill gate (create/grill paths only)
Load references/grill.md → Grilling prerequisite and Validate before creating. Create paths hard-require grilling; other commands do not. Full install dialogue and invoke criterion live only in grill.md.
API preference order
All operations follow this priority: acli → GraphQL → REST API.
- acli — default for simple, single-issue operations (view, edit, assign, transition).
- GraphQL — for bulk reads where acli would be too slow (expertise profiles, capacity, refinement checks). Skip acli entirely for bulk.
- REST API — for writes when already in an authenticated API context (avoids shelling out to acli mid-workflow), or as fallback when acli fails for custom field updates.
Sub-commands (assign, refine) document which API they use. When a sub-command's workflow already has AUTH set from GraphQL reads, prefer REST for writes.
REST/GraphQL capability gate
Before attempting any REST API or GraphQL call:
- Run
python scripts/setup.py --jsonand checktoken_file_found - If missing, state: "REST API/GraphQL fallback unavailable —
.jira-tokennot configured. Runsetup.pyfor instructions." Continue with acli-only workflow. - If the user needs REST/GraphQL, load
references/auth.mdfor setup instructions
Scripts
| Script | Purpose |
|---|---|
scripts/setup.py |
Verify acli install + auth; also detects grilling skill. --json for structured output. --grilling-only for create/grill gate (exit non-zero if grilling missing). |
scripts/parse_issues.py |
Flatten, enrich, and filter acli JSON output. Solves the core problem: acli search --json can't return custom fields (team, story points, sprint). Pipe search results in, get clean data out. Use --enrich to fetch full fields, -f team="X" to filter by team. |
scripts/command-metadata.json |
Single source of truth for sub-command descriptions and argument hints. |
scripts/validate_components.py |
Validate references/fields.md component catalog against live Jira projects (RHIDP + RHDHPLAN). Reports drift in both directions. Run with --json for structured output. |
scripts/jira-wiki-to-adf.py |
Convert a filled Jira wiki markup template to Atlassian Document Format JSON for use with acli --description-file. Handles hN. headings, * bullets, # ordered lists, (?) / (/) task items, *bold*, _italic_, {{monospace}}, backtick code. Usage: python scripts/jira-wiki-to-adf.py input.txt > output.adf.json |
Projects
| Key | Purpose | Issue Types |
|---|---|---|
| RHIDP | Engineering work | Epic, Story, Task, Sub-task, Vulnerability |
| RHDHPLAN | Program planning | Feature, Outcome, Feature Request, Sub-task |
| RHDHBUGS | Product defects | Bug, Sub-task |
| RHDHSUPP | Support-engineering interactions | Bug |
RHDHPAI (Plugins and AI) is archived — JQL queries against it will fail.
Issue type selection
- Story — end-user facing work (API, UI changes)
- Task — not end-user facing (tests, CI/CD, refactoring, code organization)
- Epic — collection of Stories/Tasks toward a deliverable
- Feature — program-level planning item in RHDHPLAN
- Bug — product defect (RHDHBUGS) or support case tracking (RHDHSUPP)
- Sub-task — child of any issue type above
- Vulnerability — CVE tracking in RHIDP (Product Security)
<reference_index>
Reference Files
Load only what the current task requires.
| File | Load when... |
|---|---|
references/acli-commands.md |
Running an acli command you haven't used before, or hitting unexpected flag behavior. Quick reference for syntax, flag differences, and output formats. |
references/fields.md |
Need to know a field name, custom field ID, accepted values, or label conventions. Custom fields, labels (RHDH-Customer), customer identity in unprotected fields, link types, components, priorities. |
references/workflows.md |
Transitioning issues, checking exit criteria, or verifying readiness for the next status. |
references/templates.md |
Creating new issues. Also load references/workflows.md for required fields at entry status. |
references/support.md |
Handling support cases, filing bugs from customer cases, or creating feature requests from support. Full RHDHSUPP workflow, SLA, and anti-patterns. |
references/feature-exploration.md |
Feature Exploration Process checklist: component validation, labels (demo, rhdh-testday), Doc Epic automation, cross-team dependencies, rescoping. Load when creating Features, refining Features, or checking Feature readiness. |
references/jql-patterns.md |
Building a JQL query, finding a board ID, or looking up sprint information. JQL cookbook with 23+ tested queries. |
references/auth.md |
Setting up authentication for REST API or GraphQL calls. Token file format, path discovery, security, instance config, common auth errors. |
references/rest-api-fallback.md |
acli failed to update a custom field (Team, Size, Story Points, Release Note Type). Curl examples, response handling, OpenAPI spec discovery. |
references/graphql-queries.md |
Complex read queries needing multiple fields, relationships, or custom field data in one call. Schema introspection, JQL search via GraphQL, field type fragments. Also for bulk operations where acli would be too slow. |
references/assign.md |
Recommending assignees for unassigned issues. Team roster lookup, expertise profiling, sprint capacity analysis, context proximity scoring. Also for applying assignments after user confirmation. |
references/refine.md |
Checking issues against exit criteria per status, identifying duplicates, missing fields, unaddressed comments, and readiness for the next workflow status. |
references/plan.md |
Sprint planning prep: carryover report, velocity trend, per-member capacity, ready-for-planning queue, sprint fill suggestions. |
references/sprint-report.md |
Sprint review summary: committed vs completed, per-member breakdown, epic progress, demo checklist with naming conventions, velocity trend. |
references/release.md |
Release readiness report: feature matrix, PI funnel states, epic roll-up, cross-team dependency map, blocker bugs, RN readiness, risk assessment. |
references/to-feature.md |
Create a RHDHPLAN Feature from conversation context with grill and optional Epic decomposition. |
references/to-epic.md |
Create an RHIDP Epic from conversation context with grill and optional Story/Task decomposition. |
references/to-issue.md |
Create a Story, Task, Bug, or Spike with automatic type inference and grill. |
references/update-jira-status.md |
Update a Jira issue with session progress, status comment, transitions, and upward cascade to parent Epic/Feature. |
references/duplicates.md |
Duplicate detection for pre-creation checks and refinement audits. Shared across creation commands and refine. |
references/grill.md |
Shared create/grill behavior: grilling prereq (SSOT), one-shot grilling invoke for Fill Gaps + Challenge, domain challenges, customer/label pre-create checks. |
references/work-breakdown.md |
Decomposing Feature→Epics or Epic→Stories/Tasks — synthesize-then-gap-fill, tracer bullets, blocking edges, quiz before create. |
references/sizing.md |
T-shirt sizing guide for Features/Epics and Fibonacci story points for Stories/Tasks. Used during grills and refinement. |
</reference_index>
Common Gotchas
acli auth statuslies. It checks OAuth, not API token auth. Always returns "unauthorized" with token auth even when Jira works fine. Useacli jira project list --recent 1as a smoke test instead.viewuses positional arg, everything else uses--key.acli jira workitem view RHIDP-123butacli jira workitem edit --key RHIDP-123 ....--yesis mandatory for mutations. Alledit,transition,assign, andlink createcommands prompt interactively without it. Always pass--yes.--fieldsis restrictive on search. Only acceptskey,summary,status,assignee,issuetype,priority,description,labels. For components, sprint, fixVersions, and all custom fields — use--jsonorscripts/parse_issues.py --enrich.- Team field has two JQL syntaxes.
customfield_10001cannot be used in JQL WHERE clauses. However,"Team[Team]" = {teamId}(using the team UUID, not display name) works. Use the UUID syntax for JQL filtering; usecustomfield_10001.namein post-processing only when you need the display name from JSON output. - ADF is required for formatted descriptions. Reading descriptions via
--jsonreturns Atlassian Document Format (nested JSON). Jira Cloud's editor is ADF-native — plain text and Jira wiki markup (h1.,*bold*) both render as literal characters in the UI. For formatted descriptions, fill a wiki markup template then runscripts/jira-wiki-to-adf.py <input.txt> <output.json>to convert to ADF, then pass via--description-file. Bothacli createandacli editaccept ADF JSON via--description-file. Do not use Jira wiki markup in description files expecting it to render. - Acceptance Criteria field is almost always null. Scan the description for "Requirements", "Acceptance Criteria", or bullet-style criteria instead of checking
customfield_10718. --enrichis MANDATORY for custom fields AND labels. Bothacli search --jsonandacli view KEY --json(without--fields "*all") return only basic fields (assignee, issuetype, priority, status, summary). Labels, story points, team, sprint, size, and components will all appear as empty/null — looking like the data isn't set when it actually is. Always usescripts/parse_issues.py --enrichto get custom field data. Skipping--enrichis the #1 cause of false "missing data" reports.aclicannot set arbitrary custom fields.acli jira workitem editdoes not have a--customflag. Fields like Team, Size, Story Points, and Release Note Type can only be updated via the Jira REST API. UsePUT /rest/api/3/issue/{key}with the field payload (seereferences/rest-api-fallback.mdfor curl examples and payload formats). Find the token file at.jira-tokennext to theacliexecutable (discover the path withreadlink -f "$(which acli)"orwhere acli). Never read the token file into context.acli sprint list-workitems --jsonwraps results in{"issues": [...]}. The output is NOT a flat array — it's an object with anissueskey. Extract the array before piping toparse_issues.py. Seereferences/acli-commands.mdfor the workaround command.- GraphQL search is beta.
issueSearchStablerequiresX-ExperimentalApi: JiraIssueSearchheader. Loadreferences/graphql-queries.mdbefore attempting GraphQL queries. .jira-tokenformat isemail:token, not bare token. A file containing only the API token without the email prefix will cause 401 errors on REST/GraphQL calls. Thesetup.pyscript validates the format.acli searchsilently truncates results. The default page size is 30. If your JQL matches more than 30 issues, you get the first 30 with no warning. Always pass--limit 500for bulk queries, or use--countfirst to check the total, then--paginateto fetch all pages. This is the #2 cause of incorrect reports after skipping--enrich.- "Feature Exploration" vs "Feature Refinement." The meeting/process is called Feature Exploration. The Jira workflow status is Refinement. These are different things. When referring to the meeting or process, always use "Feature Exploration." When referring to the Jira status, use "Refinement." The meeting is sometimes mislabeled as "Feature Refinement" in calendar invites — this is incorrect.
- Don't remove
rhdh-X.Y-candidatelabels. Candidate labels track release targeting. Removing them without PM approval can silently drop a feature from release tracking. - Feature→Epic child links use Parent Link, not issuelinks. Cross-project parent-child relationships (RHDHPLAN Feature → RHIDP Epic) use the
Parent Linkfield (customfield_10018), notissuelinks. To find child Epics of a Feature, use JQL:project = RHIDP AND type = Epic AND "Parent Link" = RHDHPLAN-XXX. Checkingissuelinkswill show zero results and produce false "no child Epics" reports. - REST
/rest/api/3/searchreturns 410 Gone. This endpoint has been removed. Use POST to/rest/api/3/search/jqlwith body{"jql": "...", "fields": [...], "maxResults": N}instead. This only affects direct REST calls —acli searchstill works. acli workitem createdoes not support--priority,--component, or--yes. These flags exist onedit,transition, andassignbut not oncreate— passing them causes "unknown flag" errors. After creating an issue, set priority, components, size (customfield_10795), and parent link (customfield_10018) together in a singlePUT /rest/api/3/issue/{key}call.- MCP
create_jira_issuedoes not support ADF. The MCP tool'sdescriptionparameter accepts a plain string, which Jira wraps in a single paragraph node — markdown syntax (## Heading,**bold**,- [ ] task) renders as literal characters. For formatted descriptions (headings, lists, code, links, task items), always useacli jira workitem createwith--description-filepointing to ADF JSON. Use the MCP tool only for quick unformatted issues where plain text is acceptable.
Error Handling
| Error | Action |
|---|---|
acli not on PATH |
Run scripts/setup.py. Install from Atlassian if missing. See Getting Started. |
| grilling skill missing on create/grill | Follow references/grill.md → Grilling prerequisite (setup.py --grilling-only, confirm, install, re-check). |
"unauthorized" from auth status |
Ignore. Check jira_config.yaml exists. Run smoke test. |
| "required flag(s) not set" | Command syntax wrong. Run acli jira <subcommand> --help. |
| "field X is not allowed" | Use --json instead of --fields for that field. |
| "the value X does not exist for the field 'project'" | Project key is wrong or project is archived (e.g., RHDHPAI). |
| Rate limiting (429) | Wait 5 seconds, retry once. |
| Interactive prompt hangs | Missing --yes flag on a mutating command. |
Custom field update fails via acli |
Fall back to Jira REST API using .jira-token file. See Gotcha #9. |
issueSearchStable returns errors |
Fall back to acli search (not REST — /rest/api/3/search returns 410 Gone on this instance). Warn that the beta API failed. |
Team Conventions
These apply across all sub-commands:
- Release Pending counts as completed. Release Pending items remain in the sprint and count toward velocity and capacity. They represent done work awaiting release.
- Confirmation flow. Sub-commands that modify Jira issues use a standard prompt:
"Apply changes? [y/N/edit]"— y applies all, N cancels, edit steps through each change individually. - Closure requires rationale. When closing or descoping issues, always add a comment documenting the reason and set the resolution field (
Won't Do,Duplicate,Done). Preserves the decision trail. - Comments over description bloat. Issue descriptions use the structured template sections. Decision trail, elaboration, and abandoned approaches go in comments. Prefer support key + use case in the description; put customer-identifying detail only in restricted-visibility comments. Creation commands proactively suggest comments for context that emerged during the grill.
Common Workflows
Sub-commands share data.
planreuses roster/capacity/expertise fromassign.sprint-reportuses the same velocity query pattern asplan.releasereferences exit criteria fromworkflows.mdand can invokeassignfor unassigned Features.
Creating an issue
- Load
references/templates.mdfor the body template - Load
references/workflows.mdfor required fields at New status - Run
acli jira workitem create(seereferences/acli-commands.mdif unsure of syntax)
Searching with custom fields (team, story points, sprint)
- Build JQL using patterns from
references/jql-patterns.md - Pipe results through
scripts/parse_issues.py --enrichfor full field data - Use
-f team="X"to filter by team (not possible in JQL)
Transitioning an issue
- Load
references/workflows.mdfor exit criteria at the target status - Verify required fields are set before transitioning
- Run
acli jira workitem transition --key KEY --status "X" --yes
Complex queries (many fields, relationships)
- Load
references/graphql-queries.md - Use
issueByKeyfor single issues orissueSearchStable(beta) for JQL search - Fall back to
acli+parse_issues.py --enrichif GraphQL returns errors
Recommending and assigning issues
- Load
references/assign.md - Identify unassigned issues (single key, JQL query, or passed-in list)
- Determine the team (from issue field, parent epic, or user input)
- Run deep or quick analysis per the reference
- Present recommendations, get user confirmation, then assign
Refining issues
- Load
references/refine.md - Identify issues to refine (specific keys, JQL,
sprint, orbacklog) - Run all 6 checks: missing fields, duplicates, hierarchy, comments, staleness, sprint readiness
- Present refinement report with actionable recommendations
- Optionally apply auto-fixable changes and prompt for manual decisions
Sprint planning prep
- Load
references/plan.md - Resolve team, board, and sprint context
- Generate carryover report, velocity trend, capacity snapshot, and ready-for-planning queue
- Auto-generate sprint fill suggestions with expertise matching
- Surface critical customer bugs (exempt from capacity) and retro action items
Sprint review summary
- Load
references/sprint-report.md - Resolve sprint (active or previous)
- Partition completed vs carried over, compute completion rate
- Per-member breakdown, epic progress, demo checklist with naming conventions
- Optionally save as markdown file
Release readiness
- Load
references/release.md - Fetch Features for the target version/label
- Quick mode: PI funnel, feature matrix, readiness score
- Deep mode: adds epic roll-up, dependency map, coherence analysis, RN readiness, risk assessment
- Optionally remediate (assign owners, create Epics, transition statuses)
Creating Features, Epics, and Issues
- Load the appropriate creation reference (
to-feature.md,to-epic.md, orto-issue.md) — NL phrases like "create a feature" route here too - Follow that ref: grilling prereq from
grill.md, load sizing/fields, invokegrillingonce for Fill Gaps + Challenge, validate, duplicate-check, create - Offer chained decomposition (Feature → Epics → Stories/Tasks) using
references/work-breakdown.md(tracer bullets + blocking edges; quiz before create)
Updating Jira from a session
- Load
references/update-jira-status.md - Detect related issue (conversation → git → PR → commits → keyword search)
- Compose status comment, propose transition
- Check upward cascade (sibling completion → parent transition)
- Suggest reaching out to Feature Owner if Feature-level work is complete
Discovering unknown fields or endpoints
- For REST: load
references/rest-api-fallback.md— use the OpenAPI spec or/rest/api/3/fieldendpoint - For GraphQL: load
references/graphql-queries.md— use__typeintrospection queries - Do not guess field IDs or types — always verify against the live schema
When NOT to Use
- Non-RHDH Jira projects — this skill's field mappings, workflows, and JQL patterns are specific to RHIDP/RHDHPLAN/RHDHBUGS/RHDHSUPP
- Jira REST API directly — use
aclifirst, then GraphQL for bulk reads. REST API is the last resort for writes when acli fails and for schema discovery via OpenAPI spec (see Gotcha #9) - GraphQL for simple lookups — use
aclifor single-issue views and simple searches. GraphQL is for bulk operations, complex queries needing relationships or many custom fields in one call, team roster lookups, and schema introspection