---
name: pp-ars-sicilia
description: "L'unica CLI per il portale dell'Assemblea Regionale Siciliana: cerca Trigger phrases: `ars sicilia`, `assemblea regionale siciliana`, `disegni di legge sicilia`, `interrogazioni ars`, `mozioni siciliane`, `resoconti aula sicilia`, `use ars-sicilia`, `run ars-sicilia`."
author: "aborruso"
license: "Apache-2.0"
argument-hint: "<command> [args] | install cli|mcp"
allowed-tools: "Read Bash"
metadata:
  openclaw:
    requires:
      bins:
        - ars-sicilia-pp-cli
---
<!-- GENERATED FILE — DO NOT EDIT.
     This file is a verbatim mirror of library/other/ars-sicilia/SKILL.md,
     regenerated post-merge by tools/generate-skills/. Hand-edits here are
     silently overwritten on the next regen. Edit the library/ source instead.
     See the repository agent guide, section "Generated artifacts: registry.json, cli-skills/". -->

# 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:

1. Install via the Printing Press installer. It defaults binaries to `$HOME/.local/bin` on macOS/Linux and `%LOCALAPPDATA%\Programs\PrintingPress\bin` on Windows:
   ```bash
   npx -y @mvanhorn/printing-press-library install ars-sicilia --cli-only
   ```
2. Verify: `ars-sicilia-pp-cli --version`
3. Ensure the reported install directory is on `$PATH` for 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.10 or newer). This installs into `$GOPATH/bin` (default `$HOME/go/bin`), so add that directory to `$PATH` instead:

```bash
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 **`seduta`** e, per le sedute d'Aula, un **`url`** che punta alla scheda del resoconto (la scheda dell'atto è nel campo `url` della 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 leggi` dice fin dove arriva la fonte. È lo stesso buco che `legge cronologia` copre dall'altro verso.

  In `--select` tieni sempre **`titolo`**: è il campo che dice *cosa* è successo, mentre `data`, `fase`, `sede` e `seduta` dicono 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): senza `titolo` le 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.

  ```bash
  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 campo `stralcio` di `ddl get` e `ddl 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._

  ```bash
  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 in `note`; 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: false` con `di: []` 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: `di` ha allora più voci. Su `ddl iter` la 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 in `note`. Non è marcato `anomalia`, 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` (range `YYYY-MM-DD:YYYY-MM-DD`) filtra per data su tutti i sotto-archivi.
  Un archivio che non risponde finisce in **`non_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?'._

  ```bash
  ars-sicilia-pp-cli deputato profilo "Abbate Ignazio" --legisl 18 --json --select tipo,data,titolo
  ```
- **`commissione dossier`** — Vista completa su una commissione: convocazioni in calendario, sommari lavori, DDL assegnati e pareri richiesti al Governo regionale. Accetta il codice `1`-`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, `totale` quanti ce ne sono.** Prima esisteva solo il primo, e su `--limit 100` tre sezioni su quattro dicevano `troncato` a 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, `pareri` 82 e `ddl_assegnati` 637 — e `troncato` compare solo quando `totale > conteggio` (con `--limit 100` i pareri escono 82 su 82, non troncati). Il totale di `ddl_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 in `note`. `convocazioni` e `sommari` restano 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 in `note`, e a terminale è stampata sopra le sezioni: un `100 risultati su 637` senza 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._

  ```bash
  ars-sicilia-pp-cli commissione dossier "SESTA" --legisl 18 --json
  ars-sicilia-pp-cli commissione dossier "inchiesta e vigilanza" --legisl 18 --json
  ```
- **`legge 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 `--anno` l'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_originari` porta i numeri dei ddl da cui la legge nasce (più d'uno se erano abbinati): è l'aggancio diretto per `ddl iter`, che prima andava estratto con una regex dalla frase `sede` dell'evento `ddl_originario`. Se con `--anno` già 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 leggi` dice 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._

  ```bash
  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._

  ```bash
  ars-sicilia-pp-cli sync --resources ddl --legisl 18 --deep
  ars-sicilia-pp-cli analytics --type ddl --group-by cofirmatari --limit 50 --json
  ```
- **`analytics`** — 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._

  ```bash
  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._

  ```bash
  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._

  ```bash
  ars-sicilia-pp-cli gruppi elenco --legisl 18 --json
  ars-sicilia-pp-cli gruppi elenco --legisl 18 --deputato "Cracolici" --json
  ```
- **`gruppi 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._

  ```bash
  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._

  ```bash
  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 --csv
  ```

  Il ritardo accanto a ogni archivio è la parte che rende leggibile lo zero: le mozioni sono pubblicate con circa 45 giorni di ritardo (misurato il 18/09/2026: 44), quindi «gli ultimi 7 giorni» s