A scanner alert is not yet an engineering task. A penetration-test observation is not automatically a unique vulnerability. A dependency advisory does not prove that the affected code is present, reachable or exploitable in the product that your customers use. Between discovery and remediation sits triage: the work of turning evidence from different tools and tests into a bounded, reviewable decision.

That middle layer is easy to underestimate when buying a service. Providers often promise fewer false positives or a cleaner dashboard. The buyer needs a stricter result: every submitted record should either become an engineering-ready finding, remain explicitly under investigation, or receive another named disposition supported by evidence. The service must preserve what it does not know. It must also keep the affected asset instances visible when several scanner rows describe one underlying weakness.

This guide explains how to contract for that result across scanner, SAST, SCA and penetration-test findings. It focuses on intake evidence, duplicate handling, version and reachability analysis, VEX limits, dispositions, service clocks, handoff and pilot acceptance. It complements the broader guides to risk-based vulnerability prioritization and vulnerability management as a service. The question here is narrower: what should a specialist triage desk actually decide before engineering is asked to act?

Buy a decision function, not a filtering promise

Triage has three outputs. First, it establishes identity: what weakness or vulnerable component is being described, and which concrete assets, builds, branches or product versions are implicated. Second, it establishes status: confirmed, false positive, duplicate, under investigation, accepted risk or another controlled disposition. Third, it prepares action: who owns the next step, what evidence supports it, what remains uncertain and which clock applies.

Those outputs should be separated. A duplicate can still represent a new affected host. A true dependency match can remain inconclusive as to exploitability. A confirmed weakness can be accepted for a limited period by an authorized risk owner. A false positive means the alert's technical claim is wrong for the evaluated instance; it does not mean that the organization chose not to fix a real weakness.

Avoid a contract that measures success mainly by the percentage of rows removed. A provider can make a queue smaller by merging unlike cases, suppressing uncertainty or inheriting an old dismissal too broadly. Useful triage reduces avoidable engineering work while retaining the evidence needed to reverse a decision when a build, asset or threat signal changes.

Define the intake contract before the service clock starts

The provider cannot validate evidence it never receives. Define a minimum intake record for each source type and a reject-or-enrich path for incomplete records. Preserve the raw source payload or a stable reference to it before normalization; otherwise later reviewers cannot determine whether a field came from the scanner, the provider or the customer.

Scroll sideways to compare

InputMinimum evidence for triageCommon gapRequired handling
Infrastructure or web scannerScanner and rule version, scan target, observation time, authenticated state, request or probe evidence, network vantage pointHostname has no asset owner; banner or version is inferredKeep the raw observation, identify the concrete asset instance and mark unverified assumptions
SASTRepository, immutable revision, branch, rule identifier, source and sink or triggering location, build mode, analysis warningsFinding points to a line but omits the call path or analyzed revisionReconstruct the path where possible; otherwise return an evidence request or inconclusive result
SCA or container scanArtifact or image digest, package identity and source, resolved version, dependency path, operating-system vendor, manifest and runtime scopeOnly an upstream version comparison is providedCheck the shipped artifact and vendor advisory before deciding applicability
Penetration testAuthorized target, affected role, preconditions, reproduction narrative, evidence, tester conclusion and test dateReport title is copied without scenario or affected instancePreserve the tester's finding identity and request the missing evidence rather than reclassifying from the title

The intake clock and the decision clock should be distinct. Intake can acknowledge receipt and identify missing fields. A substantive triage deadline should start only when the agreed evidence package is available, while the provider remains accountable for promptly requesting omissions. Otherwise the customer can appear to receive fast decisions only because incomplete records are closed as noise, or the provider can hide delay indefinitely behind “awaiting information.”

Evidence path through a finding triage service
  1. ReceivePreserve the source record, scan context, affected instance and evidence completeness state
  2. CorrelateLink related observations to a canonical issue without deleting asset, build or branch instances
  3. EvaluateTest applicability, version state, reachability, preconditions and compensating controls
  4. DisposeRecord a controlled status, rationale, confidence, owner, expiry or next evidence request
  5. Hand offDeliver an engineering-ready task or escalate to authorized technical validation

