Inspiration

On a service desk, the first five minutes of every ticket go to the same four questions:

  • How urgent is this?
  • What kind of problem is it?
  • Who usually fixes it?
  • Is there a runbook?

The answers are already on the site, in resolved tickets and Confluence pages. Nobody has time to dig them up for every ticket.

What it does

Triage Lens is a Rovo agent for Jira Service Management. Ask it to triage a ticket and it returns:

  • a suggested priority, with the specific reasons (service down, many users affected, production system, security incident, explicitly urgent, or just a question or cosmetic request)
  • a category (Security, Access, Network, Hardware, Email & Collaboration, Software)
  • a suggested owner: whoever resolved the most similar tickets recently, weighted by recency
  • the similar resolved tickets and matching Confluence runbooks it used as evidence

Nothing changes until a person says yes. After the user confirms (and Rovo shows its own review card), Triage Lens sets the priority and owner, adds triaged-by-triage-lens and category labels, and posts an internal note explaining the decision.

The same five tools are exposed through rovo:mcp, so external MCP clients can triage tickets with exactly the same permissions model.

How we built it

  • A Forge app with rovo:agent, five action modules and one rovo:mcp module, running on the nodejs24.x runtime ("Runs on Atlassian")
  • Jira REST API v3 (/search/jql, issue, comment, priority) and Confluence CQL search, all called asUser(), so the agent can never see or change more than the person using it
  • A deterministic, unit-tested triage engine: keyword extraction, transparent urgency scoring and a recency-weighted owner suggestion. The rules decide and the model narrates, so every suggestion is explainable and repeatable.
  • Priority mapping onto any site's priority scheme: Highest/High/Medium/Low, Critical/Medium/Low, or P1–P4
  • 23 unit tests with Node's built-in test runner. The Atlassian API client is injected, so the handlers are tested without a live site.

Challenges we ran into

  • Safety with an LLM in the loop. Model-provided inputs are validated: issue keys by strict regex, priorities against the site's real list, account IDs by pattern. JQL and CQL terms are escaped, the write action requires explicit confirmation, and the prompt treats ticket text as data, not instructions.
  • Different priority schemes per site. Our demo site used Critical/Medium/Low, so the first version's "High" didn't exist there. We added mapping onto whatever priorities the site defines.

Accomplishments we're proud of

  • One action replaces four manual lookups, using only data teams already have. No setup and no training data.
  • Fails safe: errors change nothing, and triage still works if Confluence isn't installed.

What we learned

Rovo actions plus rovo:mcp let one set of well-described tools serve both the in-product agent and any external AI client.

What's next for Triage Lens

  • Learning each team's own urgency signals from past priority changes
  • Duplicate detection and linking
  • An Atlassian Marketplace listing
Share this project:

Updates

Submission history