Inspiration

Security scanners are great at finding problems and terrible at telling you which one matters. A single scan can drop hundreds of findings into a backlog, and a human still answers the same questions for every one. Is it real? How bad is it here, on this service? Who owns the code? Was it already fixed somewhere else? That work is slow and repetitive, so real risk sits unattended while people drown in low-value noise.

The Codegeist theme put it perfectly: AI can think, but knowing what to do takes context. A general assistant pointed at a finding will happily invent a CVSS score or an owner, and a security team cannot accept that. So we built a triage copilot whose entire design is about supplying real context and refusing to go beyond it.

What it does

Verdict turns a noisy pile of security findings into ranked, routed, and explained work, right inside Jira.

When a finding lands as a Jira issue, Verdict runs a fixed pipeline:

  • Reads the finding and gathers context from its fields.
  • Enriches the CVE with live threat intelligence: the NVD description and CVSS, the EPSS exploitation probability, and whether CISA lists it as Known Exploited. Every fact keeps its source link.
  • Scores risk with a deterministic model (severity or CVSS, times a service-criticality tier, times an exposure factor) and sets a priority. A Known Exploited hit forces the priority to Highest.
  • Searches Jira for the same CVE elsewhere, links duplicates, and downgrades a finding that was already fixed.
  • Resolves the service owner from the Bitbucket CODEOWNERS file and assigns the issue.
  • Lets Atlassian Intelligence write the explanation as clear prose with a short Recommendations section.

You can also ask the Rovo agent to triage a finding in plain language. It explains the same grounded decision and cites its sources.

The core idea: the decision is code, the prose is AI, nothing is invented

Verdict is a grounded security risk-reasoning agent, not an AI that summarises a ticket. The risk decision is made by deterministic code over retrieved facts. Atlassian Intelligence is only ever asked to phrase facts it was handed, and a grounding guard drops any sentence that names a CVE or score it was not given. When the data needed to prioritise is missing, Verdict escalates to a human instead of guessing. That is the one promise a security team cannot get from a generic assistant: it never asserts what it cannot cite.

How i built it

Verdict is a single Forge app. A product trigger fires on every new finding and runs the pipeline through a set of small, testable modules: config, Jira access, threat-intel fetch, the risk model, context assembly, Bitbucket owner lookup, ADF formatting, the LLM narrator, the grounding guard, and an orchestrator that ties them together. Atlassian Intelligence runs through the Forge LLMs API, so there is no external model or key. The issue panel is built in UI Kit, storage uses Forge KVS for a per-issue audit trail, and egress is scoped to NVD, CISA, EPSS, and Bitbucket. The same grounded context powers both the automatic trigger and the Rovo agent, so the two surfaces share one brain.

Challenges i ran into

Rovo was not available on a free, gmail-registered developer org, so i moved the app to a site created with a business email. Bitbucket removed app passwords and gates workspace tokens behind a paid plan, so i made the demo repos public and read CODEOWNERS anonymously. The Forge LLM model list is permission-gated, so i tried models in order until one is allowed. The biggest one was trust: keeping the AI from inventing details, which i solved with the deterministic decision, the grounding guard, and a deterministic fallback that always posts a verdict even if the model is unavailable.

What i learned

Grounding is a system design, not a prompt. The reliable path was to let code decide and fetch, and let the model only phrase. Treating "insufficient context, needs a human" as a first-class outcome made the whole thing trustworthy.

What's next

Confluence runbooks linked from each verdict, more scanner formats, SLA-aware prioritisation, and deeper ownership through the Teamwork Graph.

Built With

Share this project:

Updates

Submission history