ARS Sicilia — Printing Press CLI
Prerequisites: Install the CLI
This skill drives the ars-sicilia-pp-cli binary. You must verify the CLI is installed before invoking any command from this skill. If it is missing, install it first:
- Install via the Printing Press installer. It defaults binaries to
$HOME/.local/binon macOS/Linux and%LOCALAPPDATA%\Programs\PrintingPress\binon Windows:npx -y @mvanhorn/printing-press-library install ars-sicilia --cli-only - Verify:
ars-sicilia-pp-cli --version - Ensure the reported install directory is on
$PATHfor the agent/runtime that will invoke this skill.
If the npx install fails (no Node, offline, etc.), fall back to a direct Go install (requires Go 1.26.6 or newer). This installs into $GOPATH/bin (default $HOME/go/bin), so add that directory to $PATH instead:
go install github.com/mvanhorn/printing-press-library/library/other/ars-sicilia/cmd/ars-sicilia-pp-cli@latest
If --version reports "command not found" after install, the runtime cannot see the binary directory on $PATH. Do not proceed with skill commands until verification succeeds.
Sostituisce le 12 maschere JSP del portale ufficiale con una CLI agent-native. Sync in SQLite locale per query SQL, ricerca full-text cross-archivio, e novel commands come ddl iter (timeline completa di un disegno di legge) e deputato profilo (tutta l'attività di un parlamentare in un'unica chiamata).
When to Use This CLI
Usa ars-sicilia-pp-cli quando devi cercare, scaricare o aggregare atti dell'Assemblea Regionale Siciliana (leggi regionali, disegni di legge, interrogazioni, mozioni, resoconti d'aula, lavori di commissione) e quando hai bisogno di output strutturato JSON/CSV per pipeline downstream o per assistenti AI via MCP. Particolarmente utile per giornalismo politico, ricerca civica, civic-hacking opendata, e analisi cross-archivio impossibili dal portale JSP nativo.
When Not to Use This CLI
Do not activate this CLI for requests that require creating, updating, deleting, publishing, commenting, upvoting, inviting, ordering, sending messages, booking, purchasing, or changing remote state. This printed CLI exposes read-only commands for inspection, export, sync, and analysis.
Unique Capabilities
These capabilities aren't available in any other tool for this API.
Vista cronologica cross-archivio
ddl iter— Ricostruisce la cronologia completa di un disegno di legge: presentazione, passaggio in commissione, lavori d'aula, eventuale promulgazione come legge regionale.Quando un agente deve raccontare 'a che punto sta il DDL X', questa è l'unica chiamata che restituisce la timeline completa senza incollare 5 ricerche manuali.
Gli eventi portano
sedutae, per le sedute d'Aula, unurlche punta alla scheda del resoconto (la scheda dell'atto è nel campourldella radice). Usali sempre quando parti da una notizia: la data dell'articolo è quasi sempre il giorno dopo la seduta, e confonderle fa concludere che manchi un resoconto che invece c'è.Se l'iter si ferma a «Approvato dall'Assemblea» senza un evento «Pubblicazione Gurs», il report lo dice in
note: i due archivi hanno ritardi diversi (il 21/08/2026 i ddl arrivavano a 24 giorni, le leggi a 30), quindi una legge appena approvata può non essere ancora nell'archivio leggi. Non concludere «non è stata promulgata» —novita --archivi leggidice fin dove arriva la fonte. È lo stesso buco chelegge cronologiacopre dall'altro verso.In
--selecttieni sempretitolo: è il campo che dice cosa è successo, mentredata,fase,sedeesedutadicono solo quando e dove, e fra due eventi possono coincidere legittimamente. Nella stessa seduta d'Aula un ddl viene esaminato e poi votato («Esaminato in Aula» e «Approvato dall'Assemblea», 29 lug 2026 seduta 268 sul ddl 6030): senzatitolole due righe escono identiche e l'approvazione finale sembra un duplicato da scartare.
fase dice dove l'evento è avvenuto, non dove il testo è diretto. «Esitato per Aula» è l'esito del lavoro di commissione — la commissione chiude l'esame e manda il testo all'Aula — e la riga dichiara una seduta di commissione: la fase è commissione. Prima quel verbo bastava a farne un evento d'Aula, e chi filtrava fase == "aula" per trovare il voto si portava dentro una riga di commissione, con la data sbagliata di settimane (sul ddl 5030 il 16 giugno invece dell'8 luglio, che è la seduta 263). Il criterio è la seduta dichiarata dal portale, non una lista di verbi: le righe d'Aula portano il marcatore AULA al posto del nome della commissione. E vale nei due versi: «Rinviato Commissione 0400 Seduta n. 255 AULA» è il rinvio in commissione deciso in Aula (la 255 è il resoconto d'Aula del 10 giugno 2026), quindi la fase è aula e la commissione di destinazione resta in sede — sul ddl 6030 quella riga usciva come commissione e un filtro per fase perdeva un passaggio d'Aula. Il titolo resta invece la fonte verbatim, codice grezzo compreso: la commissione risolta si legge in sede.
Il campo sede degli eventi dà la commissione in forma canonica — l'ordinale che gli altri comandi accettano (commissioni sommari --commissione QUARTA) — sulle righe in cui il portale dichiara una seduta, perché è lì accanto che la scrive, e la si legge da lì anche quando il verbo dell'evento dice altro o non la nomina affatto. Le commissioni speciali tengono il loro nome per esteso, e il nome d'uso resta comunque in titolo, che è verbatim: «Parere Commissione Bilancio» ha sede: Commissione SECONDA. Sulle righe senza seduta — le assegnazioni, gli invii — vale invece la dicitura del verbo, quindi la stessa commissione può comparire con due nomi nella stessa cronologia («Inviato Commissione Bilancio» resta Commissione Bilancio, il parere che ne segue è Commissione SECONDA). Non raggruppare una timeline per sede dandola per canonica.
Nella sede la CLI ricompone la parola che la fonte spezza con un trattino e un a-capo: l'HTML della scheda del ddl 5030 scrive Commissione</a> T-<br> ERZA, e l'iter usciva con «Commissione TERZA» quattro volte e «Commissione T- ERZA» una — due sedi dove ce n'è una. Il testo dell'evento resta invece verbatim in titolo, garbled compreso: lì la fonte si legge come la scrive.
L'ultimo evento di una legge è la pubblicazione in Gurs, e porta numero e data come li scrive la fonte: «Pubblicazione Gurs n. 44o1 del 21 agosto 2020». Il suffisso dopo il numero è la notazione del portale per i supplementi (la Gazzetta è la n. 44), non un refuso da correggere, e la data ripete quella dell'evento.
Se due eventi d'Aula danno alla stessa data numeri di seduta diversi, il link viene omesso su entrambi e un hint lo dice: l'Aula tiene una seduta al giorno, quindi almeno un numero è sbagliato nella fonte (ddl iter 17 199 dà il voto del 19 feb 2020 in «Seduta n. 179», ma la 179 è del 26 febbraio). In quel caso la chiave affidabile è la data: resoconti cerca --legisl 17 --data 2020-02-19.
La stessa seduta su più date non è un'anomalia: è una seduta fiume. L'Assemblea apre la seduta, la sospende e la riprende finché la manovra passa, e l'archivio resoconti la indicizza al giorno di apertura. Prima di dirlo la CLI lo verifica sull'archivio resoconti (una richiesta per seduta candidata, solo negli iter dove un numero compare su più date). Confermata, quegli eventi portano seduta_pluri_giorno: true e, sui giorni di ripresa, data_apertura — la data d'apertura dell'archivio, in ISO — e il link al resoconto c'è. Un numero che l'archivio non ha, o che apre in un giorno che l'iter non dichiara, non è una ripresa ma un numero sbagliato: resta anomalia: true senza link. Se l'archivio non risponde la lettura si tiene e la nota dice che non è verificata. Misurato su quattro finanziarie e due legislature: L.R. 1/2019 (seduta 98, aperta il 31 gennaio, voto il 15 febbraio), L.R. 9/2020 (187, 28 aprile → 2 maggio), L.R. 28/2024 (142, 5 → 7 novembre), L.R. 1/2025 (147, 18 → 28 dicembre). È per questo che cercare l'archivio per la data del voto non trova nulla (resoconti cerca --legisl 17 --data 2020-05-02 → []) mentre resoconti get 17 187 lo restituisce, con la data autorevole in radice (data, con data_iso accanto; resta anche in fields.Data). Non concludere «resoconto mancante»: cerca per numero.
Resta anomalia: true per la sola contraddizione vera — stessa data con numeri di seduta diversi — dove il link è omesso e la metà affidabile è la data: resoconti cerca --legisl 17 --data 2020-02-19. Il motivo, in tutti e due i casi, esce sia su stderr sia nel campo note del report, che --select non può togliere.
ars-sicilia-pp-cli ddl iter 18 1153 --json
ars-sicilia-pp-cli ddl iter 17 290 --json --select data,fase,seduta,titolo,url
ddl stralci— Elenca i disegni di legge ricavati per stralcio da un ddl base; il verso opposto è il campostralciodiddl geteddl iter.La finanziaria viene spacchettata in stralci che proseguono da soli, e la loro numerazione non segue una regola: gli stralci del ddl 1030 sono 3030…8030, quelli del 738 sono una ventina fra 7381 e 73864. Il legame lo dichiara il portale, non si calcola.
ars-sicilia-pp-cli ddl stralci 18 1030 --json ars-sicilia-pp-cli ddl stralci 18 1030/A --json # stessa risposta, con una nota che dice perchéIl numero si dà base: sommari e stampa citano il testo emendato come
1030/A, ma l'archivio non lo numera a parte e gli stralci sono gli stessi. Quella forma è accettata e il perché finisce innote; sugli altri comandi (ddl get,ddl iter) è invece un errore esplicito che indica il numero base, perché lì il documento chiesto sarebbe un altro.Nell'output,
base_dichiarata: falsecondi: []significa che il documento è uno stralcio ma il portale non dice di quale ddl (succede su parte della XVII legislatura, dove al posto del numero base è scritto l'id interno). Non dedurre la base dalla numerazione. Uno stralcio può inoltre nascere da più ddl abbinati:diha allora più voci. Suddl iterla cronologia di uno stralcio può cominciare prima della sua presentazione (il ddl 6030 è assegnato alla QUARTA il 13 gennaio 2026 ed è presentato il 27): sono i lavori che lo hanno ritagliato dal ddl base, non un dato sballato, e il report lo dice innote. Non è marcatoanomalia, che resta riservato a ciò che non può essere vero.deputato profilo— Aggrega in un'unica vista tutti gli atti firmati o pronunciati da un deputato: DDL, interrogazioni, interpellanze, mozioni, ordini del giorno, risoluzioni e interventi in resoconti d'aula.--data(rangeYYYY-MM-DD:YYYY-MM-DD) filtra per data su tutti i sotto-archivi. Un archivio che non risponde finisce innon_raggiunti, ed e' da leggere prima dei conteggi: i conteggi non lo comprendono. Prima quell'archivio spariva in silenzio e il profilo si presentava completo - su un periodo lungo mancavano ddl e interrogazioni, e il profilo del deputato usciva senza i suoi disegni di legge.Sostituisce un workflow di 7 click manuali con un'unica chiamata strutturata: pensata per agenti che rispondono a 'che ha fatto il deputato X?'.
ars-sicilia-pp-cli deputato profilo "Abbate Ignazio" --legisl 18 --json --select tipo,data,titolocommissione dossier— Vista completa su una commissione: convocazioni in calendario, sommari lavori, DDL assegnati e pareri richiesti al Governo regionale. Accetta il codice1-6, l'ordinale (PRIMA..SESTA) o un frammento della denominazione d'archivio. Le commissioni speciali (Antimafia, Statuto, Unione Europea) non hanno un codice e si raggiungono solo per denominazione, che non coincide con l'etichetta d'uso corrente:"Antimafia"non corrisponde a nulla, la denominazione è «Commissione d'inchiesta e vigilanza sul fenomeno della mafia e della corruzione in Sicilia». Un termine che non aggancia nessuna commissione non produce un dossier vuoto: l'errore elenca le denominazioni della legislatura.conteggioè quanto è stato scaricato,totalequanti ce ne sono. Prima esisteva solo il primo, e su--limit 100tre sezioni su quattro dicevanotroncatoa 100 senza dire se gli atti fossero 101 o 600: chi usava il dossier per dimensionare un fenomeno non aveva il denominatore. Ora le sezioni servite dall'ISIS lo portano — sulla PRIMA della XVIII,pareri82 eddl_assegnati637 — etroncatocompare solo quandototale > conteggio(con--limit 100i pareri escono 82 su 82, non troncati). Il totale diddl_assegnatiè però quello di una ricerca testuale sull'ordinale, non dell'elenco degli assegnati: l'archivio dei ddl non espone l'assegnazione come campo, e il report lo dichiara innote.convocazioniesommarirestano senza totale perché il backend/bd/che le serve non lo pubblica: meglio il dato assente di una stima dedotta dalle pagine. La qualifica sta innote, e a terminale è stampata sopra le sezioni: un100 risultati su 637senza quella riga si legge come il numero dei ddl assegnati, che non è.Quando segui i lavori di una commissione specifica, questa è l'unica chiamata che dà il quadro completo invece di 3 ricerche separate.
ars-sicilia-pp-cli commissione dossier "SESTA" --legisl 18 --json ars-sicilia-pp-cli commissione dossier "inchiesta e vigilanza" --legisl 18 --jsonlegge cronologia— Partendo da una legge regionale promulgata (archivio 201), risale al DDL originario, ai pareri di commissione e al voto d'aula: l'inverso temporale di ddl iter. Aggiungi sempre--anno: lo stesso numero di legge si ripete in anni diversi della stessa legislatura (nella XVIII ci sono due L.R. 26, ottobre 2024 e giugno 2025) e senza--annol'archivio ne restituisce una sola — la cronologia esce coerente e riferita all'atto sbagliato. Un avviso su stderr dice quale legge è stata presa. In radice,ddl_originariporta i numeri dei ddl da cui la legge nasce (più d'uno se erano abbinati): è l'aggancio diretto perddl iter, che prima andava estratto con una regex dalla frasesededell'eventoddl_originario. Se con--annogià dato la legge non si trova, l'errore non ripete «aggiungi--anno»: nomina le due cause vere, cioè una promulgazione troppo fresca per l'archivio (novita --archivi leggidice fin dove arriva la fonte: il 21/08/2026 era ferma al 22 luglio, e la L.R. 21/2026 del 4 agosto non c'era) oppure una coppia numero-anno inesistente. Per una legge recente l'iter si legge intanto dal lato ddl.Per ricercatori e giornalisti che partono dalla legge promulgata e vogliono raccontare come ci si è arrivati.
ars-sicilia-pp-cli legge cronologia 18 26 --anno 2025 --json
Analytics su campi strutturati
analytics— Identifica i deputati che firmano insieme atti parlamentari, restituendo coppie e cluster con conteggio per analisi di network politico. Richiede una deep sync dei ddl (sync --resources ddl --deep), che estrae i firmatari dalle schede di dettaglio.Per ricercatori e giornalisti che analizzano alleanze e dinamiche politiche: niente foglio Excel di trascrizioni manuali.
ars-sicilia-pp-cli sync --resources ddl --legisl 18 --deep ars-sicilia-pp-cli analytics --type ddl --group-by cofirmatari --limit 50 --jsonanalytics— Classifica i deputati per numero di interventi nei resoconti d'aula, con range date e legislatura, opzionale conteggio parole.Per le persone che vogliono sapere 'chi parla di più' senza scaricare 200 resoconti PDF e fare ctrl+F.
ars-sicilia-pp-cli analytics --type resoconti --group-by oratore --legisl 18 --limit 30 --csvÈ una richiesta per oratore (91 nella XVIII legislatura, ~40 secondi). Se il backend non risponde per qualcuno, la classifica esce lo stesso con gli altri e un
nota:su stderr elenca i nomi non misurati: quei nomi non sono "zero interventi", sono "non misurati" — ripetere il comando di solito li recupera.analytics— Classifica i disegni di legge per deputato proponente (primo firmatario) o per gruppo parlamentare, leggendo le viste già aggregate dal portale con una sola richiesta (nessuna sync). Copre la legislatura corrente (le classifiche non sono filtrabili per legislatura).Per rispondere subito a 'chi presenta più DDL' / 'quale gruppo è più prolifico' senza deep sync.
ars-sicilia-pp-cli analytics --type ddl --group-by proponente --limit 20 ars-sicilia-pp-cli analytics --type ddl --group-by gruppo --json
Anagrafiche dal sito istituzionale
gruppi elenco— Elenca i gruppi parlamentari di una legislatura (16, 17, 18; default 18), con lo slug per aprire il dettaglio. I nomi sono gli stessi del campo gruppo delle firme sugli atti, quindi l'elenco è anche il vocabolario per costruire la join. Con--deputato "<nome>"legge i dettagli di tutti i gruppi della legislatura e risponde alla domanda inversa — in quale gruppo sta un parlamentare, con ruolo e collegio — a costo di una richiesta per gruppo.L'anagrafica dei gruppi non sta nel motore documentale (dati.ars.sicilia.it), dove il gruppo compare solo come stringa accanto a una firma: sta sul sito istituzionale (www.ars.sicilia.it), che la CLI prima d'ora non toccava.
ars-sicilia-pp-cli gruppi elenco --legisl 18 --json ars-sicilia-pp-cli gruppi elenco --legisl 18 --deputato "Cracolici" --jsongruppi get— La composizione completa di un gruppo: cariche (Presidente, Vice-Presidente, Segretario, Tesoriere), collegio di elezione, email e scheda di ogni componente. Accetta lo slug (dall'elenco) o il nome del gruppo; un nome ambiguo esce con l'elenco dei candidati invece di indovinare.Da un nome di gruppo trovato negli atti si risale alla sua composizione in una sola richiesta.
ars-sicilia-pp-cli gruppi get XVIII-misto --json ars-sicilia-pp-cli gruppi get "Partito Democratico" --legisl 18 --json
Stato e monitoraggio
novita— Cosa è comparso negli archivi da una certa data in qua, tutti gli archivi datati in una chiamata, con accanto il ritardo di pubblicazione della fonte archivio per archivio.È la domanda di chi monitora, e finora costava una ricerca per archivio più un filtro a mano. Diversa da
ddl drift, che dice cosa si è mosso: quello richiede uno stato dell'iter da confrontare, che esiste solo sui ddl. Qui la domanda è cosa è nuovo, che si legge dalla data dell'atto e vale ovunque.ars-sicilia-pp-cli novita --since 7d --agent ars-sicilia-pp-cli novita --since 30d --archivi ddl,interrogazioni,resoconti --agent ars-sicilia-pp-cli novita --dal 2026-07-01 --archivi resoconti --csvIl ritardo accanto a ogni archivio è la parte che rende leggibile lo zero: le mozioni sono pubblicate con ~45 giorni di ritardo, quindi «gli ultimi 7 giorni» sarà vuoto a lungo, e non perché l'Assemblea sia ferma. Quando la finestra chiesta cade tutta dentro il ritardo, il comando lo dice invece di lasciare un elenco vuoto senza spiegazione.
conteggioè quanti ne ha trovati,--limit(default 30) è quanti ne mostra: il numero non dipende da quante righe hai chiesto di vedere. Sull'archivioleggila riga è per legge, non per articolo: il portale indicizza un articolo per riga, quindi senza aggregazione la sola L.R. 14/2026 valeva 7 novità. Ogni riga portaarticoli_trovati,atto(L.R. 14) enumero(14, il valore che passi a--numero).pareriebibliotecanon sono databili e vengono dichiarati tali, non riportati vuoti.In
--since,mvale mesi, non minuti (7d,3w,2m,1y, e24hper chi la scrive così).ddl drift— Confronta lo stato dell'iter dei DDL nella sync corrente con la precedente e segnala i disegni di legge che si sono mossi nel periodo (passati da commissione ad aula, approvati, ritirati). Richiede due deep sync (sync --resources ddl --deep) a distanza di tempo: solo la deep sync scrive il campoiterconfrontato.L'RSS shell esistente segnala solo 'nuovi'; per 'mossi' non c'è alternativa. Questo è il segnale che cercavano i journalist che seguono iter politici.
ars-sicilia-pp-cli ddl drift --since 7d --jsonsync stale— Mostra per ognuno dei 12 archivi ARS: timestamp ultima sync, n. record locali, età della sync, eventuale segnalazione di staleness.Per agenti che orchestrano sync automatico: decide se rinfrescare prima di rispondere o se i dati locali sono ancora freschi.
ars-sicilia-pp-cli sync stale --jsonanalytics --group-by cofirme— Quante volte ciascun deputato ha cofirmato, chiesto al portale in diretta: niente sync, niente deep sync.Non è
--group-by cofirmatari, che conta le coppie (chi firma insieme a chi) e quelle stanno solo dentro le schede di dettaglio, quindi richiede ancorasync --resources ddl --deep. Qui la domanda è «quanto cofirma ciascuno».ars-sicilia-pp-cli analytics --type ddl --group-by cofirme --legisl 18 --limit 20 --agentIl conto lo fa il motore di ricerca, interrogato in ISIS:
(18.LEGISL E ((Nome.FIRMAT) NOT (1 ADJ Nome).FIRMAT))— compare fra i firmatari ma non in prima posizione. Serve--legislperché i nomi valgono per legislatura, ed è una richiesta per deputato (~66, ~80 s). Vale su tutti gli archivi con un campo firmatario:ddl,interrogazioni,interpellanze,mozioni,odg,risoluzioni. Verificato contro i contatori pubblicati su www.ars.sicilia.it: Cracolici 302 e Catanzaro 306 ddl cofirmati nella XVIII, uguali al singolo atto. Chi non risponde viene nominato su stderr, non contato zero.sync coverage— Dice fin dove arriva la fonte, archivio per archivio: la data del documento più recente che il portale espone, il ritardo in giorni rispetto a oggi e, accanto, l'ultima sync locale.Serve a leggere un
[]per quello che è. Se la notizia è del 12 agosto e l'archivio ddl è fermo al 28 luglio, la ricerca a vuoto è latenza della fonte, non un atto inesistente — e senza questa misura le due cose si somigliano.ars-sicilia-pp-cli sync coverage --resources ddl --json ars-sicilia-pp-cli sync coverage --json # tutti i 12 archivi, ~45 sIl comando non assume l'ordinamento della fonte, che non è uniforme:
ddlconsegna dal più recente,leggidal più vecchio. Legge la prima pagina, guarda se le date scendono davvero, e solo quando non lo fa scarica l'anno intero per prendere il massimo. Tre risposte non sono un numero e vanno lette come tali:pareriscrive le date a parole e tagliate («17 luglio 2»), quindi non è misurabile;bibliotecanon ha proprio una colonna data; sugli archivi/bd/può uscire l'errore di backend, che come sempre non è assenza di dato — si riprova.convocazioniporta normalmente una data futura, perché annuncia sedute ancora da tenere: il ritardo negativo è corretto e il comando lo annota.Nota:
sync stale --max-ageha default7d(i dati ARS non cambiano su base oraria);doctor's cache section usa invece una soglia fissa di 6h, non configurabile. Le due soglie divergono di proposito — uno store chesync stalegiudica fresco può risultare"status": "stale"indoctor. Un agente che orchestra sync automatico non deve fidarsi solo disync stale: controlla anchedoctor'scache.statusse vuoi il segnale più conservativo.
Command Reference
biblioteca — Catalogo Bibliografico (archivio 205) e Opere Multimediali (205multimedia).
ars-sicilia-pp-cli biblioteca cerca— Cerca nel catalogo bibliografico per autore, titolo, soggetto o ISBN.ars-sicilia-pp-cli biblioteca multimediali— Cerca nelle opere multimediali.
commissioni — Lavori delle commissioni: convocazioni (229) e sommari (230).
ars-sicilia-pp-cli commissioni convocazioni— Convocazioni delle Commissioni.ars-sicilia-pp-cli commissioni sommari— Sommari dei lavori di commissione. Il filtro è--commissione/--codcom, ma in uscita la commissione sta intitolo(I - Affari Istituzionali): su questo archivio il titolo del record è il nome della commissione, non quello di un documento. Non esiste un campocommissione.
Restringi la ricerca, su questo archivio non è un vezzo. Il backend /bd/ consegna intere le risposte piccole e tronca a metà quelle grandi: misurato, --numero 270 è arrivato 10 volte su 10, la stessa ricerca senza filtri 2 volte su 8. Se sai il numero della seduta usa --numero; altrimenti --anno, poi --commissione. Quando una ricerca fallisce per troncatura, la CLI suggerisce quale filtro manca.
ars-sicilia-pp-cli commissioni sommari --legisl 18 --numero 270 --agent
--commissione accetta l'ordinale (PRIMA..SESTA), un frammento della denominazione (Bilancio) o, in alternativa, --codcom 1-6. Un termine che non corrisponde a nessuna commissione esce con errore e propone i nomi vicini: non restituisce una lista vuota, che si leggerebbe come "questa commissione non ha lavori".
ddl — Disegni di Legge (archivio 221): proposte di legge presentate all'ARS.
ars-sicilia-pp-cli ddl cerca— Cerca disegni di legge per legislatura, anno, firmatario, materia o testo.ars-sicilia-pp-cli ddl get— Scarica un singolo disegno di legge.
I valori giusti per i filtri non si indovinano, si chiedono. --materia e --firmatario vogliono il valore come lo scrive il portale, e un valore inventato non dà errore: dà zero risultati, che si legge come «non esiste». Tre comandi elencano i valori validi, tutti istantanei e senza sync:
ars-sicilia-pp-cli ddl materie --agent # 123 settori, da "Abrogazione di norme" a "Zootecnia"
ars-sicilia-pp-cli ddl firmatari --legisl 18 --agent # 66 deputati della XVIII; --search "Cracolici" per cercarne uno
ars-sicilia-pp-cli ddl iniziative --agent # Governativa, Parlamentare, Iniziativa Popolare, Consigli comunali/provinciali, Fatto proprio dalla Commissione
Attenzione a ddl iniziative: non esiste un flag --iniziativa. Il portale scrive il tipo di iniziativa nello stesso campo dei firmatari, quindi il valore si passa a --firmatario: ddl cerca --legisl 18 --firmatario Governativa restituisce i ddl del Governo (verificato: il ddl 1188 così trovato è firmato dal presidente Schifani).
gruppi — Gruppi parlamentari (www.ars.sicilia.it): elenco per legislatura e composizione con ruoli e collegio.
ars-sicilia-pp-cli gruppi elenco— Elenca i gruppi di una legislatura (16, 17, 18); con--deputato "<nome>"risponde «in quale gruppo sta un parlamentare».ars-sicilia-pp-cli gruppi get <slug-o-nome>— Composizione di un gruppo: cariche, collegio di elezione, email e scheda di ogni componente.
interpellanze — Interpellanze parlamentari (archivio 234).
ars-sicilia-pp-cli interpellanze cerca— Cerca interpellanze.ars-sicilia-pp-cli interpellanze get— Scarica una singola interpellanza.
interrogazioni — Interrogazioni parlamentari (archivio 233).
ars-sicilia-pp-cli interrogazioni cerca— Cerca interrogazioni per legislatura, firmatario o rubrica.ars-sicilia-pp-cli interrogazioni get— Scarica una singola interrogazione.
leggi — Leggi della Regione Siciliana (archivio 201): cerca e scarica le leggi regionali.
ars-sicilia-pp-cli leggi cerca— Cerca leggi regionali per legislatura, anno, numero o testo. Restituisce una riga per legge, non per articolo: l'archivio è indicizzato per articolo e senza aggregazione il--limitlo consumavano gli articoli della prima legge (alla domanda «quali leggi nel 2025?» rispondeva con una sola legge).articoli_trovaticonta gli articoli agganciati da questa ricerca, non quelli della legge. La legge si cita conatto(L.R. 14) e si filtra con--numero: da oggi la riga porta anchenumero(14), così il nome con cui chiedi è anche quello con cui rileggi. Con--articolitornano le righe per articolo: servono con--testo, per sapere in quale articolo ricorre il termine. La paginazione si ferma sulle leggi chieste, non su un budget di righe stimato prima: le leggi lunghe (finanziarie, ~25 articoli) costano più richieste, le corte meno. Costa tempo, e va messo in conto: il portale accetta 2 richieste al secondo, quindi ~20 s per dieci leggi di un anno pesante e ~100 s per un elenco annuale completo (26 leggi del 2024, misurato). Se ti serve solo sapere quali sono le più recenti, restringi con--numeroo--annoinvece di alzare--limit. Resta un tetto di sicurezza sulle righe lette; se scatta prima di completare le leggi chieste, un avviso su stderr lo dice — leggilo, altrimenti un elenco corto sembra completo. Anche il--limitraggiunto è un avviso:--anno 2026col default 10 dava 10 leggi su 14 dichiarandotroncato: false, cioè affermando una completezza che nessuno aveva verificato. Ora in quel casotroncatoètruee l'avviso dice di alzare--limit. L'ordine di consegna del portale non è cronologico, quindi un elenco tagliato non è nemmeno «le più recenti».ars-sicilia-pp-cli leggi get— Scarica una singola legge regionale. Usa--anno: lo stesso numero di legge si ripete ogni anno della legislatura e l'archivio ne restituisce una sola. Senza--anno,leggi get 17 9apre la L.R. 9/2018 e non la 9/2020; il comando ora dice su stderr e innotaquale legge ha aperto, ma la data la devi leggere.
mozioni — Mozioni parlamentari (archivio 235).
ars-sicilia-pp-cli mozioni cerca— Cerca mozioni.ars-sicilia-pp-cli mozioni get— Scarica una singola mozione.
odg — Ordini del Giorno (archivio 236).
ars-sicilia-pp-cli odg cerca— Cerca ordini del giorno.ars-sicilia-pp-cli odg get— Scarica un singolo ordine del giorno.
pareri — Pareri richiesti dal Governo regionale alle Commissioni (archivio 226).
ars-sicilia-pp-cli pareri cerca— Cerca pareri richiesti dal Governo.ars-sicilia-pp-cli pareri get— Scarica un singolo parere.
resoconti — Resoconti delle Sedute d'Aula (archivio 217).
ars-sicilia-pp-cli resoconti cerca— Cerca resoconti per data, numero, oratore o testo.--oratorerisolve il nome sull'anagrafica del portale: se non corrisponde a nessuna voce esce con errore e propone i nomi vicini, invece di restituire una lista vuota che si leggerebbe come "non è mai intervenuto". Usa il solo cognome se il nome completo non aggancia.ars-sicilia-pp-cli resoconti get— Scarica un singolo resoconto. Non restituisce la trascrizione integrale: l'archivio Icaro ne conserva solo frammenti per punto dell'ordine del giorno, e per le sedute recenti non ha nulla (si ferma alla n. 232 del 25.02.2026, mentrecercaarriva a luglio 2026). Quando Icaro non ha la seduta,getripiega sulla scheda del backend corrente e restituiscepdf_url: è lì il resoconto stenografico completo. Il PDF non viene scaricato — pesa alcuni MB e supera i 200.000 caratteri di testo — ma l'URL è stabile e citabile. In quel caso la risposta non ha il campobody(che invece c'è quando il record viene da Icaro) e porta un camponotache lo dice: l'assenza dibodynon significa «testo non disponibile». Se il backend non risponde — capita, tronca le risposte a intermittenza — la CLI ritenta da sola (3 tentativi) e solo dopo esce conil backend /bd/ non ha risposto …, che è diverso danessun documento trovato: quest'ultimo esce solo quando il backend ha risposto e la seduta davvero non c'è. Non dedurre da un errore di backend che l'atto non esista. I due percorsi hanno la stessa forma:legisl,numero,data,data_iso,titoloefontestanno in radice sia sulla scheda Icaro sia su quella/bd/, quindi lo stesso--select numero,data_iso,titolorende su tutte le sedute. Prima le coordinate della scheda Icaro stavano solo dentrofields, e quel--selecttornava{}con exit 0 sulle sedute più vecchie della 232 — che si legge come «il documento non ha quei dati».fieldsresta dov'era: è un'aggiunta, non uno spostamento.fontedice quale dei due percorsi ha risposto.ars-sicilia-pp-cli resoconti get 18 263 --agent --select pdf_url # poi, se serve il testo: curl -sL "<pdf_url>" -o seduta.pdf
risoluzioni — Risoluzioni parlamentari (archivio 238).
ars-sicilia-pp-cli risoluzioni cerca— Cerca risoluzioni.ars-sicilia-pp-cli risoluzioni get— Scarica una singola risoluzione.
Nessun argomento posizionale sui comandi di ricerca
Ogni criterio si passa come flag. I comandi */cerca, commissioni convocazioni|sommari e biblioteca multimediali non prendono argomenti posizionali e li rifiutano con un errore: commissioni sommari cerca --commissione X è sbagliato (cerca non è un sottocomando lì), la forma giusta è commissioni sommari --commissione X. Prima venivano accettati e scartati in silenzio, il che faceva credere di aver invocato un comando diverso da quello realmente eseguito.
La punteggiatura dentro un valore di ricerca: la CLI la toglie e lo dice
Il motore ISIS del portale non accetta la punteggiatura dentro il valore di un filtro: non la ignora, rifiuta la ricerca. Misurato il 2026-09-06 sull'archivio ddl, un carattere per volta: ' " , - / . ; : + * ? & ! ( = # fanno rispondere una pagina d'errore («Impossibile creare la Query»). Passano lettere, cifre, spazio, il troncamento $ e %.
Non è un caso di nicchia: rifiutavano --iter "Approvato dall'Assemblea" (il nome dello stato scritto dal portale stesso), --firmatario "D'Agostino" (un cognome siciliano), --testo "dell'ambiente", --materia "sanita'", --testo "COVID-19". E il messaggio che arrivava era quello della soglia — «restringi il periodo» — cioè una strada che lì non porta da nessuna parte.
Adesso la CLI ripulisce il valore prima di spedirlo e dichiara su stderr cosa è partito davvero: --firmatario «D'Agostino» è partito come «D Agostino». La sostituzione con uno spazio è fedele all'indice, non una resa: il portale indicizza la punteggiatura come separatore di parole, e in un valore di campo lo spazio vale adiacenza. Verificato: --iter "Approvato dall Assemblea" torna le stesse 16 righe di --iter "Assemblea" sul 2026, mentre --iter "Assegnato Assemblea" — due stati veri ma non adiacenti — torna vuoto.
Restano intatti i valori con parentesi (chi le scrive sta scrivendo la propria espressione), --isis-query, che è la via d'uscita per chi vuole comandare la sintassi, e i valori di --data e --anno, i due parametri il cui contenuto lo costruisce la CLI (260101/261231): lì la punteggiatura è sintassi. L'esenzione sta sul nome del parametro, non sulla forma del valore: un valore non dice da sé se è una data, lo dice il campo in cui sta — --testo "2026-07-01" cerca un documento che cita quella data, ed è una domanda legittima che va ripulita come tutte le altre.
--isbn è l'eccezione, e non si deduce dalla forma del valore. Due campi numerici dello stesso archivio si comportano al contrario: su --dewey "340.5" il punto separa davvero due token e la riscrittura in spazio trova il record; su un ISBN la punteggiatura è formattazione di un numero solo. E l'archivio non è coerente con sé stesso — 9788875241667 sta come token unico, un altro record porta 978 88 98231-25-6, spazi e trattini insieme. Nessuna delle due grafie da sola copre il catalogo (misurato: ciascuna trova uno dei due record e perde l'altro), quindi --isbn le spedisce entrambe in OR: --isbn "978-88-7524-166-7" parte come (9788875241667 O (978 88 7524 166 7)).ISBN e l'avviso lo dice.
I rifiuti del portale ora si distinguono, e chiedono mosse opposte: (QR997) è la soglia, il motore cede sul numero di documenti e restringere il periodo funziona; «Impossibile creare la Query» (senza codice) e (QR999) Operando con crt non validi sono sintassi, e restringere non cambia nulla — la stessa espressione viene rifiutata su nove mesi come su un giorno. In quel caso la CLI non spreca più lo spezzettamento in sottoperiodi. Il secondo codice porta un QRxxx come la soglia: distinguerli guardando solo la presenza del codice non basta.
ddl cerca --iter: filtra sugli stati attraversati, non su quello attuale
Il campo indicizza tutta la storia dell'atto. --iter "Assegnato" restituisce anche i ddl che l'assegnazione l'hanno passata da un pezzo: il ddl 779, presentato nel 2024, esce da --iter "Assegnato" --anno 2024 pur essendo molto più avanti. Per lo stato corrente di un atto la risposta è ddl iter <legisl> <numero>, non questo filtro.
Con questo in mente il filtro risponde alle domande d'insieme, che prima non avevano strada:
# quanti ddl la XVIII legislatura ha approvato in Aula
ars-sicilia-pp-cli ddl cerca --legisl 18 --iter "Approvato dall'Assemblea" --limit 300 --agent # 112
# quanti ne sono passati dalla I Commissione
ars-sicilia-pp-cli ddl cerca --legisl 18 --iter "Assegnato per esame Commissione PRIMA" --limit 300 --agent # 52
Due avvertenze prima di trarne conclusioni. Il valore è una locuzione, non un insieme di parole: dev'essere scritto come lo scrive il portale nell'iter dell'atto (ddl iter lo mostra), perché uno spazio vale adiacenza e un termine inventato torna [], indistinguibile da «nessun caso reale». E l'indice della fonte ritarda sui ddl più recenti, proprio quelli che interessano a chi segue una notizia: il ddl 1196, assegnato il 05/08/2026, il 06/09/2026 non usciva ancora da --iter "Assegnato" --anno 2026. Un elenco che sembra completo e non lo è è il falso segnale peggiore: incrocia con ddl iter sugli atti recenti.
Il backend /bd/ tronca le risposte grandi
Gli archivi delle sedute — resoconti, commissioni sommari, commissioni convocazioni — sono serviti dal backend /bd/ del portale, che a intermittenza consegna il corpo della risposta tagliato a metà: status 200, header regolari, e il contenuto che si interrompe. Non è un timeout (le risposte tagliate arrivano in due decimi di secondo) e non dipende dal protocollo (succede identico su HTTP/2 e HTTP/1.1). Dipende da quanto è grande la risposta: misurato su sommari, la ricerca di una singola seduta (24 KB) è arrivata 8 volte su 8, la stessa ricerca senza filtri (44 KB) zero volte su 8.
Cosa fa la CLI da sola: ritenta ogni lettura fino a 3 volte, e quando si arrende lo dice come guasto del backend — mai come assenza del dato. il backend /bd/ non ha risposto non significa che l'atto non esista: significa riprovare, possibilmente restringendo. Il nessun documento trovato invece è affidabile, esce solo quando il backend ha risposto davvero.
Cosa devi fare tu: chiedere meno righe. In ordine di efficacia, --numero (la singola seduta; su resoconti e commissioni sommari, mentre convocazioni non ha un numero di seduta), poi --anno, poi --commissione. Quando una ricerca fallisce per troncatura la CLI ti dice quale di questi filtri manca.
Dove la troncatura non si può evitare, viene dichiarata invece che nascosta: analytics --group-by oratore fa 91 richieste e, se qualcuna cade, pubblica la classifica con gli altri e nomina su stderr chi non è stato misurato — quei nomi non sono «zero interventi».
Sullo stesso backend non esistono i filtri ISIS: --isis-query, --escludi e --frase (più `--preside
…(truncated)