Files
nis2-agile/docs/COLLAUDO_SMOKE_AVATAR_CHECKLIST.md

60 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.