Skip to content

Releases: dextsamu/gdpr-sentinel

v1.4.2

Choose a tag to compare

@github-actions github-actions released this 02 Nov 15:06

[1.4.2] - 2026-11-02

Aggiunto

  • Matrice dell'informativa (scripts/notice_matrix.py, lanciato dal pre-passaggio, scrive informativa.csv): le informative del repository (pagine, documenti, seed del testo; esclusi i documenti interni di progetto) confrontate con il codice voce per voce. Una riga per ogni fornitore e risorsa di terzi trovati nel codice (il nome compare?), più titolare, DPO, basi giuridiche, trasferimenti, tempi, diritti, dati particolari e geolocalizzazione se trattati, numero di versioni; segnala da sola le contraddizioni evidenti («non trasferiamo fuori dall'UE» con fornitori extra-SEE, «non trattiamo dati sanitari» con dati sanitari nel codice). Stesse regole di chiusura di entita.csv. Sul sito della scuola trova da sola DPO assente, trasferimenti negati, dati sanitari negati e i sei fornitori non nominati.
  • draft_ropa.py: Telegram (API e librerie dei bot) e servizi di geolocalizzazione degli IP (ip-api.com, ipinfo.io).
  • merge_audits.py (condiviso): accordo cella per cella anche sulla matrice dell'informativa.

Misurato (UnityKore, due giri)

  • Matrice per entità: stesso giudizio su 100/102 righe aperte (98%; cancellazione 31/31, export 12/12, isolamento 39/40, oblio 18/19). Matrice dell'informativa: 17/21 (81%). Accordo sui gap 59%, sulle cause ad alta priorità 82% (9/11). Token per giro 318–319 mila (prima 263–311 mila). Le cause viste da un giro solo stanno ora fuori da entrambe le matrici (ruoli dei responsabili, procedura incidenti, header fidati del middleware, data dell'informativa).

v1.4.1

Choose a tag to compare

@github-actions github-actions released this 02 Nov 13:50

[1.4.1] - 2026-11-02

Cambiato (matrice per entità più stabile)

  • Definizioni fisse in SKILL.md per le quattro domande e pre-compilazioni nuove in entity_matrix.py, scelte guardando dove due giri discordavano: registri tenuti per obbligo di legge o difesa → oblio «n/a probabile» (art. 17(3)), con il termine nella riga cancellazione; credenziali e token → export «n/a probabile»; modelli Prisma cancellati a cascata con l'utente → cancellazione «si (solo a cascata)»; per l'isolamento tramite relazione, le letture di elenco nelle API elencate con file e riga, da chiudere tutte (non verificabile non è più ammesso se ce ne sono; un gap richiede il file:riga in note).
  • merge_audits.py (condiviso): con entita.csv in tutti i giri stampa l'accordo cella per cella sulle righe aperte, per domanda, e scrive l'entita.csv unita con la provenienza.

Misurato (UnityKore, due giri per versione)

Versione Matrice: stesso giudizio cancellazione export oblio isolamento Accordo sui gap Cause alte Token per giro
1.4.0 79% (100/126) 38/38 14/17 20/31 28/40 49% 69% 263–280 mila
definizioni + oblio/export 78% (86/110) 27/38 11/12 19/20 29/40 58% 67% 288–305 mila
1.4.1 91% (90/99) 28/28 11/12 14/19 37/40 62% 75% 263–311 mila

v1.4.0

Choose a tag to compare

@github-actions github-actions released this 02 Nov 11:22

[1.4.0] - 2026-11-02