Deduplicate the cause while retaining every affected instance

Deduplication needs two layers. The canonical issue represents the underlying weakness or vulnerable component. Instance records represent where it occurs: a host, endpoint, repository revision, artifact digest, package path, tenant configuration or tester scenario. Many source rows may map to one canonical issue, but their instances should not disappear.

This matters operationally. Ten servers flagged for the same package vulnerability may share one remediation plan, yet one is internet-facing, one runs a vendor build containing a backported fix, and eight are reachable only from a management network. A SAST tool may group several data-flow paths that reach the same unsafe sink; that grouping helps show the vulnerability's scope, but each affected branch and analyzed configuration still matters. GitHub's own code-scanning model distinguishes related paths, branches and analysis configurations rather than treating every row as interchangeable.

Define the match keys for each source. For SCA they may include the vulnerability identifier, ecosystem, package, vendor build, artifact digest and dependency path. For SAST they may include the rule, source/sink fingerprint, repository and revision lineage. For infrastructure they may include the plugin, service fingerprint, asset identifier and relevant configuration. Fuzzy title matching can propose a relationship; it should not silently merge records.

The service should also preserve provenance. Keep all source identifiers, first-seen and last-seen times, scanner severities, raw statuses and the reason for correlation. If a canonical issue closes, the system must show whether every instance was fixed, removed, accepted or merely stopped appearing. A new instance can inherit useful analysis, but the inherited decision must be rechecked against its own version, build and exposure.

Prove applicability before deciding exploitability

Applicability asks whether the claim refers to the thing you actually run. For a package vulnerability, confirm the product, package origin, build, architecture and vendor support stream. Comparing an upstream version string alone can be wrong. Red Hat documents that it backports security fixes into older package versions and publishes advisories and machine-readable data so tools can determine status independently of the upstream number. The practical rule is broader than one vendor: use the authoritative advisory for the distributed build, not a generic “version less than” rule as the final verdict.

For source findings, applicability means that the analyzed code and rule correspond to an intended build. For a pentest, it means the target, role and behavior belong to the agreed environment. If the provider cannot tie an alert to an immutable revision, image digest, installed package release or concrete asset, “affected” may be premature.

Exploitability is a separate question. A component can be present and vulnerable in principle while the vulnerable function is not on an executable path. Conversely, a package labeled as a development dependency may still be copied into a production image or used in a build step where compromise matters. Reachability evidence should therefore name the method: static call graph, runtime trace, configuration review, network-path validation, manual code trace or authorized reproduction. Each method has blind spots. “No reachable path found” is bounded by the analyzed build and method; it is not proof that no path exists.

CVSS version 4 helps preserve distinctions when used fully. Base metrics describe intrinsic severity; Threat and Environmental metrics can reflect time-varying threat information and the consumer's environment; Supplemental metrics add context such as response effort and provider urgency without changing the final score. Record the vector and which metric groups were assessed. A bare base score should not be presented as a complete local risk decision. EPSS is another input: it estimates the probability of exploitation in the next 30 days for vulnerabilities it scores. No EPSS record, including for a finding without a CVE, is missing evidence rather than a probability of zero. KEV membership is evidence of known exploitation for the listed CVE, while absence from the catalog is not evidence of safety.

Use VEX as attributed context, not automatic truth

VEX can carry a supplier's status for a vulnerability in identified product versions: affected, fixed, not affected or under investigation. OpenVEX requires a not-affected statement to include either a machine-readable justification or a free-form impact statement, and it emphasizes product identification and timestamps. This makes VEX valuable for scalable exchange and for preventing the same supplier analysis from being repeated by every customer.

