What it does

ShipSignal is a Rovo agent that answers the one question every software team argues about before a release: is this actually ready to ship? Ask it in Rovo chat — "Is the 2.4 release ready to ship?" — and it reads every issue in that Jira fix version live, computes a deterministic 0–100 score, and returns a verdict: READY / AT_RISK / NOT_READY, with the evidence behind it: done share, blocked issues (one blocked issue is a hard NOT_READY, whatever the score), high-priority open work, unassigned open issues, stale issues untouched for over 14 days. It then offers to act on the result in the same conversation: create one Jira Task per blocker (only after you confirm — writes are never automatic), or draft the release notes from the assessment. The same four tools are exposed through the rovo:mcp module, so the same assessment runs from Claude Code or Cursor, and the repo ships an open-source SKILL.md for those MCP clients.

How we built it

A Forge app (nodejs22.x) with rovo:agent, rovo:mcp, four action modules and four Forge functions: src/readiness.js — pure, unit-tested scoring engine (computeReadiness, normaliseJiraIssues), no Forge imports; src/jira.js — Jira API access via Forge asUser() (JQL search with pagination, version lookup, follow-up creation, release-notes draft); src/index.js — the four Forge functions the agent and MCP call; prompts/agent-prompt.md — the agent's workflow and rules; SKILL.md — open-source Agent Skills file for MCP clients; test/readiness.test.js — 6 unit tests, all passing. Scopes are Jira-only: read:jira-work, write:jira-work, read:jira-user. No Bitbucket scopes are mixed in.

Inspiration

Every release, teams argue about readiness from gut feeling. The data is already in Jira — nobody turns it into an answer. ShipSignal does.

What we learned

Rovo invokes Forge functions directly with the action inputs — not through the @forge/resolver dispatch, which expects a functionKey wrapper. The resolver pattern crashes with a 500 in Rovo. @forge/api 8.5 requires Jira calls to use the route template tag; plain string URLs are rejected. @forge/resolver 2.x exports its class as .default in CommonJS, and storage no longer exists in @forge/api 8.5 — both broke the first deploy. Each was found in forge logs and fixed, and the app was verified live in Rovo after each fix.

Accomplishments that we're proud of

A real, working Rovo agent — verified live on a Jira test site, not a scripted demo. On a seeded release (2 of 4 issues done, 1 blocked bug, 1 high-priority, 1 unassigned) it returned NOT_READY, 38/100, named the blocker, drafted the release notes, and created the blocker follow-up task in Jira. A deterministic engine: the same Jira state always gives the same score. The agent never invents a verdict.

What's next

A Jira issue panel showing the latest readiness snapshot for a version. Confluence release-notes publishing (draft today, publish to a page). Marketplace listing (targets the Best Marketplace-published app bonus).

Built with

Forge, Rovo, Jira Cloud, Atlassian MCP, JavaScript (Node.js 22)

Installation link

Install ShipSignal from the production installation link (also added under "Try it out" links below):

https://developer.atlassian.com/console/install/2f7eab8b-71dc-451a-a987-ebbcdd921521?signature=AYABeBnYD5v59%2FHRNIEuvpXGcqQAAAADAAdhd3Mta21zAEthcm46YXdzOmttczp1cy13ZXN0LTI6NzA5NTg3ODM1MjQzOmtleS83MDVlZDY3MC1mNTdjLTQxYjUtOWY5Yi1lM2YyZGNjMTQ2ZTcAuAECAQB4CxqLTo9l4lqXuFjNim1xJM%2Bp%2F3TVP9xHS2BrU5DRRucBxr0Qqi1wdsVrFbciEZDY6AAAAH4wfAYJKoZIhvcNAQcGoG8wbQIBADBoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDJeWzrI0tf7F6Z2BuAIBEIA7DZsXPJLUFAVA1Z07VaYPZA7BpNJkXFfm5hWzzh7vZvpual1M1B%2FfO8kwd6NDJYhM3hhXE0nDMsirZnUAB2F3cy1rbXMAS2Fybjphd3M6a21zOmV1LXdlc3QtMTo3MDk1ODc4MzUyNDM6a2V5LzQ2MzBjZTZiLTAwYzMtNGRlMi04NzdiLTYyN2UyMDYwZTVjYwC4AQICAHi9bVMAkme4qVQX1fQHo6ePw3H40A7cGfz7yrmSfBWMXgGmSMPANnmy5fcBQoTaRgOiAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMY%2FaBH247EAweJVNHAgEQgDtVm7%2BARDAEtcB0s7%2FiH%2BP%2FkImrplrSbuRb79f8Tkd4HTIxx10EnAhlgHVpC%2Bw0E4p7FtXjnzf7rJL1vgAHYXdzLWttcwBLYXJuOmF3czprbXM6dXMtZWFzdC0xOjcwOTU4NzgzNTI0MzprZXkvNmMxMjBiYTAtNGNkNS00OTg1LWI4MmUtNDBhMDQ5NTJjYzU3ALgBAgIAeDYASx0XCjkny4iLV6vz%2BKtEGSGT6kdt0QRpkn6D%2FlVEAUqj%2FlkAasEa6HjXuqDR8oQAAAB%2BMHwGCSqGSIb3DQEHBqBvMG0CAQAwaAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAwQf%2BPmhJubBCrj%2BaUCARCAO3WehBPsc%2BmKJrKDp6K%2B8uI2uc8Qa4F6MG4kdbX6JD%2B4CHSvmnRkJr68fdw7QR1TLvq7oF16R4FsvRziAgAAAAAMAAAQAAAAAAAAAAAAAAAAAEgjGDLfYUfvVuPxhPrawkT%2F%2F%2F%2F%2FAAAAAQAAAAAAAAAAAAAAAQAAADLXLAYzvITVrb6ghLsCPMwHQfexx%2F%2FyUBaOv1xQKtSvTsaaLOJZ9JNyh79rYL7QVL1ZLbOgkuK9B0kAwddDiqDHMUU%3D&product=jira

Testing instructions for judges

  1. Install ShipSignal from the installation link on a Jira site (Rovo is needed for the chat experience — it comes with a Standard/Premium trial site).
  2. In any Jira software project, create a fix version (e.g. 2.4) and add a few issues to it: some Done, at least one with the label blocked, one high-priority open, one unassigned.
  3. In Rovo Chat, pick the ShipSignal agent and ask: "Is the 2.4 release ready to ship?"
  4. Expected: a score out of 100, a READY / AT_RISK / NOT_READY verdict, the evidence (done count, blockers, high-priority, unassigned, stale), and recommendations.
  5. Ask it to "draft release notes" — it returns a draft from the same assessment. Ask it to "create blocker follow-ups" — after you confirm, it creates one Jira Task per blocker.
  6. The same four tools are available to MCP clients via the shipsignal-mcp module.
Share this project:

Updates

Submission history