From paste to tier — every step, transparently.
VulnRap doesn't score reports with a single black-box model. It runs them through a small pipeline of focused engines, each one cheap to explain and cheap to audit. Pick a sample below and hit Play to watch each step light up.

Critical RCE in api/login. The endpoint suffers from a classic deserialization flaw which a sophisticated attacker could leverage to execute arbitrary code on the server, leading to a complete compromise of the underlying system. CVSS 9.8.
Each step, in plain English
Every report is run through a redaction pass before it reaches any engine, model, or storage layer. Emails, IPs, JWTs, AWS keys, GitHub tokens, and a curated list of secret-shaped strings are replaced with structural placeholders like ⟨email⟩ or ⟨jwt⟩.
The placeholders preserve shape so downstream engines can still tell that "a token was here" without ever seeing the token. This is also what we hash and store — the original text is dropped on the floor.
A pattern bank of hype phrases ("sophisticated attacker", "complete compromise", "leverages a classic flaw"), hedge-stacking, and pacing markers feeds a small classifier that scores how much the text reads like a generated security writeup vs. a human one.
High score here is suspicious but never sufficient — plenty of real engineers write in formal English. It only earns weight when the next two engines agree something is off.
The substance engine is a structural reader: it counts code fences, HTTP request lines, stack frames, file paths with line numbers, version ranges, and CVE/CWE/CVSS strings — and divides by total tokens to get a density score.
Low density on a long report is the single strongest "this is hot air" signal we have. A short report with high density is fine.
For each CWE the reporter claims (or that we infer), this engine checks whether the surrounding evidence makes sense for that weakness class. CWE-502 (deserialization) without a sink, payload, or class name is incoherent. CWE-601 (open redirect) with a curl repro and observed 302 is coherent.
Each CWE family has its own checklist of "what should be present if this is real." Mismatches dock the score; clean matches reinforce it.
AVRI splits the report into assertions ("RCE", "any user", "complete compromise") and reproductions (commands, requests, observed responses, version constraints). The gap between the two is the AVRI score.
A wide gap (lots of claims, little repro) is the classic shape of generated reports. A narrow gap is a healthy "I claim X and here's exactly how to see X."
The three weighted engine scores (AI Authorship 5, Technical Substance 60, CWE Coherence 35) are combined with the active sensitivity preset applied (e.g. strict-triage upweights substance and AVRI; research is more permissive). The output is a 0–100 score and a tier: rejected, needs-review, or accept.
Fusion is intentionally boring: it's a transparent weighted sum, not a black-box model. You can replay any score by hand from the three engine scores and their weights.