It does not remove the buyer's validation boundary. The assertion applies only to the products and versions it identifies, at the stated time, under its rationale. A broad product family name may fail to match the deployed artifact. A “vulnerable code not in execute path” justification may depend on default configuration that the customer changed. If a protection is configurable, user-disableable or external to the product, it does not automatically satisfy OpenVEX's inline_mitigations_already_exist justification. A supplier can also leave the status under investigation.

The triage contract should specify trusted issuers, identifier matching, signature or provenance checks, freshness, conflict handling and revalidation triggers. When a VEX assertion conflicts with observed behavior, the instance stays open and the conflict is escalated. Do not translate every not-affected assertion into “false positive”: the scanner may have correctly identified the component, while the supplier supplied additional applicability or exploitability context.

Keep false positive, inconclusive and accepted risk separate

A controlled vocabulary prevents business decisions from being disguised as technical conclusions. It should include at least the following distinctions.

Scroll sideways to compare

DispositionMeaningEvidence neededWhat happens next
ConfirmedThe weakness applies to the identified instance with stated preconditionsReproduction, trace, configuration or authoritative applicability evidenceEngineering task with severity rationale, owner and acceptance test
False positiveThe source claim is technically inaccurate for this instanceRule mismatch, incorrect fingerprint, vendor fix evidence, or analysis showing the alleged path cannot existSuppress only on a scoped fingerprint; retain rationale and reopen triggers
DuplicateAnother canonical issue covers the same underlying weaknessExplicit link plus match rationaleKeep the instance and source evidence attached to the canonical issue
InconclusiveAvailable evidence cannot establish or refute the claimMissing build, access, configuration, path or reproducibility evidenceName the evidence request, owner and review deadline; do not count as safe
Accepted riskThe weakness is real and an authorized owner accepts residual riskConfirmed technical record, business rationale, approver, compensating controls and expiryKeep visible until expiry or trigger; this is not a technical dismissal
Fixed or mitigatedA change removed the cause, or a control reduced the tested pathChange identity and retest or control-validation evidenceRecord the tested conditions; keep mitigation distinct from removal of the cause

GitHub's schemas illustrate why the distinctions matter: Dependabot represents inaccurate, not used and tolerable risk as separate dismissal reasons, and it keeps inconclusive or unknown dependency relationships distinct from direct and transitive ones. GitHub also supports delegated dismissal so one role can request closure and another can approve or deny it. A service need not copy those exact labels, but it should preserve the same governance property: the person or automation proposing a disposition should not silently grant business risk acceptance.

Make service clocks reflect the work

One “time to close” number hides different obligations. Define separate clocks for receipt acknowledgement, evidence-completeness review, urgent escalation, substantive disposition, customer response to an information request, engineering handoff and reconsideration of challenged decisions. State the calendar and coverage window for each. The buyer sets the actual targets according to operating risk and staffing; public standards do not provide a universal triage SLA.

Pause rules must be narrow. The substantive clock may pause when a specifically named customer artifact is missing, but the record should show who requested it, when and why it is necessary. The clock should not pause merely because the provider is waiting for an internal reviewer. Urgent escalation should be based on agreed triggers such as credible active exploitation, a reachable high-impact path or a pentest finding with immediate material consequence; it should not wait for every enrichment field.

Measure age by state and source, not only averages. Averages can hide a small group of old, difficult findings. Useful operational views show untriaged records, inconclusive items awaiting each party, disputed dispositions, expired acceptances, reopened decisions and instance coverage. Quality sampling belongs beside speed: a fast false-positive decision that fails review is not successful triage.

Require an engineering-ready handoff

The handoff is the product the buyer should accept. It should identify the canonical issue and every relevant instance; affected revision, artifact, package or asset; the violated security condition; evidence and reproduction boundary; prerequisites; likely impact; severity and priority rationale; source provenance; disposition confidence; remediation direction; owner; deadline; and the test that will demonstrate acceptance.

