A Forge app for Jira that tracks the dated promises a team makes to customers in comments, reminds the team before one is broken, and keeps count of how many were kept.
Support, account and delivery teams make promises all day, in comments: “we will have a fix out by Friday”, “your refund will be processed within 3 to 5 business days”, “I’ll call you tomorrow with an update”. Nothing in Jira knows these were said. The work item’s due date is the team’s own plan, an SLA measures how fast the team responds, and neither is the thing the customer was told.
So the promise lives in one person’s memory. Friday comes, the customer has heard nothing, and the first anyone notices is the follow-up asking where the fix is. Most broken promises are not broken because the work was hard. They are broken because nobody saw the date coming.
issue in promisesDueWithin(3) finds work items with an open promise that is overdue or due within three days, for filters, boards and automation rules.| Comment | What the app does |
|---|---|
| “We will have a fix out by Friday.” | Tracks it, due Friday |
| “Our billing team will issue the refund within 3-5 business days.” | Tracks it, due on the fifth working day |
| “Sam will call you by end of day tomorrow.” | Tracks it, due tomorrow |
| “You should receive the refund within 5 business days.” | Suggests it: an expectation, not a commitment |
| “We will try to get this done by Friday.” | Suggests it: hedged |
| “Once we have your logs, we will send a fix by Friday.” | Suggests it: depends on a condition |
| “We will ship the fix next week.” | Suggests it: the date is vague, read as that Friday |
| “We will deliver it by 12/04.” | Suggests it: could be December 4 or 12 April |
| “Please send us the logs by Friday.” | Nothing: a request to the customer |
| “We won’t be able to fix this by Friday.” | Nothing: a refusal |
| “We will refund the charge from Nov 2.” (written on November 4) | Nothing: the date is in the past |
| “I will send you the logs by Friday.” (written by the customer) | Nothing: not the team’s promise |
Every tracked promise keeps the sentence it came from, the words that were read as the date, and the reason it was read as a promise, so a person can check the reading at a glance.
Detection is deliberately cautious. A promise the app missed can be added by hand in a few seconds. A promise it invented would make people stop trusting the reminders.
The Rovo agent then works from the recorded promises instead of re-reading comments, which keeps its answers consistent with the panel, the reminders and the search.
Five actions are available to the Promised agent and to any other Rovo agent: list-promises, get-promises-for-work-item, promise-summary, record-promise and update-promise. The three read-only ones are also exposed through the Atlassian MCP server (rovo:mcp) for assistants outside Atlassian.
skills/keep-promises/SKILL.md is an open skill file. It teaches an agent that drafts customer replies to check what was already promised first, so the reply does not contradict it, and never to hide a missed date.
| Module | What it does here |
|---|---|
trigger (2) |
Reads each new comment; settles promises when a work item is finished |
scheduledTrigger |
The daily check: reminders, and keeping the search function current |
jira:issuePanel |
The Promised panel on every work item |
jira:globalPage |
Open promises, totals, and setup |
jira:dashboardGadget |
“Promises due” gadget |
jira:entityProperty |
Indexes the next due date, the number of open promises and the status for JQL |
jira:jqlFunction |
issue in promisesDueWithin(3) |
rovo:agent |
The Promised agent |
action (5) |
The tools the agent uses |
rovo:skill |
keep-promises |
rovo:mcp |
Read-only tools for agents outside Atlassian |
| Forge key-value storage | Settings |
The promises themselves are stored on the work item, as an entity property. They move, archive and delete with it, and Jira’s own permissions decide who can see them.
Install the app from the Atlassian Marketplace (a Jira administrator does this under Apps > Explore more apps). Then in Jira:
issue in promisesDueWithin(3).The daily check runs once a day. Reminders appear for promises due the next day, due that day, or newly overdue.
To use the tools from an outside agent, an administrator turns them on under Atlassian Administration > Apps > Sites > your site > Connected apps. The endpoint is https://mcp.atlassian.com/forge/<appId>.
| Setting | Default | What it does |
|---|---|---|
| Read only comments the customer can see | On | On service projects, internal notes are not read |
| Post reminders | On | Adds the reminder notes described above |
| Read numeric dates day first | Off | Reads 03/04 as 3 April instead of March 4 |
| Time zone | That of the first person who opens the app | Decides which day a comment was written on, and when a promise is due and overdue |
Only a Jira administrator can change them.
The app stores, on each work item, the sentence that held the promise, the due date, who wrote it and what became of it. Anyone who can open the work item in Jira can see its promises. The customer portal of a service project does not show them. Settings are kept in Forge storage. Nothing is sent outside Atlassian.
Reminders are internal notes. Comments written by service-project customers and by apps or automation rules are not read.
All sample data is synthetic.
Runtime dependencies are the Forge SDK packages (@forge/api, @forge/bridge, @forge/kvs, @forge/react, @forge/resolver) and React.
Support: see the Promised privacy and support page. Email vinit@vinitshah.dev.