The problem

Every Jira issue arrives half-finished. Someone has to read it, decide whether it is ready to work on, judge how severe it is, figure out who should own it, and check whether it is a duplicate of something already filed. That triage is slow, inconsistent, and usually skipped — so unready issues get picked up, severe bugs wait behind trivia, and the same bug gets fixed twice.

What Triage Copilot does

Triage Copilot answers four questions about any Jira issue, in one place, with evidence for every answer:

  1. Is it ready? A 7-point definition-of-done checklist — acceptance criteria, assignee, priority, estimate, parent/epic, reproduction steps, labels — naming the exact field that fails.
  2. How severe is it? A deterministic 0–100 score with its evidence shown (issue type, priority, blockers), so the number can be argued with instead of trusted blindly.
  3. Who should own it? Ranked assignee candidates with reasons, drawn from the Teamwork Graph API (the reporter's teams, team members, and each candidate's real open workload) combined with Jira signals (recent commenters). If a source cannot be read, it says the answer may be incomplete — it never invents people.
  4. Is it a duplicate? JQL text search plus similarity scoring. Duplicates are suggested and linked only after confirmation — never auto-closed. Dedupe is a supporting feature, not the headline. Nothing is written without confirmation. Apply triage shows a preview of exactly what will happen (assignee, comment, duplicate link) and only writes after you confirm.

Three surfaces, one triage

  • Jira issue panel — instant, no waiting for an agent.
  • Rovo agent — chat "Triage PLAT-123"; it proposes the triage, can adjust the rule severity ±10 with a stated reason, and asks for confirmation before applying.
  • MCP server — the same 6 tools exposed through rovo:mcp, so any MCP client can triage (get-issue, get-dod-checklist, score-severity, suggest-assignee, find-similar-issues, apply-triage).

How we built it

Forge (nodejs24.x), UI Kit 2 for the panel, @forge/api for Jira REST and Teamwork Graph curated queries (with paging, retries, and a "could not read" rule instead of silent gaps). The duplicate-link direction is decided by which issue is newer, so applying from either side of a duplicate pair writes the correct link. Nine scopes, all least-privilege; the app stores no personal data.

What we learned

  • Teamwork Graph connection nodes are unions — fields are only reachable through inline fragments, and the edge cursor is declared non-null while the server can return null, so we page on pageInfo.endCursor only.
  • A panel that renders instantly beats an agent that takes 30 seconds, so the demo leads with the panel.
  • The hardest part of assignee suggestion is not ranking — it is refusing to invent a person when a source is unreadable.

What's next

Production install link is live. After the hackathon: a Marketplace listing (needs a second, licensed copy of the app, since a listed app cannot use an installation link), severity tuning against more real issues, and team-level workload balancing in the assignee ranking.

Technology requirement: This project meets the Codegeist technology requirement: it is built on Atlassian Forge and integrates with Jira Cloud. Modules used (from manifest.yml): jira:issuePanel (triage-panel, UI Kit 2), rovo:agent (triage-copilot), rovo:mcp (triage-copilot-mcp), six action modules (get-issue, get-dod-checklist, score-severity, suggest-assignee, find-similar-issues, apply-triage), and seven function modules. Runtime nodejs24.x. It reads and writes Jira issues through @forge/api (Jira REST) and consumes the Teamwork Graph API (requestTeamworkGraph) for the assignee suggestion.

Install (judges)

