From 48ad479c01896be7e36333053f5bf7170c6edc9a Mon Sep 17 00:00:00 2001 From: DevEnv nis2-agile Date: Sat, 13 Jun 2026 09:01:53 +0200 Subject: [PATCH] =?UTF-8?q?[DEMO]=20Handoff=20ad=20AgileHub:=20product-sid?= =?UTF-8?q?e=20pronto=20(formazione+demo)=20=E2=80=94=20riepilogo=20+=20pu?= =?UTF-8?q?nti=20coordinamento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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). --- ...26_06_13_demo_avatar_nis2_product_ready.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 docs/OUTGOING_TO_AGILEHUB_2026_06_13_demo_avatar_nis2_product_ready.md diff --git a/docs/OUTGOING_TO_AGILEHUB_2026_06_13_demo_avatar_nis2_product_ready.md b/docs/OUTGOING_TO_AGILEHUB_2026_06_13_demo_avatar_nis2_product_ready.md new file mode 100644 index 0000000..8ecadba --- /dev/null +++ b/docs/OUTGOING_TO_AGILEHUB_2026_06_13_demo_avatar_nis2_product_ready.md @@ -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.