Files
nis2-agile/docs/mappa-logica/04_risks.md
T
DevEnv nis2-agileandClaude Opus 4.8 4dfab2a391 [FORMAZIONE] Avatar di prodotto — mappa-logica COMPLETA (22 viste) + SELETTORI_DEMO + tassonomia corso + fix kb.js
Deliverable formazione-first (DESIGN_AVATAR_FORMAZIONE / product-demo-complete):
- docs/mappa-logica/01..22_*.md: tutte le viste app V2 mappate (formato canonico standard §2),
  selettori VERIFICATI sul DOM reale, endpoint verificati su api.js/script, gate ruolo dai controller
- docs/mappa-logica/SELETTORI_DEMO.md: registry canonico (22 viste, 131 visualizzazione + 89 azioni)
  + worklist consolidata 132 id stabili da aggiungere (modifiche chirurgiche future)
- docs/formazione/TASSONOMIA_CORSO_NIS2.{md,json}: 10 moduli / 28 lezioni / ~7h45, prerequisiti+durate,
  esame con soglia 80%, sandbox 'prova tu' org 996002
- fix kb.js: ingest scope=ORG ora invia organization_id (prima 422 KB_ORG_REQUIRED) — bug trovato da A2

Prodotto con 4 trittici di agenti (A1 esecutore -> A2 revisore -> A3 controllore avversariale):
A2: ~14 correzioni (cross-ref, gate ruolo, comportamenti); A3 PASS: 38 selettori campionati 0 rotti,
18 endpoint reali, 0 violazioni normative (Allegati 3/4, IS-4, '1 mese', PII.* interna), 9 claim verificati.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 18:50:19 +02:00

