ZeroRoot Docs

Findings

Submit, triage, and export security findings, the structured output of every Gibson mission.

A finding is the unit of work output that matters. Your agents can do recon, triage, exploitation, or monitoring. In every case, the durable record is a list of findings. Each finding states what the agent discovered, where, with what evidence, and how serious it is.

This page covers the full finding lifecycle: how an agent submits one, what appears in the dashboard, how your team triages, and how to export.

What a finding contains

Every finding has the same shape:

FieldRequiredNotes
TitleyesOne-line description (e.g. "Exposed admin endpoint /admin/console").
Severityyescritical, high, medium, low, info. Drives sorting and SLA timers.
Target referenceyesThe asset the finding applies to. Usually populated automatically from the mission's target.
DescriptionyesMarkdown. The full write-up, what was found, why it matters, suggested remediation.
EvidencerecommendedStructured payload (request/response excerpts, config snippets, traces). Stored verbatim.
TagsoptionalFree-form labels, e.g. pci, internal, bug-bounty. Used for filtering.
CWE / CVE referencesoptionalStandard identifiers Gibson links to upstream advisories.
Confidenceoptionalconfirmed, likely, tentative. Triage uses this to prioritize.

Submit a finding from an agent

err := h.SubmitFinding(ctx, agent.Finding{
    Title:       "Exposed admin endpoint /admin/console",
    Severity:    agent.SeverityHigh,
    TargetRef:   h.Target().Id,
    Description: "The /admin/console route is reachable without authentication...",
    Evidence: agent.Evidence{
        Request:  rawReq,
        Response: rawResp,
    },
    Tags: []string{"recon", "auth-bypass"},
})

That is all. Gibson then:

  1. Persists the finding scoped to the current mission.
  2. Links it to your agent execution and the mission run (so the dashboard can show provenance).
  3. Stores it in the knowledge graph as a :finding node, linked through AFFECTS to the host, service, or endpoint it targets.
  4. Emits a finding.submitted event on the mission's stream.
  5. Notifies any configured alerting destinations (Slack, email, webhook) based on the severity policy in your tenant's settings.

You can also call h.GetFindings(ctx, ...) from inside an agent. This call retrieves findings already submitted in the current mission. It is useful for triage agents that aggregate or de-duplicate.

Triage in the dashboard

Open Missions → [your mission] → Findings, or the global app.zeroroot.ai/dashboard/findings page for a tenant-wide view.

Each finding row shows:

  • title, severity, confidence
  • target it affects
  • mission and agent that produced it
  • timestamp and any tags

Click a row to open the detail page, where you can:

ActionWhat it does
Change statusNew → Triaging → Confirmed → Remediated → Closed (or False positive). The state machine drives SLAs.
ReassignMove the finding to a teammate or rotation.
Add a commentThreaded discussion. Comments are part of the audit log.
Link related findingsGroup duplicates or cluster a campaign.
Attach evidenceAdd screenshots, log excerpts, or reproduction steps post-hoc.
Replay the producing missionJump to the mission detail page and replay from the checkpoint just before this finding was submitted. Use it to verify a fix or to try a different prompt.

SLA and severity

Severity drives default SLA timers visible on the finding detail page:

SeverityDefault SLA
critical24 hours
high7 days
medium30 days
low90 days
infono SLA

Tenant admins can override these defaults under Settings → Findings policy.

The findings list supports filters by:

  • severity, status, confidence
  • target, mission, agent
  • tag and CWE/CVE
  • date range
  • free-text search across title and description

Save a filter as a named view (e.g. "Open critical web findings") and pin it to your sidebar.

Export

Click Export on the findings list to download the current filtered view. There are three formats:

FormatUse it for
JSONProgrammatic intake into a SIEM / GRC tool.
CSVSpreadsheet review.
SARIFGitHub / IDE integration. PR comment format.

Exports respect your filter. You get exactly the rows you see. JSON and SARIF include evidence payloads. CSV truncates evidence to a summary.

Webhooks and integrations

Configure outbound destinations under Settings → Integrations:

DestinationTrigger
SlackPost a message on every finding above a chosen severity.
EmailSend a digest (real-time, hourly, or daily) to a distribution list.
PagerDutyOpen an incident on critical findings.
Generic webhookPOST a JSON payload, same shape as the JSON export, one finding per request.
Jira / Linear / GitHub IssuesAuto-create an issue with title + severity + a link back to the finding.

Each destination has its own filter. You only get the noise you asked for.

Relationship to the knowledge graph

Every finding becomes a :finding node in your tenant's knowledge graph (see Knowledge graph), linked to:

  • the target asset it affects (:host, :service, :endpoint, …)
  • the agent execution that produced it (provenance)
  • any attack patterns or techniques it instantiates
  • similar prior findings via embedding similarity

These links let a future triage agent call FindSimilarFindings(...) and learn from history. You do not wire anything yourself.

  • Your First Agent: where SubmitFinding fits in agent code.
  • Missions: finding.submitted in the event stream.
  • Knowledge graph: how Gibson links findings to hosts, services, and attack patterns.
  • Taxonomy: the standard finding categories that ship with Gibson.
  • Ontology: map custom finding categories into CWE, SOC 2, MITRE ATT&CK, and other industry vocab.

On this page