DVSentry Documentation API referenceOpen the app

Reports and findings

Every scan in every pillar produces a named Security Report. This page explains how to read a report, work on findings, export evidence and use AI to triage and fix.

The Reports list

Results → Reports lists every report with its pillar, asset, state and time. A running report shows its current stage, each scanner's state and the elapsed time, and refreshes itself. States are explained in Repository scans; the same words are used in every pillar.

A partial report means some checks did not complete. The coverage section names each one and the reason (timed out, not applicable, unavailable, unsupported, prerequisite missing). Missing coverage is never shown as clean.

Report tabs

TabWhat it shows
OverviewRisk score, severity counts, scanner coverage, top findings
VulnerabilitiesEvery finding, filterable by severity, capability/scanner, status and assignee
ExceptionsAccepted risks and suppressions with owner, reason and expiry
Attack PathsHow findings chain toward something valuable
TopologyCloud reports: the exposure map
Threat ModelRepository reports: components, trust boundaries and threats (Mermaid diagram)
SBOMComponents and licences; export as CycloneDX or SPDX
SecretsSecret findings by type, location and confidence (never the value), with an incident and rotation tracker
PolicyWhether the report passes your policies and which rule failed
Compliance EvidenceFindings mapped to OWASP, CWE, NIST, SOC 2, ISO 27001 and PCI DSS controls (supporting evidence, never a certification)
Developer, ExecutiveTwo summaries for two audiences
AI RemediationAI triage and the AI remediation plan (below)
Security RegressionWhat is new, fixed or reopened since the previous report of the same asset
Release GateThe release decision against an approved baseline (Policies and gates)

Resilience reports have their own tabs: Test Run, Application Behaviour and Signed Evidence.

A finding

A finding opens to its location (file and line, URL, cloud resource), evidence, severity, scanner and rule, exploit context (CISA KEV and EPSS for dependencies, reachability level), and fix guidance. The same issue found by two scanners is merged into one finding with "N locations agree".

Finding states

StateSet byMeaning
openScan or personNeeds work
fixedPerson (and confirmed by the next scan)Marked fixed
reopenedComputed, never storedMarked fixed, but the latest scan found it again
accepted_risk, suppressedOnly through an approved exceptionGoverned decisions with owner, justification, expiry and approval history

Example: assign a finding and mark it fixed through the API (scope findings:write):

curl -sS -X PATCH "$DVSENTRY_URL/v1/security-reports/$REPORT_ID/findings/$DEDUPE_KEY" \
  -H "Authorization: Bearer $DVSENTRY_TOKEN" -H "Content-Type: application/json" \
  -d '{"workflow_status":"fixed","assignee":"dev@acme.example","workflow_note":"Bumped lodash to 4.17.21"}'

Setting accepted_risk or suppressed directly answers 422: request an exception instead.

Security Regression

The regression tab compares a report with the previous completed report of the same asset (same repository and branch, target or cloud account): new, fixed, reopened and unchanged findings. When nothing is new it says "no new findings since scan X" and names that scan, rather than showing an empty table. API: GET /v1/security-reports/{id}/regression and GET /v1/repositories/{id}/regression.

AI triage and AI remediation

Two different AI helpers live on the AI Remediation tab. They are coloured differently on screen (triage amber, remediation green) so they are never confused.

AI triageAI remediation plan
Question it answers"Is this finding likely real?""How do I fix these findings?"
InputMetadata only, up to 40 open code, secret and IaC findings: rule id, a short title, severity, risk score, how many locations agree, path class (production, test, fixture...) and file extension. Never code, a file path, a description or a secret valueFinding metadata and normalized evidence, never your full source
OutputPer finding: likely_true_positive, likely_false_positive or needs_review, with confidence, reason and next stepPrioritised, step-by-step fix guidance
EffectAdvisory only: never changes a finding, its state, a score or a gate. A production secret is never called a false positiveA suggestion to review, never an automatic change

Both use the same provider choice:

Risk inbox

Results → Risk inbox (Governance plan and above) is one prioritised list of open issues across all pillars plus active cloud threat detections. Each row has an owner (the assignee, else the asset owner an Admin named, else the repository's team) and a due date from the remediation SLA. It is a working view; it never changes report scores or gates.

Exports

From a report's export menu, or through the API (scope reports:export):

Format (format=)What you get
jsonThe full report with findings
csvOne row per finding
sarifSARIF 2.1 for code scanning tools
gitlab-sastGitLab SAST report JSON
executive, executive-mdExecutive summary (PDF/Word for cloud reports, Markdown)
compliance, compliance-md, compliance-crosswalkCompliance evidence
tickets-csv, tickets-jsonOne ticket per finding for your tracker
curl -sS -o report.sarif -H "Authorization: Bearer $DVSENTRY_TOKEN" \
  "$DVSENTRY_URL/v1/security-reports/$REPORT_ID/export?format=sarif"
curl -sS -o sbom.cdx.json -H "Authorization: Bearer $DVSENTRY_TOKEN" \
  "$DVSENTRY_URL/v1/security-reports/$REPORT_ID/sbom?format=cyclonedx"

Signed evidence. GET /v1/security-reports/{id}/signed-evidence and the evidence pack are signed with DVSentry's Ed25519 key, so an auditor can verify them without trusting DVSentry. Large exports run as export jobs (POST /v1/export-jobs) and are downloaded from artifacts.

Notifications about reports

Finished scans, new or reopened findings and blocked release gates can be sent to email, Slack, Teams or a signed webhook: see Notifications and integrations.

Something missing or unclear? Tell us with Feedback in the app.