72 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MAPPA-LOGICA · Gestione Rischi
⟦ INIZIO · U-RISKS · Videata "Gestione Rischi" ⟧
File: public/risks.html · URL: /risks.html · Scopo: risk register NIS2 — censimento rischi (probabilità x impatto), matrice 5x5, analisi quantitativa FAIR (ALE/Monte Carlo), dashboard KRI, trattamenti e suggerimenti AI · Profili: tutti gli utenti autenticati con organizzazione (org_admin, compliance_manager, board_member, auditor, employee, consultant; super_admin)
• U-RISKS.1 — Intestazione: toggle viste + azioni globali
Mostra: titolo "Gestione Rischi"; toggle a 4 viste: "Tabella", "Matrice", "Quantitativo (FAIR)", "KRI"; bottoni "AI Suggerisci" e "+ Nuovo Rischio".
Azioni: click sul toggle → `switchView()` mostra la vista corrispondente; "AI Suggerisci" → modale con rischi suggeriti dall'AI (U-RISKS.9); "+ Nuovo Rischio" → modale creazione rischio (U-RISKS.7).
Dati da: "AI Suggerisci": `POST /api/risks/ai-suggest`.
Confine: toggle `#view-toggle` (riga ~310); bottone `#btn-ai-suggest` (riga ~316). I singoli bottoni del toggle e "+ Nuovo Rischio" non hanno id (vedi ID mancanti).
• U-RISKS.2 — Vista Tabella: filtri + registro rischi
Mostra: filtri "Tutte le categorie" (Cyber, Operativo, Compliance, Supply Chain, Fisico, Umano) e "Tutti gli stati" (Identificato, In Analisi, In Trattamento, Monitorato, Chiuso); tabella con colonne Codice, Titolo, Categoria, Probabilita' (n/5), Impatto (n/5), Score (badge circolare colorato: low<10, medium 10-14, high 15-19, critical ≥20), Stato, Azioni (matita=Modifica, cestino=Elimina). Righe cliccabili.
Azioni: cambio filtro → ricarica lista; click riga → dettaglio rischio (U-RISKS.6); matita → modale modifica (U-RISKS.7); cestino → modale conferma eliminazione (U-RISKS.8).
Dati da: `GET /api/risks/list?category=&status=` (risposta `data.items`).
Confine: contenitore `#view-table` (riga ~326); filtri `#filter-category` (riga ~328) e `#filter-status` (riga ~337); corpo tabella `#risks-table-body` (riga ~362).
• U-RISKS.3 — Vista Matrice di Rischio 5x5
Mostra: card "Matrice di Rischio 5x5" (sottotitolo "Rischi inerenti (esclusi chiusi)"): griglia Probabilita' (asse Y, 5→1) x Impatto (asse X, 1→5), celle colorate dal verde al rosso secondo score P×I; dot bianco con il numero di rischi nella cella (tooltip con i titoli). Legenda: Basso (1-4), Medio (5-9), Alto (10-14), Elevato (15-19), Critico (20-25).
Azioni: hover sulle celle (tooltip); nessun click.
Dati da: `GET /api/risks/matrix` (risposta `data.risks` con `likelihood`, `impact`, `title`).
Confine: contenitore `#view-matrix` (riga ~375); griglia `#risk-matrix-grid` (riga ~386).
• U-RISKS.4 — Vista Quantitativo (FAIR): simulatore ALE + registro
Mostra: card "Analisi Quantitativa del Rischio (FAIR)" — "Perdita Annua Attesa (ALE) in EUR — simulazione Monte Carlo". Form: select Rischio, TEF min/probabile/max (eventi/anno), Vulnerabilita (0-1), Perdita min/probabile/max (EUR). Risultati: 4 stat-box "ALE P10 (ottimistico)", "ALE Mediana (P50)", "ALE P90 (pessimistico)", "ALE Media", LEF medio e istogramma della distribuzione delle perdite simulate. Seconda card "Registro Quantitativo" con "ALE di portafoglio" e tabella (Codice, Titolo, Categoria, ALE Min/Mediana/Max/Media).
Azioni: "Calcola ALE" → esegue la simulazione FAIR sul rischio selezionato e aggiorna il registro.
Dati da: select rischi: `GET /api/risks/list?per_page=200`; calcolo: `POST /api/risks/{id}/fair` (body `tef_min, tef_ml, tef_max, vuln, lm_min, lm_ml, lm_max`); registro: `GET /api/risks/fairRegister` (campi `portfolio_ale_mean`, `risks[]`).
Confine: contenitore `#view-fair` (riga ~420); select `#fair-risk-select` (riga ~429); input `#fair-tef-min` (~430), `#fair-tef-ml` (~431), `#fair-tef-max` (~432), `#fair-vuln` (~433), `#fair-lm-min` (~434), `#fair-lm-ml` (~435), `#fair-lm-max` (~436); bottone `#btn-run-fair` (riga ~438); risultati `#fair-result` (~439) con `#fair-p10`/`#fair-p50`/`#fair-p90`/`#fair-mean` (~441-444), `#fair-lef` (~446), `#fair-histogram` (~447), `#fair-histogram-labels` (~448); portafoglio `#fair-portfolio` (~454); registro `#fair-register-body` (~458).
• U-RISKS.5 — Vista KRI: indicatori chiave di rischio
Mostra: 4 stat-box riepilogo per stato (Critico/rosso, Attenzione/ambra, OK/verde, N/D/grigio); tabella KRI con colonne Stato (semaforo), Indicatore (nome + descrizione), Categoria, Valore (con unità), Soglia Warning, Soglia Critica, Azioni (Modifica).
Azioni: "+ Nuovo KRI" → modale creazione (U-RISKS.8); "Modifica" su riga → stessa modale precompilata.
Dati da: `GET /api/risks/kri` (campi `summary{red,amber,green,unknown}`, `kris[]`).
Confine: contenitore `#view-kri` (riga ~464); riepilogo `#kri-summary` (riga ~466); corpo tabella `#kri-table-body` (riga ~473). Il bottone "+ Nuovo KRI" non ha id (vedi ID mancanti).
• U-RISKS.6 — Vista Dettaglio rischio (generata via JS)
Mostra: bottone "Torna alla lista"; card principale con codice + titolo, blocco score "Probabilita' x Impatto = Rischio Inerente" (+ "Rischio Residuo" se presente), Descrizione, Categoria, Stato, Trattamento (Mitigare/Accettare/Trasferire/Evitare), Sorgente Minaccia, Vulnerabilita', Responsabile, Data Revisione, Articolo NIS2; card "Trattamenti" con elenco azioni (descrizione, stato, responsabile, scadenza, note); card laterale "Riepilogo" (Codice, Creato il, Aggiornato il, numero Trattamenti).
Azioni: "Torna alla lista" → ripristina la vista precedente; "Modifica" → modale modifica; "Elimina" → modale conferma; "+ Aggiungi" trattamento → modale trattamento (U-RISKS.8).
Dati da: `GET /api/risks/{id}` (include `treatments[]`).
Confine: contenitore `#view-detail` (riga ~479); contenuto interno generato via JS senza id propri (bottone back con classe `.detail-back`).
• U-RISKS.7 — Modale "Nuovo Rischio" / "Modifica Rischio" (generata via JS)
Mostra: campi Titolo*, Descrizione, Categoria, Trattamento, Sorgente Minaccia, Vulnerabilita', slider Probabilita' 1-5 (con scala ISO 27005: da "1 - Remota: <1% probabilità annua" a "5 - Quasi Certa: >70%"), slider Impatto 1-5 (da "1 - Minimo: <€10k danno" a "5 - Catastrofico: >€10M"), anteprima live "Rischio Inerente" (P×I, colore dinamico), Responsabile (ID utente), Data Revisione, Articolo NIS2 di riferimento.
Azioni: "Crea Rischio"/"Salva Modifiche" → crea o aggiorna il rischio e ricarica lista/dettaglio; "Annulla" → chiude.
Dati da: creazione: `POST /api/risks/create`; modifica: `PUT /api/risks/{id}`; precompilazione: `GET /api/risks/{id}`.
Confine: modale in `#modal-overlay` (common.js); campi JS: `#risk-title`, `#risk-description`, `#risk-category`, `#risk-treatment`, `#risk-threat-source`, `#risk-vulnerability`, `#risk-likelihood`, `#risk-impact`, `#likelihood-value`, `#impact-value`, `#likelihood-detail`, `#impact-detail`, `#score-preview-value`, `#risk-owner`, `#risk-review-date`, `#risk-nis2-article` (script righe ~1080-1156).
• U-RISKS.8 — Modali secondarie: KRI, Trattamento, Eliminazione (generate via JS)
Mostra: (a) Modale "Nuovo KRI"/"Modifica KRI": Nome indicatore*, Descrizione, Categoria, Unita (%, count, EUR...), Valore corrente, Obiettivo, Soglia Warning, Soglia Critica, Direzione (Valori alti = peggio / Valori bassi = peggio). (b) Modale "Aggiungi Trattamento": Descrizione Azione*, Responsabile (ID utente), Data Scadenza, Stato (Pianificato/In Corso/Completato), Note. (c) Modale "Conferma Eliminazione": testo con titolo del rischio.
Azioni: (a) "Salva" → crea/aggiorna KRI; (b) "Aggiungi" → crea trattamento e ricarica il dettaglio; (c) "Elimina" → cancella il rischio.
Dati da: KRI: `POST /api/risks/kri` (create) e `PUT /api/risks/kri/{id}` (update); trattamento: `POST /api/risks/{id}/treatments`; eliminazione: `DELETE /api/risks/{id}`.
Confine: tutte in `#modal-overlay`; campi KRI: `#kri-name`, `#kri-desc`, `#kri-cat`, `#kri-unit`, `#kri-cur`, `#kri-target`, `#kri-warn`, `#kri-crit`, `#kri-dir` (script righe ~764-777); campi trattamento: `#treatment-description`, `#treatment-responsible`, `#treatment-due-date`, `#treatment-status`, `#treatment-notes` (script righe ~1264-1291).
• U-RISKS.9 — Modale "Rischi Suggeriti dall'AI" (generata via JS)
Mostra: elenco scrollabile di rischi suggeriti dall'AI in base al settore/asset dell'organizzazione: titolo, descrizione, tag categoria, badge "P:n" e "I:n".
Azioni: "Chiudi" → chiude la modale (i suggerimenti non vengono inseriti automaticamente nel registro).
Dati da: `POST /api/risks/ai-suggest` (risposta array o `data.suggestions[]`).
Confine: modale in `#modal-overlay`; trigger `#btn-ai-suggest` (riga ~316).
⟦ FINE · U-RISKS ⟧
## ID STABILI MANCANTI (da aggiungere)
| Elemento | Riga | Id proposto |
|---|---|---|
| Bottone toggle "Tabella" | ~311 | `nis2-risks-toggle-tabella` |
| Bottone toggle "Matrice" | ~312 | `nis2-risks-toggle-matrice` |
| Bottone toggle "Quantitativo (FAIR)" | ~313 | `nis2-risks-toggle-fair` |
| Bottone toggle "KRI" | ~314 | `nis2-risks-toggle-kri` |
| Bottone "+ Nuovo Rischio" (header) | ~320 | `nis2-risks-btn-nuovo` |
| Bottone "+ Nuovo KRI" (vista KRI) | ~467 | `nis2-risks-btn-nuovo-kri` |
| Bottone "Torna alla lista" nel dettaglio (classe `.detail-back`, generato via JS) | script ~918 | `nis2-risks-btn-back` |