diff --git a/docs/AI_LEVELS_SCHEMA.md b/docs/AI_LEVELS_SCHEMA.md new file mode 100644 index 0000000..455943f --- /dev/null +++ b/docs/AI_LEVELS_SCHEMA.md @@ -0,0 +1,224 @@ +# Schema Livelli AI — NIS2 Agile +> Versione 1.0 — 2026-03-09 +> Documento di architettura per l'evoluzione dell'integrazione AI nella piattaforma + +--- + +## Overview + +La piattaforma NIS2 Agile prevede 5 livelli progressivi di assistenza AI, ciascuno con un perimetro di conoscenza, accesso ai dati e vincoli di privacy distinti. + +``` +L1 Guida Piattaforma → Dati: nessuno → Tutti +L2 Assistente Operativo → Dati: sessione corrente → Tutti +L3 Assistente Aziendale → Dati: org corrente → Org-scoped +L4 Analisi Cross-Org → Dati: org multiple → Consultant / Super Admin +L5 Feed Normativo AI → Dati: pubblici/ACN → Tutti +``` + +--- + +## L1 — Guida Piattaforma +**"Cosa fa questa funzione?"** + +### Scopo +Spiegare le funzionalità del software NIS2 Agile: come usare ogni modulo, cosa significano i campi, come interpretare i risultati. + +### Dati in ingresso al modello +- Pagina corrente (es. `risks.html`) +- Domanda dell'utente +- **Nessun dato aziendale** — il prompt non include mai dati dell'organizzazione + +### Perimetro risposta AI +- Spiegare interfaccia, workflow, pulsanti, campi +- Spiegare la normativa NIS2 in termini generali +- Non può rispondere su dati specifici dell'organizzazione + +### Implementazione attuale +→ `HelpSystem` in `help.js` — già implementato (modale contestuale per pagina) +→ **Evoluzione**: aggiungere chat testuale basata su Claude API con contesto solo documentazione piattaforma + +### Privacy +✅ **Nessun rischio** — zero dati personali o aziendali nel prompt + +--- + +## L2 — Assistente Operativo +**"Come faccio a...?"** + +### Scopo +Guidare l'utente nell'esecuzione di operazioni specifiche: "come compilo l'assessment?", "come classifico questo rischio?", "cosa devo scrivere nel campo X?". + +### Dati in ingresso al modello +- Pagina corrente + stato del form (campo attivo, errori) +- Domanda dell'utente +- **Solo dati minimi di contesto** (es. "stai compilando il campo 'impatto' di un rischio") +- **No PII, no dati sensibili** dell'organizzazione + +### Perimetro risposta AI +- Istruzioni operative step-by-step +- Suggerimenti contestuali sul campo corrente +- Best practice NIS2 per il dato che si sta inserendo + +### Implementazione +→ **Da costruire**: chat widget flottante attivabile per pagina +→ Prompt di sistema: documentazione operativa + pagina corrente +→ Modello suggerito: `claude-haiku-4-5` (economico, bassa latenza) + +### Privacy +✅ **Rischio basso** — includere solo tipo di form/campo, mai i valori inseriti + +--- + +## L3 — Assistente Aziendale +**"Come siamo messi noi?"** + +### Scopo +Rispondere a domande sui dati reali dell'organizzazione corrente: "quali sono i nostri rischi critici?", "cosa manca per completare il gap assessment?", "quali policy non sono ancora approvate?". + +### Dati in ingresso al modello +- Dati aggregati dell'organizzazione corrente (stesso multi-tenancy JWT) +- Gap assessment: punteggi per categoria +- Risk register: numero e livelli rischi, trattamenti +- Policy: stato approvazione +- Training: % completamento +- **Dati anonimizzati**: nomi persone → ruoli, fatturato → range, nome org → settore+dimensione + +### Perimetro risposta AI +- Analisi dello stato di compliance specifico dell'org +- Priorità di intervento personalizzate +- Raccomandazioni basate sui gap reali +- Previsioni di rischio + +### Implementazione attuale parziale +→ `AIService.php` — `analyzeGapAssessment()`, `suggestRisks()`, `generatePolicy()`, `classifyIncident()` già implementati +→ **Evoluzione**: aggiungere endpoint conversazionale `/api/ai/chat` con contesto org anonimizzato + +### Anonimizzazione applicata (già in AIService.php) +```php +// Già implementato: +- employeeRange(): dipendenti → range (micro/piccola/media/grande) +- settore → codice ATECO, NON nome azienda +- NO nome organizzazione nel prompt +- NO fatturato esatto (solo range) +- NO nomi di persone +``` + +### Privacy +⚠️ **Attenzione moderata** +- Dati limitati all'org dell'utente autenticato (multi-tenancy garantito da `requireOrgAccess()`) +- Anonimizzazione obbligatoria prima dell'invio ad Anthropic +- Log AI interaction in `ai_interactions` table per audit +- **GDPR**: dati inviati a Anthropic USA → DPA Agreement necessario (verificare contratto) + +--- + +## L4 — Analisi Cross-Organizzazione +**"Come si confrontano i miei clienti?"** + +### Scopo +Permettere a consulenti, CISO multi-cliente e super_admin di analizzare pattern, benchmark e confronti **aggregati e anonimi** tra organizzazioni diverse. + +**Esempi di query valide:** +- "Qual è il gap medio nel settore sanità tra i miei clienti?" +- "Quali rischi sono più frequenti nelle PMI del settore energia?" +- "Benchmark: come si posiziona questo cliente rispetto agli altri?" + +### Ruoli autorizzati +- `consultant` — solo le org di cui è membro (`user_organizations`) +- `super_admin` — tutte le org della piattaforma + +### Dati in ingresso al modello +- **AGGREGATI**: medie, percentuali, distribuzioni — mai dati di singola org +- **ANONIMI**: organizzazioni identificate come "Org A", "Org B" — mai nome reale +- Settore e dimensione: consentiti (non identificativi singolarmente) +- **VIETATO**: nome org, P.IVA, referenti, incidenti specifici, dati PII + +### Regola fondamentale +> **Un consulente NON deve mai poter ricostruire i dati di un'organizzazione specifica attraverso l'AI. Solo aggregati.** + +### Implementazione +→ **Da costruire**: `AIService::crossOrgAnalysis()` con: + - Query aggregata su DB (GROUP BY settore/dimensione) + - Anonimizzazione labels prima del prompt + - Filtro ruolo in `requireOrgAccess()` — verifica membership consultant + - Endpoint: `POST /api/ai/cross-analysis` (solo `consultant`, `super_admin`) + +### Privacy — CRITICO +🔴 **Alto rischio — implementare con cura** +- MAI passare org_id nel prompt +- MAI passare nomi, P.IVA, email nel prompt +- Aggregazione minima: almeno 3 organizzazioni per gruppo (k-anonymity) +- Audit log obbligatorio di ogni query cross-org (chi ha chiesto cosa, quando) +- **Consenso**: verificare se GDPR richiede consenso esplicito per analisi comparativa +- Il modello deve rispondere SOLO in forma aggregata — aggiungere istruzione nel system prompt: + > "Non fornire mai dati riferibili a una singola organizzazione. Rispondi solo con statistiche aggregate." + +--- + +## L5 — Feed Normativo AI +**"Cosa cambia con la nuova circolare ACN?"** + +### Scopo +Aggiornamenti normativi automatici e analisi dell'impatto sulle organizzazioni: nuove circolari ACN, aggiornamenti DORA, modifiche D.Lgs. 138/2024, sentenze rilevanti. + +### Dati in ingresso al modello +- Testo normativo (fonte pubblica: GU, ACN, EUR-Lex) +- Classificazione dell'organizzazione corrente (Essenziale/Importante/settore) +- **No dati interni** dell'organizzazione + +### Perimetro risposta AI +- Riepilogo delle novità normative in linguaggio semplice +- Impatto specifico per tipo di soggetto NIS2 (Essenziale vs Importante) +- Scadenze e obblighi derivanti dall'aggiornamento +- Collegamento ai moduli della piattaforma da aggiornare + +### Implementazione attuale +→ `NormativeController.php` — feed già implementato con ACK tracciato +→ **Evoluzione**: aggiungere `AIService::analyzeNormativeUpdate()` che: + - Riceve il testo normativo + - Genera riassunto + impatto per la classificazione dell'org + - Suggerisce i controlli/policy da aggiornare + +### Privacy +✅ **Nessun rischio significativo** — dati normativi pubblici + solo classificazione org (non identificativa) + +--- + +## Matrice Riepilogativa + +| Livello | Chi | Dati AI | Privacy | Stato | +|---------|-----|---------|---------|-------| +| **L1** Guida Piattaforma | Tutti | Nessuno | ✅ Safe | ✅ Implementato (help.js) | +| **L2** Assistente Operativo | Tutti | Contesto UI | ✅ Safe | 🔵 Da costruire | +| **L3** Assistente Aziendale | Utenti org | Dati org anonimizzati | ⚠️ Attenzione | ✅ Parziale (AIService) | +| **L4** Cross-Org Analysis | Consultant / Admin | Aggregati anonimi | 🔴 Alto | 🔵 Da costruire | +| **L5** Feed Normativo | Tutti | Testi pubblici | ✅ Safe | 🔵 Evoluzione normative | + +--- + +## Principi Privacy Trasversali + +1. **Data Minimization**: inviare ad Anthropic solo il minimo indispensabile +2. **Anonimizzazione sistematica**: nomi → ruoli, fatturati → range, org → settore+dim +3. **Audit trail**: ogni chiamata AI loggata in `ai_interactions` con timestamp, user, tipo +4. **Scope enforcement**: il layer PHP verifica sempre `requireOrgAccess()` prima di costruire il prompt +5. **No PII in prompt**: vietato nome persona, email, CF, P.IVA nel prompt +6. **K-anonymity per L4**: aggregare su minimo 3 org per evitare identificazione indiretta +7. **DPA Anthropic**: verificare Data Processing Agreement per trattamento dati EU + +--- + +## Prossimi Sprint Suggeriti + +| Priorità | Feature | Livello | Effort | +|----------|---------|---------|--------| +| Alta | Chat widget contestuale per pagina | L2 | 3 giorni | +| Alta | `POST /api/ai/chat` con contesto org | L3 | 2 giorni | +| Media | `analyzeNormativeUpdate()` per feed ACN | L5 | 1 giorno | +| Bassa | Cross-org benchmark per consultant | L4 | 5 giorni | + +--- + +*Documento mantenuto da: Claude Code / Team NIS2 Agile* +*Aggiornare a ogni modifica architettura AI o normativa privacy* diff --git a/public/js/help.js b/public/js/help.js index 4b6c752..fe20dbb 100644 --- a/public/js/help.js +++ b/public/js/help.js @@ -502,6 +502,67 @@ const HelpSystem = (function () { 'Allegato II - Altri settori critici', 'Art. 20 - Governance' ] + }, + + // ─── Compliance Journey / Workflow ─────────────────────────── + 'workflow': { + title: 'Guida - Compliance Journey', + intro: 'La pagina Compliance Journey visualizza l\'intero percorso di conformita\' NIS2 come una roadmap interattiva a 6 fasi. Mostra lo stato reale di ogni modulo con dati live, guida verso la prossima azione da completare e permette di navigare direttamente a ciascun modulo.', + sections: [ + { + heading: 'Roadmap a 6 Fasi', + items: [ + 'Fase 1 - Preparazione: onboarding, configurazione organizzazione, definizione team e ruoli.', + 'Fase 2 - Valutazione: gap assessment Art.21 (80 domande), inventario asset, valutazione supply chain.', + 'Fase 3 - Rischi: risk register, piano di trattamento, suggerimenti AI per settore.', + 'Fase 4 - Implementazione: policy approvate, formazione completata, controlli ISO 27001 implementati.', + 'Fase 5 - Monitoraggio: gestione incidenti Art.23, NCR/CAPA, aggiornamenti normativi, whistleblowing.', + 'Fase 6 - Reportistica: report esecutivo, audit chain SHA-256, export certificato.' + ] + }, + { + heading: 'Come Leggere il Percorso', + items: [ + 'Completato - la fase ha raggiunto gli obiettivi minimi di compliance.', + 'In corso - la fase e\' stata avviata ma non ancora completata.', + 'Attivo - fase di monitoraggio continuo, sempre attiva una volta avviata.', + 'Da iniziare - fase non ancora avviata.', + 'La percentuale su ogni fase mostra il livello di completamento basato sui dati reali della piattaforma.' + ] + }, + { + heading: 'Prossima Azione Consigliata', + items: [ + 'Il banner blu in cima alla pagina indica sempre la prossima azione piu\' urgente da completare.', + 'Il suggerimento si aggiorna automaticamente in base allo stato reale dei moduli.', + 'Clicca sul link nel banner per navigare direttamente al modulo corrispondente.' + ] + }, + { + heading: 'Card di Dettaglio Fase', + items: [ + 'Clicca su una fase nella roadmap per espandere il dettaglio degli step.', + 'Ogni card mostra: stato badge (Completato/In corso/Da iniziare), metrica numerica reale, link diretto al modulo.', + 'Le metriche sono calcolate in tempo reale interrogando tutti i moduli della piattaforma.', + 'Clicca direttamente sulla card per accedere al modulo corrispondente.' + ] + }, + { + heading: 'Differenza con la Dashboard', + items: [ + 'La Dashboard mostra KPI numerici e attivita\' recenti — risponde a "come sto?".', + 'Il Compliance Journey mostra il processo sequenziale — risponde a "dove sono nel percorso?" e "cosa devo fare dopo?".', + 'Usa il Journey per pianificare le priorita\' di intervento e comunicare lo stato al board.' + ] + } + ], + references: [ + 'Art. 21 - Misure di gestione dei rischi di cibersicurezza (10 categorie)', + 'Art. 20 - Governance e responsabilita\' degli organi di gestione', + 'Art. 23 - Obblighi di segnalazione degli incidenti significativi', + 'D.Lgs. 138/2024 - Recepimento NIS2 in Italia', + 'ACN - Linee guida attuative per i soggetti NIS2' + ] } }; @@ -529,7 +590,9 @@ const HelpSystem = (function () { 'reports': 'reports', 'audit': 'reports', 'settings.html': 'settings', - 'settings': 'settings' + 'settings': 'settings', + 'workflow.html': 'workflow', + 'workflow': 'workflow' }; // ── Stili CSS (iniettati una sola volta) ───────────────────────── diff --git a/public/js/i18n.js b/public/js/i18n.js index 92b7b40..7dada48 100644 --- a/public/js/i18n.js +++ b/public/js/i18n.js @@ -181,6 +181,25 @@ const I18n = (function () { 'time.hours_ago': { it: 'ore fa', en: 'hours ago' }, 'time.yesterday': { it: 'Ieri', en: 'Yesterday' }, 'time.days_ago': { it: 'giorni fa', en: 'days ago' }, + + // ── Compliance Journey / Workflow ────────────── + 'workflow.title': { it: 'Compliance Journey', en: 'Compliance Journey' }, + 'workflow.progress': { it: 'Progresso Art.21 NIS2', en: 'NIS2 Art.21 Progress' }, + 'workflow.implementation': { it: 'implementazione misure', en: 'measures implementation' }, + 'workflow.next_action': { it: 'Prossima azione consigliata', en: 'Recommended next action' }, + 'workflow.phase': { it: 'Fase', en: 'Phase' }, + 'workflow.go_to_module': { it: 'Vai al modulo', en: 'Go to module' }, + 'workflow.ph1': { it: 'Preparazione', en: 'Preparation' }, + 'workflow.ph2': { it: 'Valutazione', en: 'Assessment' }, + 'workflow.ph3': { it: 'Rischi', en: 'Risks' }, + 'workflow.ph4': { it: 'Implementazione', en: 'Implementation' }, + 'workflow.ph5': { it: 'Monitoraggio', en: 'Monitoring' }, + 'workflow.ph6': { it: 'Reportistica', en: 'Reporting' }, + 'workflow.status_done': { it: 'Completato', en: 'Completed' }, + 'workflow.status_partial': { it: 'In corso', en: 'In progress' }, + 'workflow.status_active': { it: 'Attivo', en: 'Active' }, + 'workflow.status_todo': { it: 'Da iniziare', en: 'To do' }, + 'nav.workflow': { it: 'Compliance Journey', en: 'Compliance Journey' }, }; // ── API Pubblica ──────────────────────────────────────────────────