Aggiunto

  • Matrice per entità (scripts/entity_matrix.py, lanciato dal pre-passaggio, scrive entita.csv): per ogni tabella o modello con dati personali (Prisma, Django, SQL) le stesse domande, pre-compilate dal codice con file e riga: cancellazione, export dell'interessato, diritto all'oblio e, se il codice è multi-ente, isolamento fra enti. L'agente chiude solo le righe «non trovato» (ok, gap con gap_id, non applicabile, non verificabile con motivo), con un gap per domanda che elenca le entità; chiudi fallisce sulle righe aperte. Su UnityKore: 63 entità, 252 righe, 126 da guardare. Misurato con due giri: sulle righe aperte i due giri danno lo stesso giudizio nel 79% dei casi (cancellazione 38/38, export 14/17, isolamento 28/40, oblio 20/31); token per giro 263–280 mila, contro 344–359 mila dei giri con letture.csv. L'accordo complessivo sui gap resta 49% (un giro ha raggruppato le entità in meno gap, l'altro le ha divise; i temi fuori dalla matrice restano variabili), 69% sulle cause ad alta priorità.

Rimosso

  • letture.csv (introdotto in questa stessa giornata): circa +30% di tempo senza effetto misurabile sull'accordo; la matrice per entità fissa le domande invece dei file.

v1.3.3

Choose a tag to compare

@github-actions github-actions released this 02 Nov 10:06

[1.3.3] - 2026-11-02

Aggiunto (prova dinamica)

  • cookie_scan.py provato su un sito in funzione: il sito della scuola (tests/bench-pa) servito in locale con PHP. Prima di ogni interazione rileva in home YouTube, reCAPTCHA e Google Fonts, nei contatti anche Google Maps; nella pagina eventi nessun YouTube (il video si carica solo al clic, l'esca); Matomo sul server della scuola non è una terza parte; PHPSESSID è riconosciuto come cookie di sessione. Senza blocco, YouTube imposta quattro cookie sul suo dominio, classificati «di terze parti».
  • cookie_scan.py: classificazione dal percorso quando lo stesso host serve servizi diversi (www.google.com/recaptcha e /maps); classe dei cookie (di terze parti, sessione o sicurezza, da classificare); opzione --blocca-terzi, che registra le richieste verso terzi senza inviarle (nessun dato esce, risultato indipendente dalla rete). Test automatico in tests/run_checks.py quando PHP e Playwright sono disponibili.

Misurato (Juice Shop con altri agenti)

  • appsec-sentinel rapido su Juice Shop, stesso prompt: Codex 18/32 (vicino 22), Antigravity 6/32 (vicino 9), Claude 19–23/32. Tabella in docs/ALTRI-AGENTI.md.

Aggiunto

  • punti-pericolosi.csv comprende sempre quattro temi documentali, anche senza indizi nel codice: informativa e trasparenza (D), governance (K: registro, DPIA, nomine, accordi art. 28), data breach (L), segreti e configurazioni versionate (solo i file tracciati da Git).
  • merge_audits.py (condiviso): righe o intervalli dello stesso file che si sovrappongono (± 3 righe) contano come citazione vicina (+0,4): due giri citano spesso la stessa istruzione con un numero di riga diverso (route.ts:312 e :313) o con intervalli diversi (330-346 e 313-346). Rimisurando tutte le coppie di giri su UnityKore: 59→65%, 63→67%, 44→60%, 46→50%, 56→60%, 50→63%; appsec invariato (Juice 75%, Django 88%, Laravel 94%). Le unioni nuove sono state lette a mano: sono la stessa causa.
  • letture.csv: il pre-passaggio sceglie i file da leggere a fondo, uguali per ogni giro (i 30 file con indizi in più categorie e fino a 10 documenti privacy); ogni riga chiude con si o con no e il motivo, altrimenti chiudi fallisce. Su UnityKore i due giri con l'elenco hanno letto per intero 16 e 32 file su 38 e impiegato circa 13 minuti invece di 9–10.

Misurato

  • Accordo su UnityKore, con l'unione corretta: 60% (giri con i temi documentali) e 63% (giri anche con letture.csv); in tutto sei coppie di giri fra 50% e 67%. Prima stima: 56% (31 e 33 gap, chiudi senza falliti, 13 categorie chiuse in entrambi). Nessun miglioramento oltre la variabilità fra coppie di giri (56–67%): l'obiettivo «oltre il 70%» non è raggiungibile così su un repository di oltre mille file, e la skill continua a indicare doppio per le app grandi. Dettagli in ROADMAP.

v1.3.2

Choose a tag to compare

@github-actions github-actions released this 02 Nov 09:10

[1.3.2] - 2026-11-02

Misurato

  • Codex: appsec-sentinel rapido sul banco Django, 11/11 difetti (6/6 alti), 0 falsi allarmi, smentita con un sottoagente indipendente (3 resistono, 1 declassato), chiudi senza falliti. Con Antigravity (10/11) le due skill sono ora misurate su Claude, Codex e Antigravity.

v1.3.1

Choose a tag to compare

@github-actions github-actions released this 01 Nov 22:14

[1.3.1] - 2026-11-01

Misurato

  • Antigravity e Codex: gdpr-sentinel statica sul secondo banco privacy, stesso prompt: 14/15 difetti e 0 falsi allarmi per entrambi, smentita indipendente fatta in entrambi i casi (Antigravity con il pacchetto in una sessione nuova, Codex con un sottoagente). Tabella in docs/ALTRI-AGENTI.md. Corretta l'esca T02 del banco (si attivava su «preventiva»).

Corretto

  • Parole vietate e giudizi di conformità: «conforme all'informativa», «conforme a quanto dichiarato» confrontano due testi e non sono più segnalati; «il sito è conforme» resta vietato. Emerso dal giro di Antigravity sul secondo banco privacy (01/11/2026): il verificatore aveva scritto l'ipotesi che stava smentendo e chiudi falliva.

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 01 Nov 20:01

[1.3.0] - 2026-11-01

Aggiunto

  • Report PDF per standard e completo: due sezioni nuove, «Threat model» (da report/threat-model.md: titoli, elenchi e tabelle resi come testo) e «Test dinamici eseguiti» (le righe della matrice endpoint con test_eseguito=si: identità, controllo atteso, esito osservato, finding). Prima il PDF mostrava solo il conteggio degli endpoint provati.
  • punti-pericolosi.csv anche in gdpr-sentinel: il pre-passaggio scrive una riga da chiudere per ogni categoria di indizi trovata (tracker e risorse di terzi, cookie, dati particolari, minori, geolocalizzazione, log con dati personali, diritti, marketing, fornitori), con i punti in registro-tool/punti-pericolosi.txt; ogni riga chiude con gap (ID nella colonna finding, almeno uno che cita un file della categoria) o non difetto con un file:riga letto; «non esaminato» fa fallire chiudi. Motivo: nei due giri reali sullo stesso gestionale (accordo 63%) metà delle cause viste da un giro solo stava in categorie che l'altro non aveva aperto (log, GPS, video incorporati, dati sanitari). Misurato su UnityKore, due giri statica nuovi: 27 e 24 gap, chiudi senza falliti, tutte le 9 categorie chiuse in entrambi; accordo 59% (corrispondente 76%), contro il 63% dei due giri precedenti: nessun miglioramento, entro la variabilità. Le cause viste da un giro solo ora stanno quasi tutte fuori dalle categorie (documenti di governance, procedura data breach, file .env versionati, ruolo del DPO, età dei volontari) e una coppia è la stessa causa scritta in due modi (consenso GPS non applicato) che l'unione non abbina. L'obiettivo «oltre il 70%» resta aperto: le categorie rendono uniforme la copertura dove ci sono indizi nel codice, non sui temi documentali.
  • Smentita senza sottoagenti (scripts/refutation_pack.py, condiviso con appsec-sentinel): pacchetto per una seconda sessione con istruzioni, metodo e un brief per gap ad alta priorità, e reimportazione degli esiti. Provato sul secondo banco: una sessione nuova con il solo pacchetto ha verificato 13 gap (12 resistono, 1 declassato: il modello dell'albo non è raggiungibile così com'è scritto) e gli esiti sono stati applicati con importa.
  • apply_refutations.py riporta gli esiti anche nella colonna smentita di gdpr-matrix.csv, per le righe i cui gap sono tutti smentiti (prima la matrice restava «non eseguita» e chiudi segnalava 7 warning dopo una smentita fatta).

Corretto

  • build_report_pdf.py: una riga CSV con più colonne dell'intestazione (virgola fuori dalle virgolette) faceva fallire il PDF; ora le colonne in più vengono unite all'ultima. Emerso dal giro standard del 01/11/2026 sul PC dell'autore.
  • gap_briefs.py sceglieva solo i gap con smentita vuota o esattamente «non eseguita»: ora anche «non eseguita | motivo | …», la forma che la skill fa scrivere.

v1.2.3

Choose a tag to compare

@github-actions github-actions released this 01 Nov 19:12

[1.2.3] - 2026-11-01

Aggiunto

  • Secondo banco privacy tests/bench-pa: sito di un istituto comprensivo in PHP + MariaDB (minori, albo online, amministrazione trasparente, modulistica, servizi incorporati), 15 difetti e 5 esche. Misurato: due giri statica indipendenti, 15/15 difetti ciascuno (6/6 alti), 0 falsi allarmi sulle esche, accordo 15/15 sui difetti noti. Due regole delle esche sono state ristrette dopo il primo giro, perché contavano come falso allarme un gap corretto che citava la pagina degli eventi come confronto e un gap vero sul file di log.

Corretto (emerso dal secondo banco)

  • Il pre-passaggio non riconosceva nulla su un sito PHP: 0 fornitori e 0 tabelle. Ora draft_ropa.py legge anche i file .php (e .htm, .vue, .svelte, .twig, .erb, .jsp, .cshtml…), riconosce i servizi dal percorso (Google reCAPTCHA e Google Maps su www.google.com), Mailgun, SendGrid, YouTube senza cookie, Vimeo, hCaptcha, Turnstile, e ricava i trattamenti dagli schemi SQL (CREATE TABLE); privacy_scan.py riconosce i log PHP e Python (file_put_contents(… .log), error_log, syslog, logging) e i cookie PHP (setcookie, session_start). Sul sito della scuola: 6 fornitori, 7 tabelle, il log dei contatti.

v1.2.2

Choose a tag to compare

@github-actions github-actions released this 01 Nov 18:37

[1.2.2] - 2026-11-01

Aggiunto

  • Brief per la smentita dei gap (scripts/gap_briefs.py <cartella> --repo <repository>): un file per gap in smentite/ con l'affermazione, le righe di codice citate e le ipotesi di smentita della privacy (il codice fa davvero ciò che il gap dice? dato non personale, altro titolare, obbligo di legge, informativa che già lo copre, job di cancellazione altrove, più quelle dell'area A–N); senza la motivazione dell'autore. Usato nel doppio e nella smentita. Misurato sul banco privacy con 9 gap ad alta priorità, 4 dei quali falsi aggiunti apposta (cookie di sessione senza consenso, tentativi di login mai cancellati, esportazione assente, coordinate della sede come dato personale): un sottoagente nuovo ha respinto 3 falsi e declassato il quarto (il codice fa il contrario del gap, ma il job non risulta avviato), nessun gap vero respinto, uno vero declassato a «ipotesi» con un motivo verificabile (Sentry non risulta caricato), e ha segnalato due difetti veri non presenti nell'elenco.

v1.2.1

Choose a tag to compare

@github-actions github-actions released this 01 Nov 16:24

[1.2.1] - 2026-11-01

Cambiato

  • check_delivery.py e checklist.py allineati ad appsec-sentinel (controllo dei problemi annotati nella checklist e dei punti pericolosi per categoria; non si applicano alla matrice A–N).