fix(vote-detail): risolvi --group-acronym contro le sigle reali del voto#80
Conversation
Il catalogo esisteva solo nella skill Pi: l'agent Claude Code non lo leggeva né lo aggiornava. Sei run consecutive (17-25 lug) senza sezione nel catalogo e con le stesse vicende riproposte ogni volta. Porta nell'agent la Fase 0 (lettura + regola di equivalenza) e la Fase 4 (append), con la deroga esplicita alla regola di analisi vergine. Nella spec: naming sezione e formato riga canonico, divieto di annotazioni di copertura, regola di compattazione, verifica eseguibile. Il catalogo è in .gitignore: backfill delle sei sezioni fatto in locale. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…oto (#77) Le sigle di ocd:siglaGruppo non coincidono con l'acronym di `groups list` (AZ-PER-RE → APERRE, IV-CR → IVICRE, Misto disaggregato): il FILTER su una sigla inesistente restituiva zero righe senza dire perché. La sigla richiesta viene ora risolta contro quelle effettivamente presenti nella votazione (query leggera), con confronto tollerante a maiuscole e punteggiatura. Se non esiste: risultato vuoto + hint con le sigle reali e la più simile. Nessuna mappatura hardcoded: il disallineamento è della fonte e va risolto lì, il codice si limita a renderlo visibile. Closes #77 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
| Filename | Overview |
|---|---|
| src/tools/vote-detail.ts | Adds data-driven acronym discovery, matching, filtering, and unresolved-acronym hints. |
| src/tools/vote-detail.test.ts | Covers the pure acronym resolution and hint-generation helpers. |
| src/tools/tools.test.ts | Adds live execute-path checks for matched and unresolved group acronyms. |
| src/core/sparql-literal.ts | Extracts shared SPARQL string-literal escaping for safe query construction. |
| src/tools/bill-progress.ts | Replaces the local SPARQL literal serializer with the shared implementation. |
Reviews (3): Last reviewed commit: "fix(vote-detail): escape del letterale S..." | Re-trigger Greptile
There was a problem hiding this comment.
⚠️ Not ready to approve
There are a couple of concrete correctness/UX issues in the new vote-detail hint/query string handling that should be fixed before merge.
Pull request overview
This PR improves the vote-detail tool’s groupAcronym filtering so that user-provided acronyms are resolved against the actual ocd:siglaGruppo values present in the target vote, avoiding silent empty results when groups list acronyms don’t match the vote dataset.
Changes:
- Add acronym resolution + “empty-but-explained” hinting for
vote-detail --group-acronymwhen the requested acronym isn’t present in that specific vote. - Add unit tests for acronym resolution and hint construction.
- Document the news-driven CLI gap analyzer’s catalog/dedup workflow (spec + agent instructions).
File summaries
| File | Description |
|---|---|
| src/tools/vote-detail.ts | Resolves groupAcronym against acronyms present in the vote and returns a hint on mismatch. |
| src/tools/vote-detail.test.ts | Adds focused unit tests for acronym resolution + hint text behavior. |
| docs/superpowers/specs/2026-07-15-news-catalog-design.md | Specifies the append-only catalog format and dedup/growth rules. |
| .claude/agents/news-driven-cli-gap-analyzer.md | Aligns the agent workflow with the catalog-driven dedup and update steps. |
Review details
- Files reviewed: 4/4 changed files
- Comments generated: 2
- Review effort level: Low
Note
Your feedback helps us improve the quality of this feature.
Please use 👍 or 👎 to tell us whether this assessment is correct.
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>
Da review PR #80: - la sigla risolta finiva interpolata cruda nel FILTER: ora passa per sparqlStringLiteral, estratto in src/core (era duplicato in bill-progress) con i suoi test. Il valore viene dal grafo, non dall'utente, ma una virgoletta nel dato romperebbe comunque la query. - l'hint sul caso "nessuna sigla registrata" citava il flag --group-acronym, che per un client MCP non significa nulla: formulazione neutra. - due test di integrazione su voteDetailTool.execute: match risolto (sigla minuscola → righe, nessun hint) e sigla di groups list → vuoto con hint. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Closes #77
Il problema
--group-acronymfiltrava lato SPARQL conFILTER(STR(?_sg) = "…")sulla sigla passata dall'utente. Le sigle del dataset votazioni non coincidono con l'acronymdigroups list(AZ-PER-RE→APERRE,IV-CR→IVICRE, Misto disaggregato inM-ALT/M-MIN/M-+EUR), quindi seguendo il flusso documentato lookup→filtro si otteneva un risultato vuoto, con exit 0 e nessun avviso: indistinguibile da "il gruppo non ha votato".Cosa fa questa PR
Quando
--group-acronymè valorizzato, una query leggera (SELECT DISTINCT ?siglaGrupposulla votazione, ~12 righe) recupera le sigle reali. La sigla richiesta viene risolta contro quelle: esatta → case-insensitive → normalizzata (senza punteggiatura). Se risolve, la query principale resta identica con ilFILTERsulla sigla vera: performance e semantica diLIMITinvariate.Se non risolve, il risultato è vuoto ma con un
hint(stderr in CLI, testo nell'MCP) che elenca le sigle presenti nella votazione, mette in testa la più simile e spiega che il Misto è disaggregato.Nessuna mappatura hardcoded. Il disallineamento è nel grafo della Camera, non nel nostro codice: alias del tipo
AZ-PER-RE → APERREsi romperebbero al primo cambio di denominazione. Il codice interroga il dato e rende visibile il problema; la segnalazione a monte è nella nota gestori Camera e nel dossier della campagna.Nota: nemmeno
group_urisarebbe stata una chiave utilizzabile — per Azione ègr4135ingroupsegr4212nel voto (quest'ultimo senza triple come soggetto), e le componenti del Misto ce l'hanno vuoto.Verifica
Con
--format csv 2>/dev/nulllo stdout resta pulito: l'hint è su stderr, le pipeline non si rompono.Test: 10 nuovi test sulle due funzioni pure (
src/tools/vote-detail.test.ts), suite completa verde (199 test).🤖 Generated with Claude Code