Files
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

9.2 KiB
Raw Permalink Blame History

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