Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.snakysec.com/llms.txt

Use this file to discover all available pages before exploring further.

UI MAP — SnakySec MSSP

Cartographie complète de la navigation et des actions UI. Basé sur le code RÉEL (état branche main au 2026-04-28). Source primaire : platform/src/app/ + platform/src/components/.

1. Structure de navigation

1.1 Arbre des routes — Vue d’ensemble

/                                  → redirect /dashboard
/login                             → SSO Entra ID (page publique)
/api/auth/[...nextauth]            → NextAuth callback / signin / signout
/api/health                        → bypass proxy (monitoring)
/api/webhooks/gitlab               → bypass proxy (HMAC own validation)

[ DASHBOARD MSSP — RBAC: MSSP_ADMIN | ANALYST ]
/dashboard                         → Hub MSSP (KPIs cross-tenant)
/dashboard/clients                 → Liste clients (cards)
/dashboard/clients/new             → Création client (entry form)
/dashboard/clients/[id]            → Détail client (tabs)
/dashboard/clients/[id]/edit       → Édition métadonnées client
/dashboard/clients/[id]/secrets    → Gestion credentials
/dashboard/clients/[id]/findings   → Findings filtrés client
/dashboard/clients/[id]/remediation         → Workspace remédiation
/dashboard/clients/[id]/remediation-plan    → Plan view (read)
/dashboard/clients/[id]/trajectory          → Trajectoire conformité
/dashboard/clients/[id]/documents           → Documents GRC client
/dashboard/clients/[id]/controls            → Index contrôles
/dashboard/clients/[id]/controls/[controlId]→ Détail contrôle
/dashboard/clients/[id]/onboarding          → Resume redirect (server)
/dashboard/clients/[id]/onboarding/[step]   → Étape wizard 1..7

/dashboard/audits                  → Liste audits (paginée 20)
/dashboard/audits/[id]             → Détail audit
/dashboard/audits/[id]/diff        → Diff entre 2 runs

/dashboard/alerts                  → Inbox alertes cross-tenant

/dashboard/integrations            → Intégrations externes (CISO Assistant)

/dashboard/documents               → Hub documents GRC (multi-client)
/dashboard/documents/governance    → Catégorie Gouvernance
/dashboard/documents/access        → Catégorie Accès & Identités
/dashboard/documents/incidents     → Catégorie Incidents
/dashboard/documents/monitoring    → Catégorie Monitoring
/dashboard/documents/onboarding    → Catégorie Onboarding
/dashboard/documents/technical     → Catégorie Technique
/dashboard/documents/compliance    → Catégorie Conformité (badge "Roadmap")

/dashboard/settings                → Hub settings
/dashboard/settings/users          → Gestion users
/dashboard/settings/users/[id]                → Détail user
/dashboard/settings/users/[id]/permissions    → Matrice permissions
/dashboard/settings/roles          → Gestion rôles (system + custom)
/dashboard/settings/access-review  → Access review (grants TTL)
/dashboard/settings/api-keys       → API Keys
/dashboard/settings/audit-log      → Platform audit log + chain integrity
/dashboard/settings/notifications  → Préférences email user

/dashboard/help                    → (vide, juste sous-arbre DR)
/dashboard/help/dr                 → DR Runbook hub (gated INTERNAL_DOCS_VIEW)
/dashboard/help/dr/[...slug]       → DR doc page (catch-all)

[ PORTAL CLIENT — RBAC: CLIENT_USER | impersonation MSSP_ADMIN ]
/portal                            → Overview portail (KPIs scope client)
/portal/audits                     → Liste audits (50 derniers)
/portal/audits/[id]                → Détail audit (read-only)
/portal/findings                   → Findings scope client
/portal/remediation                → Remediation kanban
/portal/documents                  → Documents GRC + reports

1.2 Composants de navigation — Inventaire

