Output Interpretation
This guide explains how to read VulnParse-Pin output artifacts and use them for triage decisions.
Output Artifact Types
VulnParse-Pin can emit:
- JSON (
--output): canonical machine-readable output. - CSV (
--output-csv+ optional--csv-profile): flat row output for analyst workflows and spreadsheet tooling. - Executive markdown (
--output-md): high-level, action-oriented summary. - Technical markdown (
--output-md-technical): detailed tables for practitioners. - RunManifest (
--output-runmanifest): verifiable audit artifact for provenance and integrity.
Webhook Output Interpretation
Webhook delivery is an output-side integration that emits a compact signed event when configured.
Primary operator checks:
- Confirm headers expected by your receiver:
X-VPP-Signature,X-VPP-Timestamp,X-VPP-Nonce,X-VPP-Key-Id,X-VPP-Event. - Validate
oal_filter_appliedandtop_findingsshape in the posted body. - Confirm delivery status in RunManifest decision ledger reason codes.
Reason-code outcomes in RunManifest:
WEBHOOK_EMIT_STARTEDWEBHOOK_EMIT_SUCCEEDEDWEBHOOK_EMIT_FAILEDWEBHOOK_EMIT_SKIPPED_DISABLEDWEBHOOK_EMIT_SKIPPED_POLICYWEBHOOK_EMIT_SPOOLED_FOR_RETRY
Spool fallback behavior:
- If delivery fails and spooling is enabled, payloads are written under
<output_dir>/<spool_subdir>/. - Default subdirectory is
webhook_spool. - Files follow
webhook_<timestamp>_<nonce>.jsonnaming for replay-friendly handling.
JSON Structure: What to Read First
High-value sections for triage:
assets: normalized asset entities.assets[].findings: vulnerability findings attached to assets.derived["Scoring@2.0"]: scoring coverage, score traces, and score distribution details.derived["TopN@1.0"]: ranked assets and high-priority findings.derived["Summary@1.0"]: aggregate operator summary and risk-band distribution with whole-of-CVEs-aware remediation buckets.
Suggested review order:
- Confirm parse/enrichment completion.
- Check top ranked assets/findings from TopN.
- Validate summary totals against expected workload size.
Finding-Level Signals
Common signals used in prioritization include:
- CVE identifiers and references
- KEV presence
- EPSS score context
- Exploit availability indicators
- CVSS vector/base score context
- Derived risk score and risk band
score_tracewhen you need per-CVE contribution detail for audit or analyst review
Use these in combination, not isolation.
CSV Interpretation
CSV is flattened for operational handling and exports. Useful for sorting/filtering at scale.
Profiles:
full(default): complete schema with legacy-compatible column order.analyst: focused on triage/ranking (risk_band,topn_*, union exploit/KEV context, remediation bucket).audit: analyst fields plus scoring traceability (aggregation_mode, contributor counts, top contributor CVEs).
Recommended profile by workflow:
- SOC triage queues: use
analystfor compact, high-signal sorting and ticket creation. - IR or vulnerability engineering deep dives: use
auditwhen you need contributor-level traceability. - Existing integrations expecting legacy headers: keep
fullto avoid breaking downstream parsers.
Example commands:
# Fast analyst triage sheet
vpp -f <input_file> --output-csv triage.csv --csv-profile analyst
# Traceability/evidence sheet for audits and post-incident review
vpp -f <input_file> --output-csv evidence.csv --csv-profile audit
Tips:
- Sort by derived risk-related columns first, not scanner severity alone.
- Use asset context columns to separate internet-facing and internal workflows.
- Treat sentinel values (for unavailable numeric score fields) as missing data, not low risk.
- For whole-of-CVEs scoring visibility, use
auditprofile and inspectaggregated_*andtop_contributor_*fields.
Markdown Reports
Executive Markdown
Designed for leadership-level triage posture:
- Risk-band overview
- Top target assets
- High-priority vulnerability highlights
- Decision Context section that explains ranking basis and tie interpretation
- Data Quality Scorecard section for scored/enriched coverage framing
- Remediation Plan by Time Horizon (24-48h, 7d, 30d)
- Risk Concentration snapshot to show where critical/high exposure is clustered
Use it for meeting preparation and remediation prioritization checkpoints.
Technical Markdown
Designed for engineering and operations:
- Detailed vulnerability and asset breakdowns
- Operational context for investigation
- Data aligned with downstream remediation workflows
- Tie-Break Explainability section for ranking interpretation
- Analyst Caveats section to prevent finding-level versus asset-level misreads
- Trust and Provenance section that points operators to runmanifest verification
Interpretation note:
Finding Agg CVEsis finding-level contributor breadth for the representative row and should not be interpreted as an asset-level aggregate count.
RunManifest Interpretation
RunManifest is the provenance and integrity artifact.
Primary sections to inspect:
- Runtime metadata and input/config hashes
- Pass summaries and metrics
- Enrichment phase summary
- Decision ledger entries (compact or expanded mode)
- Verification block
Best practice:
- Verify after generation.
- Verify again before trust actions (sharing, compliance evidence, or archival).
vpp --verify-runmanifest out.runmanifest.json
Practical Triage Pattern
- Start with
derived["TopN@1.0"]to focus operator effort. - Cross-check high-priority items against KEV/EPSS/exploit signals.
- Inspect
assets[].findings[].score_traceorderived["Scoring@2.0"].scored_findings[*].score_tracefor whole-of-CVEs contribution details. - When TopN scores are tied, expect findings/assets with broader exploit/KEV contributor signals in
score_traceto rank first. - Use technical markdown for analyst handoff.
- Use RunManifest to preserve auditability of decisions.
Tabletop Prioritization Policy (Exploitability vs ACI Chains)
Use this policy when deciding whether a chain-candidate finding should be treated above a currently exploitable public-facing finding.
Methodology principle:
- VulnParse-Pin triage is impact-probability first in real-world terms: prioritize findings with the highest near-term likelihood of meaningful operational impact.
- This is a default operating model, not a one-size-fits-all mandate. Teams should adjust configs and triage policy to fit their environment, risk appetite, regulatory duties, and business goals.
Operational Action Lanes (OAL):
OAL-1 Immediate Exploitable- KEV-listed or public exploit available
- internet/public-facing exposure
-
high derived risk (typically Critical/High band)
-
OAL-2 High-Confidence Chain Path - ACI indicates chain candidates with strong confidence
- chain implies meaningful blast radius (credential theft, privilege expansion, lateral movement)
-
corroborating operational evidence exists (asset criticality, exposure path, adjacent controls posture)
-
OAL-3 Remaining High Risk - high-risk findings without immediate exploitability evidence
- lower-confidence or uncorroborated chain candidates
Default precedence rule:
- A lower-ranked chain-candidate finding does not automatically outrank a currently exploitable, public-facing finding in
OAL-1.
Escalation exception:
- Elevate a chain-candidate finding into
OAL-2above someOAL-1backlog items only when chain confidence and expected impact indicate materially higher near-term compromise potential for the environment.
Evidence fields to review before exception handling:
derived["ACI@1.0"].data.finding_semantics[*].chain_candidatesderived["ACI@1.0"].data.finding_semantics[*].confidencederived["ACI@1.0"].data.metrics.chain_candidates_detectedderived["TopN@1.0"]ranking and reason contextderived["Summary@1.0"]concentration and remediation pressure
Analyst note:
- Treat ACI chain outputs as decision-support signals. They improve triage order but are not proof of exploit success or compromise on their own.
OAL Policy Knobs and Practical Implications
TopN triage_policy exposes OAL behavior as explicit knobs. The defaults are tuned for conservative real-world actionability.
Primary knobs:
oal1_risk_bandsoal1_require_public_exposureoal1_require_exploit_or_kevoal2_risk_bandsoal2_min_aci_confidenceoal2_require_chain_candidateoal2_require_public_exposurepreserve_oal1_precedence
Current default posture highlights:
oal2_min_aci_confidence: 0.8oal2_require_public_exposure: true
Implication profile of this default:
OAL-2precision increases by requiring stronger semantic confidence.- Internal-only chain candidates are less likely to surface as
OAL-2unless public exposure evidence exists. OAL-2queue volume decreases versus looser settings; analyst trust typically increases.OAL-3may contain meaningful internal chain risk that some environments may choose to elevate by policy.
If your environment is east-west dominant and intentionally prioritizes internal blast radius, consider policy tuning (for example setting oal2_require_public_exposure: false) with explicit governance and periodic review.
Context Tag Taxonomy (v1)
Context tags in markdown are lightweight analyst cues derived from canonical TopN/ACI outputs and summary context. They are not independent scoring logic.
v1 tag families:
- Exposure posture
Externally-Facing InferredPublic-Service Ports Inferred-
Exposure Confidence: Low|Medium|High -
Asset pressure
Criticality: Low|Medium|High|ExtremeCritical Findings PresentHigh Findings Present-
Top Risk Concentration -
Lane presence
Contains OAL-1 Findings-
Contains OAL-2 Findings -
OAL-2 lightweight prioritization
OAL-2 Priority: Immediate Analyst ValidationOAL-2 Priority: Validate NextOAL-2 Priority: MonitorOAL-2 Chain-CorroboratedOAL-2 Coexists With OAL-1
OAL-2 lightweight tag behavior:
- Priority tags are based on the highest OAL-2 finding confidence on the asset:
>= 0.90->Immediate Analyst Validation>= 0.80 and < 0.90->Validate Next- otherwise ->
Monitor OAL-2 Chain-Corroboratedappears when at least one OAL-2 finding has non-empty chain candidates.OAL-2 Coexists With OAL-1appears when OAL-2 findings exist on an asset that also has OAL-1 findings.
Rendered example (as it appears in markdown reports):
Context Tags: Externally-Facing Inferred | Public-Service Ports Inferred | Exposure Confidence: High | Criticality: High | Contains OAL-1 Findings | Contains OAL-2 Findings | OAL-2 Priority: Immediate Analyst Validation | OAL-2 Chain-Corroborated | OAL-2 Coexists With OAL-1
OAL-2 tag legend: `Immediate Analyst Validation` = confidence >= 0.90, `Validate Next` = confidence >= 0.80 and < 0.90, `Monitor` = lower-confidence OAL-2.
Finding-Text Inference Hardening (v1)
finding_text_contains_any is now tuned for conservative behavior and reproducible analyst traceability.
Hardening principles:
- Bounded monotonicity with diminishing returns
- Additional text matches can increase evidence, but each incremental hit contributes less than earlier hits.
-
Weighted evidence is capped by
finding_text_max_weighted_hits. -
Source-quality weighting
- Matches in finding title are weighted highest, description next, plugin output lowest.
-
Controlled with:
finding_text_title_weightfinding_text_description_weightfinding_text_plugin_output_weight
-
Negative constraints and conflict handling
- Contradictory lexical cues (for example internal-only language) reduce inferred finding-text weight.
-
Controlled with:
finding_text_conflict_tokensfinding_text_conflict_penalty
-
Explainability and reproducibility
- TopN evidence includes deterministic trace fragments for finding-text rules:
- total token hits
- source-specific hit counts
- weighted and bounded evidence values
- conflict-token hits
- final applied rule weight
Default conservative starter profile:
finding_text_min_token_matches: 2finding_text_title_weight: 3finding_text_description_weight: 2finding_text_plugin_output_weight: 1finding_text_max_weighted_hits: 4finding_text_conflict_penalty: 2finding_text_diminishing_factors: [1.0, 0.6, 0.4]