fix: harden phase summary open questions

This commit is contained in:
User
2026-07-14 15:09:50 +02:00
parent 18701f020e
commit e228c6f2fd
8 changed files with 110 additions and 12 deletions
@@ -151,6 +151,22 @@ test("validatePhaseSummaryV2: rejects a section missing title or items", () => {
assert.ok(out.errors.some((e) => /sections\[0\].*title/.test(e)));
});
test("validatePhaseSummaryV2: rejects structured open_questions instead of crashing the UI", () => {
const out = validatePhaseSummaryV2({
schema_version: 2,
summary: "s",
open_questions: [
{
label: "pazienti_finale restituisce 0 righe",
question: "Verificare se i filtri sono troppo restrittivi",
},
],
});
assert.equal(out.ok, false);
assert.ok(out.errors.some((error) => /open_questions\[0\]/.test(error)));
});
test("validatePhaseSummaryV2: permissive on extra unknown fields", () => {
const out = validatePhaseSummaryV2({ schema_version: 2, summary: "s", extra_field_from_model: "whatever" });
assert.equal(out.ok, true);
@@ -115,6 +115,17 @@ function validatePhaseSummaryV2(data) {
if (data.tables !== undefined && !isArray(data.tables)) {
errors.push("tables deve essere un array se presente.");
}
if (data.open_questions !== undefined) {
if (!isArray(data.open_questions)) {
errors.push("open_questions deve essere un array di stringhe se presente.");
} else {
data.open_questions.forEach((question, i) => {
if (typeof question !== "string") {
errors.push(`open_questions[${i}] deve essere una stringa.`);
}
});
}
}
return { ok: errors.length === 0, errors };
}
+2
View File
@@ -100,6 +100,8 @@ substantive decisions.
"columns":[{"name":"cod_paz","value_filter":""}]}],
"open_questions":[]}
```
`open_questions` MUST be an array of plain strings (`string[]`). Never put objects
such as `{label, question}` in it; express each open question as one complete string.
Legacy free-text recaps still work (no `schema_version`), but prefer v2. Note: the
F4 schema-linking recap travels in `tables` of this v2 phase payload — do NOT reuse
`kind:"schema_linking"` for a phase recap.