Largeur 256px, full-height, sticky. 14 entrées totales en mode ouvert.
SectionEntréeIcon (lucide)hrefActif si
Top-levelDashboardLayoutDashboard/dashboardexact match
Top-levelClientsBuilding2/dashboard/clientsstartsWith
Top-levelAuditsShield/dashboard/auditsstartsWith
Top-levelAlertsAlertTriangle/dashboard/alertsstartsWith
Top-levelIntegrationsBlocks/dashboard/integrationsstartsWith
Documents (collapsible)header clickFolderOpen + Chevrontoggle docsOpenstartsWith /dashboard/documents
Documents >Documents Overview(no icon)/dashboard/documentsexact
Documents >GovernanceBookOpen/dashboard/documents/governancestartsWith
Documents >AccessKeyRound/dashboard/documents/accessstartsWith
Documents >IncidentsSiren/dashboard/documents/incidentsstartsWith
Documents >MonitoringBarChart3/dashboard/documents/monitoringstartsWith
Documents >OnboardingUserPlus/dashboard/documents/onboardingstartsWith
Documents >TechnicalCpu/dashboard/documents/technicalstartsWith
Documents >ComplianceScale (opacity 50)/dashboard/documents/compliancestartsWith — flag roadmapOnly: true → badge “Roadmap” amber
Bottom (separator)SettingsSettings/dashboard/settingsstartsWith
FooterSign OutLogOutcallbackUrl /login
Header sidebar : <Wordmark variant="claire" size="text-xl" /> (logo typographique brand book, pas de pictogramme). Largeur 256px. 5 entrées seulement.
EntréeIconhref
OverviewLayoutDashboard/portal
AuditsShield/portal/audits
FindingsAlertTriangle/portal/findings
RemediationTarget/portal/remediation
DocumentsFileText/portal/documents
Header sidebar : icon Shield + texte hardcoded "SnakySec" + sous-titre "Client Portal" (pas de Wordmark, pas de white-label dynamique pour le moment — TODO V1). Footer : Sign Out (texte EN hardcoded "Logout" — pas i18n).

Header (commun) — components/header.tsx

Sticky top, hauteur 64px.
ZoneÉlémentVisibilité
GaucheMenu hamburger (Sheet trigger)mobile only (md:hidden)
GaucheTitle Admin ou Portaldesktop sm+
DroiteLanguage switcher (FR/EN flags)toujours
DroiteBell icon → /dashboard/alertsdashboard only
DroiteAvatar + nom usertoujours
Avatar dropdown :
  • Label : nom + email
  • Settings/dashboard/settings (dashboard only, conditionné !isPortal)
  • Sign Out → callback /login
Présents sur :
  • /dashboard/clients/[id]/page.tsx : Dashboard > Clients > [name]
  • /dashboard/audits/[id]/page.tsx : Dashboard > Audits > [client] — [date]
  • Probablement absents sur /portal/* (à confirmer en visuel).
Pattern : composant shadcn <Breadcrumb> <BreadcrumbList> <BreadcrumbItem> avec <BreadcrumbLink> (lien intermédiaire) et <BreadcrumbPage> (item courant).

Bandeaux contextuels persistants

  • TamperingBanner (components/tampering-banner.tsx) — Rendu dans le DashboardLayout, vide en cas normal, rouge si chain audit log lockée. Non-dismissable sans ACK admin.
  • PortalImpersonationBanner (components/portal-impersonation-banner.tsx) — Visible uniquement en mode impersonation MSSP_ADMIN, affiche le client name.
  • Onboarding banner (inline, pas de composant dédié) — Card amber sur /dashboard/clients/[id]/page.tsx ligne 109-130, présente tant que onboardingStatus !== "COMPLETED".
  • Active audit banner (inline) — Sur /dashboard/clients/[id]/page.tsx ligne 191-208, lien vers le détail audit live.

2. Inventaire des actions par page

2.1 /dashboard — Hub MSSP

Header de page :
  • H2 : “Dashboard”
  • <DashboardFilters> : sélecteur client (Select) + sélecteur period
Boutons / actions :
  • Lien “View All” → /dashboard/alerts (depuis Recent Alerts card)
  • Lien “View All” → /dashboard/audits (depuis Recent Audits card)
  • Click row table audit → /dashboard/clients/[clientId]
  • AlertFeed item : bouton “Mark read” → PATCH /api/v1/alerts
  • <DashboardTabs> : 2 onglets — Overview (executive summary) | Analytics (charts)
KPI cards (8 au total, 2 rows de 4) : Active Tenants, Avg Compliance, Open Alerts, Recent Audits, Total Findings, Open Findings, In Progress, Remediated. Tous read-only (pas d’action sur card).

2.2 /dashboard/clients — Liste clients

Header de page :
  • H2 : “Clients”
  • Bouton primary + Add Client/dashboard/clients/new
Cards client :
  • Click card body → /dashboard/clients/[id] (ou /onboarding si en cours)
  • Bouton “Impersonate” (footer card) → set cookie + redirect /portal
  • Badge “Open Gaps ” si findings non résolus

2.3 /dashboard/clients/[id] — Détail client

Breadcrumb : Dashboard > Clients > [name] Header de page (8 boutons d’action — page la plus dense en actions) :
  • Back arrow → /dashboard/clients
  • H2 + slug + environment + tenantId
  • Bouton outline “Edit” → /dashboard/clients/[id]/edit
  • Bouton outline “Credentials” (icon Key) → /dashboard/clients/[id]/secrets
  • Bouton outline “Findings” (icon AlertTriangle) → /dashboard/clients/[id]/findings
  • Bouton outline “Remediation” (icon Target) → /dashboard/clients/[id]/remediation
  • <GuideFilterDialog variant="dashboard" /> — Dialog filtre + génération guide remediation PDF
  • Bouton outline “Trajectory” (icon TrendingUp) → /dashboard/clients/[id]/trajectory
  • Bouton outline conditionnel “CISO Assistant” → ouvre cisoAssistantBaseUrl external (target _blank)
  • <TriggerAuditButton clientId clientSlug /> — bouton primary qui ouvre modal de choix framework × productArea
Tabs (3) :
  • Overview : Cards Features (FeatureBadges) + CISO Assistant config + Configuration paths/cron
  • History : Table 20 derniers AuditRun avec <AuditActions auditId status /> (variant=dropdown)
  • Findings : Liste GapFinding limitée 20 (severity badge + status badge)

2.4 /dashboard/audits/[id] — Détail audit

Breadcrumb : Dashboard > Audits > [client] — [date] Header de page (boutons d’action) :
  • Back arrow → /dashboard/audits
  • H2 “Audit Detail” + StatusBadge
  • Sub-line : lien client name + Trigger badge + date
  • Score % à droite (3xl bold)
  • <AuditActions variant="buttons" gitlabPipelineUrl /> :
    • Bouton “Cancel” si status PENDING/RUNNING
    • Bouton “Retry” si status FAILED/CANCELLED
    • Bouton “Sync” si status PENDING/RUNNING/FAILED
    • Bouton “Pipeline” (external link GitLab) si pipelineUrl présent
    • Bouton “PDF” (download) si COMPLETED/PARTIAL
    • Bouton “Excel” (download) si COMPLETED/PARTIAL
    • Bouton “HTML” (download) si COMPLETED/PARTIAL
    • Bouton “Delete” (text-destructive) toujours
  • <CompareSelector currentAuditId options /> — dropdown des runs précédents pour diff
AuditLiveMonitor (si status PENDING/RUNNING/IMPORTING) : Summary cards (7) : Passed, Failed, Manual (pending count overlay), N/A, Not Assessed, No Permission, Error. DICT radar : Card avec <DictRadar summary /> AuditReportsPanel (components/audit/audit-reports-panel.tsx) :
  • Section TRACKING : génération à la volée (PDF Executive, PDF Technical, HTML, Excel, JSON)
  • Section CERTIFICATION : signed Ed25519, “Certify” button (canCertify=MSSP_ADMIN)
  • “Generate” button (canGenerate=MSSP_ADMIN | ANALYST | CLIENT_USER)
  • “Verify” button par report → POST /api/v1/reports/[id]/verify
  • Download direct par report
CisoSyncButton (si CISO Assistant enabled) → POST /api/v1/audits/[id]/sync-ciso ControlResultsTable (components/audit/control-results-table.tsx) :
  • TanStack Table
  • Filtres : status, severity, productArea, framework, DICT axes
  • Colonne actions par contrôle :
    • Si canReview=true (MSSP_ADMIN) et status=manual : Sheet “Review” (notes + evidence upload)
    • Si reviewedStatus set : badge “Reviewed compliant/non-compliant” + reviewer name
  • Expanded row : evidence primary/secondary, remediation action/impact, rationale

2.5 /dashboard/audits — Liste audits

Header :
  • H2 “Audits” + count total
  • <AuditFilters> : sélecteur status, sélecteur client
Table (paginée 20) : Client | Status | Trigger | Score | Passed | Failed | Manual | Date | <AuditActions variant=dropdown> Pagination : Previous / Next (chevron icons).

2.6 /dashboard/alerts — Inbox alertes

Header : H2 “Alerts” Card : title avec count {unread} non-lus AlertFeed (component partagé avec dashboard) :
  • Liste 50 alerts
  • Bouton “Mark read” par alert
  • Empty state <EmptyState icon=Bell />

2.7 /dashboard/integrations — Intégrations

Card CISO Assistant :
  • Status badge (4 variantes : connected, not_configured, unreachable, auth_failed)
  • Bouton “Refresh” (icon RefreshCw)
  • Bouton “Test Connection” (icon Loader si testing)
  • Bouton “Open CISO Assistant” external (icon ExternalLink) si publicUrl présent

2.8 /dashboard/documents (hub) + sous-pages catégorie

Hub : 7 cards catégorie cliquables (Governance, Compliance, Access, Incidents, Monitoring, Onboarding, Technical) avec liste statique des templates et statuts (available | coming_soon | planned). Sous-pages : liste des documents de la catégorie + sélection client → génération.

2.9 /dashboard/clients/[id]/documents — Documents GRC client

Liste 8 documents (PSSI, Access Policy, Incident Procedure, Remediation Plan, Data Classification, Breach Notification, IT Charter, Processing Register). Par document :
  • Bouton “Generate” (POST /api/v1/clients/[id]/documents/[type])
  • Liens “Download DOCX” + “Download PDF”
  • Date dernière génération

2.10 /dashboard/clients/[id]/onboarding/[step] — Wizard onboarding

Layout : grid 260px sidebar steps + main content. Sidebar steps (components/onboarding/wizard-stepper.tsx) :
  • 7 items, chacun avec icon (numéro, Check si past, Lock si > maxReachable)
  • Click sur step déverrouillé → navigate
  • Step locked = non-cliquable
Step content (varie selon step) :
  • Step 1 Identity : form name/slug/domain/tenantId
  • Step 2 Credentials : upload cert PEM + private key
  • Step 3 Preflight : check scopes Graph
  • Step 4 Test-Connection : probe + status
  • Step 5 Scope : 6 toggles features (entra, intune, defender, purview, sharepoint, teams)
  • Step 6 Users : invitations CLIENT_USER
  • Step 7 Schedule : <CronBuilder> + timezone select + enable toggle
  • Step Done : récap + bouton “Lancer 1er audit” (trigger=ONBOARDING)

2.11 /dashboard/settings/* — Settings

/dashboard/settings — Hub avec 6+1 cards :
  • Users → /dashboard/settings/users
  • Roles → /dashboard/settings/roles
  • Access Review → /dashboard/settings/access-review
  • API Keys → /dashboard/settings/api-keys
  • Audit Log → /dashboard/settings/audit-log
  • Notifications → /dashboard/settings/notifications
  • DR Runbook (conditionnel INTERNAL_DOCS_VIEW) → /dashboard/help/dr
/dashboard/settings/users/[id]/permissions — Matrice permissions par groupe (17 groupes UI, cf. permissions/groups.ts).

2.12 /portal — Overview portail client

KPI cards (4) : Compliance Score, Last Audit (timeAgo), Open Findings, Unread Alerts. Card Recent Audits : table 5 lignes + lien “View All” → /portal/audits. Mode admin sans sélection : <PortalClientPicker> (sélecteur client pour admin qui consulte le portail sans impersonation).

2.13 /portal/audits — Liste audits client

Table 50 lignes : Date | Status | Score | Passed | Failed | Détails (lien View vers /portal/audits/[id] si COMPLETED/PARTIAL). Pas d’AuditActions (read-only).

2.14 /portal/audits/[id] — Détail audit (portal)

Lecture seule. Probablement même backbone que dashboard mais sans :
  • Reviewer workflow
  • Trigger / Cancel / Retry / Delete
  • Compare selector
À confirmer visuel (pas lu en détail).

2.15 /portal/findings — Findings client

Liste findings scope client. Filtres severity / productArea / status. Pas de mutation status (reservé MSSP).

2.16 /portal/remediation — Kanban remediation

Colonnes : OPEN | IN_PROGRESS | REMEDIATED | VERIFIED | ACCEPTED_RISK. Probablement read-only sur portail (mutations réservées MSSP).

2.17 /portal/documents — Documents client

Liste documents générés (PSSI, Charte IT, etc.). Download DOCX + PDF.

3. Composants UI réutilisables — Inventaire

3.1 Composants shadcn/ui (components/ui/)

25 composants : avatar, badge, breadcrumb, button, card, checkbox, command, dialog, dropdown-menu, form, input, label, popover, progress, scroll-area, select, separator, sheet, skeleton, switch, table, tabs, textarea, toast, toaster, tooltip.

3.2 Composants métier transverses

ComposantFichierRôle
<Sidebar>sidebar.tsxNav dashboard MSSP
<PortalSidebar>portal-sidebar.tsxNav portail client
<Header>header.tsxHeader commun (switch isPortal)
<Wordmark>brand/wordmark.tsxLogo typographique
<KpiCard>kpi-card.tsxKPI tile (icon + value + trend)
<StatusBadge>status-badge.tsxBadge colorisé selon status
<SeverityBadge>severity-badge.tsxBadge colorisé selon severity
<FeatureBadges>feature-badges.tsxToggles features client (entra/intune/…)
<FrameworkBadges>framework-badges.tsxBadges CIS / SCuBA / ISO / NIST
<EmptyState>empty-state.tsxCard vide standardisée (icon + title + description + action)
<DashboardFilters>dashboard-filters.tsxSélecteur client + period
<DashboardTabs>dashboard-tabs.tsxTabs Overview / Analytics
<AlertFeed>alert-feed.tsxListe alerts (mark read) — bug hydration récent
<TopCriticalFindings>top-critical-findings.tsxTop 5 findings cross-tenant
<AuditActions>audit-actions.tsxActions audit (variant dropdown ou buttons)
<AuditLiveMonitor>audit-live-monitor.tsxSSE stream + pipeline stages
<AuditPipelineStages>audit-pipeline-stages.tsxÉtapes pipeline (steppers)
<TriggerAuditButton>dashboard/clients/[id]/trigger-audit-button.tsxModal trigger audit
<TamperingBanner>tampering-banner.tsxBanner rouge si chain cassée
<PortalImpersonationBanner>portal-impersonation-banner.tsxBandeau orange impersonation
<ImpersonateClientButton>impersonate-client-button.tsxBouton “voir comme client”
<PortalClientPicker>portal-client-picker.tsxSélecteur client (admin sur portail)
<SessionGuard>session-guard.tsxForces re-auth si Entra token refresh fail
<LanguageSwitcher>language-switcher.tsxFR/EN
<CisoSyncButton>ciso-sync-button.tsxSync CISO Assistant
<DownloadReportButton>download-report-button.tsxDownload report
<ReportDownloadButton>report-download-button.tsx(autre variante — DOUBLON ?)
<CronBuilder>cron-builder.tsxBuilder cron expression
<RemediationPlanView>remediation-plan-view.tsxVue plan remediation
<DataTable>data-table.tsxTanStack Table wrapper
<DataTableToolbar>data-table-toolbar.tsxToolbar filtres
<DataTablePagination>data-table-pagination.tsxPagination footer

3.3 Composants charts (components/charts/)

7 charts Recharts : client-comparison, compliance-trend, dict-radar, framework-compliance, product-area-radar, severity-breakdown, status-distribution.

3.4 Composants audit (components/audit/)

7 composants : audit-diff-control-sheet, audit-reports-panel, compare-selector, control-columns, control-expanded-row, control-results-table, review-form.

3.5 Composants remediation (components/remediation/)

7 composants : guide-filter-dialog, milestone-card, milestone-dialog, milestone-status-dialog, milestone-timeline, milestone-workspace, remediation-workspace.

3.6 Composants onboarding (components/onboarding/)

wizard-stepper.tsx + 8 step components : credentials-step, done-step, identity-step, preflight-step, schedule-step, scope-step, test-connection-step, users-step.

3.7 Composants brand (components/brand/)

3 composants : flag-fr.tsx, flag-gb.tsx (drapeaux SVG language switcher), wordmark.tsx (logo typographique).

4. Doublons / incohérences identifiés

4.1 Doublons de navigation confirmés

  • Findings accessible depuis 4 endroits :
    • Tab findings sur /dashboard/clients/[id]/page.tsx
    • Bouton “Findings” dans le header de la page client
    • Page dédiée /dashboard/clients/[id]/findings/page.tsx
    • Page portail /portal/findings
    • → 4 chemins, 3 surfaces UI distinctes pour la même donnée filtrée par clientId.
  • Remediation accessible depuis 4 endroits :
    • Bouton “Remediation” dans le header page client → /dashboard/clients/[id]/remediation
    • Page séparée /dashboard/clients/[id]/remediation-plan
    • <GuideFilterDialog> dans le header (génération guide PDF, pas une nav mais un autre bouton)
    • Page portail /portal/remediation
  • Documents accessibles depuis 3 endroits :
    • Hub /dashboard/documents (cross-client, catégories)
    • Page client /dashboard/clients/[id]/documents (8 docs scope client)
    • Page portail /portal/documents (read-only client)
  • Settings accessibles depuis 2 endroits :
    • Sidebar : entrée Settings
    • Header avatar dropdown : item “Settings”
  • Alerts accessibles depuis 3 endroits :
    • Sidebar : entrée Alerts
    • Header : Bell icon
    • Dashboard : Recent Alerts card avec lien “View All”

4.2 Composants similaires à comportements légèrement divergents

  • <DownloadReportButton> vs <ReportDownloadButton> : 2 fichiers, noms quasi identiques. Probablement 2 implémentations divergées historiquement. À vérifier en lecture.
  • <AuditActions variant="dropdown"> vs variant="buttons"> : 2 surfaces UI maintenues côte à côte (~330 lignes pour les deux), risque de divergence quand on ajoute une action.
  • AlertFeed vs page Alerts : la card “Recent Alerts” sur dashboard utilise le même composant <AlertFeed> que la page dédiée — bonne réutilisation, mais avec data différente (5 vs 50).
  • Les 8 step components onboarding : 8 fichiers séparés avec leur propre layout (titre, form, boutons next/prev). Pas de wrapper commun pour l’UI step → divergence possible (boutons next/prev pas forcément à la même position).

4.3 Affichages incorrects / bugs récents

  • <AlertFeed> hydration mismatch : composant "use client" qui calcule timeAgo(new Date(alert.createdAt)) au render → si le serveur fait le SSR avec une timezone différente du client, écart visible (ex: “2 hours ago” SSR vs “3 hours ago” CSR). Bug récent identifié.
  • Header text “Logout” hardcoded EN dans portal-sidebar.tsx ligne 91 (vs sidebar dashboard qui utilise useTranslations("common")signOut).
  • Portail sidebar : labels name (Overview, Audits, Findings, Remediation, Documents) hardcoded EN — pas de i18n dans portal-sidebar.tsx.
  • DocumentsNav compliance flag roadmapOnly: true affiche un badge amber “Roadmap” — mais l’item est cliquable et mène à une page existante (/dashboard/documents/compliance). Confusion : “roadmap” suggère “à venir”, mais la page existe.
  • Onboarding wizard : 7 steps + step done mais STEP_ORDER: [1,2,3,4,5,6,7] n’inclut pas le step Done → si on est sur step Done après le wizard, sidebar ne le surligne pas (à vérifier).

4.4 Points de confusion utilisateur déjà repérés

  • MSSP_ADMIN voit dashboard ET portail (impersonation) : changement de contexte (sidebar+header) sans transition visuelle marquée à part le Bandeau orange. L’admin peut “perdre le fil” entre /dashboard et /portal.
  • Trigger Audit : 2 entrées implicites :
    • Bouton primary sur /dashboard/clients/[id] (header)
    • Wizard onboarding step Done (1er audit ONBOARDING distinct)
    • Pas de “Trigger audit” depuis /dashboard/audits ou /dashboard → si un MSSP veut audit en masse, il faut aller client par client.
  • 8 GRC documents répartis sur 7 catégories sur /dashboard/documents : la nomenclature catégorie est inférée (PSSI = Governance, Charte IT = Governance, Breach Notification = Compliance, Incident Procedure = Incidents, Remediation Plan = Monitoring ?). Le mapping mental n’est pas trivial pour un opérateur tiers.
  • Onboarding banner persiste après audit réussi tant que le bouton “Done” du wizard n’a pas été cliqué → l’opérateur peut ne plus comprendre pourquoi le banner reste rouge si onboardingStatus !== "COMPLETED" mais audit réussi.
  • CISO Assistant 4 statuts (connected, not_configured, unreachable, auth_failed) → les opérateurs nouveaux ne savent pas la différence unreachable vs auth_failed sans lire le code.
  • AuditActions 7+ actions conditionnelles (Cancel / Retry / Sync / Pipeline / PDF / Excel / HTML / Delete) sur même bouton dropdown → cognitive load important. La règle d’affichage dépend du status (canCancel = PENDING|RUNNING, canReport = COMPLETED|PARTIAL_COMPLETE…).
  • DICT radar + Severity breakdown + Product area radar + Framework compliance + Status distribution + Compliance trend + Client comparison → 7 charts distincts sur le dashboard ; <DashboardTabs> les sépare en Overview / Analytics, mais leurs corrélations ne sont pas évidentes au premier coup d’œil.

5. Conventions de design observées

  • Couleur statuts :
    • Compliant / Success / Passed → text-green-600, bg-green-50
    • Non-compliant / Failed / Error → text-red-600, bg-red-50 (variante destructive)
    • Manual / Warning → text-yellow-600, bg-yellow-50
    • Not Applicable → text-gray-500, bg-gray-50
    • Not Assessed → text-orange-500, bg-orange-50
    • No Permission → text-amber-700, bg-amber-50
    • Onboarding banner → border-amber-500/40, bg-amber-50/50
  • Typographie :
    • H2 page titles : font-display text-2xl font-extrabold tracking-tight
    • Sub-line : text-sm text-muted-foreground
  • Cards : shadcn <Card> partout, pt-6 au CardContent quand pas de CardHeader.
  • Tables : shadcn <Table> + TanStack Table pour les tables interactives (filtres, sort, pagination).
  • Score color : helper scoreColor qui mappe % → classe text-green/yellow/red.
  • timeAgo : helper local pour formattage relatif (“2 hours ago” / “il y a 2 heures”).
  • Locale switch : locale === "en" ? "en-US" : "fr-FR" pour toLocaleDateString.