Find the best ROI task in a Jira Epic — highest story points for least effort, filtered to unassigned To Do tasks only.
58
66%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Advisory
Suggest reviewing before use
Optimize this skill with Tessl
npx tessl skill review --optimize ./skills/best-roi-task/SKILL.mdYou are analyzing a Jira Epic to find the task with the best return on investment (highest story points relative to effort/size) that is available to pick up.
Before doing this skill's work, resolve dependencies from the sibling requirements.json:
requirements.json next to this SKILL.md. If absent, skip preflight (no declared deps).devflow is on PATH, run devflow deps check best-roi-task and use its report. Otherwise check each dep's check inline (command -v / run the command; for the named probe hindsight, test whether the Hindsight recall tool is reachable).name, why, and install hint. Do not continue.AskUserQuestion (header "Optional dep"): Provide an alternative (path/command/endpoint) · Continue without (apply the dep's degrade) · Abort. In a non-interactive run (claude --print, cron, no TTY) default to Continue without — never hang.Provide via $ARGUMENTS:
https://aircall-product.atlassian.net/browse/MES-3548 or just MES-3548Example: /devflow:best-roi-task https://aircall-product.atlassian.net/browse/MES-3548
If no argument is provided, ask the user for the Epic URL or key.
Parse the Epic key. Extract from the argument:
MES-3548 from .../browse/MES-3548)[A-Z]+-\d+): use directlyFetch all child issues using Jira MCP:
Use mcp__claude_ai_Atlassian__searchJiraIssuesUsingJql with:
cloudId: the Atlassian site URL from the epic URL, or default to aircall-product.atlassian.netjql: "Epic Link" = <EPIC_KEY> ORDER BY created ASCfields: ["summary", "status", "assignee", "customfield_10028", "customfield_10188", "issuetype", "issuelinks"]maxResults: 50Analyze blockers. For each task, inspect issuelinks for "Blocks" relationships:
type.name is "Blocks" and the task appears in outwardIssue (meaning another issue blocks it) — specifically, links with type.inward = "is blocked by" where the current task is the inward side.inwardIssue.key matches the current task (the current task "is blocked by" the outwardIssue), OR where outwardIssue exists and type.outward = "blocks" (meaning the linked issue blocks the current task)."done" or status name "In Code Review" or later (i.e., statusCategory.key is "done" or status name contains "Review").Filter to eligible tasks. Only include tasks where:
assignee is null (unassigned)status.statusCategory.key is "new" (To Do) — this catches any status name that maps to the "To Do" categoryTasks that match the first two criteria but ARE blocked should be shown separately (see step 6).
Calculate ROI score for each eligible task:
Map t-shirt size (customfield_10188.value) to effort:
| Size | Effort |
|---|---|
| XS | 1 |
| S | 2 |
| M | 3 |
| L | 5 |
| XL | 8 |
Story points come from customfield_10028.
ROI score = story_points / effort. If story points are null/0, score is 0.
Present results sorted by ROI score descending:
## Best ROI Tasks in <EPIC_KEY>
| Rank | Task | Summary | Points | Size | ROI Score | Blocked By |
|------|------|---------|--------|------|-----------|------------|
| 1 | ... | ... | ... | ... | ... | — (or blocker key + status) |
### Recommendation
**<TASK_KEY>** — "<summary>" — <points> points, size <size> (ROI: <score>)The Blocked By column shows:
— if the task has no blockers<KEY> (Done) or <KEY> (In Code Review) if it had blockers but they're all resolved/nearly resolvedIf no eligible tasks are found, report:
No unassigned To Do tasks found in epic <EPIC_KEY>. All tasks are either assigned, in progress, or blocked.
Show blocked tasks that would otherwise be eligible (unassigned + To Do) but have unresolved blockers:
### Blocked tasks (unassigned, To Do, but blocked)
| Task | Summary | Points | Size | Blocked By |
|------|---------|--------|------|------------|
| ... | ... | ... | ... | <KEY> (<status>) |This helps the user see what's coming next once blockers clear.
Show other non-eligible tasks (assigned or in progress) for the full picture:
### Other tasks (assigned or in progress)
| Task | Summary | Points | Size | Status | Assignee |done category). Only tasks with ALL blockers resolved count as unblocked.customfield_10028 field is story points and customfield_10188 is t-shirt size — these are Jira custom field IDs specific to the Aircall Jira instance. Other instances may use different field IDs.issuelinks field contains both inward and outward links — check for links where the current task is blocked by another issue.$ARGUMENTS
8d872bf
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.