Skip to content

Commit 340c2f0

Browse files
aborrusoclaude
andcommitted
release: v0.26.2 — fix 403 senato-votes, bill-progress Camera
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent bd8a287 commit 340c2f0

6 files changed

Lines changed: 7 additions & 5 deletions

File tree

LOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## 2026-07-25
44

5+
- **v0.26.2** — release patch. Due fix e la misura del limite di dimensione delle richieste al Senato (2047 byte accettati, 2048 rifiutati), che spiega e chiude una classe di 403 finora attribuita al blocco anti-burst. PR #75 e #76, mergiate via squash. 43 tool invariati, 189/189 test verdi.
6+
57
- **fix `senato-votes` — eliminati i 403 sistematici da query troppo lunga, e misurato il limite vero dell'endpoint Senato** (#72, PR #76) — `senato-votes --keyword` falliva sempre con 403 a meno di aggiungere `--final-vote true` o `--confidence-vote false`. Non era il blocco anti-burst: l'endpoint accetta una request-URI (`/sparql?query=…`) fino a **2047 byte** e da **2048** in su risponde con una pagina 403 HTML — non un 414, non un errore SPARQL. Confine trovato per bisezione al singolo byte, con query di controllo a 200 subito prima e subito dopo ogni misura (un blocco per frequenza respinge anche l'hello-world; qui no). Il **POST è sempre rifiutato**, anche su 448 byte, quindi il limite non si aggira spostando la query nel corpo: l'unica strada è tenere corta la GET. La Camera, per confronto, accetta query da 4 KB: `votes.ts:369` ha lo stesso pattern OR-chain ma non è a rischio e resta invariato. Sotto la soglia finivano **tre** query, non una: le OR-chain `FILTER(STR(?f) = "S.<num>" || …)` in due punti distinti (supplemento fiducie e Fallback 1), con 53 fiducie in leg. 19, ora spezzate in blocchi da 25 con merge invariato first-wins; e soprattutto **la query principale, che sfora da sola** appena la keyword è multi-parola (2059 byte con `"corte dei conti"`), dove non c'è nessuna lista da spezzare — il chunking non l'avrebbe mai risolta. Rimossa l'indentazione, che finisce dritta nella URI, e ridotto l'header dei prefissi ai due effettivamente usati (`xsd:` solo quando serve): 2081 → 1926 byte. La keyword entra **tre volte** nella query (label, `osr:titolo`, `osr:titoloBreve`), quindi la lunghezza cresce di circa tre volte la keyword e il margine non è infinito: `BIND` risolverebbe alla radice ma questa istanza Virtuoso non lo supporta, perciò `assertQueryFits` blocca in partenza con un messaggio che dice cosa fare, invece di lasciare arrivare un 403 opaco. Nuovi helper `src/core/chunk.ts` e `src/core/senato-query-size.ts` (+10 test, incluso il confine esatto 2047/2048, così il prossimo filtro aggiunto non rompe la soglia in silenzio). Verifica: la fiducia sul DL 48/2025 del 2025-06-04 (109-69-1) torna nei risultati ed è proprio una riga che arriva dal supplemento — il suo label non contiene "sicurezza" — quindi il chunking non perde nulla; 189/189 test verdi. **Lezione**: i due test `senato-votes` rossi da giorni sembravano rate limit della suite, ma fallivano anche isolati in 0,6 s con l'endpoint raggiungibile — era il difetto.
68

79
- **fix `bill-progress` (Camera) — `presentation_date` e `initiative_description` non sono più vuoti** (#74, PR #75) — sul ramo Camera le due colonne erano hardcoded a stringa vuota pur essendo il dato sulla stessa risorsa già interrogata dalla query, e già letto senza problemi da `bills list`. `initiative_description` non è ricavabile in nessun altro modo dalla timeline (governativa, parlamentare o popolare è la prima cosa che si guarda in un iter), e `presentation_date` di solito coincide con la data del primo `statoIter` ma non sempre: in leg. 19 divergono su **23 atti**, quindi dedurla dalla prima riga era un'euristica sbagliata in quei casi. Fix a costo zero: due `OPTIONAL` (`dc:date`, `ocd:iniziativa`) nella query esistente, nessuna chiamata di rete in più. Proiettarle in `SELECT DISTINCT` è sicuro perché sono proprietà dell'atto con cardinalità 1 — verificato prima di editare su leg. 17, 18 e 19: zero atti con più di un valore, nessuna moltiplicazione di righe (`ac19_824`: 6 righe prima, 6 dopo). `nature` resta vuota: `dc:type` è semantica diversa, fuori dallo scopo.

manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"dxt_version": "0.1",
33
"name": "italianparliament-mcp",
4-
"version": "0.26.1",
4+
"version": "0.26.2",
55
"display_name": "Italian Parliament MCP",
66
"description": "Query Italian Parliament open data (Camera dei Deputati + Senato della Repubblica)",
77
"long_description": "MCP server for the Italian Parliament SPARQL endpoints (dati.camera.it, dati.senato.it). Tools for deputies, senators, bills, votes, speeches, parliamentary groups, government members, oversight acts, committees, rankings, and direct links to bill texts. Designed for journalists, researchers and parliamentary analysts.",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@aborruso/italianparliament-mcp",
3-
"version": "0.26.1",
3+
"version": "0.26.2",
44
"description": "CLI and MCP server for querying Italian Parliament SPARQL endpoints (Camera dei Deputati and Senato della Repubblica)",
55
"main": "dist/index.js",
66
"type": "module",

src/core/client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ async function sparqlRequest(
6161
method: "GET",
6262
headers: {
6363
Accept: "application/json",
64-
"User-Agent": "italianparliament-mcp/0.26.1",
64+
"User-Agent": "italianparliament-mcp/0.26.2",
6565
},
6666
signal: controller.signal,
6767
});

src/server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ function makeHandler(tool: Tool) {
9797
export function createServer(): McpServer {
9898
return new McpServer({
9999
name: "italianparliament-mcp",
100-
version: "0.26.1",
100+
version: "0.26.2",
101101
});
102102
}
103103

src/worker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default {
1010
return new Response(
1111
JSON.stringify({
1212
name: "italianparliament-mcp",
13-
version: "0.26.1",
13+
version: "0.26.2",
1414
description:
1515
"MCP server for querying Italian Parliament SPARQL endpoints (Camera + Senato)",
1616
mcp_endpoint: "/mcp",

0 commit comments

Comments
 (0)