[FIX] ARIA: inietta griglia esatta combo Rilevanza NIS2 nel prompt (ticket #429)

ARIA (askWithRag) conosceva solo il nome pagina + KB/fonti, non la griglia
reale delle tendine della finestra «Valuta Rilevanza NIS2» (AssetScoringService::GRID):
dava risposte generiche non corrispondenti alla finestra. Aggiunto
relevanceGridBlock() (6 criteri, opzioni, punteggi, desc dalla fonte di verita')
iniettato nel system prompt quando l'utente e nell'Inventario o chiede della
rilevanza. Additivo, nessun impatto su altri flussi.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile
2026-06-24 00:09:24 +02:00
co-authored by Claude Opus 4.8
parent cf23be9c77
commit 08d4ac0cc4
2 changed files with 36 additions and 1 deletions
+35
View File
@@ -80,6 +80,32 @@ class AIService
. "4. Se l'utente cerca una funzione che non corrisponde ad alcuna voce, dillo chiaramente e suggerisci la voce piu' vicina, senza inventarne una.\n";
}
/**
* Griglia ESATTA delle combo della finestra «Valuta Rilevanza NIS2»
* (Inventario asset), generata dalla fonte di verita' AssetScoringService::GRID.
* Iniettata nel system prompt di ARIA cosi' che, quando l'utente chiede del
* significato di una combo/criterio o dei punteggi, ARIA usi i valori REALI
* della finestra invece di inventarne (ticket #429, 2026-06-24: ARIA dava una
* risposta sulle combo "non corrispondente alla finestra").
*/
private function relevanceGridBlock(): string
{
require_once __DIR__ . '/AssetScoringService.php';
if (!class_exists('AssetScoringService')) return '';
$lines = [];
$lines[] = "\n## RILEVANZA NIS2 — combo della finestra «Valuta Rilevanza NIS2» (Inventario asset)";
$lines[] = "Questa e' la griglia ESATTA della finestra di valutazione: 6 criteri pesati, punteggio totale 0-100, asset RILEVANTE NIS2 se il totale e' >= "
. AssetScoringService::RELEVANCE_THRESHOLD . " (requisito GV.OC-04). Quando l'utente chiede il significato di una combo, di un'opzione o dei punteggi, usa SOLO queste voci e questi valori, NON inventarne altri.";
foreach (AssetScoringService::GRID as $crit) {
$lines[] = sprintf("\n%s (max %d punti) — %s", $crit['label'], $crit['max'], $crit['help']);
foreach ($crit['options'] as $opt) {
$lines[] = sprintf(" - %s (%d pt): %s", $opt['label'], $opt['points'], $opt['desc']);
}
}
return implode("\n", $lines) . "\n";
}
/**
* Analizza risultati gap analysis e genera raccomandazioni
*/
@@ -740,6 +766,15 @@ PROMPT;
. "Tieni conto di dove si trova quando dai indicazioni di navigazione.\n";
}
// Se l'utente e' nell'Inventario o la domanda riguarda la valutazione di
// rilevanza NIS2, inietta la griglia ESATTA delle combo (fonte di verita'
// AssetScoringService::GRID) per evitare risposte non corrispondenti alla
// finestra reale (ticket #429).
$onInventory = stripos($page, 'asset') !== false || stripos($page, 'inventario') !== false;
if ($onInventory || preg_match('/rilevanz|combo|criticit|punteggio|scoring|valutazione|gv\.?oc/iu', $question)) {
$systemPrompt .= $this->relevanceGridBlock();
}
if (!empty($contextBlock)) {
$systemPrompt .= "\n## Contesto documentale (knowledge base)\n" . $contextBlock
. "\n\nQuando rispondi, cita esplicitamente i numeri tra parentesi quadre [1], [2], ... che corrispondono ai documenti del contesto.";