Skip to content

Commit 8ff8365

Browse files
aborrusoclaude
andcommitted
refactor(vote-detail): togli gli esempi di sigla dai testi utente + LOG
I messaggi citavano AZ-PER-RE → APERRE e la forma "M-*" delle componenti Misto: sono fatti di oggi sulla fonte, che diventerebbero testo sbagliato e branch morta se la Camera allinea le sigle. L'hint mantiene il valore diagnostico senza codificarli, perché nomina già il candidato reale e elenca le sigle restituite dalla query; la nota sul Misto ora dipende dalla stringa richiesta, non dalla forma dei dati. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent ea600c1 commit 8ff8365

2 files changed

Lines changed: 20 additions & 9 deletions

File tree

LOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# LOG
22

3+
## 2026-07-26
4+
5+
- **fix `vote-detail` — `--group-acronym` non restituisce più zero righe in silenzio** (#77, PR #80) — la sigla passata dall'utente finiva dritta in un `FILTER(STR(?_sg) = "…")`: se non esisteva nel dataset votazioni il risultato era vuoto, con exit 0 e nessun avviso, indistinguibile da "il gruppo non ha votato". E le sigle divergono per davvero: `groups list` espone `AZ-PER-RE` e `IV-CR`, i voti della stessa legislatura portano `APERRE` e `IVICRE`, e il Misto lato voto è disaggregato in `M-ALT`/`M-MIN`/`M-+EUR`. Seguendo il flusso documentato (cerca la sigla in `groups`, poi filtra) si concludeva il falso. Nemmeno `group_uri` era una chiave utilizzabile: per Azione è `gr4135` nella risorsa gruppo e `gr4212` sui voti, e le componenti del Misto ce l'hanno vuoto. Ora, quando `--group-acronym` è valorizzato, una query leggera recupera le sigle **realmente presenti in quella votazione** e la richiesta viene risolta contro quelle (esatta → case-insensitive → senza punteggiatura); se risolve, la query principale è invariata, quindi performance e semantica del `LIMIT` non cambiano. Se non risolve: righe vuote più una nota (stderr in CLI, testo nell'MCP) con l'elenco delle sigle presenti, la più simile in testa (Dice sui bigrammi, soglia 0,4) e la spiegazione per il Misto. Nessun alias `AZ-PER-RE → APERRE` nel codice: il disallineamento è della fonte e si romperebbe al primo cambio di denominazione — il codice interroga il dato e rende visibile il problema, non lo compensa. +10 test sulle due funzioni pure, 199/199 verdi. Emerso dal report news-agent `2026-07-26_08-58.md`. **Residuo noto**: le sigle sono raccolte senza applicare `--vote-type`, quindi una sigla valida ma senza voti di quel tipo resta un vuoto senza nota — comportamento corretto (il gruppo ha votato, non in quel modo), fuori dallo scopo di #77.
6+
7+
- **segnalata a monte la radice del problema** — punto 9 della nota `docs/note-gestori-lod/camera-assistenza-dati.md`: sigla della risorsa gruppo diversa da quella dei voti (`gr4211`: `IV-CR` nella label, `IVICRE` in `ocd:siglaGruppo`), URI referenziati dalle votazioni ma mai descritti (`gr4212` con 160.881 voti e `gr4234`: zero triple come soggetto), denominazione storica sovrascritta (`gr4135` ha oggi la label `AZ-PER-RE` ma i suoi 88.475 voti portano `AIV-RE`), componenti del Misto senza URI, e nessuna proprietà "sigla" sulla risorsa gruppo — l'acronimo è estraibile solo dalla label, che per giunta arriva troncata (punto 4 della stessa nota). Il fenomeno è generale e vale per entrambe le camere, quindi è anche scheda **B5** del dossier di campagna (`docs/campagna-parlamento-aperto/02-dossier-tecnico.md`) con riga in tabella di sintesi: al Senato il legame voto→gruppo non esiste proprio (la votazione punta ai senatori con `osr:favorevole`/`osr:contrario`/`osr:astenuto`, nessuna proprietà di gruppo) e va ricostruito dalle adesioni valide alla data.
8+
9+
- **gap analysis news-driven** (`docs/news-agent/2026-07-26_08-58.md`) — 6 notizie mai testate prima (Giunta autorizzazioni/chat Delmastro, riforma forense al Senato, mozioni di sfiducia Santanchè e Nordio, DL 130/2020 immigrazione e DL 137/2020 Ristori). Copertura piena su 5 storie su 6, storico leg. 18 lato Camera senza degrado. Tre issue aperte con triage: #77 (sopra), #78 (`which` non trova "giunta per le autorizzazioni" e instrada "immunità parlamentare" verso `search find`, un falso positivo peggiore di un no-match), #79 (`confidence_vote=true` marca anche le mozioni di sfiducia individuale ex art. 115: è `ocd:richiestaFiducia` della fonte, non un valore derivato, quindi `documentation` + `gap-dataset`). Un quarto rilievo del report — quoting CSV rotto in `groups list` — **non è stato aperto**: verificato con un parser CSV vero su leg. 17, 18 e 19, tutte le righe hanno 6 colonne e il campo con le virgole è quotato correttamente. Era un artefatto del `cut -d,` usato per leggere l'output, non un difetto.
10+
311
## 2026-07-25
412

513
- **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.

src/tools/vote-detail.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const inputSchema = z.object({
1414
.string()
1515
.optional()
1616
.describe(
17-
"Filtra per sigla gruppo (es. 'FDI', 'M5S', 'APERRE'). Le sigle sono quelle del dataset votazioni, che NON sempre coincidono con l'acronym di `groups list` (es. AZ-PER-RE → APERRE, IV-CR → IVICRE) e in cui il gruppo Misto è disaggregato nelle sue componenti (M-ALT, M-MIN, …). Maiuscole/minuscole e punteggiatura sono irrilevanti; se la sigla non esiste in quella votazione il risultato è vuoto con l'elenco delle sigle presenti.",
17+
"Filtra per sigla gruppo (es. 'FDI', 'M5S'). Le sigle sono quelle registrate sui voti, che non sempre coincidono con l'acronym di `groups list`, e il gruppo Misto può comparire disaggregato nelle sue componenti. Maiuscole/minuscole e punteggiatura sono irrilevanti; se la sigla non esiste in quella votazione il risultato è vuoto e l'elenco delle sigle presenti viene restituito come nota.",
1818
),
1919
voteType: z
2020
.enum(["Favorevole", "Contrario", "Astensione", "Non ha votato"])
@@ -31,11 +31,12 @@ function stripLegLabel(label: string): string {
3131

3232
const columns = ["deputy_uri", "deputy_name", "vote", "group_uri", "group_acronym", "html_url"];
3333

34-
// Le sigle di `ocd:siglaGruppo` (dataset votazioni) non coincidono con
35-
// l'acronym di `groups list`: AZ-PER-RE → APERRE, IV-CR → IVICRE, e il Misto è
36-
// disaggregato per componente. Il confronto ignora quindi maiuscole e
37-
// punteggiatura, ma le differenze restanti non sono derivabili da una regola:
38-
// per quelle si mostra l'elenco delle sigle realmente presenti nel voto.
34+
// Le sigle di `ocd:siglaGruppo` (sui voti) non coincidono con l'acronym di
35+
// `groups list`: al 26/7/2026, in leg. 19, AZ-PER-RE → APERRE, IV-CR → IVICRE,
36+
// e il Misto è disaggregato per componente (issue #77, segnalato al gestore del
37+
// dato). Il confronto ignora quindi maiuscole e punteggiatura, ma le differenze
38+
// restanti non sono derivabili da una regola: per quelle si mostra l'elenco
39+
// delle sigle realmente presenti nel voto, senza codificarne nessuna qui.
3940
function normalizeAcronym(s: string): string {
4041
return s.toUpperCase().replace(/[^A-Z0-9]/g, "");
4142
}
@@ -84,14 +85,16 @@ export function buildGroupAcronymHint(requested: string, available: string[]): s
8485
const best = ranked[0];
8586
const parts = [
8687
`Nessun gruppo con sigla "${requested}" in questa votazione.`,
87-
`Le sigle del dataset votazioni non coincidono sempre con l'acronym di 'groups list' (es. AZ-PER-RE → APERRE, IV-CR → IVICRE).`,
88+
`Le sigle registrate sui voti non coincidono sempre con l'acronym di 'groups list'.`,
8889
];
8990
if (similarity(norm, normalizeAcronym(best)) >= 0.4) {
9091
parts.push(`Forse cercavi "${best}".`);
9192
}
9293
parts.push(`Sigle presenti in questa votazione: ${ranked.join(", ")}.`);
93-
if (available.some((a) => /^M-/.test(a))) {
94-
parts.push(`Il gruppo Misto è disaggregato nelle sue componenti (le sigle "M-…"): non esiste una riga "MISTO".`);
94+
// Condizione sulla richiesta, non sulla forma delle sigle disponibili: è un
95+
// fatto su cosa ha chiesto l'utente, non un'assunzione sui dati della fonte.
96+
if (norm === "MISTO") {
97+
parts.push(`Il gruppo Misto può comparire disaggregato nelle sue componenti: cercale nell'elenco qui sopra.`);
9598
}
9699
return parts.join(" ");
97100
}

0 commit comments

Comments
 (0)