# 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*
