[BACKUP] Sessione 2026-06-14: supervisore autonomo + contesto + mig.039 + UI V2 plan
- Supervisore autonomo ticket: prompt operativo + dry-run (scripts/), DRAFT rimosso; gate normativo gia' committato - docs/CONTEXT_LAST_SESSION.md: sessione 2026-06-14 (supervisore LIVE, run#1/#2, rotazione Anthropic rinviata) - docs/sql/039_integrity_keys.sql: migrazione integrita' DB (PK/UNIQUE/FK) gia' applicata in prod 12/6 - docs/MIGRATION_UI_V2.md: piano migrazione UI V2 - docs/nis2/incidente_r00/: 2 mockup incidente (gateway+dashboard) - .gitignore: versiona public/vendor/ (asset Bootstrap Italia self-hosted) - Fix accumulati: EmailService (kill-switch email), Incident/Onboarding/Organization/Services controllers, questionnaire, ReportService, CLAUDE.md standard Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
489a032658
commit
b80bf2361c
@@ -2,7 +2,7 @@
|
||||
/**
|
||||
* NIS2 Agile - Incident Controller
|
||||
*
|
||||
* Gestione incidenti con workflow NIS2 Art. 23 (24h/72h/30d).
|
||||
* Gestione incidenti con workflow NIS2 Art. 23 (24h/72h/1 mese).
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/BaseController.php';
|
||||
@@ -330,7 +330,7 @@ class IncidentController extends BaseController
|
||||
|
||||
/**
|
||||
* POST /api/incidents/{id}/final-report
|
||||
* Registra invio report finale (30 giorni)
|
||||
* Registra invio report finale (entro un mese)
|
||||
*/
|
||||
public function sendFinalReport(int $id): void
|
||||
{
|
||||
@@ -343,7 +343,7 @@ class IncidentController extends BaseController
|
||||
Database::insert('incident_timeline', [
|
||||
'incident_id' => $id,
|
||||
'event_type' => 'notification',
|
||||
'description' => 'Report finale (30 giorni) inviato al CSIRT nazionale (ACN)',
|
||||
'description' => 'Report finale (entro un mese) inviato al CSIRT nazionale (ACN)',
|
||||
'created_by' => $this->getCurrentUserId(),
|
||||
]);
|
||||
|
||||
|
||||
@@ -340,7 +340,7 @@ class OnboardingController extends BaseController
|
||||
'description' => "La vostra organizzazione rientra tra i soggetti essenziali ai sensi della Direttiva NIS2 (UE 2022/2555). Operate in un settore ad alta criticità e superate le soglie dimensionali.",
|
||||
'obligations' => [
|
||||
'Misure di sicurezza informatica (Art. 21)',
|
||||
'Notifica incidenti significativi al CSIRT entro 24h/72h/30gg (Art. 23)',
|
||||
'Notifica incidenti significativi al CSIRT entro 24h/72h/1 mese (Art. 23)',
|
||||
'Formazione obbligatoria per gli organi di gestione (Art. 20)',
|
||||
'Vigilanza proattiva (ex ante) da parte delle autorità',
|
||||
'Sanzioni fino a EUR 10M o 2% del fatturato mondiale annuo',
|
||||
@@ -353,7 +353,7 @@ class OnboardingController extends BaseController
|
||||
'description' => "La vostra organizzazione rientra tra i soggetti importanti ai sensi della Direttiva NIS2. Siete tenuti a rispettare gli obblighi di sicurezza e notifica incidenti.",
|
||||
'obligations' => [
|
||||
'Misure di sicurezza informatica (Art. 21)',
|
||||
'Notifica incidenti significativi al CSIRT entro 24h/72h/30gg (Art. 23)',
|
||||
'Notifica incidenti significativi al CSIRT entro 24h/72h/1 mese (Art. 23)',
|
||||
'Formazione obbligatoria per gli organi di gestione (Art. 20)',
|
||||
'Vigilanza reattiva (ex post) da parte delle autorità',
|
||||
'Sanzioni fino a EUR 7M o 1,4% del fatturato mondiale annuo',
|
||||
@@ -388,7 +388,7 @@ class OnboardingController extends BaseController
|
||||
['NIS2-21.2.j', 'nis2', 'Autenticazione multi-fattore e comunicazioni sicure'],
|
||||
['NIS2-20.1', 'nis2', 'Governance: approvazione misure da parte degli organi di gestione'],
|
||||
['NIS2-20.2', 'nis2', 'Formazione obbligatoria per gli organi di gestione'],
|
||||
['NIS2-23.1', 'nis2', 'Notifica incidenti significativi al CSIRT (24h/72h/30gg)'],
|
||||
['NIS2-23.1', 'nis2', 'Notifica incidenti significativi al CSIRT (24h/72h/1 mese)'],
|
||||
];
|
||||
|
||||
foreach ($controls as [$code, $framework, $title]) {
|
||||
|
||||
@@ -394,7 +394,7 @@ class OrganizationController extends BaseController
|
||||
['NIS2-21.2.j', 'nis2', 'Autenticazione multi-fattore e comunicazioni sicure'],
|
||||
['NIS2-20.1', 'nis2', 'Governance: approvazione misure da parte degli organi di gestione'],
|
||||
['NIS2-20.2', 'nis2', 'Formazione obbligatoria per gli organi di gestione'],
|
||||
['NIS2-23.1', 'nis2', 'Notifica incidenti significativi al CSIRT (24h/72h/30gg)'],
|
||||
['NIS2-23.1', 'nis2', 'Notifica incidenti significativi al CSIRT (24h/72h/1 mese)'],
|
||||
];
|
||||
|
||||
foreach ($controls as [$code, $framework, $title]) {
|
||||
|
||||
@@ -1379,7 +1379,7 @@ class ServicesController extends BaseController
|
||||
'/api/services/incidents/feed' => [
|
||||
'get' => [
|
||||
'summary' => 'Incident feed Art.23',
|
||||
'description' => 'Feed incidenti con stato scadenze Art.23 (24h/72h/30d).',
|
||||
'description' => 'Feed incidenti con stato scadenze Art.23 (24h/72h/1 mese).',
|
||||
'parameters' => [
|
||||
['name' => 'status', 'in' => 'query', 'schema' => ['type' => 'string']],
|
||||
['name' => 'severity', 'in' => 'query', 'schema' => ['type' => 'string'], 'example' => 'high,critical'],
|
||||
@@ -2366,7 +2366,7 @@ class ServicesController extends BaseController
|
||||
$t = strtotime($detectedAt);
|
||||
$data['early_warning_due'] = date('Y-m-d H:i:s', $t + 24 * 3600);
|
||||
$data['notification_due'] = date('Y-m-d H:i:s', $t + 72 * 3600);
|
||||
$data['final_report_due'] = date('Y-m-d H:i:s', $t + 30 * 86400);
|
||||
$data['final_report_due'] = date('Y-m-d H:i:s', strtotime('+1 month', $t + 72 * 3600)); // 1 mese (calendario) dalla notifica 72h (Art.23.4 lett.d)
|
||||
}
|
||||
|
||||
// Insert resiliente: retry su collisione incident_code (random 6 cifre),
|
||||
|
||||
@@ -152,8 +152,8 @@
|
||||
},
|
||||
{
|
||||
"code": "ART21B_006",
|
||||
"text_it": "L'organizzazione e' in grado di rispettare gli obblighi di notifica NIS2: preallarme entro 24 ore, notifica completa entro 72 ore e relazione finale entro 30 giorni dalla notifica dell'incidente significativo?",
|
||||
"text_en": "Is the organization able to meet NIS2 notification obligations: early warning within 24 hours, full notification within 72 hours, and final report within 30 days of the significant incident notification?",
|
||||
"text_it": "L'organizzazione e' in grado di rispettare gli obblighi di notifica NIS2: preallarme entro 24 ore, notifica completa entro 72 ore e relazione finale entro un mese dalla notifica dell'incidente significativo?",
|
||||
"text_en": "Is the organization able to meet NIS2 notification obligations: early warning within 24 hours, full notification within 72 hours, and final report within one month of the significant incident notification?",
|
||||
"guidance_it": "Ai sensi dell'Art. 23 NIS2, i soggetti essenziali e importanti devono notificare al CSIRT e all'autorita competente: (1) preallarme entro 24h, (2) notifica dell'incidente entro 72h, (3) relazione finale entro un mese. Devono essere predisposte procedure e template per ciascuna fase.",
|
||||
"evidence_examples": ["Procedura di notifica al CSIRT nazionale", "Template di preallarme 24h e notifica 72h", "Evidenza di test della procedura di notifica"],
|
||||
"nis2_article": "21.2.b",
|
||||
|
||||
@@ -352,7 +352,7 @@ class EmailService
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifica report finale 30 giorni (Art. 23 par. 4 lett. d)
|
||||
* Notifica report finale (entro un mese, Art. 23 par. 4 lett. d)
|
||||
*
|
||||
* @param array $incident Dati incidente
|
||||
* @param array $organization Dati organizzazione
|
||||
@@ -365,7 +365,7 @@ class EmailService
|
||||
|
||||
$html = <<<HTML
|
||||
<div style="background-color: #eff6ff; border-left: 4px solid #1e40af; padding: 16px; margin-bottom: 24px; border-radius: 4px;">
|
||||
<strong style="color: #1e40af; font-size: 16px;">REPORT FINALE - Termine 30 giorni</strong><br>
|
||||
<strong style="color: #1e40af; font-size: 16px;">REPORT FINALE - Termine un mese</strong><br>
|
||||
<span style="color: #1e3a8a;">Ai sensi dell'Art. 23, par. 4, lett. d) della Direttiva NIS2</span>
|
||||
</div>
|
||||
|
||||
@@ -399,7 +399,7 @@ class EmailService
|
||||
</table>
|
||||
|
||||
<div style="background-color: #fffbeb; border-left: 4px solid #f59e0b; padding: 14px; margin: 20px 0; border-radius: 4px;">
|
||||
<strong>Azione richiesta:</strong> Predisporre il report finale entro 30 giorni dalla notifica dell'incidente, contenente: descrizione dettagliata dell'incidente, tipo di minaccia o causa radice, misure di attenuazione applicate e in corso, eventuale impatto transfrontaliero.
|
||||
<strong>Azione richiesta:</strong> Predisporre il report finale entro un mese dalla notifica dell'incidente, contenente: descrizione dettagliata dell'incidente, tipo di minaccia o causa radice, misure di attenuazione applicate e in corso, eventuale impatto transfrontaliero.
|
||||
</div>
|
||||
|
||||
<p style="margin-top: 20px;">
|
||||
|
||||
@@ -1366,7 +1366,7 @@ HTML;
|
||||
|
||||
// Incidenti significativi
|
||||
if ($incidents['significant'] > 0 && $incidents['open'] > 0) {
|
||||
$recs[] = "Sono presenti {$incidents['open']} incidenti attivi di cui {$incidents['significant']} significativi. Verificare il rispetto delle scadenze di notifica CSIRT (Art. 23 NIS2: 24h/72h/30gg).";
|
||||
$recs[] = "Sono presenti {$incidents['open']} incidenti attivi di cui {$incidents['significant']} significativi. Verificare il rispetto delle scadenze di notifica CSIRT (Art. 23 NIS2: 24h/72h/1 mese).";
|
||||
}
|
||||
|
||||
// Se tutto sembra a posto
|
||||
|
||||
Reference in New Issue
Block a user