Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7.7 KiB
Analisi + Design — Modulo "Controlli periodici" (control monitoring con frequenza + NC/AC)
Proposta progettuale · 2026-06-17 · richiesta utente: "i controlli periodici dobbiamo averne evidenza → oltre al modulo Audit, un modulo controlli con frequenza e generazione NC o AC". Documentata con esempi esterni (GRC/ISMS) + recon del codice.
Perché (problema)
La valutazione ISO ha mostrato che il software documenta i controlli ma serve evidenza che i controlli OPERINO nel tempo (clausola 9.1 monitoraggio/misurazione, controllo A.8.16 "Monitoring activities"; gap residuo su A.7/A.8). L'audit interno (§9.2) è puntuale; serve un livello ricorrente tra un audit e l'altro: il classico Continuous/Periodic Control Monitoring dei GRC.
Esempi esterni studiati (per non reinventare)
- Continuous Controls Monitoring (CCM) nei GRC (Scytale, LogicGate, RegScale): validare che i controlli restino efficaci tra le revisioni formali; test a frequenza definita, raccolta evidenze, task assegnati all'owner per rimediare ai fallimenti, non-conformity log + corrective action come prova all'audit.
- Drata / Vanta: "continuous control monitoring rather than periodic checks" + evidence automation + visibilità su control ownership e gap.
- Eramba (open GRC, il modello più calzante): l'Internal Control ha owner, metodologia di test, frequenza, raccolta evidenze, accountability; i controlli sono auditati periodicamente (record con esito + evidenza); i fallimenti generano finding/eccezioni → azione correttiva (modulo Project) e confluiscono nel riesame.
- ISO/IEC 27001: §9.1 (cosa/come/quando/chi misurare), A.8.16 (attività di monitoraggio), §10.2 (NC e azioni correttive). NB: ISO = buona prassi volontaria; per NIS2 è comunque buona governance (GV.PO-02/DE.CM).
Sintesi del pattern comune: Controllo (owner+frequenza+metodo) → Esecuzione periodica (esito+evidenza) → se fallisce: finding → NC/azione correttiva → riesame. È esattamente ciò che l'utente chiede.
Posizionamento vs esistente (NON duplicare)
| Esistente | Cos'è | Differenza |
|---|---|---|
compliance_controls (Audit&Report) |
Registro stato d'implementazione dei controlli (status/%/next_review) | NON ha frequenza né log di esecuzioni |
review_schedule (Scadenziario) |
Cadenza generica di revisioni (frequency_months, complete) | Generico, niente esito/evidenza/NC per esecuzione |
internal_audits (§9.2, nuovo) |
Audit puntuale con checklist | Non ricorrente per singolo controllo |
non_conformities+capa_actions |
NC + azioni correttive | Da riusare come destinazione |
→ Il nuovo modulo è il livello mancante: controlli RICORRENTI con registro esecuzioni (evidenza) + generazione NC/AC. Può linkare un controllo del SoA/NIS2 (così diventa l'evidenza operativa dei controlli tecnici A.7/A.8 — chiude proprio il gap della valutazione).
Modello dati (mig.057, additivo, runner-safe)
periodic_controls: id, organization_id, code (CTL-NNN), title, description, category,control_refVARCHAR NULL (codice SoA/NIS2 collegato, es. 'A.8.13'), owner_role_id NULL (FK org_roles),frequencyENUM('giornaliero','settimanale','mensile','trimestrale','semestrale','annuale','custom'),frequency_daysINT NULL (se custom),methodTEXT (metodologia di verifica),next_due_dateDATE,last_executed_atDATE NULL, status ENUM('active','suspended') DEFAULT 'active', created_by, ts. FK org CASCADE.periodic_control_executions(= l'evidenza): id, control_id FK CASCADE, executed_at DATE, executed_by INT NULL,outcomeENUM('conforme','non_conforme','parziale','non_applicabile'), notes TEXT, ncr_id INT NULL (NC generata), ts. Allegati su evidence_files (entity_type='periodic_control_execution'). KEY(control_id).- ALTER
non_conformities: aggiungere il valore 'monitoring' all'ENUMsource(runner-safe MODIFY preservando i valori) per le NC nate dai controlli periodici.
Logica
- Frequenza + auto-advance: alla registrazione di un'esecuzione,
last_executed_at=data enext_due_dateavanza della frequenza (mesi/giorni). (Stesso spirito direview_schedule::complete.) - Esecuzione = evidenza: ogni run registra esito + note + (opz.) file in evidence_files → storico = prova all'auditor del monitoraggio periodico.
- Generazione NC/AC su esito non_conforme/parziale:
- NC: crea
non_conformities(source='monitoring', source_entity_type='periodic_control_execution', source_entity_id, title dal controllo, severity, status='open', ncr_code generato) e salva ncr_id sull'esecuzione → poi si gestisce in NCR/CAPA. - AC (azione correttiva): in ISO l'azione segue una NC → "Genera azione" crea la NC + una prima
capa_actions(action_type='corrective') in un colpo. (capa_actions è figlia di non_conformities: si rispetta la struttura mig.004.)
- NC: crea
- Calendario:
periodic_controls.next_due_date→ nuova sorgente nelCalendarController(type 'periodic_control', stato overdue/due_soon/upcoming), deep-link alla pagina. - Owner: org_roles (chi è responsabile del controllo).
Backend — PeriodicControlController (slug periodic-controls)
GET list(+ stato scadenza calcolato) ·GET {id}(con storico esecuzioni) ·POST create(code CTL-NNN, calcola next_due) ·PUT {id}·DELETE {id}POST {id}/executions(registra esecuzione: outcome/notes → avanza next_due; se non conforme può creare NC/AC) ·GET {id}/executionsPOST {id}/executions/{exId}/raiseNcr(o parametro nella POST execution:generate: 'nc'|'ac'|'none')GET {id}/report(scheda controllo + storico stampabile)- Ruoli scrittura: org_admin/compliance_manager/auditor. Anti-IDOR, logAudit. Seed CLI idempotente.
Frontend — controlli-periodici.html
- Lista controlli (codice, titolo, owner, frequenza, prossima scadenza con badge in ritardo/in scadenza, ultimo esito) + "+ Nuovo controllo".
- Dettaglio: dati controllo + storico esecuzioni (data/esito/note/evidenze) + "Registra esecuzione" (esito + note + upload + opzione Genera NC/AC) + link al controllo SoA collegato + report.
- Voce sidebar (sezione Audit&Report, vicino ad "Audit interni"); help/i18n/KB.
Integrazione & riuso
NCR/CAPA (NC/AC), evidence_files (evidenze), CalendarController (nuova sorgente), org_roles (owner), compliance_controls/SoA (link control_ref), pattern controller/pagina da internal_audits. Niente duplicazione di compliance_controls/review_schedule.
Stima (rif. moduli A/B già fatti, complessità simile)
| Fase | Contenuto | Stima |
|---|---|---|
| 1 | mig.057 (2 tabelle + ALTER source ENUM) + seeder + PeriodicControlController (CRUD + executions + NC/AC + next_due) + router/api |
~0,75 sessione |
| 2 | controlli-periodici.html (lista + dettaglio + registra esecuzione + report) + CalendarController nuova sorgente + sidebar/help/i18n/KB + deploy+smoke |
~0,75 sessione |
| 3 | verifica flotta + fix | ~0,5 sessione |
| Tot | modulo completo, LIVE | ~2 sessioni |
Esito atteso
Si ottiene l'evidenza del monitoraggio periodico (storico esecuzioni con esiti+allegati) per ogni controllo ricorrente, con generazione NC/AC sui fallimenti e scadenze nel calendario — il livello "continuous control monitoring" che mancava, e l'evidenza operativa che l'auditor chiede per i controlli A.7/A.8.
Fonti
- Scytale — Continuous Controls Monitoring (CCM); LogicGate — CCM guide; RegScale — CCM for GRC
- Drata / Vanta — continuous control monitoring (vs periodic checks)
- Eramba — Internal Control monitoring (owner/frequenza/evidenza/finding→azione) per ISO 27001
- ISMS.online — ISO 27001:2022 §10.2 Non-conformità e azioni correttive; ISO §9.1 + A.8.16