Write the remediation direction at the level of the cause. “Upgrade the library” is incomplete when no compatible fixed build exists. “Sanitize input” is incomplete when the developer needs to know which trust boundary and sink are involved. The triager need not design the patch, but should give engineering enough context to choose one without repeating the investigation. A useful pentest report demonstrates the evidence density expected for technical findings; scanner and code-analysis handoffs also need immutable build context.

Closure should point back to this acceptance test. A scanner no longer detecting a row can mean a fix, a changed rule, a failed scan, a removed target or a new exclusion. The validation record should identify the change and repeat the relevant scenario. The guide to penetration-test remediation validation explains how to keep a fix, a mitigation and an unverified disappearance distinct.

Accept the service through a representative pilot

Run the pilot on a bounded but mixed corpus: scanner observations from several asset types, SAST paths, dependency findings, a small set of known duplicates, records with deliberately incomplete evidence and a few previously resolved cases. Include real organizational context under appropriate confidentiality terms. A sanitized demo queue cannot show whether the provider can map your vendor packages, repositories, asset owners and approval paths.

Consider a clearly fictional buyer, Northbridge Market. Its pilot includes one genuine authorization flaw already validated in a pentest, the same operating-system CVE reported on four servers, a SAST path from a retired branch, and an SCA alert for a vendor package with a backported fix. A useful provider keeps the four server instances, recognizes the vendor build, refuses to call the missing SAST build context safe, and hands the authorization flaw to the owning team with the original role and acceptance scenario intact. Simply reducing seven rows to two would not demonstrate those decisions.

Agree the acceptance set before results are revealed. The buyer's reviewers should establish a reference disposition and evidence rationale for sampled records, while allowing documented disagreement where evidence supports more than one conclusion. Score the provider on correctness of the status, preservation of instances, evidence traceability, appropriate uncertainty, usefulness of handoffs, compliance with escalation paths and the ability to export the complete record. Do not score the pilot by how many findings the provider deletes.

Test adverse cases. Give two scanner rows that look alike but affect different vendor builds; a VEX assertion for a neighboring product version; a SAST path missing the build configuration; a real weakness whose risk has been accepted; and one canonical issue across differently exposed assets. Challenge several decisions and verify that revisions leave an audit trail. Re-run part of the corpus to see whether previous analysis is reused narrowly rather than inherited without checking.

The pilot contract should state the sample, permitted access, success thresholds, dispute process, data return and deletion, exit format and the conditions for production rollout. If the provider uses automated or AI-assisted classification, require the same evidence and reviewability as for a human decision, plus disclosure of which customer data enters the system and how a human can reverse the output.

Trigger technical validation when evidence cannot carry the decision

Desk triage has a limit. Trigger manual code review or an authorized penetration test when the decision depends on a runtime precondition the available evidence cannot establish, when two sources conflict, when a claimed mitigation needs bypass testing, when a business-logic or authorization path is involved, or when a potentially material finding remains inconclusive after the agreed evidence requests.

A pentest is also a useful pilot control: seed the triage corpus with findings already validated through independent manual testing, then check whether the service preserves their prerequisites, affected instances and remediation tests. It should not be used to inflate the service into continuous testing it does not perform. The source-code security audit guide explains the build and path evidence needed for code findings, while an agreed penetration-testing service can validate runtime behavior within written scope and authorization.

Pentest.red can help when the unresolved decision needs independent technical validation rather than another dashboard classification. Use the scope planner to describe the target, build, roles, existing finding evidence, permitted methods and the decision the test must support. The deliverable should remain bounded: evidence about the tested instance and scenario, not a guarantee that every weakness has been found.

The best triage service does not make uncertainty disappear. It makes each decision inspectable: what was observed, which instance it applies to, what evidence changed the status, who can approve residual risk, when the decision expires and what engineering must prove to close it. That is the contract that turns noisy security findings into work a development team can trust.

PENTEST.RED

Discuss pentest scope and pricing

We start by agreeing on systems, access, constraints and the expected evidence.

Prepare your testing scope

Based on in-depth research, edited for clarity and practical use.

PENTEST.RED / RED JOURNAL