{
  "product": "K RM",
  "currentVersion": "1.63.11",
  "updatedAt": "2026-10-31",
  "releases": [
    {
      "version": "1.63.11",
      "date": "2026-10-31",
      "title": "Licenze test con catalogo e dispositivi",
      "stage": "Test operativo NAS con soli codici fittizi",
      "package": "PACCHETTO-K-RM-1.63.11-LICENZE-TEST-QNAP.zip",
      "changes": [
        "Catalogo amministrativo, importazione con anteprima, assegnazione a cliente/dispositivo e validità con rinnovi salvati in MariaDB.",
        "Su HTTP sono consentiti soltanto codici fittizi SYNTHETIC-; Product Key reali e invii automatici al cliente restano disabilitati.",
        "La release richiede preflight, backup e migrazione additiva 0013 verificata prima dell'attivazione."
      ]
    },
    {
      "version": "1.63.10",
      "date": "2026-10-31",
      "title": "Attivazioni rapide, nuovi operatori e target mensili",
      "stage": "Test operativo multiutenza (non beta)",
      "package": "PACCHETTO-K-RM-1.63.10-ATTIVAZIONI-TARGET-DA-1.63.9-FIX-AVVIO-QNAP.zip",
      "changes": [
        "Il dettaglio operatore consente +1 e −1: −1 annulla solo l'ultima attivazione rapida attiva creata dall'utente, conservando lo storico.",
        "Il form Nuovo operatore Telefonia/Energia è visibile agli utenti abilitati a creare attivazioni; modifica e disattivazione operatori restano amministrative.",
        "Dalle schede operatore l'amministratore o responsabile autorizzato imposta il target mensile per categoria; modifica tracciata, conflitti bloccati, vuoto distinto da zero.",
        "Test multiutente e anti-duplicati sul MariaDB staging superati; nessuna migrazione database. Il modulo Licenze non è incluso."
      ]
    },
    {
      "version": "1.63.8",
      "date": "2026-10-31",
      "title": "Schede operatore cliccabili e attivazione rapida +1",
      "stage": "Test operativo multiutenza (non beta)",
      "package": "PACCHETTO-K-RM-1.63.8-ATTIVAZIONI-RAPIDE-QNAP.zip",
      "changes": [
        "Ogni scheda operatore apre il dettaglio dei servizi con pulsante +1 per registrare rapidamente una nuova attivazione attiva.",
        "La voce rapida viene salvata nel MariaDB con data e utente di sessione; risposta idempotente e aggiornamento del riepilogo senza ricaricare la pagina.",
        "Il modulo completo resta disponibile per cliente, offerta e stati diversi; nessuna migrazione database in questa release."
      ]
    },
    {
      "version": "1.63.7",
      "date": "2026-10-31",
      "title": "Attivazioni & Target",
      "stage": "Test operativo multiutenza (non beta)",
      "package": "PACCHETTO-K-RM-1.63.7-ATTIVAZIONI-TARGET-QNAP.zip",
      "changes": [
        "Nuovo modulo Attivazioni & Target su MariaDB con operatori, servizi, obiettivi mensili, storico e permessi individuali.",
        "Nuove attivazioni con richiesta idempotente e controllo dell'accesso alla sessione; il token API generale non identifica l'utente.",
        "Migrazione additiva 0012 con backup pre-update e verifica dei dati preesistenti. Gestione Licenze non inclusa."
      ]
    },
    {
      "version": "1.63.6",
      "date": "2026-10-30",
      "title": "Scorrimento unico scheda ticket su smartphone",
      "stage": "Test operativo multiutenza (non beta)",
      "package": "PACCHETTO-K-RM-1.63.6-SCROLL-TICKET-MOBILE-QNAP.zip",
      "changes": [
        "Un solo scorrimento verticale per l'intera scheda ticket su smartphone: intestazione, dettagli, fasi, allegati, chat, registro e pulsanti scorrono insieme.",
        "I pulsanti inferiori restano raggiungibili scorrendo fino in fondo; nessuna barra fissa copre il contenuto.",
        "CSS limitato agli schermi mobili, senza modifiche a logica, API, permessi o database. Include le correzioni 1.63.4 e 1.63.5."
      ]
    },
    {
      "version": "1.63.5",
      "date": "2026-10-30",
      "title": "Interfaccia smartphone iPhone e Samsung",
      "stage": "Test operativo multiutenza (non beta)",
      "package": "PACCHETTO-K-RM-1.63.5-MOBILE-UI-IPHONE-SAMSUNG-QNAP.zip",
      "changes": [
        "Layout mobile condiviso: navigazione, schede, moduli e ricerca adattati a display stretti.",
        "Scheda ticket a tutta altezza con fasi in primo piano, azioni leggibili e aree sicure per iPhone e Android.",
        "Modali e tastiera mobile: campi leggibili, pulsanti accessibili e nessuna modifica ai dati o alle API.",
        "Include la correzione 1.63.4 per creare record Cortesia, Riparazioni, Noleggi e Interventi su HTTP LAN."
      ]
    },
    {
      "version": "1.63.4",
      "date": "2026-10-30",
      "title": "Correzione creazione record moduli via HTTP",
      "stage": "Test operativo multiutenza (non beta)",
      "package": "PACCHETTO-K-RM-1.63.4-FIX-ID-HTTP-MODULI-QNAP.zip",
      "changes": [
        "ID stabili per nuovi dispositivi Cortesia, Riparazioni, Noleggi e Interventi anche senza crypto.randomUUID().",
        "Nessuna migrazione o modifica ai dati MariaDB: aggiornamento della sola applicazione.",
        "Controlli di creazione frontend, permessi e conteggi API/DB prima del rilascio."
      ]
    },
    {
      "version": "1.63.3",
      "date": "2026-10-30",
      "title": "Sincronizzazione moduli su MariaDB",
      "stage": "Test operativo multiutenza (non beta)",
      "package": "PACCHETTO-K-RM-1.63.3-SYNC-DB-MODULI-STAGE-QNAP.zip",
      "changes": [
        "Riparazioni, Cortesia, Noleggio e Interventi condivisi fra le postazioni tramite MariaDB.",
        "Migrazione non distruttiva delle fonti NAS e MariaDB esistenti, con revisioni e conflitti espliciti.",
        "Salvataggi confermati dal server, aggiornamento automatico e backup prima dell'attivazione."
      ]
    },
    {
      "version": "1.63.1",
      "date": "2026-10-30",
      "title": "Interfaccia unificata",
      "stage": "Test operativo multiutenza (non beta)",
      "package": "PACCHETTO-K-RM-1.63.1-INTERFACCIA-UNIFICATA-QNAP.zip",
      "changes": [
        "Stile coordinato con la nuova scheda ticket in tutte le pagine del gestionale.",
        "Card, pulsanti, intestazioni, modali e navigazione adattati a desktop e smartphone.",
        "Nessuna modifica a dati, API, permessi o schema MariaDB."
      ]
    },
    {
      "version": "1.63.0",
      "date": "2026-10-30",
      "title": "Restyling della scheda ticket",
      "stage": "Test operativo multiutenza (non beta)",
      "package": "PACCHETTO-K-RM-1.63.0-RESTYLING-SCHEDA-TICKET-QNAP.zip",
      "changes": [
        "Scheda ticket a due colonne su desktop e a colonna singola su smartphone, con avanzamento pratica in primo piano.",
        "Fasi completate raggruppabili, costi e sezioni di supporto facilmente accessibili senza dati dimostrativi.",
        "Modifiche limitate alla presentazione: stessi controlli, API e database."
      ]
    },
    {
      "version": "1.62.28",
      "date": "2026-10-30",
      "title": "Versione visibile dopo l'avvio dell'interfaccia",
      "stage": "Test operativo multiutenza (non beta)",
      "package": "PACCHETTO-K-RM-1.62.28-VERSIONE-VISIBILE-QNAP.zip",
      "changes": [
        "Lo script di autenticazione non riscrive più il marchio cancellando il badge versione.",
        "Versione e data compaiono accanto a K RM e nell'intestazione a destra su desktop.",
        "Test di regressione e prova nel browser dopo l'avvio dello script verificano il rendering reale."
      ]
    },
    {
      "version": "1.62.27",
      "date": "2026-10-30",
      "title": "Salvataggio clienti MariaDB",
      "stage": "Test operativo multiutenza (non beta)",
      "package": "PACCHETTO-K-RM-1.62.27-FIX-SALVATAGGIO-CLIENTI-QNAP.zip",
      "changes": [
        "Salvataggio clienti con type private/business conforme all'enum MariaDB.",
        "Errore JSON HTTP 503 invece di ERR_EMPTY_RESPONSE quando la scrittura non riesce.",
        "Preservazione dei campi esistenti in caso di riconciliazione del cliente."
      ]
    },
    {
      "version": "1.62.22",
      "date": "2026-10-30",
      "title": "Diagnostica clienti, salvataggio Cortesia e versione visibile",
      "stage": "Test operativo multiutenza (non beta)",
      "package": "PACCHETTO-K-RM-1.62.22-FIX-CLIENTI-CORTESIA-BRAND-QNAP.zip",
      "changes": [
        "Aggiunti timeout e diagnosi non mutativa per distinguere NAS/sessione non raggiungibile da salvataggio cliente senza conferma; nessun retry automatico del POST.",
        "Bloccati doppi invii dalla finestra di creazione cliente rapida; esito ambiguo invita a cercare prima di ritentare per evitare duplicati.",
        "Versione e data di sviluppo visibili accanto al nome K RM nella barra laterale; asset con cache bust aggiornata.",
        "Verificati localmente i flussi cliente e Cortesia senza inserire o modificare dati reali NAS."
      ]
    },
    {
      "version": "1.62.21",
      "date": "2026-10-30",
      "title": "Verifica clienti e indicatori colore Cortesia",
      "stage": "Test operativo multiutenza (non beta)",
      "package": "PACCHETTO-K-RM-1.62.21-VERIFICA-CLIENTE-COLORI-CORTESIA-QNAP.zip",
      "changes": [
        "Rieseguiti test isolati di creazione, ricerca, modifica, eliminazione, ripristino e anti-duplicati dei clienti; nessuna scrittura live al NAS.",
        "Aggiunti swatch del colore dispositivo e indicatori colorati di stato nelle righe e nel dettaglio Cortesia, con valori CSS sanificati.",
        "Mantenuto il salvataggio Cortesia server-first della 1.62.20 e aggiornati i controlli read-only di rilascio."
      ]
    },
    {
      "version": "1.62.20",
      "date": "2026-10-30",
      "title": "Salvataggio server-first Cortesia",
      "stage": "Test operativo multiutenza (non beta)",
      "package": "PACCHETTO-K-RM-1.62.20-FIX-SALVATAGGIO-CORTESIA-QNAP.zip",
      "changes": [
        "Cortesia carica l'archivio dal server e attende la conferma API per creazione, modifica ed eliminazione; niente falsi successi da localStorage.",
        "Corretto il collegamento ai record usando ID server testuali; le altre schede aggiornano la lista dopo una modifica confermata.",
        "Gli errori di rete, timeout e sessione non valida sono esplicitati per clienti e dispositivi; nessuna migrazione DB."
      ]
    },
    {
      "version": "1.62.19",
      "date": "2026-10-30",
      "title": "Clienti centralizzati e persistenza fasi",
      "package": "PACCHETTO-K-RM-1.62.19-CLIENTI-FASE-PERSISTENZA-QNAP.zip",
      "changes": [
        "Dopo la creazione anagrafica il registro clienti cerca subito il record appena salvato; gli invii ripetuti sono bloccati e la conferma server deve includere l'identificativo canonico.",
        "Allineamento e ricerca telefono ignorano formattazione/spazi; l'upsert riusa la stessa anagrafica senza unire persone diverse con il medesimo numero.",
        "Aggiornamenti anagrafica invalidano la cache nelle altre schede e schermate; nessun dato cliente viene inviato nel messaggio tra schede.",
        "Aggiunti test isolati SQLite per creazione, ricerca, anti-duplicati, modifica/round-trip e persistenza delle note condivise multifase; nessuna migrazione DB."
      ]
    },
    {
      "version": "1.62.18",
      "date": "2026-10-30",
      "title": "Nota unica per avanzamento multifase",
      "package": "PACCHETTO-K-RM-1.62.18-NOTA-UNICA-MULTIFASE-QNAP.zip",
      "changes": [
        "Una nota obbligatoria viene associata a tutte le fasi selezionate e dichiara in cronologia numero e nomi delle fasi accorpate.",
        "Corretto il marker di attesa del collegamento cliente nel form ticket; nessuna migrazione DB."
      ]
    },
    {
      "version": "1.62.17",
      "date": "2026-10-30",
      "title": "Correzione controlli release e verifica aggiunta clienti",
      "package": "PACCHETTO-K-RM-1.62.17-NOTA-UNICA-MULTIFASE-QNAP.zip",
      "changes": [
        "Corrette le verifiche di versione nei controlli statistiche, UI e permessi: ora controllano davvero il backend 1.62.17 evitando rollback falsi.",
        "Aggiunto un controllo esplicito e in sola lettura della scelta nuovo cliente salvato/provvisorio e dell'attesa della conferma server in ticket, riparazioni e dispositivi di cortesia.",
        "Conservata la nota unica che dichiara il numero e i nomi delle fasi accorpate nella cronologia di ciascuna fase.",
        "Nessuna migrazione DB e nessuna modifica ai record esistenti."
      ]
    },
    {
      "version": "1.62.16",
      "date": "2026-10-30",
      "title": "Nota unica per avanzamento di più fasi",
      "package": "PACCHETTO-K-RM-1.62.16-NOTA-UNICA-MULTIFASE-QNAP.zip",
      "changes": [
        "In modalità Più fasi è richiesta una sola nota obbligatoria per l'intero gruppo selezionato.",
        "La nota di audit esplicita quante fasi sono state accorpate e ne elenca i nomi; la stessa nota è salvata nella cronologia di ciascuna fase.",
        "La modalità Una fase mantiene il campo nota e il comportamento precedente.",
        "Nessuna migrazione DB; i dati storici restano invariati."
      ]
    },
    {
      "version": "1.62.15",
      "date": "2026-10-30",
      "title": "Avanzamento fasi singolo o multiplo e dettaglio ticket responsive",
      "package": "PACCHETTO-K-RM-1.62.15-AVANZAMENTO-MULTIFASE-QNAP.zip",
      "changes": [
        "Nel ticket si può scegliere tra avanzamento di una fase alla volta e selezione multipla di più fasi; resta disponibile il flusso singolo precedente.",
        "L'avanzamento multiplo richiede una nota per ciascuna fase selezionata e salva il gruppo in un'unica richiesta server con audit per ogni fase; in caso di errore ripristina lo stato in memoria.",
        "Migliorata la gerarchia visiva e la disposizione della sezione Avanzamento pratica su desktop e smartphone.",
        "Riconcilia collegamenti cliente obsoleti tramite telefono/email e offre la scelta salvato/provvisorio senza creare ticket incompleti.",
        "Nessuna migrazione DB; dati, permessi e ticket storici invariati."
      ]
    },
    {
      "version": "1.62.14",
      "date": "2026-10-30",
      "title": "Note obbligatorie selezionabili e scelta anagrafica cliente",
      "package": "PACCHETTO-K-RM-1.62.14-NOTE-FASI-SELEZIONABILI-QNAP.zip",
      "changes": [
        "Per ogni nuova pratica l’utente seleziona una o più fasi che richiedono una nota; la regola è modificabile nel dettaglio e validata anche dal backend.",
        "Quando ticket, riparazione o dispositivo di cortesia usano un cliente nuovo, K RM chiede se salvarlo nell’anagrafica o usarlo solo per quella pratica/assegnazione. La scelta provvisoria non crea un record cliente.",
        "Ticket, riparazioni e dispositivi attendono la scelta e il salvataggio server del cliente; errori o annullamenti non producono clienti salvati solo localmente.",
        "Nessuna migrazione DB; dati storici invariati e politica predefinita compatibile: tutte le fasi storiche restano soggette a nota."
      ]
    },
    {
      "version": "1.62.13",
      "date": "2026-10-30",
      "title": "Policy 2FA admin e cancellazione riparazioni admin",
      "package": "PACCHETTO-K-RM-1.62.13-2FA-ADMIN-RIPARAZIONI-ADMIN-QNAP.zip",
      "changes": [
        "Aggiunta una policy globale per rendere obbligatoria o facoltativa la verifica 2FA al login; la modifica è riservata all’amministratore e registrata nell’audit.",
        "Aggiunta la cancellazione logica delle riparazioni dal dettaglio, riservata all’amministratore e protetta anche sul backend.",
        "Le sincronizzazioni non amministrative non possono cancellare riparazioni omettendole dall’elenco né falsificare i marcatori di eliminazione.",
        "Nessuna migrazione DB; ticket, clienti e configurazione dati esistenti restano invariati."
      ]
    },
    {
      "version": "1.62.12",
      "date": "2026-10-26",
      "title": "Navigazione responsive e dettaglio ticket",
      "package": "PACCHETTO-K-RM-1.62.12-UI-DETTAGLIO-TICKET-QNAP.zip",
      "changes": [
        "Dettaglio ticket desktop più ampio e centrato, con superfici, gerarchia tipografica e stato/avanzamento più leggibili.",
        "Ridisegnati i menu principali condivisi: sidebar desktop, barra tablet e dock smartphone scorrevole, con aree sicure e indicatori attivi uniformi su tutte le pagine.",
        "Vista mobile a schermo intero con safe-area, azioni sticky e indicatori focus accessibili; animazione leggera solo se il sistema non richiede reduced motion.",
        "Modifiche CSS-only: nessun cambiamento a destinazioni dei link, dati, permessi, API o flussi di salvataggio."
      ]
    },
    {
      "version": "1.62.11",
      "date": "2026-10-26",
      "title": "Test installer robusti alle liste versioni",
      "package": "PACCHETTO-K-RM-1.62.11-HARDENING-UI-STORAGE-TESTFIX-QNAP.zip",
      "changes": [
        "Rafforzato il test dell'installer: verifica con regex la sequenza delle versioni ammesse, non una sottostringa fragile.",
        "Conservate le correzioni UI/storage e il rollback controllato della release precedente."
      ]
    },
    {
      "version": "1.62.10",
      "date": "2026-10-26",
      "title": "Corretto test di protezione archivio ticket locale",
      "package": "PACCHETTO-K-RM-1.62.10-HARDENING-UI-STORAGE-TESTFIX-QNAP.zip",
      "changes": [
        "Corretto il controllo automatico: confronta il messaggio reale senza dipendere dalla maiuscola iniziale.",
        "L'installer verifica la versione precedente 1.62.8/1.62.9 e mantiene checkpoint e rollback."
      ]
    },
    {
      "version": "1.62.9",
      "date": "2026-10-26",
      "title": "Hardening UI storage e conservazione ticket locali",
      "package": "PACCHETTO-K-RM-1.62.9-HARDENING-UI-STORAGE-QNAP.zip",
      "changes": [
        "Fallback sicuro per JSON locale corrotto o storage browser non disponibile; audit locale best-effort e paginazione con valori validati.",
        "Il controllo dei ticket locali non cancella più l'archivio legacy e conserva i dati quando l'archivio è illeggibile.",
        "Rimosso helper inutilizzato che eliminava le preferenze dashboard; nessuna modifica o migrazione MariaDB."
      ]
    },
    {
      "version": "1.62.8",
      "date": "2026-10-26",
      "title": "Risolto doppio gestore di apertura dettaglio ticket",
      "package": "PACCHETTO-K-RM-1.62.8-FIX-DOPPIO-CLICK-DETTAGLIO-QNAP.zip",
      "changes": [
        "Rimosso il listener diretto duplicato sulle schede ticket: rimane un solo listener delegato su #ticketList.",
        "L'apertura del dettaglio non richiama più openDetail due volte per lo stesso click; resta inclusa la UX note per fase e layout introdotta nella 1.62.7.",
        "Aggiunto test di regressione che controlla il numero di gestori di apertura."
      ]
    },
    {
      "version": "1.62.7",
      "date": "2026-10-26",
      "title": "UX pratiche, note per fase e salvataggio server confermato",
      "package": "PACCHETTO-K-RM-1.62.7-UX-PRATICHE-NOTE-FASI-QNAP.zip",
      "changes": [
        "Ogni fase ha una nota contestuale persistente, con operatore e timestamp nel registro; correzioni e riaperture sono tracciate.",
        "Il cambio fase attende la risposta MariaDB e ripristina lo stato UI se il server rifiuta il salvataggio; il dettaglio non viene ricreato durante l'operazione.",
        "Dettaglio più ampio su desktop, colonna singola responsive su mobile e sezioni secondarie espandibili.",
        "Conservati tuple storiche, ordine e nomi delle fasi, costi, ticket e flussi preesistenti; nessuna migrazione o scrittura automatica ai dati storici."
      ]
    },
    {
      "version": "1.62.6",
      "date": "2026-10-26",
      "title": "Fail-closed per webhook Uptime Kuma",
      "package": "PACCHETTO-K-RM-1.62.6-AUDIT-WEBHOOK-KUMA-QNAP.zip",
      "changes": [
        "Rifiuta i webhook se KRM_KUMA_WEBHOOK_TOKEN non è configurato con almeno 32 caratteri.",
        "Accetta il token solo negli header X-KRM-KUMA-Token o X-Kuma-Token, mai nella query URL.",
        "Usa confronto costante del segreto e rate limit per IP prima di leggere il payload.",
        "Aggiunti test regressione per configurazione assente, token assente e token valido."
      ]
    },
    {
      "version": "1.62.5",
      "date": "2026-10-26",
      "title": "Hardening sessioni 2FA e diagnostica",
      "package": "PACCHETTO-K-RM-1.62.5-AUDIT-SICUREZZA-QNAP.zip",
      "changes": [
        "Richiede una sessione autenticata per modificare la 2FA e limita le operazioni al proprio account, salvo permesso amministrativo.",
        "Protegge configurazione e invio email SMTP con sessione e permesso manageUsers, aggiungendo rate limit al test email.",
        "Protegge l'endpoint diagnostico auth e rimuove dettagli identitari/host dalla risposta; elimina il percorso filesystem dal riepilogo auth.",
        "Limita la crescita della mappa rate-limit con pulizia periodica e numero massimo di chiavi."
      ]
    },
    {
      "version": "1.62.4",
      "date": "2026-10-26",
      "title": "Fix atteso HTTP della pagina statistiche protetta",
      "package": "PACCHETTO-K-RM-1.62.4-STABILITA-COSTI-ACCESSI-QNAP.zip",
      "changes": [
        "Il controllo installazione accetta HTTP 401/403 sulla pagina statistiche anonima: la pagina è protetta e il 403 senza sessione è il risultato corretto.",
        "Rimangono attivi i controlli positivi di confronto costi API/MariaDB, versione e conteggi; solo krm-app viene ricreato."
      ]
    },
    {
      "version": "1.62.3",
      "date": "2026-10-26",
      "title": "Fix riconoscimento versione durante installazione QNAP",
      "package": "PACCHETTO-K-RM-1.62.3-STABILITA-COSTI-ACCESSI-QNAP.zip",
      "changes": [
        "Corretto il precheck che cercava la versione 1.62.1 invece della versione in installazione e causava rollback anche quando la nuova app era avviata.",
        "Mantenuta la correzione del conteggio clienti basata su deleted_at, senza la colonna clients.active assente nello schema QNAP.",
        "Allineati URL cache-busting, controlli di release e nomi degli script alla versione 1.62.3."
      ]
    },
    {
      "version": "1.62.2",
      "date": "2026-10-26",
      "title": "Compatibilità del controllo costi con schema clienti MariaDB",
      "package": "PACCHETTO-K-RM-1.62.2-STABILITA-COSTI-ACCESSI-QNAP.zip",
      "changes": [
        "Il check pre-installazione conta i clienti attivi tramite deleted_at, colonna realmente presente nello schema QNAP, senza riferirsi a clients.active.",
        "Installatore aggiornato per accettare la release 1.61.9, 1.62.0 o 1.62.1 come base e verificare il codice versione corretto."
      ]
    },
    {
      "version": "1.62.1",
      "date": "2026-10-26",
      "title": "Stabilità costi pratica e protezioni accessi",
      "package": "PACCHETTO-K-RM-1.62.1-STABILITA-COSTI-ACCESSI-QNAP.zip",
      "changes": [
        "Cache bust aggiornata per gli asset ticket/costi/statistiche; test browser end-to-end crea un task, salva due voci, ricarica e le ritrova.",
        "Sessioni con idle timeout configurabile di 30 minuti e massimo assoluto di 12 ore; persistenza locale solo con hash del token e scrittura atomica.",
        "Rate limit login e reset password; setup admin rifiutato se il token di provisioning non è configurato o non corrisponde.",
        "Le nuove password richiedono 12 caratteri senza invalidare le password più corte già esistenti durante la verifica.",
        "Nessuna migrazione DB, modifica dati clienti/ticket o attivazione forzata di HTTPS/HSTS."
      ]
    },
    {
      "version": "1.62.0",
      "date": "2026-10-25",
      "title": "Dashboard Statistiche e Report con filtri, durate e accessi verificati",
      "package": "PACCHETTO-K-RM-1.62.0-DASHBOARD-STATISTICHE-REPORT-QNAP.zip",
      "changes": [
        "Permesso individuale, pagina/API/export protetti e revoca efficace alle sessioni attive.",
        "Filtri incrociati per periodo, criterio temporale, stato, categorie e assegnatari multipli.",
        "Conteggi di ticket unici, confronto con periodo precedente, media/min/max/mediana/P90 solo su chiusure valide.",
        "Drill-down paginato, grafici, stampa/PDF browser, CSV e Excel XLSX con dettaglio completo filtrato.",
        "Nessuna migrazione o modifica ai ticket storici; test di matematica, ora legale, permessi e browser."
      ]
    },
    {
      "version": "1.61.9",
      "date": "2026-10-25",
      "title": "Costi della pratica collegati alla riga MariaDB corretta",
      "package": "PACCHETTO-K-RM-1.61.9-COSTI-TICKET-ID-REALE-QNAP.zip",
      "changes": [
        "Il dettaglio carica i costi usando l'ID database esplicito del ticket, non nome cliente o ID globale obsoleto.",
        "Un solo gestore per aggiungere ed eliminare voci; nessun onclick inline concorrente.",
        "Dopo il salvataggio le voci vengono rilette e confrontate con la risposta MariaDB.",
        "Il controllo della release prova interazioni browser e API in sola lettura sui dati reali."
      ]
    },
    {
      "version": "1.61.8",
      "date": "2026-10-24",
      "title": "Fix definitivo pulsanti Costi pratica",
      "package": "PACCHETTO-K-RM-1.61.8-COSTI-PULSANTE-NATIVO-QNAP.zip",
      "changes": [
        "I pulsanti Aggiungi voce ed Elimina voce sono collegati direttamente dopo ogni render dell'editor.",
        "La gestione multiriga non dipende più dalla propagazione del click sul contenitore.",
        "Il salvataggio esplicito dei costi del nuovo ticket e la dashboard report restano invariati.",
        "Nessuna modifica distruttiva ai clienti o ai ticket storici."
      ]
    },
    {
      "version": "1.61.5",
      "date": "2026-10-24",
      "title": "Salvataggio esplicito costi nuova pratica",
      "package": "PACCHETTO-K-RM-1.61.5-COSTI-SALVATAGGIO-ESPLICITO-QNAP.zip",
      "changes": [
        "Il salvataggio dei costi del nuovo ticket avviene esplicitamente dopo la risposta MariaDB del ticket, senza intercettare globalmente window.fetch.",
        "Aggiunta la funzione runtime saveNewTicketCosts e un marcatore diagnostico della release caricata dal browser.",
        "Conservati aggiunta, modifica, eliminazione, totale, report e protezione degli importi fatturati.",
        "Nessun reset, cleanup o modifica distruttiva di clienti e ticket storici."
      ]
    },
    {
      "version": "1.61.4",
      "date": "2026-10-24",
      "title": "Fix Costi pratica multiriga",
      "package": "PACCHETTO-K-RM-1.61.4-COSTI-MULTIRIGA-REPORT-QNAP.zip",
      "changes": [
        "Il gestore degli eventi è collegato direttamente a ogni editor Costi della pratica e resta attivo dopo l'aggiunta della prima riga.",
        "È possibile aggiungere, modificare e rimuovere più voci senza limite applicativo prefissato; il totale viene ricalcolato a ogni modifica.",
        "La dashboard Statistiche/Report con grafici responsive resta inclusa.",
        "Nessuna modifica distruttiva ai ticket o ai clienti."
      ]
    },
    {
      "version": "1.61.3",
      "date": "2026-10-24",
      "title": "Fix effettivo Costi pratica e dashboard grafica Statistiche",
      "package": "PACCHETTO-K-RM-1.61.3-COSTI-REPORT-DASHBOARD-GRAFICI-QNAP.zip",
      "changes": [
        "Il form nuovo ticket contiene una riga iniziale reale e gestisce aggiunta, rimozione, totale e salvataggio dei costi anche dopo rendering dinamico.",
        "La pagina Statistiche e Report visualizza grafici SVG responsive per stato e operatore, senza librerie esterne o chiamate a servizi terzi.",
        "Aggiunto controllo di versione degli asset per evitare che il browser riutilizzi JavaScript precedente.",
        "Backup, migrazione idempotente e verifiche restano invariati; nessuna cancellazione di clienti o ticket."
      ]
    },
    {
      "version": "1.61.2",
      "date": "2026-10-24",
      "title": "Fix salvataggio Costi pratica e Statistiche/Report",
      "package": "PACCHETTO-K-RM-1.61.2-COSTI-STATISTICHE-REPORT-FIX-QNAP.zip",
      "changes": [
        "Il form Costi della pratica monta gli eventi anche dopo il rendering del modulo: attivazione, aggiunta, rimozione e totale sono verificabili prima del salvataggio.",
        "Il salvataggio costi dopo la creazione del ticket usa l'identificativo MariaDB restituito dal server e conserva le voci senza scrittura locale parallela.",
        "La pagina Statistiche e Report accetta i raggruppamenti restituiti dal backend e non va più in errore su byStatus; il filtro operatore viene inoltrato correttamente.",
        "Il checker considera correttamente 401 e 403 come risposte protette quando l'endpoint statistiche viene chiamato senza sessione valida.",
        "Nessuna modifica distruttiva a clienti, ticket storici o schema MariaDB; la migrazione resta idempotente.",
        "Versione incrementata secondo la regola di rilascio K RM."
      ]
    },
    {
      "version": "1.61.1",
      "date": "2026-10-24",
      "title": "Fix protezione endpoint statistiche",
      "package": "PACCHETTO-K-RM-1.61.1-COSTI-STATISTICHE-PERMESSI-QNAP-CORRETTO.zip",
      "changes": [
        "Il controllo della protezione statistiche considera 401 e 403 come risposte corrette senza sessione.",
        "Nessuna modifica a clienti, ticket o schema MariaDB rispetto alla 1.61.0."
      ]
    },
    {
      "version": "1.61.0",
      "date": "2026-10-24",
      "title": "Costi pratica facoltativi, statistiche separate e permesso individuale",
      "package": "PACCHETTO-K-RM-1.61.0-COSTI-STATISTICHE-PERMESSI-QNAP.zip",
      "changes": [
        "Aggiunta la sezione facoltativa Costi della pratica con righe descrizione/importo, suggerimenti, totale automatico e validazione decimale.",
        "I costi sono salvati in MariaDB con righe separate, audit e protezione dopo la fatturazione; disattivare la funzione non cancella le voci.",
        "Aggiunta una pagina separata Statistiche e Report, in sola lettura, con filtri, KPI, categorie, operatori, durata calendario e ore di lavoro.",
        "Aggiunto il permesso individuale viewStatisticsReports: l'endpoint report richiede una sessione autorizzata e non è accessibile con il solo token API.",
        "Migrazione 0011 idempotente, checkpoint root-safe, controlli QNAP e istruzioni aggiornate. Nessun ticket o cliente storico viene modificato."
      ]
    },
    {
      "version": "1.60.9",
      "date": "2026-10-24",
      "title": "Modifiche cliente nel ticket con conferma anagrafica",
      "package": "PACCHETTO-K-RM-1.60.9-CONFERMA-AGGIORNAMENTO-CLIENTE-QNAP.zip",
      "changes": [
        "Il controllo duplicati non cancella più i dati digitati, neppure selezionando un cliente con cognome vuoto.",
        "Il salvataggio presenta le differenze Prima/Dopo e le scelte Aggiorna anagrafica e continua, Solo questo ticket oppure Annulla.",
        "L'aggiornamento confermato modifica solo i campi indicati della stessa riga cliente: niente nuovi clienti né sovrascrittura di note e metadati non presenti nel form.",
        "Il backend verifica sessione, permesso clienti, consenso esplicito, identità e valori originari; conflitti restituiscono 409 e storage non disponibile 503, senza fallback locale.",
        "Audit autore/data/campi modificati conservato nella stessa transazione; replay dell'aggiornamento gestito senza raddoppio delle modifiche.",
        "Cliente invariato e scelta Solo questo ticket non provocano scritture nell'anagrafica. Annulla preserva il modulo e blocca la creazione del ticket.",
        "Il reset dopo la creazione pulisce il cliente collegato per il ticket successivo; indirizzo e ID server presenti nel selettore.",
        "Conservati i fix identità ticket, anti-duplicati e selezione multipla admin. Test isolati e verifiche produzione in sola lettura."
      ]
    },
    {
      "version": "1.60.8",
      "date": "2026-10-04",
      "title": "Nuovo ticket dopo azzeramento: chiave sorgente distinta dal numero visibile",
      "package": "PACCHETTO-K-RM-1.60.8-FIX-NUOVO-TICKET-DOPO-AZZERAMENTO-QNAP.zip",
      "changes": [
        "Riprodotta e corretta la regressione che associava il nuovo ticket 101 alla vecchia riga ticket-101 eliminata.",
        "La ricerca usa esclusivamente sourceDbId o la chiave source_id esplicita; il numero pubblico non sostituisce più un'identità server.",
        "Le nuove chiavi creano record distinti anche se il numero pubblico coincide con un vecchio ticket attivo o eliminato.",
        "Restano attivi i blocchi contro salvataggi su righe eliminate, identità mancanti o incoerenti e richieste ripetute.",
        "Dopo la creazione, la scheda viene aperta mediante l'ID MariaDB confermato dal server, non il numero pubblico.",
        "Aggiunti test per azzeramento lista, creazione/replay, collisioni legacy e conservazione dell'audit. Nessun ripristino, cancellazione o reset database automatico."
      ]
    },
    {
      "version": "1.60.7",
      "date": "2026-10-04",
      "title": "Selezione multipla ticket, solo admin con tre conferme",
      "package": "PACCHETTO-K-RM-1.60.7-SELEZIONE-MULTIPLA-TICKET-ADMIN-QNAP.zip",
      "changes": [
        "Caselle di selezione e barra admin nella lista ticket, selezione della pagina corrente e limite di 100 ticket.",
        "Tre conferme: riepilogo server, frase ELIMINA N TICKET, accettazione finale.",
        "Backend con controllo sessione e ruolo admin: il solo token API o il permesso deleteTickets non autorizzano l'eliminazione multipla.",
        "Rimozione logica atomica mediante identificativi MariaDB; storico, autore, data e identificativo operazione conservati nei record.",
        "Anteprima valida cinque minuti e vincolata alla sessione; un record modificato blocca l'intero gruppo. Replay della stessa richiesta gestito senza nuove eliminazioni.",
        "Salvataggi da schede obsolete non possono sovrascrivere lo storico di eliminazione.",
        "Test isolati sui permessi, conferme, rollback e selezioni, più regressioni clienti e salvataggio ticket. Nessuna modifica automatica ai dati reali."
      ]
    },
    {
      "version": "1.60.6",
      "date": "2026-10-04",
      "title": "Identità ticket preservata durante caricamento e salvataggio",
      "package": "PACCHETTO-K-RM-1.60.6-FIX-IDENTITA-SALVATAGGIO-TICKET-QNAP.zip",
      "changes": [
        "La lista API mantiene sourceDbId, source_id e tutti i campi della scheda, inclusi note, storico, workflow e allegati.",
        "Salva e Salva e chiudi aggiornano la riga MariaDB caricata; il frontend blocca modifiche senza identità server.",
        "La chiave di creazione è assegnata esplicitamente prima del collegamento cliente.",
        "Un errore MariaDB produce una risposta JSON 503 invece di confermare un salvataggio solo locale.",
        "Test isolati riproducono creazione, ricaricamento, salvataggi ripetuti e collisioni di ID pubblici senza modificare dati reali.",
        "Gli asset della dashboard hanno URL di versione e verifica cache per evitare JavaScript obsoleto dopo l'aggiornamento."
      ]
    },
    {
      "version": "1.60.5",
      "date": "2026-10-04",
      "title": "Protezione dai doppi invii ticket",
      "package": "PACCHETTO-K-RM-1.60.5-FIX-DOPPI-INVII-TICKET-QNAP.zip",
      "channel": "stabilità ticket",
      "changes": [
        "Il pulsante di creazione ticket viene disabilitato durante il salvataggio e gli invii simultanei dal form sono ignorati.",
        "Ogni tentativo mantiene una chiave sorgente stabile: la ripetizione della stessa richiesta aggiorna il record esistente invece di crearne un secondo.",
        "Il backend recupera in modo sicuro la riga esistente in caso di conflitto simultaneo sulla chiave univoca MariaDB.",
        "Aggiunti controlli QNAP read-only per versione, conteggi e protezione anti-duplicato; nessun dato storico viene eliminato."
      ],
      "fixes": [
        "Previene incrementi doppi del conteggio quando il submit viene ripetuto prima della risposta o quando una richiesta viene ritrasmessa.",
        "I duplicati già presenti restano intatti e richiedono una revisione separata con backup prima di qualsiasi eventuale consolidamento."
      ]
    },
    {
      "version": "1.60.4",
      "date": "2026-10-04",
      "title": "Verifica produzione in sola lettura",
      "changes": [
        "Aggiunto un controllo unico che confronta versione attesa e attiva, stato sicurezza, API e conteggi clienti/ticket MariaDB.",
        "Il controllo non crea ticket, non modifica dati, non riavvia container e non salva report contenenti dati applicativi.",
        "Backup e stato Kuma sono segnalati separatamente: il monitoraggio in pausa non genera un errore bloccante.",
        "I conteggi clienti sono confrontati dinamicamente tra API e MariaDB, senza aspettarsi un totale fisso."
      ],
      "security": [
        "La verifica usa esclusivamente richieste HTTP GET e query SQL SELECT; token e record personali non vengono stampati."
      ]
    },
    {
      "version": "1.60.3",
      "date": "2026-10-04",
      "title": "Ripristino password accessibile dal link email",
      "changes": [
        "La route con resetToken apre sempre il form di cambio password, anche se esiste una sessione browser precedente.",
        "Le risposte 401 durante il reset non sovrascrivono più il token del link con il redirect expired=1.",
        "I nuovi link di reset indicano esplicitamente auth=production.",
        "La gestione permessi dashboard termina in sicurezza quando il profilo utente non è ancora disponibile."
      ],
      "security": [
        "Il token di reset resta nell'URL soltanto per la route pubblica prevista; nessun token viene esposto nelle risposte API."
      ]
    },
    {
      "version": "1.60.2",
      "date": "2026-10-04",
      "title": "Ricerca clienti autorevole e verifiche senza ticket residui",
      "changes": [
        "Il selettore clienti usa MariaDB/API come unica fonte: cache locale obsoleta non viene mostrata in caso di lista vuota o API non disponibile.",
        "La lista clienti viene aggiornata dal server quando si entra nel campo di ricerca; gli errori API sono mostrati nel form.",
        "I selettori Monitoraggio, Promemoria e Noleggi si aggiornano all'arrivo della lista server e svuotano opzioni obsolete se l'API fallisce; compatibilità sincrona legacy mantenuta senza fallback localStorage.",
        "I controlli automatici non creano più ticket di prova salvo esplicita autorizzazione KRM_RUN_MUTATING_CHECKS=1.",
        "Il checkpoint root-safe archivia dinamicamente la cartella K RM in esecuzione, senza riferimenti fissi alla versione precedente.",
        "Aggiunti test automatici per lista vuota, errore API e aggiornamento forzato dei clienti."
      ],
      "security": [
        "Il form non presenta record locali obsoleti come clienti reali se il server è vuoto o non raggiungibile."
      ]
    },
    {
      "version": "1.60.1",
      "date": "2026-07-08",
      "title": "Fix ricerca clienti nel nuovo ticket",
      "changes": [
        "/api/clients accetta pageSize=5000 per caricare la lista clienti completa nel form nuovo ticket.",
        "Risolto caso in cui un cliente appena creato aumentava il conteggio ma non compariva nella ricerca nuovo ticket.",
        "Aggiunto check-ricerca-clienti-ticket-1.60.1.sh.",
        "Mantenuti clienti MariaDB primary, ticket MariaDB primary e controlli anti-pending."
      ],
      "security": [
        "Riduce rischio di ticket creati senza agganciare un cliente realmente presente in archivio."
      ]
    },
    {
      "version": "1.58.0",
      "date": "2026-07-07",
      "title": "Fix clienti async ticket, orfani localStorage e guardia HTTPS",
      "changes": [
        "customer-link.js: all() awaitable e clienti reali da /api/clients.",
        "Form nuovo ticket: re-render lista clienti dopo evento API.",
        "Ticket: rimossa lettura frontend letterale di flussoTickets come sorgente primaria.",
        "Protezione ticket orfani prima della pulizia legacy localStorage."
      ],
      "security": [
        "Blocca ritorno a localStorage come sorgente primaria ticket."
      ]
    },
    {
      "version": "1.57.0",
      "date": "2026-07-07",
      "title": "Fix clienti async nel ticket e protezione ticket orfani",
      "changes": [
        "customer-link.js: aggiunta allAsync() e chiamanti await per lista clienti nel form nuovo ticket.",
        "Il controllo duplicati cliente nel ticket ora aspetta i 2111 clienti reali da /api/clients.",
        "app.js: loadTicketsFromServer controlla ticket locali orfani prima di cancellare flussoTickets.",
        "I ticket locali non migrati vengono salvati in flussoTickets-orfani-da-migrare e segnalati, non scartati silenziosamente.",
        "Aggiunto check-clienti-ticket-orfani-1.57.0.sh."
      ],
      "security": [
        "Riduce rischio di perdita dati durante passaggio localStorage -> MariaDB.",
        "Blocca regressioni su picker clienti ticket e cancellazione locale non verificata."
      ]
    },
    {
      "version": "1.56.0",
      "date": "2026-07-07",
      "title": "Fix creazione ticket e clienti nel form ticket",
      "changes": [
        "Il form nuovo ticket ricarica la lista clienti quando /api/clients risponde.",
        "La creazione nuovo ticket usa POST diretto /api/tickets e attende conferma server prima di chiudere il form.",
        "Dopo la creazione viene ricaricata la lista ticket da MariaDB primary.",
        "Aggiunto check reale che crea un ticket temporaneo, lo legge via API e lo elimina verificando il conteggio finale."
      ],
      "security": [
        "Riduce rischio di ticket creati solo in UI ma non confermati in MariaDB.",
        "Mantiene blocco regressione su clienti 2111, MariaDB primary, no pending e no localStorage primario."
      ]
    },
    {
      "version": "1.55.0",
      "date": "2026-07-07",
      "title": "Guardia produzione ticket e report operativo",
      "changes": [
        "Aggiunto report-produzione-unico-1.55.0.sh con stato app, database, auth, ticket, backup e link operativi.",
        "Aggiunta guardia anti-regressione ticket: MariaDB primary, nessun pending, conteggio API allineato al DB, niente localStorage primario.",
        "Aggiunto controllo script pericolosi e tool di quarantena dry-run/apply.",
        "Protetto pulisci-dati-test.sh con variabile di conferma forte per evitare pulizie accidentali."
      ],
      "security": [
        "Riduce rischio di perdita o occultamento ticket dopo aggiornamenti.",
        "Blocca regressioni note su API ticket, pending asincrono e sorgente dati non MariaDB.",
        "Riduce rischio di esecuzione accidentale di script distruttivi."
      ]
    },
    {
      "version": "1.54.0",
      "date": "2026-07-07",
      "title": "Check finale stabile",
      "changes": [
        "Aggiunti tutti gli script check con nome versione corrente 1.54.0.",
        "Aggiunto wrapper unico check-finale-stabile-1.54.0.sh.",
        "Il wrapper esegue backup root-safe, security policy, pending, ticket MariaDB e assegnatari.",
        "Nessuna modifica a dati, database, ticket, clienti o schema."
      ],
      "security": [
        "Riduce rischio di installazioni con check incompleti o script mancanti.",
        "Mantiene obbligatori i pre-check ticket/clienti prima di considerare stabile il pacchetto."
      ]
    },
    {
      "version": "1.52.0",
      "date": "2026-07-07",
      "title": "Checkpoint backup root-safe",
      "changes": [
        "Checkpoint backup via container root per allegati cifrati.",
        "Verifica archivio dati leggibile e confronto allegati cifrati filesystem vs archivio."
      ]
    },
    {
      "version": "1.51.0",
      "date": "2026-07-07",
      "title": "Check sicurezza policy stabile",
      "changes": [
        "Check QNAP enforcement reale security-policy.json.",
        "Verifica API protette, cookie sessione, header sicurezza e vault allegati cifrati."
      ]
    },
    {
      "version": "1.50.0",
      "date": "2026-07-07",
      "title": "Consolidamento assegnatari ticket e check regressione",
      "changes": [
        "Normalizzazione backend unica per assegnatario principale ticket.",
        "Campo canonico primaryTechnicianId con alias legacy mantenuti.",
        "Rimosso doppio salvataggio local-store residuo nel fallback ticket.",
        "Aggiunto check QNAP per coerenza alias assegnatario."
      ]
    },
    {
      "version": "1.49.2",
      "date": "2026-07-07",
      "title": "Fix pending moduli e HTTPS booleano",
      "changes": [
        "Rimosso errore runtime Richiesta API asincrona in corso.",
        "Aggiunta richiesta async reale per moduli frontend.",
        "Corretto controllo booleano KRM_EXPECT_HTTPS con flag obbligatorieta HTTPS separato."
      ]
    },
    {
      "version": "1.45.0",
      "date": "2026-07-06",
      "title": "Cleanup dead code auth/2FA e controllo duplicati",
      "changes": [
        "Rimosse da AttachmentVault le copie morte dei metodi reset password e 2FA.",
        "Rimosso duplicato identico DdtIntegrationBridge.update_user mantenendo una sola implementazione.",
        "Aggiunto check automatico metodi duplicati per classe/file."
      ],
      "security": [
        "Riduce rischio regressioni future su reset password, 2FA e trusted device causate da copie morte non aggiornate."
      ]
    },
    {
      "version": "1.44.0",
      "date": "2026-07-05",
      "title": "Backup permessi allegati cifrati",
      "changes": [
        "Aggiunto backup dati via container root per includere allegati cifrati non leggibili da utente QNAP standard.",
        "Aggiunto check backup permessi allegati cifrati con verifica archivio e conteggio file protetti.",
        "Nessuna modifica funzionale a login, ticket, clienti o database applicativo."
      ],
      "security": [
        "Riduce il rischio di checkpoint incompleti quando /share/KRM/data contiene allegati cifrati con permessi restrittivi."
      ]
    },
    {
      "version": "1.43.1",
      "date": "2026-07-05",
      "channel": "production",
      "title": "Cleanup trusted device e check duplicati",
      "package": "KRM-1.43.1-CLEANUP-TRUSTED-DEVICE-CHECK.zip",
      "changes": [
        "Rimosse due copie morte trusted-device da AttachmentVault.",
        "Mantenuta implementazione unica in AuthManager.",
        "Aggiunto check automatico duplicati metodi Python."
      ],
      "checks": [
        "AST server OK",
        "Trusted-device solo in AuthManager",
        "Pre-check clienti/ticket"
      ]
    },
    {
      "version": "1.43.0",
      "date": "2026-07-05",
      "channel": "production",
      "title": "Ticket salva/assegnatari check",
      "package": "KRM-1.43.0-TICKET-SALVA-ASSEGNATARI-CHECK.zip",
      "changes": [
        "Aggiunto check ticket aggiornato alla versione corrente.",
        "Verifica pulsanti Salva modifiche e Salva e chiudi.",
        "Verifica audit cambio assegnatario e ticket interno/esterno.",
        "Nessuna modifica al login/auth stabile 1.42.2."
      ],
      "checks": [
        "Security status 1.43.0",
        "Pre-check clienti 2111",
        "API ticket",
        "Pattern UI ticket"
      ]
    },
    {
      "version": "1.42.2",
      "date": "2026-07-05",
      "channel": "production",
      "title": "Fix login trusted device",
      "package": "KRM-1.42.2-FIX-TRUSTED-DEVICE-LOGIN.zip",
      "changes": [
        "Corretto metodo trusted-device mancante in AuthManager.",
        "Login 2FA ripristinato senza Failed to fetch.",
        "Mantenuta UI login isolata senza sidebar prima dell’accesso."
      ],
      "checks": [
        "AST server OK",
        "Check login/auth UI",
        "Pre-check clienti/ticket"
      ]
    },
    {
      "version": "1.42.1",
      "date": "2026-07-05",
      "channel": "production",
      "title": "Fix login/auth UI",
      "package": "KRM-1.42.1-FIX-LOGIN-AUTH-UI.zip",
      "changes": [
        "Sidebar e moduli nascosti prima del login reale.",
        "Errore JSON login gestito con messaggio tecnico controllato.",
        "Conservati fix 1.42.0 su floating button, z-index e accessibilità."
      ],
      "checks": [
        "Pre-check clienti/ticket obbligatorio.",
        "Security status e backend auth."
      ]
    },
    {
      "version": "1.42.0",
      "date": "2026-07-05",
      "channel": "produzione operativa controllata",
      "title": "UI floating e accessibilità riparazioni",
      "package": "KRM-1.42.0-UI-FLOATING-ACCESSIBILITA.zip",
      "changes": [
        "Pulsanti flottanti help/chat consolidati in una pila unica responsive.",
        "Aggiunta scala z-index con variabili CSS nominate.",
        "Aggiunti alt descrittivi per QR, foto riparazioni e firme generate via JavaScript."
      ],
      "fixes": [
        "Ridotti conflitti CSS recenti e coordinate duplicate dei FAB.",
        "Pre-check clienti/ticket incluso nel controllo QNAP della fase."
      ]
    },
    {
      "version": "1.41.0",
      "date": "2026-07-05",
      "channel": "produzione operativa controllata",
      "title": "2FA ricorda dispositivo 24 ore",
      "package": "KRM-1.41.0-2FA-RICORDA-DISPOSITIVO.zip",
      "changes": [
        "Login produzione con opzione Ricorda questo dispositivo per 24 ore dopo verifica 2FA.",
        "Cookie HttpOnly krm_trusted_device: salta solo il codice 2FA sullo stesso browser, mantenendo obbligatorie email e password.",
        "Token dispositivo salvato lato server solo come hash e con scadenza configurabile KRM_TRUSTED_DEVICE_HOURS."
      ],
      "fixes": [
        "Pre-check clienti/ticket incluso nel controllo QNAP della fase."
      ]
    },
    {
      "version": "1.40.0",
      "date": "2026-07-05",
      "channel": "produzione operativa controllata",
      "title": "Monitoraggio Kuma firewall-safe",
      "package": "KRM-1.40.0-KUMA-ZYXEL-FIREWALL-SAFE.zip",
      "changes": [
        "Jitter sui check monitor, rilevamento blocco di massa firewall e backoff.",
        "Report porte Kuma schedulato e gestione host che richiedono agent/push."
      ],
      "fixes": [
        "Log errori monitoraggio distinti per timeout, DNS, no route e connection refused."
      ]
    },
    {
      "version": "1.39.0",
      "date": "2026-07-05",
      "channel": "ticket operativo",
      "title": "Salva ticket e storico assegnatari",
      "changes": [
        "Aggiunti pulsanti Salva modifiche e Salva e chiudi nella scheda ticket.",
        "Migliorata gestione assegnatario principale e collaboratori.",
        "Ogni cambio assegnazione viene scritto nel registro attività del ticket.",
        "Verificata separazione ticket interno / ticket esterno in fase creazione."
      ],
      "fixes": [
        "Ridotto rischio di chiusura scheda senza salvataggio esplicito.",
        "Storico assegnazioni leggibile con nome utente e nuovo assegnatario."
      ],
      "package": "KRM-1.39.0-TICKET-SALVA-ASSEGNATARI.zip",
      "highlights": [
        "Salva modifiche",
        "Salva e chiudi",
        "Registro attività assegnatari",
        "Ticket interno/esterno verificato"
      ]
    },
    {
      "version": "1.38.0",
      "date": "2026-07-04",
      "channel": "monitoraggio firewall-safe",
      "title": "Rilevamento porte reali monitor Kuma",
      "changes": [
        "Aggiunto script QNAP sh rileva-porte-monitor-kuma.sh.",
        "Dry-run per rilevare porte TCP aperte senza modificare Kuma.",
        "Apply con backup automatico di kuma.db prima di aggiornare tipo/porta monitor.",
        "Report dei clienti non monitorabili via TCP generico."
      ],
      "fixes": [
        "Evita conversioni massive cieche su porta 80 o 443.",
        "Mantiene pre-verifica clienti/ticket obbligatoria."
      ],
      "package": "KRM-1.38.0-RILEVAMENTO-PORTE-MONITORAGGIO.zip",
      "highlights": [
        "Dry-run porte",
        "Backup Kuma DB",
        "Report non monitorabili",
        "Firewall-safe"
      ]
    },
    {
      "version": "1.37.1",
      "date": "2026-07-04",
      "channel": "monitoraggio firewall-safe",
      "title": "Comando unico conversione Ping TCP",
      "changes": [
        "Aggiunto endpoint POST /api/monitor/bulk-convert-ping.",
        "Aggiunto script QNAP sh converti-monitor-ping-tcp.sh.",
        "Conversione massiva dei monitor Ping in Porta TCP con porta/intervallo/timeout configurabili."
      ],
      "fixes": [
        "Evita endpoint non trovato durante conversione da terminale.",
        "Mantenuta pre-verifica clienti/ticket obbligatoria."
      ],
      "package": "KRM-1.37.1-BULK-CONVERT-PING-TCP.zip",
      "highlights": [
        "Comando unico",
        "Ping → TCP 443",
        "Endpoint bulk",
        "Script QNAP"
      ]
    },
    {
      "version": "1.37.0",
      "date": "2026-07-04",
      "channel": "monitoraggio firewall-safe",
      "title": "Profili monitoraggio sicuri per firewall",
      "changes": [
        "Aggiunti preset rapidi Firewall/router, Sito web, NAS/K RM, Server e Cliente remoto delicato.",
        "Aggiunto pulsante Converti Ping → TCP 443 per ridurre falsi offline causati da firewall/DoS/ICMP rate limit.",
        "I nuovi monitor possono partire da profili con intervalli, timeout e soglie più conservative.",
        "Mantenuta integrazione Kuma bidirezionale della 1.36.0."
      ],
      "fixes": [
        "Ridotto rischio di falsi down quando Zyxel o altri firewall bloccano ICMP.",
        "Mantenuta pre-verifica clienti/ticket obbligatoria."
      ],
      "package": "KRM-1.37.0-PROFILI-MONITORAGGIO-FIREWALL-SAFE.zip",
      "highlights": [
        "No ICMP per firewall",
        "TCP 443 consigliato",
        "Conversione massiva Ping",
        "Preset cliente remoto"
      ]
    },
    {
      "version": "1.36.0",
      "date": "2026-07-04",
      "channel": "monitoraggio avanzato",
      "title": "Import Kuma e webhook eventi verso K RM",
      "changes": [
        "Aggiunto endpoint POST /api/kuma/import-monitors per importare in K RM i monitor già presenti in Uptime Kuma.",
        "Aggiunto pulsante Importa monitor da Kuma nella card Monitoraggio avanzato esterno.",
        "Il webhook /api/kuma/webhook registra eventi e aggiorna lo stato dei monitor K RM collegati.",
        "Aggiunto endpoint GET /api/kuma/events per consultare gli ultimi eventi ricevuti."
      ],
      "fixes": [
        "Evitati duplicati tramite link Kuma ID ↔ monitor K RM.",
        "Mantenuta pre-verifica clienti/ticket obbligatoria."
      ],
      "package": "KRM-1.36.0-KUMA-BIDIREZIONALE.zip",
      "highlights": [
        "Kuma → K RM",
        "K RM → Kuma",
        "Webhook DOWN/UP",
        "Import monitor esistenti"
      ]
    },
    {
      "version": "1.35.0",
      "date": "2026-07-03",
      "channel": "monitoraggio avanzato",
      "title": "Sync monitor K RM → Uptime Kuma",
      "changes": [
        "Dashboard monitoraggio, promemoria e rapporti caricati da API server.",
        "Riepiloghi principali basati su dashboardData server-side.",
        "Aggiunto check-dati-moduli-1.33.sh."
      ],
      "fixes": [
        "Rimosso fallback localStorage silenzioso dai widget principali dashboard.",
        "Mantenuta pre-verifica clienti/ticket obbligatoria."
      ],
      "package": "KRM-1.35.0-SYNC-MONITOR-KUMA.zip",
      "highlights": [
        "Endpoint GET /api/kuma/monitors",
        "Endpoint POST /api/kuma/sync-monitor",
        "Pulsante Sincronizza con Kuma",
        "Salvataggio link monitor K RM ↔ Kuma",
        "Check QNAP check-kuma-sync-1.35.sh"
      ]
    },
    {
      "version": "1.32.0",
      "date": "2026-07-03",
      "channel": "ticket operativi",
      "title": "Ticket interno / esterno",
      "changes": [
        "Aggiunta scelta iniziale nel form Nuovo ticket: Ticket esterno / cliente oppure Ticket interno.",
        "Ticket esterno mantiene dati cliente e telefono obbligatori.",
        "Ticket interno richiede titolo interno e motivo, senza cliente collegato.",
        "Lista e dettaglio mostrano badge Interno/Esterno."
      ],
      "fixes": [
        "Evitata creazione cliente quando il ticket è interno.",
        "Promemoria cliente e contatti non vengono mostrati sui ticket interni.",
        "Mantenuti check operativi clienti/ticket/sessione/HTTPS/Tailscale."
      ],
      "package": "KRM-1.32.0-TICKET-INTERNO-ESTERNO.zip"
    },
    {
      "version": "1.31.0",
      "date": "2026-07-03",
      "channel": "monitoraggio icmp",
      "title": "ICMP normale per monitoraggio",
      "changes": [
        "Confermato e mantenuto NET_RAW nel docker-compose per consentire ping ICMP reale.",
        "Aggiunto endpoint /api/monitor/icmp-status per diagnosticare ping binario, raw socket e fallback.",
        "Aggiunta opzione KRM_MONITOR_FORCE_PYTHON_ICMP per forzare ICMP nativo Python.",
        "Migliorati messaggi UI: ICMP normale se consentito dal target, TCP consigliato se il target blocca ICMP."
      ],
      "fixes": [
        "Ridotto rischio di blocco su ping raw senza timeout esplicito.",
        "Aggiunto check QNAP dedicato per capire se il problema è permesso container o target che non risponde a ICMP."
      ],
      "package": "KRM-1.31.0-ICMP-NORMALE-MONITORAGGIO.zip"
    },
    {
      "version": "1.30.1",
      "date": "2026-07-03",
      "channel": "auth ticket",
      "title": "Correzione 403 ticket e sessione login",
      "changes": [
        "Il backend accetta sia X-KRM-API-Token sia Authorization: Bearer per controlli API.",
        "Le richieste frontend usano cookie sessione HttpOnly con credentials same-origin.",
        "Se /api/tickets risponde 401/403 per sessione non valida, il frontend reindirizza al login produzione.",
        "Aggiunto endpoint debug /api/debug/auth-ticket per verificare token, sessione, permessi ticket e origine."
      ],
      "fixes": [
        "Corretto caso API ticket non disponibile - codice HTTP 403 - Token API o sessione login non valida.",
        "Evitato che l'utente resti su schermata ticket offline quando serve nuovo login."
      ],
      "package": "KRM-1.30.1-FIX-AUTH-HEADER-SESSIONE-TICKET.zip"
    },
    {
      "version": "1.30.0",
      "date": "2026-07-03",
      "channel": "permessi utenti",
      "title": "Accessi reali e permessi consolidati",
      "changes": [
        "La sezione Accessi reali e sicurezza diventa il pannello principale della pagina Utenti.",
        "La sezione Squadra viene marcata come legacy e resta solo per identità operative, colore e avatar.",
        "La modifica privilegi per utente resta collegata al backend auth e ai permessi moduli.",
        "Il reset 2FA apre il flusso con QR code e codice alfanumerico alternativo."
      ],
      "fixes": [
        "Ridotta confusione tra vecchia Squadra e accessi reali usati per login, 2FA e privilegi.",
        "Aggiunto check pre-fase clienti/ticket obbligatorio per evitare regressioni sul selettore clienti."
      ],
      "package": "KRM-1.30.0-PERMESSI-UTENTI-CONSOLIDATI.zip"
    },
    {
      "version": "1.29.1",
      "date": "2026-07-03",
      "channel": "fix ticket clienti",
      "title": "Selettore clienti centralizzato nel nuovo ticket",
      "changes": [
        "Il form nuovo ticket carica i clienti da /api/clients.",
        "localStorage flussoClients resta solo cache/fallback.",
        "Il selettore cliente del ticket usa la stessa sorgente della pagina Clienti."
      ],
      "fixes": [
        "Risolto caso in cui in Clienti si vedevano 2111 record ma nel nuovo ticket la zona cliente risultava vuota."
      ],
      "package": "KRM-1.29.1-FIX-SELETTORE-CLIENTI-TICKET.zip"
    },
    {
      "version": "1.29.0",
      "date": "2026-07-03",
      "channel": "scan e monitoraggio",
      "title": "Anteprima ritaglio Scan PDF e monitoraggio stabile",
      "changes": [
        "Aggiunta anteprima immediata foto in Scan to PDF.",
        "Aggiunto ritaglio manuale con 4 angoli trascinabili e supporto touch.",
        "Aggiunti comandi Auto foglio, Ruota, Usa originale e Applica ritaglio.",
        "Aggiunto preset monitoraggio K RM locale TCP 8080.",
        "Aggiunti avvisi UI su ping ICMP instabile e sessione scaduta HTTP 403."
      ],
      "fixes": [
        "Ridotti falsi problemi monitoraggio distinguendo ping intermittente da controllo TCP affidabile."
      ],
      "package": "KRM-1.29.0-SCAN-RITAGLIO-MONITOR-STABILE.zip"
    },
    {
      "version": "1.28.0",
      "date": "2026-07-03",
      "channel": "https privato",
      "title": "HTTPS sicuro senza esposizione pubblica",
      "changes": [
        "Aggiunti script per predisporre KRM_PUBLIC_URL HTTPS.",
        "Aggiunto check HTTPS privato su dominio krm.mediaphone.cloud.",
        "Aggiunta guida operativa per Tailscale HTTPS, reverse proxy QNAP e Cloudflare Zero Trust."
      ],
      "fixes": [
        "Separata la sicurezza HTTPS dalla pubblicazione internet: nessun port forwarding richiesto."
      ],
      "package": "KRM-1.28.0-HTTPS-SICURO-PRIVATO.zip"
    },
    {
      "version": "1.27.0",
      "date": "2026-07-03",
      "channel": "dominio privato",
      "title": "Dominio privato Tailscale e preparazione HTTPS",
      "changes": [
        "Aggiunti controlli per krm.mediaphone.cloud su IP Tailscale.",
        "Aggiunto script per configurare KRM_PUBLIC_URL senza attivare esposizione pubblica.",
        "Aggiunta guida HTTPS privato con Tailscale/reverse proxy/certificato interno."
      ],
      "fixes": [
        "Chiarita distinzione tra dominio privato Tailscale e pubblicazione internet."
      ],
      "package": "KRM-1.27.0-DOMINIO-PRIVATO-HTTPS.zip"
    },
    {
      "version": "1.26.0",
      "date": "2026-07-02",
      "channel": "scan mobile",
      "title": "Scan to PDF fallback smartphone",
      "changes": [
        "Aggiunto pulsante Foto da smartphone nella pagina Scan to PDF.",
        "Generazione PDF multi-pagina da immagini selezionate/scattate dal telefono.",
        "Messaggio chiaro quando HTTP blocca la fotocamera live."
      ],
      "fixes": [
        "Scan to PDF utilizzabile da smartphone anche senza HTTPS tramite upload foto."
      ],
      "package": "KRM-1.26.0-SCAN-MOBILE-FALLBACK.zip"
    },
    {
      "version": "1.25.0",
      "date": "2026-07-02",
      "channel": "produzione operativa",
      "title": "Chiusura produzione operativa",
      "changes": [
        "Check finale produzione accorpato.",
        "Backup automatico e restore non distruttivo verificabili da script unico.",
        "Report finale con stato container, API, dati, auth, backup e integrazioni.",
        "Promemoria credenziali/configurazioni da salvare offline."
      ],
      "fixes": [
        "Ridotte le operazioni manuali finali a una fase unica."
      ],
      "package": "KRM-1.25.0-CHIUSURA-PRODUZIONE-OPERATIVA.zip"
    },
    {
      "version": "1.24.0",
      "date": "2026-07-02",
      "channel": "integrazioni esterne",
      "title": "Integrazioni esterne sicure",
      "changes": [
        "Check unico per Fatture in Cloud DDT, SMTP recupero password, Email lavoro e Calendar.",
        "Applicazione controllata tabelle DDT ed Email/Calendar.",
        "Report finale integrazioni e checkpoint dedicato."
      ],
      "fixes": [
        "Fatture in Cloud resta in dry-run finché non viene abilitato esplicitamente l'invio reale."
      ],
      "package": "KRM-1.24.0-INTEGRAZIONI-ESTERNE-SICURE.zip"
    },
    {
      "version": "1.23.0",
      "date": "2026-07-02",
      "channel": "stabilizzazione interna",
      "title": "Permessi e dati multi-modulo consolidati",
      "changes": [
        "Aggiunto check finale accorpato per permessi, API, dati MariaDB e local-store legacy.",
        "Aggiunto checkpoint finale interno con backup DB, dati, uploads, logs ed .env.",
        "Aggiunto report leggibile su utenti, permessi e conteggi moduli principali."
      ],
      "fixes": [
        "Fase unica per ridurre i passaggi prima delle integrazioni esterne."
      ],
      "package": "KRM-1.23.0-STABILIZZAZIONE-FINALE-INTERNA.zip"
    },
    {
      "version": "1.22.0",
      "date": "2026-07-02",
      "channel": "test permessi",
      "title": "Test guidato utenti limitati",
      "changes": [
        "Aggiunto test-permessi-utenti-guidato.sh.",
        "Aggiunto report-permessi-utenti.sh.",
        "Aggiunto crea-utente-test-riparazioni.sh per creare un utente limitato opzionale."
      ],
      "fixes": [
        "Fase di verifica senza modifiche ai dati applicativi principali."
      ],
      "package": "KRM-1.22.0-TEST-PERMESSI-UTENTI.zip"
    },
    {
      "version": "1.21.0",
      "date": "2026-07-02",
      "channel": "sicurezza permessi",
      "title": "Permessi moduli e blocco API",
      "changes": [
        "La sidebar mostra solo i moduli autorizzati dal profilo reale.",
        "Le pagine non autorizzate mostrano blocco accesso invece di contenuti.",
        "Il backend verifica i permessi sulle API principali.",
        "Aggiunto check-permessi-moduli-api.sh."
      ],
      "fixes": [
        "Un utente senza permesso modulo non può più affidarsi solo al blocco grafico.",
        "Accessi diretti agli endpoint protetti vengono respinti con errore permessi."
      ],
      "package": "KRM-1.21.0-PERMESSI-MODULI-BLOCCO-API.zip"
    },
    {
      "version": "1.20.0",
      "date": "2026-07-02",
      "channel": "utenti e sicurezza",
      "title": "Permessi utenti reali e QR 2FA",
      "changes": [
        "Aggiunta gestione privilegi sugli accessi reali backend dalla pagina Utenti.",
        "Aggiunto QR Code visibile nella procedura reset/configurazione 2FA.",
        "Aggiunto pulsante per mostrare il codice alfanumerico solo quando serve.",
        "Chiarita distinzione: Squadra = identità operativa, Accessi reali = login e privilegi."
      ],
      "fixes": [
        "Il reset 2FA non usa più solo prompt testuale ma apre una modale con QR e conferma TOTP.",
        "Aggiunto check-permessi-utenti-qr.sh per verificare endpoint utenti, permessi e UI QR."
      ],
      "package": "KRM-1.20.0-PERMESSI-UTENTI-MODULI-QR-2FA.zip"
    },
    {
      "version": "1.19.0",
      "date": "2026-07-01",
      "channel": "integrazione operativa",
      "title": "Fatture in Cloud DDT reale controllato",
      "changes": [
        "Consolidata integrazione limitata Fatture in Cloud solo Documenti di Trasporto delivery_note.",
        "Aggiunti script QNAP per configurare credenziali FIC nel backend senza esporre token al frontend.",
        "Aggiunto check reale stato FIC, tabelle DDT, modalità dry-run e abilitazione creazione.",
        "Aggiunto test dry-run DDT da API con conferma obbligatoria."
      ],
      "fixes": [
        "Creazione reale disabilitata finché KRM_FIC_CREATE_ENABLED=1 e KRM_FIC_DRY_RUN=0 non sono impostati.",
        "Fatture, preventivi, ricevute, proforme e ordini restano esclusi."
      ],
      "package": "KRM-1.19.0-FATTURE-IN-CLOUD-DDT-REALE.zip"
    },
    {
      "version": "1.18.0",
      "date": "2026-07-01",
      "channel": "stabilizzazione generale",
      "title": "Checkpoint dati, backup e Tailscale",
      "changes": [
        "Fase unica di stabilizzazione senza modifiche a QR 2FA, privilegi avanzati o Fatture in Cloud.",
        "Aggiunto check-stabilizzazione-generale.sh per container, API, MariaDB, Tailscale, backup e log recenti.",
        "Aggiunto checkpoint-stabile-generale.sh per creare backup DB, data/uploads/logs, app attiva ed .env.",
        "Versione basata su ramo stabile 1.17.0 per evitare regressioni delle modifiche 1.17.1/1.17.2."
      ],
      "fixes": [
        "Congelamento base funzionante prima di riprendere sicurezza utenti e integrazioni esterne.",
        "Report finale ripristinabile in /share/KRM/backups/checkpoint-1.18.0-stabile."
      ],
      "package": "KRM-1.18.0-STABILIZZAZIONE-GENERALE.zip"
    },
    {
      "version": "1.17.0",
      "date": "2026-07-01",
      "channel": "autenticazione e privilegi",
      "title": "Blocco demo produzione, privilegi admin backend, QR 2FA",
      "changes": [
        "Bloccata modalità demo/test lato frontend: il vecchio link non permette più accesso senza credenziali.",
        "Aggiunta modifica privilegi backend da Gestione utenti per admin.",
        "Permessi utente salvati su auth-users.json backend e restituiti al login reale.",
        "Aggiunta UI 2FA con QR Code visibile e codice alfanumerico nascosto/mostrabile.",
        "Aggiunti check-auth-production-lock.sh e check-auth-permessi-2fa.sh."
      ],
      "fixes": [
        "Un admin non può rimuovere l’ultimo admin attivo.",
        "La 2FA diventa attiva solo dopo conferma TOTP valida.",
        "Le modifiche privilegi vengono registrate nei log audit backend."
      ],
      "package": "KRM-1.17.0-AUTH-PERMESSI-2FA-QR.zip"
    },
    {
      "version": "1.16.0",
      "date": "2026-07-01",
      "channel": "centralizzazione moduli operativi",
      "title": "API server-side per moduli non-ticket",
      "changes": [
        "Aggiunte API backend per riparazioni, dispositivi cortesia, noleggi e rapporti intervento.",
        "Aggiunto bridge frontend per sincronizzare i moduli operativi tramite API server.",
        "Aggiunti check-moduli-api.sh, check-moduli-sync.sh e migrate-moduli-localstore-to-db.sh.",
        "localStorage resta solo cache tecnica/preferenze, non archivio principale."
      ],
      "fixes": [
        "Ridotto rischio di dati diversi tra PC e smartphone sui moduli operativi.",
        "Le scritture vuote dei moduli operativi vengono bloccate per evitare cancellazioni accidentali."
      ],
      "package": "KRM-1.16.0-CENTRALIZZAZIONE-MODULI-OPERATIVI.zip"
    },
    {
      "version": "1.15.3",
      "date": "2026-07-01",
      "channel": "fix API ticket sessione",
      "title": "API ticket disponibile da frontend Tailscale",
      "changes": [
        "API protette accessibili dal frontend con sessione login valida oppure token API server-side.",
        "Aggiunti endpoint GET /api/tickets/count e GET /api/debug/data-source.",
        "Aggiunto supporto PATCH /api/tickets/:id.",
        "Frontend mostra codice HTTP reale quando API ticket non è disponibile.",
        "Aggiunto check-api-ticket-frontend.sh."
      ],
      "fixes": [
        "Corretto errore iPhone Tailscale: Offline/non sincronizzato: API ticket non disponibile.",
        "La UI non mostra più 0 ticket come dato reale quando l’API fallisce.",
        "GET /api/tickets supporta parametro operator come alias tecnico."
      ],
      "package": "KRM-1.15.3-FIX-API-TICKET-FRONTEND-SESSIONE.zip"
    },
    {
      "version": "1.15.2",
      "date": "2026-07-01",
      "channel": "fix frontend Tailscale",
      "title": "No local-store legacy per clienti/ticket",
      "changes": [
        "Disattivato bridge automatico localStorage verso /api/local-store/* per evitare 403 e schermate vuote.",
        "Clienti caricati da /api/clients.",
        "Ticket caricati da /api/tickets tramite backend.",
        "Aggiunto check-frontend-no-localstore-legacy.sh."
      ],
      "fixes": [
        "Corretto caso PC e telefono Tailscale con dati diversi o assenti pur avendo backend funzionante.",
        "Ridotto rumore log 403 su flussoClients/flussoTickets.",
        "La UI non deve più trattare localStorage legacy come fonte reale per clienti/ticket."
      ],
      "package": "KRM-1.15.2-FIX-FRONTEND-NO-LOCALSTORE-LEGACY.zip"
    },
    {
      "version": "1.15.1",
      "date": "2026-07-01",
      "channel": "stabilità multi-dispositivo",
      "title": "Fix ticket multi-dispositivo",
      "changes": [
        "La lista ticket viene caricata da API backend e non da localStorage browser.",
        "Creazione, modifica e cancellazione ticket passano da endpoint /api/tickets.",
        "Aggiunto indicatore origine dati: Dati da server oppure Offline/non sincronizzato.",
        "Aggiunti script check-data-source.sh, migrate-local-tickets-to-db.sh e check-ticket-sync.sh."
      ],
      "fixes": [
        "Ridotto rischio ticket diversi tra PC, smartphone e browser puliti.",
        "Migrazione ticket legacy local-store verso backend e materializzazione MariaDB.",
        "Check automatico persistenza API e MariaDB per ticket test."
      ],
      "package": "KRM-1.15.1-FIX-TICKET-MULTIDISPOSITIVO.zip"
    },
    {
      "version": "1.15.0",
      "date": "2026-06-30",
      "channel": "produzione Tailscale",
      "title": "Produzione controllata Tailscale",
      "changes": [
        "Modalità produzione controllata per Tailscale/HTTP.",
        "Token API obbligatorio e autenticazione mantenuta attiva.",
        "Aggiunti stato accesso remoto e checkpoint Tailscale stabile."
      ],
      "fixes": [
        "HTTPS non forzato per evitare cookie Secure non inviati su HTTP Tailscale.",
        "Check completo container, security, auth, 2FA, clienti, ticket, DB e backup."
      ],
      "package": "KRM-1.15.0-PRODUZIONE-CONTROLLATA-TAILSCALE.zip"
    },
    {
      "version": "1.14.0",
      "date": "2026-06-30",
      "channel": "backup produzione",
      "title": "Backup automatico e ripristino",
      "changes": [
        "Backup completo MariaDB, data, uploads, logs, app attiva, env e checksum.",
        "Aggiunti check backup e check restore non distruttivo.",
        "Aggiunta configurazione cron backup automatico giornaliero."
      ],
      "fixes": [
        "Restore protetto da backup pre-restore e conferma esplicita.",
        "Check backup verifica archivi tar leggibili."
      ],
      "package": "KRM-1.14.0-BACKUP-AUTOMATICO-RIPRISTINO.zip"
    },
    {
      "version": "1.13.4",
      "date": "2026-06-30",
      "channel": "stabilità ticket",
      "title": "Consolidamento ticket e backup",
      "changes": [
        "Aggiunto script QNAP riallinea-ticket-localstore-da-mariadb.sh.",
        "Check Tailscale/HTTP segnala disallineamento DB ticket/API backend.",
        "Backup DB e flussoTickets prima del riallineo."
      ],
      "fixes": [
        "Ripristino controllato visibilità ticket da MariaDB verso frontend.",
        "Nessuna cancellazione dati."
      ],
      "package": "KRM-1.13.4-CONSOLIDAMENTO-TICKET-BACKUP.zip"
    },
    {
      "version": "1.13.3",
      "date": "2026-06-30",
      "channel": "stabilità Tailscale",
      "title": "Consolidamento Tailscale e moduli operativi",
      "changes": [
        "KRM_EXPECT_HTTPS=0 rispettato anche con KRM_ENV=production per uso Tailscale/HTTP.",
        "Vista dashboard predefinita impostata su Tutti i ticket.",
        "Polling live esteso ai moduli operativi condivisi."
      ],
      "fixes": [
        "Ridotto rischio schermate vuote su Tailscale HTTP per cookie Secure.",
        "Protezione salvataggio vuoto estesa a ticket, riparazioni, noleggi, monitor, promemoria e rapporti.",
        "Aggiunto check QNAP Tailscale/HTTP sessione, cookie, clienti, ticket e DB."
      ],
      "package": "KRM-1.13.3-CONSOLIDAMENTO-TAILSCALE-MODULI.zip"
    },
    {
      "version": "1.13.0",
      "date": "2026-06-29",
      "channel": "sicurezza email",
      "title": "SMTP reale recupero password",
      "changes": [
        "Aggiunti endpoint backend stato/test SMTP.",
        "Aggiunti script QNAP per configurare SMTP recupero password.",
        "Aggiunto test invio email e test flusso Password dimenticata."
      ],
      "fixes": [
        "Il recupero password può inviare link reali quando SMTP è configurato.",
        "Check SMTP separato dal check accessi.",
        "Configurazione .env guidata con backup automatico."
      ],
      "package": "KRM-1.13.0-SMTP-RECUPERO-PASSWORD.zip"
    },
    {
      "version": "1.12.2",
      "date": "2026-06-29",
      "channel": "sicurezza UI",
      "title": "Menu profilo utente e login separato",
      "changes": [
        "Sicurezza account e Logout spostati nel menu del nome utente.",
        "Menu profilo con avatar e ultimo accesso.",
        "Login, recupero password e nuova password separati in viste distinte."
      ],
      "fixes": [
        "Rimosse funzioni flottanti alto/destra poco integrate.",
        "Nuova password non appare nel login normale.",
        "Recupero password appare solo dopo click su Password dimenticata."
      ],
      "package": "KRM-1.12.2-MENU-UTENTE-LOGIN-SEPARATO.zip"
    },
    {
      "version": "1.12.1",
      "date": "2026-06-29",
      "channel": "sicurezza UI",
      "title": "Login pulito, logout e pulsanti account",
      "changes": [
        "Aggiunto pulsante Logout visibile dopo accesso.",
        "Spostato Sicurezza account in alto a destra senza sovrapposizione con chat/guida.",
        "Login iniziale pulito con email, password, 2FA, entra e password dimenticata."
      ],
      "fixes": [
        "Recupero password resta nascosto fino al click su Password dimenticata.",
        "Nuova password compare solo con link resetToken.",
        "Ridotta interferenza grafica su dashboard desktop/mobile."
      ],
      "package": "KRM-1.12.1-LOGIN-LOGOUT-SICUREZZA-UI.zip"
    },
    {
      "version": "1.12.0",
      "date": "2026-06-29",
      "channel": "sicurezza account",
      "title": "Recupero password e gestione 2FA verificata",
      "changes": [
        "Aggiunto recupero password da login con link sicuro monouso e scadenza configurabile.",
        "Aggiunta sezione Sicurezza account con QR Code TOTP, chiave manuale, rigenerazione secret e codici recupero.",
        "L’attivazione 2FA resta pending finché non viene confermato un codice Authenticator a 6 cifre valido."
      ],
      "fixes": [
        "Prevenzione email enumeration: la richiesta password dimenticata mostra sempre lo stesso messaggio.",
        "Disattivazione 2FA protetta da password e codice TOTP quando attivo.",
        "Pannello admin aggiornato: niente abilitazione manuale 2FA senza verifica TOTP."
      ],
      "package": "KRM-1.12.0-SICUREZZA-ACCOUNT-RECUPERO-2FA.zip"
    },
    {
      "version": "1.9.0",
      "date": "2026-06-29",
      "channel": "sicurezza accessi",
      "title": "Login email/password, sessioni server e 2FA admin",
      "changes": [
        "Aggiunto backend autenticazione con utenti server, password PBKDF2 e cookie HttpOnly krm_auth.",
        "Aggiunto login produzione da interfaccia con email, password e codice 2FA quando attivo.",
        "Aggiunti script QNAP setup-admin-auth.sh, abilita-2fa-admin.sh e check-sicurezza-accessi.sh."
      ],
      "fixes": [
        "Gli utenti sospesi non possono autenticarsi nel backend reale.",
        "Audit accessi salvato in server/data/auth-users.json.",
        "Attivazione login reale da browser con ?auth=production senza modificare codice."
      ],
      "package": "KRM-1.9.0-SICUREZZA-ACCESSI-EMAIL-2FA.zip"
    },
    {
      "version": "1.8.1",
      "date": "2026-06-29",
      "channel": "fase A produzione sicura",
      "title": "Checkpoint stabile 1.8 e precheck produzione/Tailscale",
      "changes": [
        "Aggiunto script unico fase-a-checkpoint-produzione.sh per backup, conteggi DB, cache clienti, ping/TCP e precheck sicurezza.",
        "Il checkpoint salva dump MariaDB e archivio data/uploads/logs in /share/KRM/backups/checkpoint-1.8.1.",
        "La fase A verifica app, database, clienti, ticket, rapporti, monitoraggio e backup prima di procedere alla fase DDT/Fatture in Cloud."
      ],
      "fixes": [
        "Ridotti i passaggi manuali per stabilizzare la versione corrente.",
        "Aggiunta verifica esplicita cache clienti 2111 record quando disponibile.",
        "Report finale Fase A scritto in /share/KRM/backups/checkpoint-1.8.1/REPORT-FASE-A.txt."
      ],
      "package": "KRM-1.8.1-FASE-A-CHECKPOINT-PRODUZIONE-SICURA.zip"
    },
    {
      "version": "1.8.0",
      "date": "2026-06-29",
      "channel": "monitoraggio ping reale",
      "title": "Ping ICMP nativo nel monitoraggio e storico versioni riallineato",
      "changes": [
        "Aggiunto ping ICMP nativo Python quando il comando ping non è presente nel container.",
        "Docker Compose abilita NET_RAW per consentire ICMP reale al container krm-app.",
        "Aggiornati About, version-history.json e STORICO-VERSIONI-COMPLETO.txt alla versione corrente."
      ],
      "fixes": [
        "Il monitoraggio Ping non dipende più da iputils-ping installato nel container.",
        "Se ICMP non è consentito, resta attivo fallback TCP controllato sulle porte configurate.",
        "Il download TXT About usa lo storico dinamico aggiornato e non resta su versioni vecchie."
      ],
      "package": "KRM-1.8.0-PING-REALE-MONITORAGGIO-ABOUT.zip"
    },
    {
      "version": "1.7.0",
      "date": "2026-06-29",
      "channel": "paginazione moduli",
      "title": "Paginazione 50 record sui moduli operativi rimanenti",
      "changes": [
        "Aggiunta paginazione 10/20/50/100 a rapporti intervento, riparazioni, cortesia, noleggio, promemoria, monitoraggio e workflow.",
        "Default 50 record per pagina su tutte le liste operative aggiornate.",
        "Cambio ricerca/filtro riporta automaticamente alla prima pagina."
      ],
      "fixes": [
        "Evitate liste lunghe renderizzate interamente nei moduli non ancora paginati.",
        "Migliorata reattività grafica su NAS, smartphone e PC con archivi più grandi.",
        "Paginazione coerente con Clienti e Ticket."
      ],
      "package": "KRM-1.7.0-PAGINAZIONE-MODULI-RIMANENTI.zip"
    },
    {
      "version": "1.6.2",
      "date": "2026-06-29",
      "channel": "fix paginazione clienti",
      "title": "Clienti sempre limitati a pagina anche in fallback locale",
      "changes": [
        "La pagina Clienti applica slicing anche se il backend non risponde o arriva local-store completo.",
        "I pulsanti paginazione funzionano sia in modalità NAS/API sia in fallback locale.",
        "Cambio pageSize non forza caricamento completo."
      ],
      "fixes": [
        "Risolto ritorno della lista clienti intera dopo evento local-store o fallback API.",
        "La lista Clienti non renderizza più 2111 record insieme.",
        "Default 50 clienti per pagina mantenuto anche offline/fallback."
      ],
      "package": "KRM-1.6.2-FIX-CLIENTI-NON-TUTTI-IN-LISTA.zip"
    },
    {
      "version": "1.6.1",
      "date": "2026-06-29",
      "channel": "paginazione grafica",
      "title": "Clienti e Ticket con paginazione visibile 10/20/50/100",
      "changes": [
        "Pagina Clienti collegata a /api/clients con paginazione NAS server-side.",
        "Pagina Clienti con pulsanti Prima, Precedente, Successiva, Ultima e selezione 10/20/50/100.",
        "Lista Ticket renderizzata a pagine per evitare migliaia di card nel frontend.",
        "Scelta pageSize salvata nel browser per Clienti e Ticket."
      ],
      "fixes": [
        "Clienti: default 50 record per pagina.",
        "Clienti: ricerca server-side da 2 caratteri con debounce.",
        "Ticket: cambio filtro/ricerca torna automaticamente a pagina 1."
      ],
      "package": "KRM-1.6.1-PAGINAZIONE-GRAFICA-CLIENTI-TICKET.zip"
    },
    {
      "version": "1.6.0",
      "date": "2026-06-29",
      "channel": "ottimizzazione moduli",
      "title": "Paginazione liste e fix tecnico primario ticket",
      "changes": [
        "Aggiunti endpoint standard paginati /api/clients e /api/tickets con items, totalItems e totalPages.",
        "Ricerca e filtri server-side per clienti e ticket.",
        "Aggiunti indici MariaDB per clienti, ticket e rapporti intervento.",
        "Aggiunto script QNAP applica-ottimizzazione-1.6.sh."
      ],
      "fixes": [
        "Cambio assegnatario ticket: il nuovo tecnico sostituisce il vecchio primario.",
        "Salvati technician_id, primary_technician_id e storico assignmentHistory.",
        "Lista assegnatari senza duplicati e con primario unico."
      ],
      "package": "KRM-1.6.0-OTTIMIZZAZIONE-PAGINAZIONE-TECNICO.zip"
    },
    {
      "version": "1.5.2",
      "date": "2026-06-29",
      "channel": "fix monitoraggio ping",
      "title": "Ping con fallback TCP automatico su NAS/Docker",
      "changes": [
        "Il monitoraggio Ping usa ICMP se il comando ping è disponibile.",
        "Se ping non è disponibile nel container, K RM prova automaticamente porte TCP configurabili.",
        "Aggiunto script test-ping-monitoraggio.sh."
      ],
      "fixes": [
        "Rimosso blocco operativo quando il container non include iputils-ping.",
        "Messaggio UI aggiornato: fallback TCP automatico invece di errore generico."
      ],
      "package": "KRM-1.5.2-MONITORAGGIO-PING-FALLBACK.zip"
    },
    {
      "version": "1.5.1",
      "date": "2026-06-29",
      "channel": "fix backup QNAP",
      "title": "Backup app attiva senza entrare negli archivi MariaDB vecchi",
      "changes": [
        "Il backup app salva solo la versione attiva.",
        "Esclusi deploy/qnap/db, logs, backups, uploads e snapshot dal tar app.",
        "Evitato backup completo di /share/KRM/app/archive."
      ],
      "fixes": [
        "Risolti errori Permission denied durante backup app-config.",
        "Backup automatico più leggero e stabile su QNAP."
      ],
      "package": "KRM-1.5.1-FIX-BACKUP-ARCHIVE-PERMESSI.zip"
    },
    {
      "version": "1.5.0",
      "date": "2026-06-29",
      "channel": "Fase B produzione sicura",
      "title": "Backup QNAP sicuro, precheck produzione e profilo Tailscale",
      "changes": [
        "Backup automatico QNAP corretto su /share/KRM/backups.",
        "Aggiunti check backup automatico e precheck Fase B.",
        "Aggiunto profilo produzione controllata Tailscale senza forzare HTTPS pubblico."
      ],
      "fixes": [
        "Risolto errore backup /backups Permission denied.",
        "Precheck più chiaro per token, database, container, backup e accesso sicuro."
      ],
      "package": "KRM-1.5.0-FASE-B-PRODUZIONE-SICURA.zip"
    },
    {
      "version": "1.4.0",
      "date": "2026-06-29",
      "channel": "stabilizzazione Ticket backend",
      "title": "Protezione ticket da sovrascritture locali e salvataggio vuoto",
      "changes": [
        "Rimosso salvataggio automatico dei ticket all'apertura dashboard.",
        "Bloccato salvataggio frontend di flussoTickets vuoto.",
        "Bloccato salvataggio backend bulk ticket vuoto se esistono ticket server."
      ],
      "fixes": [
        "Ridotto rischio di perdita o sovrascrittura ticket tra dispositivi.",
        "Riassegnazione ticket più stabile dopo refresh e accesso da altro browser."
      ],
      "package": "KRM-1.4.0-TICKET-BACKEND-STABILE.zip"
    },
    {
      "version": "1.3.2",
      "date": "2026-06-29",
      "channel": "fix paginazione Clienti",
      "title": "Blocco sovrascrittura cache Clienti con pagina da 50",
      "changes": [
        "Rimosso salvataggio localStorage flussoClients dopo upsert singolo.",
        "Bloccato invio frontend di flussoClients parziale sotto 1000 record.",
        "Cache Clienti da rigenerare da MariaDB dopo deploy."
      ],
      "fixes": [
        "La UI non riduce più la cache completa a 50 clienti.",
        "API /api/clients torna a total 2111 dopo sync cache."
      ],
      "package": "KRM-1.3.2-FIX-PAGINAZIONE-CLIENTI.zip"
    },
    {
      "version": "1.3.1",
      "date": "2026-06-29",
      "channel": "fix salvataggio Clienti",
      "title": "Upsert singolo cliente senza sovrascrivere cache completa",
      "changes": [
        "Modifica cliente tramite /api/backend/clients/upsert.",
        "Nuovo cliente tramite upsert singolo.",
        "Ripristino, anonimizzazione e cestino cliente tramite upsert singolo."
      ],
      "fixes": [
        "La modifica cliente resta dopo refresh.",
        "La cache completa non viene più sovrascritta dalla pagina corrente."
      ],
      "package": "KRM-1.3.1-CLIENTI-UPSERT-SINGOLO.zip"
    },
    {
      "version": "1.3.0",
      "date": "2026-06-29",
      "channel": "CRUD Clienti/Ticket sicuro",
      "title": "CRUD Clienti su cache dedicata e sync MariaDB idempotente",
      "changes": [
        "CRUD Clienti backend scrive su clients-cache.json.",
        "Protezione anti-sovrascrittura per evitare perdita archivio clienti.",
        "Script applica-clienti-cache-a-mariadb.sh idempotente verso MariaDB.",
        "Script blocca-script-sync-vecchi.sh per disabilitare sincronizzazioni legacy duplicanti."
      ],
      "fixes": [
        "Evita nuovi duplicati clienti da sync vecchi.",
        "Evita POST local-store enorme per flussoClients."
      ],
      "package": "KRM-1.3.0-CRUD-CLIENTI-TICKET-SICURO.zip"
    },
    {
      "version": "1.2.2",
      "date": "2026-06-28",
      "channel": "clienti cache diretta",
      "title": "Lista clienti da cache dedicata fuori local-store",
      "changes": [
        "Aggiunta cache /share/KRM/data/clients-cache.json.",
        "API clienti e local-store flussoClients leggono la cache dedicata.",
        "Sync clienti MariaDB scrive file cache senza payload POST grande."
      ],
      "fixes": [
        "Risolta lista Clienti vuota dopo import di 2111 clienti.",
        "Eliminato limite local-store come blocco operativo per grandi archivi clienti."
      ],
      "package": "KRM-1.2.2-CLIENTI-CACHE-DIRETTA.zip"
    },
    {
      "version": "1.2.1",
      "date": "2026-06-28",
      "channel": "fix sync clienti",
      "title": "Fix payload clienti grande e deduplica import ripetuto",
      "changes": [
        "Aumentato limite local-store server a 25 MB configurabile con KRM_LOCAL_STORE_MAX_MB.",
        "Aggiunto dedup-clienti-mariadb.sh con backup automatico prima della pulizia.",
        "Lo script sync clienti esporta da MariaDB con deduplica automatica."
      ],
      "fixes": [
        "Corretto errore Dato troppo grande per archivio server.",
        "Corretto raddoppio clienti se import CSV viene eseguito due volte."
      ],
      "package": "KRM-1.2.1-CLIENTI-SYNC-FIX.zip"
    },
    {
      "version": "1.2.0",
      "date": "2026-06-28",
      "channel": "clienti MariaDB / backup NAS",
      "title": "Sync clienti MariaDB verso API e backup QNAP corretto",
      "changes": [
        "Script QNAP sync-clienti-store-da-mariadb.sh per riallineare Clienti da MariaDB alla lista API.",
        "Check check-clienti-mariadb-store.sh per verificare conteggi MariaDB e API.",
        "Import CSV clienti integrato nel pacchetto principale con docker run -i e collation MariaDB corretta.",
        "Backup QNAP corretto: funziona da host NAS e da container backup.",
        "About e storico versione aggiornati a 1.2.0."
      ],
      "fixes": [
        "Evita lista Clienti vuota dopo import diretto in MariaDB.",
        "Evita errore /backups permission denied quando backup-qnap.sh viene lanciato da host.",
        "Restore protetto da conferma esplicita."
      ],
      "package": "KRM-1.2-CLIENTI-MARIADB-BACKUP.zip"
    },
    {
      "version": "1.1.0",
      "date": "2026-06-28",
      "channel": "integrazioni operative",
      "title": "DDT reale Fatture in Cloud con AI preview e conferma",
      "changes": [
        "Assistente AI operativo per preparare anteprime DDT da testo naturale.",
        "Nuovi endpoint backend /api/fic/status, /api/ai/ddt/preview e /api/fic/ddt/create.",
        "Creazione reale DDT su Fatture in Cloud se .env contiene company id, access token e flag espliciti.",
        "Dry-run protetto quando Fatture in Cloud non è ancora configurato.",
        "Token Fatture in Cloud solo backend, mai nel frontend.",
        "Script QNAP check-fatture-in-cloud-ddt.sh."
      ],
      "fixes": [
        "DDT limitato a documentType delivery_note.",
        "Blocca fatture, preventivi, ricevute, proforme, ordini e altri documenti non DDT.",
        "Conferma utente obbligatoria prima della creazione.",
        "Log completo di anteprima, dry-run, invio reale ed errori."
      ],
      "package": "KRM-1.1-INTEGRAZIONI-OPERATIVE-FIC-AI.zip"
    },
    {
      "version": "1.0.2",
      "date": "2026-06-28",
      "channel": "UI clienti e integrazioni controllate",
      "title": "Clienti paginati, stress test NAS, DDT solo delivery_note ed Email lavoro predisposta",
      "changes": [
        "La sezione Clienti usa ricerca/paginazione backend quando disponibile, con debounce e limite risultati.",
        "Aggiunto script QNAP genera-clienti-stress-test.sh per provare archivi grandi senza inserire clienti reali.",
        "Predisposta integrazione limitata DDT: consentito solo documentType delivery_note.",
        "Nei Rapporti intervento aggiunti pulsanti Crea DDT e Collega DDT esistente.",
        "Aggiunte tabelle MariaDB per DDT: connessioni, collegamenti e log.",
        "Aggiunta pagina Email lavoro con regole mittenti/parole chiave in modalità predisposizione sicura.",
        "Aggiunte tabelle MariaDB per automazioni Gmail/Calendar future."
      ],
      "fixes": [
        "Nessuna funzione fatture/preventivi/ricevute/proforme/ordini viene esposta agli utenti operativi.",
        "La creazione/collegamento DDT richiede conferma e viene registrata nei log.",
        "La lettura Gmail reale resta disabilitata finché non viene configurato OAuth backend con token cifrati."
      ],
      "package": "KRM-1.0.2-UI-CLIENTI-DDT-STRESS.zip"
    },
    {
      "version": "1.0.1",
      "date": "2026-06-28",
      "channel": "ottimizzazione NAS",
      "title": "Clienti grandi archivi e test anti-sovraccarico",
      "changes": [
        "Aggiunti endpoint /api/clients e /api/clients/search con paginazione e limiti.",
        "La lista clienti lato backend usa massimo 50 record per pagina.",
        "La ricerca rapida parte solo da 3 caratteri e restituisce massimo 20 risultati.",
        "Aggiunto controllo doppioni cliente su telefono, cellulare, email, partita IVA e codice fiscale.",
        "Aggiunta migrazione 0007 con indici clienti e campi normalizzati.",
        "Aggiunti script QNAP applica-indici-clienti.sh e test-carico-nas.sh."
      ],
      "fixes": [
        "Evita caricamenti completi inutili dell'archivio clienti nei nuovi endpoint.",
        "Prepara il gestionale a migliaia o decine di migliaia di clienti.",
        "Aggiunge verifiche anti-sovraccarico su NAS, MariaDB, container e sync background."
      ],
      "package": "PACCHETTO-K-RM-1.0.1-OTTIMIZZAZIONE-CLIENTI-NAS.zip"
    },
    {
      "version": "1.0.0",
      "date": "2026-06-28",
      "channel": "produzione NAS",
      "title": "Preflight finale e produzione controllata",
      "changes": [
        "Aggiornato server a K RM 1.0.0.",
        "Aggiunto script preflight-produzione.sh con controllo finale su app, database, sync, backup e sicurezza.",
        "Aggiunto script attiva-produzione-controllata.sh con conferma esplicita.",
        "La modalità produzione richiede token API, HTTPS, database, cifratura e backend autenticazione configurati.",
        "Aggiornati manifest, About e release notes."
      ],
      "fixes": [
        "Riduce il rischio di avviare produzione senza backup o senza container attivi.",
        "Blocca il deploy produzione se esistono criticità rilevanti.",
        "Mantiene passaggio controllato da test/pre-produzione a produzione reale."
      ],
      "package": "PACCHETTO-K-RM-1.0-PRODUZIONE-NAS.zip"
    },
    {
      "version": "0.9.0",
      "date": "2026-06-28",
      "channel": "sicurezza reale",
      "title": "Hardening NAS, rate limit e check produzione",
      "changes": [
        "Aggiornato server a K RM 0.9.0.",
        "Aggiunto endpoint /api/security/status per verificare stato sicurezza e requisiti produzione.",
        "Rafforzato rate limit per categorie API: scritture, allegati, check e API generali.",
        "Aggiunti script QNAP check-sicurezza-09.sh e prepara-produzione-sicura.sh.",
        "Aggiornati cookie tecnici sessione, header sicurezza e controlli produzione."
      ],
      "fixes": [
        "Rimosso warning Python utcnow nei log.",
        "La modalità produzione resta bloccata se mancano token API, HTTPS, database, cifratura o backend auth.",
        "La preparazione pre-produzione non forza KRM_ENV=production per evitare blocchi accidentali durante i test."
      ],
      "package": "PACCHETTO-K-RM-BETA-0.9.0-SICUREZZA-REALE.zip"
    },
    {
      "version": "0.8.1",
      "date": "2026-06-28",
      "channel": "fase A dati",
      "title": "Backend bulk, sync QNAP corretto e pulizia dati test",
      "changes": [
        "Aggiunti endpoint bulk per sincronizzare liste complete Clienti e Ticket verso il backend.",
        "Il frontend invia Clienti/Ticket anche alle API backend dedicate, mantenendo fallback local-store.",
        "Corretto avvio sync database QNAP senza nohup.",
        "Aggiunto script pulisci-dati-test.sh per rimuovere solo record test-client-* e test-ticket-*."
      ],
      "fixes": [
        "Riduce la dipendenza dal solo localStorage durante la transizione database.",
        "Evita errore nohup non disponibile su QNAP.",
        "Permette di pulire i dati creati dai test senza toccare clienti e ticket reali."
      ],
      "package": "PACCHETTO-K-RM-BETA-0.8.1-FASE-A-DATI.zip"
    },
    {
      "version": "0.8.0",
      "date": "2026-06-28",
      "channel": "backend CRUD",
      "title": "Primo backend CRUD server-side Clienti/Ticket",
      "changes": [
        "Aggiunti endpoint GET /api/backend/clients e /api/backend/tickets.",
        "Aggiunti endpoint POST upsert/delete per Clienti e Ticket.",
        "Aggiunto ServerCrudBridge con validazione minima e log sicurezza.",
        "Aggiunto test-backend-crud.sh per verifica NAS."
      ],
      "fixes": [
        "Prepara il passaggio del frontend da localStorage diretto ad API server.",
        "Mantiene fallback local-store e sincronizzazione MariaDB per evitare perdita dati.",
        "Aggiunge cancellazione logica con deletedAt/deletedBy."
      ],
      "package": "PACCHETTO-K-RM-BETA-0.8.0-BACKEND-CRUD-CLIENTI-TICKET.zip"
    },
    {
      "version": "0.7.6",
      "date": "2026-06-28",
      "channel": "stabilizzazione NAS",
      "title": "Check pre-produzione, backup e stato database",
      "changes": [
        "Aggiunto check-pre-produzione.sh per controllare ambiente NAS, token, HTTPS, Docker, DB, sync e backup.",
        "Aggiunto backup-versione-corrente.sh per salvare il pacchetto senza includere database e cartelle runtime.",
        "Aggiunto stato-database-operativo.sh per verificare conteggi e ultimi run MariaDB.",
        "Mantenuta protezione anti-chiusura accidentale modali introdotta in 0.7.5."
      ],
      "fixes": [
        "Riduce il rischio di procedere verso produzione senza backup o sync attivo.",
        "Rende più chiaro se il NAS è in modalità test o produzione.",
        "Permette controlli rapidi dopo prove da PC, iPhone e Windows."
      ],
      "package": "PACCHETTO-K-RM-BETA-0.7.6-STABILIZZAZIONE-NAS-DB-SICUREZZA.zip"
    },
    {
      "version": "0.7.5",
      "date": "2026-06-28",
      "channel": "database sync continuo",
      "title": "Sincronizzazione continua MariaDB Clienti/Ticket",
      "changes": [
        "Aggiunto sync database continuo in background sul NAS.",
        "Aggiunto script sync-database-continuo.sh.",
        "Aggiunti comandi avvia/stop/stato sync database.",
        "sincronizza-database-fase1.sh ora funziona sia da SSH sia da script automatico.",
        "Aggiunto parametro KRM_DB_SYNC_INTERVAL_SECONDS configurabile.",
        "Blocco globale della chiusura accidentale modali tramite click sullo sfondo.",
        "Conferma per dati non salvati su X/Annulla."
      ],
      "fixes": [
        "Evita di lanciare manualmente la sincronizzazione dopo ogni test.",
        "Mantiene compatibilità con local-store.json come fallback.",
        "Usa lo stesso ponte Fase 1 già testato sul NAS.",
        "Riduce il rischio di perdita dati durante compilazione ticket, clienti, riparazioni e rapporti."
      ],
      "package": "PACCHETTO-K-RM-BETA-0.7.5-CRUD-CLIENTI-TICKET-MARIADB.zip"
    },
    {
      "version": "0.7.4",
      "date": "2026-06-28",
      "channel": "chiusura fase 1 database",
      "title": "Sincronizzazione unica database moduli principali",
      "changes": [
        "Aggiunta migrazione 0006 per moduli rimanenti.",
        "Aggiunto endpoint /api/database/export-phase1-sql.",
        "Aggiunto script NAS unico sincronizza-database-fase1.sh.",
        "Aggiunto check finale check-fase1-database.sh.",
        "Riallineamento unico per clienti, ticket, riparazioni, cortesia, noleggio, monitoraggio, promemoria e rapporti intervento."
      ],
      "fixes": [
        "Riduce il numero di comandi NAS da lanciare manualmente.",
        "Mantiene fallback local-store.json e archivio centrale raw.",
        "Aggiunge conteggi finali per tutte le tabelle principali."
      ],
      "package": "PACCHETTO-K-RM-BETA-0.7.4-CHIUSURA-FASE1-DATABASE.zip"
    },
    {
      "version": "0.7.3",
      "date": "2026-06-28",
      "channel": "fase 1 database + ticket",
      "title": "Riparazioni DB e riassegnazione ticket",
      "changes": [
        "Aggiunta riassegnazione ticket direttamente nella scheda ticket.",
        "La riassegnazione richiede permesso assignTickets e nota obbligatoria.",
        "Lo storico ticket registra vecchi e nuovi assegnatari.",
        "Aggiunta migrazione 0005 per repairs e repair_devices.",
        "Aggiunti script NAS materializza-riparazioni.sh e check-riparazioni-db.sh."
      ],
      "fixes": [
        "Aggiornamento badge/colori assegnatario dopo cambio assegnazione.",
        "Mantiene fallback local-store.json e archivio centrale krm_central_records.",
        "Materializzazione idempotente tramite source_id."
      ],
      "package": "PACCHETTO-K-RM-BETA-0.7.3-RIPARAZIONI-DB-RIASSEGNAZIONE.zip"
    },
    {
      "version": "0.7.2",
      "date": "2026-06-28",
      "channel": "fase 1 database centrale",
      "title": "Database centrale per moduli principali",
      "changes": [
        "Aggiunta tabella krm_central_records per centralizzare tutti i moduli principali in MariaDB.",
        "Aggiunta migrazione 0004_central_records_all_modules.sql.",
        "Aggiunto endpoint /api/database/export-central-sql.",
        "Aggiunto script QNAP centralizza-dati-principali.sh.",
        "Aggiunto script QNAP check-database-centrale.sh."
      ],
      "fixes": [
        "Mantiene Clienti/Ticket anche nelle tabelle reali clients/tickets.",
        "Mantiene local-store.json come fallback di sicurezza.",
        "Permette di verificare da NAS quanti record per modulo sono stati centralizzati."
      ],
      "package": "PACCHETTO-K-RM-BETA-0.7.2-FASE1-DATABASE-CENTRALE.zip"
    },
    {
      "version": "0.7.1",
      "date": "2026-06-28",
      "channel": "CRUD centrale progressivo",
      "title": "Sincronizzazione centrale Clienti/Ticket tra dispositivi",
      "changes": [
        "Rafforzato ponte backend NAS per flussoTickets e flussoClients.",
        "Aggiunto polling leggero ogni 15 secondi per aggiornare Ticket e Clienti aperti su altri dispositivi.",
        "Dashboard/Ticket e Clienti si ridisegnano quando il backend NAS segnala dati aggiornati.",
        "Docker Compose QNAP corretto: mount app non più read-only per evitare errore /app/server/data read-only.",
        "Mantenuta materializzazione MariaDB 0.7.0 su tabelle clients/tickets."
      ],
      "fixes": [
        "Riduce il problema dei dispositivi che sembrano ognuno a sé.",
        "Evita il fix manuale sed sul docker-compose.yml dopo ogni aggiornamento.",
        "Mantiene local-store.json come fallback e MariaDB come copia reale progressiva."
      ],
      "package": "PACCHETTO-K-RM-BETA-0.7.1-CRUD-CENTRALE-CLIENTI-TICKET.zip"
    },
    {
      "version": "0.7.0",
      "date": "2026-06-28",
      "channel": "database reale progressivo",
      "title": "Clienti e Ticket materializzati in tabelle MariaDB reali",
      "changes": [
        "Aggiunta migrazione 0003 per preparare colonne source_id, source_hash e source_json sulle tabelle clients e tickets.",
        "Aggiunto endpoint /api/database/materialize-plan per verificare la materializzazione prevista.",
        "Aggiunto endpoint /api/database/export-materialize-sql per generare SQL controllato Clienti/Ticket.",
        "Aggiunto script QNAP materializza-clienti-ticket.sh.",
        "Aggiornato check-mariadb-clienti-ticket.sh per mostrare conteggi reali clients/tickets e ponte fallback."
      ],
      "fixes": [
        "Mantiene local-store.json come fallback di sicurezza.",
        "Evita duplicati tramite source_id univoco per dati importati.",
        "Mantiene /share/KRM/db condiviso tra versioni."
      ],
      "package": "PACCHETTO-K-RM-BETA-0.7.0-DB-REALE-CLIENTI-TICKET.zip"
    },
    {
      "version": "0.6.3",
      "date": "2026-06-28",
      "channel": "sicurezza NAS test",
      "title": "Token API configurato senza bloccare la web app",
      "changes": [
        "Aggiunto script QNAP abilita-sicurezza-test.sh.",
        "Aggiunto script QNAP check-sicurezza-nas.sh.",
        "Il token API può essere configurato in test senza diventare automaticamente obbligatorio.",
        "In produzione il token resta obbligatorio tramite KRM_ENV=production o KRM_REQUIRE_API_TOKEN=1.",
        "Aggiornati messaggi avvio server e pre-check sicurezza."
      ],
      "fixes": [
        "Evita che la sola presenza di KRM_API_TOKEN mandi le API frontend in 403 durante i test.",
        "Rimuove l’avviso LAN senza token quando il token è configurato.",
        "Mantiene database condiviso /share/KRM/db e fallback NAS."
      ],
      "package": "PACCHETTO-K-RM-BETA-0.6.3-SICUREZZA-NAS-TEST.zip"
    },
    {
      "version": "0.6.2",
      "date": "2026-06-28",
      "channel": "database QNAP condiviso",
      "title": "MariaDB persistente tra versioni",
      "changes": [
        "Docker Compose ora monta MariaDB su /share/KRM/db invece di ./db della singola versione.",
        "Aggiunta creazione automatica cartella /share/KRM/db in setup-qnap.sh.",
        "Aggiunto controllo /share/KRM/db in check-qnap.sh.",
        "Aggiunto script stato-db-condiviso.sh per verificare il database condiviso.",
        "Mantenuti ponte Clienti/Ticket e fallback local-store.json."
      ],
      "fixes": [
        "Corretto il problema per cui ogni nuova versione poteva vedere un database MariaDB vuoto.",
        "Ridotto il rischio di dover reimportare a ogni aggiornamento.",
        "Versione e pre-check aggiornati a 0.6.2."
      ],
      "package": "PACCHETTO-K-RM-BETA-0.6.2-DB-QNAP-CONDIVISO.zip"
    },
    {
      "version": "0.6.1",
      "date": "2026-06-28",
      "channel": "database MariaDB progressivo",
      "title": "Ponte lettura Clienti/Ticket con fallback NAS",
      "changes": [
        "Aggiunta API /api/database/readiness per controllare la sorgente lettura Clienti/Ticket.",
        "Aggiunte API /api/database/entities/clients e /api/database/entities/tickets.",
        "Aggiunta sezione Stato lettura Clienti/Ticket in Aggiornamenti sistema.",
        "Aggiunto script QNAP check-mariadb-clienti-ticket.sh per verificare la copia MariaDB.",
        "Pre-check aggiornato per controllare il ponte Clienti/Ticket."
      ],
      "fixes": [
        "Mantiene local-store.json come fallback sicuro.",
        "Evita passaggio forzato a MariaDB senza driver/CRUD completi.",
        "Messaggi QNAP e changelog aggiornati alla versione 0.6.1."
      ],
      "package": "PACCHETTO-K-RM-BETA-0.6.1-CLIENTI-TICKET-MARIADB-FALLBACK.zip"
    },
    {
      "version": "0.6.0",
      "date": "2026-06-28",
      "channel": "database MariaDB",
      "title": "Migrazione controllata verso MariaDB",
      "changes": [
        "Aggiunta sezione Migrazione controllata MariaDB nella pagina Aggiornamenti sistema.",
        "Aggiunto endpoint /api/database/plan per verificare cosa verrà importato.",
        "Aggiunto export SQL controllato da local-store.json verso tabelle ponte MariaDB.",
        "Aggiunto script QNAP import-localstore-to-mariadb.sh con backup automatico prima dell’import.",
        "Aggiunte tabelle schema_migrations, krm_migration_runs e krm_local_store_records."
      ],
      "fixes": [
        "La migrazione non cancella local-store.json e mantiene fallback sicuro.",
        "Versione e pre-check aggiornati a 0.6.0 per evitare confusione sul NAS.",
        "SQL generato compatibile con MariaDB senza cast JSON fragile."
      ],
      "package": "PACCHETTO-K-RM-BETA-0.6.0-MIGRAZIONE-MARIADB-CONTROLLATA.zip"
    },
    {
      "version": "0.5.61",
      "date": "2026-06-28",
      "channel": "archivio dati NAS",
      "title": "Archivio dati condiviso stabile tra versioni",
      "changes": [
        "Il Docker QNAP ora monta i dati applicativi su /share/KRM/data, condivisi tra versioni.",
        "Aggiunta sezione Archivio dati condiviso nella pagina Aggiornamenti sistema.",
        "Aggiunto controllo dell’archivio corrente con conteggi per ticket, clienti, riparazioni, cortesia, noleggio e altri moduli.",
        "Aggiunta scansione delle versioni precedenti per trovare vecchi local-store.json.",
        "Aggiunto import protetto da versione precedente con doppia conferma."
      ],
      "fixes": [
        "Ridotto il rischio di non vedere più i ticket dopo cambio pacchetto/versione.",
        "Prima di importare un archivio precedente viene creato un backup automatico dell’archivio corrente.",
        "Aggiunto avviso evidente se l’archivio corrente è vuoto."
      ],
      "package": "PACCHETTO-K-RM-PRE-BETA-0.5.61-ARCHIVIO-DATI-CONDIVISO.zip"
    },
    {
      "version": "0.5.60",
      "date": "2026-06-28",
      "channel": "UI audio notifiche",
      "title": "Impostazioni audio nel menu laterale e pannello chiudibile",
      "changes": [
        "Aggiunta voce Audio notifiche nel menu laterale della Dashboard.",
        "Le impostazioni audio sono accessibili in modo diretto senza dipendere dal banner superiore.",
        "Aggiunto pulsante evidente X nel pannello impostazioni audio.",
        "Aggiunti pulsanti Chiudi e Salva e chiudi in fondo al pannello.",
        "Aggiunta chiusura rapida con tasto Escape."
      ],
      "fixes": [
        "Corretto il problema del pannello audio che poteva restare aperto senza uscita evidente.",
        "La configurazione audio resta modificabile liberamente dall'utente in qualsiasi momento.",
        "Migliorata usabilità del pannello su desktop e mobile."
      ],
      "package": "PACCHETTO-K-RM-PRE-BETA-0.5.60-IMPOSTAZIONI-AUDIO-MENU.zip"
    },
    {
      "version": "0.5.59",
      "date": "2026-06-28",
      "channel": "audio notifiche",
      "title": "Libreria suoni notifiche e audio personalizzabili",
      "changes": [
        "Generata libreria iniziale di suoni originali in formato WAV nella cartella sito/sounds.",
        "Aggiunti audio brevi per welcome, success, new-ticket, new-message, ticket-assigned, completed, closed, warning ed error.",
        "Le impostazioni audio permettono ora di scegliere quale suono usare per ogni evento.",
        "Aggiunta anteprima audio per ogni evento direttamente dal pannello impostazioni.",
        "Aggiunto upload di audio personalizzato per evento con ritorno all'audio standard."
      ],
      "fixes": [
        "I suoni restano opzionali e partono solo dopo attivazione/interazione utente.",
        "Validazione upload audio: WAV/MP3/OGG, dimensione limitata, durata breve e nessun loop.",
        "Se il file audio non viene riprodotto dal browser resta disponibile il fallback Web Audio."
      ],
      "package": "PACCHETTO-K-RM-PRE-BETA-0.5.59-LIBRERIA-SUONI-NOTIFICHE.zip"
    },
    {
      "version": "0.5.58",
      "date": "2026-06-27",
      "channel": "PWA, feedback e dashboard operativa",
      "title": "Feedback audio PWA e popup operativo Dashboard",
      "changes": [
        "Aggiunto centro feedback audio opzionale e configurabile per utente.",
        "Aggiunto pulsante Attiva feedback audio per sbloccare i suoni su Android/iPhone dopo il primo tap.",
        "Aggiunti suoni brevi per salvataggi, errori, nuovi ticket, messaggi, ticket assegnati e pratiche completate.",
        "Aggiunto popup operativo Dashboard con riepilogo di ticket assegnati, ticket urgenti, messaggi non letti e pratiche al 100%.",
        "Aggiunte funzioni Rimanda 1 ora, Rimanda 3 ore, Domani e Non mostrare più oggi per singolo utente."
      ],
      "fixes": [
        "Il sistema non usa audio automatico senza interazione utente, rispettando i limiti dei browser mobile.",
        "Aggiunto limite anti-spam per evitare suoni ravvicinati.",
        "Le preferenze audio sono salvate per singolo utente e dispositivo.",
        "Il popup compare solo se ci sono avvisi reali o se aperto manualmente."
      ],
      "package": "PACCHETTO-K-RM-PRE-BETA-0.5.58-FEEDBACK-AUDIO-POPUP-DASHBOARD.zip"
    },
    {
      "version": "0.5.57",
      "date": "2026-06-27",
      "channel": "pre-migrazione MariaDB",
      "title": "Diagnosi archivio centrale ed export dati",
      "changes": [
        "Aggiunta sezione Diagnosi archivio e pre-migrazione MariaDB nella pagina Aggiornamenti sistema.",
        "Aggiunti endpoint /api/migration/diagnose e /api/migration/simulate per analisi non distruttiva.",
        "Aggiunto export archivio completo JSON e CSV per singolo modulo.",
        "La diagnosi conta clienti, ticket, riparazioni, cortesia, noleggio, monitoraggio, promemoria, rapporti, chat e workflow.",
        "La simulazione segnala avvisi/errori senza scrivere su MariaDB."
      ],
      "fixes": [
        "La migrazione MariaDB resta disattivata: nessuna modifica automatica ai dati reali.",
        "Aggiunti controlli su record mancanti, duplicati e dati incompleti prima della futura migrazione.",
        "Aggiornati server, manifest, About e storico versioni alla 0.5.57."
      ],
      "package": "PACCHETTO-K-RM-PRE-BETA-0.5.57-DIAGNOSI-PRE-MIGRAZIONE.zip"
    },
    {
      "version": "0.5.56.1",
      "date": "2026-06-27",
      "channel": "patch UI NAS",
      "title": "Feedback visibile su Aggiorna stato NAS",
      "changes": [
        "Il pulsante Aggiorna stato NAS ora mostra lo stato Aggiornamento mentre lavora.",
        "Aggiunta riga di feedback con ultimo aggiornamento riuscito e numero backup presenti.",
        "Aggiunto toast di conferma quando lo stato NAS viene aggiornato correttamente.",
        "In caso di errore viene mostrato un messaggio rosso chiaro nella sezione NAS."
      ],
      "fixes": [
        "Corretto il problema per cui l'utente non capiva se Aggiorna stato NAS avesse funzionato.",
        "Aggiornati manifest, server, pre-check e storico versioni alla 0.5.56.1."
      ],
      "package": "PACCHETTO-K-RM-PRE-BETA-0.5.56.1-FEEDBACK-STATO-NAS.zip"
    }
  ],
  "versions": [
    {
      "version": "1.54.0",
      "title": "Check finale stabile",
      "date": "2026-07-07",
      "type": "stabilizzazione",
      "notes": [
        "Aggiunti tutti gli script check con nome versione corrente 1.54.0.",
        "Aggiunto wrapper unico check-finale-stabile-1.54.0.sh.",
        "Il wrapper esegue backup root-safe, security policy, pending, ticket MariaDB e assegnatari.",
        "Nessuna modifica a dati, database, ticket, clienti o schema."
      ]
    },
    {
      "version": "1.52.0",
      "title": "Checkpoint backup root-safe",
      "date": "2026-07-07",
      "type": "backup",
      "notes": [
        "Checkpoint backup via container root per allegati cifrati.",
        "Verifica archivio dati leggibile e confronto allegati cifrati filesystem vs archivio."
      ]
    },
    {
      "version": "1.51.0",
      "title": "Check sicurezza policy stabile",
      "date": "2026-07-07",
      "type": "sicurezza",
      "notes": [
        "Check QNAP enforcement reale security-policy.json.",
        "Verifica API protette, cookie sessione, header sicurezza e vault allegati cifrati."
      ]
    },
    {
      "version": "1.50.0",
      "title": "Consolidamento assegnatari ticket e check regressione",
      "date": "2026-07-07",
      "type": "stabilizzazione",
      "notes": [
        "Normalizzazione backend unica per assegnatario principale ticket.",
        "Campo canonico primaryTechnicianId con alias legacy mantenuti.",
        "Rimosso doppio salvataggio local-store residuo nel fallback ticket.",
        "Aggiunto check QNAP per coerenza alias assegnatario."
      ]
    },
    {
      "version": "1.49.2",
      "title": "Fix pending moduli e HTTPS booleano",
      "date": "2026-07-07",
      "type": "fix",
      "notes": [
        "Rimosso errore runtime Richiesta API asincrona in corso.",
        "Aggiunta richiesta async reale per moduli frontend.",
        "Corretto controllo booleano KRM_EXPECT_HTTPS con flag obbligatorieta HTTPS separato."
      ]
    },
    {
      "version": "1.42.0",
      "date": "2026-07-05",
      "channel": "produzione operativa controllata",
      "title": "UI floating e accessibilità riparazioni",
      "summary": "Pulsanti flottanti help/chat consolidati in una pila unica responsive.",
      "package": "KRM-1.42.0-UI-FLOATING-ACCESSIBILITA.zip"
    },
    {
      "version": "1.41.0",
      "date": "2026-07-05",
      "channel": "produzione operativa controllata",
      "title": "2FA ricorda dispositivo 24 ore",
      "package": "KRM-1.41.0-2FA-RICORDA-DISPOSITIVO.zip",
      "summary": "Login produzione con opzione Ricorda questo dispositivo per 24 ore dopo verifica 2FA."
    },
    {
      "version": "1.40.0",
      "date": "2026-07-05",
      "channel": "produzione operativa controllata",
      "title": "Monitoraggio Kuma firewall-safe",
      "package": "KRM-1.40.0-KUMA-ZYXEL-FIREWALL-SAFE.zip",
      "summary": "Jitter sui check monitor, rilevamento blocco di massa firewall e backoff."
    },
    {
      "version": "1.35.0",
      "date": "2026-07-03",
      "channel": "produzione operativa controllata",
      "title": "Stabilizzazione dati moduli",
      "summary": "Dashboard e widget operativi leggono dati da API server per monitoraggio, promemoria e rapporti.",
      "package": "KRM-1.35.0-SYNC-MONITOR-KUMA.zip"
    },
    {
      "version": "1.32.0",
      "date": "2026-07-03",
      "channel": "produzione operativa controllata",
      "title": "Ticket interno o esterno",
      "summary": "Nel pulsante Nuovo ticket ora si sceglie ticket esterno collegato al cliente oppure ticket interno senza cliente obbligatorio. Inclusi check operativo e checkpoint.",
      "package": "KRM-1.32.0-TICKET-INTERNO-ESTERNO.zip"
    },
    {
      "version": "1.11.0",
      "date": "2026-06-29",
      "channel": "sicurezza accessi",
      "title": "Gestione accessi da interfaccia",
      "notes": [
        "Pannello Accessi reali nella pagina Utenti",
        "Creazione collaboratori da UI",
        "Reset password/2FA e codici monouso da UI",
        "Audit accessi da UI"
      ],
      "package": "KRM-1.11.0-UTENTI-AUTH-UI.zip"
    },
    {
      "version": "1.10.1",
      "date": "2026-06-29",
      "channel": "UI/Sicurezza",
      "title": "Responsive UI e login 2FA",
      "notes": [
        "Responsive globale",
        "Login proporzionato",
        "Checkbox codice monouso nel campo 2FA"
      ],
      "package": "KRM-1.10.1-RESPONSIVE-LOGIN-2FA.zip"
    },
    {
      "version": "1.10.0",
      "date": "2026-06-29",
      "channel": "sicurezza accessi",
      "title": "Utenti e codici monouso",
      "notes": [
        "Codici monouso 2FA",
        "Script QNAP utenti/collaboratori",
        "Hash PBKDF2 per codici di recupero"
      ],
      "package": "KRM-1.10.0-UTENTI-BACKUP-CODES.zip"
    },
    {
      "version": "1.9.1",
      "date": "2026-06-29",
      "channel": "sicurezza accessi",
      "title": "Fix Auth/2FA QNAP",
      "notes": [
        "Endpoint auth operativo",
        "Script QNAP senza stty",
        "Check sicurezza accessi più chiaro"
      ],
      "package": "KRM-1.9.1-FIX-AUTH-2FA-QNAP.zip"
    }
  ]
}
