Skip to content

Commit d42cd27

Browse files
aborrusoclaude
andcommitted
fix(which): copri la Giunta per le autorizzazioni, togli il mis-route su immunità (#78)
Il term "parlamentare" nudo su `search find` catturava query di tutt'altro tema — "immunità parlamentare", "gruppo parlamentare" — perché lo scorer assegna 60 quando la query contiene il term. Diventa "cerca parlamentare": chi cerca "parlamentare" da solo trova ancora il comando, chi cerca altro no. Aggiunti a `committees list` e `committee-members list` i termini su giunta, autorizzazione a procedere, immunità e insindacabilità: il tema era scoperto pur essendo pienamente servito da quei due comandi. Closes #78 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 2994cb1 commit d42cd27

2 files changed

Lines changed: 38 additions & 3 deletions

File tree

src/core/capabilities.test.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,38 @@ describe("capabilityScore", () => {
4848
expect(capabilityScore(cap, " ")).toBe(0);
4949
});
5050

51+
// Il tema Giunta per le autorizzazioni era scoperto, e "immunità
52+
// parlamentare" veniva instradata su `search find` per via del term
53+
// "parlamentare" nudo: un match sbagliato è peggio di nessun match (#78).
54+
const best = (q: string) =>
55+
CAPABILITIES.map((c) => ({ cmd: c.cmd, score: capabilityScore(c, q) }))
56+
.filter((c) => c.score > 0)
57+
.sort((a, b) => b.score - a.score);
58+
59+
it("le formulazioni sulla Giunta portano ai comandi su commissioni e giunte", () => {
60+
for (const q of ["giunta per le autorizzazioni", "autorizzazione a procedere", "immunità parlamentare"]) {
61+
const cmds = best(q).map((c) => c.cmd);
62+
expect(cmds, `query "${q}"`).toContain("committee-members list");
63+
expect(cmds, `query "${q}"`).toContain("committees list");
64+
}
65+
});
66+
67+
it("'immunità parlamentare' non instrada più su search find", () => {
68+
expect(best("immunità parlamentare").map((c) => c.cmd)).not.toContain("search find");
69+
});
70+
71+
it("'gruppo parlamentare' resta sui gruppi, non sulla ricerca per nome", () => {
72+
const cmds = best("gruppo parlamentare").map((c) => c.cmd);
73+
expect(cmds).toContain("groups list");
74+
expect(cmds).not.toContain("search find");
75+
});
76+
77+
it("non-regressione: cercare una persona porta ancora a search find", () => {
78+
for (const q of ["cerca", "parlamentare", "nome", "trova persona"]) {
79+
expect(best(q).map((c) => c.cmd), `query "${q}"`).toContain("search find");
80+
}
81+
});
82+
5183
it("match case-insensitive sui terms", () => {
5284
const cap = CAPABILITIES.find((c) => c.cmd === "person-career show")!;
5385
expect(capabilityScore(cap, "CARRIERA")).toBe(100);

src/core/capabilities.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
export type Capability = { cmd: string; terms: string[]; desc: string; example: string };
77

88
export const CAPABILITIES: Capability[] = [
9-
{ cmd: "search find", terms: ["cerca", "nome", "parlamentare", "trova persona", "search"], desc: "Cerca un parlamentare per nome (Camera+Senato)", example: 'italianparliament search find --name "rossi"' },
9+
// "cerca parlamentare" e non "parlamentare" nudo: la parola sola compare in
10+
// query di tutt'altro tema ("immunità parlamentare", "gruppo parlamentare")
11+
// e le tirava qui con il match `q.includes(term)` (issue #78).
12+
{ cmd: "search find", terms: ["cerca", "nome", "cerca parlamentare", "trova persona", "search"], desc: "Cerca un parlamentare per nome (Camera+Senato)", example: 'italianparliament search find --name "rossi"' },
1013
{ cmd: "person-career show", terms: ["carriera", "governo", "ministro", "doppio incarico", "legislature", "wikidata"], desc: "Carriera unificata di una persona (mandati + governo)", example: "italianparliament person-career show --uri http://dati.camera.it/ocd/persona.rdf/p302103" },
1114
{ cmd: "deputy show", terms: ["scheda", "deputato", "anagrafica", "nascita"], desc: "Scheda di un deputato", example: "italianparliament deputy show --uri http://dati.camera.it/ocd/deputato.rdf/d306921_17" },
1215
{ cmd: "senator show", terms: ["scheda", "senatore", "anagrafica", "nascita"], desc: "Scheda di un senatore", example: "italianparliament senator show --uri http://dati.senato.it/senatore/29110" },
@@ -35,8 +38,8 @@ export const CAPABILITIES: Capability[] = [
3538
{ cmd: "rank list", terms: ["classifica", "ranking", "più attivi", "top"], desc: "Classifiche per parlamentare (aic, bills, speeches, ...)", example: "italianparliament rank list --rank-by speeches --legislature 19 --limit 10" },
3639
{ cmd: "group-rank list", terms: ["classifica gruppi", "per gruppo", "gruppi più attivi"], desc: "Classifiche per gruppo con media per membro", example: "italianparliament group-rank list --rank-by aic --legislature 19" },
3740
{ cmd: "gov-members list", terms: ["ministro", "governo", "sottosegretario", "rimpasto"], desc: "Membri del governo", example: "italianparliament gov-members list --legislature 19" },
38-
{ cmd: "committees list", terms: ["commissioni", "elenco commissioni"], desc: "Commissioni Camera+Senato", example: "italianparliament committees list --chamber both --legislature 19" },
39-
{ cmd: "committee-members list", terms: ["membri commissione", "composizione commissione"], desc: "Membri di una commissione con ruoli", example: "italianparliament committee-members list --committee-uri http://dati.senato.it/commissione/0-2 --chamber senato" },
41+
{ cmd: "committees list", terms: ["commissioni", "elenco commissioni", "giunta", "giunta per le autorizzazioni", "autorizzazione a procedere", "immunità parlamentare", "insindacabilità"], desc: "Commissioni e giunte Camera+Senato", example: "italianparliament committees list --chamber both --legislature 19" },
42+
{ cmd: "committee-members list", terms: ["membri commissione", "composizione commissione", "membri giunta", "giunta per le autorizzazioni", "autorizzazione a procedere", "immunità parlamentare", "insindacabilità"], desc: "Membri di una commissione o giunta con ruoli", example: "italianparliament committee-members list --committee-uri http://dati.senato.it/commissione/0-2 --chamber senato" },
4043
{ cmd: "speeches list", terms: ["intervento", "discorso", "aula"], desc: "Interventi in aula (Camera+Senato)", example: "italianparliament speeches list --deputy-uri http://dati.camera.it/ocd/deputato.rdf/d306921_17 --count-only" },
4144
{ cmd: "sparql query", terms: ["sparql", "query libera", "dato non coperto"], desc: "Query SPARQL libera (ultima risorsa)", example: 'italianparliament sparql query --endpoint senato --query "PREFIX osr: <http://dati.senato.it/osr/> SELECT DISTINCT ?type WHERE { ?s a ?type } LIMIT 20"' },
4245
];

0 commit comments

Comments
 (0)