[{"data":1,"prerenderedAt":1935},["ShallowReactive",2],{"docs-pages-it":3,"doc-it-changelog-sdk-dart":310},[4,9,15,20,25,30,35,41,52,60,69,77,85,93,97,106,110,118,123,128,133,139,144,149,154,159,164,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,255,261,266,270,275,280,285,290,295,300,305],{"path":5,"title":6,"description":7,"order":8,"group":8,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fpermissions","Chi può fare cosa","[object Object]",null,{"path":10,"title":11,"description":12,"order":13,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Finstallation","Installazione","Installa CloseYourIt sul tuo server con un solo comando.",1,"start",{"path":16,"title":17,"description":18,"order":19,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fsettings","Impostazioni","Ogni impostazione del file .env, a cosa serve e quali non vanno mai cambiate.",2,{"path":21,"title":22,"description":23,"order":24,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fdatabase","Database","Cos'è il database, cosa contiene, quanto restano i dati e quanto spazio occupa.",3,{"path":26,"title":27,"description":28,"order":29,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fupdates-and-backups","Aggiornamenti e backup","Aggiorna a una versione nuova, fai e ripristina il backup del database, controlla l'installazione.",4,{"path":31,"title":32,"description":33,"order":34,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Ftroubleshooting","Risolvere i problemi","Cosa controllare quando installazione, certificato, email o dati in arrivo non funzionano.",5,{"path":36,"title":37,"description":38,"order":39,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fconnect-your-apps","Collega le tue app","Tutti gli strumenti che mandano dati a CloseYourIt, e cosa raccoglie ognuno.",6,"connect",{"path":42,"title":43,"description":44,"order":45,"group":8,"parent":46,"package":47,"note":48,"collects":49,"status":8},"\u002Fdocs\u002Fsdk-ruby","Ruby \u002F Rails","La gemma closeyourit-ruby manda errori, log, query lente e metriche dei job da un'app Rails.",7,"connect-your-apps","closeyourit-ruby","Errori, log, query e metodi lenti, job in background.",{"errors":50,"logs":50,"performance":50,"visits":51,"servers":51},"full","none",{"path":53,"title":54,"description":55,"order":56,"group":8,"parent":46,"package":57,"note":58,"collects":59,"status":8},"\u002Fdocs\u002Fsdk-javascript","JavaScript","Il pacchetto @bussolabs\u002Fcloseyourit-js funziona nel browser e su Node 20.16 o più recente.",8,"@bussolabs\u002Fcloseyourit-js","Browser e Node, adattatori framework e query database dalla 0.13.0.",{"errors":50,"logs":50,"performance":50,"visits":50,"servers":51},{"path":61,"title":62,"description":63,"order":64,"group":8,"parent":46,"package":65,"note":66,"collects":67,"status":8},"\u002Fdocs\u002Fsdk-dart","Dart \u002F Flutter","Il pacchetto closeyourit cattura gli errori delle app Flutter, anche quando il telefono è senza rete.",9,"closeyourit","Errori, log e metriche pubblici dalla 0.9.3.",{"errors":50,"logs":68,"performance":68,"visits":51,"servers":51},"partial",{"path":70,"title":71,"description":72,"order":73,"group":8,"parent":46,"package":65,"note":74,"collects":75,"status":76},"\u002Fdocs\u002Fsdk-python","Python","Il pacchetto closeyourit manda errori, log e metriche da applicazioni Python lato server.",10,"Lato server. SQLAlchemy; query Django e FastAPI\u002FStarlette dalla 0.4.0.",{"errors":50,"logs":50,"performance":68,"visits":51,"servers":51},"pre_alpha",{"path":78,"title":79,"description":80,"order":81,"group":8,"parent":46,"package":82,"note":83,"collects":84,"status":8},"\u002Fdocs\u002Fsdk-sentry","SDK Sentry","Invia errori con un SDK Sentry compatibile; sessioni e crash hanno profili separati.",11,"Sentry SDK","Errori compatibili; sessioni e crash richiedono il profilo verificato.",{"errors":50,"logs":51,"performance":51,"visits":51,"servers":51},{"path":86,"title":87,"description":88,"order":89,"group":8,"parent":46,"package":90,"note":91,"collects":92,"status":8},"\u002Fdocs\u002Fagent-server","Agent per server","Un piccolo programma sul server che manda lo stato della macchina ogni 60 secondi.",12,"closeyourit-agent","CPU, memoria, dischi, rete, container e servizi.",{"errors":51,"logs":68,"performance":51,"visits":51,"servers":50},{"path":94,"title":95,"description":96,"order":89,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fnuxt","Vue e Nuxt","Collega gli errori del browser Nuxt e del server Nitro senza esporre un token segreto.",{"path":98,"title":99,"description":100,"order":101,"group":8,"parent":46,"package":102,"note":103,"collects":104,"status":105},"\u002Fdocs\u002Fagent-kubernetes","Kubernetes","Un osservatore in sola lettura del cluster: una copia sola per cluster.",13,"closeyourit-kube","Macchine, app ed eventi di errore del cluster.",{"errors":51,"logs":51,"performance":51,"visits":51,"servers":50},"coming",{"path":107,"title":108,"description":109,"order":101,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fopentelemetry","OpenTelemetry","Invia tracce, metriche e log dei server attraverso il ricevitore OTLP facoltativo.",{"path":111,"title":112,"description":113,"order":114,"group":8,"parent":46,"package":115,"note":116,"collects":117,"status":8},"\u002Fdocs\u002Fcli","CLI cyi","Il comando closeyourit, in breve cyi: gestisci progetti, errori e ticket dal terminale.",14,"@bussolabs\u002Fcloseyourit-cli","Non raccoglie dati: comanda CloseYourIt dal terminale.",{"errors":51,"logs":51,"performance":51,"visits":51,"servers":51},{"path":119,"title":120,"description":121,"order":122,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fhttp-api","API HTTP","Manda errori, log, metriche e visite con semplici richieste HTTP, senza un SDK.",15,{"path":124,"title":125,"description":126,"order":127,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fgithub-app","GitHub","Collega i repository GitHub a ticket e rilasci con una GitHub App tua.",16,{"path":129,"title":130,"description":131,"order":132,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fingest-gateway","Gateway di ingest","Tieni al sicuro errori, log e metriche in arrivo quando l'app è lenta o sta ripartendo.",17,{"path":134,"title":135,"description":136,"order":137,"group":138,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fai","AI","Accendi assistente, analisi, dettatura e ricerca intelligente con una chiave CloseYourIt AI o con il tuo provider.",18,"automation",{"path":140,"title":141,"description":142,"order":143,"group":138,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fautomator","Automator","Fai lavorare i ticket in automatico su una tua macchina Linux, con Claude Code, Codex o tutti e due.",19,{"path":145,"title":146,"description":147,"order":148,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fstack-coverage","Framework e copertura degli stack","Scegli un SDK pubblicato o verifica i limiti di un’integrazione provata localmente.",20,{"path":150,"title":151,"description":152,"order":153,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fmonitoring","Tracce, misure e sessioni","Esplora i nuovi segnali, confronta le versioni e ricostruisci le posizioni originali degli errori.",21,{"path":155,"title":156,"description":157,"order":158,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fnode-database","Database Node","Monitora query lente e ripetute con pg, mysql2, Drizzle e Prisma PostgreSQL.",22,{"path":160,"title":161,"description":162,"order":163,"group":138,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fclaude-code","Claude Code","CloseYourIt dentro Claude Code, in una colonna accanto alla conversazione con produzione e i tuoi ticket aperti.",23,{"path":165,"title":166,"description":167,"order":168,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Ftickets","Ticket e idee","Apri e segui i ticket sulla bacheca, raccoglili in milestone, fai domande e trasforma le idee votate in lavoro.",30,"use",{"path":171,"title":172,"description":173,"order":174,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Ferrors","Errori","Come gli errori delle tue app diventano righe uniche, e come risolverli, ignorarli, fonderli o trasformarli in ticket.",31,{"path":176,"title":177,"description":178,"order":179,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fperformance","Performance","Trova le query e i metodi lenti, leggi i problemi riconosciuti da soli e ricevi un avviso quando ne compare uno.",32,{"path":181,"title":182,"description":183,"order":184,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Flogs","Log","Cerca i messaggi delle tue app, segui una richiesta dall'inizio alla fine e collega un messaggio a un errore o a un ticket.",33,{"path":186,"title":187,"description":188,"order":189,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fsecrets","Segreti","Password, chiavi e file riservati in un posto solo, per progetto e ambiente, letti dall'app senza un .env sul disco.",34,{"path":191,"title":192,"description":193,"order":194,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fservers","Server","Lo stato delle tue macchine in una pagina, con lo storico e gli avvisi quando qualcosa si rompe o si sta riempiendo.",35,{"path":196,"title":197,"description":198,"order":199,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fuptime","Uptime","Controlla che i tuoi siti rispondano, tiene il conto dei guasti e li mostra ai clienti su una pagina di stato.",36,{"path":201,"title":202,"description":203,"order":204,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fcrons","Lavori programmati","Accorgersi quando un lavoro che deve partire da solo smette di partire, o parte e finisce male.",37,{"path":206,"title":207,"description":208,"order":209,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Falerts","Avvisi","Le regole che fanno nascere un avviso, il centro notifiche e dove ognuno sceglie di riceverli.",38,{"path":211,"title":212,"description":213,"order":214,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fhelpdesk","Assistenza","Chi visita il sito di un progetto scrive al team con il bottone «Serve aiuto?», e la richiesta arriva nel progetto giusto.",39,{"path":216,"title":217,"description":218,"order":219,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fanalytics","Statistiche del sito","Quante persone visitano il sito, cosa guardano e da dove arrivano, senza cookie.",40,{"path":221,"title":222,"description":223,"order":224,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Freplays","Session replay","Registra la navigazione di chi usa il sito e la riguardi come un video, anche accanto a un errore.",41,{"path":226,"title":227,"description":228,"order":229,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Freleases","Release","Le versioni che girano in ogni ambiente, legate ai tag di GitHub, e gli errori che tornano dopo una correzione.",42,{"path":231,"title":232,"description":233,"order":234,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fvulnerabilities","Vulnerabilità","I problemi di sicurezza noti nelle librerie dei tuoi progetti e i linguaggi che non ricevono più correzioni.",43,{"path":236,"title":237,"description":238,"order":239,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fseo","SEO","CloseYourIt visita i tuoi siti come un motore di ricerca e ti dice cosa impedisce alle pagine di essere trovate.",44,{"path":241,"title":242,"description":243,"order":244,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fknowledge","Knowledge base","Scrivi note, decisioni e guide dei progetti, ritrovale per significato e fai domande con le fonti.",45,{"path":246,"title":247,"description":248,"order":249,"group":169,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fagents","Agenti AI","Quali ticket prendono gli agenti, cosa ti consegnano, dove decidi tu e come si misura ogni macchina.",46,{"path":251,"title":252,"description":253,"order":254,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog","Versioni","Ogni sistema di CloseYourIt con la sua ultima versione, e le note di ogni rilascio.",50,{"path":256,"title":257,"description":258,"order":259,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-app","App","Tutte le versioni stabili di App, dalla più recente.",51,"changelog",{"path":262,"title":263,"description":264,"order":265,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-cli","Riga di comando (cyi)","Tutte le versioni stabili di Riga di comando (cyi), dalla più recente.",52,{"path":267,"title":141,"description":268,"order":269,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-automator","Tutte le versioni stabili di Automator, dalla più recente.",53,{"path":271,"title":272,"description":273,"order":274,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-agent-server","Agente per server","Tutte le versioni stabili di Agente per server, dalla più recente.",54,{"path":276,"title":277,"description":278,"order":279,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-agent-kubernetes","Agente Kubernetes","Tutte le versioni stabili di Agente Kubernetes, dalla più recente.",55,{"path":281,"title":282,"description":283,"order":284,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-sdk-javascript","SDK JavaScript","Tutte le versioni stabili di SDK JavaScript, dalla più recente.",56,{"path":286,"title":287,"description":288,"order":289,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-sdk-ruby","SDK Ruby","Tutte le versioni stabili di SDK Ruby, dalla più recente.",57,{"path":291,"title":292,"description":293,"order":294,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-sdk-python","SDK Python","Tutte le versioni stabili di SDK Python, dalla più recente.",58,{"path":296,"title":297,"description":298,"order":299,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-sdk-dart","SDK Dart","Tutte le versioni stabili di SDK Dart, dalla più recente.",59,{"path":301,"title":302,"description":303,"order":304,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-skills","Skill per assistenti AI","Tutte le versioni stabili di Skill per assistenti AI, dalla più recente.",60,{"path":306,"title":307,"description":308,"order":309,"group":8,"parent":260,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-site","Sito e documentazione","Tutte le versioni stabili di Sito e documentazione, dalla più recente.",61,{"id":311,"title":297,"body":312,"collects":8,"description":298,"extension":1929,"group":8,"meta":1930,"navigation":1931,"note":8,"order":299,"package":8,"parent":260,"path":296,"seo":1932,"status":8,"stem":1933,"__hash__":1934},"docs_it\u002Fdocs\u002Fchangelog-sdk-dart.md",{"type":313,"value":314,"toc":1907},"minimark",[315,320,327,337,341,346,379,383,387,395,399,402,406,414,418,421,425,433,437,440,445,453,457,461,469,473,478,486,490,494,518,522,526,534,538,546,551,559,563,567,575,579,583,656,661,719,723,727,948,952,994,998,1002,1037,1041,1086,1091,1114,1118,1237,1241,1255,1259,1263,1403,1407,1557,1561,1565,1612,1616,1629,1633,1637,1724,1728,1732,1756,1760,1809,1813,1818,1822],[316,317,319],"h2",{"id":318},"_0101-2026-10-07","0.10.1 · 2026-10-07",[321,322,323],"p",{},[324,325,326],"strong",{},"Corretto",[328,329,330],"ul",{},[331,332,333,336],"li",{},[324,334,335],{},"Nessun cambiamento funzionale."," Riallinea il README alla versione pubblicata; la 0.10.0 non è stata pubblicata su pub.dev e questa versione ne include le correzioni.",[316,338,340],{"id":339},"_0100-2026-10-07","0.10.0 · 2026-10-07",[321,342,343],{},[324,344,345],{},"Sicurezza",[328,347,348],{},[331,349,350,353,354,358,359,362,363,366,367,370,371,374,375,378],{},[324,351,352],{},"Token mai in chiaro fuori da localhost."," Con un ",[355,356,357],"code",{},"token",", un endpoint ",[355,360,361],{},"http:\u002F\u002F"," è rifiutato in ogni ambiente, non solo in ",[355,364,365],{},"production","; restano ammessi ",[355,368,369],{},"localhost",", ",[355,372,373],{},"127.0.0.1"," e ",[355,376,377],{},"::1",". Il README avvisa che la coda offline su Android può finire nell'Auto Backup.",[316,380,382],{"id":381},"_093-2026-10-04","0.9.3 · 2026-10-04",[321,384,385],{},[324,386,326],{},[328,388,389],{},[331,390,391,394],{},[324,392,393],{},"Build Android indipendenti."," Ogni job usa una propria directory SDK, evitando che installazioni simultanee rimuovano strumenti in uso. La 0.9.2 non è arrivata su pub.dev; questa versione include le funzionalità e le correzioni precedenti.",[316,396,398],{"id":397},"_092-2026-10-04","0.9.2 · 2026-10-04",[321,400,401],{},"Non pubblicata su pub.dev: due build Android concorrenti hanno interferito durante l’installazione degli strumenti condivisi.",[321,403,404],{},[324,405,326],{},[328,407,408],{},[331,409,410,413],{},[324,411,412],{},"Redirect entro il limite di invio."," Quando il body di un redirect scade, non parte una seconda richiesta. Le versioni 0.9.0 e 0.9.1 non sono arrivate su pub.dev; questa versione include log e metriche con chiave pubblica.",[316,415,417],{"id":416},"_091-2026-10-04","0.9.1 · 2026-10-04",[321,419,420],{},"Non pubblicata su pub.dev: il controllo sul limite dei redirect ha rilevato una seconda richiesta dopo la scadenza del body.",[321,422,423],{},[324,424,326],{},[328,426,427],{},[331,428,429,432],{},[324,430,431],{},"Pubblicazione isolata per job."," La configurazione Pub dei runner Linux resta temporanea, evitando credenziali orfane condivise. La 0.9.0 non è stata pubblicata su pub.dev; questa versione contiene le stesse funzionalità.",[316,434,436],{"id":435},"_090-2026-10-04","0.9.0 · 2026-10-04",[321,438,439],{},"Non pubblicata su pub.dev: il controllo delle dipendenze è stato bloccato dalla configurazione persistente del runner.",[321,441,442],{},[324,443,444],{},"Aggiunto",[328,446,447],{},[331,448,449,452],{},[324,450,451],{},"Log e metriche con chiave pubblica."," Le app distribuite possono inviare log, misure e verdetti performance con la DSN public key, senza includere un Bearer. La telemetria d'uso resta riservata al server.",[316,454,456],{"id":455},"_083-2026-10-01","0.8.3 · 2026-10-01",[321,458,459],{},[324,460,326],{},[328,462,463],{},[331,464,465,468],{},[324,466,467],{},"Pubblicazione riparata."," La 0.8.2 non è arrivata su pub.dev: questa versione contiene le stesse modifiche.",[316,470,472],{"id":471},"_082-2026-10-01","0.8.2 · 2026-10-01",[321,474,475],{},[324,476,477],{},"Modificato",[328,479,480],{},[331,481,482,485],{},[324,483,484],{},"Manutenzione interna."," Commenti e test sono in inglese e i controlli automatici seguono le nuove regole dei rilasci. Per chi usa la libreria non cambia niente.",[316,487,489],{"id":488},"_081-2026-09-07","0.8.1 · 2026-09-07",[321,491,492],{},[324,493,326],{},[328,495,496,506,512],{},[331,497,498,501,502,505],{},[324,499,500],{},"Le credenziali dentro un messaggio non escono più in chiaro"," — se un errore o un messaggio\nriportava un header di accesso, la parte dopo ",[355,503,504],{},"Bearer"," restava leggibile. Ora tipo e credenziale\nspariscono insieme, e anche i messaggi inviati a mano passano dal filtro.",[331,507,508,511],{},[324,509,510],{},"La chiave del progetto non finisce più a un servizio diverso"," — bastava che l'indirizzo\nconfigurato rimandasse a un'altra porta dello stesso nome per consegnargliela. Ora la chiave\nsegue solo l'indirizzo esatto configurato.",[331,513,514,517],{},[324,515,516],{},"Un server che risponde a metà non blocca più l'app"," — bastava che smettesse di rispondere a\ninvio iniziato: le segnalazioni successive venivano buttate e la chiusura poteva non finire mai.\nOra ogni invio ha un tempo massimo e la chiusura termina sempre.",[316,519,521],{"id":520},"_080-2026-09-03","0.8.0 · 2026-09-03",[321,523,524],{},[324,525,444],{},[328,527,528],{},[331,529,530,533],{},[324,531,532],{},"Ora si vede quali parti dell'app vengono davvero usate"," — prima quella pagina restava vuota per\nchi usa questa libreria. Basta segnare i punti che interessano e ogni cinque minuti parte un solo\ninvio con l'elenco. Va acceso a mano e richiede la chiave da server.",[321,535,536],{},[324,537,326],{},[328,539,540],{},[331,541,542,545],{},[324,543,544],{},"Il numero del rilascio e quello dentro il pacchetto non possono più divergere"," — non li\nconfrontava nessuno: il rilascio poteva chiamarsi in un modo e pubblicare un altro numero, e\nfinire verde lo stesso. Se quel numero era già uscito, il magazzino rifiutava il rilascio buono e\nil lavoro restava a metà: l'etichetta creata, niente pubblicato. Adesso il rilascio si ferma prima\ndi pubblicare, e dice quale dei due va aggiornato. Si ferma anche su un'etichetta di prova, che\nqui non ha dove andare: il magazzino riceve solo versioni definitive.",[321,547,548],{},[324,549,550],{},"Documentazione",[328,552,553],{},[331,554,555,558],{},[324,556,557],{},"La presentazione non promette più di fare tutto quello che fanno le altre librerie"," — alcune\nfunzioni esistono solo qui, altre solo altrove. Ora rimanda alla tabella unica che dice, funzione\nper funzione, cosa c'è in quale libreria.",[316,560,562],{"id":561},"_072-2026-08-16","0.7.2 · 2026-08-16",[321,564,565],{},[324,566,326],{},[328,568,569],{},[331,570,571,574],{},[324,572,573],{},"La pubblicazione si fermava sulla versione stessa"," — la 0.7.1 non è mai arrivata su pub.dev:\ntre test tenevano il numero di versione scritto a mano dentro l'asserzione, quindi ogni rilascio\nli faceva cadere e la pubblicazione si fermava prima di partire. Il quarto controllo, quello che\nconfronta il README col pubspec, era corretto e diceva il vero: il README consigliava ancora la\nversione precedente. Ora la versione attesa si legge dal pubspec e dalla costante dell'SDK, e il\nREADME è allineato — un rilascio pulito passa da solo, e una versione dimenticata cade qui invece\nche addosso a chi riceve gli eventi.",[316,576,578],{"id":577},"_071-2026-08-16","0.7.1 · 2026-08-16",[321,580,581],{},[324,582,345],{},[328,584,585],{},[331,586,587,590,591,370,594,370,597,600,601,604,605,608,609,612,613,620,621,624,625,628,629,632,633,636,637,639,640,643,644,647,648,651,652,655],{},[324,588,589],{},"Action CI pinnate al commit e permessi minimi"," — CYDA-17. Ogni action di terze parti dei\nworkflow (",[355,592,593],{},"actions\u002Fcheckout",[355,595,596],{},"subosito\u002Fflutter-action",[355,598,599],{},"actions\u002Fsetup-java",",\n",[355,602,603],{},"android-actions\u002Fsetup-android",") è fissata al ",[324,606,607],{},"commit SHA"," con la versione a commento, invece\nche a un tag mobile: un tag può essere ripuntato da chi controlla il repository dell'action, e\nquel codice girerebbe sul runner che pubblica su pub.dev. I tre workflow dichiarano\n",[355,610,611],{},"permissions: contents: read"," come base, e il ",[324,614,615,616,619],{},"token OIDC (",[355,617,618],{},"id-token: write",") resta solo sul job\nche pubblica","; la pubblicazione continua a non custodire alcun segreto pub.dev. ",[355,622,623],{},"verify.yml","\ndichiara i propri permessi perché in un workflow riusato valgono quelli del chiamato (CYDA-20).\nNel job che pubblica la cache di ",[355,626,627],{},"flutter-action"," è ",[324,630,631],{},"disattivata",": è una composite action e con\nla cache attiva eseguirebbe ",[355,634,635],{},"actions\u002Fcache@v5",", un tag mobile che il pin non copre, proprio nel\njob con ",[355,638,618],{},". Le action salgono anche alle major correnti (",[355,641,642],{},"checkout"," v7,\n",[355,645,646],{},"setup-java"," v5, ",[355,649,650],{},"setup-android"," v4): il pool self-hosted gira runner 2.336.0 e i log di CI\nsegnalavano già ",[355,653,654],{},"setup-java v4 is deprecated and will no longer receive updates",".",[321,657,658],{},[324,659,660],{},"Cambiato",[328,662,663,676],{},[331,664,665,668,669,672,673,675],{},[324,666,667],{},"Aggiornamenti di dipendenze automatizzati"," — CYDA-17. Nuovo ",[355,670,671],{},".github\u002Fdependabot.yml",": bump\nsettimanali raggruppati per le action (con lo SHA e il commento di versione riscritti) e per i\npackage pub della libreria e dell'app di esempio. Ogni PR passa dalla matrice di ",[355,674,623],{},"\n(analisi, test, coverage ≥90%, build Android\u002FiOS\u002Fweb su Flutter minimo e corrente) prima del\nmerge, così un pin non invecchia in silenzio e un bump non entra senza prove.",[331,677,678,681,682,685,686,689,690,697,698,701,702,705,706,370,709,712,713,600,716,655],{},[324,679,680],{},"Audit dipendenze pub",": tutte le dipendenze dirette sono già alla massima versione risolvibile\n(",[355,683,684],{},"dio"," 5.11.0). ",[355,687,688],{},"meta"," ",[324,691,692,693,696],{},"resta a ",[355,694,695],{},"^1.15.0"," di proposito",": il Flutter SDK lo pinna a una versione\nesatta (1.17.0 su 3.38.1, 1.18.0 su 3.44.1), quindi chiedere ",[355,699,700],{},"^1.19.0"," renderebbe il package\nirrisolvibile sul Flutter minimo supportato invece che più aggiornato — Dependabot lo ignora.\nNuovo ",[355,703,704],{},"test\u002Fci_workflows_test.dart"," blinda pin, permessi, OIDC senza segreti, automazione e la\ncoerenza fra ",[355,707,708],{},"pubspec.yaml",[355,710,711],{},"mise.toml"," e la matrice di build. Nuove dev dependencies: ",[355,714,715],{},"yaml",[355,717,718],{},"pub_semver",[316,720,722],{"id":721},"_070-2026-08-06","0.7.0 · 2026-08-06",[321,724,725],{},[324,726,444],{},[328,728,729,791,856],{},[331,730,731,734,735,738,739,742,743,746,747,750,751,754,755,758,759,762,763,765,766,769,770,773,774,776,777,374,779,782,783,786,787,370,789,655],{},[324,732,733],{},"Propagazione del W3C Trace Context nelle richieste Dio"," — CYDA-16. L'interceptor può iniettare\n",[355,736,737],{},"traceparent","\u002F",[355,740,741],{},"tracestate"," W3C nelle chiamate HTTP uscenti, correlando la chiamata mobile con i\nlog del backend end-to-end. È ",[324,744,745],{},"opt-in"," (",[355,748,749],{},"propagateTraceContext",", default OFF) e ",[324,752,753],{},"limitata da\nallowlist",": gli header partono ",[324,756,757],{},"solo"," verso gli host in ",[355,760,761],{},"tracePropagationAllowlist"," (match\nesatto o per sottodominio) — host esterni esclusi. Il ",[355,764,737],{}," riusa il ",[355,767,768],{},"trace_id"," di\ncorrelazione dello scope (già conforme W3C) e genera un ",[355,771,772],{},"parent-id"," nuovo a ogni richiesta, così\nchiamate concorrenti non condividono lo span; una richiesta con un ",[355,775,737],{}," valido a monte ne\ncontinua il trace (nested request), uno malformato viene scartato. ",[355,778,741],{},[355,780,781],{},"baggage"," sono\nfiltrati con la denylist PII dello ",[355,784,785],{},"Scrubber"," prima di partire: nessuna informazione interna verso\ndestinazioni non autorizzate. Nuove opzioni: ",[355,788,749],{},[355,790,761],{},[331,792,793,796,797,800,801,804,805,808,809,746,812,815,816,819,820,823,824,827,828,830,831,374,834,837,838,841,842,600,845,370,847,370,850,600,853,655],{},[324,794,795],{},"Breadcrumb di connettività, lifecycle e tap"," — CYDA-15. Tre sorgenti automatiche aggiungono\nbreadcrumb ",[324,798,799],{},"sintetici"," che contestualizzano un crash o un rallentamento avvenuto subito dopo un\ncambio di rete, un passaggio in background o un'interazione: ",[355,802,803],{},"captureLifecycleBreadcrumbs","\n(",[355,806,807],{},"data.state","), ",[355,810,811],{},"captureConnectivityBreadcrumbs",[355,813,814],{},"data.connectivity"," = solo il tipo di rete, via\n",[355,817,818],{},"connectivity_plus",") e ",[355,821,822],{},"captureTapBreadcrumbs"," (tipo + rotta, con ",[355,825,826],{},"CloseYourItUserInteraction","\nattorno all'app). Tutte ",[324,829,745],{}," (default OFF), ",[324,832,833],{},"minimali",[324,835,836],{},"prive di PII",": mai il testo\ndigitato né i dati del widget toccato. I toggle di rete rapidi e i tap a raffica sono soppressi da\n",[355,839,840],{},"breadcrumbThrottleMs"," (default 500 ms, ring buffer già esistente); connettività e lifecycle sono\ndeduplicati sugli stati identici. Il flush dei log in background resta attivo a prescindere dai\nflag. Piattaforma senza plugin di connettività o permessi negati → nessun breadcrumb, mai un crash\n(filosofia no-op del client). Nuovi export: ",[355,843,844],{},"CloseYourItConnectivityObserver",[355,846,826],{},[355,848,849],{},"CloseYourItConnectivity",[355,851,852],{},"ConnectivitySource",[355,854,855],{},"PluginConnectivitySource",[331,857,858,861,862,865,866,869,870,873,874,877,878,746,881,884,885,689,888,891,892,370,895,370,898,600,901,370,904,370,907,370,910,370,913,370,916,370,919,922,923,370,926,929,930,933,934,937,938,738,941,738,944,947],{},[324,859,860],{},"Diagnostica di invii e scarti visibile e strutturata"," — CYDA-13. Uno sviluppatore capisce se\nun evento è stato inviato, persistito, ritentato o eliminato — e ",[324,863,864],{},"perché"," — senza leggere i\nfile interni e senza generare nuova telemetria. ",[355,867,868],{},"Stats"," è esteso con i ",[324,871,872],{},"motivi strutturati","\ndi scarto (",[355,875,876],{},"DropReason","), uno ",[324,879,880],{},"snapshot immutabile",[355,882,883],{},"CloseYourIt.diagnostics",") che affianca\nai contatori di flusso i motivi, e una ",[324,886,887],{},"callback opzionale",[355,889,890],{},"CloseYourItOptions.onDiagnostic","\n(in-process, nessun evento ricorsivo, un'eccezione al suo interno è assorbita). I motivi coprono\ntransport, worker e offline store — punti finora muti: ",[355,893,894],{},"sampled",[355,896,897],{},"beforeSend",[355,899,900],{},"excluded",[355,902,903],{},"duplicate",[355,905,906],{},"queueFull",[355,908,909],{},"timeout",[355,911,912],{},"network",[355,914,915],{},"clientClosed",[355,917,918],{},"permanentReject",[355,920,921],{},"tooLarge","\n(413, oltre il budget payload lato server — CYRA-112), ",[355,924,925],{},"maxAttempts",[355,927,928],{},"expired"," (TTL), ",[355,931,932],{},"evicted","\n(capienza), ",[355,935,936],{},"storeCorrupted",". La semantica storica di ",[355,939,940],{},"dropped",[355,942,943],{},"failed",[355,945,946],{},"discarded"," è\npreservata (i motivi corrispondenti li aggregano); lo snapshot porta solo enum e interi, mai dati\nsensibili.",[321,949,950],{},[324,951,660],{},[328,953,954],{},[331,955,956,959,960,963,964,967,968,971,972,370,975,370,978,981,982,985,986,989,990,993],{},[324,957,958],{},"Versione minima di Flutter dichiarata correttamente a 3.38.1"," — CYDA-14. Il vincolo ",[355,961,962],{},"flutter","\ndel package passa da ",[355,965,966],{},">=3.10.0"," a ",[355,969,970],{},">=3.38.1",", il minimo realmente imposto dalle dipendenze\n(",[355,973,974],{},"device_info_plus",[355,976,977],{},"package_info_plus",[355,979,980],{},"path_provider","): su versioni inferiori ",[355,983,984],{},"pub get"," non\nrisolveva. La CI ora verifica analisi, test e ",[324,987,988],{},"build dell'app di esempio per Android, iOS e web","\nsul Flutter minimo e su quello stabile corrente, con ",[355,991,992],{},"dart pub publish --dry-run"," come gate: un\npackage che non compila su una piattaforma supportata non raggiunge la pubblicazione.",[316,995,997],{"id":996},"_060-2026-08-01","0.6.0 · 2026-08-01",[321,999,1000],{},[324,1001,444],{},[328,1003,1004],{},[331,1005,1006,1009,1010,1013,1014,1017,1018,1021,1022,1025,1026,808,1029,1036],{},[324,1007,1008],{},"DSN public key per le app client"," — CYDA-7. ",[355,1011,1012],{},"CloseYourItOptions.publicKey",": credenziale di solo\ningest (esadecimale, ",[324,1015,1016],{},"non segreta",") per le app Flutter distribuite. Gli errori\u002Fmessaggi vanno al\ndrop-in Sentry ",[355,1019,1020],{},"POST \u002Fapi\u002F{projectId}\u002Fstore"," con ",[355,1023,1024],{},"?sentry_key="," (fuori da ",[355,1027,1028],{},"\u002Fapi\u002Fv1",[324,1030,1031,1032,1035],{},"senza mai\nincludere un ",[355,1033,1034],{},"Authorization: Bearer"," nel pacchetto"," — la chiave estratta non legge né amministra il\nprogetto. La chiave viaggia in query (CORS-safe), in parità col client JS.",[321,1038,1039],{},[324,1040,477],{},[328,1042,1043],{},[331,1044,1045,1051,1052,689,1055,689,1058,1060,1061,1064,1065,1068,1069,1072,1073,1075,1076,1078,1079,1082,1083,1085],{},[324,1046,1047,1050],{},[355,1048,1049],{},"CloseYourItOptions.token"," ora opzionale"," — CYDA-7. Serve ",[355,1053,1054],{},"publicKey",[324,1056,1057],{},"oppure",[355,1059,357],{},"; senza\nnessuna delle due il client resta no-op (",[355,1062,1063],{},"disabledReason: credenziale mancante","). Il Bearer ",[355,1066,1067],{},"cyi_…","\nresta ",[324,1070,1071],{},"server-only"," (porta anche la lettura della telemetria) ed è ignorato quando ",[355,1074,1054],{}," è\nimpostata. Con la sola ",[355,1077,1054],{}," metriche e logs ",[324,1080,1081],{},"non vengono inviati",": il backend espone la DSN\npubblica solo per il canale eventi e rifiuta la chiave sui path ",[355,1084,1028],{}," (401).",[321,1087,1088],{},[324,1089,1090],{},"Aggiunto (coda offline)",[328,1092,1093],{},[331,1094,1095,1098,1099,370,1102,1105,1106,1109,1110,1113],{},[324,1096,1097],{},"Scadenza, tetto tentativi e backoff con jitter sulla coda offline"," — CYDA-11. Gli eventi molto\nvecchi o ripetutamente non consegnabili non restano più per sempre su disco né vengono ritentati tutti\nallo stesso avvio. Nuovo schema record v2 (",[355,1100,1101],{},"attempt_count",[355,1103,1104],{},"next_attempt_at",", con migrazione in\nlettura dei record legacy), ",[355,1107,1108],{},"OfflineRetryPolicy"," con TTL, tetto tentativi e backoff esponenziale con\njitter deterministico (FNV-1a, quindi riproducibile e scaglionato tra eventi). ",[355,1111,1112],{},"readAll"," pianifica solo\ngli eventi dovuti e non scaduti: gli scaduti vengono eliminati, quelli in backoff restano per un avvio\nsuccessivo — niente raffica alla riapertura.",[321,1115,1116],{},[324,1117,326],{},[328,1119,1120,1145,1171,1220],{},[331,1121,1122,1125,1126,1133,1134,1137,1138,1140,1141,1144],{},[324,1123,1124],{},"Niente più query e segreti negli URL registrati"," — CYDA-8. L'interceptor Dio registrava l'URL intero\nin breadcrumb, request context e dettagli d'errore, esponendo password, token, email o codici temporanei\npresenti nella query ",[324,1127,1128,1129,1132],{},"anche con ",[355,1130,1131],{},"sendPii"," disattivato",". Ora ",[355,1135,1136],{},"Scrubber.sanitizeUri"," conserva per\ndefault solo schema, host e path; con ",[355,1139,1131],{}," la query resta ma i parametri sensibili sono redatti\nriusando la denylist condivisa. ",[355,1142,1143],{},"userInfo"," e fragment sono sempre esclusi. Robusto su URI relativi o\nmalformati. La porta viene preservata e i valori di query ri-encodati.",[331,1146,1147,1150,1151,1154,1155,1158,1159,1162,1163,1166,1167,1170],{},[324,1148,1149],{},"Richieste Dio concorrenti non si scambiano più il contesto"," — CYDA-9. ",[355,1152,1153],{},"onRequest"," non muta più lo\nscope globale condiviso: salva uno snapshot del request context in ",[355,1156,1157],{},"RequestOptions.extra",", che ",[355,1160,1161],{},"onError","\npassa a ",[355,1164,1165],{},"captureException"," solo se ",[324,1168,1169],{},"quella"," richiesta fallisce. Prima, più chiamate in parallelo si\nscambiavano URL, metodo e header, e lo scope conservava richieste vecchie.",[331,1172,1173,1176,1177,1180,1181,738,1184,738,1187,738,1190,1193,1194,370,1197,370,1200,374,1203,1206,1207,1209,1210,1213,1214,1216,1217,655],{},[324,1174,1175],{},"I rifiuti permanenti escono dalla coda offline"," — CYDA-10. Un evento persistito veniva rimosso solo\nsu risposta ",[355,1178,1179],{},"2xx",": un ",[355,1182,1183],{},"400",[355,1185,1186],{},"401",[355,1188,1189],{},"403",[355,1191,1192],{},"413"," restava su disco e veniva ritentato a ogni avvio,\noccupando la coda per sempre. Ora rete, ",[355,1195,1196],{},"408",[355,1198,1199],{},"425",[355,1201,1202],{},"429",[355,1204,1205],{},"5xx"," restano ritentabili (con ",[355,1208,1202],{}," che\npreserva l'attesa ",[355,1211,1212],{},"Retry-After","), tutto il resto viene scartato. Lo scarto è diagnosticabile via il\nnuovo contatore ",[355,1215,946],{}," e un log in ",[355,1218,1219],{},"debug",[331,1221,1222,1229,1230,1232,1233,1236],{},[324,1223,1224,1225,1228],{},"Una seconda ",[355,1226,1227],{},"init"," non duplica più i gestori"," — CYDA-12. Prima installava un secondo set di gestori\nerrore, observer di lifecycle e frame callback senza chiudere il client precedente: gli errori venivano\ncatturati due volte e vecchio client, transport e observer restavano orfani. Ora ",[355,1231,1227],{}," chiude in\nsicurezza il client attivo prima di sostituirlo, e ",[355,1234,1235],{},"close"," azzera il riferimento anche in caso di errore.",[321,1238,1239],{},[324,1240,550],{},[328,1242,1243],{},[331,1244,1245,1248,1249,1252,1253,655],{},[324,1246,1247],{},"README allineato alla versione pubblicata"," — CYDA-18. Consigliava ",[355,1250,1251],{},"^0.3.0"," mentre il pacchetto era\ngià avanti: una nuova app che seguiva la documentazione partiva da una minor priva delle correzioni di\nprivacy. Un test blinda ora la coerenza fra README e ",[355,1254,708],{},[316,1256,1258],{"id":1257},"_050-2026-07-10","0.5.0 · 2026-07-10",[321,1260,1261],{},[324,1262,444],{},[328,1264,1265,1316,1364,1379],{},[331,1266,1267,1270,1271,738,1273,1276,1277,1280,1281,1283,1284,746,1287,1290,1291,1293,1294,1297,1298,1301,1302,819,1305,1301,1308,1311,1312,1315],{},[324,1268,1269],{},"Persistenza crash offline (pattern Crashlytics)"," — CYDA-5. Gli eventi errore\n(",[355,1272,1165],{},[355,1274,1275],{},"captureMessage",") vengono scritti ",[324,1278,1279],{},"sincronamente su disco"," prima dell'invio e\nrimossi solo alla conferma ",[355,1282,1179],{},": un crash che chiude l'app (o un periodo offline) non li perde più,\nvengono ",[324,1285,1286],{},"rispediti al prossimo avvio",[355,1288,1289],{},"replayPending",", chiamato da ",[355,1292,1227],{},"). Store su file\n(path_provider), un file JSON per evento; il payload su disco è ",[324,1295,1296],{},"sempre scrubato"," (nessun segreto\nin chiaro). Nuove opzioni ",[355,1299,1300],{},"persistOffline"," (default ",[355,1303,1304],{},"true",[355,1306,1307],{},"maxPersistedEvents",[355,1309,1310],{},"50",",\nsfratto dei più vecchi). Su web (nessun filesystem) la persistenza è assente e il client resta\npienamente funzionante in-memory. Store iniettabile via ",[355,1313,1314],{},"init(offlineStore: …)"," per i test.",[331,1317,1318,1321,1322,1324,1325,1328,1329,738,1332,1335,1336,689,1339,1342,1343,804,1346,1349,1350,746,1353,1356,1357,1359,1360,1363],{},[324,1319,1320],{},"Backstop errori isolate"," — ",[355,1323,1227],{}," aggancia ",[355,1326,1327],{},"Isolate.current.addErrorListener"," per gli errori non\ngestiti dell'isolate corrente (root) che sfuggono a ",[355,1330,1331],{},"FlutterError",[355,1333,1334],{},"PlatformDispatcher",", catturati\ncome ",[355,1337,1338],{},"IsolateError",[355,1340,1341],{},"fatal"," (persistiti come gli altri errori). Per gli ",[324,1344,1345],{},"isolate spawnati",[355,1347,1348],{},"Isolate.spawn",") è esposto ",[355,1351,1352],{},"CloseYourIt.isolateErrorPort",[355,1354,1355],{},"SendPort",") da passare come ",[355,1358,1161],{},"\nallo spawn. ",[355,1361,1362],{},"dart:isolate"," è confinato dietro conditional import → nessun impatto sulla build web.",[331,1365,1366,1367,1370,1371,1374,1375,1378],{},"Nuovi contatori diagnostici ",[355,1368,1369],{},"stats",": ",[355,1372,1373],{},"persisted"," (eventi scritti su disco) e ",[355,1376,1377],{},"replayed"," (eventi\nripresi dal disco al boot).",[331,1380,1381,1386,1387,1390,1391,1394,1395,1398,1399,1402],{},[324,1382,1383,1384],{},"Opzione ",[355,1385,1219],{}," su ",[355,1388,1389],{},"CloseYourItOptions",": con ",[355,1392,1393],{},"debug: true"," i fallimenti d'invio del transport\nvengono loggati via ",[355,1396,1397],{},"debugPrint"," (status + codice ",[355,1400,1401],{},"R…"," + messaggio dall'envelope backend), invece\ndi restare muti (prima diagnosticabili solo con un proxy HTTP).",[321,1404,1405],{},[324,1406,326],{},[328,1408,1409,1444,1461,1477],{},[331,1410,1411,1414,1415,1417,1418,1421,1422,1425,1426,1429,1430,738,1433,738,1436,1439,1440,1443],{},[324,1412,1413],{},"Parità PII scrubber (denylist backend)"," — CYDA-4. La denylist dello ",[355,1416,785],{}," client\nora include i token PII del backend (",[355,1419,1420],{},"SENSITIVE_KEY",") — ",[355,1423,1424],{},"email phone telephone mobile dob birth passport bearer session pin pan"," — oltre a quelli già presenti.\nPrima i bind di query\u002Fmetodi lenti (",[355,1427,1428],{},"capture_query_bindings",") su colonne\n",[355,1431,1432],{},"email",[355,1434,1435],{},"phone",[355,1437,1438],{},"dob"," non venivano redatti e finivano nel pannello Parametri della\nmetric-group. Match per sottostringa (over-redaction privacy-by-default), allineato\n1:1 alla gem Ruby. ",[355,1441,1442],{},"sensitiveKey"," e la regex dei messaggi condividono ora un'unica\nsorgente di token, così non possono più divergere.",[331,1445,1446,1449,1450,1452,1453,1456,1457,1460],{},[324,1447,1448],{},"Sicurezza redirect",": il ",[355,1451,504],{}," (segreto d'ingest) non viene più ri-inviato dopo un redirect\nverso un host diverso, né su un downgrade ",[355,1454,1455],{},"https→http"," — solo stesso host (o variante ",[355,1458,1459],{},"www",") e\nschema non degradato. Evita di consegnare il token a un endpoint non fidato.",[331,1462,1463,1370,1466,1469,1470,1472,1473,1476],{},[324,1464,1465],{},"DX misconfig",[355,1467,1468],{},"init()"," con config incompleta (token\u002FprojectId mancante) emette ora un\n",[355,1471,1397],{}," esplicito invece di restare un no-op silenzioso (non avvisa se ",[355,1474,1475],{},"enabled: false",").",[331,1478,1479,1482,1483,1485,1486,1489,1490,1493,1494,1496,1497,1500,1501,689,1504,1507,1508,1510,1511,1514,1515,1518,1519,746,1522,1525,1526,1529,1530,1533,1534,1537,1538,1540,1541,1544,1545,738,1548,1551,1552,1554,1555,655],{},[324,1480,1481],{},"Correlazione log↔errori su mobile (auto-trace)"," — CYDA-6. Il ",[355,1484,768],{}," non era ",[324,1487,1488],{},"mai"," popolato\nautomaticamente su Dart (a differenza del client JS per-pagina e del gem Ruby per-richiesta): senza\nuna ",[355,1491,1492],{},"setTraceId"," manuale ogni evento partiva con ",[355,1495,768],{}," assente e log\u002Ferrori\u002Fmetriche di uno\nstesso tap erano ",[324,1498,1499],{},"impossibili da correlare",". Ora lo ",[355,1502,1503],{},"Scope",[324,1505,1506],{},"auto-popola"," il ",[355,1509,768],{}," per\nunità logica — ",[355,1512,1513],{},"ensureTraceId()"," ne genera uno (32 hex) al primo evento e lo condivide con tutti\nquelli successivi (stesso tap\u002Fschermata), mentre il ",[355,1516,1517],{},"CloseYourItNavigatorObserver"," lo ",[324,1520,1521],{},"ruota a\nogni navigazione",[355,1523,1524],{},"rotateTraceId()",", parità col \"per-pagina\" di JS; su ",[355,1527,1528],{},"didRemove"," ruota solo se\nviene rimossa la schermata ",[324,1531,1532],{},"in cima"," — la route sotto torna visibile — non per la rimozione di una\nroute sepolta come in ",[355,1535,1536],{},"pushAndRemoveUntil","). Una\n",[355,1539,1492],{}," esplicita ",[324,1542,1543],{},"vince e sopravvive alla navigazione"," (il flusso correlato a mano, es. un\ncheckout multi-schermata, non viene ruotato finché non lo si rilascia con\n",[355,1546,1547],{},"setTraceId(null)",[355,1549,1550],{},"clearScope","); senza pin, ",[355,1553,1550],{}," riparte lazy. Nessun evento resta più\nsenza ",[355,1556,768],{},[316,1558,1560],{"id":1559},"_040-2026-07-02","0.4.0 · 2026-07-02",[321,1562,1563],{},[324,1564,444],{},[328,1566,1567,1598],{},[331,1568,1569,1370,1572,1575,1576,1579,1580,1583,1584,1586,1587,1589,1590,1593,1594,1597],{},[324,1570,1571],{},"Device\u002FOS\u002Fapp context automatici",[355,1573,1574],{},"contexts.device"," (model, manufacturer, simulator),\n",[355,1577,1578],{},"contexts.os"," (name, version) e ",[355,1581,1582],{},"contexts.app"," (app_version, build_number, bundle_id) raccolti\nall'init via ",[355,1585,974],{}," + ",[355,1588,977],{}," e installati nello scope — ogni evento li\neredita. Best-effort su ogni piattaforma (web incluso), provider iniettabile nei test\n(",[355,1591,1592],{},"DeviceContextProvider","). Config ",[355,1595,1596],{},"collectDeviceContext"," (default true).",[331,1599,1600,1603,1604,1607,1608,1611],{},[324,1601,1602],{},"Auto-release",": quando ",[355,1605,1606],{},"options.release"," non è impostata, la release diventa\n",[355,1609,1610],{},"app_version+build_number"," (stile pubspec) derivata dall'app context; le options esplicite vincono.",[321,1613,1614],{},[324,1615,326],{},[328,1617,1618],{},[331,1619,1620,1621,1624,1625,1628],{},"Assert di versione SDK stantii nei test (",[355,1622,1623],{},"0.1.0"," → ",[355,1626,1627],{},"0.3.0",", rotti dal bump di release).",[316,1630,1632],{"id":1631},"_030-2026-06-29","0.3.0 · 2026-06-29",[321,1634,1635],{},[324,1636,444],{},[328,1638,1639,1710],{},[331,1640,1641,1644,1645,1648,1649,1651,1652,1655,1656,1659,1660,1662,1663],{},[324,1642,1643],{},"Rilevamento performance issue"," (opt-in ",[355,1646,1647],{},"detectPerformanceIssues",", default OFF; specchio mobile\ndel gem ",[355,1650,47],{},"). Verdetti ",[355,1653,1654],{},"kind=performance_issue"," verso ",[355,1657,1658],{},"\u002Fmetrics",", con ",[355,1661,768],{},":\n",[328,1664,1665,1675,1685,1701],{},[331,1666,1667,1670,1671,1674],{},[355,1668,1669],{},"slow_external_http"," — chiamata HTTP esterna oltre ",[355,1672,1673],{},"slowExternalThresholdMs"," (interceptor Dio;\nesclude l'endpoint CloseYourIt, path templatizzato).",[331,1676,1677,1680,1681,1684],{},[355,1678,1679],{},"repeated_http"," — N chiamate identiche (host+path) entro ",[355,1682,1683],{},"repeatedHttpWindowMs"," (l'N+1 del mobile).",[331,1686,1687,1690,1691,1694,1695,1698,1699,1476],{},[355,1688,1689],{},"jank"," — frame oltre ",[355,1692,1693],{},"jankFrameBudgetMs"," (default 32) via ",[355,1696,1697],{},"addTimingsCallback",", attribuito alla\nroute corrente (dal ",[355,1700,1517],{},[331,1702,1703,1706,1707,655],{},[355,1704,1705],{},"rebuild_storm"," — widget ricostruito troppe volte, via la sonda opt-in ",[355,1708,1709],{},"CloseYourItRebuildProbe",[331,1711,1712,746,1717,738,1720,1723],{},[324,1713,1714,1716],{},[355,1715,768],{}," sulle metriche",[355,1718,1719],{},"MetricEvent",[355,1721,1722],{},"slow_method",") — correlazione con log ed errori.",[316,1725,1727],{"id":1726},"_020-2026-06-29","0.2.0 · 2026-06-29",[321,1729,1730],{},[324,1731,477],{},[328,1733,1734],{},[331,1735,1736,1370,1739,1742,1743,1021,1745,1748,1749,1752,1753,1755],{},[324,1737,1738],{},"BREAKING (minore)",[355,1740,1741],{},"measure()"," \u002F ",[355,1744,1719],{},[355,1746,1747],{},"label"," vuota ora solleva ",[355,1750,1751],{},"ArgumentError",".\nLa label è il fingerprint di ",[355,1754,1722],{},": vuota collassava tutte le metriche in un unico gruppo.",[321,1757,1758],{},[324,1759,326],{},[328,1761,1762,1775,1785,1793],{},[331,1763,1764,1370,1767,1770,1771,1774],{},[324,1765,1766],{},"Scrub dei messaggi d'eccezione",[355,1768,1769],{},"exception.value"," passa dallo scrubber (",[355,1772,1773],{},"Scrubber.scrubMessage",")\nprima dell'invio — il backend non ri-scrubba i messaggi (parità con il gem, niente PII in chiaro).",[331,1776,1777,1784],{},[324,1778,1779,1780,1783],{},"Chunking dei log a ",[355,1781,1782],{},"logsMaxBatch"," (1000)",": un flush oltre il limite del server veniva rigettato\nin blocco (413) coi log persi; ora è spezzato in invii sequenziali.",[331,1786,1787,1792],{},[324,1788,1789],{},[355,1790,1791],{},"contexts.runtime.version"," ora presente (versione SDK) — parità col gem.",[331,1794,1795,1800,1801,1804,1805,1808],{},[324,1796,1797],{},[355,1798,1799],{},"LogLevel.fromString",": alias ",[355,1802,1803],{},"err","→error e ",[355,1806,1807],{},"unknown","→fatal (parità col gem).",[316,1810,1812],{"id":1811},"_010-2026-06-29","0.1.0 · 2026-06-29",[321,1814,1815,1816,655],{},"Prima release. Specchio Flutter del gem ",[355,1817,47],{},[321,1819,1820],{},[324,1821,444],{},[328,1823,1824,1833,1841,1863,1866,1874,1886,1893,1902],{},[331,1825,1826,1021,1829,1832],{},[355,1827,1828],{},"CloseYourIt.init",[355,1830,1831],{},"appRunner"," (zona protetta + gestori globali errori).",[331,1834,1835,1836,738,1838,1840],{},"Cattura errori: ",[355,1837,1165],{},[355,1839,1275],{},", dedup, sampling, formato Sentry.",[331,1842,1843,1844,738,1847,738,1850,738,1853,738,1856,738,1858,738,1861,655],{},"Scope: ",[355,1845,1846],{},"setUser",[355,1848,1849],{},"setTag",[355,1851,1852],{},"setContext",[355,1854,1855],{},"setExtra",[355,1857,1492],{},[355,1859,1860],{},"configureScope",[355,1862,1550],{},[331,1864,1865],{},"Breadcrumbs con ring buffer e scrubbing PII.",[331,1867,1868,1869,1624,1871,1873],{},"Metriche: ",[355,1870,1741],{},[355,1872,1722],{}," oltre soglia.",[331,1875,1876,1877,738,1880,1883,1884,655],{},"Logs: ",[355,1878,1879],{},"log",[355,1881,1882],{},"logger"," con batching (size\u002Fintervallo\u002Flifecycle) e ",[355,1885,768],{},[331,1887,1888,1889,1892],{},"Transport HTTP fire-and-forget (Bearer ",[355,1890,1891],{},"cyi_",", redirect, mai solleva) + background worker bounded.",[331,1894,1895,1896,370,1899,1901],{},"Integrazioni: ",[355,1897,1898],{},"CloseYourItDioInterceptor",[355,1900,1517],{},", flush su lifecycle.",[331,1903,1904,1905,655],{},"Scrubber PII e hook ",[355,1906,897],{},{"title":1908,"searchDepth":19,"depth":19,"links":1909},"",[1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928],{"id":318,"depth":19,"text":319},{"id":339,"depth":19,"text":340},{"id":381,"depth":19,"text":382},{"id":397,"depth":19,"text":398},{"id":416,"depth":19,"text":417},{"id":435,"depth":19,"text":436},{"id":455,"depth":19,"text":456},{"id":471,"depth":19,"text":472},{"id":488,"depth":19,"text":489},{"id":520,"depth":19,"text":521},{"id":561,"depth":19,"text":562},{"id":577,"depth":19,"text":578},{"id":721,"depth":19,"text":722},{"id":996,"depth":19,"text":997},{"id":1257,"depth":19,"text":1258},{"id":1559,"depth":19,"text":1560},{"id":1631,"depth":19,"text":1632},{"id":1726,"depth":19,"text":1727},{"id":1811,"depth":19,"text":1812},"md",{},true,{"title":297,"description":298},"docs\u002Fchangelog-sdk-dart","zfxHgwHzNzFP0NUiz0_Agx2GxjrshJggUgvA4aVKOA8",1791469655305]