Colleague asked for more than 5 entries and proposed splitting the
Recent Vulnerabilities table into two focused widgets so 'what
changed risk recently' and 'what just got published' don't fight
for the same 5 rows.
Backend:
- sort_map gains 'updated_at' (Vulnerability.updated_at) so the
Critical widget can sort by 'risk-relevant DB write timestamp'
— picks up Vulnrichment corrections, KEV listings, manual status
changes etc.
Frontend (page.tsx):
- new renderVulnWidget() helper renders a compact 6-column table
(CVE / Sev / CVSS / PRIO / CPR / Flags) instead of the previous
wide 7-column one. Used twice on the dashboard:
'Recent Critical CVEs' — CVSS ≥ 8 OR KEV OR EUVD, top 10,
sort_by=updated_at desc
'Newly Published CVEs' — top 10, sort_by=published_date desc
- Flags column surfaces KEV / EUVD / SSVC status (WIDESP/ACTIVE/POC)
pills inline so the operator can see actionable indicators at a
glance without opening the detail page.
- Side-by-side on desktop (lg:grid-cols-2), stacked on mobile.
Both widgets dedup by cve_id client-side and pull a wider window
(80 entries) so 10 distinct CVEs land even when a hot CVE hits many
assets. Click on a row jumps to the filtered Vulns list.
Increased from 5 → 10 entries per widget (configurable via the loop
guard if 15 is preferred — set both to 15 and the limit=80 fetch
still covers worst case).