[AI+HELP+I18N] Help workflow, traduzioni IT/EN, schema 5 livelli AI
- help.js: aggiunta sezione workflow (Compliance Journey) + pageMap entry - i18n.js: 16 chiavi IT/EN per workflow (fasi, stati, etichette) - docs/AI_LEVELS_SCHEMA.md: schema architettura 5 livelli AI con privacy matrix L1 Guida (safe), L2 Operativo, L3 Aziendale (anonimizzato), L4 Cross-Org (k-anonymity), L5 Normativo Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
3e8f24eb49
commit
89fd201bc2
224
docs/AI_LEVELS_SCHEMA.md
Normal file
224
docs/AI_LEVELS_SCHEMA.md
Normal file
@ -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*
|
||||||
@ -502,6 +502,67 @@ const HelpSystem = (function () {
|
|||||||
'Allegato II - Altri settori critici',
|
'Allegato II - Altri settori critici',
|
||||||
'Art. 20 - Governance'
|
'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: [
|
||||||
|
'<strong>Fase 1 - Preparazione</strong>: onboarding, configurazione organizzazione, definizione team e ruoli.',
|
||||||
|
'<strong>Fase 2 - Valutazione</strong>: gap assessment Art.21 (80 domande), inventario asset, valutazione supply chain.',
|
||||||
|
'<strong>Fase 3 - Rischi</strong>: risk register, piano di trattamento, suggerimenti AI per settore.',
|
||||||
|
'<strong>Fase 4 - Implementazione</strong>: policy approvate, formazione completata, controlli ISO 27001 implementati.',
|
||||||
|
'<strong>Fase 5 - Monitoraggio</strong>: gestione incidenti Art.23, NCR/CAPA, aggiornamenti normativi, whistleblowing.',
|
||||||
|
'<strong>Fase 6 - Reportistica</strong>: report esecutivo, audit chain SHA-256, export certificato.'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
heading: 'Come Leggere il Percorso',
|
||||||
|
items: [
|
||||||
|
'<span style="color:var(--secondary)"><strong>Completato</strong></span> - la fase ha raggiunto gli obiettivi minimi di compliance.',
|
||||||
|
'<span style="color:var(--warning)"><strong>In corso</strong></span> - la fase e\' stata avviata ma non ancora completata.',
|
||||||
|
'<span style="color:var(--primary)"><strong>Attivo</strong></span> - fase di monitoraggio continuo, sempre attiva una volta avviata.',
|
||||||
|
'<span style="color:var(--gray-400)"><strong>Da iniziare</strong></span> - fase non ancora avviata.',
|
||||||
|
'La <strong>percentuale</strong> su ogni fase mostra il livello di completamento basato sui dati reali della piattaforma.'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
heading: 'Prossima Azione Consigliata',
|
||||||
|
items: [
|
||||||
|
'Il <strong>banner blu</strong> 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 <strong>fase nella roadmap</strong> 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 <strong>Dashboard</strong> mostra KPI numerici e attivita\' recenti — risponde a "come sto?".',
|
||||||
|
'Il <strong>Compliance Journey</strong> 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',
|
'reports': 'reports',
|
||||||
'audit': 'reports',
|
'audit': 'reports',
|
||||||
'settings.html': 'settings',
|
'settings.html': 'settings',
|
||||||
'settings': 'settings'
|
'settings': 'settings',
|
||||||
|
'workflow.html': 'workflow',
|
||||||
|
'workflow': 'workflow'
|
||||||
};
|
};
|
||||||
|
|
||||||
// ── Stili CSS (iniettati una sola volta) ─────────────────────────
|
// ── Stili CSS (iniettati una sola volta) ─────────────────────────
|
||||||
|
|||||||
@ -181,6 +181,25 @@ const I18n = (function () {
|
|||||||
'time.hours_ago': { it: 'ore fa', en: 'hours ago' },
|
'time.hours_ago': { it: 'ore fa', en: 'hours ago' },
|
||||||
'time.yesterday': { it: 'Ieri', en: 'Yesterday' },
|
'time.yesterday': { it: 'Ieri', en: 'Yesterday' },
|
||||||
'time.days_ago': { it: 'giorni fa', en: 'days ago' },
|
'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 ──────────────────────────────────────────────────
|
// ── API Pubblica ──────────────────────────────────────────────────
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user