Skip to content

Remediation policy and SLAs

The remediation windows, grace allowances, triage threshold and severity bands your organisation is graded against, the five published standards you can adopt, and how a custom policy is saved.

Updated 02 Nov 2026Checked against vdb-site@1a06d67, saas@50cedf3, website@ad775f3

The remediation policy (stored as a triage policy) says how long a finding of each severity may stay open, and how long it may wait for a triage decision. Set it on Configuration › Remediation Policy (/resolve/triage-policy).

An organisation with no policy is not graded leniently: it is graded as having none, and every report below says so.

What grades against it

Report Resolve Platform page Uses
Exposure and remediation performance /resolve/exposure MTTR and overdue findings against the windows
PCI DSS /resolve/pci-dss Requirements 6.3.1 and 11.3.1 cite the windows and the triage threshold
ISO/IEC 27001:2022 /resolve/iso-27001 Control A.8.8 quotes them as the vulnerability management SLA
EU Cyber Resilience Act /resolve/eu-cra Remediation cadence
Campaigns /resolve/campaigns A campaign deadline can be derived from the policy (deadlineSource: policy)

Fields

Field Resolve Platform label Range Meaning
criticalRemediationDays, highRemediationDays, mediumRemediationDays, lowRemediationDays Remediation window 1 to 3650 days How long a finding of that severity may stay open
criticalThresholdAllowance, highThresholdAllowance, mediumThresholdAllowance, lowThresholdAllowance Grace allowance 0 to 3650 days Extra days before the finding counts as breached. 0 holds the window exactly.
triageThresholdDays Triage threshold 1 to 3650 days How long a finding may wait for a triage decision
exposureWindowDays Exposure window 1 to 3650 days The period the exposure views measure over
threatWindowDays Threat window 1 to 3650 days The period the threat views measure over
severityHighThreshold, severityMediumThreshold, severityLowThreshold High, Medium, Low at or above CVSS 0 to 10, strictly increasing low < medium < high Severity band cut points. Critical starts at 9.0.
name, description name defaults to “Remediation policy”

The console’s If a finding opens today panel shows the breach date for each band and the triage-by date under the numbers in the editor.

Errors and warnings

A save with any of these is 400 {"error":"invalid policy","errors":[...]}: a day count outside its range, a severity threshold outside 0 to 10, or thresholds not increasing.

These are warnings, returned in warnings with a successful save, because the policy is yours to declare:

  • “remediation windows do not widen as severity falls”: a critical window longer than high, high longer than medium, or medium longer than low. Usually two transposed fields.
  • “the triage threshold is longer than the critical remediation window”: a critical finding can breach its window before it is due to be triaged.

Published standards

Five standards are available to adopt as they are.

Standard Critical High Medium Low Grace (C/H/M/L) Triage Exposure Threat
Baseline CVSS 30 90 180 365 30 / 90 / 180 / 365 30 2 14
NIST SP 800-40 30 30 90 120 30 / 30 / 90 / 180 1 2 14
FedRAMP 30 30 90 180 30 / 30 / 90 / 180 14 30 14
Essential 8 2 14 14 14 2 / 14 / 60 / 90 1 2 14
CISA BOD 19-02 15 15 30 30 15 / 15 / 30 / 30 1 15 15

All days. Every standard uses severity bands high 8.9, medium 6.9, low 4.0.

Saving a custom policy

A custom save never edits a policy in place. It writes a new policy row and points your organisation at it. The previous row stays, because past scans record which policy was in force and past compliance reports cited it; editing it would restate history. The published standards are never written.

One policy is in force per organisation. A save or an adopt replaces the link.

API

Method Path Body Returns
GET /v1/triage-policy {policy, linked, presets, warnings}. policy is null and linked is false when none is set. presets is the published standards.
PUT /v1/triage-policy {adoptUuid} to adopt a standard or one of your earlier policies, or the fields above to save a custom one {policy, linked: true, warnings}
Status Cause
400 invalid body, or invalid policy with errors
401 not signed in
404 policy not found adoptUuid is not a published standard or a policy of yours
409 your organisation has no scan data yet. Run a scan first.
API=https://www.vulnetix.com/api/site/v1
AUTH="Authorization: ApiKey $VULNETIX_ORG_ID:$VULNETIX_API_KEY"

# Adopt NIST SP 800-40
NIST=$(curl -sS "$API/triage-policy" -H "$AUTH" | jq -r '.presets[] | select(.name=="NIST SP 800-40") | .uuid')
curl -sS -X PUT "$API/triage-policy" -H "$AUTH" -H 'Content-Type: application/json' -d "{\"adoptUuid\":\"$NIST\"}"

# Or save your own
curl -sS -X PUT "$API/triage-policy" -H "$AUTH" -H 'Content-Type: application/json' -d '{
  "name":"Acme SLA",
  "criticalRemediationDays":7,"highRemediationDays":30,"mediumRemediationDays":90,"lowRemediationDays":180,
  "criticalThresholdAllowance":0,"highThresholdAllowance":7,"mediumThresholdAllowance":14,"lowThresholdAllowance":30,
  "triageThresholdDays":3,"exposureWindowDays":7,"threatWindowDays":14,
  "severityHighThreshold":7.0,"severityMediumThreshold":4.0,"severityLowThreshold":0.1}'
Edit this pageSources: vdb-site/api/internal/handler/triage_policy.go, saas/prisma/models/policy.prisma, saas/prisma/seed.ts, website/src/pages/resolve/triage-policy.vue
esc
↑ ↓ move↵ openSearches in your browser. A key like autonomy.max or a code like threshold_required jumps straight to it.