Repository navigation
Releases: dextsamu/gdpr-sentinel
Releases · dextsamu/gdpr-sentinel
Release list
v1.4.2
[1.4.2] - 2026-11-02
Aggiunto
- Matrice dell'informativa (
scripts/notice_matrix.py, lanciato dal pre-passaggio, scriveinformativa.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 dientita.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
[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 verificabilenon è più ammesso se ce ne sono; ungaprichiede ilfile:rigainnote). merge_audits.py(condiviso): conentita.csvin tutti i giri stampa l'accordo cella per cella sulle righe aperte, per domanda, e scrive l'entita.csvunita 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
[1.4.0] - 2026-11-02
Aggiunto
- Matrice per entità (
scripts/entity_matrix.py, lanciato dal pre-passaggio, scriveentita.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,gapcongap_id,non applicabile,non verificabilecon motivo), con un gap per domanda che elenca le entità;chiudifallisce 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 conletture.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
[1.3.3] - 2026-11-02
Aggiunto (prova dinamica)
cookie_scan.pyprovato 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/recaptchae/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 intests/run_checks.pyquando PHP e Playwright sono disponibili.
Misurato (Juice Shop con altri agenti)
appsec-sentinel rapidosu Juice Shop, stesso prompt: Codex 18/32 (vicino 22), Antigravity 6/32 (vicino 9), Claude 19–23/32. Tabella indocs/ALTRI-AGENTI.md.
Aggiunto
punti-pericolosi.csvcomprende 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:312e:313) o con intervalli diversi (330-346e313-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 consio connoe il motivo, altrimentichiudifallisce. 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,chiudisenza 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 indicaredoppioper le app grandi. Dettagli in ROADMAP.
v1.3.2
[1.3.2] - 2026-11-02
Misurato
- Codex:
appsec-sentinel rapidosul banco Django, 11/11 difetti (6/6 alti), 0 falsi allarmi, smentita con un sottoagente indipendente (3 resistono, 1 declassato),chiudisenza falliti. Con Antigravity (10/11) le due skill sono ora misurate su Claude, Codex e Antigravity.
v1.3.1
[1.3.1] - 2026-11-01
Misurato
- Antigravity e Codex:
gdpr-sentinel staticasul 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 indocs/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
chiudifalliva.
v1.3.0
[1.3.0] - 2026-11-01
Aggiunto
- Report PDF per
standardecompleto: due sezioni nuove, «Threat model» (dareport/threat-model.md: titoli, elenchi e tabelle resi come testo) e «Test dinamici eseguiti» (le righe della matrice endpoint contest_eseguito=si: identità, controllo atteso, esito osservato, finding). Prima il PDF mostrava solo il conteggio degli endpoint provati. punti-pericolosi.csvanche 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 inregistro-tool/punti-pericolosi.txt; ogni riga chiude congap(ID nella colonnafinding, almeno uno che cita un file della categoria) onon difettocon unfile:rigaletto; «non esaminato» fa fallirechiudi. 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 giristaticanuovi: 27 e 24 gap,chiudisenza 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.envversionati, 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 conimporta. apply_refutations.pyriporta gli esiti anche nella colonnasmentitadigdpr-matrix.csv, per le righe i cui gap sono tutti smentiti (prima la matrice restava «non eseguita» echiudisegnalava 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 girostandarddel 01/11/2026 sul PC dell'autore.gap_briefs.pysceglieva solo i gap consmentitavuota o esattamente «non eseguita»: ora anche «non eseguita | motivo | …», la forma che la skill fa scrivere.
v1.2.3
[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 giristaticaindipendenti, 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.pylegge anche i file.php(e.htm,.vue,.svelte,.twig,.erb,.jsp,.cshtml…), riconosce i servizi dal percorso (Google reCAPTCHA e Google Maps suwww.google.com), Mailgun, SendGrid, YouTube senza cookie, Vimeo, hCaptcha, Turnstile, e ricava i trattamenti dagli schemi SQL (CREATE TABLE);privacy_scan.pyriconosce 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
[1.2.2] - 2026-11-01
Aggiunto
- Brief per la smentita dei gap (
scripts/gap_briefs.py <cartella> --repo <repository>): un file per gap insmentite/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 neldoppioe nellasmentita. 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
[1.2.1] - 2026-11-01
Cambiato
check_delivery.pyechecklist.pyallineati ad appsec-sentinel (controllo dei problemi annotati nella checklist e dei punti pericolosi per categoria; non si applicano alla matrice A–N).