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>
125 lines
11 KiB
Markdown
125 lines
11 KiB
Markdown
# 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)
|