https://developer.atlassian.com/console/install/1146f277-7b1f-4320-a0f8-19ad51c9ccb8?signature=AYABeBAR2h7B1NECDP8FRgyMdIAAAAADAAdhd3Mta21zAEthcm46YXdzOmttczp1cy13ZXN0LTI6NzA5NTg3ODM1MjQzOmtleS83MDVlZDY3MC1mNTdjLTQxYjUtOWY5Yi1lM2YyZGNjMTQ2ZTcAuAECAQB4CxqLTo9l4lqXuFjNim1xJM%2Bp%2F3TVP9xHS2BrU5DRRucBdyDGJs06NMUk3Jd6py8lJAAAAH4wfAYJKoZIhvcNAQcGoG8wbQIBADBoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDKQXFrJTs8uIkpDBywIBEIA7LWJwUy3jYSfy%2BlVovHZB1CHnb85gMnNjDhUUFQrNUS%2FV%2F3rEaiQ1%2BqS9YOahX%2BHY7%2BEtXaSbClfYJIMAB2F3cy1rbXMAS2Fybjphd3M6a21zOmV1LXdlc3QtMTo3MDk1ODc4MzUyNDM6a2V5LzQ2MzBjZTZiLTAwYzMtNGRlMi04NzdiLTYyN2UyMDYwZTVjYwC4AQICAHi9bVMAkme4qVQX1fQHo6ePw3H40A7cGfz7yrmSfBWMXgE70Zfh%2Fw8oYdHtoWTIREUHAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM8K4kMGN5j5I6InoyAgEQgDsaK4E3LGace4QaRZNZvdg%2BsJFea%2Fjp3VARlNIR11Cv4ifxyoOVXzf70yboupOUo8hyWgwRzyNqlcXSigAHYXdzLWttcwBLYXJuOmF3czprbXM6dXMtZWFzdC0xOjcwOTU4NzgzNTI0MzprZXkvNmMxMjBiYTAtNGNkNS00OTg1LWI4MmUtNDBhMDQ5NTJjYzU3ALgBAgIAeDYASx0XCjkny4iLV6vz%2BKtEGSGT6kdt0QRpkn6D%2FlVEAeu9SFKYATOhIUHcfuOUrHcAAAB%2BMHwGCSqGSIb3DQEHBqBvMG0CAQAwaAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAzZRyghj7wclW%2BcLJICARCAO16lIOb%2FMw7ORpU9kQGrV8o5vjeSpu73Q8Q%2FKnOhthoYO7Wym%2FcG0f9gdsozIzM6kg1ruKPCEGQ9beHuAgAAAAAMAAAQAAAAAAAAAAAAAAAAAN2HOcf3s06kfcQuuE8NJEP%2F%2F%2F%2F%2FAAAAAQAAAAAAAAAAAAAAAQAAADJlPaepYz8mvJgV9iFMWbyW7R9ksMnf%2BpLgfqJQ3Ax787O6UrCKecY8vpzDNVCTMmvefaktdC2Z5xVMtErE3DC6%2FAY%3D&product=jira (Installing user must be a site admin. Jira only.)

Privacy policy

https://raw.githubusercontent.com/Luecria/triage-copilot/main/PRIVACY.md

Bonus prize write-ups

Best Agents - Rovo/Assignable agents: Triage Copilot is a rovo:agent (triage-copilot, prompt in prompts/prompt.md) with six reusable action modules, five of them read-only GET actions other agents can call (get-issue, get-dod-checklist, score-severity, suggest-assignee, find-similar-issues) and one confirmation-gated write (apply-triage, CREATE). The agent's one unbreakable rule is propose, never apply: it presents the triage, shows the exact preview of what will be written, and only calls apply-triage with confirmed: true after the user says yes. It may adjust the deterministic rule severity by at most ±10, only with a stated reason, and always shows the rule score beside the adjustment.

Best app with Atlassian MCP: The same six tools are exposed as a remote MCP server through rovo:mcp (triage-copilot-mcp) at https://mcp.atlassian.com/forge/1146f277-7b1f-4320-a0f8-19ad51c9ccb8. Verified end-to-end from an external MCP client (Glama MCP Inspector): all six tools listed, get-issue returned the issue, and score-severity on PLAT-33510 returned 40/100 Medium — the same score as the panel. The write tool (apply-triage) carries the same confirmation gate as the agent: it errors without confirmed: true.

Best apps with Teamwork Graph integration: The assignee suggestion consumes the Teamwork Graph API (requestTeamworkGraph, as the user) through three curated queries in src/twg.js: atlassianUserInTeams (the reporter's teams), atlassianTeamMembers (team members), and atlassianUserAssignedJiraWorkItems (each candidate's real open workload). Field names were verified against the live TWG schema downloaded from the demo site, and the live panel check confirmed real data end to end: on PLAT-33510 the top candidate scored 16 from commenter +4, team +2, and workload +10 (0 open items) — with no "could not read" warning. When a TWG source cannot be read, the result says so honestly ("could not read", never "nothing there") and the answer is marked as possibly incomplete.

Built With

Share this project:

Updates

Submission history