docs: add Postgres migration plan and Kiro spec

- docs/guides/postgres-migration-plan.md: full migration manual with
  phases, port allocation, rollback plan, and timeline
- .kiro/specs/postgres-migration/: requirements, design, and tasks
- Replaces findings_json blob with individual indexed rows
- Enables per-BU closed counts via SQL queries
- Uses existing Postgres instance (port 5432), new cve_dashboard DB
- Testing on port 3003, cutover to 3001 with 30s downtime
This commit is contained in:
Jordan Ramos
2026-05-05 15:04:14 -06:00
parent bd5fcccacf
commit 5cdca09f40
3 changed files with 295 additions and 3 deletions

View File

@@ -5662,16 +5662,21 @@ export default function VulnerabilityTriagePage({ filterDate, filterEXC }) {
<div role="tabpanel">
{metricsTab === 'ivanti' && (
<div style={{ display: 'flex', gap: '3rem', flexWrap: 'wrap', alignItems: 'flex-start' }}>
{/* Open vs Closed donut — open count from scoped findings, closed is global */}
{/* Open vs Closed donut — open from scoped findings; closed only meaningful when unscoped */}
<div style={{ flex: '0 0 auto' }}>
<div style={{ fontFamily: 'monospace', fontSize: '0.68rem', fontWeight: '600', color: '#64748B', textTransform: 'uppercase', letterSpacing: '0.1em', marginBottom: '0.75rem' }}>
Open vs Closed
</div>
<StatusDonut
open={scopedFindings.length}
closed={statusCounts.closed}
closed={getActiveTeamsParam() ? 0 : statusCounts.closed}
loading={countsLoading}
/>
{getActiveTeamsParam() && (
<div style={{ fontFamily: 'monospace', fontSize: '0.6rem', color: '#475569', marginTop: '0.5rem' }}>
Closed count unavailable when filtered by BU
</div>
)}
</div>
{/* Divider */}