6.1 KiB
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 sunis2.dimostrazione.agile.software.
Pre-flight (già verde, collaudo wf_c473580d-ec3)
session-start→spa_iframe_url=…/dashboard.html?demo=<sid>#djwt=<jwt>sul sottodominio.- Auto-auth SPA (token dal
#djwtprima dicheckAuth); read 200 / write 403DEMO_READ_ONLY; tenant isolato (996001). - demo-mode.js: allowlist origin (
dimostrazione+nis2.dimostrazione),HMAC_ENFORCE=false. - 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>:
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-formassente), titolo pagina reale, contenuto renderizzato (gauge, tabelle). - Runtime demo OK:
#nis2-demo-bannerpresente +body.nis2-demo-on→ demo-mode.js inizializza. - 2 bug SPA-side trovati e FIXATI (commit
fcf8b09): (1)api.tokennon sincronizzato in-memory → redirect a login; (2)boot()bloccato sulseedHMAC (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-inputche il JS NON renderizza (vivono nel tab chat non-default; assenti nel DOM dump) → ri-ancorato a#portfolio-header(presente; confermatohighlightApplied: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 aat_ms6–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.