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>
8.3 KiB
MAPPA-LOGICA · Gestione Incidenti
⟦ INIZIO · U-INCIDENTS · Videata "Gestione Incidenti" ⟧ File: public/incidents.html · URL: /incidents.html · Scopo: registro incidenti di sicurezza con gestione completa degli obblighi di notifica NIS2 Art. 23 (Early Warning 24h, Notifica 72h, Report Finale 1 mese al CSIRT/ACN), decision tree di significatività e timeline eventi · Profili: tutti gli utenti autenticati con organizzazione (org_admin, compliance_manager, board_member, auditor, employee, consultant; super_admin)
• U-INCIDENTS.1 — Intestazione
Mostra: titolo "Gestione Incidenti"; bottone "+ Nuovo Incidente".
Azioni: "+ Nuovo Incidente" → apre la modale di registrazione (U-INCIDENTS.3).
Dati da: nessuna API diretta.
Confine: header .content-header (riga ~268). Il bottone "+ Nuovo Incidente" non ha id (vedi ID mancanti).
• U-INCIDENTS.2 — Vista Lista: filtri + registro incidenti
Mostra: 3 filtri: classificazione (Attacco Cyber, Data Breach, Guasto Sistema, Errore Umano, Disastro Naturale, Supply Chain, Altro), severità (Critico, Alto, Medio, Basso), stato (Rilevato, In Analisi, Contenimento, Eradicazione, Ripristino, Chiuso, Post Mortem). Tabella con colonne: Codice, Titolo (con badge rosso "SIGNIFICATIVO" se applicabile), Classificazione, Severita', Stato, Rilevato (data/ora), "NIS2 Art. 23" (3 dot compatti per Early Warning 24h / Notifica 72h / Report Finale 1 mese: verde=inviato, rosso=scaduto, giallo=in scadenza <6h, grigio=in attesa; icona warning pulsante se c'è uno scaduto; "N/A" se non significativo), Azioni (matita=Aggiorna). Righe cliccabili.
Azioni: cambio filtro → ricarica la lista; click riga → dettaglio incidente (U-INCIDENTS.4); matita → modale aggiornamento (U-INCIDENTS.5).
Dati da: GET /api/incidents/list?classification=&severity=&status= (campi per i dot: early_warning_due/sent_at, notification_due/sent_at, final_report_due/sent_at, is_significant).
Confine: contenitore #view-list (riga ~277); filtri #filter-classification (riga ~279), #filter-severity (riga ~289), #filter-status (riga ~296); corpo tabella #incidents-table-body (riga ~323).
• U-INCIDENTS.3 — Modale "Registra Nuovo Incidente" con decision tree Art. 23 (generata via JS)
Mostra: campi Titolo*, Descrizione*, Classificazione, Severita' (default Medio), "Data e ora rilevamento"* (preimpostata ad adesso). Box "Criteri Art. 23 NIS2 — Incidente Significativo" (rif. Considerando 101 NIS2 / D.Lgs. 138/2024 art. 25) con 5 checkbox: interruzione grave per ≥500 utenti; durata interruzione >4 ore; impatto transfrontaliero su altri Stati Membri UE; attacco cyber o data breach con dati personali; perdita finanziaria stimata >€100.000. Esito automatico: con ≥1 criterio "l'incidente e' probabilmente SIGNIFICATIVO" (box rosso, auto-spunta la checkbox), con 0 criteri "appare NON significativo" (box verde). Checkbox "Incidente significativo (richiede notifica CSIRT/ACN ai sensi dell'Art. 23 NIS2)"; poi Servizi interessati, Utenti coinvolti, Impatto transfrontaliero, Azione dolosa / malevola.
Azioni: ogni checkbox criterio → evalSignificance() ricalcola l'esito e la spunta di significatività; "Registra Incidente" → crea l'incidente (se significativo: notifica "Scadenze NIS2 Art. 23 attivate"); "Annulla" → chiude.
Dati da: POST /api/incidents/create (body {title, description, classification, severity, detected_at, is_significant, affected_services, affected_users_count, cross_border_impact, malicious_action}).
Confine: modale in #modal-overlay (common.js); campi JS: #inc-title, #inc-description, #inc-classification, #inc-severity, #inc-detected-at, criteri #crit-users, #crit-duration, #crit-crossborder, #crit-attack, #crit-financial, esito #significance-result, #inc-significant, #inc-affected-services, #inc-affected-users, #inc-cross-border, #inc-malicious (script righe ~500-595).
• U-INCIDENTS.4 — Vista Dettaglio incidente (generata via JS)
Mostra: bottone "Torna alla lista"; card principale: codice + titolo, Classificazione, Severita', Stato, Descrizione, Data Rilevamento, Segnalato da, Assegnato a, Servizi Interessati, Utenti Coinvolti, Incidente Significativo (Si/No), Impatto Transfrontaliero, Azione Malevola, Causa Radice, Azioni di Rimedio, Lezioni Apprese. Card "NIS2 Art. 23 - Obblighi di Notifica" (solo se significativo, badge "Incidente Significativo") con timeline a 3 step: "Early Warning (24h)" (allerta iniziale al CSIRT nazionale ACN entro 24 ore), "Notifica Incidente (72h)", "Report Finale (1 mese)" — ogni step con scadenza, countdown ("N ore e M min rimanenti" / "Scaduto da..."), stato colorato (verde inviato, giallo in scadenza, rosso scaduto) e bottone di invio (con suffisso "(URGENTE)" se scaduto). Se non significativo: testo "Le notifiche NIS2 Art. 23 non sono richieste". Card "Timeline Eventi" con eventi cronologici (data/ora, descrizione, autore). Card laterale "Riepilogo" (Codice, Creato il, Aggiornato il, Chiuso il, n. Eventi Timeline) e card "Azioni Rapide" (solo se significativo) con i 3 bottoni di invio/stato notifiche.
Azioni: "Torna alla lista"; "Aggiorna" → modale aggiornamento (U-INCIDENTS.5); "+ Aggiungi Evento" → modale evento (U-INCIDENTS.6); "Invia Early Warning (24h)" / "Invia Notifica (72h)" / "Invia Report Finale (1 mese)" → modali di conferma (U-INCIDENTS.7).
Dati da: GET /api/incidents/{id} (include timeline[] e i campi scadenze/invii Art. 23).
Confine: contenitore #view-detail (riga ~336); contenuto interno generato via JS senza id propri (bottone back con classe .detail-back, timeline con classi .nis2-timeline / .event-timeline).
• U-INCIDENTS.5 — Modale "Aggiorna Incidente" (generata via JS)
Mostra: select Stato (Rilevato → Post Mortem), Causa Radice, Azioni di Rimedio, Lezioni Apprese; titolo modale con il codice incidente.
Azioni: "Salva Aggiornamento" → aggiorna l'incidente e ricarica lista/dettaglio; "Annulla" → chiude.
Dati da: precompilazione: GET /api/incidents/{id}; salvataggio: PUT /api/incidents/{id} (body {status, root_cause, remediation_actions, lessons_learned}).
Confine: modale in #modal-overlay; campi JS: #upd-status, #upd-root-cause, #upd-remediation, #upd-lessons (script righe ~653-674).
• U-INCIDENTS.6 — Modale "Aggiungi Evento alla Timeline" (generata via JS)
Mostra: select Tipo Evento (Rilevamento, Analisi, Contenimento, Eradicazione, Ripristino, Notifica, Azione, Aggiornamento, Altro) e Descrizione*.
Azioni: "Aggiungi Evento" → inserisce l'evento e ricarica il dettaglio; "Annulla" → chiude.
Dati da: POST /api/incidents/{id}/timeline (body {event_type, description}).
Confine: modale in #modal-overlay; campi JS: #event-type, #event-description (script righe ~1140-1158).
• U-INCIDENTS.7 — Modali di conferma notifiche NIS2 Art. 23 (generate via JS)
Mostra: 3 modali di conferma: "Conferma Early Warning" (registra l'invio dell'allerta iniziale 24h al CSIRT nazionale/ACN, con avviso di trasmettere la comunicazione anche sui canali ufficiali), "Conferma Notifica CSIRT" (notifica 72h con valutazione iniziale, gravità, impatto e indicatori di compromissione), "Conferma Report Finale" (report a 1 mese con descrizione dettagliata, causa radice, misure di mitigazione, impatto transfrontaliero).
Azioni: "Conferma Invio" → registra a sistema l'invio della notifica e ricarica il dettaglio; "Annulla" → chiude.
Dati da: POST /api/incidents/{id}/early-warning; POST /api/incidents/{id}/notification; POST /api/incidents/{id}/final-report.
Confine: modali in #modal-overlay; trigger generati via JS nel dettaglio (funzioni doSendEarlyWarning/doSendNotification/doSendFinalReport, script righe ~1045-1136), senza id sui bottoni (vedi ID mancanti).
⟦ FINE · U-INCIDENTS ⟧
ID STABILI MANCANTI (da aggiungere)
| Elemento | Riga | Id proposto |
|---|---|---|
| Bottone "+ Nuovo Incidente" (header) | ~271 | nis2-incidents-btn-nuovo |
Bottone "Torna alla lista" nel dettaglio (classe .detail-back, generato via JS) |
script ~765 | nis2-incidents-btn-back |
| Bottoni "Invia Early Warning / Notifica / Report Finale" (Azioni Rapide e timeline, generati via JS) | script ~919-921 | nis2-incidents-btn-early-warning, nis2-incidents-btn-notifica-72h, nis2-incidents-btn-report-finale |