diff --git a/public/misure-requisiti.html b/public/misure-requisiti.html
index e26d0ab..0bfb140 100644
--- a/public/misure-requisiti.html
+++ b/public/misure-requisiti.html
@@ -179,6 +179,9 @@
function el(id) { return document.getElementById(id); }
function esc(s) { const d = document.createElement('div'); d.textContent = (s == null ? '' : String(s)); return d.innerHTML; }
+ // Ticket #384 p.2.1 — i codici procedura/policy si presentano con prefisso "Policy." (Proc.NN -> Policy.NN).
+ // Il codice canonico nel catalogo resta proc_code (chiave di join requisiti<->procedure): qui si rietichetta solo per la UI.
+ function policyCode(code) { return code ? String(code).replace(/^Proc\./i, 'Policy.') : code; }
const STATO_META = {
da_valutare: { label: 'Da valutare', cls: 'sv-todo' },
@@ -295,7 +298,7 @@
html += '
' + esc(req.requisito_code) + ' | ';
}
html += '' + esc(req.requisito_descr) + ' | ';
- html += '' + (req.proc_code ? '' + esc(req.proc_code) + ' ' + esc(req.proc_descr || '') : '—') + ' | ';
+ html += '' + (req.proc_code ? '' + esc(policyCode(req.proc_code)) + ' ' + esc(req.proc_descr || '') : '—') + ' | ';
html += '' + (req.risk_code ? '' + esc(req.risk_code) + ' ' + esc(req.risk_descr || '') : '—') + ' | ';
html += '' + (req.applies_important ? '✓' : '—') + ' | ';
html += '' + (req.applies_essential ? '✓' : '—') + ' | ';
@@ -318,7 +321,7 @@
const q = MR.byId[reqId];
if (!q) return;
el('mr-eval-id').value = reqId;
- el('mr-modal-sub').textContent = (q.requisito_code || '') + ' · ' + (q.proc_code || '') + ' / ' + (q.risk_code || '');
+ el('mr-modal-sub').textContent = (q.requisito_code || '') + ' · ' + (policyCode(q.proc_code) || '') + ' / ' + (q.risk_code || '');
let ctx = '' + esc(q.requisito_descr || '') + '
';
if (q.risk_code) ctx += '' + esc(q.risk_code) + ' ' + esc(q.risk_descr || '') + '
';
el('mr-eval-ctx').innerHTML = ctx;
diff --git a/public/version.json b/public/version.json
index 694a7c7..eacbdf0 100644
--- a/public/version.json
+++ b/public/version.json
@@ -1 +1 @@
-{"version": "1.23.3", "build": "2026-06-18-v1.23.3", "date": "2026-06-18", "changelog": "Ticket #384 punto 1 (terminologia): unificazione lessicale Policy/Procedura. In 'Misure e Requisiti' la colonna 'Procedura (default)' diventa 'Policy (default)'; in 'Policy' la colonna/campo 'Art./Articolo NIS2' diventa 'Requisito NIS2'. Aggiornati anche i testi descrittivi della pagina Misure e Requisiti e la relativa guida (help.js, cache-buster ->20260618p1 su 28 pagine). Restano in lavorazione a fasi: unificazione archivi M:N requisito<->policy con ricodifica Proc.->Policy (punto 2), link attivi tra i due menu (punto 3), allegati (punto 5), matrice RACI per policy (punto 6)."}
+{"version": "1.23.4", "build": "2026-06-18-v1.23.4", "date": "2026-06-18", "changelog": "Ticket #384 punto 2.1 (ricodifica): nella pagina 'Misure e Requisiti' i codici delle policy/procedure di default ora si presentano con il prefisso 'Policy.' al posto di 'Proc.' (es. Proc.01 -> Policy.01), in coerenza con l'unificazione lessicale Policy/Procedura del punto 1. Cambia solo l'etichetta mostrata a video: il codice canonico nel catalogo resta invariato come chiave di collegamento requisito<->policy. Restano in lavorazione a fasi: unificazione archivi M:N requisito<->policy (punto 2.2), link attivi bidirezionali tra i due menu (punto 3), allegati nel modale policy (punto 5), matrice RACI assegnabile per policy con R e A obbligatorie in approvazione (punto 6)."}