feat(senato-votes): emptyHint dinamico con sonda del grafo#68
Conversation
L'emptyHint statico ripeteva su ogni risultato vuoto tre blocchi fissi (--ddl-uri, filtri label, buco COVID 10/3-16/4/2020) anche fuori contesto: per la fiducia Milleproroghe (26/2/2020) mostrava un avviso su una finestra che non interseca quella data e il testo su --ddl-uri mai usato. Ora, sui risultati vuoti con vincolo di data (offset 0, non-DDL), execute() valorizza result.hint sondando il grafo al volo: 2 COUNT (SedutaAssemblea + Votazione) sull'intervallo distinguono lo stato reale senza sapere dov'e' il buco: - sedute=0 -> nessuna seduta d'Assemblea - sedute>0, vot=0 -> fingerprint di un buco della fonte (rileva #36 su qualsiasi data, non hardcoded) - vot>0 -> dato pieno, e' il filtro (26/2: 21 voti, nessuna fiducia) Gate su offset===0: oltre l'ultima pagina la sonda affermerebbe il falso. emptyHint statico ridotto a fallback neutro (una sola fonte di verita'). Funzione pura buildSenatoVotesEmptyHint + 8 test unitari; 170/170 verdi, tsc pulito; verificato live su 5 contesti (leg 18/19, data e range, offset 0/100). Emerso dal report news-agent 2026-07-15_12-08.md (P0). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Questo PR migliora la diagnostica del tool senato-votes (CLI + MCP) quando una query restituisce 0 righe, sostituendo l’emptyHint statico e “rumoroso” con un hint dinamico data-driven basato su una sonda leggera del grafo Senato (2 COUNT) sull’intervallo di date richiesto. L’obiettivo è ridurre falsi indizi e distinguere in modo affidabile tra “nessuna seduta”, “sedute senza votazioni” (gap della fonte) e “ci sono votazioni ma i filtri escludono tutto”.
Changes:
- Introdotta una sonda SPARQL (sedute/votazioni) eseguita solo su risultati vuoti con vincolo di data,
offset===0e senzaddlUri, e usata per costruireresult.hint. - Ridotto
emptyHintstatico a fallback neutro; estratta funzione purabuildSenatoVotesEmptyHintper comporre messaggi coerenti e testabili. - Aggiunti test unitari mirati per i tre rami della sonda + fallback senza sonda; aggiornato
LOG.md.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| src/tools/senato-votes.ts | Aggiunge sonda “COUNT sedute/votazioni” su path vuoto con date e costruzione di result.hint dinamico; riduce emptyHint statico a fallback neutro. |
| src/tools/senato-votes.test.ts | Introduce test unitari per buildSenatoVotesEmptyHint coprendo rami con/senza sonda. |
| LOG.md | Registra la modifica in log con contesto e verifica. |
|
| Filename | Overview |
|---|---|
| src/tools/senato-votes.ts | Adds the graph probe, contextual empty-result hints, safe probe fallback, and a combined aggregate query. |
| src/tools/senato-votes.test.ts | Covers the three probe outcomes and the static hint variants. |
| docs/lod-wiki/senato/vuoto-votazioni-diagnosi.md | Documents how session and vote counts distinguish the three empty-result states. |
Reviews (3): Last reviewed commit: "fix(senato-votes): sonda resiliente e a ..." | Re-trigger Greptile
Nuova nota vuoto-votazioni-diagnosi.md: sondando sedute (osr:SedutaAssemblea) vs votazioni si distinguono tre stati con conclusioni opposte — nessuna seduta / buco "totale" (sedute senza voti, COVID) / buco "chirurgico" (voti presenti ma il target manca). Documenta il caso 26/2/2020 Milleproroghe (21 voti ma fiducia assente, pattern diverso dal COVID e pre-lockdown) e collega il metodo all'emptyHint dinamico implementato in senato-votes. Cross-link da index.md (sezione Diagnostica) e da votazioni-covid-2020.md (distinzione totale vs chirurgico). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Due rilievi Greptile sul path emptyHint dinamico: - P1 — la sonda è diagnostica accessoria: se snQuery fallisce (es. 403/timeout Senato, frequenti) l'eccezione non catturata trasformava un risultato vuoto legittimo in un errore MCP/CLI. Aggiunto .catch(() => undefined): degrada all'hint statico. - P2 — le due COUNT separate, col throttle Senato ~2s, aggiungevano ~4s al path vuoto. Unite in una sola query (COUNT sedute + COUNT votazioni via OPTIONAL sulla stessa seduta): dimezza latenza e richieste all'endpoint (meno 403). Risultati identici verificati live (26/2: 1/21, COVID: 9/0, ferragosto: 0/0). Build/tsc/8 test verdi; verifica live invariata. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bump versione nei 5 punti (package/server/worker/client/manifest); tools 43 invariato. La feature (sonda data-driven dell'emptyHint) e i fix di review P1/P2 sono gia' in main via PR #68; questa e' la release patch che li versiona. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Contesto
Dal report news-agent
docs/news-agent/2026-07-15_12-08.md(rilievo P0). L'emptyHintdisenato-votesera una stringa statica: su ogni risultato vuoto ripeteva tre blocchi fissi (--ddl-uri, filtri label, buco COVID10/3–16/4/2020), anche fuori contesto. Cercando la fiducia Milleproroghe (--date-from 2020-02-26 --confidence-vote) l'agente vedeva l'avviso su una finestra che non interseca il 26/2 e il testo su--ddl-urimai usato → rumore diagnostico che confonde chi legge.Approccio: osservare, non ricordare
Invece di elencare buchi noti (fragile: sul 26/2 indovinerebbe male), sui risultati vuoti con vincolo di data
execute()sonda il grafo al volo e riporta lo stato reale. Meccanismo:result.hint(dinamico) ha già precedenza suemptyHintstatico su MCP e CLI — nessuna modifica infrastrutturale.Sonda = 2 COUNT leggeri (
osr:SedutaAssemblea+osr:Votazione) sull'intervallo. Tre esiti:sedute=0sedute>0, votazioni=0votazioni>0Il caso Milleproroghe cade da solo nella riga giusta senza sapere in anticipo che il 26/2 è un buco — ed è un buco diverso dal COVID (9/4 ha zero voti, 26/2 ne ha 21 ma manca la fiducia): la sonda li separa.
Dettagli
dateFrom|dateTo+!ddlUri+offset === 0(oltre l'ultima pagina la sonda affermerebbe il falso, "N voti ma nessuno matcha").emptyHintstatico ridotto a fallback neutro: niente più buchi hardcoded → una sola fonte di verità.buildSenatoVotesEmptyHintestratta e testata.Verifica
tscpulito, 170/170 test (8 nuovi unitari sui 3 rami sonda + senza-date).26/2/2020 --confidence-vote→ "21 votazioni… ma nessuna corrisponde ai filtri attivi"10/3–16/4/2020→ "9 sedute… ma ZERO votazioni… buco della fonte"15/8/2020→ "non risulta alcuna seduta d'Assemblea"--offset 100oltre l'ultima pagina → hint statico, nessuna falsa affermazioneFuori scope
build:worker+ deploy (la modifica è live via MCP solo dopo deploy).🤖 Generated with Claude Code