[DEMO] Handoff ad AgileHub: product-side pronto (formazione+demo) — riepilogo + punti coordinamento

Stato punti 1,2,3,4,6,7,8 = FATTI/deployati/collaudati. Da coordinare: HMAC canonical messaggio,
ops same-origin dimostrazione.agile.software, data-demo-action anchors, sweep 132 id (non bloccante).
This commit is contained in:
DevEnv nis2-agile
2026-06-13 09:01:53 +02:00
parent d6d61885b4
commit 48ad479c01
@@ -0,0 +1,43 @@
# NIS2 → AgileHub — Avatar di prodotto (FORMAZIONE + demo): product-side PRONTO
> **Da**: NIS2 (product-side) · **A**: AgileHub (persona/voce/RAG/collaudo) · **Data**: 2026-06-13
> **Standard**: `product-demo-protocol` v1.0.1 + `product-demo-complete` (formazione) · **Modalità A** (prodotto live).
> **Decisione prodotto**: **FORMAZIONE-first** + **esame con soglia 80%** (l'attestato si ottiene superando l'esame).
## Esito: i punti product-side sono FATTI, deployati e collaudati in produzione.
| # | Deliverable brief | Stato | Riferimento |
|---|---|---|---|
| 1 | **5 endpoint `/api/demo/*`** | ✅ LIVE | `DemoController` — session-start, manifest, event, credentials, **reset-dataset (re-seed reale)** |
| 2 | **Dataset isolato + JWT demo:read-only + guard** | ✅ LIVE+TESTATO | org **996001** (demo RO) + **996002** (sandbox scrivibile) seedate da #151; `BaseController::applyDemoGuard` |
| 3 | **mappa-logica + SELETTORI_DEMO** | ✅ | `docs/mappa-logica/01..22_*.md` + `SELETTORI_DEMO.md` (131 elementi + 89 azioni) |
| 4 | **Frontend demo + manifest** | ✅ | `demo-mode.js`, `demo-selectors.js`, `demo.css`, hook `?demo=` in `common-bi.js`, `public/demo/nis2-tour-2026.json` (10 step) servito da `/api/demo/manifest` |
| 6 | **mappa-logica COMPLETA** (tutte le viste) | ✅ | 22 viste app (non solo le 10 della demo) |
| 7 | **Tassonomia corso** | ✅ | `docs/formazione/TASSONOMIA_CORSO_NIS2.{md,json}` — 10 moduli / 28 lezioni / ~7h45, prerequisiti+durate |
| 8 | **Banca esercizi + sandbox** | ✅ | `docs/formazione/BANCA_ESERCIZI_NIS2.json` (32 domande + 9 esercizi) + sandbox **org 996002** scrivibile (scope `training:sandbox`) |
### Smoke test già passati (product-side)
- `POST /api/demo/session-start` → ritorna `demo_jwt` (scope `demo:read-only`), `company_id=996001`, `hmac_key_seed`, `manifest_url`. ✅
- `GET /api/demo/manifest` → 10 step, `persona_key=ARIA_SUPPORT_NIS2`, selettori reali. ✅
- **Read con demo_jwt** → `GET /api/dashboard/overview` **200** (compliance_score 75, dataset 996001). ✅
- **Write con demo_jwt** → `POST /api/risks/create` **403 `DEMO_READ_ONLY`**. ✅
- **Auth reale intatta** (utente normale 200, login OK). ✅
- `POST /api/demo/reset-dataset` (X-Internal-Key) → **200**, sandbox 996002 ri-seedata. ✅
## Cosa serve da AgileHub (vostra parte, come da brief)
- Persona **ARIA_SUPPORT_NIS2** + `demo_capability` (`tour_key='demo:nis2-tour-2026'`, 10 step dal manifest) + skill presenter + addendum marker/consenso.
- **Ingest nel RAG** delle 22 mappe-logiche + tag `demo:nis2-tour-2026:stepN` (le narrazioni NON citano numeri: ARIA li prende dal RAG sul dataset 996001).
- Formazione: curriculum/quiz/attestato/progresso dalla tassonomia + banca esercizi; **esame soglia 80%**.
- Avatar Tavus + riuso voce ARIA_SUPPORT_NIS2 (nessun consenso voce da gestire).
- **Collaudo oggettivo** (definizione di "fatto").
## Punti di coordinamento da chiudere insieme (al collaudo)
1. **HMAC canonical del MESSAGGIO**: la chiave canale è a contratto (`SHA-256(demo_jwt+":"+seed+":demo-control-channel")`); la *canonicalizzazione del messaggio* per l'HMAC non è fissata nello standard. In `demo-mode.js` → `canonicalize()` è marcata **TO-RECONCILE**: diteci la forma esatta del vostro parser (campi/ordine/separatore) e la allineo. *(In `demo-mode.js`: `HMAC_ENFORCE=true`.)*
2. **Ops same-origin**: `dimostrazione.agile.software` deve servire la SPA NIS2 **same-origin** con la landing e proxare `/api/*` → backend NIS2, con CSP che consenta l'iframe. In alternativa vi do uno `SPA_BASE` dedicato. *(Senza same-origin l'HMAC via `sessionStorage` e gli URL del manifest non risolvono.)*
3. **`data-demo-action` anchors**: le azioni read-only del tour (`open-tab-*`, `open-ai-panel`, `open-first-detail`) sono in whitelist (`demo-selectors.js`) ma gli anchor nel DOM sono da cablare (sweep id residuo). Per il tour attuale (navigate + highlight) **non sono bloccanti**.
4. **Sweep id stabili (132)**: in completamento; il manifest attuale àncora gli highlight a **id già esistenti e verificati** (non i 132), quindi il tour funziona già.
## Commit di riferimento (pushati su Gitea, branch main)
`e04eba6` guard+seeder · `6900d94` resetDataset · `be29895` banca esercizi · `d16fdd2` frontend demo · `d6d6188` manifest · (mappe+tassonomia `4dfab2a`).
**Quando volete, accendiamo la persona e facciamo il giro coordinato + collaudo.** Da NIS2 è tutto pronto e live.