Inspiration
Account managers and customer success teams make promises in every call: "single sign-on by December 15", "new pricing by Friday", "the export fix ships before your renewal". Those promises are written in Confluence meeting notes, or nowhere at all. The work that delivers them lives in Jira, where nobody can see that a customer is waiting. So delivery dates slip quietly, and the customer is the first to notice. Kept connects the promise to the work, and keeps watching both.
What it does
- Turns meeting notes into tracked commitments. In Confluence, ask the Kept agent in Rovo to track the commitments on the page. It reads the notes and lists each promise with the customer and the promised date. It ignores things that are not our promises, such as "the customer will send their user list".
- Links each promise to its delivery work. Kept searches Jira for the work that delivers each promise and points out gaps, for example "PLT-1 is due 5 days after the promised date". Nothing is saved until you confirm. If no work exists, Kept can create a work item with the right due date.
- Gives every commitment a live status with a reason. Kept, Kept late, On track, At risk or Overdue, computed by deterministic rules from the promised date and the linked work: its status, due date and completion date. Every status comes with a sentence a person can check.
- Shows developers who is waiting. A Jira issue panel shows which customer is waiting on the work item, what was promised, by when, and why the date is at risk.
- Warns when a date slips. A Jira event trigger re-checks a promise when its linked work changes, and a daily scheduled trigger catches dates that pass. When a promise becomes at risk or overdue, Kept comments on the work item once.
- Commitments board. A Jira global page shows every promise by status and by customer, what is due in the next 14 days, and the share kept on time. Teams without Rovo can add commitments with a form.
- Live status in the meeting notes. A Confluence macro shows the current status of every promise made in that meeting.
- Brief before the call. Ask Kept "Brief me for my call with Acme Corp": it lists what is at risk and why, what was kept, and suggests honest talking points.
How we built it
- Forge, end to end. One app: Jira is required and Confluence is optional. Modules:
rovo:agentwith sevenactions:get-page-text,find-work-items,track-commitment(CREATE),create-work-item(CREATE),update-commitment(UPDATE),customer-briefandlist-at-risk;jira:issuePanelandjira:globalPage;- Confluence
macro; triggeronavi:jira:updated:issue(withignoreSelf) and a dailyscheduledTrigger;- Forge Custom Entities:
commitment(indexed by customer, source page, and status plus date) andcommitment-link(indexed by work item key). - The UI is UI Kit.
- AI where it helps, code where it must be right. The Rovo agent reads messy meeting notes and writes the brief. Dates, status and risk are deterministic code with plain-language reasons, covered by 13 offline tests.
- Permission-aware. All reads for people run as the current user, and commitments recorded from pages a person cannot view are hidden. Only the triggers act as the app, and they only comment on work items that are linked to a commitment.
- Measured on a live site. We ran the whole flow on the production app on a demo site: extraction from two meeting pages, links to four Jira work items, the panel, the board, the macro, the brief and the automatic comment.
- Demo video. Screen captures of the production app on a live demo site. The narration is synthetic (Kokoro-82M text to speech, Apache-2.0).
Challenges we ran into
- Custom Entities reject empty attribute values. Our first live test failed on an empty status field; Kept now stores only non-empty attributes and treats a missing one as empty.
- Alerts must not become noise. Kept remembers which risk it already reported for each promise, comments once per new risk, resets when the promise is back on track, and ignores updates made by the app itself.
- Meeting notes use relative dates such as "next Friday". The agent resolves them from the meeting date, shows the result for confirmation, and the app only accepts calendar dates.
Accomplishments that we're proud of
- From messy notes to tracked, linked commitments in one conversation, with a human confirmation step before anything is saved.
- Every status is explained in a sentence, so nobody has to trust a black box.
- The same commitment is visible where each person works: the meeting notes, the Jira work item, the board and Rovo.
What we learned
- Split the work: the agent is good at reading people's notes, code is good at dates. Doing it that way made the answers dependable.
- Confirmation steps build trust. Rovo's review card for CREATE actions turned out to be a feature, not friction.
What's next
- Renegotiation history and draft status updates the account manager can send to the customer.
- Teamwork Graph integration to find promise owners and related pages.
- Jira Service Management: link commitments to customer requests.
How it meets the technology requirement
Built entirely on Forge. It integrates Jira (issue panel, global page, work item reads and writes, event trigger), Confluence (macro and page reads) and Rovo (agent with seven actions). It makes no external calls. After the production deployment, the Forge CLI reported that the version is eligible for the Runs on Atlassian program.
Privacy and support
- Kept runs entirely on Atlassian Forge and makes no external calls.
- It stores customer names (companies), promise text, dates, the source page ID, title and link, linked work item keys and a cached status in Forge storage on the customer's site. It does not store account IDs, people's names or email addresses.
- Every read for people runs as the current user. Commitments recorded from pages a person cannot view are hidden from them.
- Kept only comments on work items that are linked to a commitment, at most once per new risk.
- Questions or problems: leave a comment on this Devpost page.