{
  "$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
  "bomFormat": "CycloneDX",
  "specVersion": "1.6",
  "serialNumber": "urn:uuid:a6454265-841d-4d11-bb11-215271bc4345",
  "version": 3,
  "metadata": {
    "timestamp": "2026-10-13T17:53:39Z",
    "lifecycles": [
      {
        "phase": "operations"
      }
    ],
    "tools": {
      "components": [
        {
          "type": "application",
          "name": "kubectl",
          "version": "1.33.3",
          "description": "Carichi, immagini e digest dei pod del namespace (sola lettura)."
        },
        {
          "type": "application",
          "name": "helm",
          "version": "4.2.2",
          "description": "Valori e manifest della release (sola lettura; segreti esclusi)."
        },
        {
          "type": "application",
          "name": "skopeo",
          "version": "1.22.3",
          "description": "Digest ed etichette OCI delle immagini non in esecuzione."
        },
        {
          "type": "application",
          "group": "microsoft",
          "name": "azure-cli",
          "version": "2.91.0",
          "description": "Configurazione di AKS, PostgreSQL, storage e Log Analytics (sola lettura)."
        },
        {
          "type": "application",
          "name": "manual-authoring",
          "description": "Descrizioni, dichiarazioni e servizi che nessuna API rileva, curati a mano."
        }
      ]
    },
    "manufacturer": {
      "name": "Dipartimento per la Trasformazione Digitale — Presidenza del Consiglio dei Ministri",
      "url": [
        "https://innovazione.gov.it"
      ]
    },
    "authors": [
      {
        "name": "Trasparenza Piattaforma Eventi",
        "email": "trasparenza@innovazione.gov.it"
      }
    ],
    "component": {
      "bom-ref": "tenant:videocall-test",
      "type": "application",
      "name": "pa-webinar",
      "version": "dev-c0f267d",
      "publisher": "Dipartimento per la Trasformazione Digitale",
      "description": "Installazione PA Webinar videocall-test, ambiente di collaudo sul cluster AKS in Italy North. Esegue le build del ramo dev (commit c0f267d, 158 commit dopo v0.13.0).",
      "scope": "required",
      "licenses": [
        {
          "license": {
            "id": "EUPL-1.2",
            "url": "https://spdx.org/licenses/EUPL-1.2.html"
          }
        }
      ],
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/italia/pa-webinar"
        },
        {
          "type": "website",
          "url": "https://pa-webinar-test.developers.italia.it"
        },
        {
          "type": "release-notes",
          "url": "https://github.com/italia/pa-webinar/releases"
        },
        {
          "type": "bom",
          "url": "https://pa-webinar-test.developers.italia.it/tenants/videocall-test/service-inventory.json"
        }
      ]
    },
    "properties": [
      {
        "name": "pa-webinar:tenant",
        "value": "videocall-test"
      },
      {
        "name": "pa-webinar:environment",
        "value": "test"
      },
      {
        "name": "pa-webinar:cloud-provider",
        "value": "Microsoft Azure"
      },
      {
        "name": "pa-webinar:region",
        "value": "italynorth"
      },
      {
        "name": "pa-webinar:deployment-mode",
        "value": "full (bridge, Jibri e GPU con scalabilità da zero)"
      },
      {
        "name": "pa-webinar:kubernetes-version",
        "value": "v1.34.11"
      },
      {
        "name": "pa-webinar:helm-chart",
        "value": "pa-webinar-0.1.1"
      },
      {
        "name": "pa-webinar:helm-release-revision",
        "value": "147"
      },
      {
        "name": "pa-webinar:app-commit",
        "value": "c0f267da4e27f90fe966b987eee791524ee37077"
      }
    ]
  },
  "components": [
    {
      "bom-ref": "pkg:oci/pa-webinar",
      "type": "container",
      "supplier": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://github.com/italia/pa-webinar"
        ]
      },
      "manufacturer": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "publisher": "Dipartimento per la Trasformazione Digitale",
      "name": "pa-webinar",
      "version": "dev-c0f267d",
      "description": "Portale PA Webinar (Next.js 15 su Node.js 20, Alpine). Build del ramo dev, 158 commit dopo v0.13.0 (commit c0f267d, compilata il 2026-10-13 alle 09:19 UTC, confermata da /api/health). Le build :dev non hanno SBOM pubblicato: il più vicino è quello del rilascio v0.13.0.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "ed47beb470ed6b67c6bed132ec8f205ced61d8bba6239d9a4be351e42816941f"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "EUPL-1.2"
          }
        }
      ],
      "purl": "pkg:oci/pa-webinar@sha256%3Aed47beb470ed6b67c6bed132ec8f205ced61d8bba6239d9a4be351e42816941f?repository_url=ghcr.io/italia/pa-webinar&tag=dev-c0f267d",
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/italia/pa-webinar"
        },
        {
          "type": "distribution",
          "url": "https://github.com/italia/pa-webinar/pkgs/container/pa-webinar"
        },
        {
          "type": "bom",
          "url": "https://github.com/italia/pa-webinar/releases/download/v0.13.0/sbom.spdx.json",
          "comment": "SBOM SPDX del rilascio v0.13.0, base del ramo dev in esecuzione: non descrive esattamente questa build."
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "ghcr.io/italia/pa-webinar:dev-c0f267d"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        },
        {
          "name": "pa-webinar:git-commit",
          "value": "c0f267da4e27f90fe966b987eee791524ee37077"
        },
        {
          "name": "pa-webinar:git-describe",
          "value": "v0.13.0-158-gc0f267da"
        },
        {
          "name": "pa-webinar:layer",
          "value": "app"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Portale PA Webinar (Next.js)"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/pa-webinar-migrate",
      "type": "container",
      "supplier": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://github.com/italia/pa-webinar"
        ]
      },
      "manufacturer": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "publisher": "Dipartimento per la Trasformazione Digitale",
      "name": "pa-webinar (migrazioni)",
      "version": "dev-migrate-c0f267d",
      "description": "Immagine delle migrazioni del database (prisma migrate deploy), eseguita dall'initContainer db-migrate a ogni avvio del portale. Stesso commit del portale; contiene anche le dipendenze di sviluppo.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "f10eaa130623aac53f9493e88fe430e793d3ca4642508602156fcf2253e66324"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "EUPL-1.2"
          }
        }
      ],
      "purl": "pkg:oci/pa-webinar@sha256%3Af10eaa130623aac53f9493e88fe430e793d3ca4642508602156fcf2253e66324?repository_url=ghcr.io/italia/pa-webinar&tag=dev-migrate-c0f267d",
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/italia/pa-webinar"
        },
        {
          "type": "distribution",
          "url": "https://github.com/italia/pa-webinar/pkgs/container/pa-webinar"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "ghcr.io/italia/pa-webinar:dev-migrate-c0f267d"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        },
        {
          "name": "pa-webinar:git-commit",
          "value": "c0f267da4e27f90fe966b987eee791524ee37077"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/pa-webinar-recorder-controller",
      "type": "container",
      "supplier": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://github.com/italia/pa-webinar"
        ]
      },
      "manufacturer": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "publisher": "Dipartimento per la Trasformazione Digitale",
      "name": "pa-webinar-recorder-controller",
      "version": "dev-84cb378",
      "description": "Controller riconciliante che avvia e ferma i Job del registratore per partecipante (ADR-013). Build del ramo dev del 2026-10-01 (commit 84cb378).",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "0dc2347b4cacf8ea214ecccabab6e9b0a132a4100b3e5b33c1af939b7c6bf071"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "EUPL-1.2"
          }
        }
      ],
      "purl": "pkg:oci/pa-webinar-recorder-controller@sha256%3A0dc2347b4cacf8ea214ecccabab6e9b0a132a4100b3e5b33c1af939b7c6bf071?repository_url=ghcr.io/italia/pa-webinar-recorder-controller&tag=dev-84cb378",
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/italia/pa-webinar"
        },
        {
          "type": "distribution",
          "url": "https://github.com/italia/pa-webinar/pkgs/container/pa-webinar-recorder-controller"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "ghcr.io/italia/pa-webinar-recorder-controller:dev-84cb378"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        },
        {
          "name": "pa-webinar:git-commit",
          "value": "84cb37847768cdec0bb92ec503f6810cca510249"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/pa-webinar-recorder",
      "type": "container",
      "supplier": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://github.com/italia/pa-webinar"
        ]
      },
      "manufacturer": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "publisher": "Dipartimento per la Trasformazione Digitale",
      "name": "pa-webinar-recorder",
      "version": "dev-3ce17bc",
      "description": "Bot che registra una traccia audio per partecipante (Puppeteer + lib-jitsi-meet, con Chrome for Testing: termini di ridistribuzione da verificare). Gira come Job creato dal controller da un CronJob modello; pullPolicy Always, quindi il prossimo Job usa il :dev corrente (commit 3ce17bc).",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "592880de09a2d714f4706430e4cbbad1572670b205b81b42db8c0870a9adc3cb"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "EUPL-1.2"
          }
        }
      ],
      "purl": "pkg:oci/pa-webinar-recorder@sha256%3A592880de09a2d714f4706430e4cbbad1572670b205b81b42db8c0870a9adc3cb?repository_url=ghcr.io/italia/pa-webinar-recorder&tag=dev-3ce17bc",
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/italia/pa-webinar"
        },
        {
          "type": "distribution",
          "url": "https://github.com/italia/pa-webinar/pkgs/container/pa-webinar-recorder"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "ghcr.io/italia/pa-webinar-recorder:dev-3ce17bc"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "registro: digest a cui puntava il tag il 2026-10-13; nessun pod attivo (carico scalato a zero o modello di Job)"
        },
        {
          "name": "pa-webinar:git-commit",
          "value": "3ce17bceef1819107af83d5f3ab1d1ab0d852cdc"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/pa-webinar-captions-gateway",
      "type": "container",
      "supplier": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://github.com/italia/pa-webinar"
        ]
      },
      "manufacturer": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "publisher": "Dipartimento per la Trasformazione Digitale",
      "name": "pa-webinar-captions-gateway",
      "version": "dev-f8d9514",
      "description": "Gateway dei sottotitoli in diretta (TypeScript, Node.js 22): riceve dal bridge l'audio Opus di ogni oratore, lo passa al motore locale e rimanda il testo alla sala. Dipendenze npm: ws e opus-decoder (MIT). Deployment a zero repliche fuori dagli eventi: lo accende lo scaler dei bridge.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "ed1c8544208f7a86927aed2d58a548c471057ff8e53505d2d824a41a75586e97"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "EUPL-1.2"
          }
        }
      ],
      "purl": "pkg:oci/pa-webinar-captions-gateway@sha256%3Aed1c8544208f7a86927aed2d58a548c471057ff8e53505d2d824a41a75586e97?repository_url=ghcr.io/italia/pa-webinar-captions-gateway&tag=dev-f8d9514",
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/italia/pa-webinar"
        },
        {
          "type": "distribution",
          "url": "https://github.com/italia/pa-webinar/pkgs/container/pa-webinar-captions-gateway"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "ghcr.io/italia/pa-webinar-captions-gateway:dev-f8d9514"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "registro: digest a cui puntava il tag il 2026-10-13; nessun pod attivo (carico scalato a zero o modello di Job)"
        },
        {
          "name": "pa-webinar:git-commit",
          "value": "f8d9514cdca0b0ff19f225647072a9fa8a0b791a"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/pa-webinar-captions-engine",
      "type": "container",
      "supplier": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://github.com/italia/pa-webinar"
        ]
      },
      "manufacturer": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "publisher": "Dipartimento per la Trasformazione Digitale",
      "name": "pa-webinar-captions-engine",
      "version": "dev-9090096",
      "description": "Motore di riconoscimento vocale in streaming su CPU (NeMo-Speech.cpp su debian:bookworm-slim). Componenti inclusi con licenza propria: NeMo-Speech.cpp Apache-2.0, llama.cpp/ggml MIT, runtime GCC/OpenMP GPL con GCC Runtime Library Exception. Il modello non è nell'immagine: lo scarica l'initContainer fetch-model all'avvio del pod e ne verifica lo SHA-256.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "3570b7b32c1cc87380e45b1ec6b89b6706eff4820759644225db6533b3d4261b"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "EUPL-1.2"
          }
        }
      ],
      "purl": "pkg:oci/pa-webinar-captions-engine@sha256%3A3570b7b32c1cc87380e45b1ec6b89b6706eff4820759644225db6533b3d4261b?repository_url=ghcr.io/italia/pa-webinar-captions-engine&tag=dev-9090096",
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/italia/pa-webinar"
        },
        {
          "type": "distribution",
          "url": "https://github.com/italia/pa-webinar/pkgs/container/pa-webinar-captions-engine"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "ghcr.io/italia/pa-webinar-captions-engine:dev-9090096"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "registro: digest a cui puntava il tag il 2026-10-13; nessun pod attivo (carico scalato a zero o modello di Job)"
        },
        {
          "name": "pa-webinar:git-commit",
          "value": "90900964b9197c0a675c77b4e7346bdc8a3b6479"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/pa-webinar-postprod-worker",
      "type": "container",
      "supplier": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://github.com/italia/pa-webinar"
        ]
      },
      "manufacturer": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "publisher": "Dipartimento per la Trasformazione Digitale",
      "name": "pa-webinar-postprod-worker",
      "version": "dev-7becf47",
      "description": "Worker AI con GPU per trascrizione (WhisperX), diarizzazione (pyannote.audio), doppiaggio (Piper TTS) e filigrana audio (AudioSeal). Base nvcr.io/nvidia/pytorch con CUDA e cuDNN (termini NVIDIA da verificare per la ridistribuzione); include componenti GPL (espeak-ng tramite piper-phonemize, gender-guesser). Gira come Job creato dall'orchestratore sul pool GPU a scalabilità da zero.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "2c9d8164e037f9339b7fd43e863c06332ff3b9a67e5d5a4669fbb751b9eba9ec"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "EUPL-1.2"
          }
        }
      ],
      "purl": "pkg:oci/pa-webinar-postprod-worker@sha256%3A2c9d8164e037f9339b7fd43e863c06332ff3b9a67e5d5a4669fbb751b9eba9ec?repository_url=ghcr.io/italia/pa-webinar-postprod-worker&tag=dev-7becf47",
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/italia/pa-webinar"
        },
        {
          "type": "distribution",
          "url": "https://github.com/italia/pa-webinar/pkgs/container/pa-webinar-postprod-worker"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "ghcr.io/italia/pa-webinar-postprod-worker:dev-7becf47"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "registro: digest a cui puntava il tag il 2026-10-13; nessun pod attivo (carico scalato a zero o modello di Job)"
        },
        {
          "name": "pa-webinar:git-commit",
          "value": "7becf472665733601459725b69e1432716fe5e70"
        },
        {
          "name": "pa-webinar:worker-kinds",
          "value": "TRANSCRIBE, TRANSCRIBE_MULTITRACK, DUB"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/pa-webinar-postprod-worker-cpu",
      "type": "container",
      "supplier": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://github.com/italia/pa-webinar"
        ]
      },
      "manufacturer": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "publisher": "Dipartimento per la Trasformazione Digitale",
      "name": "pa-webinar-postprod-worker-cpu",
      "version": "dev-7becf47",
      "description": "Worker AI senza GPU (riassunti e traduzioni tramite vLLM, sottotitoli, archivio, resoconto dell'evento). Base python:3.13-alpine; ffmpeg di Alpine include componenti GPL. Gira come Job sui nodi del portale.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "a474c03befc3c545ef79275eb367afdd2bf54d4faeccea0704d86f87d386bbe2"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "EUPL-1.2"
          }
        }
      ],
      "purl": "pkg:oci/pa-webinar-postprod-worker-cpu@sha256%3Aa474c03befc3c545ef79275eb367afdd2bf54d4faeccea0704d86f87d386bbe2?repository_url=ghcr.io/italia/pa-webinar-postprod-worker-cpu&tag=dev-7becf47",
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/italia/pa-webinar"
        },
        {
          "type": "distribution",
          "url": "https://github.com/italia/pa-webinar/pkgs/container/pa-webinar-postprod-worker-cpu"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "ghcr.io/italia/pa-webinar-postprod-worker-cpu:dev-7becf47"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "registro: digest a cui puntava il tag il 2026-10-13; nessun pod attivo (carico scalato a zero o modello di Job)"
        },
        {
          "name": "pa-webinar:git-commit",
          "value": "7becf472665733601459725b69e1432716fe5e70"
        },
        {
          "name": "pa-webinar:worker-kinds",
          "value": "SUMMARIZE, TRANSLATE, SUBTITLE, ARCHIVE, REPORT"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/jitsi-web",
      "type": "container",
      "supplier": {
        "name": "Dipartimento per la Trasformazione Digitale",
        "url": [
          "https://github.com/italia/pa-webinar"
        ]
      },
      "manufacturer": {
        "name": "Jitsi community (8x8, Inc.)",
        "url": [
          "https://jitsi.org"
        ]
      },
      "name": "pa-webinar-jitsi-web",
      "version": "stable-11031-rnnoise",
      "description": "Jitsi Meet web stable-11031 con correzioni applicate al bundle in fase di build (ADR-017): unico punto in cui PA Webinar modifica codice di terzi. Il pod in esecuzione usa la build del 2026-09-25; il tag è stato ricostruito il 2026-10-13 e verrà usato al prossimo riavvio del pod.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "9d20f54d143d45ebc7f3f33c3542e8a8ef9bbb18344309038e4f489ebb18b3b6"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "Apache-2.0"
          }
        }
      ],
      "purl": "pkg:oci/pa-webinar-jitsi-web@sha256%3A9d20f54d143d45ebc7f3f33c3542e8a8ef9bbb18344309038e4f489ebb18b3b6?repository_url=ghcr.io/italia/pa-webinar-jitsi-web&tag=stable-11031-rnnoise",
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/jitsi/jitsi-meet"
        },
        {
          "type": "documentation",
          "url": "https://github.com/italia/pa-webinar/blob/c0f267da4e27f90fe966b987eee791524ee37077/docs/adr/017-patched-jitsi-web-image.md"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "ghcr.io/italia/pa-webinar-jitsi-web:stable-11031-rnnoise"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        },
        {
          "name": "pa-webinar:upstream-image",
          "value": "jitsi/web:stable-11031"
        },
        {
          "name": "pa-webinar:tag-digest-at-registry",
          "value": "sha256:3828fe25969cb8f2ae3fc62a0bc19f87550ac324263709efd739a5deb5491ead"
        },
        {
          "name": "pa-webinar:layer",
          "value": "app"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Jitsi Meet web"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/jitsi-prosody",
      "type": "container",
      "supplier": {
        "name": "Docker Hub",
        "url": [
          "https://hub.docker.com"
        ]
      },
      "manufacturer": {
        "name": "Jitsi community (8x8, Inc.)",
        "url": [
          "https://jitsi.org"
        ]
      },
      "name": "jitsi/prosody",
      "version": "stable-11031",
      "description": "Server XMPP di Jitsi (Prosody, MIT; ricetta dell'immagine Apache-2.0). Con autenticazione JWT; carica i moduli Prosody di PA Webinar (EUPL-1.2) montati da ConfigMap.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "926c508c0d9198bf9d0b6adb88ce9092461e9a79e2895fb57fe4ef5f44ff3523"
        }
      ],
      "licenses": [
        {
          "expression": "MIT AND Apache-2.0"
        }
      ],
      "purl": "pkg:oci/prosody@sha256%3A926c508c0d9198bf9d0b6adb88ce9092461e9a79e2895fb57fe4ef5f44ff3523?repository_url=docker.io/jitsi/prosody&tag=stable-11031",
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/jitsi/docker-jitsi-meet"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "docker.io/jitsi/prosody:stable-11031"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        },
        {
          "name": "pa-webinar:layer",
          "value": "app"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Jitsi Prosody (XMPP)"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/jitsi-jicofo",
      "type": "container",
      "supplier": {
        "name": "Docker Hub",
        "url": [
          "https://hub.docker.com"
        ]
      },
      "manufacturer": {
        "name": "Jitsi community (8x8, Inc.)",
        "url": [
          "https://jitsi.org"
        ]
      },
      "name": "jitsi/jicofo",
      "version": "stable-11031",
      "description": "Jicofo, il focus delle conferenze: assegna i bridge e, per i sottotitoli, apre la trascrizione verso il gateway.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "1f78fb0c0548ae5efd83a2b488df6aabbae4a70bc6f64c74395b6937b3aceb98"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "Apache-2.0"
          }
        }
      ],
      "purl": "pkg:oci/jicofo@sha256%3A1f78fb0c0548ae5efd83a2b488df6aabbae4a70bc6f64c74395b6937b3aceb98?repository_url=docker.io/jitsi/jicofo&tag=stable-11031",
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/jitsi/jicofo"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "docker.io/jitsi/jicofo:stable-11031"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        },
        {
          "name": "pa-webinar:layer",
          "value": "app"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Jitsi Jicofo (focus)"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/jitsi-jvb",
      "type": "container",
      "supplier": {
        "name": "Docker Hub",
        "url": [
          "https://hub.docker.com"
        ]
      },
      "manufacturer": {
        "name": "Jitsi community (8x8, Inc.)",
        "url": [
          "https://jitsi.org"
        ]
      },
      "name": "jitsi/jvb",
      "version": "stable-11031",
      "description": "Jitsi Videobridge (SFU). Deployment a zero repliche fuori dagli eventi: lo accende lo scaler, con al massimo un bridge (JVB_MAX_REPLICAS=1), su un pool di nodi dedicato. Digest dell'indice multi-architettura.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "3460de3541a8f96d007b8f2b4681ea8321cae64c17387338eabf776e73cd0f51"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "Apache-2.0"
          }
        }
      ],
      "purl": "pkg:oci/jvb@sha256%3A3460de3541a8f96d007b8f2b4681ea8321cae64c17387338eabf776e73cd0f51?repository_url=docker.io/jitsi/jvb&tag=stable-11031",
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/jitsi/jitsi-videobridge"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "docker.io/jitsi/jvb:stable-11031"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "registro: digest a cui puntava il tag il 2026-10-13; nessun pod attivo (carico scalato a zero o modello di Job)"
        },
        {
          "name": "pa-webinar:layer",
          "value": "app"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Jitsi Videobridge (SFU)"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/jitsi-jibri",
      "type": "container",
      "supplier": {
        "name": "Docker Hub",
        "url": [
          "https://hub.docker.com"
        ]
      },
      "manufacturer": {
        "name": "Jitsi community (8x8, Inc.)",
        "url": [
          "https://jitsi.org"
        ]
      },
      "name": "jitsi/jibri",
      "version": "stable-11031",
      "description": "Jibri, registrazione composita della sala (video MP4). Include Google Chrome (termini Google da verificare per la ridistribuzione) e ffmpeg. Deployment a zero repliche: si accende solo quando un evento registra, su un pool di nodi dedicato.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "40f5fd67517cdb6395ae642143f1a5c002ff80259c1c633a384ede5c7b0569f4"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "Apache-2.0"
          }
        }
      ],
      "purl": "pkg:oci/jibri@sha256%3A40f5fd67517cdb6395ae642143f1a5c002ff80259c1c633a384ede5c7b0569f4?repository_url=docker.io/jitsi/jibri&tag=stable-11031",
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/jitsi/jibri"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "docker.io/jitsi/jibri:stable-11031"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "registro: digest a cui puntava il tag il 2026-10-13; nessun pod attivo (carico scalato a zero o modello di Job)"
        },
        {
          "name": "pa-webinar:layer",
          "value": "app"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Jibri (registrazione video)"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/jitsi-excalidraw-backend",
      "type": "container",
      "supplier": {
        "name": "Docker Hub",
        "url": [
          "https://hub.docker.com"
        ]
      },
      "manufacturer": {
        "name": "Jitsi community (8x8, Inc.)",
        "url": [
          "https://jitsi.org"
        ]
      },
      "name": "jitsi/excalidraw-backend",
      "version": "2025.8.2",
      "description": "Backend della lavagna condivisa di Jitsi (Excalidraw): sincronizza in tempo reale i disegni tra i partecipanti.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "985c9fecc547352cf21bc4737783643aa7ee8f0c575e6f95d2a9ea2b4a0be0a8"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "MIT"
          }
        }
      ],
      "purl": "pkg:oci/excalidraw-backend@sha256%3A985c9fecc547352cf21bc4737783643aa7ee8f0c575e6f95d2a9ea2b4a0be0a8?repository_url=docker.io/jitsi/excalidraw-backend&tag=2025.8.2",
      "externalReferences": [
        {
          "type": "vcs",
          "url": "https://github.com/jitsi/excalidraw-backend"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "docker.io/jitsi/excalidraw-backend:2025.8.2"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        },
        {
          "name": "pa-webinar:layer",
          "value": "app"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Lavagna condivisa (Excalidraw)"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/coturn",
      "type": "container",
      "supplier": {
        "name": "Docker Hub",
        "url": [
          "https://hub.docker.com"
        ]
      },
      "manufacturer": {
        "name": "coturn project",
        "url": [
          "https://github.com/coturn/coturn"
        ]
      },
      "name": "coturn/coturn",
      "version": "4.9",
      "description": "Server TURN/STUN (coturn 4.9.0) per i partecipanti dietro NAT o firewall restrittivi.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "254a7e19f23366bc638af8e092c18ea52e0eefc9e44041f376e58b61b3b6d646"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "BSD-3-Clause"
          }
        }
      ],
      "purl": "pkg:oci/coturn@sha256%3A254a7e19f23366bc638af8e092c18ea52e0eefc9e44041f376e58b61b3b6d646?repository_url=docker.io/coturn/coturn&tag=4.9",
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "docker.io/coturn/coturn:4.9"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/nginx-acme-proxy",
      "type": "container",
      "supplier": {
        "name": "Docker Hub",
        "url": [
          "https://hub.docker.com"
        ]
      },
      "manufacturer": {
        "name": "F5, Inc. (nginx)",
        "url": [
          "https://nginx.org"
        ]
      },
      "name": "nginx",
      "version": "alpine",
      "description": "initContainer acme-proxy del pod coturn: inoltra la sfida ACME HTTP-01 all'ingress per ottenere il certificato TLS del TURN.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "df221db836e1754089190208cee7eeda94f233197056426eda74a43ab1abeac2"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "BSD-2-Clause"
          }
        }
      ],
      "purl": "pkg:oci/nginx@sha256%3Adf221db836e1754089190208cee7eeda94f233197056426eda74a43ab1abeac2?repository_url=docker.io/library/nginx&tag=alpine",
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "docker.io/library/nginx:alpine"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/busybox",
      "type": "container",
      "supplier": {
        "name": "Docker Hub",
        "url": [
          "https://hub.docker.com"
        ]
      },
      "manufacturer": {
        "name": "BusyBox project",
        "url": [
          "https://busybox.net"
        ]
      },
      "name": "busybox",
      "version": "1.36",
      "description": "initContainer init-coturn: prepara la configurazione di coturn.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "GPL-2.0-only"
          }
        }
      ],
      "purl": "pkg:oci/busybox@sha256%3A73aaf090f3d85aa34ee199857f03fa3a95c8ede2ffd4cc2cdb5b94e566b11662?repository_url=docker.io/library/busybox&tag=1.36",
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "docker.io/library/busybox:1.36"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/redis",
      "type": "container",
      "supplier": {
        "name": "Docker Hub",
        "url": [
          "https://hub.docker.com"
        ]
      },
      "manufacturer": {
        "name": "Bitnami (Broadcom)",
        "url": [
          "https://bitnami.com"
        ]
      },
      "name": "bitnami/redis",
      "version": "latest",
      "description": "Redis 8.10.2 (etichetta dell'immagine, base Photon 5.0). Da Redis 8 il server è disponibile sotto RSALv2, SSPLv1 o AGPLv3, nessuna delle quali permissiva. Il tag latest con pullPolicy Always cambia digest al riavvio.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "f4797b37502e6db910d3653368fcfadc171ef605586917774de125ddd05b3e62"
        }
      ],
      "licenses": [
        {
          "expression": "LicenseRef-RSALv2 OR SSPL-1.0 OR AGPL-3.0-only"
        }
      ],
      "purl": "pkg:oci/redis@sha256%3Af4797b37502e6db910d3653368fcfadc171ef605586917774de125ddd05b3e62?repository_url=docker.io/bitnami/redis&tag=latest",
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "docker.io/bitnami/redis:latest"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        },
        {
          "name": "pa-webinar:image-version-label",
          "value": "8.10.2"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/redis-exporter",
      "type": "container",
      "supplier": {
        "name": "Docker Hub",
        "url": [
          "https://hub.docker.com"
        ]
      },
      "manufacturer": {
        "name": "Bitnami (Broadcom)",
        "url": [
          "https://bitnami.com"
        ]
      },
      "name": "bitnami/redis-exporter",
      "version": "latest",
      "description": "Esportatore Prometheus delle metriche di Redis (redis_exporter 1.93.0), sidecar del pod Redis.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "c6a2883c0bb712731acdab8ab77a87dcea57c4eba723d6c117fa2a6f2786e439"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "MIT"
          }
        }
      ],
      "purl": "pkg:oci/redis-exporter@sha256%3Ac6a2883c0bb712731acdab8ab77a87dcea57c4eba723d6c117fa2a6f2786e439?repository_url=docker.io/bitnami/redis-exporter&tag=latest",
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "docker.io/bitnami/redis-exporter:latest"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        },
        {
          "name": "pa-webinar:image-version-label",
          "value": "1.93.0"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/kubectl",
      "type": "container",
      "supplier": {
        "name": "Docker Hub",
        "url": [
          "https://hub.docker.com"
        ]
      },
      "manufacturer": {
        "name": "Bitnami (Broadcom)",
        "url": [
          "https://bitnami.com"
        ]
      },
      "name": "bitnami/kubectl",
      "version": "latest",
      "description": "kubectl 1.37.1 (etichetta dell'immagine). Usato dallo scaler dei bridge (ogni 2 minuti), dall'orchestratore della post-produzione (ogni minuto) e dal Job di ricarica della configurazione web dopo ogni aggiornamento. Tag latest con pullPolicy Always: il digest è quello dell'esecuzione in corso alla generazione.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "dbe04f493d362c47db291edb3382aeb56cf430a6271daa56311f5b8e82fecf2a"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "Apache-2.0"
          }
        }
      ],
      "purl": "pkg:oci/kubectl@sha256%3Adbe04f493d362c47db291edb3382aeb56cf430a6271daa56311f5b8e82fecf2a?repository_url=docker.io/bitnami/kubectl&tag=latest",
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "docker.io/bitnami/kubectl:latest"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        },
        {
          "name": "pa-webinar:image-version-label",
          "value": "1.37.1"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/curl-8.11.1",
      "type": "container",
      "supplier": {
        "name": "Docker Hub",
        "url": [
          "https://hub.docker.com"
        ]
      },
      "manufacturer": {
        "name": "curl project",
        "url": [
          "https://curl.se"
        ]
      },
      "name": "curlimages/curl",
      "version": "8.11.1",
      "description": "Client HTTP dei CronJob che chiamano le rotte cron del portale: coda email (ogni minuto), promemoria, pulizia GDPR, riconciliazione delle registrazioni, conservazione della rubrica.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "c1fe1679c34d9784c1b0d1e5f62ac0a79fca01fb6377cdd33e90473c6f9f9a69"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "curl"
          }
        }
      ],
      "purl": "pkg:oci/curl@sha256%3Ac1fe1679c34d9784c1b0d1e5f62ac0a79fca01fb6377cdd33e90473c6f9f9a69?repository_url=docker.io/curlimages/curl&tag=8.11.1",
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "docker.io/curlimages/curl:8.11.1"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/curl-8.10.1",
      "type": "container",
      "supplier": {
        "name": "Docker Hub",
        "url": [
          "https://hub.docker.com"
        ]
      },
      "manufacturer": {
        "name": "curl project",
        "url": [
          "https://curl.se"
        ]
      },
      "name": "curlimages/curl",
      "version": "8.10.1",
      "description": "Client HTTP dei CronJob della post-produzione e delle tracce audio: recupero dei lavori bloccati, conservazione degli output AI, eliminazione delle tracce per partecipante.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "d9b4541e214bcd85196d6e92e2753ac6d0ea699f0af5741f8c6cccbfcf00ef4b"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "curl"
          }
        }
      ],
      "purl": "pkg:oci/curl@sha256%3Ad9b4541e214bcd85196d6e92e2753ac6d0ea699f0af5741f8c6cccbfcf00ef4b?repository_url=docker.io/curlimages/curl&tag=8.10.1",
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "docker.io/curlimages/curl:8.10.1"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/vllm-openai",
      "type": "container",
      "supplier": {
        "name": "Docker Hub",
        "url": [
          "https://hub.docker.com"
        ]
      },
      "manufacturer": {
        "name": "vLLM project",
        "url": [
          "https://github.com/vllm-project/vllm"
        ]
      },
      "name": "vllm/vllm-openai",
      "version": "v0.9.2",
      "description": "Server di inferenza vLLM (API compatibile OpenAI) per riassunti, traduzioni e resoconti, raggiungibile solo dentro il cluster. Deployment pa-webinar-vllm installato a mano, fuori dalla release Helm; a zero repliche, lo accende l'orchestratore sul pool GPU quando ci sono lavori.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "37cd5bd18d220a0f4c70401ce1d4a0cc588fbfe03cc210579428f2c47e6eac33"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "Apache-2.0"
          }
        }
      ],
      "purl": "pkg:oci/vllm-openai@sha256%3A37cd5bd18d220a0f4c70401ce1d4a0cc588fbfe03cc210579428f2c47e6eac33?repository_url=docker.io/vllm/vllm-openai&tag=v0.9.2",
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "docker.io/vllm/vllm-openai:v0.9.2"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "registro: digest a cui puntava il tag il 2026-10-13; nessun pod attivo (carico scalato a zero o modello di Job)"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/ingress-nginx-controller",
      "type": "container",
      "supplier": {
        "name": "registry.k8s.io (Kubernetes project)",
        "url": [
          "https://registry.k8s.io"
        ]
      },
      "manufacturer": {
        "name": "Kubernetes project (CNCF)",
        "url": [
          "https://kubernetes.github.io/ingress-nginx/"
        ]
      },
      "name": "ingress-nginx/controller",
      "version": "v1.9.4",
      "description": "Ingress controller condiviso dal cluster (chart ingress-nginx 4.8.3): termina TLS per portale e Jitsi web.",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "5b161f051d017e55d358435f295f5e9a297e66158f136321d9b04520ec6c48a3"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "Apache-2.0"
          }
        }
      ],
      "purl": "pkg:oci/controller@sha256%3A5b161f051d017e55d358435f295f5e9a297e66158f136321d9b04520ec6c48a3?repository_url=registry.k8s.io/ingress-nginx/controller&tag=v1.9.4",
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "registry.k8s.io/ingress-nginx/controller:v1.9.4"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/cert-manager",
      "type": "container",
      "supplier": {
        "name": "Quay.io (Red Hat)",
        "url": [
          "https://quay.io"
        ]
      },
      "manufacturer": {
        "name": "cert-manager project (CNCF)",
        "url": [
          "https://cert-manager.io"
        ]
      },
      "name": "jetstack/cert-manager-controller",
      "version": "v1.13.3",
      "description": "cert-manager condiviso dal cluster: emette e rinnova i certificati Let's Encrypt (con webhook e cainjector della stessa versione).",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "2121d4250f5734ee097df243507d06536fc264140dba3425045a825ef597c79d"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "Apache-2.0"
          }
        }
      ],
      "purl": "pkg:oci/cert-manager-controller@sha256%3A2121d4250f5734ee097df243507d06536fc264140dba3425045a825ef597c79d?repository_url=quay.io/jetstack/cert-manager-controller&tag=v1.13.3",
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "quay.io/jetstack/cert-manager-controller:v1.13.3"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        }
      ]
    },
    {
      "bom-ref": "pkg:oci/nvidia-gpu-operator",
      "type": "container",
      "supplier": {
        "name": "NVIDIA NGC (nvcr.io)",
        "url": [
          "https://catalog.ngc.nvidia.com"
        ]
      },
      "manufacturer": {
        "name": "NVIDIA Corporation",
        "url": [
          "https://www.nvidia.com"
        ]
      },
      "name": "nvidia/gpu-operator",
      "version": "v24.9.2",
      "description": "NVIDIA GPU Operator condiviso dal cluster: quando il pool GPU si accende installa driver, container toolkit e device plugin (immagini NVIDIA con termini propri, da verificare).",
      "scope": "required",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "92f5262bb4934e0ea29eb10ec0ad4fc293164f2f2f94d48a935922791abbfdac"
        }
      ],
      "licenses": [
        {
          "license": {
            "id": "Apache-2.0"
          }
        }
      ],
      "purl": "pkg:oci/gpu-operator@sha256%3A92f5262bb4934e0ea29eb10ec0ad4fc293164f2f2f94d48a935922791abbfdac?repository_url=nvcr.io/nvidia/gpu-operator&tag=v24.9.2",
      "properties": [
        {
          "name": "pa-webinar:image",
          "value": "nvcr.io/nvidia/gpu-operator:v24.9.2"
        },
        {
          "name": "pa-webinar:digest-source",
          "value": "pod in esecuzione (status.imageID) al momento della generazione"
        }
      ]
    },
    {
      "bom-ref": "pkg:generic/nodejs@20.20.2",
      "type": "platform",
      "name": "Node.js",
      "version": "20.20.2",
      "description": "Runtime del portale, dall'immagine di base node:20-alpine (tramite mirror.gcr.io).",
      "licenses": [
        {
          "license": {
            "id": "MIT"
          }
        }
      ],
      "purl": "pkg:generic/nodejs@20.20.2"
    },
    {
      "bom-ref": "pkg:npm/next@15.5.25",
      "type": "framework",
      "publisher": "Vercel",
      "name": "next",
      "version": "15.5.25",
      "purl": "pkg:npm/next@15.5.25",
      "scope": "required",
      "licenses": [
        {
          "license": {
            "id": "MIT"
          }
        }
      ]
    },
    {
      "bom-ref": "pkg:npm/react@19.3.0",
      "type": "library",
      "publisher": "Meta",
      "name": "react",
      "version": "19.3.0",
      "purl": "pkg:npm/react@19.3.0",
      "scope": "required",
      "licenses": [
        {
          "license": {
            "id": "MIT"
          }
        }
      ]
    },
    {
      "bom-ref": "pkg:npm/next-intl@4.14.6",
      "type": "library",
      "name": "next-intl",
      "version": "4.14.6",
      "purl": "pkg:npm/next-intl@4.14.6",
      "scope": "required",
      "licenses": [
        {
          "license": {
            "id": "MIT"
          }
        }
      ]
    },
    {
      "bom-ref": "pkg:npm/@prisma/client@6.19.3",
      "type": "library",
      "publisher": "Prisma",
      "name": "@prisma/client",
      "version": "6.19.3",
      "purl": "pkg:npm/%40prisma/client@6.19.3",
      "scope": "required",
      "licenses": [
        {
          "license": {
            "id": "Apache-2.0"
          }
        }
      ]
    },
    {
      "bom-ref": "pkg:npm/bootstrap-italia@2.18.3",
      "type": "library",
      "publisher": "Designers Italia",
      "name": "bootstrap-italia",
      "version": "2.18.3",
      "purl": "pkg:npm/bootstrap-italia@2.18.3",
      "scope": "required",
      "licenses": [
        {
          "license": {
            "id": "BSD-3-Clause"
          }
        }
      ]
    },
    {
      "bom-ref": "pkg:npm/design-react-kit@5.10.0",
      "type": "library",
      "publisher": "Designers Italia",
      "name": "design-react-kit",
      "version": "5.10.0",
      "purl": "pkg:npm/design-react-kit@5.10.0",
      "scope": "required",
      "licenses": [
        {
          "license": {
            "id": "BSD-3-Clause"
          }
        }
      ]
    },
    {
      "bom-ref": "pkg:npm/ioredis@5.11.1",
      "type": "library",
      "name": "ioredis",
      "version": "5.11.1",
      "purl": "pkg:npm/ioredis@5.11.1",
      "scope": "required",
      "licenses": [
        {
          "license": {
            "id": "MIT"
          }
        }
      ]
    },
    {
      "bom-ref": "model:nvidia/nemotron-3.5-asr-streaming-0.6b",
      "type": "machine-learning-model",
      "supplier": {
        "name": "NVIDIA Corporation",
        "url": [
          "https://huggingface.co/nvidia"
        ]
      },
      "name": "nvidia/nemotron-3.5-asr-streaming-0.6b (Q8_0 GGUF)",
      "version": "ea30d66debe3740a08b573244286791d423d6b3e",
      "description": "Riconoscimento vocale multilingue in streaming per i sottotitoli in diretta (lingua configurata it-IT). Scaricato da Hugging Face a ogni avvio del pod dei sottotitoli, alla revisione fissata, e verificato con lo SHA-256.",
      "hashes": [
        {
          "alg": "SHA-256",
          "content": "3fc991d3badad7277c11030a7519832cddaf2057aafed6d4b25147e953a070b1"
        }
      ],
      "licenses": [
        {
          "license": {
            "name": "OpenMDW-1.1"
          }
        }
      ],
      "externalReferences": [
        {
          "type": "distribution",
          "url": "https://huggingface.co/nvidia/nemotron-3.5-asr-streaming-0.6b/resolve/ea30d66debe3740a08b573244286791d423d6b3e/nemotron-3.5-asr-streaming-0.6b.q8_0.gguf"
        },
        {
          "type": "documentation",
          "url": "https://huggingface.co/nvidia/nemotron-3.5-asr-streaming-0.6b"
        }
      ]
    },
    {
      "bom-ref": "model:mistralai/Mistral-Small-3.2-24B-Instruct-2506",
      "type": "machine-learning-model",
      "supplier": {
        "name": "Mistral AI",
        "url": [
          "https://huggingface.co/mistralai"
        ]
      },
      "name": "mistralai/Mistral-Small-3.2-24B-Instruct-2506",
      "version": "2506",
      "description": "Modello linguistico servito da vLLM (bfloat16, contesto 32768 token) per riassunti, traduzioni e resoconti. Scaricato da Hugging Face all'avvio di vLLM in una cache temporanea del pod.",
      "licenses": [
        {
          "license": {
            "id": "Apache-2.0"
          }
        }
      ],
      "externalReferences": [
        {
          "type": "documentation",
          "url": "https://huggingface.co/mistralai/Mistral-Small-3.2-24B-Instruct-2506"
        }
      ]
    },
    {
      "bom-ref": "model:Systran/faster-whisper-large-v3",
      "type": "machine-learning-model",
      "supplier": {
        "name": "Systran",
        "url": [
          "https://huggingface.co/Systran"
        ]
      },
      "name": "Systran/faster-whisper-large-v3",
      "version": "large-v3",
      "description": "Pesi di riconoscimento vocale della trascrizione post-evento (WhisperX), convertiti da openai/whisper-large-v3 (Apache-2.0). Scaricati da Hugging Face all'avvio di ogni Job GPU: su questa installazione il volume dei modelli è temporaneo (HF_HUB_OFFLINE=0).",
      "licenses": [
        {
          "license": {
            "id": "MIT"
          }
        }
      ],
      "externalReferences": [
        {
          "type": "documentation",
          "url": "https://huggingface.co/Systran/faster-whisper-large-v3"
        }
      ]
    },
    {
      "bom-ref": "model:pyannote/diarization",
      "type": "machine-learning-model",
      "supplier": {
        "name": "pyannote",
        "url": [
          "https://huggingface.co/pyannote"
        ]
      },
      "name": "Modelli pyannote per la diarizzazione",
      "description": "speaker-diarization-3.1 e segmentation-3.0 (MIT), wespeaker-voxceleb-resnet34-LM e i file PLDA di speaker-diarization-community-1 (CC-BY-4.0, attribuzione). Modelli ad accesso condizionato: scaricati da Hugging Face con un token all'avvio dei Job GPU. Nessuna impronta vocale conservata.",
      "licenses": [
        {
          "license": {
            "id": "MIT"
          }
        },
        {
          "license": {
            "id": "CC-BY-4.0"
          }
        }
      ],
      "externalReferences": [
        {
          "type": "documentation",
          "url": "https://huggingface.co/pyannote/speaker-diarization-3.1"
        }
      ]
    },
    {
      "bom-ref": "model:whisperx/alignment",
      "type": "machine-learning-model",
      "name": "Modelli di allineamento parola per parola (WhisperX)",
      "description": "torchaudio WAV2VEC2_ASR_BASE_960H per l'inglese (MIT) e VOXPOPULI_ASR_BASE_10K per italiano, francese, tedesco e spagnolo (CC BY-NC 4.0: termini non commerciali, da verificare). Scaricati all'avvio dei Job GPU.",
      "licenses": [
        {
          "license": {
            "id": "MIT"
          }
        },
        {
          "license": {
            "id": "CC-BY-NC-4.0"
          }
        }
      ]
    },
    {
      "bom-ref": "model:rhasspy/piper-voices",
      "type": "machine-learning-model",
      "supplier": {
        "name": "Rhasspy / Open Home Foundation",
        "url": [
          "https://huggingface.co/rhasspy/piper-voices"
        ]
      },
      "name": "Voci Piper per il doppiaggio",
      "description": "Voci incluse nell'immagine del worker GPU: it_IT-paola-medium, en_US-lessac-medium, en_US-amy-medium, fr_FR-siwis-medium, fr_FR-tom-medium. Il repository dichiara MIT; i dataset di addestramento hanno licenze proprie (lessac: licenza di ricerca; fr_FR-tom: AGPLv3; siwis: CC-BY 4.0; paola: CC0), da verificare. Solo voci di catalogo, nessuna clonazione della voce.",
      "licenses": [
        {
          "license": {
            "id": "MIT"
          }
        }
      ]
    },
    {
      "bom-ref": "model:facebook/audioseal",
      "type": "machine-learning-model",
      "supplier": {
        "name": "Meta Platforms, Inc.",
        "url": [
          "https://huggingface.co/facebook/audioseal"
        ]
      },
      "name": "AudioSeal audioseal_wm_16bits",
      "description": "Generatore di filigrana non udibile per l'audio doppiato. Scaricato da huggingface.co tramite torch.hub durante i Job di doppiaggio.",
      "licenses": [
        {
          "license": {
            "id": "MIT"
          }
        }
      ]
    },
    {
      "bom-ref": "crypto:tls/letsencrypt",
      "type": "cryptographic-asset",
      "name": "Certificati TLS di portale, Jitsi e TURN",
      "description": "Certificati X.509 RSA 2048 per pa-webinar-test.developers.italia.it, pa-webinar-test-jitsi.developers.italia.it e pa-webinar-test-turn.developers.italia.it, emessi da Let's Encrypt (intermedi YR1/YR2) via cert-manager con sfida ACME HTTP-01. Validità 90 giorni, rinnovo automatico 30 giorni prima della scadenza. Chiavi private in Secret Kubernetes.",
      "cryptoProperties": {
        "assetType": "certificate",
        "certificateProperties": {
          "issuerName": "C=US, O=Let's Encrypt",
          "certificateFormat": "X.509"
        }
      },
      "properties": [
        {
          "name": "crypto:algorithm",
          "value": "RSA-2048, firma sha256WithRSAEncryption"
        },
        {
          "name": "crypto:issuer",
          "value": "Let's Encrypt (ISRG)"
        },
        {
          "name": "crypto:rotation",
          "value": "automatica, cert-manager (90 giorni, rinnovo a 60)"
        },
        {
          "name": "crypto:tls-observed",
          "value": "TLS 1.3 negoziato sui tre host al momento della generazione"
        }
      ]
    },
    {
      "bom-ref": "crypto:jwt/jitsi-signing-key",
      "type": "cryptographic-asset",
      "name": "Chiave di firma JWT per Jitsi",
      "description": "Chiave simmetrica HS256 condivisa tra portale e Prosody per autenticare chi entra in sala. Il token porta nome, hash dell'email (mai l'email), ruolo, stanza e scadenza. Conservata in un Secret Kubernetes, mai esposta al browser.",
      "cryptoProperties": {
        "assetType": "related-crypto-material",
        "relatedCryptoMaterialProperties": {
          "type": "secret-key",
          "size": 256
        }
      },
      "properties": [
        {
          "name": "crypto:algorithm",
          "value": "HS256"
        },
        {
          "name": "crypto:storage",
          "value": "Secret Kubernetes"
        },
        {
          "name": "crypto:rotation",
          "value": "manuale, su richiesta dell'operatore"
        }
      ]
    },
    {
      "bom-ref": "crypto:jwt/staff-session-key",
      "type": "cryptographic-asset",
      "name": "Chiave di firma delle sessioni dello staff",
      "description": "Chiave simmetrica HS256 (APP_SECRET) che firma il cookie HTTP-only delle sessioni di amministratori e organizzatori. Conservata in un Secret Kubernetes.",
      "cryptoProperties": {
        "assetType": "related-crypto-material",
        "relatedCryptoMaterialProperties": {
          "type": "secret-key",
          "size": 256
        }
      },
      "properties": [
        {
          "name": "crypto:algorithm",
          "value": "HS256"
        },
        {
          "name": "crypto:storage",
          "value": "Secret Kubernetes"
        },
        {
          "name": "crypto:rotation",
          "value": "manuale, su richiesta dell'operatore"
        }
      ]
    },
    {
      "bom-ref": "crypto:encryption/pii",
      "type": "cryptographic-asset",
      "name": "Chiave di cifratura dei dati personali a riposo",
      "description": "AES-256-GCM applicata dal portale ai campi personali prima della scrittura su PostgreSQL (PII_ENCRYPTION_KEY). La chiave sta in un Secret Kubernetes: il servizio database non la vede.",
      "cryptoProperties": {
        "assetType": "related-crypto-material",
        "relatedCryptoMaterialProperties": {
          "type": "secret-key",
          "size": 256
        }
      },
      "properties": [
        {
          "name": "crypto:algorithm",
          "value": "AES-256-GCM"
        },
        {
          "name": "crypto:storage",
          "value": "Secret Kubernetes"
        },
        {
          "name": "crypto:purpose",
          "value": "cifratura applicativa dei dati personali a riposo"
        }
      ]
    }
  ],
  "services": [
    {
      "bom-ref": "svc:azure/dns/developers.italia.it",
      "provider": {
        "name": "Microsoft Corporation",
        "url": [
          "https://azure.microsoft.com"
        ]
      },
      "group": "Microsoft.Network",
      "name": "Azure DNS",
      "description": "Zona DNS developers.italia.it, delegata dal dominio italia.it e ospitata su Azure DNS: risolve i nomi del portale, di Jitsi e del TURN.",
      "authenticated": false,
      "x-trust-boundary": true,
      "externalReferences": [
        {
          "type": "documentation",
          "url": "https://learn.microsoft.com/azure/dns/"
        }
      ],
      "properties": [
        {
          "name": "azure:resource-type",
          "value": "Microsoft.Network/dnszones"
        },
        {
          "name": "pa-webinar:hostnames",
          "value": "pa-webinar-test.developers.italia.it, pa-webinar-test-jitsi.developers.italia.it, pa-webinar-test-turn.developers.italia.it"
        },
        {
          "name": "pa-webinar:layer",
          "value": "access"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Azure DNS"
        }
      ]
    },
    {
      "bom-ref": "svc:azure/load-balancer",
      "provider": {
        "name": "Microsoft Corporation",
        "url": [
          "https://azure.microsoft.com"
        ]
      },
      "group": "Microsoft.Network",
      "name": "Azure Load Balancer (IP pubblici)",
      "description": "Bilanciatore Standard del cluster con gli indirizzi pubblici dell'ingress HTTPS (porta 443), del bridge video (UDP 10000) e del TURN (3478 e 443). Trasporta traffico cifrato (TLS, DTLS-SRTP).",
      "authenticated": false,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "bi-directional",
          "classification": "media",
          "description": "Traffico web e audio/video cifrato in transito, non conservato."
        }
      ],
      "externalReferences": [
        {
          "type": "documentation",
          "url": "https://learn.microsoft.com/azure/load-balancer/"
        }
      ],
      "properties": [
        {
          "name": "azure:resource-type",
          "value": "Microsoft.Network/loadBalancers"
        },
        {
          "name": "azure:sku",
          "value": "Standard"
        },
        {
          "name": "azure:region",
          "value": "italynorth"
        },
        {
          "name": "pa-webinar:layer",
          "value": "access"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Azure Load Balancer"
        }
      ]
    },
    {
      "bom-ref": "svc:ingress-nginx",
      "provider": {
        "name": "Dipartimento per la Trasformazione Digitale (gestito nel cluster)",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "name": "ingress-nginx",
      "version": "v1.9.4",
      "description": "Ingress controller condiviso dal cluster (progetto Kubernetes): termina TLS per portale e Jitsi web e instrada verso i servizi interni.",
      "authenticated": false,
      "x-trust-boundary": false,
      "data": [
        {
          "flow": "bi-directional",
          "classification": "personal-data",
          "description": "Vede in chiaro le richieste HTTP dopo la terminazione TLS (moduli di iscrizione inclusi) e scrive nei log di accesso l'indirizzo IP dei visitatori."
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:helm-chart",
          "value": "ingress-nginx-4.8.3"
        },
        {
          "name": "pa-webinar:layer",
          "value": "access"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "ingress-nginx"
        }
      ]
    },
    {
      "bom-ref": "svc:cert-manager",
      "provider": {
        "name": "Dipartimento per la Trasformazione Digitale (gestito nel cluster)",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "name": "cert-manager",
      "version": "v1.13.3",
      "description": "Emissione e rinnovo automatico dei certificati TLS di portale, Jitsi e TURN tramite Let's Encrypt (ACME HTTP-01). Componente condiviso dal cluster.",
      "authenticated": false,
      "x-trust-boundary": false,
      "properties": [
        {
          "name": "pa-webinar:layer",
          "value": "access"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "cert-manager"
        }
      ]
    },
    {
      "bom-ref": "svc:letsencrypt",
      "provider": {
        "name": "Internet Security Research Group (ISRG)",
        "url": [
          "https://letsencrypt.org"
        ]
      },
      "name": "Let's Encrypt ACME CA",
      "description": "Autorità di certificazione pubblica che firma i certificati TLS della piattaforma.",
      "endpoints": [
        "https://acme-v02.api.letsencrypt.org/directory"
      ],
      "authenticated": false,
      "x-trust-boundary": true,
      "externalReferences": [
        {
          "type": "documentation",
          "url": "https://letsencrypt.org/repository/"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:layer",
          "value": "access"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Let's Encrypt"
        }
      ]
    },
    {
      "bom-ref": "svc:coturn",
      "provider": {
        "name": "Dipartimento per la Trasformazione Digitale (gestito nel cluster)",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "name": "TURN/STUN relay (coturn)",
      "version": "4.9.0",
      "description": "Server STUN/TURN nel cluster, per i partecipanti dietro NAT o firewall che non raggiungono il bridge. Credenziali temporanee firmate con un segreto condiviso; TURNS con certificato Let's Encrypt.",
      "endpoints": [
        "turn:pa-webinar-test-turn.developers.italia.it:3478",
        "turns:pa-webinar-test-turn.developers.italia.it:443"
      ],
      "authenticated": true,
      "x-trust-boundary": false,
      "data": [
        {
          "flow": "bi-directional",
          "classification": "media",
          "description": "Flussi audio/video cifrati (DTLS-SRTP) inoltrati quando serve. Non conservati."
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:layer",
          "value": "access"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "coturn (TURN/STUN)"
        }
      ]
    },
    {
      "bom-ref": "svc:in-cluster/live-captions",
      "provider": {
        "name": "Dipartimento per la Trasformazione Digitale (gestito nel cluster)",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "name": "Sottotitoli in diretta",
      "description": "Il bridge invia l'audio di ogni oratore al gateway, che lo fa trascrivere su CPU da un modello locale; il testo torna alla sala. Nessun audio né testo esce dal cluster e per impostazione predefinita nessun testo è conservato; un evento può tenere una trascrizione con le frasi di chi ha acconsentito. Il pod si accende solo durante gli eventi.",
      "authenticated": true,
      "x-trust-boundary": false,
      "data": [
        {
          "flow": "bi-directional",
          "classification": "personal-data",
          "description": "Voce degli oratori, trattata in memoria; trascrizione salvata solo se l'evento la attiva, per chi ha dato il consenso."
        }
      ],
      "externalReferences": [
        {
          "type": "documentation",
          "url": "https://github.com/italia/pa-webinar/blob/c0f267da4e27f90fe966b987eee791524ee37077/docs/architecture/live-captions.md"
        },
        {
          "type": "documentation",
          "url": "https://github.com/italia/pa-webinar/blob/c0f267da4e27f90fe966b987eee791524ee37077/docs/adr/018-live-captions.md"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:language",
          "value": "it-IT"
        },
        {
          "name": "pa-webinar:max-streams",
          "value": "4"
        },
        {
          "name": "pa-webinar:layer",
          "value": "app"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Sottotitoli in diretta"
        }
      ]
    },
    {
      "bom-ref": "svc:in-cluster/multitrack-recorder",
      "provider": {
        "name": "Dipartimento per la Trasformazione Digitale (gestito nel cluster)",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "name": "Registrazione audio per partecipante",
      "description": "Il controller avvia un bot che registra una traccia audio per ciascun oratore, per attribuire la trascrizione a chi parla (ADR-013). Serve un consenso distinto da quello alla registrazione video. Le tracce vanno nell'object storage e sono eliminate dopo la trascrizione (controllo ogni 15 minuti).",
      "authenticated": true,
      "x-trust-boundary": false,
      "data": [
        {
          "flow": "outbound",
          "classification": "recording",
          "description": "Tracce audio per partecipante, input intermedio della trascrizione."
        },
        {
          "flow": "bi-directional",
          "classification": "personal-data",
          "description": "Voce e nome visualizzato dei partecipanti che hanno acconsentito. Nessuna impronta vocale calcolata o conservata."
        }
      ],
      "externalReferences": [
        {
          "type": "documentation",
          "url": "https://github.com/italia/pa-webinar/blob/c0f267da4e27f90fe966b987eee791524ee37077/docs/adr/013-multitrack-speaker-attribution.md"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:gdpr-legal-basis",
          "value": "consenso esplicito (art. 6.1.a GDPR), distinto dal consenso alla registrazione"
        },
        {
          "name": "pa-webinar:layer",
          "value": "app"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Registrazione multitraccia"
        }
      ]
    },
    {
      "bom-ref": "svc:in-cluster/ai-postproduction",
      "provider": {
        "name": "Dipartimento per la Trasformazione Digitale (gestito nel cluster)",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "name": "Post-produzione AI nel cluster",
      "description": "Trascrizione, diarizzazione, sottotitoli, traduzioni, riassunti, doppiaggio con voci sintetiche e resoconto dell'evento, eseguiti da Job nel cluster: worker GPU e vLLM su un pool di nodi A100 spot a scalabilità da zero, worker CPU sui nodi del portale. Nessuna API AI esterna: i dati non escono dal cluster; dall'esterno arrivano solo i pesi dei modelli.",
      "authenticated": true,
      "x-trust-boundary": false,
      "data": [
        {
          "flow": "bi-directional",
          "classification": "recording",
          "description": "Registrazioni e tracce audio lette dall'object storage; output (trascrizioni, sottotitoli, audio doppiato) riscritti nello storage."
        },
        {
          "flow": "bi-directional",
          "classification": "personal-data",
          "description": "Voce e nomi dei partecipanti presenti nelle registrazioni."
        }
      ],
      "externalReferences": [
        {
          "type": "documentation",
          "url": "https://github.com/italia/pa-webinar/blob/c0f267da4e27f90fe966b987eee791524ee37077/docs/POSTPROD.md"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:llm",
          "value": "mistralai/Mistral-Small-3.2-24B-Instruct-2506 su vLLM v0.9.2"
        },
        {
          "name": "pa-webinar:gpu-node-pool",
          "value": "Standard_NC24ads_A100_v4, spot, 0-2 nodi"
        },
        {
          "name": "pa-webinar:layer",
          "value": "app"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Post-produzione AI (in-cluster)"
        }
      ]
    },
    {
      "bom-ref": "svc:azure/postgres-flexible/videocall-test",
      "provider": {
        "name": "Microsoft Corporation",
        "url": [
          "https://azure.microsoft.com"
        ]
      },
      "group": "Microsoft.DBforPostgreSQL",
      "name": "Azure Database for PostgreSQL Flexible Server",
      "version": "16",
      "description": "Database dedicato a questa installazione, su un server flessibile gestito. Contiene eventi, iscrizioni, consensi, chat, sondaggi, questionari e risultati della post-produzione; i campi personali sono cifrati AES-256-GCM dal portale prima della scrittura.",
      "authenticated": true,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "bi-directional",
          "classification": "personal-data",
          "description": "Nominativi, email, consensi, messaggi e risposte dei partecipanti. Base giuridica: consenso e esecuzione del servizio richiesto (art. 6.1.a e 6.1.b GDPR)."
        },
        {
          "flow": "bi-directional",
          "classification": "application"
        }
      ],
      "externalReferences": [
        {
          "type": "documentation",
          "url": "https://learn.microsoft.com/azure/postgresql/flexible-server/"
        }
      ],
      "properties": [
        {
          "name": "azure:resource-type",
          "value": "Microsoft.DBforPostgreSQL/flexibleServers"
        },
        {
          "name": "azure:region",
          "value": "italynorth"
        },
        {
          "name": "azure:sku",
          "value": "Standard_B2ms (Burstable)"
        },
        {
          "name": "azure:high-availability",
          "value": "disattivata (zona 1)"
        },
        {
          "name": "azure:tls-minimum",
          "value": "TLS 1.2, connessioni cifrate obbligatorie"
        },
        {
          "name": "azure:backup",
          "value": "35 giorni, ridondanza locale (geo-ridondanza disattivata)"
        },
        {
          "name": "azure:encryption",
          "value": "chiavi gestite dal servizio"
        },
        {
          "name": "pa-webinar:retention-days",
          "value": "per evento, da 1 a 365 giorni dalla fine dell'evento (predefinito 30)"
        },
        {
          "name": "pa-webinar:pii-encryption",
          "value": "AES-256-GCM applicativa, chiave non visibile al servizio"
        },
        {
          "name": "pa-webinar:layer",
          "value": "data"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "PostgreSQL Flexible"
        }
      ]
    },
    {
      "bom-ref": "svc:azure/blob/recordings",
      "provider": {
        "name": "Microsoft Corporation",
        "url": [
          "https://azure.microsoft.com"
        ]
      },
      "group": "Microsoft.Storage",
      "name": "Azure Blob Storage",
      "description": "Storage account developersitaliarec. Per questa installazione: container recordings (registrazioni video, tracce audio per partecipante, output della post-produzione) e event-assets-test (materiali e immagini degli eventi). Accesso pubblico ai blob disattivato: upload e download con URL firmati a breve scadenza.",
      "endpoints": [
        "https://developersitaliarec.blob.core.windows.net/"
      ],
      "authenticated": true,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "bi-directional",
          "classification": "recording",
          "description": "Registrazioni delle sessioni e tracce audio dei partecipanti. Base giuridica: consenso esplicito dei partecipanti."
        },
        {
          "flow": "bi-directional",
          "classification": "personal-data",
          "description": "Voce, immagine e nomi dei partecipanti presenti nelle registrazioni e nei loro derivati."
        }
      ],
      "externalReferences": [
        {
          "type": "documentation",
          "url": "https://learn.microsoft.com/azure/storage/blobs/"
        }
      ],
      "properties": [
        {
          "name": "azure:resource-type",
          "value": "Microsoft.Storage/storageAccounts"
        },
        {
          "name": "azure:region",
          "value": "italynorth"
        },
        {
          "name": "azure:replication",
          "value": "LRS (ridondanza locale)"
        },
        {
          "name": "azure:tls-minimum",
          "value": "TLS 1.2"
        },
        {
          "name": "azure:encryption",
          "value": "AES-256 con chiavi gestite da Microsoft"
        },
        {
          "name": "pa-webinar:containers",
          "value": "recordings, event-assets-test"
        },
        {
          "name": "pa-webinar:layer",
          "value": "data"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Azure Blob (registrazioni e materiali)"
        }
      ]
    },
    {
      "bom-ref": "svc:azure/files/jibri",
      "provider": {
        "name": "Microsoft Corporation",
        "url": [
          "https://azure.microsoft.com"
        ]
      },
      "group": "Microsoft.Storage",
      "name": "Azure Files (volume di lavoro di Jibri)",
      "description": "Volume condiviso da 32 GiB (azurefile-csi) dove Jibri scrive la registrazione prima di caricarla nel Blob Storage. Lo storage account lo crea AKS nel resource group dei nodi.",
      "authenticated": true,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "outbound",
          "classification": "recording",
          "description": "File MP4 in lavorazione, fino al caricamento nel Blob Storage."
        }
      ],
      "properties": [
        {
          "name": "azure:resource-type",
          "value": "Microsoft.Storage/storageAccounts (FileStorage share)"
        },
        {
          "name": "azure:region",
          "value": "italynorth"
        },
        {
          "name": "azure:replication",
          "value": "LRS"
        },
        {
          "name": "azure:tls-minimum",
          "value": "TLS 1.2"
        },
        {
          "name": "pa-webinar:layer",
          "value": "data"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Azure Files (Jibri)"
        }
      ]
    },
    {
      "bom-ref": "svc:redis-in-cluster",
      "provider": {
        "name": "Dipartimento per la Trasformazione Digitale (gestito nel cluster)",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "name": "Redis (fan-out in tempo reale)",
      "version": "8.10.2",
      "description": "Redis 8 standalone nel cluster, senza persistenza su disco: distribuisce in tempo reale chat, comandi della sala e stato dei bridge. Lo stato canonico è in PostgreSQL. Protetto da password.",
      "authenticated": true,
      "x-trust-boundary": false,
      "data": [
        {
          "flow": "bi-directional",
          "classification": "personal-data",
          "description": "Messaggi di chat e nomi visualizzati in transito, per pochi secondi; nessuna copia su disco."
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:persistence",
          "value": "disattivata (save \"\", appendonly no)"
        },
        {
          "name": "pa-webinar:layer",
          "value": "data"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Redis (in-cluster)"
        }
      ]
    },
    {
      "bom-ref": "svc:backup/velero",
      "provider": {
        "name": "Dipartimento per la Trasformazione Digitale (gestito nel cluster)",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "name": "Backup del cluster (Velero)",
      "version": "1.17.1",
      "description": "Backup giornaliero (conservato 30 giorni) e mensile (90 giorni) degli oggetti Kubernetes di tutti i namespace, Secret compresi, con snapshot dei volumi, in uno storage account dedicato (Azure Blob, ZRS, Italy North).",
      "authenticated": true,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "outbound",
          "classification": "application",
          "description": "Configurazione e Secret del namespace (chiavi e credenziali)."
        }
      ],
      "properties": [
        {
          "name": "azure:region",
          "value": "italynorth"
        },
        {
          "name": "azure:replication",
          "value": "ZRS"
        },
        {
          "name": "pa-webinar:layer",
          "value": "data"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Backup cluster (Velero)"
        }
      ]
    },
    {
      "bom-ref": "svc:backup/postgres-dumps",
      "provider": {
        "name": "Dipartimento per la Trasformazione Digitale (gestito nel cluster)",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "name": "Backup logico del database (pg_dump)",
      "description": "Dump giornaliero di tutti i database del server PostgreSQL, quello di questa installazione compreso, in uno storage account dedicato (Azure Blob, ZRS, Italy North). I campi personali restano cifrati come nel database.",
      "authenticated": true,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "outbound",
          "classification": "personal-data",
          "description": "Copia del database dell'installazione."
        }
      ],
      "properties": [
        {
          "name": "azure:region",
          "value": "italynorth"
        },
        {
          "name": "azure:replication",
          "value": "ZRS"
        },
        {
          "name": "pa-webinar:layer",
          "value": "data"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Backup database (pg_dump)"
        }
      ]
    },
    {
      "bom-ref": "svc:azure/aks/videocall-test",
      "provider": {
        "name": "Microsoft Corporation",
        "url": [
          "https://azure.microsoft.com"
        ]
      },
      "group": "Microsoft.ContainerService",
      "name": "Azure Kubernetes Service",
      "version": "1.34.11",
      "description": "Cluster AKS gestito; questa installazione occupa un proprio namespace. Pool usati: test (spot, portale e servizi), jvb (bridge), jibri (registrazione) e aigpu (A100 spot), gli ultimi tre a scalabilità da zero.",
      "authenticated": true,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "bi-directional",
          "classification": "personal-data",
          "description": "I nodi trattano in memoria e su disco temporaneo i dati del portale, i flussi audio/video e i file di registrazione in lavorazione."
        },
        {
          "flow": "bi-directional",
          "classification": "application"
        }
      ],
      "externalReferences": [
        {
          "type": "documentation",
          "url": "https://learn.microsoft.com/azure/aks/"
        },
        {
          "type": "documentation",
          "url": "https://learn.microsoft.com/compliance/regulatory/offering-home"
        }
      ],
      "properties": [
        {
          "name": "azure:resource-type",
          "value": "Microsoft.ContainerService/managedClusters"
        },
        {
          "name": "azure:region",
          "value": "italynorth"
        },
        {
          "name": "azure:availability-zones",
          "value": "1, 2, 3 (aigpu: 1, 2)"
        },
        {
          "name": "azure:tier",
          "value": "Free: nessuno SLA finanziario sul piano di controllo"
        },
        {
          "name": "azure:certifications",
          "value": "ISO/IEC 27001, 27017, 27018; SOC 1, 2, 3 (piattaforma Azure)"
        },
        {
          "name": "pa-webinar:node-pool.test",
          "value": "Standard_D2as_v5, spot, 0-5 nodi: portale, Jitsi, Redis, coturn, Job"
        },
        {
          "name": "pa-webinar:node-pool.test.availability-impact",
          "value": "interrompibile: Azure può revocare i nodi spot con 30 secondi di preavviso; accettato in collaudo"
        },
        {
          "name": "pa-webinar:node-pool.jvb",
          "value": "Standard_F16s_v2, regolare, 0-6 nodi"
        },
        {
          "name": "pa-webinar:node-pool.jibri",
          "value": "Standard_F4s_v2, regolare, 0-2 nodi"
        },
        {
          "name": "pa-webinar:node-pool.aigpu",
          "value": "Standard_NC24ads_A100_v4, spot, 0-2 nodi"
        },
        {
          "name": "pa-webinar:node-pool.system",
          "value": "Standard_D4as_v5, regolare, 2-5 nodi (anche la lavagna)"
        },
        {
          "name": "pa-webinar:layer",
          "value": "platform"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "AKS (Italy North)"
        }
      ]
    },
    {
      "bom-ref": "svc:azure/monitor-logs",
      "provider": {
        "name": "Microsoft Corporation",
        "url": [
          "https://azure.microsoft.com"
        ]
      },
      "group": "Microsoft.OperationalInsights",
      "name": "Azure Monitor (Container Insights)",
      "description": "L'add-on di monitoraggio di AKS invia i log stdout/stderr dei container e l'inventario del cluster a un workspace Log Analytics in Italy North, conservati 30 giorni. Nessuna personalizzazione della raccolta nel cluster: si applica la configurazione predefinita, che esclude solo kube-system.",
      "authenticated": true,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "outbound",
          "classification": "personal-data",
          "description": "Log dei container, compresi i log di accesso dell'ingress con gli indirizzi IP dei visitatori. Il portale non scrive IP nei propri log."
        }
      ],
      "externalReferences": [
        {
          "type": "documentation",
          "url": "https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-overview"
        }
      ],
      "properties": [
        {
          "name": "azure:resource-type",
          "value": "Microsoft.OperationalInsights/workspaces"
        },
        {
          "name": "azure:region",
          "value": "italynorth"
        },
        {
          "name": "azure:retention-days",
          "value": "30"
        },
        {
          "name": "pa-webinar:layer",
          "value": "platform"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Azure Monitor (log)"
        }
      ]
    },
    {
      "bom-ref": "svc:loki",
      "provider": {
        "name": "Dipartimento per la Trasformazione Digitale (gestito nel cluster)",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "name": "Loki e Promtail (log del cluster)",
      "version": "3.1.1",
      "description": "Raccolta centralizzata dei log del cluster (Loki 3.1, Promtail 2.8), conservati in uno storage account dedicato (Azure Blob, LRS, Italy North). Promtail, nella configurazione predefinita, raccoglie i log di tutti i pod.",
      "authenticated": true,
      "x-trust-boundary": false,
      "data": [
        {
          "flow": "inbound",
          "classification": "personal-data",
          "description": "Log dei container, compresi quelli di accesso dell'ingress con gli indirizzi IP dei visitatori."
        }
      ],
      "properties": [
        {
          "name": "azure:region",
          "value": "italynorth"
        },
        {
          "name": "pa-webinar:layer",
          "value": "platform"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Loki (log)"
        }
      ]
    },
    {
      "bom-ref": "svc:kube-prometheus-stack",
      "provider": {
        "name": "Dipartimento per la Trasformazione Digitale (gestito nel cluster)",
        "url": [
          "https://innovazione.gov.it"
        ]
      },
      "name": "kube-prometheus-stack (Prometheus e Grafana)",
      "version": "85.2.0",
      "description": "Metriche di piattaforma: metriche del portale (/api/metrics), di Redis e del cluster, regole di allarme e dashboard Grafana. Dati aggregati.",
      "authenticated": true,
      "x-trust-boundary": false,
      "data": [
        {
          "flow": "inbound",
          "classification": "telemetry",
          "description": "Contatori e misure aggregate, senza dati personali."
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:layer",
          "value": "platform"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Prometheus e Grafana"
        }
      ]
    },
    {
      "bom-ref": "svc:mailgun/eu",
      "provider": {
        "name": "Mailgun Technologies, Inc. (Sinch)",
        "url": [
          "https://www.mailgun.com/"
        ]
      },
      "name": "Mailgun (regione EU)",
      "description": "Relay SMTP delle email transazionali: conferme d'iscrizione, link personali di accesso, promemoria, comunicazioni post-evento. Mittente no-reply@developers.italia.it, con un'utenza SMTP dedicata a questo ambiente.",
      "endpoints": [
        "smtp://smtp.eu.mailgun.org:587"
      ],
      "authenticated": true,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "outbound",
          "classification": "personal-data",
          "description": "Indirizzo email, nominativo e link di accesso personali. Base giuridica: esecuzione del servizio richiesto (art. 6.1.b GDPR)."
        }
      ],
      "externalReferences": [
        {
          "type": "documentation",
          "url": "https://documentation.mailgun.com/"
        },
        {
          "type": "documentation",
          "url": "https://www.mailgun.com/legal/dpa/"
        }
      ],
      "properties": [
        {
          "name": "mailgun:region",
          "value": "EU"
        },
        {
          "name": "pa-webinar:sender",
          "value": "no-reply@developers.italia.it"
        },
        {
          "name": "pa-webinar:smtp-transport",
          "value": "porta 587 con STARTTLS"
        },
        {
          "name": "pa-webinar:layer",
          "value": "platform"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Mailgun EU (SMTP)"
        }
      ]
    },
    {
      "bom-ref": "svc:github/ghcr",
      "provider": {
        "name": "GitHub, Inc. (Microsoft)",
        "url": [
          "https://github.com"
        ]
      },
      "name": "GitHub Container Registry",
      "description": "Registro delle immagini PA Webinar (portale, migrazioni, Jitsi web modificato, registratore e controller, sottotitoli, worker AI). Il cluster le scarica con un pull secret.",
      "endpoints": [
        "https://ghcr.io"
      ],
      "authenticated": true,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "inbound",
          "classification": "application",
          "description": "Immagini container."
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:layer",
          "value": "platform"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "GHCR (immagini)"
        }
      ]
    },
    {
      "bom-ref": "svc:docker/hub",
      "provider": {
        "name": "Docker, Inc.",
        "url": [
          "https://www.docker.com"
        ]
      },
      "name": "Docker Hub",
      "description": "Registro delle immagini di terze parti: Jitsi (Prosody, Jicofo, bridge, Jibri, lavagna), coturn, Redis, kubectl, curl, nginx, busybox, vLLM. I componenti condivisi del cluster arrivano anche da registry.k8s.io e quay.io.",
      "endpoints": [
        "https://registry-1.docker.io"
      ],
      "authenticated": true,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "inbound",
          "classification": "application",
          "description": "Immagini container."
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:layer",
          "value": "platform"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Docker Hub (immagini)"
        }
      ]
    },
    {
      "bom-ref": "svc:nvidia/ngc",
      "provider": {
        "name": "NVIDIA Corporation",
        "url": [
          "https://catalog.ngc.nvidia.com"
        ]
      },
      "name": "NVIDIA NGC (nvcr.io)",
      "description": "Registro delle immagini NVIDIA: GPU Operator, driver e container toolkit scaricati quando il pool GPU si accende; base dell'immagine del worker GPU (in fase di build).",
      "endpoints": [
        "https://nvcr.io"
      ],
      "authenticated": false,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "inbound",
          "classification": "application",
          "description": "Immagini container e driver."
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:layer",
          "value": "platform"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "NVIDIA NGC"
        }
      ]
    },
    {
      "bom-ref": "svc:huggingface/hub",
      "provider": {
        "name": "Hugging Face, Inc.",
        "url": [
          "https://huggingface.co"
        ]
      },
      "name": "Hugging Face Hub",
      "description": "Fonte dei pesi dei modelli, scaricati all'avvio: modello dei sottotitoli (revisione e SHA-256 fissati), modello linguistico di vLLM, modelli di trascrizione e diarizzazione (con token per quelli ad accesso condizionato), filigrana AudioSeal. Nessun dato dei partecipanti viene inviato.",
      "endpoints": [
        "https://huggingface.co"
      ],
      "authenticated": true,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "inbound",
          "classification": "application",
          "description": "Pesi dei modelli."
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:layer",
          "value": "platform"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "Hugging Face (modelli)"
        }
      ]
    },
    {
      "bom-ref": "svc:pytorch/download",
      "provider": {
        "name": "PyTorch Foundation (Linux Foundation)",
        "url": [
          "https://pytorch.org"
        ]
      },
      "name": "PyTorch download server",
      "description": "Fonte dei pesi torchaudio usati da WhisperX per l'allineamento delle parole (inglese, italiano, francese, tedesco, spagnolo), scaricati all'avvio dei Job GPU.",
      "endpoints": [
        "https://download.pytorch.org"
      ],
      "authenticated": false,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "inbound",
          "classification": "application",
          "description": "Pesi dei modelli."
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:layer",
          "value": "platform"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "download.pytorch.org (modelli)"
        }
      ]
    },
    {
      "bom-ref": "svc:github/source-and-ci",
      "provider": {
        "name": "GitHub, Inc. (Microsoft)",
        "url": [
          "https://github.com"
        ]
      },
      "name": "GitHub (sorgenti e CI/CD)",
      "description": "Repository italia/pa-webinar e GitHub Actions: a ogni push sul ramo dev costruiscono le immagini :dev e :dev-<commit> su un runner self-hosted (Actions Runner Controller) dentro lo stesso cluster AKS; le pull request girano su runner ospitati da GitHub. I rilasci pubblicano SBOM.",
      "endpoints": [
        "https://github.com/italia/pa-webinar"
      ],
      "authenticated": false,
      "x-trust-boundary": true,
      "data": [
        {
          "flow": "inbound",
          "classification": "application",
          "description": "Codice sorgente e artefatti di build."
        }
      ],
      "externalReferences": [
        {
          "type": "build-system",
          "url": "https://github.com/italia/pa-webinar/actions"
        }
      ],
      "properties": [
        {
          "name": "pa-webinar:layer",
          "value": "platform"
        },
        {
          "name": "pa-webinar:stack-label",
          "value": "GitHub · CI/CD"
        }
      ]
    }
  ],
  "dependencies": [
    {
      "ref": "tenant:videocall-test",
      "dependsOn": [
        "pkg:oci/pa-webinar",
        "pkg:oci/pa-webinar-migrate",
        "pkg:oci/pa-webinar-recorder-controller",
        "pkg:oci/pa-webinar-recorder",
        "pkg:oci/pa-webinar-captions-gateway",
        "pkg:oci/pa-webinar-captions-engine",
        "pkg:oci/pa-webinar-postprod-worker",
        "pkg:oci/pa-webinar-postprod-worker-cpu",
        "pkg:oci/jitsi-web",
        "pkg:oci/jitsi-prosody",
        "pkg:oci/jitsi-jicofo",
        "pkg:oci/jitsi-jvb",
        "pkg:oci/jitsi-jibri",
        "pkg:oci/jitsi-excalidraw-backend",
        "pkg:oci/coturn",
        "pkg:oci/nginx-acme-proxy",
        "pkg:oci/busybox",
        "pkg:oci/redis",
        "pkg:oci/redis-exporter",
        "pkg:oci/kubectl",
        "pkg:oci/curl-8.11.1",
        "pkg:oci/curl-8.10.1",
        "pkg:oci/vllm-openai",
        "pkg:oci/ingress-nginx-controller",
        "pkg:oci/cert-manager",
        "pkg:oci/nvidia-gpu-operator",
        "model:nvidia/nemotron-3.5-asr-streaming-0.6b",
        "model:mistralai/Mistral-Small-3.2-24B-Instruct-2506",
        "model:Systran/faster-whisper-large-v3",
        "model:pyannote/diarization",
        "model:whisperx/alignment",
        "model:rhasspy/piper-voices",
        "model:facebook/audioseal",
        "crypto:tls/letsencrypt",
        "crypto:jwt/jitsi-signing-key",
        "crypto:jwt/staff-session-key",
        "crypto:encryption/pii",
        "svc:azure/dns/developers.italia.it",
        "svc:azure/load-balancer",
        "svc:ingress-nginx",
        "svc:cert-manager",
        "svc:letsencrypt",
        "svc:coturn",
        "svc:in-cluster/live-captions",
        "svc:in-cluster/multitrack-recorder",
        "svc:in-cluster/ai-postproduction",
        "svc:azure/postgres-flexible/videocall-test",
        "svc:azure/blob/recordings",
        "svc:azure/files/jibri",
        "svc:redis-in-cluster",
        "svc:backup/velero",
        "svc:backup/postgres-dumps",
        "svc:azure/aks/videocall-test",
        "svc:azure/monitor-logs",
        "svc:loki",
        "svc:kube-prometheus-stack",
        "svc:mailgun/eu",
        "svc:github/ghcr",
        "svc:docker/hub",
        "svc:nvidia/ngc",
        "svc:huggingface/hub",
        "svc:pytorch/download",
        "svc:github/source-and-ci"
      ]
    },
    {
      "ref": "pkg:oci/pa-webinar",
      "dependsOn": [
        "pkg:generic/nodejs@20.20.2",
        "pkg:npm/next@15.5.25",
        "pkg:npm/react@19.3.0",
        "pkg:npm/next-intl@4.14.6",
        "pkg:npm/@prisma/client@6.19.3",
        "pkg:npm/bootstrap-italia@2.18.3",
        "pkg:npm/design-react-kit@5.10.0",
        "pkg:npm/ioredis@5.11.1",
        "crypto:jwt/jitsi-signing-key",
        "crypto:jwt/staff-session-key",
        "crypto:encryption/pii",
        "svc:azure/postgres-flexible/videocall-test",
        "svc:azure/blob/recordings",
        "svc:redis-in-cluster",
        "svc:mailgun/eu"
      ]
    },
    {
      "ref": "pkg:oci/pa-webinar-captions-engine",
      "dependsOn": [
        "model:nvidia/nemotron-3.5-asr-streaming-0.6b"
      ]
    },
    {
      "ref": "pkg:oci/vllm-openai",
      "dependsOn": [
        "model:mistralai/Mistral-Small-3.2-24B-Instruct-2506"
      ]
    },
    {
      "ref": "pkg:oci/pa-webinar-postprod-worker",
      "dependsOn": [
        "model:Systran/faster-whisper-large-v3",
        "model:pyannote/diarization",
        "model:whisperx/alignment",
        "model:rhasspy/piper-voices",
        "model:facebook/audioseal"
      ]
    },
    {
      "ref": "svc:in-cluster/live-captions",
      "dependsOn": [
        "pkg:oci/pa-webinar-captions-gateway",
        "pkg:oci/pa-webinar-captions-engine",
        "pkg:oci/jitsi-jvb",
        "pkg:oci/jitsi-jicofo"
      ]
    },
    {
      "ref": "svc:in-cluster/multitrack-recorder",
      "dependsOn": [
        "pkg:oci/pa-webinar-recorder-controller",
        "pkg:oci/pa-webinar-recorder",
        "svc:azure/blob/recordings"
      ]
    },
    {
      "ref": "svc:in-cluster/ai-postproduction",
      "dependsOn": [
        "pkg:oci/pa-webinar-postprod-worker",
        "pkg:oci/pa-webinar-postprod-worker-cpu",
        "pkg:oci/vllm-openai",
        "pkg:oci/nvidia-gpu-operator",
        "svc:azure/blob/recordings",
        "svc:huggingface/hub",
        "svc:pytorch/download"
      ]
    },
    {
      "ref": "svc:coturn",
      "dependsOn": [
        "pkg:oci/coturn",
        "pkg:oci/nginx-acme-proxy",
        "pkg:oci/busybox"
      ]
    },
    {
      "ref": "svc:redis-in-cluster",
      "dependsOn": [
        "pkg:oci/redis",
        "pkg:oci/redis-exporter"
      ]
    },
    {
      "ref": "svc:ingress-nginx",
      "dependsOn": [
        "pkg:oci/ingress-nginx-controller",
        "crypto:tls/letsencrypt"
      ]
    },
    {
      "ref": "svc:cert-manager",
      "dependsOn": [
        "pkg:oci/cert-manager",
        "svc:letsencrypt"
      ]
    },
    {
      "ref": "pkg:oci/jitsi-jibri",
      "dependsOn": [
        "svc:azure/files/jibri",
        "svc:azure/blob/recordings"
      ]
    }
  ],
  "compositions": [
    {
      "bom-ref": "comp:dev-components",
      "aggregate": "incomplete",
      "assemblies": [
        "pkg:oci/pa-webinar",
        "pkg:oci/pa-webinar-migrate",
        "pkg:oci/pa-webinar-recorder-controller",
        "pkg:oci/pa-webinar-recorder",
        "pkg:oci/pa-webinar-captions-gateway",
        "pkg:oci/pa-webinar-captions-engine",
        "pkg:oci/pa-webinar-postprod-worker",
        "pkg:oci/pa-webinar-postprod-worker-cpu",
        "pkg:oci/jitsi-web",
        "pkg:oci/jitsi-prosody",
        "pkg:oci/jitsi-jicofo",
        "pkg:oci/jitsi-jvb",
        "pkg:oci/jitsi-jibri",
        "pkg:oci/jitsi-excalidraw-backend",
        "pkg:oci/coturn",
        "pkg:oci/nginx-acme-proxy",
        "pkg:oci/busybox",
        "pkg:oci/redis",
        "pkg:oci/redis-exporter",
        "pkg:oci/kubectl",
        "pkg:oci/curl-8.11.1",
        "pkg:oci/curl-8.10.1",
        "pkg:oci/vllm-openai",
        "pkg:oci/ingress-nginx-controller",
        "pkg:oci/cert-manager",
        "pkg:oci/nvidia-gpu-operator",
        "model:nvidia/nemotron-3.5-asr-streaming-0.6b",
        "model:mistralai/Mistral-Small-3.2-24B-Instruct-2506",
        "model:Systran/faster-whisper-large-v3",
        "model:pyannote/diarization",
        "model:whisperx/alignment",
        "model:rhasspy/piper-voices",
        "model:facebook/audioseal"
      ]
    },
    {
      "bom-ref": "comp:ops-services",
      "aggregate": "incomplete",
      "assemblies": [
        "svc:azure/dns/developers.italia.it",
        "svc:azure/load-balancer",
        "svc:ingress-nginx",
        "svc:cert-manager",
        "svc:letsencrypt",
        "svc:coturn",
        "svc:in-cluster/live-captions",
        "svc:in-cluster/multitrack-recorder",
        "svc:in-cluster/ai-postproduction",
        "svc:azure/postgres-flexible/videocall-test",
        "svc:azure/blob/recordings",
        "svc:azure/files/jibri",
        "svc:redis-in-cluster",
        "svc:backup/velero",
        "svc:backup/postgres-dumps",
        "svc:azure/aks/videocall-test",
        "svc:azure/monitor-logs",
        "svc:loki",
        "svc:kube-prometheus-stack",
        "svc:mailgun/eu",
        "svc:github/ghcr",
        "svc:docker/hub",
        "svc:nvidia/ngc",
        "svc:huggingface/hub",
        "svc:pytorch/download",
        "svc:github/source-and-ci"
      ]
    }
  ],
  "vulnerabilities": [],
  "definitions": {
    "standards": [
      {
        "bom-ref": "std:gdpr",
        "name": "Regolamento (UE) 2016/679 (GDPR)",
        "owner": "Unione europea",
        "requirements": [
          {
            "bom-ref": "req:gdpr-art5-1c",
            "identifier": "Art. 5(1)(c)",
            "title": "Minimizzazione dei dati"
          },
          {
            "bom-ref": "req:gdpr-art25",
            "identifier": "Art. 25",
            "title": "Protezione dei dati fin dalla progettazione e per impostazione predefinita"
          },
          {
            "bom-ref": "req:gdpr-art32",
            "identifier": "Art. 32",
            "title": "Sicurezza del trattamento"
          }
        ],
        "externalReferences": [
          {
            "type": "documentation",
            "url": "https://eur-lex.europa.eu/eli/reg/2016/679/oj"
          }
        ]
      },
      {
        "bom-ref": "std:cad",
        "name": "Codice dell'Amministrazione Digitale (D.Lgs. 82/2005)",
        "owner": "Repubblica Italiana",
        "requirements": [
          {
            "bom-ref": "req:cad-art69",
            "identifier": "Art. 69",
            "title": "Riuso delle soluzioni e standard aperti"
          }
        ]
      },
      {
        "bom-ref": "std:agid-sviluppo-sicuro",
        "name": "Linee guida per lo sviluppo del software sicuro",
        "owner": "AgID",
        "requirements": [
          {
            "bom-ref": "req:agid-ss-dipendenze",
            "identifier": "Gestione delle dipendenze",
            "title": "Monitoraggio delle vulnerabilità dei componenti di terze parti"
          }
        ]
      }
    ]
  },
  "declarations": {
    "assessors": [
      {
        "bom-ref": "assessor:dtd-internal",
        "thirdParty": false,
        "organization": {
          "name": "Dipartimento per la Trasformazione Digitale",
          "url": [
            "https://innovazione.gov.it"
          ]
        }
      }
    ],
    "attestations": [
      {
        "summary": "Autovalutazione delle misure dell'installazione videocall-test al 2026-10-13.",
        "assessor": "assessor:dtd-internal",
        "map": [
          {
            "requirement": "req:cad-art69",
            "claims": [
              "claim:open-source"
            ]
          },
          {
            "requirement": "req:agid-ss-dipendenze",
            "claims": [
              "claim:vulnerability-scanning"
            ]
          },
          {
            "requirement": "req:gdpr-art5-1c",
            "claims": [
              "claim:data-minimization"
            ]
          },
          {
            "requirement": "req:gdpr-art25",
            "claims": [
              "claim:data-minimization"
            ]
          },
          {
            "requirement": "req:gdpr-art32",
            "claims": [
              "claim:encryption-at-rest",
              "claim:encryption-in-transit",
              "claim:access-control"
            ]
          }
        ]
      }
    ],
    "claims": [
      {
        "bom-ref": "claim:open-source",
        "target": "tenant:videocall-test",
        "predicate": "Il codice sorgente della piattaforma è pubblicato con licenza EUPL-1.2 in un repository pubblico (github.com/italia/pa-webinar), riusabile da altre amministrazioni.",
        "evidence": [
          "evidence:repo"
        ]
      },
      {
        "bom-ref": "claim:vulnerability-scanning",
        "target": "tenant:videocall-test",
        "predicate": "Dependabot segue le dipendenze del repository. La CI esegue Trivy su filesystem e immagine nelle pull request e nei push verso main e fallisce sui risultati CRITICAL o HIGH; CodeQL e OpenSSF Scorecard girano senza bloccare. Ogni rilascio pubblica SBOM. Le immagini :dev in esecuzione su questo ambiente non passano dalla scansione Trivy, e le immagini pubblicate non vengono riscansionate.",
        "evidence": [
          "evidence:ci-workflows",
          "evidence:release-sbom"
        ]
      },
      {
        "bom-ref": "claim:data-minimization",
        "target": "tenant:videocall-test",
        "predicate": "All'iscrizione si raccolgono solo nome, email e consensi, mai pre-spuntati; nessun analytics lato client e nessuna profilazione. Il lavoro di pulizia notturno cancella i dati dei partecipanti trascorsi i giorni di conservazione fissati per ogni evento (predefinito 30, dalla fine dell'evento) e le tracce audio per partecipante dopo la trascrizione.",
        "evidence": [
          "evidence:gdpr-doc"
        ]
      },
      {
        "bom-ref": "claim:encryption-at-rest",
        "target": "tenant:videocall-test",
        "predicate": "Il portale cifra i campi personali con AES-256-GCM prima di scriverli nel database. Il database PostgreSQL e lo storage Azure cifrano i volumi con chiavi gestite dal fornitore.",
        "evidence": [
          "evidence:pii-encryption"
        ]
      },
      {
        "bom-ref": "claim:encryption-in-transit",
        "target": "tenant:videocall-test",
        "predicate": "Browser, portale e Jitsi comunicano in TLS (TLS 1.3 negoziato al momento della generazione) con certificati Let's Encrypt rinnovati automaticamente; il database accetta solo connessioni TLS 1.2 o superiori. I media WebRTC sono cifrati per tratta con DTLS-SRTP: il bridge li decifra e ricifra, quindi non sono cifrati da capo a capo. Il traffico tra i pod dentro il cluster non è cifrato."
      },
      {
        "bom-ref": "claim:access-control",
        "target": "tenant:videocall-test",
        "predicate": "L'amministrazione usa la chiave dell'istanza oppure account nominali dello staff con accesso tramite link monouso via email; le sessioni dello staff sono cookie HTTP-only firmati. Moderatori e relatori entrano con magic link; gli organizzatori vedono solo i propri eventi.",
        "evidence": [
          "evidence:identity-doc"
        ]
      }
    ],
    "evidence": [
      {
        "bom-ref": "evidence:repo",
        "description": "Repository pubblico del codice sorgente e licenza.",
        "data": [
          {
            "name": "source",
            "contents": {
              "url": "https://github.com/italia/pa-webinar"
            }
          }
        ]
      },
      {
        "bom-ref": "evidence:ci-workflows",
        "description": "Workflow CI (Trivy, CodeQL, Scorecard) e configurazione Dependabot al commit in esecuzione.",
        "data": [
          {
            "name": "source",
            "contents": {
              "url": "https://github.com/italia/pa-webinar/tree/c0f267da4e27f90fe966b987eee791524ee37077/.github"
            }
          }
        ]
      },
      {
        "bom-ref": "evidence:release-sbom",
        "description": "SBOM SPDX allegato al rilascio v0.13.0.",
        "data": [
          {
            "name": "source",
            "contents": {
              "url": "https://github.com/italia/pa-webinar/releases/tag/v0.13.0"
            }
          }
        ]
      },
      {
        "bom-ref": "evidence:gdpr-doc",
        "description": "Documentazione privacy e conservazione dei dati al commit in esecuzione.",
        "data": [
          {
            "name": "source",
            "contents": {
              "url": "https://github.com/italia/pa-webinar/blob/c0f267da4e27f90fe966b987eee791524ee37077/docs/GDPR.md"
            }
          }
        ]
      },
      {
        "bom-ref": "evidence:pii-encryption",
        "description": "Sorgente della cifratura applicativa dei dati personali al commit in esecuzione.",
        "data": [
          {
            "name": "source",
            "contents": {
              "url": "https://github.com/italia/pa-webinar/blob/c0f267da4e27f90fe966b987eee791524ee37077/app/src/lib/crypto/pii.ts"
            }
          }
        ]
      },
      {
        "bom-ref": "evidence:identity-doc",
        "description": "Architettura di identità, accessi e token al commit in esecuzione.",
        "data": [
          {
            "name": "source",
            "contents": {
              "url": "https://github.com/italia/pa-webinar/blob/c0f267da4e27f90fe966b987eee791524ee37077/docs/architecture/identity-and-access.md"
            }
          }
        ]
      }
    ],
    "affirmation": {
      "statement": "Il Dipartimento per la Trasformazione Digitale attesta che le informazioni di questo documento riflettono, al meglio delle conoscenze del team al 2026-10-13, la composizione software e operativa dell'installazione videocall-test (ambiente di collaudo) della piattaforma PA Webinar.",
      "signatories": [
        {
          "name": "Team Piattaforma PA Webinar",
          "role": "Responsabile tecnico",
          "organization": {
            "name": "Dipartimento per la Trasformazione Digitale"
          },
          "externalReference": {
            "type": "website",
            "url": "https://innovazione.gov.it"
          }
        }
      ]
    }
  },
  "formulation": [
    {
      "bom-ref": "formulation:videocall-test-deploy",
      "components": [
        {
          "bom-ref": "formulation:helm-chart",
          "type": "application",
          "name": "pa-webinar Helm chart",
          "version": "0.1.1",
          "description": "Chart in infra/helm/pa-webinar del repository italia/pa-webinar; release videocall-test, revisione 147 del 2026-10-12."
        },
        {
          "bom-ref": "formulation:values",
          "type": "file",
          "name": "helm/videocall/test/values.yaml",
          "description": "Valori di questa installazione, versionati in un repository di configurazione privato."
        }
      ],
      "workflows": [
        {
          "bom-ref": "formulation:ci-dev-build",
          "uid": "github-actions/dev.yml",
          "name": "Build & Push Dev Images",
          "description": "Workflow GitHub Actions che a ogni push sul ramo dev costruisce le immagini e le pubblica su ghcr.io con i tag :dev e :dev-<commit>, su un runner self-hosted nel cluster.",
          "taskTypes": [
            "build",
            "release"
          ]
        },
        {
          "bom-ref": "formulation:helm-upgrade",
          "uid": "manual",
          "name": "helm upgrade e rollout restart",
          "description": "Aggiornamento manuale della release videocall-test; con il tag mobile :dev il portale prende la nuova build al riavvio dei pod.",
          "taskTypes": [
            "deploy"
          ]
        }
      ]
    }
  ],
  "annotations": [
    {
      "bom-ref": "annotation:generation-notes",
      "subjects": [
        "tenant:videocall-test"
      ],
      "annotator": {
        "organization": {
          "name": "Dipartimento per la Trasformazione Digitale"
        }
      },
      "timestamp": "2026-10-13T17:53:39Z",
      "text": "Documento rigenerato dallo stato effettivo dell'installazione: digest dai pod in esecuzione e, per i carichi scalati a zero o creati come Job, dal registro alla data di generazione (vedi la proprietà pa-webinar:digest-source di ogni immagine). L'elenco vuoto di vulnerabilities[] non attesta l'assenza di vulnerabilità: le immagini :dev non sono scansionate. Il documento non è firmato."
    },
    {
      "bom-ref": "annotation:comp-dev-components",
      "subjects": [
        "comp:dev-components"
      ],
      "annotator": {
        "organization": {
          "name": "Dipartimento per la Trasformazione Digitale"
        }
      },
      "timestamp": "2026-10-13T17:53:39Z",
      "text": "Elenco curato: tutte le immagini in uso nel namespace, identificate per digest, i modelli AI e le principali dipendenze dirette del portale. Non elenca i pacchetti contenuti nelle immagini; le build :dev non hanno SBOM pubblicato."
    },
    {
      "bom-ref": "annotation:comp-ops-services",
      "subjects": [
        "comp:ops-services"
      ],
      "annotator": {
        "organization": {
          "name": "Dipartimento per la Trasformazione Digitale"
        }
      },
      "timestamp": "2026-10-13T17:53:39Z",
      "text": "Servizi rilevati dal cluster e dalla sottoscrizione Azure, più quelli aggiunti a mano. Non sono elencati i sub-responsabili dei fornitori né i componenti di governo del cluster che non trattano dati dell'installazione."
    }
  ]
}
