Skip to content

feat(frontend): vulnerabilities on the redesign layout #909

Closed

Description

@alex-dembele

Problem

The vulnerability queue must be ordered by real exploitation. The design leads with KEV and EPSS.

Design: https://claude.ai/artifact/HLqrbeYqvv4a6RVnBz9Vei (screen "vulnerabilities"). Parent: #899. The rules in the epic apply.

Acceptance criteria

  1. Four KPI tiles: open, open KEV, SLA breached, MTTR on criticals.
  2. Search, severity pills with counts, "KEV uniquement" and "Inclure corrigées" toggles.
  3. Table: expand chevron, CVE, title with severity dot and KEV tag, CVSS, EPSS, asset, SLA, status.
  4. The expanded row keeps our details and actions (assign, fix, accept, create risk).
  5. "Lancer un scan" entry point to the automatic scan (separate backend issue).

Definition of done

  • The screen matches the design at 1440×900 in dark and light, checked side by side in a real browser; the comparison and any deliberate difference are written on this issue.
  • Loading skeleton, error with retry, and empty state exist for every block.
  • FR and EN strings, no hard-coded copy.
  • npx tsc -b --noEmit, npx vitest run on the touched features, and npx eslint on the touched files pass.
  • Backend changes, if any, come with TestXxx_Success, TestXxx_NotFound, TestXxx_Unauthorized, filter by tenant_id, and go test ./... passes.
  • PR opened with Closes #<this issue>; parent epic epic(frontend): rebuild every console screen on the October 2026 redesign #899.

Activity

  1. alex-dembele commented on Oct 14, 2026

    @alex-dembele
    MemberAuthor

    frontend-react / backend-go — 2026-10-14

    Done: PR #950 (base master; #925–#943 are all merged).

    • Backend: remediated_at + migration 0073 (domain/vulnerability.go SetStatus, MeanDaysToRemediate); stats unresolved, sla_breached, mttr_critical_*; severity_counts on the list (gorm_vulnerability_repository.go vulnFilters/SeverityCounts).
    • Frontend: features/vulnerabilities/VulnerabilitiesPage.tsx rebuilt, vulnQueue.ts (SLA, EPSS, next statuses, priority signals); shared/datatable row expansion; the Filters badge counts panel facets only.

    Verified

    • go test ./...: ok
    • npx tsc -b --noEmit and npx eslint on touched files: clean
    • npx vitest run --maxWorkers=4: 1088/1088
    • Live at 1440 dark and light beside the design, plus 1280 and 520, on the design's 10-CVE bank. The status change persists across reload.

    Comparison with the design. These differences are deliberate:

    • checkboxes, row menu and Filters/columns/export stay (bulk actions, shared table)
    • glossary dotted underline on KEV, CVSS and EPSS
    • the MTTR tile shows its sample; the design hardcodes 3,4 j
    • the status pill is the DS Badge
    • the table body scrolls inside its card (existing DataTable behaviour)

    Aligned to the design: KPI 28px/600, every SLA cell semibold with warning at ≤ 3 days, pills 34px tall.

    Criteria: 1 ✅ · 2 ✅ · 3 ✅ · 4 ✅ · 5 ✅ The button starts the existing scanner configs. The package-inventory auto-scan is #910.
    Next: owner review of #950. Then #911.
    Blocked on: nothing

  2. added a commit that references this issue on Oct 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions