Documentation Index
Fetch the complete documentation index at: https://snakysec.mintlify.app/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.
| Section | Entrée | Icon (lucide) | href | Actif si |
|---|
| Top-level | Dashboard | LayoutDashboard | /dashboard | exact match |
| Top-level | Clients | Building2 | /dashboard/clients | startsWith |
| Top-level | Audits | Shield | /dashboard/audits | startsWith |
| Top-level | Alerts | AlertTriangle | /dashboard/alerts | startsWith |
| Top-level | Integrations | Blocks | /dashboard/integrations | startsWith |
| Documents (collapsible) | header click | FolderOpen + Chevron | toggle docsOpen | startsWith /dashboard/documents |
| Documents > | Documents Overview | (no icon) | /dashboard/documents | exact |
| Documents > | Governance | BookOpen | /dashboard/documents/governance | startsWith |
| Documents > | Access | KeyRound | /dashboard/documents/access | startsWith |
| Documents > | Incidents | Siren | /dashboard/documents/incidents | startsWith |
| Documents > | Monitoring | BarChart3 | /dashboard/documents/monitoring | startsWith |
| Documents > | Onboarding | UserPlus | /dashboard/documents/onboarding | startsWith |
| Documents > | Technical | Cpu | /dashboard/documents/technical | startsWith |
| Documents > | Compliance | Scale (opacity 50) | /dashboard/documents/compliance | startsWith — flag roadmapOnly: true → badge “Roadmap” amber |
| Bottom (separator) | Settings | Settings | /dashboard/settings | startsWith |
| Footer | Sign Out | LogOut | callbackUrl /login | — |
Header sidebar : <Wordmark variant="claire" size="text-xl" /> (logo typographique brand book, pas de pictogramme).
Largeur 256px. 5 entrées seulement.
| Entrée | Icon | href |
|---|
| Overview | LayoutDashboard | /portal |
| Audits | Shield | /portal/audits |
| Findings | AlertTriangle | /portal/findings |
| Remediation | Target | /portal/remediation |
| Documents | FileText | /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).
Sticky top, hauteur 64px.
| Zone | Élément | Visibilité |
|---|
| Gauche | Menu hamburger (Sheet trigger) | mobile only (md:hidden) |
| Gauche | Title Admin ou Portal | desktop sm+ |
| Droite | Language switcher (FR/EN flags) | toujours |
| Droite | Bell icon → /dashboard/alerts | dashboard only |
| Droite | Avatar + nom user | toujours |
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).
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
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
| Composant | Fichier | Rôle |
|---|
<Sidebar> | sidebar.tsx | Nav dashboard MSSP |
<PortalSidebar> | portal-sidebar.tsx | Nav portail client |
<Header> | header.tsx | Header commun (switch isPortal) |
<Wordmark> | brand/wordmark.tsx | Logo typographique |
<KpiCard> | kpi-card.tsx | KPI tile (icon + value + trend) |
<StatusBadge> | status-badge.tsx | Badge colorisé selon status |
<SeverityBadge> | severity-badge.tsx | Badge colorisé selon severity |
<FeatureBadges> | feature-badges.tsx | Toggles features client (entra/intune/…) |
<FrameworkBadges> | framework-badges.tsx | Badges CIS / SCuBA / ISO / NIST |
<EmptyState> | empty-state.tsx | Card vide standardisée (icon + title + description + action) |
<DashboardFilters> | dashboard-filters.tsx | Sélecteur client + period |
<DashboardTabs> | dashboard-tabs.tsx | Tabs Overview / Analytics |
<AlertFeed> | alert-feed.tsx | Liste alerts (mark read) — bug hydration récent |
<TopCriticalFindings> | top-critical-findings.tsx | Top 5 findings cross-tenant |
<AuditActions> | audit-actions.tsx | Actions audit (variant dropdown ou buttons) |
<AuditLiveMonitor> | audit-live-monitor.tsx | SSE stream + pipeline stages |
<AuditPipelineStages> | audit-pipeline-stages.tsx | Étapes pipeline (steppers) |
<TriggerAuditButton> | dashboard/clients/[id]/trigger-audit-button.tsx | Modal trigger audit |
<TamperingBanner> | tampering-banner.tsx | Banner rouge si chain cassée |
<PortalImpersonationBanner> | portal-impersonation-banner.tsx | Bandeau orange impersonation |
<ImpersonateClientButton> | impersonate-client-button.tsx | Bouton “voir comme client” |
<PortalClientPicker> | portal-client-picker.tsx | Sélecteur client (admin sur portail) |
<SessionGuard> | session-guard.tsx | Forces re-auth si Entra token refresh fail |
<LanguageSwitcher> | language-switcher.tsx | FR/EN |
<CisoSyncButton> | ciso-sync-button.tsx | Sync CISO Assistant |
<DownloadReportButton> | download-report-button.tsx | Download report |
<ReportDownloadButton> | report-download-button.tsx | (autre variante — DOUBLON ?) |
<CronBuilder> | cron-builder.tsx | Builder cron expression |
<RemediationPlanView> | remediation-plan-view.tsx | Vue plan remediation |
<DataTable> | data-table.tsx | TanStack Table wrapper |
<DataTableToolbar> | data-table-toolbar.tsx | Toolbar filtres |
<DataTablePagination> | data-table-pagination.tsx | Pagination footer |
7 charts Recharts : client-comparison, compliance-trend, dict-radar, framework-compliance, product-area-radar, severity-breakdown, status-distribution.
7 composants : audit-diff-control-sheet, audit-reports-panel, compare-selector, control-columns, control-expanded-row, control-results-table, review-form.
7 composants : guide-filter-dialog, milestone-card, milestone-dialog, milestone-status-dialog, milestone-timeline, milestone-workspace, remediation-workspace.
wizard-stepper.tsx + 8 step components : credentials-step, done-step, identity-step, preflight-step, schedule-step, scope-step, test-connection-step, users-step.
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.