Files
nis2-agile/docs/COLLAUDO_SMOKE_AVATAR_CHECKLIST.md
T

6.1 KiB
Raw Blame History

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)

  • session-start → spa_iframe_url = …/dashboard.html?demo=<sid>#djwt=<jwt> sul sottodominio.
  • Auto-auth SPA (token dal #djwt prima di checkAuth); read 200 / write 403 DEMO_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-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.