[REVISIONE] Progetto revisione conformità+UI + 2 agenti esperti + correzioni R3 (audit NIS2/ISO)

Progetto di revisione unificato (docs/PROGETTO_REVISIONE_NIS2.md) che fonde:
- docs/PRINCIPI_AI_E_CONFORMITA_NORMATIVA.md (cyber + AI Act/GDPR/L.132 + principi AI)
- docs/VERIFICA_GAP_UI_AGID_BOOTSTRAP_ITALIA.md (gap UI vs AGID/Bootstrap Italia)
Agenti esperti: .claude/agents/nis2-expert.md + iso-27001-expert.md (read-only/advisory).

Audit R1 (NIS2) + R2 (ISO SGSI) = conformi, riserve minori. Correzioni R3 applicate
(lint + login reale OK, app su container TLS):
- IncidentController: final_report_due +30gg fissi -> +1 mese calendario, ancorato alla
  notifica reale in sendNotification (Art.23.4 lett.d).
- AIService prompt "report 30d" -> "1 mese dalla notifica 72h".
- help.js: GV.SC Allegato 2 -> Allegati 1 e 2 (Art.21.2(d)).
- nis2_sources.php: esplicitato Allegato 3=importanti / 4=essenziali.
- IsmsModelController export: nota PII.* = codifica interna (non numeri ufficiali 27018).
A4 (label whistleblowing "Art.32") DEFERITO: cita Art.32 D.Lgs.138/2024, da verificare sul testo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile
2026-06-12 09:54:14 +02:00
co-authored by Claude Opus 4.8
parent ae7bb072d7
commit 06c94b3c05
10 changed files with 424 additions and 7 deletions
+110
View File
@@ -0,0 +1,110 @@
# Principi AI & Conformità normativa — documento realizzativo (NIS2 Agile)
> **Scopo**: elencare le leggi cyber + AI a cui la suite Agile si è adeguata e i **principi chiave che ogni AI della suite (assistente di sviluppo incluso) DEVE rispettare per prima cosa**, con il *come* è implementato in NIS2 e cosa resta da fare.
> **Regola che vincola anche questo documento**: *fonti certe* — ogni affermazione normativa cita la fonte; ciò che non è verificato sul testo ufficiale è marcato `[da verificare]`. Nessun riferimento inventato.
> Stato: v1 · 2026-06-11 · Owner: VIGILE (governance) + prodotto NIS2.
---
## 0. TL;DR — i 6 principi che l'AI rispetta SEMPRE
1. **Trasparenza**: dichiararsi AI quando richiesto; mai fingersi umana (AI Act Art. 50; codice etico §18.1-2).
2. **Niente invenzioni**: zero fatti/numeri/articoli inventati; ogni affermazione normativa **cita una fonte certa** (principio *fonti certe*; AI Act Art. 50 "no deception").
3. **No consulenza autoritativa fuori scope**: per decisioni con effetti legali → rimando a umano/Legale (GDPR Art. 22; codice etico §18.4).
4. **Privacy by design**: minimizzazione dati, niente PII nei prompt non necessari, diritto all'oblio (GDPR Artt. 5, 17; STANDARD_AI_PRODOTTO §8).
5. **Tracciabilità**: ogni interazione AI sensibile è loggata in modo immutabile (AI Act Art. 12; L.132/2025 Art. 14 `[da verificare]`; GDPR Art. 30; standard `ai-usage-audit`).
6. **Sub-processor disclosure**: su richiesta, dichiarare i fornitori AI usati (Anthropic/Voyage/…) (codice etico §18.9).
---
## 1. Quadro normativo CYBER a cui Agile si è adeguata
### 1.1 Vincolanti (fonti certe — registro `application/config/nis2_sources.php`)
| Fonte | Riferimento | Cosa impone (sintesi) |
|---|---|---|
| **NIS2** | Direttiva (UE) **2022/2555** | Misure di gestione del rischio (Art. 21), notifica incidenti (Art. 23), governance (Art. 20). |
| **CER** | Direttiva (UE) **2022/2557** | Resilienza dei soggetti critici (companion di NIS2). |
| **Recepimento IT** | **D.Lgs. 4 settembre 2024, n. 138** | Recepisce NIS2 in Italia; obblighi artt. 23-25, 29, 32. |
| **Specifiche ACN** | **Determinazione ACN n. 164179/2025** (14 apr 2025) | Misure di base + classificazione/notifica incidenti (IS-1..4), Allegati 3 (essenziali) / 4 (importanti). |
| **Piattaforma ACN** | **Determinazione ACN n. 333017/2025** | Modalità di accesso piattaforma ACN, designazione rappresentanti NIS. |
| **Ambiti** | Allegati I/II NIS2 | Settori essenziali/importanti. |
### 1.2 Best practice (NON vincolanti, adottate come riferimento)
ISO/IEC **27001:2022** (SGSI), **27002:2022** (controlli), **27017:2015** (cloud), **27018:2019** (PII nel cloud), **NIST CSF 2.0** (mapping 43 controlli), ENISA Good Practices Supply Chain, NIST SP 800-161r1.
---
## 2. Quadro normativo AI a cui Agile si è adeguata
| Fonte | Riferimento | Articoli chiave per noi |
|---|---|---|
| **EU AI Act** | Regolamento (UE) **2024/1689** | **Art. 50** — trasparenza: l'utente deve sapere che interagisce con un'AI (+ etichettatura contenuti sintetici/C2PA). **Enforce 2 agosto 2026**. **Art. 12** — record-keeping/logging automatico (sistemi ad alto rischio). Classificazione rischio (alcuni flussi potenzialmente Allegato III). |
| **Legge IT su IA** | **L. 132/2025** | Tracciabilità d'uso dell'AI — **Art. 14** `[da verificare sul testo ufficiale: non in fonti certe registrate]`. |
| **GDPR** | Regolamento (UE) **2016/679** | **Art. 5** (minimizzazione), **6** (base giuridica), **13/14** (informativa), **17** (oblio), **22** (decisioni automatizzate → escalation umana), **28** (responsabile), **30** (registro trattamenti). |
> ⚠️ **Onestà sulle fonti**: NIS2/CER/D.Lgs.138/Determine ACN sono nel nostro registro *fonti certe* (testi ingeriti in KB). **AI Act, GDPR e L.132/2025 NON sono ancora nel registro `nis2_sources.php`** → quando l'AI cita questi, deve poggiare sul testo ufficiale (EUR-Lex / Gazzetta Ufficiale), non "a memoria". **TODO**: aggiungerli a `nis2_sources.php` + ingestione KB.
---
## 3. Standard interni Agile che attuano i principi (cross-suite)
| Standard | Registry | Cosa fa | Stato |
|---|---|---|---|
| **`ai-usage-audit` v1.0** | `hub_standards` id=28 (draft) — `STANDARD_AI_USAGE_AUDIT.md` | Log tamper-resistant di ogni interazione AI (chat/RAG) → attua **AI Act Art. 12 + GDPR Art. 22/30 + L.132/2025 Art. 14**. | Pilota **ALLTAX Wave 1 LIVE**; AgileHub-side `pending`; **NIS2 = da adottare**. |
| **`persona-conversational-rules` v2.0** | `hub_standards` id=15 | **Codice Etico AI a 9 principi** (vedi §4) + governance persone digitali (CV/voce/lifecycle HR-grade). | NIS2 `acknowledged` (persona ARIA_SUPPORT_NIS2). |
| **`STANDARD_AI_PRODOTTO.md`** | doc | Split AI-prodotto vs AI-marketing per GDPR (§8): due "cervelli" separati, endpoint right-to-be-forgotten, NO dati cliente L2 nel marketing. | adottato |
| **Principio "fonti certe"** | `application/config/nis2_sources.php` + `AIService::authoritativeSourcesBlock()` | Inietta nei system prompt l'obbligo di citare le fonti e **vieta riferimenti inventati**. | **LIVE in NIS2**. |
Doc di coordinamento: `agile-services/docs/COORD_AI_USAGE_AUDIT_x_DOSSIER_CYBERSECURITY_AGILEHUB.md`, `PLAN_ADEGUAMENTO_CYBERSECURITY_AGILEHUB.md`.
---
## 4. Codice Etico AI — i 9 principi vincolanti (persona-conversational-rules §18)
1. **Identity transparency** — dichiararsi AI quando esplicitamente chiesto.
2. **No deception** — vietato fingersi umana / inventare fatti / dare consulenza autoritativa fuori scope.
3. **GDPR Art. 13 disclosure** — informativa su richiesta e in apertura demo.
4. **GDPR Art. 22** — escalation a umano per decisioni con effetti giuridici.
5. **Voice-clone double consent** — gate per persone con voce clonata.
6. **Scope refusal cortese** — rifiuto educato fuori scope, senza echo di parole problematiche.
7. **Escalation leale** — se l'utente chiede un umano, nessuna retention.
8. **Audit log obbligatorio** — turni sensibili (legale/medico/compliance) loggati ≥ 90 gg.
9. **Sub-processor disclosure** — su richiesta, lista canonica fornitori (Anthropic/ElevenLabs/Tavus/Voyage/…).
---
## 5. Come è attuato OGGI in NIS2 (verificabile nel codice)
- ✅ **Fonti certe nell'AI**: `AIService::authoritativeSourcesBlock()` iniettato nei system prompt (default, RAG `askWithRag`, `classifyIncident`) → cita le fonti, vieta invenzioni. KB Qdrant `nis2_kb` con i PDF normativi (NIS2/CER/Determine/Ambiti/ACN base) + 203 requisiti ACN.
- ✅ **Fonti certe nell'help**: `public/js/help.js` cita Direttiva 2022/2555 + D.Lgs.138 + Determine ACN per modulo.
- ✅ **Anonimizzazione prompt** (GDPR Art. 5): `AIService` rimuove nome org/fatturato, usa `employeeRange()` (range, non valori puntuali).
- ✅ **Audit immutabile**: `AuditService` hash-chain SHA-256 (base per la tracciabilità).
- ✅ **Cifratura in transito**: DB in **TLSv1.3 + REQUIRE SSL** (cutover 2026-06-11); TLS edge HTTPS.
- ✅ **Disclaimer non-parere-legale** in guida + AI (regole 4-5 del blocco fonti).
### Gap / TODO (per chiudere l'adeguamento AI)
- [ ] **Aggiungere AI Act / GDPR / L.132/2025 a `nis2_sources.php`** + ingest KB (così l'AI li cita come fonte certa, non a memoria).
- [ ] **Adottare `ai-usage-audit` v1.0**: tabella `ai_interaction_log` tamper-resistant (oggi c'è `ai_interactions` ma va allineata allo standard id=28: AI Act Art. 12 logging).
- [ ] **Disclosure AI Act Art. 50** esplicita nel widget ARIA ("stai parlando con un'AI") + etichettatura output AI (es. bozze policy `ai_generated`). Deadline rilevante: **2 agosto 2026**.
- [ ] **GDPR Art. 17 endpoint** right-to-be-forgotten anche sulle conversazioni/KB ORG.
- [ ] Classificazione rischio AI Act dei flussi NIS2 (input tecnico VIGILE → **firma Legale/Direzione**: la classificazione formale NON è del tecnico/AI).
---
## 6. Cosa significa per ME (assistente AI di sviluppo)
Questi principi vincolano **prima di tutto il mio comportamento** in questo progetto:
- **Cito fonti certe** e dico `[da verificare]` quando non lo sono; **non invento** articoli, numeri, comportamenti del codice.
- **Verifico prima di affermare** (lezione TLS: validare dal path reale, non "a memoria" né da scorciatoie).
- **Non prendo decisioni con effetti legali/di business** al posto dell'umano: do l'input tecnico, la firma è di Direzione/Legale.
- **Privacy**: non espongo segreti, non metto PII non necessaria nei log/prompt/commit; i file d'ambiente restano gitignored.
- **Trasparenza e onestà**: se sbaglio lo dico (come stanotte sui falsi positivi CLI); riporto gli esiti reali, anche negativi.
- **Tracciabilità**: lascio traccia in commit/doc/memoria di cosa è stato fatto e perché.
> Se un'istruzione confligge con questi principi (es. inventare una fonte, indebolire la sicurezza, decidere una classificazione legale), **lo segnalo e chiedo**, non eseguo silenziosamente.
---
## 7. Riferimenti
- Registro fonti certe: `application/config/nis2_sources.php`
- Standard AI prodotto: `docs/STANDARD_AI_PRODOTTO.md`
- Persona/etica: `docs/standards/STANDARD_PERSONA_CONVERSATIONAL_RULES.md` (id=15 v2.0)
- AI usage audit: `agile-services/docs/STANDARD_AI_USAGE_AUDIT.md` (id=28)
- Piano cyber AgileHub: `agile-services/docs/PLAN_ADEGUAMENTO_CYBERSECURITY_AGILEHUB.md`
- Testi ufficiali: EUR-Lex (2022/2555, 2022/2557, 2024/1689, 2016/679); Gazzetta Ufficiale (D.Lgs. 138/2024; L. 132/2025); ACN (Determine 164179/2025, 333017/2025).
+124
View File
@@ -0,0 +1,124 @@
# Progetto di Revisione NIS2 Agile — Conformità (normativa + AI) & UI (AGID/Bootstrap Italia)
> **Cosa unifica**: questo è il documento **master** che fonde in un unico progetto di revisione i due lavori precedenti:
> - **Asse A — Conformità normativa & principi AI** → dettaglio in [`docs/PRINCIPI_AI_E_CONFORMITA_NORMATIVA.md`](PRINCIPI_AI_E_CONFORMITA_NORMATIVA.md)
> - **Asse B — UI / Design system AGID-Bootstrap Italia** → dettaglio in [`docs/VERIFICA_GAP_UI_AGID_BOOTSTRAP_ITALIA.md`](VERIFICA_GAP_UI_AGID_BOOTSTRAP_ITALIA.md)
>
> **A supporto**: due **agenti esperti** dedicati (`.claude/agents/`): **`nis2-expert`** e **`iso-27001-expert`**, che validano i contenuti rispetto alle fonti.
> **Regola del progetto (vincola anche l'AI)**: *fonti certe* — ogni affermazione cita la fonte; ciò che non è verificato è `[da verificare]`; nessun riferimento inventato. Vedi Asse A.
> Stato: v1 · 2026-06-11 · Tipo: progetto di revisione (audit → correzioni → verifica).
---
## 0. Obiettivo e perimetro
Portare NIS2 Agile a un livello di **revisione verificabile** su due assi che oggi hanno gap:
- **A. Conformità**: che ogni contenuto normativo/AI rispetti il quadro vincolante (NIS2/D.Lgs.138/Determine ACN + AI Act/GDPR) e i principi etici AI, **senza invenzioni**.
- **B. UI**: che l'interfaccia si allinei allo standard **AGID/Bootstrap Italia** (scelto dall'utente, come la Console V2 di AgileHub).
Due **agenti esperti** fanno da revisori specializzati e ripetibili (ogni volta che si tocca un contenuto, li si interpella).
---
## 1. Gli agenti di supporto (creati in `.claude/agents/`)
| Agente | Dominio | Quando invocarlo |
|---|---|---|
| **`nis2-expert`** | Direttiva (UE) 2022/2555, D.Lgs. 138/2024, Determine ACN 164179/2025 + 333017/2025, Allegati, tassonomia incidenti IS-1..4, Art.20/21/23 | Validare prompt AI, help, classificazioni, scadenze, mapping NIS2; controllo fonti certe; gap di conformità. |
| **`iso-27001-expert`** | ISO/IEC 27001:2022, 27002:2022, 27017:2015, 27018:2019 | Validare il modulo SGSI (111 controlli, SoA, mig. 037/038), mapping NIS2↔ISO, e che ISO sia presentata come **best practice, non obbligo**. |
**Come si usano** (Agent tool / Task):
```
Agent(subagent_type="nis2-expert", prompt="Valida che la tassonomia Allegati 3/4 in nis2_sources.php e AIService non sia invertita; riporta file:riga + fonte.")
Agent(subagent_type="iso-27001-expert", prompt="Verifica i 111 controlli del modulo SGSI: codifica Annex A 2022 (A.5-8) + CLD.* 27017 + extra 27018; segnala codici inventati o residui 27001:2013.")
```
Entrambi sono **read-only/advisory** (Read/Grep/Glob/Bash/WebFetch): producono rilievi `affermazione → verdetto → fonte → correzione`, **non** applicano modifiche. Le correzioni le decide/applica l'umano o l'assistente principale.
---
## 2. Asse A — Conformità normativa & principi AI (sintesi)
**Quadro vincolante** (dettaglio + tabelle in `PRINCIPI_AI_E_CONFORMITA_NORMATIVA.md`):
- **Cyber**: NIS2 (Dir. 2022/2555), CER (2022/2557), D.Lgs. 138/2024, Determine ACN 164179/2025 + 333017/2025. Best practice: ISO 27001/02/17/18, NIST CSF 2.0.
- **AI**: **AI Act (Reg. UE 2024/1689)** — Art. 50 trasparenza (enforce **2 ago 2026**), Art. 12 logging; **L. 132/2025** (Art. 14 tracciabilità `[da verificare]`); **GDPR** (2016/679).
- **Standard Agile**: `ai-usage-audit` v1.0, `persona-conversational-rules` v2.0 (Codice Etico AI, 9 principi), `STANDARD_AI_PRODOTTO`, principio *fonti certe*.
**Gap aperti (da chiudere nella revisione)**:
- [ ] **AI Act / GDPR / L.132/2025 NON sono in `nis2_sources.php`** → l'AI li cita "a memoria". Aggiungerli al registro + ingest KB.
- [ ] **`ai-usage-audit`** non ancora adottato (log AI tamper-resistant, AI Act Art.12).
- [ ] **Disclosure AI Act Art. 50** esplicita nel widget ARIA ("stai parlando con un'AI") + etichettatura output AI. Deadline **2 ago 2026**.
- [ ] **GDPR Art. 17** (oblio) su conversazioni/KB ORG.
- [ ] ⚠️ **Possibile inversione Allegati 3/4** in `nis2_sources.php` (essenziali/importanti) — `nis2-expert` deve verificarla (la mappa certa è **All.3=importanti, All.4=essenziali**).
## 3. Asse B — UI / AGID-Bootstrap Italia (sintesi)
**Decisione utente**: NIS2 → standard **AGID/Bootstrap Italia** (Blu Italia #0066CC, Titillium Web, WCAG 2.1 AA, radius 4px), come AgileHub Console V2. **NON** lo standard "AGI dark" del piano `MIGRATION_UI_V2.md` (in conflitto → da archiviare).
**Gap (dettaglio in `VERIFICA_GAP_UI...`)**: palette Material #1a73e8 → Blu Italia #0066CC; system font → Titillium; ombre morbide → flat 4px; **WCAG AA non verificata**; ~20 pagine con `<style>` inline + colori hardcoded.
**Strategia**: Opzione A (allineamento a livello di **token** in `style.css`, riusando i token AgileHub V2) → poi eventuale Opzione B (libreria `bootstrap-italia`) sulle pagine pubbliche.
---
## 4. Piano di revisione unificato
| Fase | Asse | Attività | Strumento |
|---|---|---|---|
| R0 | — | Costituire i 2 agenti (FATTO) + questo master | — |
| R1 | A | `nis2-expert`: audit contenuti normativi (prompt AI, help, `nis2_sources.php`, classificazioni) → lista rilievi con fonte | Agent `nis2-expert` |
| R2 | A | `iso-27001-expert`: audit modulo SGSI (111 controlli, SoA, mapping) → rilievi | Agent `iso-27001-expert` |
| R3 | A | Applicare correzioni normative (inversioni, citazioni mancanti) + aggiungere AI Act/GDPR/L.132 al registro fonti + ingest KB | assistente + utente |
| R4 | A | Disclosure AI Act Art.50 (widget ARIA) + adozione `ai-usage-audit` | assistente |
| R5 | B | Adeguamento UI AGID (token → font → palette → forme → bonifica inline → WCAG) in **worktree isolato** | assistente |
| R6 | A+B | Verifica finale: rilievi chiusi (ri-pass agenti), WCAG AA misurata, login/dashboard reali OK, commit+push | assistente + agenti |
**Disciplina trasversale** (lezioni del progetto): verificare **sul path reale** (login fpm, non CLI/`api-status`/"a memoria"); zero modifiche backend per la UI; commit incrementali + push (host helper vault); fonti certe sempre citate.
---
## 5. Decisioni aperte (consolidate)
1. **UI**: Opzione A o B? Da quali pagine partire (pubbliche + 1 dashboard)? Archiviare `MIGRATION_UI_V2.md`?
2. **Token AGID**: prenderli dall'implementazione **AgileHub V2** (`globals.css`) per identità di suite? Serve path/repo.
3. **Conformità**: confermi di aggiungere AI Act/GDPR/L.132 a `nis2_sources.php` + ingerirli? Hai i PDF ufficiali per `docs/nis2/`?
4. **Esecuzione agenti**: vuoi che lanci **subito R1+R2** (i due audit, read-only) così partiamo dai rilievi reali?
---
## 5bis. Esiti audit R1 + R2 (eseguiti 2026-06-11, read-only)
### R1 — `nis2-expert` (conformità normativa) → **CONFORME con riserve minori, 0 errori critici**
Mappe storicamente a rischio inversione **corrette ovunque** (Allegati 1/2 importanti/essenziali; Allegati 3/4 importanti/essenziali; IS-4 escluso per importanti; 24/72h corrette; nessuna fonte inventata).
| Sev | File:riga | Rilievo | Correzione |
|---|---|---|---|
| 🟠 | `IncidentController.php:~97,225` | `final_report_due = detected+72h+**30 giorni fissi**` invece di **+1 mese dalla notifica reale** (Art.23.4.d) → fino a 1 gg di anticipo + base ancorata al detected | `strtotime('+1 month', notification_sent_at ?? detected+72h)` |
| 🟠 | `AIService.php:~301` | System prompt "report **30d**" può indurre 30gg dall'incidente (contraddice riga 257 corretta) | "relazione finale entro 1 mese dalla notifica 72h" |
| 🟠 | `nis2_sources.php:52` | Allegati 3/4 non esplicitati nel registro (mappa solo nel codice consumer) | esplicitare "All.3 importanti / All.4 essenziali" |
| 🟠 | `help.js:432` | Misure GV.SC attribuite al solo Allegato 2; esistono in entrambi | "Allegati 1 e 2, Art.21.2(d)" |
| 🟠 | `nis2_sources.php:60` | Determina 333017 data "settembre 2025" senza giorno | confermare giorno o `[da verificare]` |
| 🟠 | `CLAUDE.md`/naming | Whistleblowing etichettato "Art.32 NIS2" (legacy errato; Art.32=vigilanza). `help.js` già corretto (D.Lgs.24/2023) | allineare la dicitura |
### R2 — `iso-27001-expert` (modulo SGSI) → **CONFORME e ben strutturato**
Conteggio verificato: **93 (27001:2022 Annex A: A.5=37/A.6=8/A.7=14/A.8=34) + 7 (CLD.* 27017) + 11 (PII.* indice interno 27018) = 111 ✓**. Nessun codice inventato, nessun residuo 27001:2013. Mapping NIS2↔Annex A (42 codici) validi e pertinenti. SoA derivata in modo prudente (`INSERT IGNORE`, `derived_from_nis2`, "da confermare"). **ISO = best practice/NIS2 = obbligo** dichiarato in modo esemplare in config/AI/UI/export.
| Sev | File:riga | Rilievo | Correzione |
|---|---|---|---|
| 🟢-bassa | `038…sql:152-163` + UI export | `PII.1..11` è **codifica indice interna** (dichiarata nel SQL), non i numeri ufficiali ISO 27018 | aggiungere la nota anche in UI SoA/export |
| INFO | `038…sql:142-148` | Numerazione puntuale CLD.* | marcare `[da verificare sul testo ufficiale 27017]` (aree corrette/complete) |
### Verdetto sintetico
Nessun errore normativo bloccante. Il rilievo più sostanziale è il **calcolo `final_report_due`** (30 giorni fissi → 1 mese dalla notifica reale). Il resto sono ambiguità/citazioni da blindare e una nota UI sui codici PII interni.
### R3 — Correzioni applicate (2026-06-11, verificate: lint + login reale)
- ✅ **B** `IncidentController`: `final_report_due` → `+1 mese` di calendario, **provvisorio** alla creazione (notifica_due+1 mese) e **ricalcolato sulla notifica reale** in `sendNotification` (Art.23.4 lett.d). Test: notifica 02-03 → finale 03-03.
- ✅ **A1** `AIService` prompt: "report 30d" → "relazione finale entro 1 mese dalla notifica 72h".
- ✅ **A2** `help.js`: GV.SC "Allegato 2" → "Allegati 1 e 2 (Art.21.2(d))".
- ✅ **A3** `nis2_sources.php`: esplicitato **Allegato 3 = importanti / Allegato 4 = essenziali**.
- ✅ **A5** `IsmsModelController` export: nota che **`PII.*` è codifica interna** (≠ numeri ufficiali ISO 27018).
- ⛔ **A4 DEFERITO (fonti certe)**: la label "Art.32" del modulo whistleblowing cita **Art.32 del D.Lgs. 138/2024** (il *decreto*), non la Direttiva — la numerazione del decreto è diversa e **non ho il testo per confermare**. Da verificare con `nis2-expert` + PDF D.Lgs. 138/2024 prima di toccarla. (Possibile incoerenza interna: il controller cita 138/2024 Art.32, l'help cita D.Lgs. 24/2023.)
---
## 6. Riferimenti
- Asse A (dettaglio): `docs/PRINCIPI_AI_E_CONFORMITA_NORMATIVA.md`
- Asse B (dettaglio): `docs/VERIFICA_GAP_UI_AGID_BOOTSTRAP_ITALIA.md`
- Agenti: `.claude/agents/nis2-expert.md`, `.claude/agents/iso-27001-expert.md`
- Fonti certe: `application/config/nis2_sources.php` · Modulo SGSI: memoria `project_isms_module` (mig. 037/038)
- Standard suite: `agile-services/docs/` (`STANDARD_AI_USAGE_AUDIT`, `persona-conversational-rules`, AGID V2)
@@ -0,0 +1,116 @@
# NIS2 Agile — Verifica & Gap UI vs Standard AGID / Bootstrap Italia
> **Decisione (utente, 2026-06-11)**: NIS2 deve allinearsi allo standard **AGID / Bootstrap Italia**, lo stesso adottato dalla **Console V2 di AgileHub** (NON allo standard "AGI SaaS dark" Inter/#3B82F6 del piano `MIGRATION_UI_V2.md`, che resta superato da questa scelta).
> **Regola (fonti certe)**: i token NIS2 attuali sono letti da `public/css/style.css`; i token AGID/Bootstrap Italia da fonti documentate (impl. AgileHub V2 + design system ufficiale). Ciò che non è verificato sul sorgente ufficiale è marcato `[da verificare]`. Nessun valore inventato.
> Stato: v1 · 2026-06-11 · Tipo: realizzativo (audit + piano).
---
## 0. TL;DR
- **Verificato?** Sì, ora: **NIS2 (UI V1) NON è conforme ad AGID/Bootstrap Italia.** Gap su 5 assi: palette, font, forme (radius/ombre), accessibilità WCAG AA, struttura header/footer PA.
- **Distanza**: media-alta. La UI attuale usa palette **Material/Google** (#1a73e8) + **system font**; AGID richiede **Blu Italia #0066CC + Titillium Web + WCAG 2.1 AA + radius 4px**.
- **Strada consigliata**: **allineamento a livello di token** in `style.css` (come ha fatto AgileHub con `globals.css`), NON riscrittura su framework — NIS2 è vanilla HTML/CSS/JS con ~20 pagine + sidebar JS-injected.
- ⚠️ **Conflitto da chiudere**: esiste un piano UI V2 alternativo (`docs/MIGRATION_UI_V2.md`, "AGI dark") **incompatibile** con questa scelta → va archiviato o esplicitamente sostituito.
---
## 1. Lo standard target — AGID / Bootstrap Italia
### 1.1 Cos'è (fonte: Designers Italia / AGID)
**Bootstrap Italia** è il design system ufficiale per i servizi digitali della PA italiana (Designers Italia, AGID), basato su Bootstrap. Obbligatorio l'aspetto coerente + **accessibilità WCAG 2.1 AA** per la PA.
### 1.2 Token chiave (impl. AgileHub V2 — verificati nei doc; ufficiali `[da verificare]` sul sorgente)
| Aspetto | Valore target | Fonte |
|---|---|---|
| Primary | **Blu Italia `#0066CC`** | AgileHub V2 (`agid_redesign`) + BI ufficiale |
| Font testo | **Titillium Web** | AgileHub V2 + BI ufficiale |
| Font headings/serif | Lora `[da verificare]` | BI ufficiale (opzionale) |
| Font monospace | Roboto Mono `[da verificare]` | BI ufficiale |
| Radius | **4px** (flat, poche ombre) | AgileHub V2 |
| Accessibilità | **WCAG 2.1 AA** (contrasto testo ≥4.5:1, UI/large ≥3:1) | obbligo PA |
| Componenti | header slim+main, footer istituzionale, card, `.btn-primary`, form BI | BI ufficiale `[da verificare]` esatti |
> Riferimento interno: AgileHub Console V2 = **167 schermate** su `/v2`, build verde, `globals.css` + design token. LG231 ha il branch pilota `feat/v2-pilot-bootstrap-italia`. (Quindi esiste già un'implementazione suite da cui copiare i token.)
---
## 2. Stato attuale NIS2 (UI V1) — token reali (`public/css/style.css`, 2399 righe)
| Token | Valore attuale | Famiglia |
|---|---|---|
| `--primary` | `#1a73e8` | **Google/Material blue** (≠ Blu Italia) |
| `--secondary` | `#34a853` | Google green |
| `--warning` | `#fbbc04` | Google yellow |
| `--danger` | `#ea4335` | Google red |
| `--info` | `#4285f4` | Google blue |
| `--font-family` | `-apple-system, Segoe UI, Roboto…` | **system font** (no Titillium, no Google Fonts caricati) |
| `--sidebar-bg` | `#1e293b` | dark slate |
| `--content-bg` | `#f1f5f9` | light |
| `--card-shadow` | ombre morbide multiple | **non** stile flat AGID |
| Neutrals | `--gray-50…900` (Slate/Tailwind) | ok come scala, ma non i grigi BI |
**Struttura**: ~20 pagine app, ognuna con **un blocco `<style>` inline** specifico; **sidebar/topbar iniettate via JS** (`public/js/common.js` → `loadSidebar()`); pagine standalone (login/register/onboarding/landing) senza sidebar. Nessun framework CSS.
---
## 3. Gap analysis (V1 → AGID/Bootstrap Italia)
| # | Asse | Stato V1 | Target AGID | Gap | Sforzo |
|---|---|---|---|---|---|
| 1 | **Palette** | Material (#1a73e8 + Google status) | Blu Italia #0066CC + palette BI | 🔴 Alto — cambio primario + tutti gli stati | M |
| 2 | **Tipografia** | system font | **Titillium Web** (+ Lora/Roboto Mono) | 🔴 Alto — caricare font + applicarlo globalmente | S |
| 3 | **Forme** | radius vari + ombre morbide | radius 4px, flat | 🟠 Medio — normalizzare radius/ombre | S |
| 4 | **Accessibilità WCAG 2.1 AA** | non verificata (contrasti misti, es. testo grigio su bg) | obbligatoria | 🔴 Alto — audit contrasti + focus visibili + alt/aria | M |
| 5 | **Struttura PA** | header/sidebar custom | header slim+main, footer istituzionale, componenti BI | 🟠 Medio — opzionale se si resta token-level | M |
| 6 | **CSS inline per-pagina** | ~20 blocchi `<style>` | token centralizzati | 🟠 Medio — i colori hardcoded nelle pagine vanno ricondotti ai token | M |
> ⚠️ Nota: il gap su **WCAG AA non è solo estetico** — è un **requisito** (PA + coerente coi principi di `docs/PRINCIPI_AI_E_CONFORMITA_NORMATIVA.md`). Va misurato, non assunto.
---
## 4. Strategia di adeguamento — 2 opzioni
### Opzione A — Allineamento a livello di TOKEN (consigliata)
Riscrivere `:root` di `style.css` con i token AGID (Blu Italia, Titillium, radius 4px, grigi BI) + caricare Titillium Web, **senza** introdurre la libreria Bootstrap Italia. La maggior parte delle pagine usa già le `var(--…)` → cambiando il `:root` si propaga.
- ✅ Pro: rischio basso, zero backend (come `MIGRATION_UI_V2`), riusa l'impianto esistente, copiabile dai token AgileHub V2.
- ⚠️ Contro: NON è "Bootstrap Italia certificato" al 100% (componenti/markup restano custom); è "look AGID-compliant a token". I colori **hardcoded** nei `<style>` inline (#1a73e8 ecc.) vanno bonificati uno per uno.
### Opzione B — Adozione libreria **bootstrap-italia**
Integrare il pacchetto ufficiale `bootstrap-italia` (CSS/JS) e rifare i markup con i componenti BI.
- ✅ Pro: conformità piena (componenti, accessibilità, header/footer istituzionali).
- ⚠️ Contro: **riscrittura UI estesa** (~20 pagine + sidebar JS), rischio regressioni, effort alto. Coerente solo se NIS2 si rivolge davvero a PA che esigono BI "vero".
**Raccomandazione**: partire da **A** (rapido, riallinea il 80% percepito), poi valutare **B** mirata sulle pagine pubbliche (landing/login) se serve la conformità formale PA.
---
## 5. Piano realizzativo (Opzione A)
| Fase | Attività | Verifica |
|---|---|---|
| 0 | **Recuperare i token AGID da AgileHub V2** (`globals.css`/tailwind) o dal branch `feat/v2-pilot-bootstrap-italia` di LG231 → single source of truth | token elencati |
| 1 | **Font**: caricare Titillium Web (self-host o Google Fonts), `--font-family: 'Titillium Web', system-ui…` | render su 3 pagine |
| 2 | **Palette**: `:root` → `--primary:#0066CC` + stati BI + grigi BI; mappare i vecchi nomi (`--secondary/--info/--danger/--warning`) | diff visivo |
| 3 | **Forme**: normalizzare radius→4px, ridurre ombre (flat) | componenti chiave |
| 4 | **Bonifica inline**: grep dei colori hardcoded (`#1a73e8`, `#4285f4`, `#34a853`…) nelle ~20 pagine → sostituire con `var(--…)` | `grep` = 0 hardcoded |
| 5 | **WCAG 2.1 AA**: audit contrasti (testo/grigi su bg), focus ring visibili, `aria-*`/alt mancanti → fix | report contrasti ≥ soglie |
| 6 | **Verifica**: build/serve, screenshot prima/dopo, check su login + 1 dashboard + 1 form; **NO modifiche backend** | pagine OK, 0 regressioni |
> **Disciplina**: zero backend (solo CSS/HTML/font/markup), commit incrementali, verifica visiva su pagina reale (non a memoria). Possibile farlo in **worktree isolato** (come il piano UI V2 esistente in `/tmp/nis2-ui-v2`) per non toccare la produzione finché non approvato.
---
## 6. Cosa serve da te / decisioni aperte
1. **Opzione A o B?** (consiglio A per iniziare).
2. **Sorgente token**: confermi che prendo i token AGID **dall'implementazione AgileHub V2** (così NIS2 è identico alla suite) anziché dal Bootstrap Italia "vergine"? Se sì mi serve l'accesso al loro `globals.css`/tailwind (path o repo).
3. **Archiviare `MIGRATION_UI_V2.md`** (piano "AGI dark") che ora è in conflitto con questa scelta?
4. **Scope**: tutte le ~20 pagine o partire dalle pubbliche (landing/login/onboarding) + dashboard?
---
## 7. Riferimenti
- UI attuale: `public/css/style.css`, `public/js/common.js` (`loadSidebar`)
- Piano UI alternativo (in conflitto): `docs/MIGRATION_UI_V2.md`
- Impl. AGID suite: `agile-services/docs/` (`project_dashboard_v2_agid_redesign_2026_06_06`), branch LG231 `feat/v2-pilot-bootstrap-italia`
- Design system ufficiale: Bootstrap Italia / Designers Italia (italia.it/designers) `[da verificare]` per token esatti
- Conformità/accessibilità: `docs/PRINCIPI_AI_E_CONFORMITA_NORMATIVA.md` (WCAG come requisito)