[DOCS] Contesto sessione 2026-06-15 (sera-2): A4 Fase 4.2 Competenze implementata e live (skills/role_skills/user_skills/skill_course_map, gapGrid, openAction NCR+CAPA, help+KB+PWA), review adversariale 0 finding, email tester inviata; prossimo 4.3 RACI

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile
2026-06-15 19:07:20 +02:00
co-authored by Claude Opus 4.8
parent 5368b0a61c
commit 05dfba6fcd
+32
View File
@@ -2,6 +2,38 @@
> Il 2026-05-29 ci sono state DUE sessioni: **pomeriggio** e **mattina** (TRPG). Il 2026-05-30 sessione lunga: gap competitivi P1/P2/P3 + connettori + review multi-agente + fix.
## 2026-06-15 (sera-2) — ✅ A4 Fase 4.2 IMPLEMENTATA (Competenze + gap + alert→azione) — commit `5368b0a`, pushato, v1.17.0
Implementata la **seconda fase di A4**: le **Competenze** (skill, requisiti per ruolo, competenze possedute, gap, azione). Workflow ultracode: mapping in parallelo (5 reader) → implementazione → review adversariale (3 dimensioni, 0 finding) → release.
### 🔴 Scoperta del mapping (landmine evitato)
La tabella delle azioni **NON è `corrective_actions`** (nome nel design/memoria, INESISTENTE): è **`capa_actions`** (mig.004), **figlia obbligatoria** di **`non_conformities`** (NCR) via `ncr_id NOT NULL`, **senza** colonna `source_type`. Design doc + memoria corretti.
### Backend
- **Migration 042** (`docs/sql/042_competences.sql`) + runner aggiornato. 4 tabelle additive/idempotenti: `skills` (org-owned o globali `organization_id NULL`), `role_skills` (UNIQUE role+skill), `user_skills` (UNIQUE org+user+skill, `acquired_via_course_id`), `skill_course_map`. **APPLICATA su prod** (nis2-db v8.0.45 TLSv1.3; skills 2FK, role_skills 4FK, user_skills 5FK, skill_course_map 3FK).
- **`CompetenceController`** (route `competences`): `catalog`, skills CRUD, `roleSkills`/`setRoleSkill`/`removeRoleSkill`, `userSkills`/`setUserSkill`/`removeUserSkill`, `mapCourse`/`unmapCourse`, **`gapGrid`** (richiesto−posseduto per ruolo con titolare, corsi suggeriti, azioni aperte), **`openAction`**. Multi-tenancy + anti-IDOR + livelli 1-5; competenze globali read-only per org (solo super_admin).
- **alert→azione** (`openAction`): riusa NCR/CAPA → crea `non_conformities` (`source='management_review'`, `source_entity_type='competence_gap'`, `source_entity_id=role_skills.id`, severity major se gap≥2, `nis2_article`=PR.AT-02 se essenziale altrimenti PR.AT-01) + `capa_actions` figlia, in transazione. Anti-duplicato su source_entity_id. **Zero ALTER** alle tabelle esistenti.
### Frontend
- **`competenze.html`** (4 tab: Catalogo · Requisiti per ruolo · Competenze persone · Gap & azioni) + **`js/competenze.js`**. CTA "Assegna corso" (riuso `/training/assign`, nuovo `api.assignTraining`) e "Apri non conformità". Bootstrap Italia V2.
- Voce sidebar **"Competenze"** (`common.js` + `common-bi.js` + `BI_PAGES`) + `nav.competences` i18n IT/EN. `api.js`: metodi `comp*`.
### Help + KB + PWA
- `help.js`: guida `'competences'` (schede, calcolo gap, PR.AT-01/02, GV.RR-04, art.24 D.Lgs., disclaimer) + mappa pagina.
- **KB Qdrant SYSTEM** ingestata (doc_uuid `3739398d`).
- **PWA**: `sw.js` cache → **`nis2-shell-v1.17.0`** (allineamento release).
- Cache-buster `?v=20260618` dei 5 JS condivisi su 32 HTML. `version.json` 1.16.0 → **1.17.0**.
### Verifica
- **Smoke E2E su prod (fpm reale)**: catalogo, requisito (liv.4), competenza persona (liv.2), **gap=2**, **openAction → NCR-766066 + CAPA-984386**, anti-dup **409**, mappatura corso, statici live — tutti verdi. **Dati di test ripuliti** dall'org tester 151 (0 residui).
- **Review adversariale** (workflow, 3 dimensioni security/correttezza/fonti + verifica scettica): **0 finding**.
- **Email** alle attività inviata ai 4 tester (HTTP 201).
### Prossimo passo A4
- **4.3** matrice RACI (`raci_assignments`, ruolo×oggetto) + link m2m procedure/inventario/rischi (segn. 4/5/7). Poi 4.4 `review_schedule`, 4.5 stakeholder GV.SC-02.
---
## 2026-06-15 (sera) — ✅ A4 Fase 4.1 IMPLEMENTATA (Organigramma) — commit `8540b53`, pushato
Implementata la **prima fase di A4** (modello relazionale, `docs/DESIGN_A4_RELATIONAL.md`): l'**Organigramma**.