{error}
@@ -383,7 +426,7 @@ export default function App() { Pentest Overview{open} open · {closed} false positives · {vulnerabilities.length} found
+Email an encrypted PDF report of this run
+Email the original scan report as an encrypted PDF
- Encrypted with a key only you can see, email verified with a one-time code before sending. + Excludes subsequent triage. Encrypted with a key only you can see; email verified before sending.
{total} open · {detected - total} false positives · {detected} found
Preserved as generated. Subsequent false-positive decisions are excluded; current triage counts appear above.
This PDF preserves the original detected findings. Subsequent false-positive decisions and local triage notes are excluded.
}Sending to {auth.email}
diff --git a/strix/interface/viewer/frontend/src/components/PastRunsView.tsx b/strix/interface/viewer/frontend/src/components/PastRunsView.tsx index adfeb4dd..89c9d116 100644 --- a/strix/interface/viewer/frontend/src/components/PastRunsView.tsx +++ b/strix/interface/viewer/frontend/src/components/PastRunsView.tsx @@ -22,7 +22,7 @@ const SEV = [ function SeverityChips({ counts }: { counts: RunSeverityCounts }) { const shown = SEV.filter((s) => counts[s.key] > 0); if (shown.length === 0) { - return No findings; + return No open findings; } return ({error}
} + {reviewed && ( + + )} ++ Evidence changed since the previous false-positive decision. This finding is open for review. +
+ )} + {/* Status banner */} {vulnerability.status !== "open" && (() => { const banner = STATUS_BANNER[vulnerability.status]; @@ -132,8 +142,11 @@ export default function VulnerabilityDetail({ vulnerability }: VulnerabilityDeta{banner.label}{bannerTime(vulnerability.status_changed_at)}
+ {vulnerability.reason_code && vulnerability.reason_code !== "unspecified" && ( +{TRIAGE_REASONS[vulnerability.reason_code]}
+ )} {vulnerability.status_note && ( -+
“{vulnerability.status_note}”
)} @@ -253,13 +266,16 @@ export default function VulnerabilityDetail({ vulnerability }: VulnerabilityDeta statusSlot={ - {currentMeta.label} + {statusLabel} } />h?f-h:void 0;return hy(o,y,b,_)};if(t){const s=t+fy,o=a;a=c=>c.startsWith(s)?o(c.slice(s.length)):hy(sA,!1,c,void 0,!0)}if(r){const s=a;a=o=>r({className:o,parseClassName:s})}return a},oA=e=>{const t=new Map;return e.orderSensitiveModifiers.forEach((r,a)=>{t.set(r,1e6+a)}),r=>{const a=[];let s=[];for(let o=0;oc))return;const H=t.events.length;let z=H,Y,j;for(;z--;)if(t.events[z][0]==="exit"&&t.events[z][1].type==="chunkFlow"){if(Y){j=t.events[z][1].end;break}Y=!0}for(w(a),R=H;R