Genuine question for anyone running scaled setups — SAFe, LeSS, or just "we have a lot of Epics and a lot of teams."
I keep running into the same problem at client sites: Portfolio ranks their Epics, but that ranking never actually reaches the teams. The team backlog has its own rank, and within a couple of sprints the two are completely out of sync. Nobody can tell you whether the team is actually working on what Portfolio considers #1.
The "official" workaround has been the same since 2013 — go to Plan Mode, filter by Epic, select all child issues, drag them up, repeat for every Epic, every time the ranking changes. With 20+ Epics that's not a workaround, that's a part-time job.
Advanced Roadmaps made ranking "independent" across hierarchy levels a while back. I get why — teams didn't want Portfolio reshuffling their sprint. But it also killed any automatic connection between "this Epic is our top priority" and "the Stories under it should probably be worked on first."
WSJF helps on the scoring side, sure. But it doesn't solve the propagation problem. You can score your Epics perfectly and still have teams grinding through Stories from the lowest-ranked Epic because that's just where their board rank ended up.
At one client I got asked to solve exactly this problem. My solution was building 2 things with ScriptRunner on DC:
A nightly scheduled job that reads the portfolio board, respects swimlane order (dedicated swimlanes rank before the default lane), factors in status priority (in progress before ready), then walks the hierarchy down through issue links to the child Features and writes a calculated rank into a custom number field. That number field drives board sorting — every morning the teams open a backlog that actually reflects what Portfolio decided. Issues that drop off the board get their rank automatically cleared so nothing stale lingers.
And a custom REST endpoint with the exact same logic, accessible to admins and product owners - so when someone re-prioritizes mid-day, they trigger a sync right away instead of waiting until tomorrow morning.
Works well when it works. But let's be honest, the script is ~400 lines of Groovy that talks to undocumented board APIs, parses swimlane JSON, handles multiple fallback methods when Atlassian changes their REST responses (which they do), and silently breaks if someone renames a status or reconfigures the board. Every Jira upgrade is a coin flip on whether the Greenhopper endpoint still returns what you expect. It's custom code on DC, it needs someone who understands it to maintain it, and it obviously won't survive a Cloud migration.
So — how are you handling this? Manual process? ScriptRunner? Automation rules? Jira Align Pull Rank? Something completely different?
Do your teams even care about Epic rank, or do they just work off their own backlog and ignore what Portfolio says?
Not trying to sell anything here but I've been dealing with this at multiple enterprise clients and for the longest time I was convinced there was no clean native solution.
Curious how others handle it and appreciate your insights.
Best Regards
cF
Recommended Learning For You
Level up your skills with Atlassian learning
Learning Path
Improve user experience across Jira with global settings
Learn how to set up and configure a Jira site, manage Jira permissions, and configure Jira apps and integrations.
Learning Path
Streamline projects across Jira with shared configurations
Build Jira work items with reusable configurations called schemes, and reduce administrative work with automation.
Learning Path
Become an effective Jira software project admin
Set up software projects and configure tools and agile boards to meet your team's needs.