-
-
New issue “Add MongoDB cluster” is flagged in seconds: the decision it breaks, the evidence, why it was decided, and the owner.
-
No new process: a “Decision:” comment in Jira is captured automatically as DEC-7, with owner, source link and guardrails.
-
The issue panel shows the conflict card. Acknowledge and align the work, or supersede the decision so everyone knows.
-
It understands intent: “Migrate off MongoDB to Postgres” isn’t a conflict. It implements DEC-2.
-
Catches drift in comments: “push this to production on Friday” is flagged against the no-Friday-deploys rule.
-
Capture decisions from Confluence meeting notes in one click. Jira and Confluence share one install and database.
-
Each decision keeps its rationale, guardrails, owner, conflicts caught and supersede history.
-
Paste an RFC or PR description to check it against every decision. This one breaks three: MongoDB, API keys, Friday deploy.
-
Insights: conflicts caught per month, alert precision, where decisions come from, and decision hygiene.
-
Architecture: Forge + Forge SQL, explainable conflict engine (no paid AI), Rovo agent, MCP server, Teamwork Graph connector.
Inspiration
Every software team makes decisions: "Postgres, not MongoDB." "No Friday deploys." "The v1 API is deprecated." Then those decisions get buried in comment threads, meeting notes and people's heads. Months later, someone who wasn't in the room builds the exact opposite. The team loses a sprint, re-argues a settled question in code review, or ships an incident.
Atlassian describes the Teamwork Graph as an associative memory for the organization, holding "what's already been decided." We wanted that memory to speak up at the moment it matters: when new work is created.
What it does
Decision Memory captures team decisions where they already happen, and flags new work that contradicts them.
- Capture with no new process. Write
Decision: …in any Jira comment, or use the native/decisionblock, and it's saved as DEC-n with an owner, a source link and guardrails (what to avoid, what to prefer). You can also capture decisions from a Confluence page (⋯ → Capture decisions), import Markdown ADRs, or record them from the issue panel. - Catch conflicts automatically. When an issue is created or edited, or a new comment is posted, it's checked against every active decision. A conflict gets one clear comment: which decision, the exact evidence, why the team decided it, and the owner, plus a
decision-conflictlabel. - Understand intent. "Add a MongoDB cluster" is a conflict. "Migrate off MongoDB to Postgres" implements the decision, so there's no false alarm. Scoped rules work too: "No feature flags in the payments service" doesn't fire on onboarding work.
- Resolve in context. The issue panel shows conflicts, what the issue implements and related decisions, with Acknowledge, Not a conflict and Record a decision.
- A living Decision Log. Search, rationale, guardrail editing, supersede and revoke with full history, review dates and reminders, a Check a proposal box for RFC or PR text, and Insights (conflicts caught per month, alert precision, decision hygiene).
- Everywhere you work. A Rovo agent with 6 reusable actions (
search-decisions,get-decision,check-conflicts,record-decision,supersede-decision,list-due-for-review), the same tools exposed as an MCP server for Claude Code, Cursor and VS Code (check-conflictscan even inspect a git diff), and a Teamwork Graph connector that publishes decisions into the graph, linked to their Jira issues.
How I built it
- Forge (Node 22) with UI Kit for native Jira and Confluence UI:
jira:issuePanel,jira:globalPage,jira:adminPage,confluence:contentActionandmacro. - One site-level install across Jira and Confluence (
app.compatibility), so both share one Forge SQL database with migrations. - Triggers for issue create and update, comments, the app lifecycle, and a daily
scheduledTriggerfor review reminders. - Rovo:
rovo:agentplus 6actionmodules. MCP:rovo:mcpexposing the same actions. - Teamwork Graph: a
graph:connectorthat publishesatlassian:documentobjects associated with issues, plusrequestTeamworkGraph(Cypher) to read decision owners' teams. - The conflict engine is deterministic and explainable, with no paid AI:
- It extracts guardrails from natural-language decisions ("X instead of Y", "do not…", "no…", passive voice, scopes like "on Fridays" or "in payments service").
- It detects intent per clause ("add/use/migrate to" versus "remove/migrate off/replace X with Y").
- It resolves tech aliases (pg = Postgres, mongo = MongoDB, k8s…).
- It ranks related decisions with BM25.
- Every alert quotes its evidence. Running it costs $0, so it can check every issue and comment.
- 47 unit tests cover guardrails, intent, aliases, ADR parsing, diff parsing and validation.
Challenges I ran into
- Precision over magic. An app that comments on people's issues has to be right, and has to explain itself. Early versions flagged "migrate off MongoDB" and "Deploy to production on Tuesday". We added clause-aware intent detection, scoped guardrails and a learning loop: decisions whose alerts keep getting dismissed go quiet until they're refined.
- Permissions. Decisions captured in restricted projects must never leak through search, Rovo, MCP, the Confluence macro or the graph. Reads run as the user, comment-captured decisions are project-scoped, restricted comments and security-level issues are never captured, and identity always comes from the platform.
- Platform limits. Bitbucket can't share an app with site-scoped products, so PR checks run through the MCP and Rovo
check-conflictstool, which reads a git diff. Forge SQL (TiDB) auto-increment IDs aren't sequential, so we added a separate human-friendly DEC number. - No noise. One alert per issue per decision,
ignoreSelftriggers, bot-comment filtering, and admin settings for confidence and auto-commenting.
Accomplishments that I'm proud of
- One business-logic layer powers five surfaces: Jira UI, triggers, Confluence, the Rovo agent and actions, and MCP.
- Explainable alerts: every warning shows exactly which words triggered it.
- It runs entirely on Atlassian (no egress, no secrets) and costs $0.
What I learned
Context alone isn't enough. It has to arrive at the right moment, in the tool where work is created, with a clear reason and a clear next step (align, or supersede). We also learned how far the Forge platform can go: cross-app installs, SQL, Rovo, MCP and Teamwork Graph, all in one app.
What's next
- A companion Bitbucket app with merge checks
- Richer Teamwork Graph relationships (decision → team → repository)
- Per-project policies: "required" decisions that can block workflow transitions
- Slack and Teams digests of new and superseded decisions
Note for judges: Rovo chat wasn't available on our free developer site, so the video focuses on Jira and Confluence. The Rovo agent, its 6 actions and the MCP server are included in the app; MCP setup is in
docs/MCP.mdin the repo.
Built With
- atlassian-document-format
- atlassian-forge
- bm25
- confluence
- forge-sql
- forge-ui-kit
- javascript
- jira
- mcp
- node.js
- react
- rovo
- rovo-agent
- teamwork-graph
- tidb