- **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.
0 commit comments