60 lines
6.1 KiB
Markdown
60 lines
6.1 KiB
Markdown
# Smoke congiunto avatar-in-the-loop NIS2 — checklist oggettiva + telemetria
|
||
|
||
> Per il giro live browser-driven guidato da AgileHub (persona ARIA_SUPPORT_NIS2, tour_key `demo:nis2-tour-2026`).
|
||
> Bar del brief: "mostra la cosa giusta · dice cose vere · 0 errori tecnici · mai una schermata sbagliata".
|
||
> Parent origin confermato: `dimostrazione.agile.software` (widget/hub) iframe-a la SPA su `nis2.dimostrazione.agile.software`.
|
||
|
||
## Pre-flight (già verde, collaudo `wf_c473580d-ec3`)
|
||
- [x] `session-start` → `spa_iframe_url` = `…/dashboard.html?demo=<sid>#djwt=<jwt>` sul sottodominio.
|
||
- [x] Auto-auth SPA (token dal `#djwt` prima di `checkAuth`); read 200 / write 403 `DEMO_READ_ONLY`; tenant isolato (996001).
|
||
- [x] demo-mode.js: allowlist origin (`dimostrazione` + `nis2.dimostrazione`), `HMAC_ENFORCE=false`.
|
||
- [x] RAG 415 attivo (75 chunk + binding ARIA).
|
||
|
||
## Comportamento atteso per i 10 step (cosa è "giusto")
|
||
| Step | navigate → vista | Highlight attesi (devono accendersi sull'elemento reale) | ARIA narra (dal RAG, NIENTE numeri inventati) |
|
||
|---|---|---|---|
|
||
| 1 | dashboard | `#compliance-gauge`, `#stats-grid`, `#deadlines-list` | score Art.21 + KPI + scadenze |
|
||
| 2 | assessment | `#assessment-results`, `#ai-analysis-card` | 80 domande/10 cat + gap analysis AI |
|
||
| 3 | acn-gap | `#acn-bar-fill`, `#acn-catalog` | requisiti Det. ACN, essenziali/importanti |
|
||
| 4 | risks | `#btn-ai-suggest`, `#fair-histogram` | matrice 5x5 ISO 27005 + FAIR |
|
||
| 5 | incidents | `#crit-users`, `#crit-duration`, `#crit-attack` | significatività + 24h/72h/1 mese |
|
||
| 6 | policies | `#ai-generate-btn`, `#ai-preview-container` | bozza AI da rivedere/approvare |
|
||
| 7 | supply-chain | `#criticality-chart`, `#assessment-live-score` | questionario fornitori pesato |
|
||
| 8 | isms | `#btn-aigen`, `#docs-list` | SGSI 6 step + SoA 111 controlli |
|
||
| 9 | **assets** | `#asset-stats`, `#assets-container` | rilevanza asset GV.OC-04 (critico/alto/medio) |
|
||
| 10 | reports | `#report-container` | report CdA + audit hash-chain + ISO/NIST |
|
||
|
||
**FAIL se**: pagina sbagliata, highlight su selettore assente/vuoto, ARIA che inventa numeri, qualsiasi scrittura che passa (deve dare 403), o errore tecnico in console.
|
||
|
||
## Telemetria lato NIS2 (osservabilità del giro)
|
||
Durante il giro gli eventi arrivano su `POST /api/demo/event` (tabella `demo_events`, idempotente). Dopo il giro, riscontro lato nostro per la sessione `<sid>`:
|
||
```sql
|
||
SELECT event_type, step_id, client_timestamp_iso FROM demo_events WHERE session_id = ? ORDER BY id;
|
||
```
|
||
Atteso: 10× `step_completed` (step_id 1..10), 0× `error_encountered`. Eventuali `error_encountered` riportano `metadata.code` (es. `SELECTOR_NOT_FOUND`, `UNKNOWN_VIEW`, `ACTION_NOT_WHITELISTED`) → triage immediato lato nostro.
|
||
|
||
## Validazione browser headless lato NIS2 (2026-06-13) — eseguita
|
||
Con `google-chrome --headless --dump-dom` (esegue il JS, cosa che curl non fa) su `nis2.dimostrazione.agile.software`, sessione demo reale (`?demo=<sid>#djwt=<jwt>`), pagine dashboard/risks/incidents:
|
||
- **Auth-bootstrap OK**: nessun redirect a login (`login-form` assente), titolo pagina reale, contenuto renderizzato (gauge, tabelle).
|
||
- **Runtime demo OK**: `#nis2-demo-banner` presente + `body.nis2-demo-on` → demo-mode.js inizializza.
|
||
- **2 bug SPA-side trovati e FIXATI** (commit `fcf8b09`): (1) `api.token` non sincronizzato in-memory → redirect a login; (2) `boot()` bloccato sul `seed` HMAC (non disponibile cross-origin, e non serve con HMAC off). Senza questi fix il giro avatar sarebbe finito su "pagina di login".
|
||
|
||
## Esecuzione postMessage→highlight in browser reale (2026-06-13) — PROVATA
|
||
Harness same-origin temporaneo sul sottodominio (origin in allowlist) + headless chrome ha eseguito il path del widget:
|
||
`ready` ✓ → `postMessage(highlight #compliance-gauge)` ✓ → classe `nis2-demo-hl` **applicata sull'elemento** ✓ → `errs: []`.
|
||
Risultato: `{ok:true, ready:true, highlightApplied:true, errs:[]}`. → Il SPA esegue i comandi del widget in un browser vero. (`step_animation_done` non rilevato solo per via del `--virtual-time-budget` headless; in browser interattivo scocca.) Resta da fare solo il giro completo coi 10 step guidato dal **widget AgileHub live** (conferma di produzione).
|
||
|
||
## Run NIS2 dei 10 step in browser reale (2026-06-13) — eseguito + 1 fix manifest
|
||
Harness same-origin che simula il widget su tutti i 10 step (navigate→highlight + telemetria `step_completed`):
|
||
- **Mechanism OK**: navigate + highlight applicati; eventi su `demo_events`.
|
||
- **1 difetto reale trovato e FIXATO** (commit di questo batch): step 9 **cross-analysis** puntava a `#quick-qs`/`#chat-input` che il JS NON renderizza (vivono nel tab chat non-default; assenti nel DOM dump) → ri-ancorato a **`#portfolio-header`** (presente; confermato `highlightApplied:true`).
|
||
- **Falsi negativi chiariti**: incidents (`#crit-*`), policies (`#ai-*`), supply-chain (`#assessment-live-score`) risultavano NOT_FOUND nell'harness SOLO per l'artefatto `--virtual-time-budget` (highlight postato a ready+0, prima del render async). Verificati **presenti nel DOM renderizzato** (dump a 7s) → il vero avatar (highlight a `at_ms` 6–38s) li trova. Nessun fix necessario.
|
||
→ Esito: 10/10 step con selettori risolvibili nel DOM al timing reale dell'avatar.
|
||
|
||
### Polish step 9 (2026-06-13): cross-analysis → Assets/GV.OC-04
|
||
Il browser ha rivelato che **cross-analysis è gate-ato `consultant`/`super_admin`**: per il demo-user (`compliance_manager`) la pagina mostra "riservata ai Consulenti/INSUFFICIENT_ROLE" e NON costruisce `#chat-input`/`#quick-qs`/`#tab-chat`. Sostituito lo step 9 con **Assets (relevance scoring GV.OC-04)**, pienamente visibile al demo-user; highlight `#asset-stats` + `#assets-container` verificati in browser reale (`ok:true, errs:[]`).
|
||
**⚠️ Azione AgileHub**: re-tag RAG `demo:nis2-tour-2026:step9` → mappa **08_assets** (era 15_cross-analysis).
|
||
|
||
## Coordinamento
|
||
Lo smoke è browser-driven e lo lancia AgileHub **quando vuole** (nessuna finestra oraria bloccante richiesta dal nostro lato). Dopo il giro: AgileHub verifica retrieval RAG 415 + comportamento persona; NIS2 verifica `demo_events` + console. Se emerge un difetto lato NIS2 → fix + USR2 in pochi minuti.
|